@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
@@ -20,7 +20,7 @@
20
20
  modelValue?: string | null
21
21
  variantStyle?: 'outlined' | 'underlined'
22
22
  color?: ColorType
23
- label?: string
23
+ label: string
24
24
  required?: boolean
25
25
  errorMessages?: string[] | null
26
26
  warningMessages?: string[] | null
@@ -41,7 +41,6 @@
41
41
  modelValue: null,
42
42
  variantStyle: 'outlined',
43
43
  color: 'primary',
44
- label: undefined,
45
44
  required: false,
46
45
  errorMessages: null,
47
46
  warningMessages: null,
@@ -96,25 +95,12 @@
96
95
  })
97
96
  }
98
97
 
99
- // Règle pour le message de succès
100
- // rules.push({
101
- // type: 'custom',
102
- // options: {
103
- // validate: (value: string) => value ? true : 'Ce champ est requis',
104
- // successMessage: 'Mot de passe fort',
105
- // fieldIdentifier: props.label || 'password',
106
- // },
107
- // })
108
-
109
98
  return rules
110
99
  })
111
100
 
112
101
  // Initialisation du composable de validation
113
102
  const { errors, warnings, successes, validateField } = !props.readonly
114
103
  ? useValidation({
115
- customRules: defaultRules.value,
116
- warningRules: props.customWarningRules || [],
117
- successRules: props.customSuccessRules || [],
118
104
  showSuccessMessages: props.showSuccessMessages,
119
105
  fieldIdentifier: props.label || 'password',
120
106
  disableErrorHandling: props.disableErrorHandling,
@@ -123,7 +109,7 @@
123
109
  errors: ref<string[]>([]),
124
110
  warnings: ref<string[]>([]),
125
111
  successes: ref<string[]>([]),
126
- validateField: () => {},
112
+ validateField: () => ({ hasError: false, hasWarning: false, hasSuccess: false, state: { errors: [], warnings: [], successes: [] } }),
127
113
  }
128
114
 
129
115
  const hasError = computed(() => errors.value.length > 0)
@@ -199,15 +185,15 @@
199
185
  })
200
186
  }
201
187
 
