@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.
Files changed (211) hide show
  1. package/dist/{AutocompleteFilter-D7qBuCAP.js → AutocompleteFilter-BPR-a55G.js} +1 -1
  2. package/dist/{DateFilter-BitMWrMU.js → DateFilter-CknrJWs2.js} +2 -2
  3. package/dist/{NumberFilter-BTLUxw0a.js → NumberFilter-DJ-yNlzv.js} +1 -1
  4. package/dist/{PeriodFilter-B5rUIPAC.js → PeriodFilter-CiB5Oa9Z.js} +1 -1
  5. package/dist/{SelectFilter-l4QnRcuk.js → SelectFilter-EiafX97M.js} +1 -1
  6. package/dist/{TextFilter-C9hj6Qrp.js → TextFilter-BzOmpdxj.js} +1 -1
  7. package/dist/{apLightTheme-DnIM24Lv.js → apLightTheme-DS0Uy44H.js} +20 -16
  8. package/dist/components/Customs/Selects/SyAutocomplete/SyAutocomplete.d.ts +4 -2
  9. package/dist/components/Customs/Selects/SySelect/SySelect.d.ts +60 -289
  10. package/dist/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.d.ts +1 -0
  11. package/dist/components/Customs/SyCheckbox/SyCheckbox.d.ts +1 -0
  12. package/dist/components/Customs/SyRadioGroup/SyRadioGroup.d.ts +1 -0
  13. package/dist/components/Customs/SyTextField/SyTextField.d.ts +2 -4
  14. package/dist/components/DatePicker/CalendarMode/DatePicker.d.ts +50 -49
  15. package/dist/components/DatePicker/ComplexDatePicker/ComplexDatePicker.d.ts +29 -28
  16. package/dist/components/DatePicker/DateTextInput/DateTextInput.d.ts +8 -8
  17. package/dist/components/DatePicker/composables/useDatePickerState.d.ts +3 -3
  18. package/dist/components/DatePicker/composables/useDateTextField.d.ts +2 -2
  19. package/dist/components/DatePicker/composables/useInputBlurHandler.d.ts +2 -2
  20. package/dist/components/DatePicker/types.d.ts +1 -2
  21. package/dist/components/LunarCalendar/useLunarCalendarValidation.d.ts +1 -0
  22. package/dist/components/MonthPicker/MonthPicker.d.ts +1 -1
  23. package/dist/components/MonthPicker/MonthPickerText/MonthPickerInput.d.ts +1 -1
  24. package/dist/components/NirField/NirField.d.ts +8 -4
  25. package/dist/components/NirField/useNirValidation.d.ts +6 -2
  26. package/dist/components/PeriodField/PeriodField.d.ts +102 -102
  27. package/dist/components/PhoneField/PhoneField.d.ts +11 -1
  28. package/dist/components/RangeField/RangeSlider/RangeSlider.d.ts +0 -3
  29. package/dist/components/RatingPicker/EmotionPicker/EmotionPicker.d.ts +3 -1
  30. package/dist/components/RatingPicker/NumberPicker/NumberPicker.d.ts +4 -3
  31. package/dist/components/RatingPicker/RatingPicker.d.ts +18 -5
  32. package/dist/components/RatingPicker/StarsPicker/StarsPicker.d.ts +3 -1
  33. package/dist/components/RatingPicker/tests/RatingPicker.a11y.spect.d.ts +1 -0
  34. package/dist/components/RatingPicker/useRatingFocus.d.ts +18 -0
  35. package/dist/components/Tables/SyServerTable/SyServerTable.d.ts +4 -4
  36. package/dist/components/Tables/SyTable/SyTable.d.ts +4 -4
  37. package/dist/components/Tables/common/SyTablePagination.d.ts +152 -364
  38. package/dist/components/Tables/common/TableHeader.d.ts +1 -1
  39. package/dist/components/Tables/common/filters/DateFilter.d.ts +4 -4
  40. package/dist/composables/date/useDateInitializationDayjs.d.ts +3 -1
  41. package/dist/composables/unifyValidation/useCustomValidation.d.ts +3 -1
  42. package/dist/composables/unifyValidation/useValidation.d.ts +12 -6
  43. package/dist/composables/unifyValidation/useVuetifyValidation.d.ts +1 -1
  44. package/dist/composables/validation/useValidation.d.ts +1 -0
  45. package/dist/design-system-v3.js +2 -2
  46. package/dist/designTokens/tokens/amelipro/apLightTheme.d.ts +2 -0
  47. package/dist/designTokens/tokens/cnam/cnamLightTheme.d.ts +2 -0
  48. package/dist/{main-Cpx8Co6H.js → main-BsJ9ec3i.js} +9103 -9018
  49. package/dist/synapse.css +1 -1
  50. package/dist/vuetifyConfig.js +1 -1
  51. package/package.json +8 -7
  52. package/src/assets/overrides/_icons.scss +0 -13
  53. package/src/assets/overrides/_otp.scss +0 -1
  54. package/src/components/Accordion/Accordion.vue +2 -0
  55. package/src/components/CookiesSelection/CookiesInformation/CookiesInformation.vue +2 -1
  56. package/src/components/CookiesSelection/CookiesSelection.vue +2 -1
  57. package/src/components/CopyBtn/CopyBtn.vue +9 -0
  58. package/src/components/Customs/Selects/SyAutocomplete/SyAutocomplete.vue +1 -1
  59. package/src/components/Customs/Selects/SySelect/SySelect.stories.ts +413 -96
  60. package/src/components/Customs/Selects/SySelect/SySelect.vue +270 -225
  61. package/src/components/Customs/Selects/SySelect/tests/SySelect.spec.ts +245 -6
  62. package/src/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.vue +3 -3
  63. package/src/components/Customs/SyCheckbox/SyCheckbox.vue +23 -2
  64. package/src/components/Customs/SyRadioGroup/SyRadioGroup.vue +23 -5
  65. package/src/components/Customs/SyTabs/SyTabs.stories.ts +5 -5
  66. package/src/components/Customs/SyTabs/config.ts +3 -3
  67. package/src/components/Customs/SyTextField/SyTextField.vue +31 -4
  68. package/src/components/DatePicker/CalendarMode/DatePicker.stories.ts +1 -1
  69. package/src/components/DatePicker/CalendarMode/DatePicker.vue +17 -14
  70. package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.stories.ts +1 -1
  71. package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.vue +8 -7
  72. package/src/components/DatePicker/ComplexDatePicker/tests/ComplexDatePicker.spec.ts +1 -1
  73. package/src/components/DatePicker/DatePickerValidationExample/DatePickerValidation.stories.ts +1 -1
  74. package/src/components/DatePicker/DateTextInput/DateTextInput.vue +57 -23
  75. package/src/components/DatePicker/DateTextInput/NoCalendar.stories.ts +1 -1
  76. package/src/components/DatePicker/composables/useDatePickerState.ts +33 -14
  77. package/src/components/DatePicker/composables/useDateRangeInput.ts +2 -1
  78. package/src/components/DatePicker/composables/useDateSelection.ts +2 -1
  79. package/src/components/DatePicker/composables/useDateTextField.ts +2 -2
  80. package/src/components/DatePicker/composables/useInputBlurHandler.ts +2 -2
  81. package/src/components/DatePicker/types.ts +1 -2
  82. package/src/components/DialogBox/DialogBox.stories.ts +8 -8
  83. package/src/components/DialogBox/accessibilite/Accessibility.mdx +86 -22
  84. package/src/components/FilterSideBar/FilterSideBar.vue +2 -1
  85. package/src/components/LangBtn/LangBtn.vue +2 -1
  86. package/src/components/NotificationBar/Notification/Notification.vue +2 -2
  87. package/src/components/PaginatedTable/PaginatedTable.vue +1 -1
  88. package/src/components/PaginatedTable/Pagination.vue +1 -1
  89. package/src/components/PasswordField/PasswordField.vue +7 -3
  90. package/src/components/PhoneField/PhoneField.vue +4 -2
  91. package/src/components/RangeField/RangeSlider/RangeSlider.vue +11 -18
  92. package/src/components/RatingPicker/EmotionPicker/EmotionPicker.vue +32 -48
  93. package/src/components/RatingPicker/EmotionPicker/tests/__snapshots__/EmotionPicker.spec.ts.snap +5 -0
  94. package/src/components/RatingPicker/NumberPicker/NumberPicker.vue +48 -53
  95. package/src/components/RatingPicker/NumberPicker/tests/NumberPicker.spec.ts +2 -1
  96. package/src/components/RatingPicker/NumberPicker/tests/__snapshots__/NumberPicker.spec.ts.snap +40 -13
  97. package/src/components/RatingPicker/RatingPicker.stories.ts +65 -88
  98. package/src/components/RatingPicker/RatingPicker.vue +71 -15
  99. package/src/components/RatingPicker/StarsPicker/StarsPicker.vue +28 -37
  100. package/src/components/RatingPicker/StarsPicker/tests/StarsPicker.spec.ts +1 -1
  101. package/src/components/RatingPicker/StarsPicker/tests/__snapshots__/StarsPicker.spec.ts.snap +5 -0
  102. package/src/components/RatingPicker/accessibilite/Accessibility.mdx +137 -9
  103. package/src/components/RatingPicker/tests/RatingPicker.a11y.spect.ts +123 -0
  104. package/src/components/RatingPicker/tests/RatingPicker.spec.ts +3 -2
  105. package/src/components/RatingPicker/tests/__snapshots__/RatingPicker.spec.ts.snap +40 -11
  106. package/src/components/RatingPicker/useRatingFocus.ts +97 -0
  107. package/src/components/SyTextArea/SyTextArea.vue +32 -1
  108. package/src/components/Tables/SyServerTable/SyServerTable.vue +1 -1
  109. package/src/components/Tables/SyTable/SyTable.vue +1 -1
  110. package/src/components/Tables/common/SyTableFilter.vue +4 -4
  111. package/src/components/Tables/common/SyTablePagination.vue +1 -0
  112. package/src/components/Tables/common/TableHeader.vue +1 -1
  113. package/src/components/Tables/common/filters/DateFilter.vue +2 -2
  114. package/src/composables/date/tests/useDateFormatDayjs.spec.ts +81 -0
  115. package/src/composables/date/tests/{useDateInitialization.spec.ts → useDateInitializationDayjs.spec.ts} +39 -3
  116. package/src/composables/date/useDateInitializationDayjs.ts +4 -1
  117. package/src/composables/unifyValidation/documentationValidationProps.ts +7 -7
  118. package/src/composables/unifyValidation/tests/useCustomValidation.spec.ts +2 -1
  119. package/src/composables/unifyValidation/tests/useValidation.spec.ts +22 -0
  120. package/src/composables/unifyValidation/useCustomValidation.ts +16 -4
  121. package/src/composables/unifyValidation/useValidation.ts +46 -15
  122. package/src/composables/unifyValidation/useVuetifyValidation.ts +2 -2
  123. package/src/composables/useFormFieldErrorHandling.ts +4 -1
  124. package/src/composables/validation/tests/useValidation.spec.ts +2 -2
  125. package/src/composables/validation/useValidation.ts +15 -3
  126. package/src/composantsVuetify/VCard/VCard.mdx +59 -0
  127. package/src/composantsVuetify/VCard/v-card.stories.ts +279 -0
  128. package/src/designTokens/tokens/amelipro/apColors2026.ts +1 -1
  129. package/src/designTokens/tokens/amelipro/apLightTheme.ts +3 -0
  130. package/src/designTokens/tokens/cnam/cnamLightTheme.ts +3 -0
  131. package/src/stories/Accessibilite/Aculturation/SensibilisationAccessibilite.mdx +61 -91
  132. package/src/stories/Accessibilite/AuditDesignSystem.mdx +5 -8
  133. package/src/stories/Accessibilite/AuditEtContreAudit/Exemptions-derogations.mdx +1 -1
  134. package/src/stories/Accessibilite/AuditEtContreAudit/Introduction.mdx +11 -8
  135. package/src/stories/Accessibilite/AuditEtContreAudit/RGAA.mdx +6 -7
  136. package/src/stories/Accessibilite/Introduction.mdx +30 -30
  137. package/src/stories/Accessibilite/KitDePreAudit/Echantillonnage.mdx +168 -78
  138. package/src/stories/Accessibilite/KitDePreAudit/Introduction.mdx +13 -6
  139. package/src/stories/Accessibilite/KitDePreAudit/Outils/Introduction.mdx +66 -45
  140. package/src/stories/Accessibilite/KitDePreAudit/Outils/LecteursDEcran.mdx +23 -49
  141. package/src/stories/Accessibilite/KitDePreAudit/Outils/Tanaguru/FauxPositifs.stories.ts +6 -0
  142. package/src/stories/Accessibilite/KitDePreAudit/Outils/Tanaguru/Utilisation.mdx +7 -19
  143. package/src/stories/Accessibilite/KitDePreAudit/Preaudit.mdx +18 -20
  144. package/src/stories/Components/Components.stories.ts +52 -3
  145. package/dist/AutocompleteFilter-Df9i5mAl.cjs +0 -1
  146. package/dist/DateFilter-BJD6FMev.cjs +0 -1
  147. package/dist/NumberFilter-DGCzCXzI.cjs +0 -1
  148. package/dist/PeriodFilter-DO_ecTZW.cjs +0 -1
  149. package/dist/SelectFilter-CGwcKWLm.cjs +0 -1
  150. package/dist/TextFilter-B8nf7xoK.cjs +0 -1
  151. package/dist/apLightTheme-CEK4iY3f.cjs +0 -1
  152. package/dist/composables/date/useDateFormat.d.ts +0 -26
  153. package/dist/composables/date/useDateInitialization.d.ts +0 -18
  154. package/dist/design-system-v3.umd.cjs +0 -1
  155. package/dist/main-ByDPHpae.cjs +0 -1067
  156. package/dist/tooth-11-D3sLWv2n.cjs +0 -1
  157. package/dist/tooth-12-CXrLuH03.cjs +0 -1
  158. package/dist/tooth-13-BSfo5fpT.cjs +0 -1
  159. package/dist/tooth-14-DMzulx0h.cjs +0 -1
  160. package/dist/tooth-15-BKRFVi-9.cjs +0 -1
  161. package/dist/tooth-16-CpuxAbuM.cjs +0 -1
  162. package/dist/tooth-17-BPoahUdg.cjs +0 -1
  163. package/dist/tooth-18-DhHJz8sy.cjs +0 -1
  164. package/dist/tooth-21-Dgd5hn_X.cjs +0 -1
  165. package/dist/tooth-22-C2Tn19sB.cjs +0 -1
  166. package/dist/tooth-23-C9uaaSGb.cjs +0 -1
  167. package/dist/tooth-24-BrK9UGpf.cjs +0 -1
  168. package/dist/tooth-25-CE_EfGNp.cjs +0 -1
  169. package/dist/tooth-26-Ctv4i9Fy.cjs +0 -1
  170. package/dist/tooth-27-C5J7JkWM.cjs +0 -1
  171. package/dist/tooth-28-Z9oWqjo0.cjs +0 -1
  172. package/dist/tooth-31-BrYqmkTi.cjs +0 -1
  173. package/dist/tooth-32-BNNR0oCZ.cjs +0 -1
  174. package/dist/tooth-33-DuxvqO2J.cjs +0 -1
  175. package/dist/tooth-34-BCSCXMB6.cjs +0 -1
  176. package/dist/tooth-35-BLUXkX88.cjs +0 -1
  177. package/dist/tooth-36-IrKHYqlA.cjs +0 -1
  178. package/dist/tooth-37-BYqpdMwo.cjs +0 -1
  179. package/dist/tooth-38-B_eNXXdu.cjs +0 -1
  180. package/dist/tooth-41-Ddva4Ot8.cjs +0 -1
  181. package/dist/tooth-42-szcDqlM0.cjs +0 -1
  182. package/dist/tooth-43-B3ka6rQm.cjs +0 -1
  183. package/dist/tooth-44-CazyQucj.cjs +0 -1
  184. package/dist/tooth-45-B4HQtc8n.cjs +0 -1
  185. package/dist/tooth-46-BPM40gbG.cjs +0 -1
  186. package/dist/tooth-47-Dvr20dlh.cjs +0 -1
  187. package/dist/tooth-48-Bd8ljGsF.cjs +0 -1
  188. package/dist/tooth-51-OBpwCOF3.cjs +0 -1
  189. package/dist/tooth-52-aKxyHcmq.cjs +0 -1
  190. package/dist/tooth-53-vCwJjTOc.cjs +0 -1
  191. package/dist/tooth-54-DsWu2iFy.cjs +0 -1
  192. package/dist/tooth-55-BxC1X2Dn.cjs +0 -1
  193. package/dist/tooth-61-BbLvxMQi.cjs +0 -1
  194. package/dist/tooth-62-CmTkWczP.cjs +0 -1
  195. package/dist/tooth-63-DI7l_2qI.cjs +0 -1
  196. package/dist/tooth-64-B21sOsJh.cjs +0 -1
  197. package/dist/tooth-65-D2ZC2VEr.cjs +0 -1
  198. package/dist/tooth-71-D473PPO5.cjs +0 -1
  199. package/dist/tooth-72-Drh1wnNu.cjs +0 -1
  200. package/dist/tooth-73-DzlwYI23.cjs +0 -1
  201. package/dist/tooth-74-8aGvcZPg.cjs +0 -1
  202. package/dist/tooth-75-BFK7At_r.cjs +0 -1
  203. package/dist/tooth-81-BZmR-I0M.cjs +0 -1
  204. package/dist/tooth-82-euVfUUZV.cjs +0 -1
  205. package/dist/tooth-83-KV010j64.cjs +0 -1
  206. package/dist/tooth-84-BBg1RjhZ.cjs +0 -1
  207. package/dist/tooth-85-Cr-kc1wM.cjs +0 -1
  208. package/dist/vuetifyConfig.umd.cjs +0 -1
  209. package/src/composables/date/tests/useDateFormat.spec.ts +0 -67
  210. package/src/composables/date/useDateFormat.ts +0 -110
  211. package/src/composables/date/useDateInitialization.ts +0 -92
