@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
@@ -11,15 +11,15 @@
11
11
  mdiAlertCircle,
12
12
  mdiCalendar,
13
13
  } from '@mdi/js'
14
- import { computed, onMounted, ref, watch, nextTick, useAttrs, type ComponentPublicInstance } from 'vue'
14
+ import { computed, onMounted, ref, watch, nextTick, useAttrs, type ComponentPublicInstance, toRef } from 'vue'
15
15
  import type { IconType, VariantStyle, ColorType } from '@/types/vuetifyTypes'
16
- import { useValidation, type ValidationRule } from '@/composables/validation/useValidation'
17
- import { useValidatable } from '@/composables/validation/useValidatable'
18
16
  import SyIcon from '@/components/Customs/SyIcon/SyIcon.vue'
17
+ import type { ValidationRule } from '@/composables/validation/useValidation'
18
+ import { useValidation, validationPropsDefaults, type FieldValidationProps } from '@/composables/unifyValidation/useValidation'
19
19
 
20
20
  const props = withDefaults(
21
21
  defineProps<{
22
- modelValue?: string | number | null
22
+ modelValue?: string | number | null | undefined
23
23
  prependIcon?: IconType
24
24
  appendIcon?: IconType
25
25
  prependInnerIcon?: IconType
@@ -32,10 +32,6 @@
32
32
  isClearable?: boolean
33
33
  showDivider?: boolean
34
34
  label?: string
35
- required?: boolean
36
- errorMessages?: string[] | null
37
- warningMessages?: string[] | null
38
- successMessages?: string[] | null
39
35
  readonly?: boolean
40
36
  isActive?: boolean
41
37
  baseColor?: string
@@ -56,7 +52,6 @@
56
52
  hint?: string
57
53
  id?: string
58
54
  loading?: string | boolean
59
- maxErrors?: string | number
60
55
  maxWidth?: string | number
61
56
  messages?: string | string[]
62
57
  minWidth?: string | number
@@ -70,9 +65,6 @@
70
65
  isReversed?: boolean
71
66
  role?: string
72
67
  rounded?: string | number | boolean
73
- hasError?: boolean
74
- hasWarning?: boolean
75
- hasSuccess?: boolean
76
68
  isOnSingleLine?: boolean
77
69
  suffix?: string
78
70
  theme?: string
@@ -81,18 +73,12 @@
81
73
  width?: string | number
82
74
  displayAsterisk?: boolean
83
75
  noIcon?: boolean
84
- customRules?: ValidationRule[]
85
- customWarningRules?: ValidationRule[]
86
- customSuccessRules?: ValidationRule[]
87
- showSuccessMessages?: boolean
88
- isValidateOnBlur?: boolean
89
- disableErrorHandling?: boolean
90
76
  disableClickButton?: boolean
91
77
  autocomplete?: string
92
78
  helpText?: string
93
79
  maxlength?: string | number
94
80
  title?: string | false
95
- }>(),
81
+ } & FieldValidationProps>(),
96
82
  {
97
83
  modelValue: undefined,
98
84
  prependIcon: undefined,
@@ -105,10 +91,6 @@
105
91
  variantStyle: 'outlined',
106
92
  color: 'primary',
107
93
  label: '',
108
- errorMessages: null,
109
- warningMessages: null,
110
- successMessages: null,
111
- readonly: false,
112
94
  isClearable: false,
113
95
  isActive: false,
114
96
  baseColor: undefined,
@@ -119,7 +101,6 @@
119
101
  density: 'default',
120
102
  direction: 'horizontal',
121
103
  isDirty: false,
122
- disabled: false,
123
104
  isOnError: false,
124
105
  isFlat: false,
125
106
  isFocused: false,
@@ -128,13 +109,10 @@
128
109
  hint: undefined,
129
110
  id: undefined,
130
111
  loading: false,
131
- maxErrors: undefined,
132
112
  maxWidth: undefined,
133
113
  messages: undefined,
134
114
  minWidth: undefined,
135
115
  name: undefined,
136
- hasError: false,
137
- hasWarning: false,
138
116
  displayPersistentClear: false,
139
117
  displayPersistentCounter: false,
140
118
  displayPersistentHint: false,
@@ -152,17 +130,12 @@
152
130
  width: undefined,
153
131
  displayAsterisk: false,
154
132
  noIcon: false,
155
- customRules: () => [],
156
- customWarningRules: () => [],
157
- customSuccessRules: () => [],
158
- showSuccessMessages: true,
159
- isValidateOnBlur: true,
160
- disableErrorHandling: false,
161
133
  disableClickButton: true,
162
134
  autocomplete: 'off',
163
135
  helpText: '',
164
136
  maxlength: undefined,
165
137
  title: undefined,
138
+ ...validationPropsDefaults,
166
139
  },
