@cnamts/synapse 1.0.25 → 1.0.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{AutocompleteFilter-D7qBuCAP.js → AutocompleteFilter-BPR-a55G.js} +1 -1
- package/dist/{DateFilter-BitMWrMU.js → DateFilter-CknrJWs2.js} +2 -2
- package/dist/{NumberFilter-BTLUxw0a.js → NumberFilter-DJ-yNlzv.js} +1 -1
- package/dist/{PeriodFilter-B5rUIPAC.js → PeriodFilter-CiB5Oa9Z.js} +1 -1
- package/dist/{SelectFilter-l4QnRcuk.js → SelectFilter-EiafX97M.js} +1 -1
- package/dist/{TextFilter-C9hj6Qrp.js → TextFilter-BzOmpdxj.js} +1 -1
- package/dist/{apLightTheme-DnIM24Lv.js → apLightTheme-DS0Uy44H.js} +20 -16
- package/dist/components/Customs/Selects/SyAutocomplete/SyAutocomplete.d.ts +4 -2
- package/dist/components/Customs/Selects/SySelect/SySelect.d.ts +60 -289
- package/dist/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.d.ts +1 -0
- package/dist/components/Customs/SyCheckbox/SyCheckbox.d.ts +1 -0
- package/dist/components/Customs/SyRadioGroup/SyRadioGroup.d.ts +1 -0
- package/dist/components/Customs/SyTextField/SyTextField.d.ts +2 -4
- package/dist/components/DatePicker/CalendarMode/DatePicker.d.ts +50 -49
- package/dist/components/DatePicker/ComplexDatePicker/ComplexDatePicker.d.ts +29 -28
- package/dist/components/DatePicker/DateTextInput/DateTextInput.d.ts +8 -8
- package/dist/components/DatePicker/composables/useDatePickerState.d.ts +3 -3
- package/dist/components/DatePicker/composables/useDateTextField.d.ts +2 -2
- package/dist/components/DatePicker/composables/useInputBlurHandler.d.ts +2 -2
- package/dist/components/DatePicker/types.d.ts +1 -2
- package/dist/components/LunarCalendar/useLunarCalendarValidation.d.ts +1 -0
- package/dist/components/MonthPicker/MonthPicker.d.ts +1 -1
- package/dist/components/MonthPicker/MonthPickerText/MonthPickerInput.d.ts +1 -1
- package/dist/components/NirField/NirField.d.ts +8 -4
- package/dist/components/NirField/useNirValidation.d.ts +6 -2
- package/dist/components/PeriodField/PeriodField.d.ts +102 -102
- package/dist/components/PhoneField/PhoneField.d.ts +11 -1
- package/dist/components/RangeField/RangeSlider/RangeSlider.d.ts +0 -3
- package/dist/components/RatingPicker/EmotionPicker/EmotionPicker.d.ts +3 -1
- package/dist/components/RatingPicker/NumberPicker/NumberPicker.d.ts +4 -3
- package/dist/components/RatingPicker/RatingPicker.d.ts +18 -5
- package/dist/components/RatingPicker/StarsPicker/StarsPicker.d.ts +3 -1
- package/dist/components/RatingPicker/tests/RatingPicker.a11y.spect.d.ts +1 -0
- package/dist/components/RatingPicker/useRatingFocus.d.ts +18 -0
- package/dist/components/Tables/SyServerTable/SyServerTable.d.ts +4 -4
- package/dist/components/Tables/SyTable/SyTable.d.ts +4 -4
- package/dist/components/Tables/common/SyTablePagination.d.ts +152 -364
- package/dist/components/Tables/common/TableHeader.d.ts +1 -1
- package/dist/components/Tables/common/filters/DateFilter.d.ts +4 -4
- package/dist/composables/date/useDateInitializationDayjs.d.ts +3 -1
- package/dist/composables/unifyValidation/useCustomValidation.d.ts +3 -1
- package/dist/composables/unifyValidation/useValidation.d.ts +12 -6
- package/dist/composables/unifyValidation/useVuetifyValidation.d.ts +1 -1
- package/dist/composables/validation/useValidation.d.ts +1 -0
- package/dist/design-system-v3.js +2 -2
- package/dist/designTokens/tokens/amelipro/apLightTheme.d.ts +2 -0
- package/dist/designTokens/tokens/cnam/cnamLightTheme.d.ts +2 -0
- package/dist/{main-Cpx8Co6H.js → main-BsJ9ec3i.js} +9103 -9018
- package/dist/synapse.css +1 -1
- package/dist/vuetifyConfig.js +1 -1
- package/package.json +8 -7
- package/src/assets/overrides/_icons.scss +0 -13
- package/src/assets/overrides/_otp.scss +0 -1
- package/src/components/Accordion/Accordion.vue +2 -0
- package/src/components/CookiesSelection/CookiesInformation/CookiesInformation.vue +2 -1
- package/src/components/CookiesSelection/CookiesSelection.vue +2 -1
- package/src/components/CopyBtn/CopyBtn.vue +9 -0
- package/src/components/Customs/Selects/SyAutocomplete/SyAutocomplete.vue +1 -1
- package/src/components/Customs/Selects/SySelect/SySelect.stories.ts +413 -96
- package/src/components/Customs/Selects/SySelect/SySelect.vue +270 -225
- package/src/components/Customs/Selects/SySelect/tests/SySelect.spec.ts +245 -6
- package/src/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.vue +3 -3
- package/src/components/Customs/SyCheckbox/SyCheckbox.vue +23 -2
- package/src/components/Customs/SyRadioGroup/SyRadioGroup.vue +23 -5
- package/src/components/Customs/SyTabs/SyTabs.stories.ts +5 -5
- package/src/components/Customs/SyTabs/config.ts +3 -3
- package/src/components/Customs/SyTextField/SyTextField.vue +31 -4
- package/src/components/DatePicker/CalendarMode/DatePicker.stories.ts +1 -1
- package/src/components/DatePicker/CalendarMode/DatePicker.vue +17 -14
- package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.stories.ts +1 -1
- package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.vue +8 -7
- package/src/components/DatePicker/ComplexDatePicker/tests/ComplexDatePicker.spec.ts +1 -1
- package/src/components/DatePicker/DatePickerValidationExample/DatePickerValidation.stories.ts +1 -1
- package/src/components/DatePicker/DateTextInput/DateTextInput.vue +57 -23
- package/src/components/DatePicker/DateTextInput/NoCalendar.stories.ts +1 -1
- package/src/components/DatePicker/composables/useDatePickerState.ts +33 -14
- package/src/components/DatePicker/composables/useDateRangeInput.ts +2 -1
- package/src/components/DatePicker/composables/useDateSelection.ts +2 -1
- package/src/components/DatePicker/composables/useDateTextField.ts +2 -2
- package/src/components/DatePicker/composables/useInputBlurHandler.ts +2 -2
- package/src/components/DatePicker/types.ts +1 -2
- package/src/components/DialogBox/DialogBox.stories.ts +8 -8
- package/src/components/DialogBox/accessibilite/Accessibility.mdx +86 -22
- package/src/components/FilterSideBar/FilterSideBar.vue +2 -1
- package/src/components/LangBtn/LangBtn.vue +2 -1
- package/src/components/NotificationBar/Notification/Notification.vue +2 -2
- package/src/components/PaginatedTable/PaginatedTable.vue +1 -1
- package/src/components/PaginatedTable/Pagination.vue +1 -1
- package/src/components/PasswordField/PasswordField.vue +7 -3
- package/src/components/PhoneField/PhoneField.vue +4 -2
- package/src/components/RangeField/RangeSlider/RangeSlider.vue +11 -18
- package/src/components/RatingPicker/EmotionPicker/EmotionPicker.vue +32 -48
- package/src/components/RatingPicker/EmotionPicker/tests/__snapshots__/EmotionPicker.spec.ts.snap +5 -0
- package/src/components/RatingPicker/NumberPicker/NumberPicker.vue +48 -53
- package/src/components/RatingPicker/NumberPicker/tests/NumberPicker.spec.ts +2 -1
- package/src/components/RatingPicker/NumberPicker/tests/__snapshots__/NumberPicker.spec.ts.snap +40 -13
- package/src/components/RatingPicker/RatingPicker.stories.ts +65 -88
- package/src/components/RatingPicker/RatingPicker.vue +71 -15
- package/src/components/RatingPicker/StarsPicker/StarsPicker.vue +28 -37
- package/src/components/RatingPicker/StarsPicker/tests/StarsPicker.spec.ts +1 -1
- package/src/components/RatingPicker/StarsPicker/tests/__snapshots__/StarsPicker.spec.ts.snap +5 -0
- package/src/components/RatingPicker/accessibilite/Accessibility.mdx +137 -9
- package/src/components/RatingPicker/tests/RatingPicker.a11y.spect.ts +123 -0
- package/src/components/RatingPicker/tests/RatingPicker.spec.ts +3 -2
- package/src/components/RatingPicker/tests/__snapshots__/RatingPicker.spec.ts.snap +40 -11
- package/src/components/RatingPicker/useRatingFocus.ts +97 -0
- package/src/components/SyTextArea/SyTextArea.vue +32 -1
- package/src/components/Tables/SyServerTable/SyServerTable.vue +1 -1
- package/src/components/Tables/SyTable/SyTable.vue +1 -1
- package/src/components/Tables/common/SyTableFilter.vue +4 -4
- package/src/components/Tables/common/SyTablePagination.vue +1 -0
- package/src/components/Tables/common/TableHeader.vue +1 -1
- package/src/components/Tables/common/filters/DateFilter.vue +2 -2
- package/src/composables/date/tests/useDateFormatDayjs.spec.ts +81 -0
- package/src/composables/date/tests/{useDateInitialization.spec.ts → useDateInitializationDayjs.spec.ts} +39 -3
- package/src/composables/date/useDateInitializationDayjs.ts +4 -1
- package/src/composables/unifyValidation/documentationValidationProps.ts +7 -7
- package/src/composables/unifyValidation/tests/useCustomValidation.spec.ts +2 -1
- package/src/composables/unifyValidation/tests/useValidation.spec.ts +22 -0
- package/src/composables/unifyValidation/useCustomValidation.ts +16 -4
- package/src/composables/unifyValidation/useValidation.ts +46 -15
- package/src/composables/unifyValidation/useVuetifyValidation.ts +2 -2
- package/src/composables/useFormFieldErrorHandling.ts +4 -1
- package/src/composables/validation/tests/useValidation.spec.ts +2 -2
- package/src/composables/validation/useValidation.ts +15 -3
- package/src/composantsVuetify/VCard/VCard.mdx +59 -0
- package/src/composantsVuetify/VCard/v-card.stories.ts +279 -0
- package/src/designTokens/tokens/amelipro/apColors2026.ts +1 -1
- package/src/designTokens/tokens/amelipro/apLightTheme.ts +3 -0
- package/src/designTokens/tokens/cnam/cnamLightTheme.ts +3 -0
- package/src/stories/Accessibilite/Aculturation/SensibilisationAccessibilite.mdx +61 -91
- package/src/stories/Accessibilite/AuditDesignSystem.mdx +5 -8
- package/src/stories/Accessibilite/AuditEtContreAudit/Exemptions-derogations.mdx +1 -1
- package/src/stories/Accessibilite/AuditEtContreAudit/Introduction.mdx +11 -8
- package/src/stories/Accessibilite/AuditEtContreAudit/RGAA.mdx +6 -7
- package/src/stories/Accessibilite/Introduction.mdx +30 -30
- package/src/stories/Accessibilite/KitDePreAudit/Echantillonnage.mdx +168 -78
- package/src/stories/Accessibilite/KitDePreAudit/Introduction.mdx +13 -6
- package/src/stories/Accessibilite/KitDePreAudit/Outils/Introduction.mdx +66 -45
- package/src/stories/Accessibilite/KitDePreAudit/Outils/LecteursDEcran.mdx +23 -49
- package/src/stories/Accessibilite/KitDePreAudit/Outils/Tanaguru/FauxPositifs.stories.ts +6 -0
- package/src/stories/Accessibilite/KitDePreAudit/Outils/Tanaguru/Utilisation.mdx +7 -19
- package/src/stories/Accessibilite/KitDePreAudit/Preaudit.mdx +18 -20
- package/src/stories/Components/Components.stories.ts +52 -3
- package/dist/AutocompleteFilter-Df9i5mAl.cjs +0 -1
- package/dist/DateFilter-BJD6FMev.cjs +0 -1
- package/dist/NumberFilter-DGCzCXzI.cjs +0 -1
- package/dist/PeriodFilter-DO_ecTZW.cjs +0 -1
- package/dist/SelectFilter-CGwcKWLm.cjs +0 -1
- package/dist/TextFilter-B8nf7xoK.cjs +0 -1
- package/dist/apLightTheme-CEK4iY3f.cjs +0 -1
- package/dist/composables/date/useDateFormat.d.ts +0 -26
- package/dist/composables/date/useDateInitialization.d.ts +0 -18
- package/dist/design-system-v3.umd.cjs +0 -1
- package/dist/main-ByDPHpae.cjs +0 -1067
- package/dist/tooth-11-D3sLWv2n.cjs +0 -1
- package/dist/tooth-12-CXrLuH03.cjs +0 -1
- package/dist/tooth-13-BSfo5fpT.cjs +0 -1
- package/dist/tooth-14-DMzulx0h.cjs +0 -1
- package/dist/tooth-15-BKRFVi-9.cjs +0 -1
- package/dist/tooth-16-CpuxAbuM.cjs +0 -1
- package/dist/tooth-17-BPoahUdg.cjs +0 -1
- package/dist/tooth-18-DhHJz8sy.cjs +0 -1
- package/dist/tooth-21-Dgd5hn_X.cjs +0 -1
- package/dist/tooth-22-C2Tn19sB.cjs +0 -1
- package/dist/tooth-23-C9uaaSGb.cjs +0 -1
- package/dist/tooth-24-BrK9UGpf.cjs +0 -1
- package/dist/tooth-25-CE_EfGNp.cjs +0 -1
- package/dist/tooth-26-Ctv4i9Fy.cjs +0 -1
- package/dist/tooth-27-C5J7JkWM.cjs +0 -1
- package/dist/tooth-28-Z9oWqjo0.cjs +0 -1
- package/dist/tooth-31-BrYqmkTi.cjs +0 -1
- package/dist/tooth-32-BNNR0oCZ.cjs +0 -1
- package/dist/tooth-33-DuxvqO2J.cjs +0 -1
- package/dist/tooth-34-BCSCXMB6.cjs +0 -1
- package/dist/tooth-35-BLUXkX88.cjs +0 -1
- package/dist/tooth-36-IrKHYqlA.cjs +0 -1
- package/dist/tooth-37-BYqpdMwo.cjs +0 -1
- package/dist/tooth-38-B_eNXXdu.cjs +0 -1
- package/dist/tooth-41-Ddva4Ot8.cjs +0 -1
- package/dist/tooth-42-szcDqlM0.cjs +0 -1
- package/dist/tooth-43-B3ka6rQm.cjs +0 -1
- package/dist/tooth-44-CazyQucj.cjs +0 -1
- package/dist/tooth-45-B4HQtc8n.cjs +0 -1
- package/dist/tooth-46-BPM40gbG.cjs +0 -1
- package/dist/tooth-47-Dvr20dlh.cjs +0 -1
- package/dist/tooth-48-Bd8ljGsF.cjs +0 -1
- package/dist/tooth-51-OBpwCOF3.cjs +0 -1
- package/dist/tooth-52-aKxyHcmq.cjs +0 -1
- package/dist/tooth-53-vCwJjTOc.cjs +0 -1
- package/dist/tooth-54-DsWu2iFy.cjs +0 -1
- package/dist/tooth-55-BxC1X2Dn.cjs +0 -1
- package/dist/tooth-61-BbLvxMQi.cjs +0 -1
- package/dist/tooth-62-CmTkWczP.cjs +0 -1
- package/dist/tooth-63-DI7l_2qI.cjs +0 -1
- package/dist/tooth-64-B21sOsJh.cjs +0 -1
- package/dist/tooth-65-D2ZC2VEr.cjs +0 -1
- package/dist/tooth-71-D473PPO5.cjs +0 -1
- package/dist/tooth-72-Drh1wnNu.cjs +0 -1
- package/dist/tooth-73-DzlwYI23.cjs +0 -1
- package/dist/tooth-74-8aGvcZPg.cjs +0 -1
- package/dist/tooth-75-BFK7At_r.cjs +0 -1
- package/dist/tooth-81-BZmR-I0M.cjs +0 -1
- package/dist/tooth-82-euVfUUZV.cjs +0 -1
- package/dist/tooth-83-KV010j64.cjs +0 -1
- package/dist/tooth-84-BBg1RjhZ.cjs +0 -1
- package/dist/tooth-85-Cr-kc1wM.cjs +0 -1
- package/dist/vuetifyConfig.umd.cjs +0 -1
- package/src/composables/date/tests/useDateFormat.spec.ts +0 -67
- package/src/composables/date/useDateFormat.ts +0 -110
- package/src/composables/date/useDateInitialization.ts +0 -92
|
@@ -1,14 +1,13 @@
|
|
|
1
|
-
import { Meta
|
|
1
|
+
import { Meta } from '@storybook/addon-docs';
|
|
2
2
|
import * as DialogBoxStories from '../DialogBox.stories.ts';
|
|
3
3
|
import '@/stories/styles/shared.css';
|
|
4
4
|
import AccessibilityIcon from '@/common/imgs/accessibility-svgrepo-com.svg';
|
|
5
|
+
|
|
5
6
|
import {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
BestPracticesSection,
|
|
11
|
-
ResourcesSection,
|
|
7
|
+
AccessibilityGuideLayout,
|
|
8
|
+
CriteriaSection,
|
|
9
|
+
CriteriaCard,
|
|
10
|
+
AuditSection
|
|
12
11
|
} from '@/stories/accessibility/AccessibilityGuideLayout.mdx';
|
|
13
12
|
|
|
14
13
|
<Meta of={DialogBoxStories} />
|
|
@@ -16,20 +15,85 @@ import {
|
|
|
16
15
|
componentName="DialogBox"
|
|
17
16
|
iconSrc={AccessibilityIcon}
|
|
18
17
|
>
|
|
19
|
-
<
|
|
20
|
-
<
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
</
|
|
33
|
-
|
|
18
|
+
<AuditSection>
|
|
19
|
+
<div>Rapport d’audit manuel : <a href="/audits/DialogBox.xlsx" style={{color: '#0C41BD'}}>Voir le rapport</a></div>
|
|
20
|
+
<div style={{color: 'grey', fontSize: '14px', marginTop: '0px'}}>
|
|
21
|
+
Correctifs associés (<a href="https://github.com/assurance-maladie-digital/design-system-v3/issues/798" target="_blank" style={{color: '#0C41BD'}}>issue #798</a>)
|
|
22
|
+
</div>
|
|
23
|
+
</AuditSection>
|
|
24
|
+
<CriteriaSection>
|
|
25
|
+
<CriteriaCard icon="🧩" title="Niveau de titre configurable via la prop headingLevel">
|
|
26
|
+
<ul>
|
|
27
|
+
<li>Le niveau du titre (h1 à h6) est défini grâce à la propriété <strong>headingLevel</strong> déclarée dans le composant. Si aucune valeur n’est fournie, le composant applique par défaut un titre de niveau h2, défini dans l’implémentation du composant.</li>
|
|
28
|
+
<code><DialogBox
|
|
29
|
+
:heading-level="2" /> </code>
|
|
30
|
+
|
|
31
|
+
<li><strong>Accessibilité</strong> : Permet que la hiérarchie entre les titres soit pertinente (critère 9.1.1 RGAA) </li>
|
|
32
|
+
|
|
33
|
+
<li>Si aucune valeur n’est fournie, le composant applique par défaut un titre de niveau<strong> h2</strong>.</li>
|
|
34
|
+
|
|
35
|
+
<li>Ce titre est rendu via le composant<strong> SyHeading</strong>, ce qui garantit une structure sémantique correcte dans le DOM.</li>
|
|
36
|
+
|
|
37
|
+
<li><strong>Accessibilité :</strong> permet de respecter une hiérarchie de titres cohérente et pertinente pour les technologies d’assistance (critère 9.1.1 RGAA).</li>
|
|
38
|
+
</ul>
|
|
39
|
+
</CriteriaCard>
|
|
40
|
+
|
|
41
|
+
<CriteriaCard icon="🎯" title="Gestion automatique du focus à l’ouverture et à la fermeture">
|
|
42
|
+
<ul>
|
|
43
|
+
<li>À l’ouverture de la modale, le focus est déplacé soit sur le bouton de validation (<strong>autofocusValidateBtn</strong>), soit sur la zone de titre si la modale est draggable.</li>
|
|
44
|
+
|
|
45
|
+
<li>À la fermeture, le focus est automatiquement restauré sur l’élément qui avait le focus avant l’ouverture.</li>
|
|
46
|
+
|
|
47
|
+
<li><strong>Accessibilité :</strong> évite la perte de contexte pour les utilisateurs clavier et lecteurs d’écran (critère 7.3 RGAA).</li>
|
|
48
|
+
</ul>
|
|
49
|
+
</CriteriaCard>
|
|
50
|
+
|
|
51
|
+
<CriteriaCard icon="⌨️" title="Piégeage du focus dans la boîte de dialogue">
|
|
52
|
+
<ul>
|
|
53
|
+
<li>La navigation clavier avec la touche<strong> Tab </strong>est maintenue à l’intérieur de la modale.</li>
|
|
54
|
+
|
|
55
|
+
<li>Le focus boucle automatiquement entre le premier et le dernier élément interactif.</li>
|
|
56
|
+
|
|
57
|
+
<li>La combinaison<strong> Shift + Tab </strong>est également gérée.</li>
|
|
58
|
+
|
|
59
|
+
<li><strong>Accessibilité :</strong> empêche la sortie involontaire du focus hors de la fenêtre modale (critère 7.1 RGAA).</li>
|
|
60
|
+
</ul>
|
|
61
|
+
</CriteriaCard>
|
|
62
|
+
|
|
63
|
+
<CriteriaCard icon="🏷️" title="Association correcte du titre avec aria-labelledby">
|
|
64
|
+
<ul>
|
|
65
|
+
<li>Le composant utilise un identifiant unique généré avec <strong>useId() </strong>.</li>
|
|
66
|
+
|
|
67
|
+
<li>Cet identifiant est appliqué au titre et référencé via <strong> aria-labelledby </strong>sur le composant dialog.</li>
|
|
68
|
+
|
|
69
|
+
<li>Le composant déclare également<strong> aria-modal="true" </strong>.</li>
|
|
70
|
+
|
|
71
|
+
<li><strong>Accessibilité :</strong> permet aux lecteurs d’écran d’annoncer correctement le contexte de la fenêtre modale (critère 7.1 RGAA).</li>
|
|
72
|
+
</ul>
|
|
73
|
+
</CriteriaCard>
|
|
74
|
+
|
|
75
|
+
<CriteriaCard icon="✋" title="Support clavier du mode draggable">
|
|
76
|
+
<ul>
|
|
77
|
+
<li>Lorsque la prop<strong> draggable </strong>est activée, le titre devient focusable avec <strong>tabindex="0"</strong>.</li>
|
|
78
|
+
|
|
79
|
+
<li>Le déplacement peut être réalisé avec les flèches clavier (gauche, droite, haut, bas).</li>
|
|
80
|
+
|
|
81
|
+
<li>Des attributs<strong> title </strong>et <strong> aria-label </strong>expliquent l’usage aux utilisateurs.</li>
|
|
82
|
+
|
|
83
|
+
<li><strong>Accessibilité :</strong> rend le déplacement utilisable sans souris et améliore l’accessibilité fonctionnelle.</li>
|
|
84
|
+
</ul>
|
|
85
|
+
</CriteriaCard>
|
|
86
|
+
|
|
87
|
+
<CriteriaCard icon="❌" title="Bouton de fermeture explicite et accessible">
|
|
88
|
+
<ul>
|
|
89
|
+
<li>Le bouton de fermeture possède un<strong> aria-label </strong>explicite.</li>
|
|
90
|
+
|
|
91
|
+
<li>L’icône est décorative (<strong>decorative=true</strong>) pour éviter une lecture redondante.</li>
|
|
92
|
+
|
|
93
|
+
<li>Le style de focus visible est renforcé pour garantir une navigation clavier claire.</li>
|
|
34
94
|
|
|
95
|
+
<li><strong>Accessibilité :</strong> assure une identification immédiate de l’action de fermeture (critère 11.10 RGAA).</li>
|
|
96
|
+
</ul>
|
|
97
|
+
</CriteriaCard>
|
|
98
|
+
</CriteriaSection>
|
|
35
99
|
</AccessibilityGuideLayout>
|
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
import useFilterable from '@/composables/useFilterable/useFilterable'
|
|
4
4
|
import { mdiFilterVariant } from '@mdi/js'
|
|
5
5
|
import { computed, onMounted, ref, toRef, watch } from 'vue'
|
|
6
|
-
import {
|
|
6
|
+
import type { VBtn } from 'vuetify/components/VBtn'
|
|
7
|
+
import type { VNavigationDrawer } from 'vuetify/components/VNavigationDrawer'
|
|
7
8
|
import ChipList from '../ChipList/ChipList.vue'
|
|
8
9
|
import SyIcon from '../Customs/SyIcon/SyIcon.vue'
|
|
9
10
|
import { locales as defaultLocales } from './locales'
|
|
@@ -6,7 +6,8 @@
|
|
|
6
6
|
import ISO6391 from 'iso-639-1'
|
|
7
7
|
import useCustomizableOptions, { type CustomizableOptions } from '@/composables/useCustomizableOptions'
|
|
8
8
|
import defaultOptions from './config'
|
|
9
|
-
import type { VBtn
|
|
9
|
+
import type { VBtn } from 'vuetify/components/VBtn'
|
|
10
|
+
import type { VListItem } from 'vuetify/components/VList'
|
|
10
11
|
import SyIcon from '@/components/Customs/SyIcon/SyIcon.vue'
|
|
11
12
|
|
|
12
13
|
const props = withDefaults(defineProps<CustomizableOptions & {
|
|
@@ -147,10 +147,10 @@
|
|
|
147
147
|
|
|
148
148
|
.notification--success {
|
|
149
149
|
background-color: rgb(var(--v-theme-backgroundSuccessContrasted, '86, 194, 113'));
|
|
150
|
-
color: rgb(var(--v-theme-
|
|
150
|
+
color: rgb(var(--v-theme-feedbackOnSuccess));
|
|
151
151
|
|
|
152
152
|
.notification__close:focus-visible {
|
|
153
|
-
outline: 2px solid rgb(var(--v-theme-
|
|
153
|
+
outline: 2px solid rgb(var(--v-theme-feedbackOnSuccess));
|
|
154
154
|
}
|
|
155
155
|
}
|
|
156
156
|
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
import type { DataOptions, SortOption, GroupOption } from './types'
|
|
4
4
|
import { LocalStorageUtility } from '@/utils/localStorageUtility'
|
|
5
5
|
import Pagination from './Pagination.vue'
|
|
6
|
-
import type { VDataTable } from 'vuetify/components'
|
|
6
|
+
import type { VDataTable } from 'vuetify/components/VDataTable'
|
|
7
7
|
|
|
8
8
|
const props = defineProps({
|
|
9
9
|
serverItemsLength: {
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
<script setup lang="ts">
|
|
2
|
-
import { VPagination } from 'vuetify/components'
|
|
3
2
|
import { usePagination } from 'vuetify/lib/components/VDataTable/composables/paginate.mjs'
|
|
4
3
|
import SySelect from '../Customs/Selects/SySelect/SySelect.vue'
|
|
5
4
|
import { useLocale } from 'vuetify'
|
|
@@ -31,6 +30,7 @@
|
|
|
31
30
|
density="compact"
|
|
32
31
|
variant="outlined"
|
|
33
32
|
hide-details
|
|
33
|
+
disable-error-handling
|
|
34
34
|
@update:model-value="v => setItemsPerPage(Number(v))"
|
|
35
35
|
/>
|
|
36
36
|
</div>
|
|
@@ -99,7 +99,7 @@
|
|
|
99
99
|
})
|
|
100
100
|
|
|
101
101
|
// Initialisation du composable de validation
|
|
102
|
-
const { errors, warnings, successes, validateField } = !props.readonly
|
|
102
|
+
const { errors, warnings, successes, displaySuccesses, validateField } = !props.readonly
|
|
103
103
|
? useValidation({
|
|
104
104
|
showSuccessMessages: props.showSuccessMessages,
|
|
105
105
|
fieldIdentifier: props.label || 'password',
|
|
@@ -109,12 +109,13 @@
|
|
|
109
109
|
errors: ref<string[]>([]),
|
|
110
110
|
warnings: ref<string[]>([]),
|
|
111
111
|
successes: ref<string[]>([]),
|
|
112
|
+
displaySuccesses: ref<string[]>([]),
|
|
112
113
|
validateField: () => ({ hasError: false, hasWarning: false, hasSuccess: false, state: { errors: [], warnings: [], successes: [] } }),
|
|
113
114
|
}
|
|
114
115
|
|
|
115
116
|
const hasError = computed(() => errors.value.length > 0)
|
|
116
117
|
const hasWarning = computed(() => warnings.value.length > 0)
|
|
117
|
-
const hasSuccess = computed(() => successes.value.length > 0 &&
|
|
118
|
+
const hasSuccess = computed(() => successes.value.length > 0 && !hasError.value && !hasWarning.value)
|
|
118
119
|
|
|
119
120
|
const validationIcon = computed(() => {
|
|
120
121
|
if (hasError.value) return mdiAlertCircle
|
|
@@ -254,7 +255,9 @@
|
|
|
254
255
|
:required="props.required"
|
|
255
256
|
:error-messages="errors"
|
|
256
257
|
:warning-messages="warnings"
|
|
257
|
-
:success-messages="
|
|
258
|
+
:success-messages="displaySuccesses"
|
|
259
|
+
:has-success="hasSuccess"
|
|
260
|
+
:show-success-messages="props.showSuccessMessages"
|
|
258
261
|
:readonly="props.readonly"
|
|
259
262
|
:disabled="props.disabled"
|
|
260
263
|
:placeholder="props.placeholder"
|
|
@@ -283,6 +286,7 @@
|
|
|
283
286
|
class="d-flex align-center"
|
|
284
287
|
>
|
|
285
288
|
<SyIcon
|
|
289
|
+
v-if="validationIcon"
|
|
286
290
|
:icon="validationIcon"
|
|
287
291
|
:color="validationColor"
|
|
288
292
|
decorative
|
|
@@ -36,6 +36,7 @@
|
|
|
36
36
|
isValidatedOnBlur: { type: Boolean, default: true },
|
|
37
37
|
displayAsterisk: { type: Boolean, default: false },
|
|
38
38
|
disableErrorHandling: { type: Boolean, default: false },
|
|
39
|
+
showSuccessMessages: { type: Boolean, default: true },
|
|
39
40
|
bgColor: { type: String, default: 'white' },
|
|
40
41
|
readonly: { type: Boolean, default: false },
|
|
41
42
|
disabled: { type: Boolean, default: false },
|
|
@@ -300,7 +301,7 @@
|
|
|
300
301
|
})
|
|
301
302
|
|
|
302
303
|
const validation = useValidation({
|
|
303
|
-
showSuccessMessages:
|
|
304
|
+
showSuccessMessages: props.showSuccessMessages,
|
|
304
305
|
disableErrorHandling: shouldDisableErrorHandling.value,
|
|
305
306
|
})
|
|
306
307
|
|
|
@@ -326,7 +327,7 @@
|
|
|
326
327
|
const successes = computed(() =>
|
|
327
328
|
shouldDisableErrorHandling.value || hasError.value || hasWarning.value
|
|
328
329
|
? []
|
|
329
|
-
: validation.
|
|
330
|
+
: validation.displaySuccesses.value,
|
|
330
331
|
)
|
|
331
332
|
|
|
332
333
|
const showHelpTextBelow = computed(() => !!props.helpText?.trim())
|
|
@@ -475,6 +476,7 @@
|
|
|
475
476
|
:error-messages="errors"
|
|
476
477
|
:warning-messages="warnings"
|
|
477
478
|
:success-messages="successes"
|
|
479
|
+
:show-success-messages="props.showSuccessMessages"
|
|
478
480
|
:disable-error-handling="shouldDisableErrorHandling"
|
|
479
481
|
:variant="outlined ? 'outlined' : 'underlined'"
|
|
480
482
|
:display-asterisk="displayAsterisk"
|
|
@@ -3,7 +3,6 @@
|
|
|
3
3
|
// https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Roles/slider_role
|
|
4
4
|
|
|
5
5
|
<script setup lang="ts">
|
|
6
|
-
import { cnamColorsTokens } from '@/designTokens'
|
|
7
6
|
import { computed, ref, toRef, watch, type Ref } from 'vue'
|
|
8
7
|
import Tooltip from './Tooltip/Tooltip.vue'
|
|
9
8
|
import type { PropsStyle } from './types'
|
|
@@ -27,15 +26,12 @@
|
|
|
27
26
|
maxLabel?: string
|
|
28
27
|
}>(),
|
|
29
28
|
{
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
'thumb-color': cnamColorsTokens.blue.base,
|
|
37
|
-
'track-color': cnamColorsTokens.blue.lighten60,
|
|
38
|
-
'track-fill-color': cnamColorsTokens.blue.lighten20,
|
|
29
|
+
modelValue: () => [],
|
|
30
|
+
min: 0,
|
|
31
|
+
max: 100,
|
|
32
|
+
step: 1,
|
|
33
|
+
minLabel: 'Minimum',
|
|
34
|
+
maxLabel: 'Maximum',
|
|
39
35
|
},
|
|
40
36
|
)
|
|
41
37
|
|
|
@@ -259,9 +255,6 @@ $virtual-thumb-size: 40px;
|
|
|
259
255
|
.wrapper {
|
|
260
256
|
--sy-track-height: 4px;
|
|
261
257
|
--sy-thumb-size: 20px;
|
|
262
|
-
--sy-thumb-color: v-bind(props.thumbColor);
|
|
263
|
-
--sy-track-color: v-bind(props.trackColor);
|
|
264
|
-
--sy-track-fill-color: v-bind(props.trackFillColor);
|
|
265
258
|
|
|
266
259
|
position: relative;
|
|
267
260
|
margin-inline: var(--sy-thumb-size);
|
|
@@ -280,7 +273,7 @@ $virtual-thumb-size: 40px;
|
|
|
280
273
|
transform: translate(0, -50%);
|
|
281
274
|
width: 100%;
|
|
282
275
|
height: var(--sy-track-height);
|
|
283
|
-
background-color: var(--
|
|
276
|
+
background-color: rgb(var(--v-theme-backgroundInfoSubdued));
|
|
284
277
|
}
|
|
285
278
|
}
|
|
286
279
|
|
|
@@ -305,7 +298,7 @@ $virtual-thumb-size: 40px;
|
|
|
305
298
|
transform: translate(-50%, -50%);
|
|
306
299
|
width: var(--sy-thumb-size);
|
|
307
300
|
height: var(--sy-thumb-size);
|
|
308
|
-
background-color: var(--
|
|
301
|
+
background-color: rgb(var(--v-theme-primary));
|
|
309
302
|
border-radius: 50%;
|
|
310
303
|
transform-origin: bottom right;
|
|
311
304
|
transition: transform 0.1s;
|
|
@@ -320,7 +313,7 @@ $virtual-thumb-size: 40px;
|
|
|
320
313
|
transform: translate(-50%, -50%);
|
|
321
314
|
width: var(--sy-thumb-size);
|
|
322
315
|
height: var(--sy-thumb-size);
|
|
323
|
-
background-color: var(--
|
|
316
|
+
background-color: rgb(var(--v-theme-primary));
|
|
324
317
|
opacity: 0.4;
|
|
325
318
|
border-radius: 50%;
|
|
326
319
|
transform-origin: bottom right;
|
|
@@ -358,7 +351,7 @@ $virtual-thumb-size: 40px;
|
|
|
358
351
|
transform: translate(-50%, -50%);
|
|
359
352
|
width: var(--sy-thumb-size);
|
|
360
353
|
height: var(--sy-thumb-size);
|
|
361
|
-
background-color: var(--
|
|
354
|
+
background-color: rgb(var(--v-theme-primary));
|
|
362
355
|
border-radius: 50%;
|
|
363
356
|
box-shadow: 0 1px 5px 0 #0000001f, 0 2px 2px 0 #00000024, 0 3px 1px -2px #0003;
|
|
364
357
|
}
|
|
@@ -388,7 +381,7 @@ $virtual-thumb-size: 40px;
|
|
|
388
381
|
transform: translate(0, -50%);
|
|
389
382
|
width: 100%;
|
|
390
383
|
height: var(--sy-track-height);
|
|
391
|
-
background-color: var(--
|
|
384
|
+
background-color: rgb(var(--v-theme-accentPrimaryLight));
|
|
392
385
|
transition: all 0.1s;
|
|
393
386
|
}
|
|
394
387
|
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
<script lang="ts" setup>
|
|
2
|
-
import { type PropType, computed, onMounted,
|
|
2
|
+
import { type PropType, computed, onMounted, toRef } from 'vue'
|
|
3
3
|
import { RatingEnum, useRating } from '../Rating'
|
|
4
4
|
import { locales } from './locales'
|
|
5
5
|
import { propValidator } from '@/utils/propValidator'
|
|
6
|
+
import { useRatingFocus } from '../useRatingFocus'
|
|
6
7
|
import {
|
|
7
8
|
mdiEmoticonHappyOutline,
|
|
8
9
|
mdiEmoticonSadOutline,
|
|
@@ -81,45 +82,27 @@
|
|
|
81
82
|
return props.itemLabels[value]
|
|
82
83
|
}
|
|
83
84
|
|
|
84
|
-
const
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
const prevIndex = currentIndex > 0 ? currentIndex - 1 : (props.length - 1)
|
|
98
|
-
const prevElem = ratingElement.value?.[prevIndex]
|
|
99
|
-
|
|
100
|
-
ratingElement.value[index]?.setAttribute('tabindex', '-1')
|
|
101
|
-
prevElem?.setAttribute('tabindex', '0')
|
|
102
|
-
prevElem?.focus()
|
|
103
|
-
}
|
|
85
|
+
const {
|
|
86
|
+
ratingElement,
|
|
87
|
+
initFocus,
|
|
88
|
+
selectAndFocus,
|
|
89
|
+
focusNextElement,
|
|
90
|
+
focusPrevElement,
|
|
91
|
+
focus,
|
|
92
|
+
} = useRatingFocus({
|
|
93
|
+
length: toRef(props, 'length'),
|
|
94
|
+
modelValue: internalValue,
|
|
95
|
+
selectValue: emitInputEvent,
|
|
96
|
+
wrap: true,
|
|
97
|
+
})
|
|
104
98
|
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
el?.setAttribute('tabindex', '0')
|
|
109
|
-
}
|
|
110
|
-
else {
|
|
111
|
-
el?.setAttribute('tabindex', '-1')
|
|
112
|
-
}
|
|
113
|
-
})
|
|
114
|
-
}
|
|
99
|
+
defineExpose({
|
|
100
|
+
focus,
|
|
101
|
+
})
|
|
115
102
|
|
|
116
103
|
onMounted(() => {
|
|
117
|
-
|
|
118
|
-
for (let i = 1; i < ratingElement.value.length; i++) {
|
|
119
|
-
ratingElement.value[i]?.setAttribute('tabindex', '-1')
|
|
120
|
-
}
|
|
104
|
+
initFocus()
|
|
121
105
|
})
|
|
122
|
-
|
|
123
106
|
</script>
|
|
124
107
|
|
|
125
108
|
<template>
|
|
@@ -142,22 +125,23 @@
|
|
|
142
125
|
:key="index"
|
|
143
126
|
ref="ratingElement"
|
|
144
127
|
v-ripple="!(props.readonly || hasAnswered)"
|
|
128
|
+
:tabindex="-1"
|
|
145
129
|
role="radio"
|
|
146
|
-
:aria-
|
|
147
|
-
:aria-checked="isActive(index) ? 'true' : undefined"
|
|
130
|
+
:aria-checked="isActive(index) ? 'true' : 'false'"
|
|
148
131
|
:class="[getColor(index - 1), { 'sy-emotion-picker__item--active': isActive(index) }]"
|
|
149
132
|
:style="{
|
|
150
133
|
'min-height': btnSize,
|
|
151
134
|
'min-width': btnSize
|
|
152
135
|
}"
|
|
136
|
+
:aria-disabled="(props.readonly || hasAnswered) ? 'true' : undefined"
|
|
153
137
|
class="sy-emotion-picker__item rounded-lg px-1 px-sm-4 mx-1 mx-sm-2"
|
|
154
|
-
@click="
|
|
155
|
-
@
|
|
156
|
-
@
|
|
157
|
-
@
|
|
158
|
-
@
|
|
159
|
-
@
|
|
160
|
-
@
|
|
138
|
+
@click="selectAndFocus(index - 1)"
|
|
139
|
+
@keydown.enter.prevent="selectAndFocus(index - 1)"
|
|
140
|
+
@keydown.space.prevent="selectAndFocus(index - 1)"
|
|
141
|
+
@keydown.right.prevent="focusNextElement(index - 1)"
|
|
142
|
+
@keydown.left.prevent="focusPrevElement(index - 1)"
|
|
143
|
+
@keydown.up.prevent="focusPrevElement(index - 1)"
|
|
144
|
+
@keydown.down.prevent="focusNextElement(index - 1)"
|
|
161
145
|
>
|
|
162
146
|
<SyIcon
|
|
163
147
|
:icon="getIcon(index - 1)"
|
|
@@ -184,7 +168,7 @@
|
|
|
184
168
|
border: 0;
|
|
185
169
|
}
|
|
186
170
|
|
|
187
|
-
.sy-emotion-picker__item:not([disabled]) {
|
|
171
|
+
.sy-emotion-picker__item:not([aria-disabled='true']) {
|
|
188
172
|
cursor: pointer;
|
|
189
173
|
}
|
|
190
174
|
|
|
@@ -238,8 +222,8 @@
|
|
|
238
222
|
}
|
|
239
223
|
}
|
|
240
224
|
|
|
241
|
-
&:hover[disabled='true']:not([aria-checked='true']),
|
|
242
|
-
&:focus[disabled='true']:not([aria-checked='true']) {
|
|
225
|
+
&:hover[aria-disabled='true']:not([aria-checked='true']),
|
|
226
|
+
&:focus[aria-disabled='true']:not([aria-checked='true']) {
|
|
243
227
|
background-color: transparent;
|
|
244
228
|
}
|
|
245
229
|
}
|
package/src/components/RatingPicker/EmotionPicker/tests/__snapshots__/EmotionPicker.spec.ts.snap
CHANGED
|
@@ -21,6 +21,7 @@ exports[`EmotionPicker > renders correctly 1`] = `
|
|
|
21
21
|
role="radiogroup"
|
|
22
22
|
>
|
|
23
23
|
<div
|
|
24
|
+
aria-checked="false"
|
|
24
25
|
class="
|
|
25
26
|
mx-1
|
|
26
27
|
mx-sm-2
|
|
@@ -110,6 +111,7 @@ exports[`EmotionPicker > renders correctly 1`] = `
|
|
|
110
111
|
</span>
|
|
111
112
|
</div>
|
|
112
113
|
<div
|
|
114
|
+
aria-checked="false"
|
|
113
115
|
class="
|
|
114
116
|
mx-1
|
|
115
117
|
mx-sm-2
|
|
@@ -199,6 +201,7 @@ exports[`EmotionPicker > renders correctly 1`] = `
|
|
|
199
201
|
</span>
|
|
200
202
|
</div>
|
|
201
203
|
<div
|
|
204
|
+
aria-checked="false"
|
|
202
205
|
class="
|
|
203
206
|
happy
|
|
204
207
|
mx-1
|
|
@@ -312,6 +315,7 @@ exports[`EmotionPicker > renders correctly with only 2 items 1`] = `
|
|
|
312
315
|
role="radiogroup"
|
|
313
316
|
>
|
|
314
317
|
<div
|
|
318
|
+
aria-checked="false"
|
|
315
319
|
class="
|
|
316
320
|
mx-1
|
|
317
321
|
mx-sm-2
|
|
@@ -401,6 +405,7 @@ exports[`EmotionPicker > renders correctly with only 2 items 1`] = `
|
|
|
401
405
|
</span>
|
|
402
406
|
</div>
|
|
403
407
|
<div
|
|
408
|
+
aria-checked="false"
|
|
404
409
|
class="
|
|
405
410
|
happy
|
|
406
411
|
mx-1
|