@@ -1,14 +1,13 @@
1
- import { Meta, Story, Primary } from '@storybook/addon-docs';
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
- AccessibilityGuideLayout,
7
- CriteriaSection,
8
- CriteriaCard,
9
- DemoSection,
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
- <div class="mt-2">
20
- <p>Rapport d’audit manuel : <a href="/audits/DialogBox.xlsx" style={{ color:'#0C41BD' }}>Voir le rapport</a></p>
21
- <p style={{ color: 'grey', fontSize: '14px', marginTop: '0px' }}>Correctifs associés (<a href="https://github.com/assurance-maladie-digital/design-system-v3/issues/798" target="_blank" style={{color:'#0C41BD'}}>issue #798</a>)</p>
22
- </div>
23
- <CriteriaSection>
24
- <CriteriaCard icon="🧩" title="Niveau de titre configurable via la prop headingLevel">
25
- <ul>
26
- <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>
27
- <code>&lt;DialogBox
28
- :heading-level="2" /&gt; </code>
29
-
30
- <li><strong>Accessibilité</strong> : Permet que la hiérarchie entre les titres soit pertinente (critère 9.1.1 RGAA) </li>
31
- </ul>
32
- </CriteriaCard>
33
- </CriteriaSection>
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>&lt;DialogBox
29
+ :heading-level="2" /&gt; </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 { type VBtn, type VNavigationDrawer } from 'vuetify/components'
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, VListItem } from 'vuetify/components'
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-textBase, '0, 0, 0'));
150
+ color: rgb(var(--v-theme-feedbackOnSuccess));
151
151
 
