@cnamts/synapse 1.0.22 → 1.0.24

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 (426) hide show
  1. package/dist/AutocompleteFilter-BWLR3U7W.js +114 -0
  2. package/dist/AutocompleteFilter-D9jzRzAL.cjs +1 -0
  3. package/dist/{DateFilter-B5n-ZkLi.js → DateFilter-BpwFexzi.js} +1 -1
  4. package/dist/DateFilter-DTUl8hb1.cjs +1 -0
  5. package/dist/{NumberFilter-CtiZ9uj8.js → NumberFilter-Bz_NTdX9.js} +3 -3
  6. package/dist/NumberFilter-MAEojdk0.cjs +1 -0
  7. package/dist/PeriodFilter-CC4WgIhl.cjs +1 -0
  8. package/dist/{PeriodFilter-DzqiMb-b.js → PeriodFilter-DX_wy9g-.js} +1 -1
  9. package/dist/SelectFilter-BR3fvl-a.cjs +1 -0
  10. package/dist/SelectFilter-xqiPtPgX.js +135 -0
  11. package/dist/{TextFilter-BOFRNfcX.js → TextFilter-BBl3JFqK.js} +7 -7
  12. package/dist/TextFilter-CCfYFl5F.cjs +1 -0
  13. package/dist/apLightTheme-CFSRrjv2.cjs +1 -0
  14. package/dist/apLightTheme-D1P4jcD0.js +1231 -0
  15. package/dist/components/Accordion/Accordion.d.ts +13 -2
  16. package/dist/components/Accordion/composables/useAccordionState.d.ts +2 -1
  17. package/dist/components/Amelipro/AmeliproAutoCompleteField/AmeliproAutoCompleteField.d.ts +7022 -9616
  18. package/dist/components/Amelipro/AmeliproCarousel/AmeliproCarousel.d.ts +2 -2
  19. package/dist/components/Amelipro/AmeliproCheckbox/AmeliproCheckbox.d.ts +1 -1
  20. package/dist/components/Amelipro/AmeliproCustomSelector/AmeliproCustomSelector.d.ts +1 -1
  21. package/dist/components/Amelipro/AmeliproIconBtn/AmeliproIconBtn.d.ts +2 -2
  22. package/dist/components/Amelipro/AmeliproPostalAddressField/AmeliproPostalAddressCityRow/AmeliproPostalAddressCityRow.d.ts +40 -40
  23. package/dist/components/Amelipro/AmeliproPostalAddressField/AmeliproPostalAddressField.d.ts +61 -61
  24. package/dist/components/Amelipro/AmeliproSelect/AmeliproSelect.d.ts +7168 -9762
  25. package/dist/components/Amelipro/AmeliproStepper/AmeliproStepper.d.ts +2 -2
  26. package/dist/components/Amelipro/AmeliproTabs/AmeliproTabs.d.ts +7506 -10100
  27. package/dist/components/Amelipro/AmeliproTextArea/AmeliproTextArea.d.ts +22 -22
  28. package/dist/components/Amelipro/AmeliproTextField/AmeliproTextField.d.ts +42 -42
  29. package/dist/components/Amelipro/StructureMenu/StructureTabs/StructureTabs.d.ts +2 -2
  30. package/dist/components/CookiesSelection/CookiesInformation/CookiesInformation.d.ts +20 -498
  31. package/dist/components/Customs/Selects/SyAutocomplete/SyAutocomplete.d.ts +130 -147
  32. package/dist/components/Customs/Selects/SyAutocomplete/locales.d.ts +5 -0
  33. package/dist/components/Customs/Selects/SyInputSelect/SyInputSelect.d.ts +6 -6
  34. package/dist/components/Customs/Selects/SySelect/SySelect.d.ts +13 -17
  35. package/dist/components/Customs/Selects/SySelect/locales.d.ts +1 -0
  36. package/dist/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.d.ts +9 -9
  37. package/dist/components/Customs/SyCheckbox/SyCheckbox.d.ts +29 -507
  38. package/dist/components/Customs/SyRadioGroup/SyRadioGroup.d.ts +29 -507
  39. package/dist/components/Customs/SyTextField/SyTextField.d.ts +64 -81
  40. package/dist/components/DatePicker/CalendarMode/DatePicker.d.ts +640 -780
  41. package/dist/components/DatePicker/ComplexDatePicker/ComplexDatePicker.d.ts +322 -407
  42. package/dist/components/DatePicker/DateTextInput/DateTextInput.d.ts +114 -156
  43. package/dist/components/DatePicker/composables/index.d.ts +1 -0
  44. package/dist/components/DatePicker/composables/useDatePickerFocusTrap.d.ts +11 -0
  45. package/dist/components/DatePicker/composables/useDateTextField.d.ts +4 -4
  46. package/dist/components/DatePicker/composables/useDateValidation.d.ts +3 -3
  47. package/dist/components/DatePicker/composables/useInputBlurHandler.d.ts +2 -2
  48. package/dist/components/DatePicker/composables/useManualDateValidation.d.ts +2 -2
  49. package/dist/components/ErrorPage/ErrorPage.d.ts +3 -1
  50. package/dist/components/FileList/UploadItem/UploadItem.d.ts +6 -0
  51. package/dist/components/FileList/UploadItem/locales.d.ts +1 -4
  52. package/dist/components/FileUpload/FileUploadContent.d.ts +2 -0
  53. package/dist/components/FileUpload/validateFiles.d.ts +2 -1
  54. package/dist/components/HeaderBar/HeaderBar.d.ts +2 -1
  55. package/dist/components/HeaderBar/HeaderLogo/HeaderLogo.d.ts +2 -1
  56. package/dist/components/HeaderNavigationBar/HeaderNavigationBar.d.ts +6 -5
  57. package/dist/components/HeaderToolbar/HeaderToolbar.d.ts +20 -28
  58. package/dist/components/LunarCalendar/useLunarCalendarValidation.d.ts +3 -3
  59. package/dist/components/MonthPicker/MonthPicker.d.ts +1903 -0
  60. package/dist/components/MonthPicker/MonthPickerText/MonthPickerInput.d.ts +1863 -0
  61. package/dist/components/MonthPicker/MonthPickerText/useTextField.d.ts +21 -0
  62. package/dist/components/MonthPicker/MonthPickerVisual/MonthPickerVisual.d.ts +21 -0
  63. package/dist/components/MonthPicker/MonthPickerVisual/MonthPickerVisualProps.d.ts +12 -0
  64. package/dist/components/MonthPicker/MonthPickerVisual/MonthSelector.d.ts +11 -0
  65. package/dist/components/MonthPicker/MonthPickerVisual/VisualPickerFooter.d.ts +6 -0
  66. package/dist/components/MonthPicker/MonthPickerVisual/VisualPickerHeader.d.ts +14 -0
  67. package/dist/components/MonthPicker/MonthPickerVisual/YearSelector.d.ts +14 -0
  68. package/dist/components/MonthPicker/MonthPickerVisual/useMonthGrid.d.ts +9 -0
  69. package/dist/components/MonthPicker/MonthPickerVisual/useYearGrid.d.ts +8 -0
  70. package/dist/components/MonthPicker/MonthPickerVisual/utils.d.ts +8 -0
  71. package/dist/components/MonthPicker/locales.d.ts +12 -0
  72. package/dist/components/MonthPicker/useMonthPickerValidation.d.ts +25 -0
  73. package/dist/components/NirField/NirField.d.ts +209 -271
  74. package/dist/components/NirField/locales.d.ts +10 -10
  75. package/dist/components/NirField/useNirValidation.d.ts +64 -0
  76. package/dist/components/NotificationBar/Notification/Notification.d.ts +3 -0
  77. package/dist/components/PasswordField/PasswordField.d.ts +9 -10
  78. package/dist/components/PeriodField/PeriodField.d.ts +1379 -1659
  79. package/dist/components/PhoneField/PhoneField.d.ts +90 -125
  80. package/dist/components/RangeField/RangeSlider/RangeSlider.d.ts +12 -12
  81. package/dist/components/SyBtnMenu/SyBtnMenu.d.ts +1 -1
  82. package/dist/components/SyHeading/SyHeading.a11y.test.d.ts +1 -0
  83. package/dist/components/SyHeading/SyHeading.d.ts +4 -2
  84. package/dist/components/SyHeading/SyHeading.test.d.ts +1 -0
  85. package/dist/components/SyTextArea/SyTextArea.d.ts +35 -15
  86. package/dist/components/SyTextArea/useDefaultValidationRules.d.ts +11 -0
  87. package/dist/components/Tables/SyServerTable/SyServerTable.d.ts +11 -8
  88. package/dist/components/Tables/SyTable/SyTable.d.ts +11 -8
  89. package/dist/components/Tables/common/SyTableFilter.d.ts +2 -3
  90. package/dist/components/Tables/common/SyTablePagination.d.ts +21 -23
  91. package/dist/components/Tables/common/filters/AutocompleteFilter.d.ts +120 -0
  92. package/dist/components/Tables/common/filters/locales.d.ts +0 -1
  93. package/dist/components/Tables/common/types.d.ts +19 -3
  94. package/dist/components/Tables/common/useClickableTableRow.d.ts +17 -0
  95. package/dist/components/Tables/common/usePagination.d.ts +3 -1
  96. package/dist/components/Tables/common/usePinnedColumns.d.ts +31 -0
  97. package/dist/components/Tables/common/useTableHeaders.d.ts +2 -0
  98. package/dist/components/Tables/common/useTableRowCheckboxAccessibility.d.ts +5 -0
  99. package/dist/components/UploadWorkflow/UploadWorkflow.d.ts +6 -6
  100. package/dist/components/index.d.ts +1 -0
  101. package/dist/composables/date/useDatePickerAccessibility.d.ts +1 -1
  102. package/dist/composables/rules/useFieldValidation.d.ts +4 -4
  103. package/dist/composables/unifyValidation/useCustomValidation.d.ts +8 -0
  104. package/dist/composables/unifyValidation/useValidation.d.ts +102 -0
  105. package/dist/composables/unifyValidation/useVuetifyValidation.d.ts +18 -0
  106. package/dist/composables/useFormFieldErrorHandling.d.ts +2 -2
  107. package/dist/composables/validation/useFormValidation.d.ts +11 -2
  108. package/dist/composables/validation/useValidation.d.ts +15 -9
  109. package/dist/design-system-v3.d.ts +2 -0
  110. package/dist/design-system-v3.js +196 -194
  111. package/dist/design-system-v3.umd.cjs +1 -1066
  112. package/dist/designTokens/tokens/cnam/cnamContextual.d.ts +5 -0
  113. package/dist/{main-CEl4J8_T.js → main-BtTqyn4z.js} +16983 -15576
  114. package/dist/main-C1e3eoxd.cjs +1067 -0
  115. package/dist/synapse.css +1 -0
  116. package/dist/tooth-11-D3sLWv2n.cjs +1 -0
  117. package/dist/tooth-12-CXrLuH03.cjs +1 -0
  118. package/dist/tooth-13-BSfo5fpT.cjs +1 -0
  119. package/dist/tooth-14-DMzulx0h.cjs +1 -0
  120. package/dist/tooth-15-BKRFVi-9.cjs +1 -0
  121. package/dist/tooth-16-CpuxAbuM.cjs +1 -0
  122. package/dist/tooth-17-BPoahUdg.cjs +1 -0
  123. package/dist/tooth-18-DhHJz8sy.cjs +1 -0
  124. package/dist/tooth-21-Dgd5hn_X.cjs +1 -0
  125. package/dist/tooth-22-C2Tn19sB.cjs +1 -0
  126. package/dist/tooth-23-C9uaaSGb.cjs +1 -0
  127. package/dist/tooth-24-BrK9UGpf.cjs +1 -0
  128. package/dist/tooth-25-CE_EfGNp.cjs +1 -0
  129. package/dist/tooth-26-Ctv4i9Fy.cjs +1 -0
  130. package/dist/tooth-27-C5J7JkWM.cjs +1 -0
  131. package/dist/tooth-28-Z9oWqjo0.cjs +1 -0
  132. package/dist/tooth-31-BrYqmkTi.cjs +1 -0
  133. package/dist/tooth-32-BNNR0oCZ.cjs +1 -0
  134. package/dist/tooth-33-DuxvqO2J.cjs +1 -0
  135. package/dist/tooth-34-BCSCXMB6.cjs +1 -0
  136. package/dist/tooth-35-BLUXkX88.cjs +1 -0
  137. package/dist/tooth-36-IrKHYqlA.cjs +1 -0
  138. package/dist/tooth-37-BYqpdMwo.cjs +1 -0
  139. package/dist/tooth-38-B_eNXXdu.cjs +1 -0
  140. package/dist/tooth-41-Ddva4Ot8.cjs +1 -0
  141. package/dist/tooth-42-szcDqlM0.cjs +1 -0
  142. package/dist/tooth-43-B3ka6rQm.cjs +1 -0
  143. package/dist/tooth-44-CazyQucj.cjs +1 -0
  144. package/dist/tooth-45-B4HQtc8n.cjs +1 -0
  145. package/dist/tooth-46-BPM40gbG.cjs +1 -0
  146. package/dist/tooth-47-Dvr20dlh.cjs +1 -0
  147. package/dist/tooth-48-Bd8ljGsF.cjs +1 -0
  148. package/dist/tooth-51-OBpwCOF3.cjs +1 -0
  149. package/dist/tooth-52-aKxyHcmq.cjs +1 -0
  150. package/dist/tooth-53-vCwJjTOc.cjs +1 -0
  151. package/dist/tooth-54-DsWu2iFy.cjs +1 -0
  152. package/dist/tooth-55-BxC1X2Dn.cjs +1 -0
  153. package/dist/tooth-61-BbLvxMQi.cjs +1 -0
  154. package/dist/tooth-62-CmTkWczP.cjs +1 -0
  155. package/dist/tooth-63-DI7l_2qI.cjs +1 -0
  156. package/dist/tooth-64-B21sOsJh.cjs +1 -0
  157. package/dist/tooth-65-D2ZC2VEr.cjs +1 -0
  158. package/dist/tooth-71-D473PPO5.cjs +1 -0
  159. package/dist/tooth-72-Drh1wnNu.cjs +1 -0
  160. package/dist/tooth-73-DzlwYI23.cjs +1 -0
  161. package/dist/tooth-74-8aGvcZPg.cjs +1 -0
  162. package/dist/tooth-75-BFK7At_r.cjs +1 -0
  163. package/dist/tooth-81-BZmR-I0M.cjs +1 -0
  164. package/dist/tooth-82-euVfUUZV.cjs +1 -0
  165. package/dist/tooth-83-KV010j64.cjs +1 -0
  166. package/dist/tooth-84-BBg1RjhZ.cjs +1 -0
  167. package/dist/tooth-85-Cr-kc1wM.cjs +1 -0
  168. package/dist/vuetifyConfig.js +561 -0
  169. package/dist/vuetifyConfig.umd.cjs +1 -0
  170. package/package.json +18 -6
  171. package/src/assets/apTokens.scss +2 -2
  172. package/src/assets/overrides/_btns.scss +2 -0
  173. package/src/assets/overrides/_forms.scss +9 -0
  174. package/src/assets/overrides/_icons.scss +41 -4
  175. package/src/assets/overrides/_tables.scss +19 -0
  176. package/src/assets/overrides/_typography.scss +0 -10
  177. package/src/components/Accordion/Accordion.mdx +23 -9
  178. package/src/components/Accordion/Accordion.stories.ts +153 -3
  179. package/src/components/Accordion/Accordion.vue +7 -6
  180. package/src/components/Accordion/composables/__tests__/useAccordionState.spec.ts +40 -12
  181. package/src/components/Accordion/composables/useAccordionState.ts +3 -4
  182. package/src/components/Accordion/tests/accordion.spec.ts +131 -19
  183. package/src/components/Amelipro/AmeliproAutoCompleteField/__tests__/__snapshots__/AmeliproAutoCompleteField.spec.ts.snap +2 -2
  184. package/src/components/Amelipro/AmeliproHeader/AmeliproHeaderBar/AmeliproHeaderBrandSection/__tests__/__snapshots__/AmeliproHeaderBrandSection.spec.ts.snap +1 -1
  185. package/src/components/Amelipro/AmeliproPagination/AmeliproPagination.mdx +3 -1
  186. package/src/components/Amelipro/AmeliproPagination/AmeliproPagination.stories.ts +8 -0
  187. package/src/components/Amelipro/AmeliproTextArea/__tests__/__snapshots__/AmeliproTextArea.spec.ts.snap +2 -2
  188. package/src/components/BackBtn/accessibilite/Accessibility.mdx +62 -10
  189. package/src/components/BackToTopBtn/BackToTopBtn.stories.ts +9 -3
  190. package/src/components/BackToTopBtn/accessibilite/Accessibility.mdx +86 -6
  191. package/src/components/Captcha/accessibilite/Accessibility.mdx +86 -8
  192. package/src/components/Captcha/tests/Captcha.spec.ts +0 -29
  193. package/src/components/Captcha/tests/__snapshots__/Captcha.spec.ts.snap +14 -122
  194. package/src/components/ChipList/ChipList.stories.ts +0 -15
  195. package/src/components/ChipList/ChipList.vue +5 -1
  196. package/src/components/ChipList/accessibilite/Accessibility.mdx +83 -10
  197. package/src/components/ChipList/tests/ChipList.a11y.spec.ts +41 -0
  198. package/src/components/Customs/Selects/SelectBtnField/accessibilite/Accessibility.mdx +124 -10
  199. package/src/components/Customs/Selects/SyAutocomplete/SyAutocomplete.stories.ts +379 -93
  200. package/src/components/Customs/Selects/SyAutocomplete/SyAutocomplete.vue +162 -84
  201. package/src/components/Customs/Selects/SyAutocomplete/accessibilite/Accessibilite.stories.ts +40 -1
  202. package/src/components/Customs/Selects/SyAutocomplete/accessibilite/Accessibility.mdx +7 -1
  203. package/src/components/Customs/Selects/SyAutocomplete/locales.ts +5 -0
  204. package/src/components/Customs/Selects/SyAutocomplete/tests/SyAutocomplete.a11y.spec.ts +96 -0
  205. package/src/components/Customs/Selects/SyAutocomplete/tests/SyAutocomplete.spec.ts +377 -9
  206. package/src/components/Customs/Selects/SyAutocomplete/utils/ariaManager.ts +27 -13
  207. package/src/components/Customs/Selects/SyAutocomplete/utils/useSelectionLogic.ts +9 -10
  208. package/src/components/Customs/Selects/SyInputSelect/SyInputSelect.stories.ts +4 -4
  209. package/src/components/Customs/Selects/SyInputSelect/SyInputSelect.vue +8 -9
  210. package/src/components/Customs/Selects/SyInputSelect/tests/SyInputSelect.spec.ts +10 -10
  211. package/src/components/Customs/Selects/SySelect/SySelect.vue +60 -14
  212. package/src/components/Customs/Selects/SySelect/locales.ts +1 -0
  213. package/src/components/Customs/Selects/SySelect/tests/SySelect.spec.ts +54 -0
  214. package/src/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.vue +6 -9
  215. package/src/components/Customs/SyCheckbox/SyCheckbox.stories.ts +10 -16
  216. package/src/components/Customs/SyCheckbox/SyCheckbox.vue +16 -11
  217. package/src/components/Customs/SyCheckbox/accessibilite/Accessibility.mdx +35 -0
  218. package/src/components/Customs/SyCheckbox/tests/SyCheckbox.a11y.spec.ts +134 -2
  219. package/src/components/Customs/SyForm/SyForm.stories.ts +31 -5
  220. package/src/components/Customs/SyIcon/SyIcon.vue +1 -1
  221. package/src/components/Customs/SyIcon/tests/SyIcon.a11y.spec.ts +20 -0
  222. package/src/components/Customs/SyIconButton/SyIconButton.mdx +46 -0
  223. package/src/components/Customs/SyIconButton/SyIconButton.stories.ts +184 -0
  224. package/src/components/Customs/SyIconButton/SyIconButton.vue +38 -0
  225. package/src/components/Customs/SyIconButton/accessibilite/Accessibility.mdx +64 -0
  226. package/src/components/Customs/SyIconButton/tests/SyIconButton.a11y.spec.ts +87 -0
  227. package/src/components/Customs/SyIconButton/tests/SyIconButton.spec.ts +152 -0
  228. package/src/components/Customs/SyIconButton/tests/__snapshots__/SyIconButton.spec.ts.snap +61 -0
  229. package/src/components/Customs/SyPagination/SyPagination.vue +5 -5
  230. package/src/components/Customs/SyRadioGroup/SyRadioGroup.vue +4 -7
  231. package/src/components/Customs/SyTextField/SyTextField.mdx +1 -1
  232. package/src/components/Customs/SyTextField/SyTextField.stories.ts +29 -27
  233. package/src/components/Customs/SyTextField/SyTextField.vue +174 -159
  234. package/src/components/Customs/SyTextField/accessibilite/Accessibility.mdx +67 -9
  235. package/src/components/Customs/SyTextField/tests/SyTextField.a11y.spec.ts +47 -0
  236. package/src/components/Customs/SyTextField/tests/SyTextField.spec.ts +155 -10
  237. package/src/components/DataList/accessibilite/Accessibility.mdx +79 -11
  238. package/src/components/DataListGroup/accessibilite/Accessibility.mdx +80 -11
  239. package/src/components/DatePicker/CalendarMode/DatePicker.stories.ts +62 -58
  240. package/src/components/DatePicker/CalendarMode/DatePicker.vue +330 -223
  241. package/src/components/DatePicker/CalendarMode/accessibilite/Accessibility.mdx +82 -0
  242. package/src/components/DatePicker/CalendarMode/tests/DatePicker.a11y.spec.ts +141 -0
  243. package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.stories.ts +2 -56
  244. package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.vue +195 -159
  245. package/src/components/DatePicker/ComplexDatePicker/accessibilite/Accessibility.mdx +76 -0
  246. package/src/components/DatePicker/ComplexDatePicker/tests/ComplexDatePicker.spec.ts +10 -10
  247. package/src/components/DatePicker/DatePickerValidationExample/CalendarMode.stories.ts +8 -8
  248. package/src/components/DatePicker/DatePickerValidationExample/ComplexDatePicker.stories.ts +106 -8
  249. package/src/components/DatePicker/DatePickerValidationExample/DateTextInput.stories.ts +12 -11
  250. package/src/components/DatePicker/DatePickerValidationExample/MultiMode.stories.ts +12 -12
  251. package/src/components/DatePicker/DateTextInput/DateRange.stories.ts +0 -12
  252. package/src/components/DatePicker/DateTextInput/DateTextInput.vue +63 -57
  253. package/src/components/DatePicker/DateTextInput/NoCalendar.stories.ts +3 -0
  254. package/src/components/DatePicker/DateTextInput/accessibilite/Accessibility.mdx +66 -0
  255. package/src/components/DatePicker/DateTextInput/tests/DateTextInput.spec.ts +52 -1
  256. package/src/components/DatePicker/composables/index.ts +1 -0
  257. package/src/components/DatePicker/composables/tests/useCalendarKeyboardNavigation.spec.ts +109 -65
  258. package/src/components/DatePicker/composables/tests/useDatePickerFocusTrap.spec.ts +138 -0
  259. package/src/components/DatePicker/composables/tests/useDateValidation.spec.ts +74 -18
  260. package/src/components/DatePicker/composables/tests/useInputBlurHandler.spec.ts +39 -0
  261. package/src/components/DatePicker/composables/tests/useManualDateValidation.spec.ts +91 -0
  262. package/src/components/DatePicker/composables/useCalendarKeyboardNavigation.ts +442 -36
  263. package/src/components/DatePicker/composables/useDatePickerFocusTrap.ts +92 -0
  264. package/src/components/DatePicker/composables/useDateTextField.ts +7 -6
  265. package/src/components/DatePicker/composables/useDateValidation.ts +36 -35
  266. package/src/components/DatePicker/composables/useInputBlurHandler.ts +3 -3
  267. package/src/components/DatePicker/composables/useManualDateValidation.ts +6 -2
  268. package/src/components/DiacriticPicker/accessibilite/Accessibility.mdx +76 -8
  269. package/src/components/DownloadBtn/tests/DownloadBtn.a11y.spec.ts +25 -0
  270. package/src/components/ErrorPage/ErrorPage.stories.ts +113 -19
  271. package/src/components/ErrorPage/ErrorPage.vue +17 -2
  272. package/src/components/ErrorPage/tests/ErrorPage.a11y.spec.ts +17 -0
  273. package/src/components/ErrorPage/tests/ErrorPage.spec.ts +21 -1
  274. package/src/components/ErrorPage/tests/__snapshots__/ErrorPage.spec.ts.snap +0 -1
  275. package/src/components/ExternalLinks/tests/ExternalLinks.a11y.spec.ts +23 -0
  276. package/src/components/FileList/FileList.stories.ts +51 -1
  277. package/src/components/FileList/UploadItem/UploadItem.vue +13 -6
  278. package/src/components/FileList/UploadItem/locales.ts +3 -12
  279. package/src/components/FileList/accessibilite/Accessibility.mdx +3 -0
  280. package/src/components/FileUpload/FileUpload.vue +2 -1
  281. package/src/components/FileUpload/FileUploadContent.vue +2 -1
  282. package/src/components/FileUpload/tests/FileUpload.spec.ts +47 -0
  283. package/src/components/FileUpload/validateFiles.ts +5 -2
  284. package/src/components/FranceConnectBtn/accessibilite/Accessibility.mdx +62 -9
  285. package/src/components/HeaderBar/HeaderBar.stories.ts +14 -2
  286. package/src/components/HeaderBar/HeaderBar.vue +2 -1
  287. package/src/components/HeaderBar/HeaderLogo/HeaderLogo.vue +2 -1
  288. package/src/components/HeaderNavigationBar/HeaderNavigationBar.vue +2 -1
  289. package/src/components/Logo/accessibilite/Accessibility.mdx +73 -11
  290. package/src/components/LogoBrandSection/accessibilite/Accessibility.mdx +85 -9
  291. package/src/components/LunarCalendar/accessibilite/Accessibility.mdx +74 -8
  292. package/src/components/LunarCalendar/tests/LunarCalendar.a11y.spec.ts +163 -0
  293. package/src/components/LunarCalendar/tests/LunarCalendar.spec.ts +3 -1
  294. package/src/components/LunarCalendar/useLunarCalendarValidation.ts +4 -5
  295. package/src/components/MaintenancePage/MaintenancePage.vue +1 -1
  296. package/src/components/MaintenancePage/tests/MaintenancePage.spec.ts +4 -5
  297. package/src/components/MaintenancePage/tests/__snapshots__/MaintenancePage.spec.ts.snap +0 -1
  298. package/src/components/MonthPicker/MonthPicker.mdx +35 -0
  299. package/src/components/MonthPicker/MonthPicker.stories.ts +527 -0
  300. package/src/components/MonthPicker/MonthPicker.vue +79 -0
  301. package/src/components/MonthPicker/MonthPickerText/MonthPickerInput.vue +89 -0
  302. package/src/components/MonthPicker/MonthPickerText/useTextField.ts +27 -0
  303. package/src/components/MonthPicker/MonthPickerVisual/MonthPickerVisual.vue +154 -0
  304. package/src/components/MonthPicker/MonthPickerVisual/MonthPickerVisualProps.ts +13 -0
  305. package/src/components/MonthPicker/MonthPickerVisual/MonthSelector.vue +137 -0
  306. package/src/components/MonthPicker/MonthPickerVisual/VisualPickerFooter.vue +60 -0
  307. package/src/components/MonthPicker/MonthPickerVisual/VisualPickerHeader.vue +149 -0
  308. package/src/components/MonthPicker/MonthPickerVisual/YearSelector.vue +143 -0
  309. package/src/components/MonthPicker/MonthPickerVisual/useMonthGrid.ts +45 -0
  310. package/src/components/MonthPicker/MonthPickerVisual/useYearGrid.ts +45 -0
  311. package/src/components/MonthPicker/MonthPickerVisual/utils.ts +17 -0
  312. package/src/components/MonthPicker/accessibilite/Accessibility.mdx +59 -0
  313. package/src/components/MonthPicker/locales.ts +12 -0
  314. package/src/components/MonthPicker/tests/MonthPicker.a11y.spec.ts +71 -0
  315. package/src/components/MonthPicker/tests/MonthPicker.spec.ts +1249 -0
  316. package/src/components/MonthPicker/tests/__snapshots__/MonthPicker.spec.ts.snap +2545 -0
  317. package/src/components/MonthPicker/useMonthPickerValidation.ts +30 -0
  318. package/src/components/NirField/NirField.mdx +1 -2
  319. package/src/components/NirField/NirField.stories.ts +70 -6
  320. package/src/components/NirField/NirField.vue +64 -260
  321. package/src/components/NirField/accessibilite/Accessibility.mdx +2 -2
  322. package/src/components/NirField/locales.ts +1 -1
  323. package/src/components/NirField/tests/NirField.spec.ts +6 -0
  324. package/src/components/NirField/useNirValidation.ts +271 -0
  325. package/src/components/NotFoundPage/tests/NotFoundPage.spec.ts +2 -3
  326. package/src/components/NotFoundPage/tests/__snapshots__/NotFoundPage.spec.ts.snap +22 -14
  327. package/src/components/NotificationBar/Notification/Notification.vue +3 -1
  328. package/src/components/NotificationBar/NotificationBar.stories.ts +154 -0
  329. package/src/components/NotificationBar/tests/NotificationBar.a11y.spec.ts +26 -0
  330. package/src/components/NotificationBar/tests/NotificationBar.spec.ts +60 -0
  331. package/src/components/PasswordField/PasswordField.stories.ts +4 -4
  332. package/src/components/PasswordField/PasswordField.vue +18 -24
  333. package/src/components/PasswordField/tests/PasswordField.spec.ts +6 -3
  334. package/src/components/PeriodField/PeriodField.stories.ts +4 -4
  335. package/src/components/PeriodField/PeriodField.vue +57 -57
  336. package/src/components/PeriodField/__tests__/PeriodField.async.spec.ts +32 -0
  337. package/src/components/PeriodField/accessibilite/Accessibility.mdx +68 -8
  338. package/src/components/PeriodField/tests/PeriodField.spec.ts +28 -2
  339. package/src/components/PhoneField/PhoneField.vue +5 -6
  340. package/src/components/PhoneField/tests/PhoneField.spec.ts +1 -0
  341. package/src/components/RangeField/RangeField.vue +6 -0
  342. package/src/components/RangeField/accessibilite/Accessibility.mdx +79 -11
  343. package/src/components/SkipLink/tests/SkipLink.a11y.spec.ts +23 -0
  344. package/src/components/StatusPage/StatusPage.stories.ts +118 -0
  345. package/src/components/StatusPage/StatusPage.vue +5 -3
  346. package/src/components/StatusPage/tests/StatusPage.a11y.spec.ts +22 -0
  347. package/src/components/StatusPage/tests/StatusPage.spec.ts +22 -0
  348. package/src/components/StatusPage/tests/__snapshots__/StatusPage.spec.ts.snap +22 -14
  349. package/src/components/SubHeader/tests/SubHeader.a11y.spec.ts +20 -0
  350. package/src/components/SyAlert/SyAlert.vue +1 -0
  351. package/src/components/SyAlert/accessibilite/Accessibility.mdx +79 -9
  352. package/src/components/SyAlert/tests/SyAlert.a11y.spec.ts +23 -0
  353. package/src/components/SyHeading/SyHeading.a11y.test.ts +149 -0
  354. package/src/components/SyHeading/SyHeading.test.ts +115 -0
  355. package/src/components/SyHeading/SyHeading.vue +5 -3
  356. package/src/components/SyTextArea/SyTextArea.stories.ts +138 -2
  357. package/src/components/SyTextArea/SyTextArea.vue +53 -23
  358. package/src/components/SyTextArea/accessibilite/Accessibility.mdx +80 -8
  359. package/src/components/SyTextArea/tests/SyTextArea.a11y.spec.ts +151 -0
  360. package/src/components/SyTextArea/tests/SyTextArea.spec.ts +126 -3
  361. package/src/components/SyTextArea/useDefaultValidationRules.ts +74 -0
  362. package/src/components/Tables/SyServerTable/SyServerTable.mdx +25 -0
  363. package/src/components/Tables/SyServerTable/SyServerTable.stories.ts +673 -1
  364. package/src/components/Tables/SyServerTable/SyServerTable.vue +148 -91
  365. package/src/components/Tables/SyServerTable/tests/SyServerTable.a11y.spec.ts +58 -0
  366. package/src/components/Tables/SyServerTable/tests/SyServerTable.spec.ts +122 -0
  367. package/src/components/Tables/SyTable/SyTable.mdx +25 -0
  368. package/src/components/Tables/SyTable/SyTable.stories.ts +452 -1
  369. package/src/components/Tables/SyTable/SyTable.vue +130 -56
  370. package/src/components/Tables/SyTable/tests/SyTable.a11y.spec.ts +57 -0
  371. package/src/components/Tables/SyTable/tests/SyTable.spec.ts +108 -0
  372. package/src/components/Tables/common/SyTableFilter.vue +22 -2
  373. package/src/components/Tables/common/TableHeader.vue +5 -1
  374. package/src/components/Tables/common/filters/AutocompleteFilter.vue +160 -0
  375. package/src/components/Tables/common/filters/NumberFilter.vue +1 -1
  376. package/src/components/Tables/common/filters/SelectFilter.vue +10 -11
  377. package/src/components/Tables/common/filters/TextFilter.vue +1 -1
  378. package/src/components/Tables/common/filters/getFilterComponent.ts +8 -1
  379. package/src/components/Tables/common/filters/locales.ts +0 -1
  380. package/src/components/Tables/common/filters/tests/AutocompleteFilter.a11y.spec.ts +110 -0
  381. package/src/components/Tables/common/filters/tests/AutocompleteFilter.spec.ts +203 -0
  382. package/src/components/Tables/common/filters/tests/SelectFilter.a11y.spec.ts +104 -0
  383. package/src/components/Tables/common/filters/tests/SelectFilter.spec.ts +152 -16
  384. package/src/components/Tables/common/tableFilterUtils.ts +3 -0
  385. package/src/components/Tables/common/tableStyles.scss +48 -4
  386. package/src/components/Tables/common/tests/filterByRange.spec.ts +2 -1
  387. package/src/components/Tables/common/types.ts +13 -4
  388. package/src/components/Tables/common/useClickableTableRow.ts +103 -0
  389. package/src/components/Tables/common/usePagination.ts +13 -0
  390. package/src/components/Tables/common/usePinnedColumns.ts +237 -0
  391. package/src/components/Tables/common/useTableHeaders.ts +3 -3
  392. package/src/components/Tables/common/useTableRowCheckboxAccessibility.ts +41 -0
  393. package/src/components/ToolbarContainer/tests/ToolbarContainer.a11y.spec.ts +126 -0
  394. package/src/components/UploadWorkflow/tests/__snapshots__/UploadWorkflow.spec.ts.snap +2 -2
  395. package/src/components/index.ts +1 -0
  396. package/src/composables/date/tests/useDatePickerAccessibility.spec.ts +2 -6
  397. package/src/composables/date/useDatePickerAccessibility.ts +42 -207
  398. package/src/composables/rules/tests/useFieldValidation.spec.ts +120 -120
  399. package/src/composables/rules/useFieldValidation.ts +34 -17
  400. package/src/composables/unifyValidation/tests/useCustomValidation.spec.ts +601 -0
  401. package/src/composables/unifyValidation/tests/useValidation.spec.ts +2048 -0
  402. package/src/composables/unifyValidation/tests/useVuetifyValidation.spec.ts +184 -0
  403. package/src/composables/unifyValidation/useCustomValidation.ts +95 -0
  404. package/src/composables/unifyValidation/useValidation.ts +190 -0
  405. package/src/composables/unifyValidation/useVuetifyValidation.ts +54 -0
  406. package/src/composables/useFormFieldErrorHandling.ts +15 -9
  407. package/src/composables/validation/tests/useFormValidation.spec.ts +14 -0
  408. package/src/composables/validation/tests/useValidation.spec.ts +116 -21
  409. package/src/composables/validation/useFormValidation.ts +20 -13
  410. package/src/composables/validation/useValidatable.ts +8 -1
  411. package/src/composables/validation/useValidation.ts +135 -99
  412. package/src/composantsVuetify/Introduction.mdx +48 -0
  413. package/src/composantsVuetify/VBtn/VBtn.mdx +72 -0
  414. package/src/composantsVuetify/VBtn/v-btn.stories.ts +121 -0
  415. package/src/composantsVuetify/VTooltip/VTooltip.mdx +32 -0
  416. package/src/composantsVuetify/VTooltip/v-tooltip.stories.ts +95 -0
  417. package/src/designTokens/tokens/cnam/cnamContextual.ts +6 -1
  418. package/src/designTokens/tokens/cnam/cnamSemantic.ts +2 -2
  419. package/src/stories/Components/Components.stories.ts +74 -9
  420. package/src/stories/Demarrer/Accueil.stories.ts +3 -3
  421. package/src/stories/GuideDuDev/Amelipro.mdx +15 -0
  422. package/src/stories/GuideDuDev/Amelipro.stories.ts +209 -0
  423. package/src/stories/GuideDuDev/vuetifyOptions.mdx +3 -3
  424. package/dist/SelectFilter-BOYlF7rX.js +0 -136
  425. package/dist/style.css +0 -1
  426. package/src/components/DatePicker/Accessibilite.mdx +0 -14