167
140
  )
168
141
 
@@ -182,8 +155,35 @@
182
155
  'clear',
183
156
  'prepend-icon-click',
184
157
  'append-icon-click',
158
+ 'focus',
159
+ 'blur',
185
160
  ])
186
161
 
162
+ const NUMBER_ALLOWED_CHARACTERS_PATTERN = /[^0-9eE+.-]/g
163
+ const NUMBER_ALLOWED_SINGLE_CHARACTER_PATTERN = /^[0-9eE+.-]$/
164
+ const TEL_ALLOWED_CHARACTERS_PATTERN = /[^0-9+().\-\s]/g
165
+ const TEL_ALLOWED_SINGLE_CHARACTER_PATTERN = /^[0-9+().\-\s]$/
166
+
167
+ const sanitizeNumberValue = (value: string | number | null | undefined) => {
168
+ if (props.type !== 'number' || typeof value !== 'string') {
169
+ return value
170
+ }
171
+
172
+ return value.replace(NUMBER_ALLOWED_CHARACTERS_PATTERN, '')
173
+ }
174
+
175
+ const sanitizeTelValue = (value: string | number | null | undefined) => {
176
+ if (props.type !== 'tel' || typeof value !== 'string') {
177
+ return value
178
+ }
179
+
180
+ return value.replace(TEL_ALLOWED_CHARACTERS_PATTERN, '')
181
+ }
182
+
183
+ const sanitizeTypedValue = (value: string | number | null | undefined) => {
184
+ return sanitizeTelValue(sanitizeNumberValue(value))
185
+ }
186
+
187
187
  const lastEmittedModelValue = ref(props.modelValue)
188
188
 
189
189
  const model = computed({
@@ -191,12 +191,51 @@
191
191
  return props.modelValue
192
192
  },
193
193
  set(value) {
194
- emit('update:modelValue', value)
195
- lastEmittedModelValue.value = value
194
+ const sanitizedValue = sanitizeTypedValue(value)
195
+ emit('update:modelValue', sanitizedValue)
196
+ lastEmittedModelValue.value = sanitizedValue
196
197
  },
197
198
  })
198
199
 
199
200
  const attrs = useAttrs()
201
+ const focused = ref(false)
202
+ // Construction des règles de validation
203
+ const defaultRules = computed<ValidationRule[]>(() => props.required
204
+ ? [{
205
+ type: 'required',
206
+ options: {
207
+ message: `Le champ ${props.label || 'ce champ'} est requis.`,
208
+ fieldIdentifier: props.label,
209
+ },
210
+ }]
211
+ : [],
212
+ )
213
+ const { validate, errors, warnings, successes, hasError, hasWarning, hasSuccess } = useValidation({
214
+ modelValue: model,
215
+ readonly: toRef(props, 'readonly'),
216
+ disabled: toRef(props, 'disabled'),
217
+ required: toRef(props, 'required'),
218
+ isValidateOnBlur: toRef(props, 'isValidateOnBlur'),
219
+ showSuccessMessages: toRef(props, 'showSuccessMessages'),
220
+ disableErrorHandling: toRef(props, 'disableErrorHandling'),
221
+ useVuetifyValidation: toRef(props, 'useVuetifyValidation'),
222
+ label: toRef(props, 'label'),
223
+ rules: toRef(props, 'rules'),
224
+ customRules: computed(() => {
225
+ const customRules = props.customRules ? props.customRules : []
226
+ return [...defaultRules.value, ...customRules]
227
+ }),
228
+ customWarningRules: toRef(props, 'customWarningRules'),
229
+ customSuccessRules: toRef(props, 'customSuccessRules'),
230
+ errorMessages: toRef(props, 'errorMessages'),
231
+ warningMessages: toRef(props, 'warningMessages'),
232
+ successMessages: toRef(props, 'successMessages'),
233
+ hasErrorProp: toRef(props, 'hasError'),
234
+ hasWarningProp: toRef(props, 'hasWarning'),
235
+ hasSuccessProp: toRef(props, 'hasSuccess'),
236
+ maxErrors: toRef(props, 'maxErrors'),
237
+ focused: focused,
238
+ })
200
239
 