202
- function handleKeydown(event: KeyboardEvent): void {
188
+ async function handleKeydown(event: KeyboardEvent): Promise<void> {
203
189
  if (event.key === 'Enter') {
204
- validateOnSubmit()
190
+ await validateOnSubmit()
205
191
  }
206
192
  }
207
193
 
208
- const validateOnSubmit = (): boolean => {
194
+ const validateOnSubmit = async (): Promise<boolean> => {
209
195
  if (props.readonly) return true // Retourner true au lieu de undefined
210
- validateField(password.value, [...defaultRules.value, ...(props.customRules || [])], props.customWarningRules || [], props.customSuccessRules || [])
196
+ await validateField(password.value, [...defaultRules.value, ...(props.customRules || [])], props.customWarningRules || [], props.customSuccessRules || [])
211
197
  const isValid = errors.value.length === 0
212
198
  if (isValid) {
213
199
  emit('submit')
@@ -280,7 +266,16 @@
280
266
  :autocomplete="props.autocompleteType"
281
267
  class="vd-password"
282
268
  :validate-on="props.isValidateOnBlur ? 'blur lazy' : 'lazy'"
283
- @blur="props.isValidateOnBlur && !props.readonly ? validateField(password, [...defaultRules, ...(props.customRules || [])], props.customWarningRules || [], props.customSuccessRules || []) : () => {}"
269
+ @blur="async () => {
270
+ if (props.isValidateOnBlur && !props.readonly) {
271
+ await validateField(
272
+ password,
273
+ [...defaultRules, ...(props.customRules || [])],
274
+ props.customWarningRules || [],
275
+ props.customSuccessRules || []
276
+ )
277
+ }
278
+ }"
284
279
  @keydown="handleKeydown"
285
280
  >
286
281
  <template #append-inner>
@@ -293,8 +288,7 @@
293
288
  decorative
294
289
  class="mr-2"
295
290
  />
296
- <!-- Utiliser un vrai élément button plutôt qu'une icône avec role="button" -->
297
- <v-button
291
+ <VBtn
298
292
  type="button"
299
293
  class="password-toggle-button"
300
294
  :aria-label="btnLabel"
@@ -311,7 +305,7 @@
311
305
  :aria-hidden="true"
312
306
  decorative
313
307
  />
314
- </v-button>
308
+ </VBtn>
315
309
  </div>
316
310
  <div
317
311
  :id="`${passwordFieldId}-status`"
@@ -6,7 +6,7 @@ import { describe, it, expect } from 'vitest'
6
6
  interface PasswordFieldVM {
7
7
  showEyeIcon: boolean
8
8
  errors: string[]
9
- validateOnSubmit: () => boolean
9
+ validateOnSubmit: () => Promise<boolean>
10
10
  hasError: boolean
11
11
  hasWarning: boolean
12
12
  hasSuccess: boolean
@@ -65,12 +65,12 @@ describe('PasswordField.vue', () => {
65
65
  })
66
66
  const vm = wrapper.vm as unknown as PasswordFieldVM
67
67
 
68
- const result = vm.validateOnSubmit()
68
+ const result = await vm.validateOnSubmit()
69
69
  expect(result).toBe(false)
70
70
  expect(vm.errors).toContain('Le mot de passe est requis')
71
71
 
72
72
  await wrapper.setProps({ modelValue: 'valid-password' })
73
- const validResult = vm.validateOnSubmit()
73
+ const validResult = await vm.validateOnSubmit()
74
74
  expect(validResult).toBe(true)
75
75
  expect(wrapper.emitted().submit).toBeTruthy()
76
76
  })
@@ -78,6 +78,7 @@ describe('PasswordField.vue', () => {
78
78
  it('displays warning and success messages', async () => {
79
79
  const wrapper = mount(PasswordField, {
80
80
  props: {
81
+ label: 'Password',
81
82
  modelValue: 'test',
82
83
  warningMessages: ['Attention: mot de passe court'],
83
84
  successMessages: ['Mot de passe valide'],
@@ -97,6 +98,7 @@ describe('PasswordField.vue', () => {
97
98
  it('handles custom validation rules', async () => {
98
99
  const wrapper = mount(PasswordField, {
99
100
  props: {
101
+ label: 'Password',
100
102
  modelValue: 'test',
101
103
  customRules: [{
102
104
  type: 'custom',
@@ -141,6 +143,7 @@ describe('PasswordField.vue', () => {
141
143
  it('displays validation states based on validation rules', async () => {
142
144
  const wrapper = mount(PasswordField, {
143
145
  props: {
146
+ label: 'Password',
144
147
  modelValue: 'test',
145
148
  customRules: [{
146
149
  type: 'custom',
@@ -995,9 +995,9 @@ export const FormValidation: Story = {
995
995
  ]
996
996
 
997
997
  // Soumission du formulaire
998
- const submitForm = () => {
998
+ const submitForm = async (): Promise<void> => {
999
999
  if (periodFieldRef.value) {
1000
- const isValid = periodFieldRef.value.validateOnSubmit()
1000
+ const isValid = await periodFieldRef.value.validateOnSubmit()
1001
1001
  if (isValid) {
1002
1002
  formStatus.value = 'Formulaire soumis avec succès !'
1003
1003
  isFormSubmitted.value = true
@@ -1035,9 +1035,9 @@ export const FormValidation: Story = {
1035
1035
  ]
1036
1036
 
1037
1037
  // Soumission du formulaire
1038
- const submitForm = () => {
1038
+ const submitForm = async (): Promise<void> => {
1039
1039
  if (periodFieldRef.value) {
1040
- const isValid = periodFieldRef.value.validateOnSubmit()
1040
+ const isValid = await periodFieldRef.value.validateOnSubmit()
1041
1041
  if (isValid) {
1042
1042
  formStatus.value = 'Formulaire soumis avec succès !'
1043
1043
  isFormSubmitted.value = true
@@ -11,51 +11,51 @@
11
11
  type PeriodValue = { from: DateInput, to: DateInput }
12
12
 
13
13
  const props = withDefaults(defineProps<{
14
+ bgColor?: string
15
+ customRules?: ValidationRule[]
16
+ customWarningRules?: ValidationRule[]
17
+ dateFormatReturn?: string
18
+ density?: 'default' | 'comfortable' | 'compact'
19
+ disableErrorHandling?: boolean
20
+ disabled?: boolean
21
+ displayAppendIcon?: boolean
22
+ displayIcon?: boolean
23
+ format?: string
24
+ headingLevel?: 1 | 2 | 3 | 4 | 5 | 6
25
+ hideDetails?: boolean | 'auto'
26
+ isOutlined?: boolean
14
27
  modelValue?: PeriodValue
28
+ noCalendar?: boolean
29
+ noIcon?: boolean
15
30
  placeholderFrom?: string
16
31
  placeholderTo?: string
17
- format?: string
18
- dateFormatReturn?: string
19
- showWeekNumber?: boolean
32
+ readonly?: boolean
20
33
  required?: boolean
21
- displayIcon?: boolean
22
- displayAppendIcon?: boolean
23
- disabled?: boolean
24
- noIcon?: boolean
25
- noCalendar?: boolean
26
- isOutlined?: boolean
27
34
  showSuccessMessages?: boolean
28
- customRules?: ValidationRule[]
29
- customWarningRules?: ValidationRule[]
30
- disableErrorHandling?: boolean
31
- readonly?: boolean
32
- bgColor?: string
33
- density?: 'default' | 'comfortable' | 'compact'
34
- hideDetails?: boolean | 'auto'
35
- headingLevel?: 1 | 2 | 3 | 4 | 5 | 6
35
+ showWeekNumber?: boolean
36
36
  }>(), {
37
+ bgColor: 'white',
38
+ customRules: () => [],
39
+ customWarningRules: () => [],
40
+ dateFormatReturn: '',
41
+ density: 'default',
42
+ disableErrorHandling: false,
43
+ disabled: false,
44
+ displayAppendIcon: false,
45
+ displayIcon: true,
46
+ format: 'DD/MM/YYYY',
47
+ headingLevel: 2,
48
+ hideDetails: false,
49
+ isOutlined: true,
37
50
  modelValue: () => ({ from: null, to: null }),
51
+ noCalendar: false,
52
+ noIcon: false,
38
53
  placeholderFrom: 'Début',
39
54
  placeholderTo: 'Fin',
40
- format: 'DD/MM/YYYY',
41
- dateFormatReturn: '',
42
- showWeekNumber: false,
55
+ readonly: false,
43
56
  required: false,
44
- displayIcon: true,
45
- displayAppendIcon: false,
46
- disabled: false,
47
- noIcon: false,
48
- noCalendar: false,
49
- isOutlined: true,
50
57
  showSuccessMessages: true,
51
- customRules: () => [],
52
- customWarningRules: () => [],
53
- disableErrorHandling: false,
54
- readonly: false,
55
- bgColor: 'white',
56
- density: 'default',
57
- hideDetails: false,
58
- headingLevel: 2,
58
+ showWeekNumber: false,
59
59
  })
60
60
 
61
61
  const emit = defineEmits(['update:modelValue'])
@@ -230,42 +230,42 @@
230
230
  })
231
231
 
232
232
  // Synchronisation lorsque l'une des dates change
233
- function validateBothDates() {
233
+ async function validateBothDates() {
234
234
  if (fromDateRef.value) {
235
235
  fromDateRef.value.validateOnSubmit()
236
236
  }
237
237
  if (toDateRef.value) {
238
- toDateRef.value.validateOnSubmit()
238
+ await toDateRef.value.validateOnSubmit()
239
239
  }
240
240
  }
241
241
 
242
242
  // Validation complète du PeriodField
243
- function validateFields() {
244
- fromDateValidation.validateField(parsedFromDate.value, fromDateRules.value, props.customWarningRules)
245
- toDateValidation.validateField(parsedToDate.value, toDateRules.value, props.customWarningRules)
243
+ async function validateFields() {
244
+ await fromDateValidation.validateField(parsedFromDate.value, fromDateRules.value, props.customWarningRules)
245
+ await toDateValidation.validateField(parsedToDate.value, toDateRules.value, props.customWarningRules)
246
246
  }
247
247
 
248
248
  // Gestionnaires d'événements closed
249
- function handleFromDateClosed() {
250
- validateBothDates()
249
+ async function handleFromDateClosed() {
250
+ await validateBothDates()
251
251
  }
252
252
 
253
- function handleToDateClosed() {
254
- validateBothDates()
253
+ async function handleToDateClosed() {
254
+ await validateBothDates()
255
255
  }
256
256
 
257
257
  // Watch pour les changements des dates - validation croisée
258
- watch(formattedFromDate, () => {
259
- validateFields()
258
+ watch(formattedFromDate, async () => {
259
+ await validateFields()
260
260
  if (formattedToDate.value && toDateRef.value) {
261
- toDateRef.value.validateOnSubmit()
261
+ await toDateRef.value.validateOnSubmit()
262
262
  }
263
263
  })
264
264
 
265
- watch(formattedToDate, () => {
266
- validateFields()
265
+ watch(formattedToDate, async () => {
266
+ await validateFields()
267
267
  if (formattedFromDate.value && fromDateRef.value) {
268
- fromDateRef.value.validateOnSubmit()
268
+ await fromDateRef.value.validateOnSubmit()
269
269
  }
270
270
  })
271
271
 
@@ -278,7 +278,7 @@
278
278
  })
279
279
 
280
280
  // Watch pour les changements externes - Synchronisation
281
- watch(() => props.modelValue, (newValue) => {
281
+ watch(() => props.modelValue, async (newValue) => {
282
282
  if (!newValue) return
283
283
 
284
284
  const newFromDate = formatDateValue(newValue.from)
@@ -291,28 +291,28 @@
291
291
  internalToDate.value = newToDate
292
292
  }
293
293
  // Valider les champs après la mise à jour des valeurs
294
- validateFields()
294
+ await validateFields()
295
295
  }, { deep: true, immediate: true })
296
296
 
297
297
  // Fonction publique de validation
298
- const validateOnSubmit = (): boolean => {
298
+ const validateOnSubmit = async (): Promise<boolean> => {
299
299
  // Valider les deux CalendarMode
300
- const fromDateValid = fromDateRef.value?.validateOnSubmit() ?? true
301
- const toDateValid = toDateRef.value?.validateOnSubmit() ?? true
300
+ const fromDateValid = await fromDateRef.value?.validateOnSubmit() ?? true
301
+ const toDateValid = await toDateRef.value?.validateOnSubmit() ?? true
302
302
 
303
303
  // Valider avec les règles personnalisées
304
- validateFields()
304
+ await validateFields()
305
305
 
306
306
  // Retourner true seulement si tout est valide
307
307
  return fromDateValid && toDateValid && isValid.value
308
308
  }
309
309
 
310
310
  // Initialisation
311
- onMounted(() => {
311
+ onMounted(async () => {
312
312
  internalFromDate.value = formatDateValue(props.modelValue?.from)
313
313
  internalToDate.value = formatDateValue(props.modelValue?.to)
314
314
  // Validation initiale
315
- validateFields()
315
+ await validateFields()
316
316
  })
317
317
 
318
318
  defineExpose({
@@ -0,0 +1,32 @@
1
+ import { mount, flushPromises } from '@vue/test-utils'
2
+ import PeriodField from '../PeriodField.vue'
3
+ import { describe, it, expect } from 'vitest'
4
+ import { nextTick } from 'vue'
5
+
6
+ describe('PeriodField async validation', () => {
7
+ it('shows error when from date is after to date', async () => {
8
+ const wrapper = mount(PeriodField, {
9
+ props: {
10
+ modelValue: { from: '2024-01-01', to: '2024-01-31' },
11
+ },
12
+ })
13
+
14
+ // Find both DatePicker components
15
+ const datePickers = wrapper.findAllComponents({ name: 'DatePicker' })
16
+ expect(datePickers.length).toBe(2)
17
+
18
+ const fromInput = datePickers[0]!.find('input')
19
+ await fromInput.setValue('15/01/2024')
20
+ await fromInput.trigger('blur')
21
+ await flushPromises()
22
+
23
+ const toInput = datePickers[1]!.find('input')
24
+ await toInput.setValue('10/01/2024')
25
+ await toInput.trigger('blur')
26
+ await flushPromises()
27
+ await nextTick()
28
+
29
+ expect(datePickers[0]?.text()).toContain('date de début ne peut pas être supérieure à la date de fin')
30
+ expect(datePickers[1]?.text()).toContain('La date de fin ne peut pas être inférieure à la date de début')
31
+ })
32
+ })
@@ -1,12 +1,72 @@
1
- import { Meta, Story } from '@storybook/addon-docs';
2
- import * as Stories from '../PeriodField.stories.ts';
3
- import '@/stories/styles/shared.css';
1
+ import { Meta, Story } from '@storybook/addon-docs'
2
+ import * as Stories from '../PeriodField.stories.ts'
3
+ import AccessibilityIcon from '@/common/imgs/accessibility-svgrepo-com.svg'
4
+ import '@/stories/styles/shared.css'
5
+ import {
6
+ AccessibilityGuideLayout,
7
+ CriteriaSection,
8
+ CriteriaCard,
9
+ DemoSection,
10
+ BestPracticesSection,
11
+ ResourcesSection,
12
+ } from '@/stories/accessibility/AccessibilityGuideLayout.mdx'
4
13
 
5
14
  <Meta of={Stories} />
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="PeriodField"
18
+ iconSrc={AccessibilityIcon}
19
+ >
20
+ <CriteriaSection>
21
+ <CriteriaCard title="Structure sémantique" icon="🔍">
22
+ <ul>
23
+ <li><strong>Rôles</strong> : Deux inputs avec <code>aria-required</code> synchronisé quand <code>required</code>.</li>
24
+ <li><strong>Association</strong> : Labels natifs pour chaque champ (date de début/fin) avec placeholders distinctifs "Début"/"Fin".</li>
25
+ <li><strong>Descriptions</strong> : <code>aria-describedby</code> relie aides contextuelles, messages de validation croisée (début ≤ fin).</li>
26
+ <li><strong>États</strong> : <code>aria-invalid</code>, <code>aria-disabled</code>, <code>aria-readonly</code> sur chaque champ indiquent validation et props.</li>
27
+ </ul>
28
+ </CriteriaCard>
11
29
 
12
- <br />
30
+ <CriteriaCard title="Saisie et clavier" icon="⌨️">
31
+ <ul>
32
+ <li><strong>Tab</strong> : Navigation séquentielle entre les deux champs sans piège de focus.</li>
33
+ <li><strong>Masque automatique</strong> : Formatage automatique des séparateurs sans bloquer la saisie ni les raccourcis clavier.</li>
34
+ <li><strong>Raccourcis</strong> : <kbd>Ctrl/C</kbd> fonctionnel sur chaque champ.</li>
35
+ <li><strong>Calendrier optionnel</strong> : Icône calendrier active un DatePicker accessible avec navigation clavier complète.</li>
36
+ <li><strong>Lecture seule</strong> : Désactive validation et effacement, icônes décoratives non interactives.</li>
37
+ </ul>
38
+ </CriteriaCard>
39
+
40
+ <CriteriaCard title="Validation croisée" icon="📣">
41
+ <ul>
42
+ <li><strong>Cohérence période</strong> : Validation automatique que début ≤ fin avec messages d'erreur croisés.</li>
43
+ <li><strong>Champs requis</strong> : Si required, les deux champs doivent être remplis ou aucun (logique flexible).</li>
44
+ <li><strong>Messages contextualisés</strong> : Erreurs/avertissements/succès sous chaque champ (associés via <code>aria-describedby</code>).</li>
45
+ <li><strong>Validation personnalisée</strong> : <code>customRules</code> / <code>customWarningRules</code> par champ.</li>
46
+ </ul>
47
+ </CriteriaCard>
48
+
49
+ <CriteriaCard title="Calendrier intégré" icon="📅">
50
+ <ul>
51
+ <li><strong>Icône accessible</strong> : Bouton avec <code>aria-label</code> explicite ("Ouvrir le calendrier"). Les attributs <code>aria-expanded</code> et <code>aria-haspopup</code> ne sont pas appliqués directement sur les champs textes pour respecter leur rôle natif.</li>
52
+ <li><strong>Navigation calendrier</strong> : Flèches, Home/End, PageUp/Down, Entrée/Espace pour sélectionner dates.</li>
53
+ <li><strong>Focus management</strong> : Retour automatique au champ après sélection dans calendrier.</li>
54
+ <li><strong>Format cohérent</strong> : Date sélectionnée respecte le format configuré (DD/MM/YYYY par défaut).</li>
55
+ </ul>
56
+ </CriteriaCard>
57
+ </CriteriaSection>
58
+
59
+ <DemoSection title="Période par défaut">
60
+ <Story of={Stories.Default} />
61
+ </DemoSection>
62
+
63
+
64
+ <BestPracticesSection>
65
+ - Utiliser des placeholders distinctifs ("Début"/"Fin") et des labels clairs pour chaque champ.
66
+ - Afficher un hint persistant expliquant le format attendu et la logique de validation croisée.
67
+ - En mode requis, clarifier que les deux champs doivent être remplis ou aucun selon le cas d'usage.
68
+ - Conserver l'icône calendrier décorative mais non interactive en mode lecture seule ou désactivé.
69
+ - Avec validation personnalisée, synchroniser les messages entre les deux champs pour cohérence.
70
+ - Tester la navigation clavier entre les champs et l'interaction calendrier si activé.
71
+ </BestPracticesSection>
72
+ </AccessibilityGuideLayout>
@@ -1,6 +1,6 @@
1
- import { DOMWrapper, mount, VueWrapper } from '@vue/test-utils'
1
+ import { DOMWrapper, flushPromises, mount, VueWrapper } from '@vue/test-utils'
2
2
  import { describe, it, expect } from 'vitest'
3
- import type { ComponentPublicInstance } from 'vue'
3
+ import { nextTick, type ComponentPublicInstance } from 'vue'
4
4
 
5
5
  import PeriodField from '../PeriodField.vue'
6
6
  import DatePicker from '@/components/DatePicker/CalendarMode/DatePicker.vue'
@@ -116,6 +116,32 @@ describe('PeriodField.vue', () => {
116
116
  expect(wrapper.vm.isValid).toBe(false)
117
117
  })
118
118
 
119
+ it('shows error when from date is after to date when updated', async () => {
120
+ const wrapper = mount(PeriodField, {
121
+ props: {
122
+ modelValue: { from: '2024-01-01', to: '2024-01-31' },
123
+ },
124
+ })
125
+
126
+ // Find both DatePicker components
127
+ const datePickers = wrapper.findAllComponents({ name: 'DatePicker' })
128
+ expect(datePickers.length).toBe(2)
129
+
130
+ const fromInput = datePickers[0]!.find('input')
131
+ await fromInput.setValue('15/01/2024')
132
+ await fromInput.trigger('blur')
133
+ await flushPromises()
134
+
135
+ const toInput = datePickers[1]!.find('input')
136
+ await toInput.setValue('10/01/2024')
137
+ await toInput.trigger('blur')
138
+ await flushPromises()
139
+ await nextTick()
140
+
141
+ expect(datePickers[0]?.text()).toContain('date de début ne peut pas être supérieure à la date de fin')
142
+ expect(datePickers[1]?.text()).toContain('La date de fin ne peut pas être inférieure à la date de début')
143
+ })
144
+
119
145
  it('validates when required and both dates are missing', async () => {
120
146
  const wrapper = mount(PeriodField, {
121
147
  props: {
@@ -300,7 +300,6 @@
300
300
  })
301
301
 
302
302
  const validation = useValidation({
303
- customRules: validationRules.value,
304
303
  showSuccessMessages: true,
305
304
  disableErrorHandling: shouldDisableErrorHandling.value,
306
305
  })
@@ -332,9 +331,9 @@
332
331
 
333
332
  const showHelpTextBelow = computed(() => !!props.helpText?.trim())
334
333
 
335
- const runValidation = (): void => {
334
+ const runValidation = async (): Promise<void> => {
336
335
  const cleanedValue = phoneNumber.value.replace(/\s/g, '')
337
- validation.validateField(cleanedValue, validationRules.value)
336
+ await validation.validateField(cleanedValue, validationRules.value)
338
337
  }
339
338
 
340
339
  function validateInputOnBlur() {
@@ -346,13 +345,13 @@
346
345
  runValidation()
347
346
  }
348
347
 
349
- watch(phoneNumber, (newValue) => {
348
+ watch(phoneNumber, async (newValue) => {
350
349
  if (shouldDisableErrorHandling.value) return
351
350
 
352
351
  if (!props.isValidatedOnBlur) {
353
352
  // Validation en temps réel (isValidatedOnBlur=false)
354
353
  const cleanedValue = newValue.replace(/\s/g, '')
355
- validation.validateField(cleanedValue, validationRules.value)
354
+ await validation.validateField(cleanedValue, validationRules.value)
356
355
  }
357
356
  else if (onBlur.value) {
358
357
  // Après un premier blur, effacer les erreurs pendant la frappe —
@@ -377,7 +376,7 @@
377
376
  }
378
377
 
379
378
  onBlur.value = true
380
- runValidation()
379
+ await runValidation()
381
380
 
382
381
  if (props.withCountryCode && props.countryCodeRequired && !dialCode.value) {
383
382
  validation.errors.value.push(`Le champ ${locales.indicatifLabel} est requis.`)
@@ -310,6 +310,7 @@ describe('PhoneField', () => {
310
310
  })
311
311
 
312
312
  const result = await wrapper.vm.validateOnSubmit()
313
+ console.log('Validation result:', result)
313
314
 
314
315
  expect(result).toBe(false)
315
316
  expect(wrapper.vm.hasError).toBe(true)
@@ -171,3 +171,9 @@
171
171
  </div>
172
172
  </component>
173
173
  </template>
174
+
175
+ <style lang="scss">
176
+ .sy-range-field .sy-textfield-container {
177
+ flex: 1;
178
+ }
179
+ </style>