@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
@@ -0,0 +1,149 @@
1
+ import { describe, it, expect } from 'vitest'
2
+ import { mount } from '@vue/test-utils'
3
+ import { axe } from 'vitest-axe'
4
+ import { assertNoA11yViolations } from '@tests/unit/accessibility/axeUtils'
5
+ import SyHeading from './SyHeading.vue'
6
+
7
+ describe('SyHeading - Accessibility', () => {
8
+ it('should not have any accessibility violations with default props', async () => {
9
+ const wrapper = mount(SyHeading, {
10
+ slots: {
11
+ default: 'Default heading',
12
+ },
13
+ })
14
+
15
+ const results = await axe(wrapper.element, {
16
+ rules: {
17
+ region: { enabled: false },
18
+ },
19
+ })
20
+ assertNoA11yViolations(results, 'SyHeading - default props')
21
+ })
22
+
23
+ it('should not have accessibility violations with all heading levels', async () => {
24
+ const levels = [1, 2, 3, 4, 5, 6] as const
25
+
26
+ for (const level of levels) {
27
+ const wrapper = mount(SyHeading, {
28
+ props: {
29
+ level,
30
+ },
31
+ slots: {
32
+ default: `Heading level ${level}`,
33
+ },
34
+ })
35
+
36
+ const results = await axe(wrapper.element, {
37
+ rules: {
38
+ region: { enabled: false },
39
+ },
40
+ })
41
+ assertNoA11yViolations(results, `SyHeading - level ${level}`)
42
+ }
43
+ })
44
+
45
+ it('should not have accessibility violations with complex content', async () => {
46
+ const wrapper = mount(SyHeading, {
47
+ props: {
48
+ level: 3,
49
+ },
50
+ slots: {
51
+ default: '<span>Heading with <em>emphasis</em> and <strong>strong text</strong></span>',
52
+ },
53
+ })
54
+
55
+ const results = await axe(wrapper.element, {
56
+ rules: {
57
+ region: { enabled: false },
58
+ },
59
+ })
60
+ assertNoA11yViolations(results, 'SyHeading - complex content')
61
+ })
62
+
63
+ it('should not have accessibility violations with very long content', async () => {
64
+ const longContent = 'This is a very long heading text that might wrap across multiple lines and should still be accessible to screen readers and other assistive technologies without any issues.'
65
+
66
+ const wrapper = mount(SyHeading, {
67
+ props: {
68
+ level: 2,
69
+ },
70
+ slots: {
71
+ default: longContent,
72
+ },
73
+ })
74
+
75
+ const results = await axe(wrapper.element, {
76
+ rules: {
77
+ region: { enabled: false },
78
+ },
79
+ })
80
+ assertNoA11yViolations(results, 'SyHeading - long content')
81
+ })
82
+
83
+ it('should not have accessibility violations with special characters', async () => {
84
+ const wrapper = mount(SyHeading, {
85
+ props: {
86
+ level: 1,
87
+ },
88
+ slots: {
89
+ default: 'Heading with special chars: éàüßñ & symbols @#$%',
90
+ },
91
+ })
92
+
93
+ const results = await axe(wrapper.element, {
94
+ rules: {
95
+ region: { enabled: false },
96
+ },
97
+ })
98
+ assertNoA11yViolations(results, 'SyHeading - special characters')
99
+ })
100
+
101
+ it('should use semantic heading elements correctly', async () => {
102
+ const levels = [1, 2, 3, 4, 5, 6] as const
103
+
104
+ for (const level of levels) {
105
+ const wrapper = mount(SyHeading, {
106
+ props: {
107
+ level,
108
+ },
109
+ slots: {
110
+ default: `Semantic heading level ${level}`,
111
+ },
112
+ })
113
+
114
+ // Verify the correct semantic heading element is used
115
+ expect(wrapper.find(`h${level}`).exists()).toBe(true)
116
+
117
+ // Verify no accessibility violations
118
+ const results = await axe(wrapper.element, {
119
+ rules: {
120
+ region: { enabled: false },
121
+ },
122
+ })
123
+ assertNoA11yViolations(results, `SyHeading - semantic level ${level}`)
124
+ }
125
+ })
126
+
127
+ it('should maintain heading hierarchy for screen readers', async () => {
128
+ const wrapper = mount(SyHeading, {
129
+ props: {
130
+ level: 2,
131
+ },
132
+ slots: {
133
+ default: 'Important section heading',
134
+ },
135
+ })
136
+
137
+ // Verify the heading is properly structured for screen readers
138
+ const heading = wrapper.find('h2')
139
+ expect(heading.exists()).toBe(true)
140
+ expect(heading.text()).toBe('Important section heading')
141
+
142
+ const results = await axe(wrapper.element, {
143
+ rules: {
144
+ region: { enabled: false },
145
+ },
146
+ })
147
+ assertNoA11yViolations(results, 'SyHeading - hierarchy')
148
+ })
149
+ })
@@ -0,0 +1,115 @@
1
+ import { describe, it, expect } from 'vitest'
2
+ import { mount } from '@vue/test-utils'
3
+ import { axe } from 'vitest-axe'
4
+ import { assertNoA11yViolations } from '@tests/unit/accessibility/axeUtils'
5
+ import SyHeading from './SyHeading.vue'
6
+
7
+ describe('SyHeading', () => {
8
+ it('renders default heading level 2', () => {
9
+ const wrapper = mount(SyHeading, {
10
+ slots: {
11
+ default: 'Test heading',
12
+ },
13
+ })
14
+
15
+ expect(wrapper.find('h2').exists()).toBe(true)
16
+ expect(wrapper.text()).toBe('Test heading')
17
+ expect(wrapper.classes()).toContain('sy-heading')
18
+ })
19
+
20
+ it('renders custom heading levels', () => {
21
+ const levels = [1, 2, 3, 4, 5, 6] as const
22
+
23
+ levels.forEach((level) => {
24
+ const wrapper = mount(SyHeading, {
25
+ props: {
26
+ level,
27
+ },
28
+ slots: {
29
+ default: `Heading level ${level}`,
30
+ },
31
+ })
32
+
33
+ expect(wrapper.find(`h${level}`).exists()).toBe(true)
34
+ expect(wrapper.text()).toBe(`Heading level ${level}`)
35
+ })
36
+ })
37
+
38
+ it('applies correct CSS class', () => {
39
+ const wrapper = mount(SyHeading, {
40
+ slots: {
41
+ default: 'Test heading',
42
+ },
43
+ })
44
+
45
+ expect(wrapper.classes()).toContain('sy-heading')
46
+ })
47
+
48
+ it('renders complex content', () => {
49
+ const wrapper = mount(SyHeading, {
50
+ slots: {
51
+ default: '<span>Complex <strong>content</strong></span>',
52
+ },
53
+ })
54
+
55
+ expect(wrapper.text()).toBe('Complex content')
56
+ })
57
+
58
+ it('should not have any accessibility violations', async () => {
59
+ const wrapper = mount(SyHeading, {
60
+ props: {
61
+ level: 1,
62
+ },
63
+ slots: {
64
+ default: 'Main heading',
65
+ },
66
+ })
67
+
68
+ const results = await axe(wrapper.element, {
69
+ rules: {
70
+ region: { enabled: false },
71
+ },
72
+ })
73
+ assertNoA11yViolations(results, 'SyHeading - main heading')
74
+ })
75
+
76
+ it('should not have accessibility violations for all heading levels', async () => {
77
+ const levels = [1, 2, 3, 4, 5, 6] as const
78
+
79
+ for (const level of levels) {
80
+ const wrapper = mount(SyHeading, {
81
+ props: {
82
+ level,
83
+ },
84
+ slots: {
85
+ default: `Heading level ${level}`,
86
+ },
87
+ })
88
+
89
+ const results = await axe(wrapper.element, {
90
+ rules: {
91
+ region: { enabled: false },
92
+ },
93
+ })
94
+ assertNoA11yViolations(results, `SyHeading - level ${level}`)
95
+ }
96
+ })
97
+
98
+ it('should not have accessibility violations with complex content', async () => {
99
+ const wrapper = mount(SyHeading, {
100
+ props: {
101
+ level: 2,
102
+ },
103
+ slots: {
104
+ default: '<span>Heading with <em>emphasis</em> and <strong>strong text</strong></span>',
105
+ },
106
+ })
107
+
108
+ const results = await axe(wrapper.element, {
109
+ rules: {
110
+ region: { enabled: false },
111
+ },
112
+ })
113
+ assertNoA11yViolations(results, 'SyHeading - complex content')
114
+ })
115
+ })
@@ -1,9 +1,11 @@
1
1
  <script setup lang="ts">