201
240
  const forwardedAttrs = computed(() => {
202
241
  const filteredAttrs = Object.fromEntries(
@@ -215,8 +254,6 @@
215
254
  return filteredAttrs
216
255
  })
217
256
 
218
- const isBlurred = ref(false)
219
-
220
257
  const showClear = computed(() => {
221
258
  if (!props.isClearable) return false
222
259
  if (props.disabled) return false
@@ -227,102 +264,12 @@
227
264
  model.value = ''
228
265
  }
229
266
 
230
- // Initialisation du composable de validation
231
- const validation = useValidation({
232
- customRules: props.customRules,
233
- warningRules: props.customWarningRules,
234
- successRules: props.customSuccessRules,
235
- showSuccessMessages: props.showSuccessMessages,
236
- fieldIdentifier: props.label,
237
- disableErrorHandling: props.disableErrorHandling,
238
- })
239
-
240
- // Synchronisation des messages externes
241
- watch(() => props.errorMessages, (newVal) => {
242
- validation.errors.value = newVal || []
243
- }, { immediate: true })
244
-
245
- watch(() => props.warningMessages, (newVal) => {
246
- validation.warnings.value = newVal || []
247
- }, { immediate: true })
248
-
249
- watch(() => props.successMessages, (newVal) => {
250
- validation.successes.value = newVal || []
251
- }, { immediate: true })
252
-
253
- // Construction des règles de validation
254
- const defaultRules = computed<ValidationRule[]>(() => props.required
255
- ? [{
256
- type: 'required',
257
- options: {
258
- message: `Le champ ${props.label || 'ce champ'} est requis.`,
259
- fieldIdentifier: props.label,
260
- },
261
- }]
262
- : [],
263
- )
264
-
265
- // Check if customRules contains a 'required' rule
266
- const hasCustomRequiredRule = () => {
267
- return props.customRules.some(rule => rule.type === 'required')
268
- }
269
-
270
- const validateField = (value: string | number | null) => {
271
- if (props.readonly) {
272
- validation.clearValidation()
273
- return true
274
- }
275
-
276
- // Don't short-circuit if a custom required rule exists
277
- if (!value && !props.required && !hasCustomRequiredRule()) {
278
- validation.clearValidation()
279
- return true
280
- }
281
-
282
- const result = validation.validateField(
283
- value,
284
- [...defaultRules.value, ...props.customRules],
285
- props.customWarningRules,
286
- )
287
-
288
- return !result.hasError
289
- }
290
-
291
- const validateOnSubmit = () => {
292
- isBlurred.value = true
293
- return validateField(model.value ?? null)
294
- }
295
-
296
- const checkErrorOnBlur = () => {
297
- isBlurred.value = true
298
- validateField(model.value ?? null)
299
- if (model.value !== lastEmittedModelValue.value) {
300
- emit('update:modelValue', model.value)
301
- lastEmittedModelValue.value = model.value
302
- }
303
- }
304
-
305
267
  watch(model, (newValue) => {
306
- if (!props.isValidateOnBlur) {
307
- validateField(newValue ?? null)
308
- }
309
268
  if (props.isClearable && newValue === '') {
310
269
  emit('clear')
311
270
  }
312
271
  })
313
272
 
314
- const hasError = computed(() =>
315
- validation.hasError.value
316
- || (props.errorMessages?.length ?? 0) > 0
317
- || props.hasError,
318
- )
319
- const hasWarning = computed(() => validation.hasWarning.value || props.hasWarning)
320
- const hasSuccess = computed(() => ((validation.hasSuccess.value && !hasError.value && !hasWarning.value) || props.hasSuccess) && props.showSuccessMessages)
321
-
322
- const errors = computed(() => [...validation.errors.value, ...(props.errorMessages || [])])
323
- const warnings = computed(() => validation.warnings.value)
324
- const successes = computed(() => validation.successes.value)
325
-
326
273
  const iconColor = computed(() => {
327
274
  if (hasError.value) return 'error'
328
275
  if (hasWarning.value) return 'warning'
@@ -338,6 +285,66 @@
338
285
  emit('append-icon-click')
339
286
  }
340
287
 
288
+ const handleInput = (event: Event) => {
289
+ if (props.type === 'number' || props.type === 'tel') {
290
+ const target = event.target as HTMLInputElement | null
291
+
292
+ if (target) {
293
+ const sanitizedValue = sanitizeTypedValue(target.value)
294
+ if (typeof sanitizedValue === 'string' && target.value !== sanitizedValue) {
295
+ target.value = sanitizedValue
296
+ }
297
+ }
298
+ }
299
+
300
+ emit('input', event)
301
+ }
302
+
303
+ const handleBeforeInput = (event: InputEvent) => {
304
+ if (props.type !== 'number' && props.type !== 'tel') {
305
+ return
306
+ }
307
+
308
+ if (!event.data) {
309
+ return
310
+ }
311
+
312
+ const allowedPattern = props.type === 'number'
313
+ ? NUMBER_ALLOWED_SINGLE_CHARACTER_PATTERN
314
+ : TEL_ALLOWED_SINGLE_CHARACTER_PATTERN
315
+
316
+ if (!allowedPattern.test(event.data)) {
317
+ event.preventDefault()
318
+ }
319
+ }
320
+
321
+ const handleKeydown = (event: KeyboardEvent) => {
322
+ if ((props.type === 'number' || props.type === 'tel') && !event.ctrlKey && !event.metaKey && !event.altKey) {
323
+ const allowedNonCharacterKeys = [
324
+ 'Backspace',
325
+ 'Delete',
326
+ 'Tab',
327
+ 'Escape',
328
+ 'Enter',
329
+ 'ArrowLeft',
330
+ 'ArrowRight',
331
+ 'ArrowUp',
332
+ 'ArrowDown',
333
+ 'Home',
334
+ 'End',
335
+ ]
336
+ const allowedPattern = props.type === 'number'
337
+ ? NUMBER_ALLOWED_SINGLE_CHARACTER_PATTERN
338
+ : TEL_ALLOWED_SINGLE_CHARACTER_PATTERN
339
+
340
+ if (!allowedNonCharacterKeys.includes(event.key) && event.key.length === 1 && !allowedPattern.test(event.key)) {
341
+ event.preventDefault()
342
+ }
343
+ }
344
+
345
+ emit('keydown', event)
346
+ }
347
+
341
348
  const validationIcon = computed(() => {
342
349
  if (hasError.value) return ICONS['error']
343
350
  if (hasWarning.value) return ICONS['warning']
@@ -402,9 +409,6 @@
402
409
 
403
410
  const syTextFieldRef = ref<ComponentPublicInstance | null>(null)
404
411
 
405
- // Intégration avec le système de validation du formulaire
406
- useValidatable(validateOnSubmit, validation.clearValidation)
407
-
408
412
  onMounted(() => {
409
413
  nextTick(() => {
410
414
  const removeSvgRole = () => {
@@ -596,9 +600,7 @@
596
600
  })
597
601
 
598
602
  defineExpose({
599
- validation,
600
- validateOnSubmit,
601
- checkErrorOnBlur,
603
+ validateOnSubmit: validate,
602
604
  })
603
605
  </script>
604
606
 
@@ -652,6 +654,7 @@
652
654
  :theme="props.theme"
653
655
  :tile="props.isTiled"
654
656
  :type="props.type"
657
+ :inputmode="props.type === 'number' ? 'decimal' : (props.type === 'tel' ? 'tel' : undefined)"
655
658
  :variant="props.variantStyle"
656
659
  :width="props.width"
657
660
  v-bind="forwardedAttrs"
@@ -661,13 +664,15 @@
661
664
  'success-field': hasSuccess,
662
665
  'basic-field': !hasError && !hasWarning && !hasSuccess
663
666
  }"
664
- @blur="checkErrorOnBlur"
665
- @input="(e: Event) => emit('input', e)"
666
- @keydown="(e: KeyboardEvent) => emit('keydown', e)"
667
+ @focus="focused = true; emit('focus')"
668
+ @blur="focused = false; emit('blur')"
669
+ @beforeinput="handleBeforeInput"
670
+ @input="handleInput"
671
+ @keydown="handleKeydown"
667
672
  >
668
673
  <!-- Prepend -->
669
674
  <template
670
- v-if="props.prependIcon || props.prependTooltip"
675
+ v-if="props.prependIcon || props.prependTooltip || $slots['prepend']"
671
676
  #prepend
672
677
  >
673
678
  <slot name="prepend">
@@ -706,7 +711,7 @@
706
711
 
707
712
  <!-- Append -->
708
713
  <template
709
- v-if="props.appendIcon || props.appendTooltip"
714
+ v-if="props.appendIcon || props.appendTooltip || $slots['append']"
710
715
  #append
711
716
  >
712
717
  <slot name="append">
@@ -743,6 +748,14 @@
743
748
  </slot>
744
749
  </template>
745
750
 
751
+ <!-- Default slot passthrough: renders inside v-field__input (flex-wrap container) -->
752
+ <template
753
+ v-if="$slots.default"
754
+ #default
755
+ >
756
+ <slot />
757
+ </template>
758
+
746
759
  <!-- Prepend inner -->
747
760
  <template #prepend-inner>
748
761
  <slot name="prepend-inner">
@@ -795,6 +808,16 @@
795
808
  <template #details>
796
809
  <slot name="details" />
797
810
  </template>
811
+
812
+ <template #loader="{ color: loaderColor, isActive: loaderActive }">
813
+ <VProgressLinear
814
+ v-if="loaderActive"
815
+ indeterminate
816
+ rounded
817
+ :color="loaderColor"
818
+ :aria-label="props.label ? `Chargement de ${props.label}` : 'Chargement en cours'"
819
+ />
820
+ </template>
798
821
  </VTextField>
799
822
 
800
823
  <div
@@ -808,14 +831,6 @@
808
831
  </template>
809
832
 
810
833
  <style lang="scss" scoped>
811
- @use '@/assets/tokens';
812
-
813
- // :deep(.v-field__input input::placeholder),
814
- // :deep(input.v-field__input::placeholder),
815
- // :deep(textarea.v-field__input::placeholder) {
816
- // opacity: 0;
817
- // }
818
-
819
834
  .sy-textfield-container {
820
835
  display: flex;
821
836
  flex-direction: column;
@@ -830,14 +845,14 @@
830
845
  }
831
846
 
832
847
  :deep(.v-icon__svg) {
833
- fill: tokens.$colors-text-warning !important;
848
+ fill: rgb(var(--v-theme-textWarning)) !important;
834
849
  }
835
850
 
836
851
  :deep(.v-field) {
837
- color: tokens.$colors-border-warning !important;
852
+ color: rgb(var(--v-theme-borderWarning)) !important;
838
853
 
839
854
  .v-field__outline {
840
- color: tokens.$colors-border-warning !important;
855
+ color: rgb(var(--v-theme-borderWarning)) !important;
841
856
  }
842
857
  }
843
858
 
@@ -845,7 +860,7 @@
845
860
  opacity: 1 !important;
846
861
 
847
862
  .v-messages__message {
848
- color: tokens.$colors-border-warning !important;
863
+ color: rgb(var(--v-theme-borderWarning)) !important;
849
864
  }
850
865
  }
851
866
  }
@@ -858,10 +873,10 @@
858
873
  }
859
874
 
860
875
  :deep(.v-field) {
861
- color: tokens.$colors-border-error !important;
876
+ color: rgb(var(--v-theme-borderError)) !important;
862
877
 
863
878
  .v-field__outline {
864
- color: tokens.$colors-border-error !important;
879
+ color: rgb(var(--v-theme-borderError)) !important;
865
880
  }
866
881
  }
867
882
 
@@ -869,7 +884,7 @@
869
884
  opacity: 1 !important;
870
885
 
871
886
  .v-messages__message {
872
- color: tokens.$colors-border-error !important;
887
+ color: rgb(var(--v-theme-borderError)) !important;
873
888
  }
874
889
  }
875
890
  }
@@ -882,16 +897,16 @@
882
897
  }
883
898
 
884
899
  :deep(.v-icon__svg) {
885
- fill: tokens.$colors-text-success !important;
900
+ fill: rgb(var(--v-theme-textSuccess)) !important;
886
901
  }
887
902
 
888
903
  :deep(.v-field) {
889
- color: tokens.$colors-border-success !important;
904
+ color: rgb(var(--v-theme-borderSuccess)) !important;
890
905
 
891
906
  --v-medium-emphasis-opacity: 1;
892
907
 
893
908
  .v-field__outline {
894
- color: tokens.$colors-border-success !important;
909
+ color: rgb(var(--v-theme-borderSuccess)) !important;
895
910
  }
896
911
  }
897
912
 
@@ -899,7 +914,7 @@
899
914
  opacity: 1 !important;
900
915
 
901
916
  .v-messages__message {
902
- color: tokens.$colors-border-success !important;
917
+ color: rgb(var(--v-theme-borderSuccess)) !important;
903
918
  }
904
919
  }