152
152
  .notification__close:focus-visible {
153
- outline: 2px solid rgb(var(--v-theme-textBase, '0, 0, 0'));
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 && props.showSuccessMessages)
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="successes"
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: true,
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.successes.value,
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
- 'modelValue': () => [],
31
- 'min': 0,
32
- 'max': 100,
33
- 'step': 1,
34
- 'minLabel': 'Minimum',
35
- 'maxLabel': 'Maximum',
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(--sy-track-color);
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(--sy-thumb-color);
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(--sy-thumb-color);
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(--sy-thumb-color);
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(--sy-track-fill-color);
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, ref } from 'vue'
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 ratingElement = ref<HTMLDivElement[]>([])
85
- function focusNextElement(index: number) {
86
- const currentIndex = ratingElement.value?.findIndex(el => el === ratingElement.value[index]) ?? -1
87
- const nextIndex = currentIndex < (props.length - 1) ? currentIndex + 1 : 0
88
- const nextElem = ratingElement.value?.[nextIndex]
89
-
90
- ratingElement.value[index]?.setAttribute('tabindex', '-1')
91
- nextElem?.setAttribute('tabindex', '0')
92
- nextElem?.focus()
93
- }
94
-
95
- function focusPrevElement(index: number) {
96
- const currentIndex = ratingElement.value?.findIndex(el => el === ratingElement.value[index]) ?? -1
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
- function setFocus(index: number) {
106
- ratingElement.value.forEach((el, i) => {
107
- if (i === index) {
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
- ratingElement.value[0]?.setAttribute('tabindex', '0')
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-disabled="(props.readonly || hasAnswered) ? 'true' : undefined"
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="emitInputEvent(index); setFocus(index - 1)"
155
- @keyup.enter="emitInputEvent(index); setFocus(index - 1)"
156
- @keyup.space="emitInputEvent(index); setFocus(index - 1)"
157
- @keyup.right="focusNextElement(index - 1)"
158
- @keyup.left="focusPrevElement(index - 1)"
159
- @keyup.up="focusPrevElement(index - 1)"
160
- @keyup.down="focusNextElement(index - 1)"
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
  }
@@ -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