2
2
  import { computed } from 'vue'
3
3
 
4
- const props = defineProps<{
5
- level: 1 | 2 | 3 | 4 | 5 | 6
6
- }>()
4
+ const props = withDefaults(defineProps<{
5
+ level?: 1 | 2 | 3 | 4 | 5 | 6
6
+ }>(), {
7
+ level: 2,
8
+ })
7
9
 
8
10
  const tag = computed(() => `h${props.level}`)
9
11
  </script>
@@ -9,11 +9,11 @@ const meta = {
9
9
  parameters: {
10
10
  docs: {
11
11
  controls: {
12
- exclude: ['rules', 'validateOn', 'update:modelValue', 'onUpdate:modelValue'],
12
+ exclude: ['validateOn', 'update:modelValue', 'onUpdate:modelValue'],
13
13
  },
14
14
  },
15
15
  controls: {
16
- exclude: ['rules', 'validateOn', 'onUpdate:modelValue'],
16
+ exclude: ['validateOn', 'onUpdate:modelValue'],
17
17
  },
18
18
  },
19
19
  argTypes: {
@@ -89,6 +89,142 @@ const meta = {
89
89
  table: {
90
90
  type: { summary: 'boolean' },
91
91
  defaultValue: { summary: 'false' },
92
+ category: 'validation',
93
+ },
94
+ },
95
+ rules: {
96
+ control: { type: 'object' },
97
+ description: 'Règles de validation Vuetify (mode useVuetifyValidation=true)',
98
+ table: {
99
+ type: { summary: 'Array<(value: string) => boolean | string>' },
100
+ defaultValue: { summary: '[]' },
101
+ category: 'validation',
102
+ },
103
+ },
104
+ useVuetifyValidation: {
105
+ control: { type: 'boolean' },
106
+ description: 'Active la validation Vuetify (sinon validation unifiée customRules)',
107
+ table: {
108
+ type: { summary: 'boolean' },
109
+ defaultValue: { summary: 'false' },
110
+ category: 'validation',
111
+ },
112
+ },
113
+ isValidateOnBlur: {
114
+ control: { type: 'boolean' },
115
+ description: 'Déclenche la validation au blur (sinon à la saisie)',
116
+ table: {
117
+ type: { summary: 'boolean' },
118
+ defaultValue: { summary: 'true' },
119
+ category: 'validation',
120
+ },
121
+ },
122
+ disableErrorHandling: {
123
+ control: { type: 'boolean' },
124
+ description: 'Désactive la gestion des messages d\'erreur/alerte/succès',
125
+ table: {
126
+ type: { summary: 'boolean' },
127
+ defaultValue: { summary: 'false' },
128
+ category: 'validation',
129
+ },
130
+ },
131
+ showSuccessMessages: {
132
+ control: { type: 'boolean' },
133
+ description: 'Affiche les messages de succès',
134
+ table: {
135
+ type: { summary: 'boolean' },
136
+ defaultValue: { summary: 'true' },
137
+ category: 'validation',
138
+ },
139
+ },
140
+ customRules: {
141
+ control: { type: 'object' },
142
+ description: 'Règles d\'erreur pour le mode validation unifiée',
143
+ table: {
144
+ type: { summary: 'ValidationRule[]' },
145
+ defaultValue: { summary: '[]' },
146
+ category: 'validation',
147
+ },
148
+ },
149
+ customWarningRules: {
150
+ control: { type: 'object' },
151
+ description: 'Règles d\'alerte pour le mode validation unifiée',
152
+ table: {
153
+ type: { summary: 'ValidationRule[]' },
154
+ defaultValue: { summary: '[]' },
155
+ category: 'validation',
156
+ },
157
+ },
158
+ customSuccessRules: {
159
+ control: { type: 'object' },
160
+ description: 'Règles de succès pour le mode validation unifiée',
161
+ table: {
162
+ type: { summary: 'ValidationRule[]' },
163
+ defaultValue: { summary: '[]' },
164
+ category: 'validation',
165
+ },
166
+ },
167
+ errorMessages: {
168
+ control: { type: 'object' },
169
+ description: 'Messages d\'erreur externes ajoutés au résultat de validation',
170
+ table: {
171
+ type: { summary: 'string[] | null' },
172
+ defaultValue: { summary: 'null' },
173
+ category: 'validation',
174
+ },
175
+ },
176
+ warningMessages: {
177
+ control: { type: 'object' },
178
+ description: 'Messages d\'alerte externes ajoutés au résultat de validation',
179
+ table: {
180
+ type: { summary: 'string[] | null' },
181
+ defaultValue: { summary: 'null' },
182
+ category: 'validation',
183
+ },
184
+ },
185
+ successMessages: {
186
+ control: { type: 'object' },
187
+ description: 'Messages de succès externes ajoutés au résultat de validation',
188
+ table: {
189
+ type: { summary: 'string[] | null' },
190
+ defaultValue: { summary: 'null' },
191
+ category: 'validation',
192
+ },
193
+ },
194
+ hasError: {
195
+ control: { type: 'boolean' },
196
+ description: 'Force l\'état erreur',
197
+ table: {
198
+ type: { summary: 'boolean' },
199
+ defaultValue: { summary: 'false' },
200
+ category: 'validation',
201
+ },
202
+ },
203
+ hasWarning: {
204
+ control: { type: 'boolean' },
205
+ description: 'Force l\'état alerte',
206
+ table: {
207
+ type: { summary: 'boolean' },
208
+ defaultValue: { summary: 'false' },
209
+ category: 'validation',
210
+ },
211
+ },
212
+ hasSuccess: {
213
+ control: { type: 'boolean' },
214
+ description: 'Force l\'état succès',
215
+ table: {
216
+ type: { summary: 'boolean' },
217
+ defaultValue: { summary: 'false' },
218
+ category: 'validation',
219
+ },
220
+ },
221
+ maxErrors: {
222
+ control: { type: 'number' },
223
+ description: 'Nombre maximum de messages d\'erreur affichés',
224
+ table: {
225
+ type: { summary: 'number' },
226
+ defaultValue: { summary: '1' },
227
+ category: 'validation',
92
228
  },
93
229
  },
94
230
  },
@@ -1,10 +1,10 @@
1
1
  <script setup lang="ts">
2
2
  import { computed, ref, toRef, watch } from 'vue'
3
3
  import type { VTextarea } from 'vuetify/components'
4
- import { locales } from './locales'
5
4
  import useTextActions from './useTextActions'
6
-
7
- type Rule = (value: string) => boolean | string
5
+ import { useDefaultValidationRules, type TextareaRule as Rule } from './useDefaultValidationRules'
6
+ import { useValidation, validationPropsDefaults, type FieldValidationProps } from '@/composables/unifyValidation/useValidation'
7
+ import type { ValidationRule as SyValidationRule } from '@/composables/validation/useValidation'
8
8
 
9
9
  const props = withDefaults(defineProps<{
10
10
  modelValue?: string
@@ -20,12 +20,11 @@
20
20
  color?: string
21
21
  label: string
22
22
  bgColor?: string
23
- }>(), {
23
+ } & FieldValidationProps>(), {
24
24
  modelValue: '',
25
25
  trim: false,
26
26
  replaceTabs: undefined,
27
27
  rules: () => [],
28
- required: false,
29
28
  maxLines: undefined,
30
29
  autoWrap: undefined,
31
30
  normalize: false,
@@ -33,6 +32,7 @@
33
32
  variant: 'outlined',
34
33
  color: 'primary',
35
34
  bgColor: 'white',
35
+ ...validationPropsDefaults,
36
36
  })
37
37
 
38
38
  const emits = defineEmits<{
@@ -41,6 +41,7 @@
41
41
 
42
42
  const textAreaRef = ref<VTextarea | null>(null)
43
43
  const hasInteracted = ref(false)
44
+ const focused = ref(false)
44
45
 
45
46
  const internalValue = ref(props.modelValue)
46
47
  watch(
@@ -87,25 +88,48 @@
87
88
  internalValue.value = value
88
89
  }
89
90
 
90
- const internalRules = computed<Rule[]>(() => {
91
- const internalRules: Rule[] = []
91
+ const { vuetifyRules: defaultVuetifyRules, customRules: defaultCustomRules } = useDefaultValidationRules({
92
+ required: toRef(props, 'required'),
93
+ maxLines: toRef(props, 'maxLines'),
94
+ hasInteracted,
95
+ })
92
96
 
93
- internalRules.push((value: string) => {
94
- if (props.required && hasInteracted.value && !value) {
95
- return locales.required
96
- }
97
- return true
98
- })
97
+ const mergedCustomRules = computed<SyValidationRule[]>(() => [
98
+ ...defaultCustomRules.value,
99
+ ...(props.customRules || []),
100
+ ])
99
101
 
100
- internalRules.push((value: string) => {
101
- const lines = value.split('\n').length
102
- if (lines > (props.maxLines as number)) {
103
- return locales.maxLines(props.maxLines as number)
104
- }
105
- return true
106
- })
102
+ const mergedVuetifyRules = computed<Rule[]>(() => [
103
+ ...(props.rules || []),
104
+ ...defaultVuetifyRules.value,
105
+ ])
106
+
107
+ const { validate, errors, warnings, successes, hasError, hasWarning, hasSuccess } = useValidation({
108
+ modelValue: internalValue,
109
+ readonly: toRef(props, 'readonly'),
110
+ disabled: toRef(props, 'disabled'),
111
+ required: toRef(props, 'required'),
112
+ isValidateOnBlur: toRef(props, 'isValidateOnBlur'),
113
+ showSuccessMessages: toRef(props, 'showSuccessMessages'),
114
+ disableErrorHandling: toRef(props, 'disableErrorHandling'),
115
+ useVuetifyValidation: toRef(props, 'useVuetifyValidation'),
116
+ label: toRef(props, 'label'),
117
+ rules: mergedVuetifyRules,
118
+ customRules: mergedCustomRules,
119
+ customWarningRules: toRef(props, 'customWarningRules'),
120
+ customSuccessRules: toRef(props, 'customSuccessRules'),
121
+ errorMessages: toRef(props, 'errorMessages'),
122
+ warningMessages: toRef(props, 'warningMessages'),
123
+ successMessages: toRef(props, 'successMessages'),
124
+ hasErrorProp: toRef(props, 'hasError'),
125
+ hasWarningProp: toRef(props, 'hasWarning'),
126
+ hasSuccessProp: toRef(props, 'hasSuccess'),
127
+ maxErrors: toRef(props, 'maxErrors'),
128
+ focused,
129
+ })
107
130
 
108
- return internalRules
131
+ defineExpose({
132
+ validateOnSubmit: validate,
109
133
  })
110
134
 
111
135
  </script>
@@ -117,13 +141,19 @@
117
141
  :variant="variant"
118
142
  :color="color"
119
143
  :bg-color="props.bgColor"
144
+ :error="hasError"
145
+ :error-messages="errors"
146
+ :messages="hasError ? errors : (hasWarning ? warnings : (hasSuccess && props.showSuccessMessages ? successes : []))"
147
+ :max-errors="props.maxErrors"
148
+ :disabled="props.disabled"
149
+ :readonly="props.readonly"
120
150
  :validate-on="validateOn"
121
- :rules="[...props.rules, ...internalRules]"
151
+ :rules="props.useVuetifyValidation ? mergedVuetifyRules : undefined"
122
152
  :label="label"
123
153
  :aria-label="label"
124
154
  :required="required"
125
155
  :aria-required="required ? 'true' : undefined"
126
156
  @update:model-value="execValueChange"
127
- @update:focused="(e: boolean) => !e ? execBlurChange() : null"
157
+ @update:focused="(e: boolean) => { focused = e; if (!e) execBlurChange() }"
128
158
  />
129
159
  </template>
@@ -1,10 +1,82 @@
1
- import { Meta, Story } from '@storybook/addon-docs';
2
- import * as SyTextArea from '../SyTextArea.stories';
3
- import '@/stories/styles/shared.css';
1
+ import { Meta, Primary } from '@storybook/blocks';
2
+ import * as Stories from '../SyTextArea.stories.ts';
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
+ } from '@/stories/accessibility/AccessibilityGuideLayout.mdx';
4
12
 
5
- <Meta of={SyTextArea} />
13
+ <Meta of={Stories} />
6
14
 
7
- <div className="header">
8
- <h1>Accessibilité</h1>
9
- <p>Cette page sera bientôt disponible</p>
10
- </div>
15
+ <AccessibilityGuideLayout
16
+ componentName="SyTextArea"
17
+ iconSrc={AccessibilityIcon}
18
+ apgHref="https://www.w3.org/WAI/ARIA/apg/patterns/textinput/"
19
+ >
20
+
21
+ <CriteriaSection>
22
+ <CriteriaCard icon="🔍" title="Structure sémantique et attributs">
23
+ <ul>
24
+ <li><strong>Élément textarea natif</strong> : Utilisation de <code>&lt;textarea&gt;</code> via VTextarea pour une sémantique correcte adaptée aux textes multilignes.</li>
25
+ <li><strong>Labels explicites</strong> : Gestion automatique du <code>aria-label</code> basé sur la prop <code>label</code>. L'attribut <code>aria-required</code> est ajouté si le champ est requis.</li>
26
+ <li><strong>Association avec les messages</strong> : Implémentation native de <code>aria-describedby</code> par Vuetify pour lier le champ à ses messages d'erreur.</li>
27
+ <li><strong>Validation accessible</strong> : Les messages d'erreur sont automatiquement associés au textarea via les attributs ARIA.</li>
28
+ </ul>
29
+ </CriteriaCard>
30
+
31
+ <CriteriaCard icon="⌨️" title="Navigation et interaction clavier">
32
+ <ul>
33
+ <li><strong>Focus natif</strong> : Le textarea est naturellement focusable via <kbd>Tab</kbd> et permet la navigation dans le contenu avec les flèches.</li>
34
+ <li><strong>Saisie multiligne</strong> : Support natif des sauts de ligne avec <kbd>Entrée</kbd> et navigation entre les lignes avec les flèches directionnelles.</li>
35
+ <li><strong>Défilement automatique</strong> : Le composant gère automatiquement le défilement lorsque le contenu dépasse la hauteur visible.</li>
36
+ <li><strong>Indicateur de focus</strong> : Styles de focus visibles conformes aux standards d'accessibilité.</li>
37
+ </ul>
38
+ </CriteriaCard>
39
+
40
+ <CriteriaCard icon="🎨" title="Styles et états visuels">
41
+ <ul>
42
+ <li><strong>Contrastes garantis</strong> : Couleurs distinctes pour les états erreur et validation respectant les critères WCAG.</li>
43
+ <li><strong>États cohérents</strong> : Changements visuels clairs entre les états normal, erreur et focus.</li>
44
+ <li><strong>Zone de saisie claire</strong> : Délimitation visuelle évidente de la zone de saisie multiligne.</li>
45
+ <li><strong>Styles personnalisables</strong> : Support des variantes (outlined, filled) et couleurs personnalisées tout en maintenant l'accessibilité.</li>
46
+ </ul>
47
+ </CriteriaCard>
48
+
49
+ <CriteriaCard icon="📝" title="Validation et contraintes">
50
+ <ul>
51
+ <li><strong>Champ requis</strong> : Validation automatique avec message "Ce champ est requis" lorsque <code>required</code> est true.</li>
52
+ <li><strong>Limite de lignes</strong> : Validation du nombre maximum de lignes avec message d'erreur spécifique via la prop <code>maxLines</code>.</li>
53
+ <li><strong>Règles personnalisées</strong> : Support des règles de validation personnalisées avec messages d'erreur accessibles.</li>
54
+ <li><strong>Validation au blur</strong> : Déclenchement de la validation lors de la perte de focus pour une expérience utilisateur optimale.</li>
55
+ </ul>
56
+ </CriteriaCard>
57
+ </CriteriaSection>
58
+
59
+ <DemoSection componentName="SyTextArea">
60
+ <Primary />
61
+ </DemoSection>
62
+
63
+ <BestPracticesSection>
64
+ <ul>
65
+ <li><strong>Labels descriptifs</strong> : Utilisez toujours un <code>label</code> clair qui indique la nature du contenu attendu (ex: "Description", "Commentaires").</li>
66
+ <li><strong>Limites appropriées</strong> : Définissez une <code>maxLines</code> raisonnable pour guider l'utilisateur sans trop contraindre la saisie.</li>
67
+ <li><strong>Messages d'erreur utiles</strong> : Complétez les règles de validation avec des messages spécifiques qui aident à corriger la saisie.</li>
68
+ <li><strong>Évitez les placeholders comme seuls indicateurs</strong> : Le placeholder disparaît lors de la saisie, il doit compléter le label mais pas le remplacer.</li>
69
+ <li><strong>Traitement du texte</strong> : Utilisez les options de traitement (<code>trim</code>, <code>normalize</code>, <code>replaceTabs</code>) pour améliorer la qualité des données saisies.</li>
70
+ <li><strong>Saisie confortable</strong> : Assurez-vous que la hauteur du textarea est suffisante pour une saisie confortable du contenu attendu.</li>
71
+ </ul>
72
+ </BestPracticesSection>
73
+
74
+ <ResourcesSection>
75
+ <ul>
76
+ <li><a href="https://www.w3.org/WAI/ARIA/apg/patterns/textinput/" target="_blank" rel="noopener noreferrer">Guide des pratiques WAI-ARIA : Champs de texte</a></li>
77
+ <li><a href="https://accessibilite.numerique.gouv.fr/methode/criteres-et-tests/#11.9" target="_blank" rel="noopener noreferrer">RGAA : Champs de formulaire</a></li>
78
+ <li><a href="https://www.w3.org/WAI/WCAG21/Techniques/html/H91.html" target="_blank" rel="noopener noreferrer">WCAG Technique H91 : Utiliser les éléments HTML sémantiques</a></li>
79
+ <li><a href="https://developer.mozilla.org/fr/docs/Web/HTML/Element/textarea" target="_blank" rel="noopener noreferrer">MDN : Élément textarea</a></li>
80
+ </ul>
81
+ </ResourcesSection>
82
+ </AccessibilityGuideLayout>