905
920
  }
@@ -910,13 +925,13 @@
910
925
  }
911
926
 
912
927
  :deep(.v-field--focused .v-field__outline) {
913
- color: tokens.$primary-base !important;
928
+ color: rgb(var(--v-theme-accentPrimary)) !important;
914
929
  opacity: 1 !important;
915
930
  }
916
931
 
917
932
  :deep(.v-input__prepend .v-icon:focus-visible),
918
933
  :deep(.v-input__append .v-icon:focus-visible) {
919
- outline: 2px solid tokens.$primary-base;
934
+ outline: 2px solid rgb(var(--v-theme-accentPrimary));
920
935
  outline-offset: 2px;
921
936
  opacity: 1;
922
937
  }
@@ -1,15 +1,73 @@
1
- import { Meta, Story } from '@storybook/addon-docs';
1
+ import { Meta, Primary } from '@storybook/blocks';
2
2
  import * as Stories from '../SyTextField.stories.ts';
3
- import '@/stories/styles/shared.css';
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
13
  <Meta of={Stories} />
6
14
 
7
- <div className="header">
8
- <h1>Accessibilité</h1>
9
- </div>
10
-
11
-
12
- <div class="mt-2">
13
- <p>Rapport d’audit manuel : <a href="/audits/SyTextField.xlsx" style={{ color:'#0C41BD' }}>Voir le rapport</a></p>
15
+ <AccessibilityGuideLayout
16
+ componentName="SyTextField"
17
+ iconSrc={AccessibilityIcon}
18
+ apgHref="https://www.w3.org/WAI/ARIA/apg/patterns/textinput/"
19
+ >
20
+ <div class="mt-8">
21
+ <p>Rapport d’audit manuel : <a href="/audits/SyTextField.xlsx" style={{ color:'#0C41BD' }}>Voir le rapport</a></p>
14
22
  <p style={{ color: 'grey', fontSize: '14px', marginTop: '0px' }}>Correctifs associés (<a href="https://github.com/assurance-maladie-digital/design-system-v3/issues/935" target="_blank" style={{color:'#0C41BD'}}>issue #935</a>), (<a href="https://github.com/assurance-maladie-digital/design-system/issues/4028" target="_blank" style={{color:'#0C41BD'}}>issue #4028</a>)</p>
15
23
  </div>
24
+
25
+ <CriteriaSection>
26
+ <CriteriaCard icon="🔍" title="Structure sémantique et attributs">
27
+ <ul>
28
+ <li><strong>Élément input natif</strong> : Utilisation de <code>&lt;input&gt;</code> via VTextField pour une sémantique correcte.</li>
29
+ <li><strong>Labels explicites</strong> : Gestion automatique du <code>aria-label</code> combinant label, préfixe et suffixe. L'attribut <code>aria-required</code> est ajouté si le champ est requis.</li>
30
+ <li><strong>Association avec les messages</strong> : Implémentation dynamique de <code>aria-describedby</code> pour lier le champ à ses messages d'erreur, d'avertissement ou de succès.</li>
31
+ <li><strong>Icônes décoratives</strong> : Les icônes de validation (erreur, avertissement, succès) sont masquées aux lecteurs d'écran (<code>role="presentation"</code>) pour éviter la redondance avec les messages textuels.</li>
32
+ </ul>
33
+ </CriteriaCard>
34
+
35
+ <CriteriaCard icon="⌨️" title="Navigation et interaction clavier">
36
+ <ul>
37
+ <li><strong>Focus natif</strong> : Le champ est naturellement focusable via <kbd>Tab</kbd>.</li>
38
+ <li><strong>Boutons accessibles</strong> : Les icônes interactives (prepend/append) sont des boutons focusables avec des labels descriptifs et gèrent les événements <kbd>Entrée</kbd> et <kbd>Espace</kbd>.</li>
39
+ <li><strong>Bouton de vidage</strong> : Le bouton "clear" possède un <code>aria-label</code> descriptif ("Vider [label]") et est accessible au clavier.</li>
40
+ <li><strong>Indicateur de focus</strong> : Styles de focus visibles sur le champ et les icônes interactives.</li>
41
+ </ul>
42
+ </CriteriaCard>
43
+
44
+ <CriteriaCard icon="🎨" title="Styles et états visuels">
45
+ <ul>
46
+ <li><strong>Contrastes garantis</strong> : Couleurs distinctes pour les états erreur (rouge), avertissement (orange) et succès (vert) respectant les critères WCAG.</li>
47
+ <li><strong>États cohérents</strong> : Changements visuels clairs entre les états normal, erreur, avertissement et succès.</li>
48
+ <li><strong>Astérisque optionnel</strong> : Possibilité d'afficher un astérisque visuel pour les champs requis via la prop <code>display-asterisk</code>.</li>
49
+ </ul>
50
+ </CriteriaCard>
51
+ </CriteriaSection>
52
+
53
+ <DemoSection componentName="SyTextField">
54
+ <Primary />
55
+ </DemoSection>
56
+
57
+ <BestPracticesSection>
58
+ <ul>
59
+ <li><strong>Labels descriptifs</strong> : Utilisez toujours un <code>label</code> clair et concis. Évitez les placeholders comme seuls indicateurs de champ.</li>
60
+ <li><strong>Messages d'erreur utiles</strong> : Fournissez des messages d'erreur spécifiques qui aident l'utilisateur à corriger sa saisie.</li>
61
+ <li><strong>Validation appropriée</strong> : Utilisez la validation au blur (<code>isValidateOnBlur</code>) pour ne pas surcharger l'utilisateur pendant la saisie.</li>
62
+ <li><strong>Évitez les changements de contexte automatiques</strong> : Ne soumettez pas automatiquement le formulaire ou ne changez pas de page lors de la saisie.</li>
63
+ <li><strong>Préfixes et suffixes accessibles</strong> : Le composant ajoute automatiquement des spans screen-reader-only pour le contenu textuel des préfixes/suffixes.</li>
64
+ </ul>
65
+ </BestPracticesSection>
66
+
67
+ <ResourcesSection>
68
+ <ul>
69
+ <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>
70
+ <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>
71
+ </ul>
72
+ </ResourcesSection>
73
+ </AccessibilityGuideLayout>