@@ -29,7 +29,7 @@ export const useDateValidation = (options: {
29
29
  // Fonctions de validation
30
30
  clearValidation: () => void
31
31
  // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Règles personnalisées
32
- validateField: (value: any, rules?: any[], warningRules?: any[]) => ValidationResult
32
+ validateField: (value: any, rules?: any[], warningRules?: any[]) => ValidationResult | Promise<ValidationResult>
33
33
 
34
34
  // Références aux messages
35
35
  errors: Ref<string[]>
@@ -60,7 +60,7 @@ export const useDateValidation = (options: {
60
60
  * @param forceValidation - Force la validation même si isUpdatingFromInternal est vrai
61
61
  * @returns Résultat de la validation
62
62
  */
63
- const validateDates = (forceValidation = false): ValidationResult => {
63
+ const validateDates = (forceValidation = false): ValidationResult | Promise<ValidationResult> => {
64
64
  const currentCustomRules = unref(customRules)
65
65
  const currentCustomWarningRules = unref(customWarningRules)
66
66
 
@@ -152,64 +152,65 @@ export const useDateValidation = (options: {
152
152
  ? selectedDates.value.filter(Boolean) // Filtrer les valeurs null
153
153
  : [selectedDates.value]
154
154
 
155
- let isValid = true
156
-
157
- // Valider chaque date
158
- if (shouldDisplayErrors) {
159
- datesToValidate.forEach((date) => {
160
- if (!date) return // Ignorer les dates null
161
-
162
- const result = validateField(
163
- date,
164
- currentCustomRules,
165
- currentCustomWarningRules,
166
- )
167
- if (result.hasError) {
168
- isValid = false
169
- }
170
- })
155
+ const finalizeValidation = (isValid: boolean): ValidationResult => {
156
+ let finalIsValid = isValid
171
157
 
172
158
  // Vérifier la validité de la plage de dates si en mode plage
173
159
  if (displayRange && Array.isArray(selectedDates.value) && selectedDates.value.length >= 2) {
174
- // Récupérer les dates de début et de fin
175
160
  const startDate = selectedDates.value[0]
176
161
  const endDate = selectedDates.value[selectedDates.value.length - 1]
177
162
 
178
- // Vérifier si les deux dates sont présentes et si la plage est valide
179
163
  if (startDate && endDate && startDate.getTime() > endDate.getTime()) {
180
- // La date de fin est antérieure à la date de début
181
164
  const rangeError = DATE_PICKER_MESSAGES.ERROR_END_BEFORE_START
182
165
  if (!errors.value.includes(rangeError)) {
183
166
  errors.value.push(rangeError)
184
- isValid = false
167
+ finalIsValid = false
185
168
  }
186
169
  }
187
- // Utiliser également la validation du composable useDateRangeValidation
188
170
  else if (!currentRangeIsValid.value) {
189
171
  const rangeError = getRangeValidationError.value
190
172
  if (rangeError && !errors.value.includes(rangeError)) {
191
173
  errors.value.push(rangeError)
192
- isValid = false
174
+ finalIsValid = false
193
175
  }
194
176
  }
195
177
  }
196
178
 
197
- // Dédoublonner les messages (au cas où plusieurs dates auraient les mêmes messages)
198
179
  errors.value = [...new Set(errors.value)]
199
180
  warnings.value = [...new Set(warnings.value)]
200
181
  successes.value = [...new Set(successes.value)]
182
+
183
+ return {
184
+ hasError: !finalIsValid,
185
+ hasWarning: warnings.value.length > 0,
186
+ hasSuccess: successes.value.length > 0 && finalIsValid && warnings.value.length === 0,
187
+ state: {
188
+ errors: errors.value,
189
+ warnings: warnings.value,
190
+ successes: successes.value,
191
+ },
192
+ }
201
193
  }
202
194
 
203
- return {
204
- hasError: !isValid,
205
- hasWarning: warnings.value.length > 0,
206
- hasSuccess: successes.value.length > 0 && isValid && warnings.value.length === 0,
207
- state: {
208
- errors: errors.value,
209
- warnings: warnings.value,
210
- successes: successes.value,
211
- },
195
+ if (!shouldDisplayErrors) {
196
+ return finalizeValidation(true)
212
197
  }
198
+
199
+ const validationResults = datesToValidate
200
+ .filter(Boolean)
201
+ .map(date => validateField(date, currentCustomRules, currentCustomWarningRules))
202
+
203
+ if (validationResults.some(result => result instanceof Promise)) {
204
+ return Promise
205
+ .all(validationResults.map(result => Promise.resolve(result)))
206
+ .then((resolvedResults) => {
207
+ const hasError = resolvedResults.some(result => result.hasError)
208
+ return finalizeValidation(!hasError)
209
+ })
210
+ }
211
+
212
+ const hasError = (validationResults as ValidationResult[]).some(result => result.hasError)
213
+ return finalizeValidation(!hasError)
213
214
  }
214
215
 
215
216
  /**
@@ -217,7 +218,7 @@ export const useDateValidation = (options: {
217
218
  *
218
219
  * @returns Résultat de la validation
219
220
  */
220
- const validateOnSubmit = (): ValidationResult => {
221
+ const validateOnSubmit = (): ValidationResult | Promise<ValidationResult> => {
221
222
  return validateDates(true)
222
223
  }
223
224
 
@@ -28,7 +28,7 @@ export const useInputBlurHandler = (options: {
28
28
  parseDate: (dateStr: string, format: string) => Date | null
29
29
  formatDate: (date: Date, format: string) => string
30
30
  updateModel: (value: DateValue) => void
31
- validateManualInput: (value: string) => boolean
31
+ validateManualInput: (value: string) => boolean | Promise<boolean>
32
32
 
33
33
  // Émetteurs d'événements
34
34
  emitBlur: () => void
@@ -54,7 +54,7 @@ export const useInputBlurHandler = (options: {
54
54
  /**
55
55
  * Gère la perte de focus du champ de saisie de date
56
56
  */
57
- const handleInputBlur = () => {
57
+ const handleInputBlur = async () => {
58
58
  // Émettre l'événement blur
59
59
  emitBlur()
60
60
 
@@ -155,7 +155,7 @@ export const useInputBlurHandler = (options: {
155
155
  // Note: La vérification du type string a déjà été faite plus haut
156
156
  // et on retourne si ce n'est pas une chaîne, donc ici displayFormattedDate.value est forcément une chaîne
157
157
  if (displayFormattedDate.value) {
158
- validateManualInput(displayFormattedDate.value || '')
158
+ await Promise.resolve(validateManualInput(displayFormattedDate.value || ''))
159
159
  }
160
160
  }
161
161
 
@@ -31,7 +31,7 @@ export const useManualDateValidation = (options: {
31
31
  validateDateFormat: (dateStr: string) => { isValid: boolean, message: string }
32
32
  isDateComplete: (value: string) => boolean
33
33
  parseDate: (dateStr: string, format: string) => Date | null
34
- validateField: (value: unknown, rules?: CustomRule[], warningRules?: CustomRule[]) => ValidationResult
34
+ validateField: (value: unknown, rules?: CustomRule[], warningRules?: CustomRule[]) => ValidationResult | Promise<ValidationResult>
35
35
  }) => {
36
36
  const {
37
37
  format,
@@ -57,7 +57,7 @@ export const useManualDateValidation = (options: {
57
57
  * @param value - Chaîne de date à valider
58
58
  * @returns Booléen indiquant si la saisie est valide
59
59
  */
60
- const validateManualInput = (value: string): boolean => {
60
+ const validateManualInput = (value: string): boolean | Promise<boolean> => {
61
61
  // Réinitialiser la validation
62
62
  clearValidation()
63
63
 
@@ -129,6 +129,10 @@ export const useManualDateValidation = (options: {
129
129
  safeWarningRules,
130
130
  )
131
131
 
132
+ if (result instanceof Promise) {
133
+ return result.then(resolvedResult => !resolvedResult.hasError)
134
+ }
135
+
132
136
  return !result.hasError
133
137
  }
134
138
 
@@ -1,10 +1,78 @@
1
- import { Meta, Story } from '@storybook/addon-docs';
2
- import * as DiacriticPicker from '../DiacriticPicker.stories';
3
- import '@/stories/styles/shared.css';
1
+ import { Meta, Story } from '@storybook/blocks';
2
+ import * as DiacriticPickerStories from '../DiacriticPicker.stories';
3
+ import AccessibilityIcon from '@/common/imgs/accessibility-svgrepo-com.svg';
4
+ import {
5
+ AccessibilityGuideLayout,
6
+ CriteriaSection,
7
+ CriteriaCard,
8
+ DemoSection,
9
+ BestPracticesSection,
10
+ ResourcesSection,
11
+ AuditSection,
12
+ } from '@/stories/accessibility/AccessibilityGuideLayout.mdx';
4
13
 
5
- <Meta of={DiacriticPicker} />
14
+ <Meta of={DiacriticPickerStories} />
6
15
 
7
- <div className="header">
8
- <h1>Accessibilité</h1>
9
- <p>Cette page sera bientôt disponible</p>
10
- </div>
16
+ <AccessibilityGuideLayout
17
+ componentName="DiacriticPicker"
18
+ iconSrc={AccessibilityIcon}
19
+ apgHref="https://www.w3.org/WAI/ARIA/apg/patterns/dialogmodal/"
20
+ >
21
+ <CriteriaSection>
22
+ <CriteriaCard icon="🔍" title="Structure sémantique et rôles ARIA">
23
+ <ul>
24
+ <li><strong>Bouton déclencheur</strong> : Utilise <code>aria-controls</code> et <code>aria-haspopup="dialog"</code> pour indiquer la relation avec le dialogue.</li>
25
+ <li><strong>État du dialogue</strong> : <code>aria-expanded</code> reflète l'état d'ouverture/fermeture du dialogue.</li>
26
+ <li><strong>Rôle du dialogue</strong> : <code>role="dialog"</code> et <code>aria-modal="true"</code> sur le VDialog.</li>
27
+ <li><strong>Labellisation</strong> : <code>aria-labelledby</code> lie le dialogue au bouton déclencheur.</li>
28
+ <li><strong>Groupes de caractères</strong> : Utilisation de <code>role="group"</code> avec <code>aria-label</code> pour organiser les caractères minuscules et majuscules.</li>
29
+ </ul>
30
+ </CriteriaCard>
31
+
32
+ <CriteriaCard icon="⌨️" title="Navigation clavier et focus">
33
+ <ul>
34
+ <li><strong>Gestion du focus</strong> : Le focus retourne automatiquement au champ après insertion d'un caractère.</li>
35
+ <li><strong>Position du curseur</strong> : Maintien et restauration précise de la position du curseur après insertion.</li>
36
+ <li><strong>Focus trap</strong> : <code>retain-focus="false"</code> sur le VDialog.</li>
37
+ </ul>
38
+ </CriteriaCard>
39
+
40
+ <CriteriaCard icon="🎨" title="Styles et contrastes">
41
+ <ul>
42
+ <li><strong>Dialogue</strong> : Fond <code>grey-lighten-2</code> sur le VCard.</li>
43
+ <li><strong>Boutons du dialogue</strong> : Taille "small" avec classe <code>ma-1</code>.</li>
44
+ </ul>
45
+ </CriteriaCard>
46
+
47
+ <CriteriaCard icon="🔧" title="Accessibilité du champ associé">
48
+ <ul>
49
+ <li><strong>Labellisation automatique</strong> : Ajout de <code>aria-label</code> si le champ n'a ni <code>aria-label</code> ni <code>aria-labelledby</code>.</li>
50
+ <li><strong>Détection du champ</strong> : Recherche automatique des inputs/textarea dans le slot via <code>getNativeInput()</code>.</li>
51
+ <li><strong>Wrapper</strong> : Conteneur avec <code>role="textbox"</code> et <code>tabindex="0"</code>.</li>
52
+ </ul>
53
+ </CriteriaCard>
54
+ </CriteriaSection>
55
+
56
+ <DemoSection componentName="DiacriticPicker">
57
+ <Story of={DiacriticPickerStories.Default} />
58
+ </DemoSection>
59
+
60
+ <BestPracticesSection>
61
+ <ul>
62
+ <li>Fournissez un <code>inputAriaLabel</code> descriptif si le champ n'a pas de label visible.</li>
63
+ <li>Personnalisez <code>btnTitle</code> pour refléter les caractères utilisés.</li>
64
+ <li>Adaptez la liste des <code>diacritics</code> selon les besoins linguistiques.</li>
65
+ <li>Vérifiez que les caractères affichés dans <code>btnTitle</code> sont inclus dans la liste <code>diacritics</code>.</li>
66
+ </ul>
67
+ </BestPracticesSection>
68
+
69
+ <ResourcesSection>
70
+ <ul>
71
+ <li><a href="https://www.w3.org/WAI/ARIA/apg/patterns/dialogmodal/" target="_blank" rel="noopener noreferrer">Guide des pratiques WAI-ARIA : Dialogues modaux</a></li>
72
+ <li><a href="https://www.w3.org/WAI/WCAG21/Understanding/keyboard-operation.html" target="_blank" rel="noopener noreferrer">WCAG : Opération au clavier</a></li>
73
+ <li><a href="https://accessibilite.numerique.gouv.fr/methode/criteres-et-tests/#7.1" target="_blank" rel="noopener noreferrer">RGAA : Consultation par navigation clavier</a></li>
74
+ <li><a href="https://accessibilite.numerique.gouv.fr/methode/criteres-et-tests/#11.9" target="_blank" rel="noopener noreferrer">RGAA : Structuration de l'information</a></li>
75
+ <li><a href="https://www.w3.org/WAI/ARIA/apg/patterns/button/" target="_blank" rel="noopener noreferrer">Guide des pratiques WAI-ARIA : Boutons</a></li>
76
+ </ul>
77
+ </ResourcesSection>
78
+ </AccessibilityGuideLayout>
@@ -0,0 +1,25 @@
1
+ // @vitest-environment jsdom
2
+
3
+ import { describe, it } from 'vitest'
4
+ import { mount } from '@vue/test-utils'
5
+ import { axe } from 'vitest-axe'
6
+ import { assertNoA11yViolations } from '@tests/unit/accessibility/axeUtils'
7
+ import DownloadBtn from '../DownloadBtn.vue'
8
+
9
+ describe('DownloadBtn – accessibility (axe)', () => {
10
+ it('has no obvious axe violations', async () => {
11
+ const wrapper = mount(DownloadBtn, {
12
+ props: {
13
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- deso
14
+ filePromise: () => Promise.resolve({ data: new Blob(), status: 200, statusText: 'OK', headers: {}, config: {} as any }),
15
+ fallbackFilename: 'file.pdf',
16
+ },
17
+ slots: {
18
+ default: 'Télécharger',
19
+ },
20
+ })
21
+
22
+ const results = await axe(wrapper.element as HTMLElement)
23
+ assertNoA11yViolations(results, 'DownloadBtn – default state')
24
+ })
25
+ })
@@ -75,12 +75,53 @@ export const WithLink: Story = {
75
75
  },
76
76
  }
77
77
 
78
- export const WithRole: Story = {
79
- args: {
80
- ...Default.args,
81
- role: 'region',
82
- uniqueId: 'error-page-region',
78
+ export const CustomIllustration: Story = {
79
+ decorators: [
80
+ () => ({ template: '<div style="padding: 20px; background: rgb(231, 236, 245)"><story /></div>' }),
81
+ ],
82
+ parameters: {
83
+ sourceCode: [
84
+ {
85
+ name: 'Template',
86
+ code: `
87
+ <template>
88
+ <div style="padding: 20px; background: rgb(231, 236, 245)">
89
+ <ErrorPage>
90
+ <template #illustration>
91
+ <div style="width: 260px; height: 200px; display: grid; place-items: center; border-radius: 12px; background: white; border: 2px dashed #0D419A;">
92
+ <span style="font-weight: 700; color: #0D419A;">Illustration</span>
93
+ </div>
94
+ </template>
95
+ </ErrorPage>
96
+ </div>
97
+ </template>
98
+ `,
99
+ },
100
+ {
101
+ name: 'Script',
102
+ code: `
103
+ <script setup lang="ts">
104
+ import { ErrorPage } from '@cnamts/synapse'
105
+ </script>
106
+ `,
107
+ },
108
+ ],
83
109
  },
110
+ render: () => ({
111
+ components: { ErrorPage },
112
+ template: `
113
+ <ErrorPage>
114
+ <template #illustration>
115
+ <div style="width: 260px; height: 200px; display: grid; place-items: center; border-radius: 12px; background: white; border: 2px dashed #0D419A;">
116
+ <span style="font-weight: 700; color: #0D419A;">Illustration</span>
117
+ </div>
118
+ </template>
119
+ </ErrorPage>
120
+ `,
121
+ }),
122
+ }
123
+
124
+ export const SlotAction: Story = {
84
125
  decorators: [
85
126
  () => ({ template: '<div style="padding: 20px; background: rgb(231, 236, 245)"><story /></div>' }),
86
127
  ],
@@ -91,14 +132,19 @@ export const WithRole: Story = {
91
132
  code: `
92
133
  <template>
93
134
  <div style="padding: 20px; background: rgb(231, 236, 245)">
94
- <ErrorPage
95
- role="region"
96
- unique-id="error-page-region"
97
- />
135
+ <ErrorPage :hide-btn="true">
136
+ <template #action>
137
+ <div style="display: flex; gap: 8px; margin-top: 16px;">
138
+ <VBtn href="/" color="primary">Retour à l'accueil</VBtn>
139
+ <VBtn variant="outlined" color="primary">Déconnexion</VBtn>
140
+ </div>
141
+ </template>
142
+ </ErrorPage>
98
143
  </div>
99
144
  </template>
100
145
  `,
101
- }, {
146
+ },
147
+ {
102
148
  name: 'Script',
103
149
  code: `
104
150
  <script setup lang="ts">
@@ -108,9 +154,22 @@ export const WithRole: Story = {
108
154
  },
109
155
  ],
110
156
  },
157
+ render: () => ({
158
+ components: { ErrorPage },
159
+ template: `
160
+ <ErrorPage :hide-btn="true">
161
+ <template #action>
162
+ <div style="display: flex; gap: 8px; margin-top: 16px;">
163
+ <VBtn href="/" color="primary">Retour à l'accueil</VBtn>
164
+ <VBtn variant="outlined" color="primary">Déconnexion</VBtn>
165
+ </div>
166
+ </template>
167
+ </ErrorPage>
168
+ `,
169
+ }),
111
170
  }
112
171
 
113
- export const CustomIllustration: Story = {
172
+ export const SlotAdditionalContent: Story = {
114
173
  decorators: [
115
174
  () => ({ template: '<div style="padding: 20px; background: rgb(231, 236, 245)"><story /></div>' }),
116
175
  ],
@@ -122,10 +181,10 @@ export const CustomIllustration: Story = {
122
181
  <template>
123
182
  <div style="padding: 20px; background: rgb(231, 236, 245)">
124
183
  <ErrorPage>
125
- <template #illustration>
126
- <div style="width: 260px; height: 200px; display: grid; place-items: center; border-radius: 12px; background: white; border: 2px dashed #0D419A;">
127
- <span style="font-weight: 700; color: #0D419A;">Illustration</span>
128
- </div>
184
+ <template #additional-content>
185
+ <p style="text-align: center; color: #555;">
186
+ Si le problème persiste, veuillez contacter le support technique.
187
+ </p>
129
188
  </template>
130
189
  </ErrorPage>
131
190
  </div>
@@ -146,12 +205,47 @@ export const CustomIllustration: Story = {
146
205
  components: { ErrorPage },
147
206
  template: `
148
207
  <ErrorPage>
149
- <template #illustration>
150
- <div style="width: 260px; height: 200px; display: grid; place-items: center; border-radius: 12px; background: white; border: 2px dashed #0D419A;">
151
- <span style="font-weight: 700; color: #0D419A;">Illustration</span>
152
- </div>
208
+ <template #additional-content>
209
+ <p style="text-align: center; color: #555;">
210
+ Si le problème persiste, veuillez contacter le support technique.
211
+ </p>
153
212
  </template>
154
213
  </ErrorPage>
155
214
  `,
156
215
  }),
157
216
  }
217
+
218
+ export const WithRole: Story = {
219
+ args: {
220
+ ...Default.args,
221
+ role: 'region',
222
+ uniqueId: 'error-page-region',
223
+ },
224
+ decorators: [
225
+ () => ({ template: '<div style="padding: 20px; background: rgb(231, 236, 245)"><story /></div>' }),
226
+ ],
227
+ parameters: {
228
+ sourceCode: [
229
+ {
230
+ name: 'Template',
231
+ code: `
232
+ <template>
233
+ <div style="padding: 20px; background: rgb(231, 236, 245)">
234
+ <ErrorPage
235
+ role="region"
236
+ unique-id="error-page-region"
237
+ />
238
+ </div>
239
+ </template>
240
+ `,
241
+ }, {
242
+ name: 'Script',
243
+ code: `
244
+ <script setup lang="ts">
245
+ import { ErrorPage } from '@cnamts/synapse'
246
+ </script>
247
+ `,
248
+ },
249
+ ],
250
+ },
251
+ }
@@ -15,7 +15,7 @@
15
15
  btnHref?: string
16
16
  btnLink?: RouteRecordRaw | string
17
17
  hideBtn?: boolean
18
- headingLevel: 1 | 2 | 3 | 4 | 5 | 6
18
+ headingLevel?: 1 | 2 | 3 | 4 | 5 | 6
19
19
  uniqueId?: string
20
20
  role?: PageAriaRole
21
21
  }>()
@@ -39,7 +39,8 @@
39
39
  :btn-href="props.btnHref"
40
40
  :btn-link="props.btnLink"
41
41
  :hide-btn="props.hideBtn"
42
- :unique-id="props.uniqueId"
42
+ :unique-id="props.uniqueId ?? undefined"
43
+ :heading-level="props.headingLevel"
43
44
  :role="props.role"
44
45
  >
45
46
  <template
@@ -55,6 +56,20 @@
55
56
  >
56
57
  </slot>
57
58
  </template>
59
+
60
+ <template
61
+ v-if="$slots.action"
62
+ #action
63
+ >
64
+ <slot name="action" />
65
+ </template>
66
+
67
+ <template
68
+ v-if="$slots['additional-content']"
69
+ #additional-content
70
+ >
71
+ <slot name="additional-content" />
72
+ </template>
58
73
  </StatusPage>
59
74
  </template>
60
75
 
@@ -18,4 +18,21 @@ describe('ErrorPage – accessibility (axe)', () => {
18
18
  ignoreRules: ['region'],
19
19
  })
20
20
  })
21
+
22
+ it('has no obvious axe violations with #action slot', async () => {
23
+ const wrapper = mount(ErrorPage, {
24
+ attachTo: document.body,
25
+ props: { headingLevel: 1, hideBtn: true },
26
+ slots: {
27
+ action: '<button>Retour à l\'accueil</button>',
28
+ },
29
+ })
30
+
31
+ const results = await axe(document.body)
32
+ assertNoA11yViolations(results, 'ErrorPage – action slot', {
33
+ ignoreRules: ['region'],
34
+ })
35
+
36
+ wrapper.unmount()
37
+ })
21
38
  })
@@ -1,5 +1,5 @@
1
1
  import { describe, it, expect } from 'vitest'
2
- import { shallowMount } from '@vue/test-utils'
2
+ import { mount, shallowMount } from '@vue/test-utils'
3
3
  import ErrorPage from '../ErrorPage.vue'
4
4
 
5
5
  describe('ErrorPage', () => {
@@ -8,4 +8,24 @@ describe('ErrorPage', () => {
8
8
 
9
9
  expect(wrapper.html()).toMatchSnapshot()
10
10
  })
11
+
12
+ it('renders #action slot content', () => {
13
+ const wrapper = mount(ErrorPage, {
14
+ slots: {
15
+ action: '<button>Retour à l\'accueil</button>',
16
+ },
17
+ })
18
+
19
+ expect(wrapper.html()).toContain('Retour à l\'accueil')
20
+ })
21
+
22
+ it('renders #additional-content slot content', () => {
23
+ const wrapper = mount(ErrorPage, {
24
+ slots: {
25
+ 'additional-content': '<p>Contenu additionnel</p>',
26
+ },
27
+ })
28
+
29
+ expect(wrapper.html()).toContain('Contenu additionnel')
30
+ })
11
31
  })
@@ -9,6 +9,5 @@ exports[`ErrorPage > renders correctly 1`] = `
9
9
  hidebtn="false"
10
10
  message="Une erreur est survenue de notre côté, veuillez réessayer plus tard."
11
11
  pagetitle="Une erreur est survenue"
12
- uniqueid=""
13
12
  ></status-page-stub>
14
13
  `;
@@ -0,0 +1,23 @@
1
+ // @vitest-environment jsdom
2
+
3
+ import { describe, it } from 'vitest'
4
+ import { mount } from '@vue/test-utils'
5
+ import { axe } from 'vitest-axe'
6
+ import { assertNoA11yViolations } from '@tests/unit/accessibility/axeUtils'
7
+ import ExternalLinks from '../ExternalLinks.vue'
8
+
9
+ describe('ExternalLinks – accessibility (axe)', () => {
10
+ it('has no obvious axe violations', async () => {
11
+ const wrapper = mount(ExternalLinks, {
12
+ props: {
13
+ items: [
14
+ { text: 'ameli.fr', href: 'https://ameli.fr' },
15
+ { text: 'Legifrance', href: 'https://legifrance.gouv.fr' },
16
+ ],
17
+ },
18
+ })
19
+
20
+ const results = await axe(wrapper.element as HTMLElement)
21
+ assertNoA11yViolations(results, 'ExternalLinks – default state')
22
+ })
23
+ })