Skip to content

Commit be1cc9d

Browse files
committed
feat: ✨ Implémente DsfrModal
1 parent e85a568 commit be1cc9d

File tree

6 files changed

+153
-1
lines changed

6 files changed

+153
-1
lines changed

src/assets/objects-dsfr.css

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,2 @@
11
@import url(./objects/fieldset.css);
22
@import url(./objects/link.css);
3-
@import url(./objects/modal.css);

src/components/DsfrModal/DsfrModal.spec.js

Whitespace-only changes.
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
import DsfrModal from './DsfrModal.vue'
2+
import DsfrButton from '../DsfrButton/DsfrButton.vue'
3+
4+
export default {
5+
component: DsfrModal,
6+
title: 'Éléments/Modale - Modal',
7+
}
8+
9+
export const Modal = (args) => ({
10+
components: {
11+
DsfrModal,
12+
DsfrButton,
13+
},
14+
data () {
15+
return { ...args }
16+
},
17+
template: `
18+
<div :data-rf-theme="dark ? 'dark' : ''" style="background-color: var(--w); padding: 1rem;">
19+
<DsfrButton
20+
label="Ouvre la modale"
21+
@click="open()"
22+
/>
23+
<DsfrModal
24+
:opened="opened"
25+
:actions="actions"
26+
@close="onClose"
27+
>
28+
<h1
29+
id="fr-modal-title-modal-1"
30+
class="fr-modal__title"
31+
>
32+
<span class="fr-fi-arrow-right-line fr-fi--lg" />Titre de la modale
33+
</h1>
34+
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas varius tortor nibh, sit amet tempor nibh finibus et. Aenean eu enim justo. Vestibulum aliquam hendrerit molestie. Mauris malesuada nisi sit amet augue accumsan tincidunt. Maecenas tincidunt, velit ac porttitor pulvinar, tortor eros facilisis libero, vitae commodo nunc quam et ligula. Ut nec ipsum sapien. Interdum et malesuada fames ac ante ipsum primis in faucibus. Integer id nisi nec nulla luctus lacinia non eu turpis. Etiam in ex imperdiet justo tincidunt egestas. Ut porttitor urna ac augue cursus tincidunt sit amet sed orci.</p>
35+
</DsfrModal>
36+
</div>
37+
`,
38+
methods: {
39+
onClose () {
40+
this.opened = false
41+
},
42+
open () {
43+
this.opened = true
44+
},
45+
},
46+
})
47+
48+
Modal.args = {
49+
dark: false,
50+
opened: false,
51+
actions: [
52+
{
53+
label: 'Valider',
54+
},
55+
{
56+
label: 'Annuler',
57+
secondary: true,
58+
},
59+
],
60+
}
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
<script>
2+
import DsfrButtonGroup from '../DsfrButton/DsfrButtonGroup.vue'
3+
4+
export default {
5+
name: 'DsfrModal',
6+
7+
components: {
8+
DsfrButtonGroup,
9+
},
10+
11+
props: {
12+
opened: Boolean,
13+
actions: {
14+
type: Array,
15+
default: () => [],
16+
},
17+
},
18+
19+
emits: [
20+
'close',
21+
],
22+
23+
data () {
24+
return {
25+
close: () => this.$emit('close'),
26+
}
27+
},
28+
29+
mounted () {
30+
this.startListeningToEscape()
31+
},
32+
33+
beforeUnmount () {
34+
this.startListeningToEscape()
35+
},
36+
37+
methods: {
38+
startListeningToEscape () {
39+
document.addEventListener('keydown', this.close)
40+
},
41+
42+
stopListeningToEscape () {
43+
document.removeEventListener('keydown', this.close)
44+
},
45+
},
46+
}
47+
</script>
48+
49+
<template>
50+
<dialog
51+
id="fr-modal-1"
52+
aria-labelledby="fr-modal-title-modal-1"
53+
role="dialog"
54+
class="fr-modal"
55+
:class="{'fr-modal--opened': opened}"
56+
>
57+
<div class="fr-container fr-container--fluid fr-container-md">
58+
<div class="fr-grid-row fr-grid-row--center">
59+
<div class="fr-col-12 fr-col-md-8 fr-col-lg-6">
60+
<div class="fr-modal__body">
61+
<div class="fr-modal__header">
62+
<button
63+
class="fr-link--close fr-link"
64+
title="Fermer la fenêtre modale"
65+
aria-controls="fr-modal-1"
66+
@click="close"
67+
>
68+
Fermer
69+
</button>
70+
</div>
71+
<div class="fr-modal__content">
72+
<slot />
73+
</div>
74+
<div
75+
v-if="actions && actions.length"
76+
class="fr-modal__footer"
77+
>
78+
<DsfrButtonGroup
79+
align="right"
80+
:buttons="actions"
81+
inline
82+
reverse
83+
/>
84+
</div>
85+
</div>
86+
</div>
87+
</div>
88+
</div>
89+
</dialog>
90+
</template>
91+
92+
<style src="./modal.css" />

src/components/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ export { default as DsfrCheckboxSet } from './DsfrCheckbox/DsfrCheckboxSet.vue'
77
export { default as DsfrHeader } from './DsfrHeader/DsfrHeader.vue'
88
export { default as DsfrInput } from './DsfrInput/DsfrInput.vue'
99
export { default as DsfrLogo } from './DsfrLogo/DsfrLogo.vue'
10+
export { default as DsfrModal } from './DsfrModal/DsfrModal.vue'
1011
export { default as DsfrRadioButton } from './DsfrRadioButton/DsfrRadioButton.vue'
1112
export { default as DsfrRadioButtonSet } from './DsfrRadioButton/DsfrRadioButtonSet.vue'
1213
export { default as DsfrSearchBar } from './DsfrSearchBar/DsfrSearchBar.vue'

0 commit comments

Comments
 (0)