@cnamts/synapse 1.0.19 → 1.0.21

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 (378) hide show
  1. package/dist/{DateFilter-CeVuSfJ9.js → DateFilter-uN8OURoP.js} +1 -1
  2. package/dist/{NumberFilter-C8PAu_sw.js → NumberFilter-sm1dQNQi.js} +1 -1
  3. package/dist/{PeriodFilter-UMUaxx3d.js → PeriodFilter-Cklsxnh9.js} +1 -1
  4. package/dist/{SelectFilter-CqZl8CYt.js → SelectFilter-CWefj27Z.js} +1 -1
  5. package/dist/{TextFilter-D_RhhNOh.js → TextFilter-Ddyj885L.js} +1 -1
  6. package/dist/components/Amelipro/AmeliproAutoCompleteField/AmeliproAutoCompleteField.d.ts +4 -4
  7. package/dist/components/Amelipro/AmeliproClickableTile/AmeliproClickableTile.d.ts +17 -7
  8. package/dist/components/Amelipro/AmeliproSelect/AmeliproSelect.d.ts +4 -4
  9. package/dist/components/Amelipro/AmeliproTabs/AmeliproTabs.d.ts +4 -4
  10. package/dist/components/Customs/Selects/SyAutocomplete/SyAutocomplete.d.ts +2416 -0
  11. package/dist/components/Customs/Selects/SyAutocomplete/types.d.ts +5 -0
  12. package/dist/components/Customs/Selects/SyAutocomplete/utils/ariaManager.d.ts +14 -0
  13. package/dist/components/Customs/Selects/SyAutocomplete/utils/useItemUtils.d.ts +16 -0
  14. package/dist/components/Customs/Selects/SyAutocomplete/utils/useKeyboardHandler.d.ts +28 -0
  15. package/dist/components/Customs/Selects/SyAutocomplete/utils/useSelectionLogic.d.ts +12 -0
  16. package/dist/components/Customs/Selects/SySelect/composables/useSySelectKeyboard.d.ts +2 -0
  17. package/dist/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.d.ts +160 -0
  18. package/dist/components/Customs/SyCheckBoxGroup/locales.d.ts +3 -0
  19. package/dist/components/Customs/SyCheckBoxGroup/types.d.ts +10 -0
  20. package/dist/components/Customs/SyCheckbox/SyCheckbox.d.ts +1545 -2
  21. package/dist/components/Customs/SyIcon/SyIcon.d.ts +2 -1
  22. package/dist/components/Customs/SyRadioGroup/SyRadioGroup.d.ts +1495 -2
  23. package/dist/components/DatePicker/composables/useDateSelection.d.ts +1 -0
  24. package/dist/components/DeclarationAccessibilityPage/DeclarationAccessibilityPage.d.ts +60 -0
  25. package/dist/components/ErrorPage/ErrorPage.d.ts +1 -12
  26. package/dist/components/ErrorPage/locales.d.ts +18 -3
  27. package/dist/components/FileUpload/FileUpload.d.ts +2 -0
  28. package/dist/components/MaintenancePage/locales.d.ts +18 -2
  29. package/dist/components/NotFoundPage/locales.d.ts +20 -4
  30. package/dist/components/PaginatedTable/PaginatedTable.d.ts +1 -1
  31. package/dist/components/PaginatedTable/Pagination.d.ts +17 -0
  32. package/dist/components/StatusPage/StatusPage.d.ts +39 -0
  33. package/dist/components/Tables/SyServerTable/SyServerTable.d.ts +5 -5
  34. package/dist/components/Tables/SyTable/SyTable.d.ts +5 -5
  35. package/dist/components/UploadWorkflow/UploadWorkflow.d.ts +13 -3
  36. package/dist/components/index.d.ts +4 -0
  37. package/dist/components/types.d.ts +15 -0
  38. package/dist/composables/useFormFieldErrorHandling.d.ts +31 -0
  39. package/dist/design-system-v3.js +126 -122
  40. package/dist/design-system-v3.umd.cjs +325 -314
  41. package/dist/{main-B39UVv5p.js → main-CWniLr0s.js} +15837 -14587
  42. package/dist/modules.d.ts +6 -0
  43. package/dist/style.css +1 -1
  44. package/dist/utils/theme/index.d.ts +6 -0
  45. package/package.json +12 -10
  46. package/src/assets/amelipro/icons.ts +166 -153
  47. package/src/components/Accordion/Accordion.mdx +4 -1
  48. package/src/components/Accordion/{Accessibilite/AccessibilityGuide.mdx → accessibilite/Accessibility.mdx} +2 -2
  49. package/src/components/Amelipro/AmeliproClickableTile/AmeliproClickableTile.stories.ts +73 -14
  50. package/src/components/Amelipro/AmeliproClickableTile/AmeliproClickableTile.vue +119 -27
  51. package/src/components/Amelipro/AmeliproClickableTile/tests/AmeliproClickableTile.a11y.spec.ts +304 -0
  52. package/src/components/Amelipro/AmeliproClickableTile/tests/AmeliproClickableTile.spec.ts +435 -9
  53. package/src/components/Amelipro/AmeliproClickableTile/tests/__snapshots__/AmeliproClickableTile.spec.ts.snap +60 -0
  54. package/src/components/Amelipro/AmeliproIcon/__tests__/AmeliproIcon.spec.ts +1 -1
  55. package/src/components/Amelipro/AmeliproIcon/iconList.ts +2 -0
  56. package/src/components/BackBtn/BackBtn.vue +5 -4
  57. package/src/components/BackBtn/accessibilite/Accessibility.mdx +15 -0
  58. package/src/components/BackToTopBtn/BackToTopBtn.vue +6 -3
  59. package/src/components/BackToTopBtn/accessibilite/Accessibility.mdx +15 -0
  60. package/src/components/Captcha/Captcha.vue +5 -1
  61. package/src/components/Captcha/CaptchaAlert.vue +9 -7
  62. package/src/components/Captcha/accessibilite/Accessibility.mdx +10 -0
  63. package/src/components/ChipList/accessibilite/Accessibility.mdx +15 -0
  64. package/src/components/CollapsibleList/{Accessibilite.mdx → accessibilite/Accessibility.mdx} +8 -6
  65. package/src/components/Common/IconSlot/IconSlot.vue +1 -1
  66. package/src/components/ContextualMenu/ContextualMenu.stories.ts +0 -3
  67. package/src/components/ContextualMenu/accessibilite/Accessibility.mdx +71 -0
  68. package/src/components/CookieBanner/CookieBanner.stories.ts +11 -20
  69. package/src/components/CookieBanner/CookieBanner.vue +20 -5
  70. package/src/components/CookieBanner/accessibilite/Accessibility.mdx +71 -0
  71. package/src/components/CookieBanner/tests/CookieBanner.spec.ts +48 -4
  72. package/src/components/CookiesSelection/CookiesInformation/CookiesInformation.vue +5 -4
  73. package/src/components/CopyBtn/CopyBtn.vue +6 -3
  74. package/src/components/CopyBtn/accessibilite/Accessibility.mdx +15 -0
  75. package/src/components/Customs/Selects/SelectBtnField/accessibilite/Accessibility.mdx +15 -0
  76. package/src/components/Customs/Selects/SelectOverview.mdx +112 -1
  77. package/src/components/Customs/Selects/SyAutocomplete/SyAutocomplete.mdx +52 -0
  78. package/src/components/Customs/Selects/SyAutocomplete/SyAutocomplete.stories.ts +979 -0
  79. package/src/components/Customs/Selects/SyAutocomplete/SyAutocomplete.vue +653 -0
  80. package/src/components/Customs/Selects/{SySelect → SyAutocomplete/accessibilite}/Accessibilite.stories.ts +7 -38
  81. package/src/components/Customs/Selects/{SySelect/Accessibilite.mdx → SyAutocomplete/accessibilite/Accessibility.mdx} +15 -20
  82. package/src/components/Customs/Selects/SyAutocomplete/tests/SyAutocomplete.a11y.spec.ts +72 -0
  83. package/src/components/Customs/Selects/SyAutocomplete/tests/SyAutocomplete.spec.ts +345 -0
  84. package/src/components/Customs/Selects/SyAutocomplete/types.ts +7 -0
  85. package/src/components/Customs/Selects/SyAutocomplete/utils/ariaManager.ts +180 -0
  86. package/src/components/Customs/Selects/SyAutocomplete/utils/useItemUtils.ts +46 -0
  87. package/src/components/Customs/Selects/SyAutocomplete/utils/useKeyboardHandler.ts +107 -0
  88. package/src/components/Customs/Selects/SyAutocomplete/utils/useSelectionLogic.ts +74 -0
  89. package/src/components/Customs/Selects/SyInputSelect/SyInputSelect.vue +13 -9
  90. package/src/components/Customs/Selects/SyInputSelect/accessibilite/Accessibility.mdx +12 -0
  91. package/src/components/Customs/Selects/SySelect/SySelect.stories.ts +43 -34
  92. package/src/components/Customs/Selects/SySelect/SySelect.vue +19 -2
  93. package/src/components/Customs/Selects/SySelect/accessibilite/Accessibility.mdx +274 -0
  94. package/src/components/Customs/Selects/SySelect/composables/useSySelectKeyboard.ts +21 -16
  95. package/src/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.mdx +32 -0
  96. package/src/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.stories.ts +856 -0
  97. package/src/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.vue +334 -0
  98. package/src/components/Customs/SyCheckBoxGroup/accessibilite/Accessibility.mdx +243 -0
  99. package/src/components/Customs/SyCheckBoxGroup/locales.ts +3 -0
  100. package/src/components/Customs/SyCheckBoxGroup/tests/SyCheckBoxGroup.a11y.spec.ts +30 -0
  101. package/src/components/Customs/SyCheckBoxGroup/tests/SyCheckBoxGroup.spec.ts +152 -0
  102. package/src/components/Customs/SyCheckBoxGroup/types.ts +10 -0
  103. package/src/components/Customs/SyCheckbox/SyCheckbox.vue +16 -27
  104. package/src/components/Customs/SyCheckbox/{Accessibilite.mdx → accessibilite/Accessibility.mdx} +3 -3
  105. package/src/components/Customs/SyForm/SyForm.a11y.spec.ts +1 -1
  106. package/src/components/Customs/SyForm/accessibilite/Accessibility.mdx +10 -0
  107. package/src/components/Customs/SyIcon/SyIcon.mdx +4 -1
  108. package/src/components/Customs/SyIcon/SyIcon.vue +4 -3
  109. package/src/components/Customs/SyIcon/{Accessibilite.stories.ts → accessibilite/Accessibilite.stories.ts} +3 -3
  110. package/src/components/Customs/SyIcon/{Accessibilite.mdx → accessibilite/Accessibility.mdx} +2 -2
  111. package/src/components/Customs/SyPagination/SyPagination.mdx +4 -2
  112. package/src/components/Customs/SyPagination/accessibilite/Accessibility.mdx +10 -0
  113. package/src/components/Customs/SyRadioGroup/SyRadioGroup.vue +16 -43
  114. package/src/components/Customs/SyRadioGroup/{Accessibilite.mdx → accessibilite/Accessibility.mdx} +2 -2
  115. package/src/components/Customs/SyTabs/SyTabs.mdx +4 -2
  116. package/src/components/Customs/SyTabs/{Accessibilite.mdx → accessibilite/Accessibility.mdx} +2 -2
  117. package/src/components/Customs/SyTextField/SyTextField.mdx +1 -2
  118. package/src/components/Customs/SyTextField/SyTextField.vue +13 -0
  119. package/src/components/Customs/SyTextField/accessibilite/Accessibility.mdx +15 -0
  120. package/src/components/DataList/accessibilite/Accessibility.mdx +15 -0
  121. package/src/components/DataListGroup/accessibilite/Accessibility.mdx +14 -0
  122. package/src/components/DatePicker/Accessibilite.mdx +1 -1
  123. package/src/components/DatePicker/Accessibilite.stories.ts +1 -1
  124. package/src/components/DatePicker/CalendarMode/DatePicker.stories.ts +7 -4
  125. package/src/components/DatePicker/CalendarMode/DatePicker.vue +49 -13
  126. package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.stories.ts +43 -2
  127. package/src/components/DatePicker/DatePickerValidationExample/DatePickerValidation.stories.ts +297 -0
  128. package/src/components/DatePicker/DateTextInput/DateTextInput.vue +48 -21
  129. package/src/components/DatePicker/DateTextInput/NoCalendar.stories.ts +98 -0
  130. package/src/components/DatePicker/composables/useDateSelection.ts +5 -0
  131. package/src/components/DatePicker/docExamples/BidirectionalComplexValidation.vue +273 -0
  132. package/src/components/DatePicker/docExamples/DatePickerBidirectionalValidation.vue +4 -4
  133. package/src/components/DatePicker/docExamples/DatePickerValidationExamples.vue +10 -0
  134. package/src/components/DeclarationAccessibilityPage/DeclarationAccessibilityPage.mdx +83 -0
  135. package/src/components/DeclarationAccessibilityPage/DeclarationAccessibilityPage.stories.ts +502 -0
  136. package/src/components/DeclarationAccessibilityPage/DeclarationAccessibilityPage.vue +428 -0
  137. package/src/components/DeclarationAccessibilityPage/accessibilite/Accessibility.mdx +75 -0
  138. package/src/components/DeclarationAccessibilityPage/tests/DeclarationAccessibilityPage.a11y.spec.ts +53 -0
  139. package/src/components/DeclarationAccessibilityPage/tests/DeclarationAccessibilityPage.spec.ts +59 -0
  140. package/src/components/DiacriticPicker/DiacriticPicker.vue +20 -1
  141. package/src/components/DiacriticPicker/accessibilite/Accessibility.mdx +10 -0
  142. package/src/components/DialogBox/accessibilite/Accessibility.mdx +15 -0
  143. package/src/components/DownloadBtn/DownloadBtn.vue +5 -4
  144. package/src/components/DownloadBtn/accessibilite/Accessibility.mdx +15 -0
  145. package/src/components/ErrorPage/ErrorPage.mdx +6 -16
  146. package/src/components/ErrorPage/ErrorPage.stories.ts +16 -87
  147. package/src/components/ErrorPage/ErrorPage.vue +38 -125
  148. package/src/components/ErrorPage/accessibilite/Accessibility.mdx +77 -0
  149. package/src/components/ErrorPage/assets/error-ap.svg +1774 -0
  150. package/src/components/ErrorPage/locales.ts +21 -3
  151. package/src/components/ErrorPage/tests/ErrorPage.a11y.spec.ts +5 -13
  152. package/src/components/ErrorPage/tests/ErrorPage.spec.ts +2 -41
  153. package/src/components/ErrorPage/tests/__snapshots__/ErrorPage.spec.ts.snap +8 -266
  154. package/src/components/ExternalLinks/accessibilite/Accessibility.mdx +15 -0
  155. package/src/components/FileList/UploadItem/UploadItem.vue +25 -20
  156. package/src/components/FileList/accessibilite/Accessibility.mdx +12 -0
  157. package/src/components/FilePreview/accessibilite/Accessibility.mdx +12 -0
  158. package/src/components/FileUpload/FileUpload.vue +5 -0
  159. package/src/components/FileUpload/FileUploadContent.vue +5 -4
  160. package/src/components/FileUpload/accessibilite/Accessibility.mdx +12 -0
  161. package/src/components/FilterInline/FilterInline.vue +5 -4
  162. package/src/components/FilterInline/accessibilite/Accessibility.mdx +12 -0
  163. package/src/components/FilterSideBar/accessibilite/Accessibility.mdx +15 -0
  164. package/src/components/FooterBar/FooterBar.stories.ts +18 -14
  165. package/src/components/FooterBar/{Accessibilite.mdx → accessibilite/Accessibility.mdx} +3 -4
  166. package/src/components/FooterBar/defaultSocialMediaLinks.ts +6 -4
  167. package/src/components/FranceConnectBtn/FranceConnectBtn.vue +6 -5
  168. package/src/components/FranceConnectBtn/accessibilite/Accessibility.mdx +15 -0
  169. package/src/components/FranceConnectBtn/tests/__snapshots__/FranceConnectBtn.spec.ts.snap +3 -0
  170. package/src/components/HeaderBar/HeaderBurgerMenu/accessibilite/Accessibility.mdx +15 -0
  171. package/src/components/HeaderBar/accessibilite/Accessibility.mdx +15 -0
  172. package/src/components/HeaderBar/{Usages.mdx → usages/Usages.mdx} +2 -2
  173. package/src/components/HeaderLoading/{Accessibilite.mdx → accessibilite/Accessibility.mdx} +9 -5
  174. package/src/components/HeaderToolbar/accessibilite/Accessibility.mdx +15 -0
  175. package/src/components/LangBtn/LangBtn.vue +5 -4
  176. package/src/components/LangBtn/accessibilite/Accessibility.mdx +15 -0
  177. package/src/components/Logo/accessibilite/Accessibility.mdx +17 -0
  178. package/src/components/LogoBrandSection/accessibilite/Accessibility.mdx +12 -0
  179. package/src/components/LunarCalendar/accessibilite/Accessibility.mdx +10 -0
  180. package/src/components/MaintenancePage/MaintenancePage.mdx +1 -1
  181. package/src/components/MaintenancePage/MaintenancePage.vue +15 -7
  182. package/src/components/MaintenancePage/accessibilite/Accessibility.mdx +70 -0
  183. package/src/components/MaintenancePage/assets/maintenance-ap.svg +1718 -0
  184. package/src/components/MaintenancePage/locales.ts +24 -3
  185. package/src/components/MaintenancePage/tests/MaintenancePage.a11y.spec.ts +75 -3
  186. package/src/components/MaintenancePage/tests/MaintenancePage.spec.ts +42 -2
  187. package/src/components/MaintenancePage/tests/__snapshots__/MaintenancePage.spec.ts.snap +3 -2
  188. package/src/components/NirField/accessibilite/Accessibility.mdx +15 -0
  189. package/src/components/NotFoundPage/NotFoundPage.mdx +1 -1
  190. package/src/components/NotFoundPage/NotFoundPage.stories.ts +3 -3
  191. package/src/components/NotFoundPage/NotFoundPage.vue +16 -11
  192. package/src/components/NotFoundPage/accessibilite/Accessibility.mdx +87 -0
  193. package/src/components/NotFoundPage/assets/not-found-ap.svg +2061 -0
  194. package/src/components/NotFoundPage/locales.ts +24 -4
  195. package/src/components/NotFoundPage/tests/NotFoundPage.a11y.spec.ts +168 -4
  196. package/src/components/NotFoundPage/tests/NotFoundPage.spec.ts +100 -12
  197. package/src/components/NotFoundPage/tests/__snapshots__/NotFoundPage.spec.ts.snap +2 -2
  198. package/src/components/NotificationBar/Notification/Notification.vue +1 -1
  199. package/src/components/NotificationBar/NotificationBar.mdx +2 -2
  200. package/src/components/NotificationBar/accessibilite/Accessibility.mdx +75 -0
  201. package/src/components/PageContainer/{AccessibilityGuide.mdx → accessibilite/Accessibility.mdx} +7 -4
  202. package/src/components/PageContainer/tests/PageContainer.a11y.spec.ts +14 -7
  203. package/src/components/PaginatedTable/PaginatedTable.vue +27 -47
  204. package/src/components/PaginatedTable/Pagination.vue +93 -0
  205. package/src/components/PaginatedTable/accessibilite/Accessibility.mdx +12 -0
  206. package/src/components/PasswordField/PasswordField.vue +2 -1
  207. package/src/components/PasswordField/accessibilite/Accessibility.mdx +108 -0
  208. package/src/components/PeriodField/accessibilite/Accessibility.mdx +12 -0
  209. package/src/components/PhoneField/PhoneField.stories.ts +46 -38
  210. package/src/components/PhoneField/accessibilite/Accessibility.mdx +15 -0
  211. package/src/components/RangeField/accessibilite/Accessibility.mdx +15 -0
  212. package/src/components/RatingPicker/accessibilite/Accessibility.mdx +15 -0
  213. package/src/components/SearchListField/SearchListField.vue +6 -3
  214. package/src/components/SearchListField/accessibilite/Accessibility.mdx +15 -0
  215. package/src/components/SkipLink/{Accessibilite.mdx → accessibilite/Accessibility.mdx} +7 -4
  216. package/src/components/SocialMediaLinks/DefaultSocialMediaLinks.ts +6 -4
  217. package/src/components/SocialMediaLinks/SocialMediaLinks.mdx +7 -5
  218. package/src/components/SocialMediaLinks/SocialMediaLinks.stories.ts +17 -13
  219. package/src/components/SocialMediaLinks/SocialMediaLinks.vue +9 -1
  220. package/src/components/SocialMediaLinks/accessibilite/Accessibility.mdx +67 -0
  221. package/src/components/SocialMediaLinks/tests/DefaultSocialMediaLinks.spec.ts +5 -5
  222. package/src/components/SocialMediaLinks/tests/SocialMediaLinks.a11y.spec.ts +59 -0
  223. package/src/components/SocialMediaLinks/tests/SocialMediaLinks.spec.ts +9 -7
  224. package/src/components/StatusPage/StatusPage.mdx +22 -0
  225. package/src/components/StatusPage/StatusPage.stories.ts +193 -0
  226. package/src/components/StatusPage/StatusPage.vue +145 -0
  227. package/src/components/StatusPage/accessibilite/Accessibility.mdx +81 -0
  228. package/src/components/StatusPage/tests/StatusPage.a11y.spec.ts +29 -0
  229. package/src/components/StatusPage/tests/StatusPage.spec.ts +50 -0
  230. package/src/components/StatusPage/tests/__snapshots__/StatusPage.spec.ts.snap +270 -0
  231. package/src/components/SubHeader/accessibilite/Accessibility.mdx +15 -0
  232. package/src/components/SyAlert/SyAlert.vue +6 -6
  233. package/src/components/SyAlert/accessibilite/Accessibility.mdx +12 -0
  234. package/src/components/SyTextArea/accessibilite/Accessibility.mdx +10 -0
  235. package/src/components/TableToolbar/TableToolbar.stories.ts +6 -6
  236. package/src/components/TableToolbar/TableToolbar.vue +7 -4
  237. package/src/components/TableToolbar/accessibilite/Accessibility.mdx +12 -0
  238. package/src/components/TableToolbar/tests/__snapshots__/TableToolbar.spec.ts.snap +0 -5
  239. package/src/components/Tables/SyServerTable/SyServerTable.mdx +4 -1
  240. package/src/components/Tables/SyServerTable/accessibilite/Accessibility.mdx +10 -0
  241. package/src/components/Tables/SyTable/SyTable.mdx +4 -1
  242. package/src/components/Tables/SyTable/accessibilite/Accessibility.mdx +10 -0
  243. package/src/components/Tables/common/TableHeader.vue +3 -1
  244. package/src/components/Tables/common/organizeColumns/OrganizeColumns.vue +18 -14
  245. package/src/components/ToolbarContainer/ToolbarContainer.mdx +2 -1
  246. package/src/components/ToolbarContainer/ToolbarContainer.stories.ts +563 -420
  247. package/src/components/ToolbarContainer/accessibilite/Accessibility.mdx +69 -0
  248. package/src/components/UploadWorkflow/UploadWorkflow.mdx +11 -1
  249. package/src/components/UploadWorkflow/UploadWorkflow.stories.ts +107 -3
  250. package/src/components/UploadWorkflow/UploadWorkflow.vue +35 -24
  251. package/src/components/UploadWorkflow/accessibilite/Accessibility.mdx +12 -0
  252. package/src/components/UploadWorkflow/tests/UploadWorkflow.spec.ts +48 -0
  253. package/src/components/UploadWorkflow/tests/__snapshots__/UploadWorkflow.spec.ts.snap +9 -5
  254. package/src/components/UploadWorkflow/useFileList.ts +7 -0
  255. package/src/components/Usages/Usages.vue +3 -2
  256. package/src/components/UserMenuBtn/UserMenuBtn.vue +7 -5
  257. package/src/components/UserMenuBtn/accessibilite/Accessibility.mdx +12 -0
  258. package/src/components/index.ts +5 -0
  259. package/src/components/types.ts +10 -0
  260. package/src/composables/rules/tests/useFieldValidation.spec.ts +39 -3
  261. package/src/composables/rules/useFieldValidation.ts +31 -9
  262. package/src/composables/useFormFieldErrorHandling.ts +141 -0
  263. package/src/modules.d.ts +6 -0
  264. package/src/stories/Accessibilite/KitDePreAudit/Preaudit.mdx +7 -0
  265. package/src/utils/theme/index.ts +19 -0
  266. package/src/utils/theme/tests/useThemeLocales.spec.ts +245 -0
  267. package/dist/components/MaintenancePage/index.d.ts +0 -2
  268. package/src/components/BackBtn/Accessibilite.mdx +0 -14
  269. package/src/components/BackBtn/Accessibilite.stories.ts +0 -30
  270. package/src/components/BackToTopBtn/Accessibilite.mdx +0 -14
  271. package/src/components/BackToTopBtn/Accessibilite.stories.ts +0 -31
  272. package/src/components/ChipList/Accessibilite.mdx +0 -14
  273. package/src/components/ChipList/Accessibilite.stories.ts +0 -31
  274. package/src/components/CollapsibleList/Accessibilite.stories.ts +0 -29
  275. package/src/components/ContextualMenu/Accessibilite.mdx +0 -13
  276. package/src/components/ContextualMenu/Accessibilite.stories.ts +0 -29
  277. package/src/components/CookieBanner/Accessibilite.mdx +0 -13
  278. package/src/components/CookieBanner/Accessibilite.stories.ts +0 -30
  279. package/src/components/CopyBtn/Accessibilite.mdx +0 -13
  280. package/src/components/CopyBtn/Accessibilite.stories.ts +0 -29
  281. package/src/components/Customs/Selects/SelectBtnField/Accessibilite.mdx +0 -14
  282. package/src/components/Customs/Selects/SelectBtnField/Accessibilite.stories.ts +0 -29
  283. package/src/components/Customs/Selects/SyInputSelect/Accessibilite.mdx +0 -13
  284. package/src/components/Customs/Selects/SyInputSelect/Accessibilite.stories.ts +0 -25
  285. package/src/components/Customs/SyPagination/tests/SyPagination.a11y.spec.ts +0 -27
  286. package/src/components/Customs/SyTabs/tests/SyTabs.a11y.spec.ts +0 -51
  287. package/src/components/Customs/SyTextField/Accessibilite.mdx +0 -14
  288. package/src/components/Customs/SyTextField/Accessibilite.stories.ts +0 -34
  289. package/src/components/DataList/Accessibilite.mdx +0 -13
  290. package/src/components/DataList/Accessibilite.stories.ts +0 -29
  291. package/src/components/DataListGroup/Accessibilite.mdx +0 -13
  292. package/src/components/DataListGroup/Accessibilite.stories.ts +0 -29
  293. package/src/components/DataListItem/tests/DataListItem.a11y.spec.ts +0 -31
  294. package/src/components/DatePicker/CalendarMode/tests/DatePicker.a11y.spec.ts +0 -27
  295. package/src/components/DatePicker/ComplexDatePicker/tests/ComplexDatePicker.a11y.spec.ts +0 -26
  296. package/src/components/DatePicker/DateTextInput/tests/DateTextInput.a11y.spec.ts +0 -27
  297. package/src/components/DialogBox/Accessibilite.mdx +0 -14
  298. package/src/components/DialogBox/Accessibilite.stories.ts +0 -29
  299. package/src/components/DownloadBtn/Accessibilite.mdx +0 -14
  300. package/src/components/DownloadBtn/Accessibilite.stories.ts +0 -29
  301. package/src/components/DownloadBtn/tests/DownloadBtn.a11y.spec.ts +0 -26
  302. package/src/components/ErrorPage/Accessibilite.mdx +0 -13
  303. package/src/components/ErrorPage/Accessibilite.stories.ts +0 -36
  304. package/src/components/ExternalLinks/Accessibilite.mdx +0 -18
  305. package/src/components/ExternalLinks/Accessibilite.stories.ts +0 -62
  306. package/src/components/ExternalLinks/tests/ExternalLinks.a11y.spec.ts +0 -39
  307. package/src/components/FileList/Accessibilite.mdx +0 -13
  308. package/src/components/FileList/Accessibilite.stories.ts +0 -26
  309. package/src/components/FilePreview/Accessibilite.mdx +0 -14
  310. package/src/components/FilePreview/Accessibilite.stories.ts +0 -26
  311. package/src/components/FileUpload/Accessibilite.mdx +0 -13
  312. package/src/components/FileUpload/Accessibilite.stories.ts +0 -26
  313. package/src/components/FilterInline/Accessibilite.mdx +0 -15
  314. package/src/components/FilterInline/Accessibilite.stories.ts +0 -26
  315. package/src/components/FilterSideBar/Accessibilite.mdx +0 -13
  316. package/src/components/FilterSideBar/Accessibilite.stories.ts +0 -30
  317. package/src/components/FooterBar/Accessibilite.stories.ts +0 -26
  318. package/src/components/FranceConnectBtn/Accessibilite.mdx +0 -13
  319. package/src/components/FranceConnectBtn/Accessibilite.stories.ts +0 -30
  320. package/src/components/HeaderBar/Accessibilite.mdx +0 -13
  321. package/src/components/HeaderBar/Accessibilite.stories.ts +0 -31
  322. package/src/components/HeaderBar/HeaderBurgerMenu/Accessibilite.mdx +0 -13
  323. package/src/components/HeaderBar/HeaderBurgerMenu/Accessibilite.stories.ts +0 -30
  324. package/src/components/HeaderLoading/Accessibilite.stories.ts +0 -31
  325. package/src/components/HeaderNavigationBar/tests/HeaderNavigationBar.a11y.spec.ts +0 -45
  326. package/src/components/HeaderToolbar/Accessibilite.mdx +0 -13
  327. package/src/components/HeaderToolbar/Accessibilite.stories.ts +0 -36
  328. package/src/components/HeaderToolbar/tests/HeaderToolbar.a11y.spec.ts +0 -25
  329. package/src/components/LangBtn/Accessibilite.mdx +0 -13
  330. package/src/components/LangBtn/Accessibilite.stories.ts +0 -32
  331. package/src/components/Logo/Accessibilite.mdx +0 -13
  332. package/src/components/Logo/Accessibilite.stories.ts +0 -30
  333. package/src/components/LogoBrandSection/Accessibilite.mdx +0 -13
  334. package/src/components/LogoBrandSection/Accessibilite.stories.ts +0 -26
  335. package/src/components/LunarCalendar/tests/LunarCalendar.a11y.spec.ts +0 -31
  336. package/src/components/MaintenancePage/Accessibilite.mdx +0 -13
  337. package/src/components/MaintenancePage/Accessibilite.stories.ts +0 -36
  338. package/src/components/MaintenancePage/index.ts +0 -3
  339. package/src/components/NirField/Accessibilite.mdx +0 -13
  340. package/src/components/NirField/Accessibilite.stories.ts +0 -31
  341. package/src/components/NotFoundPage/Accessibilite.mdx +0 -13
  342. package/src/components/NotFoundPage/Accessibilite.stories.ts +0 -36
  343. package/src/components/NotificationBar/Accessibilite.mdx +0 -13
  344. package/src/components/NotificationBar/Accessibilite.stories.ts +0 -30
  345. package/src/components/PageContainer/Accessibilite.mdx +0 -13
  346. package/src/components/PageContainer/Accessibilite.stories.ts +0 -30
  347. package/src/components/PaginatedTable/Accessibilite.mdx +0 -13
  348. package/src/components/PaginatedTable/Accessibilite.stories.ts +0 -26
  349. package/src/components/PaginatedTable/tests/PaginatedTable.a11y.spec.ts +0 -43
  350. package/src/components/PasswordField/Accessibilite.mdx +0 -13
  351. package/src/components/PasswordField/Accessibilite.stories.ts +0 -121
  352. package/src/components/PeriodField/Accessibilite.mdx +0 -13
  353. package/src/components/PeriodField/Accessibilite.stories.ts +0 -27
  354. package/src/components/PhoneField/Accessibilite.mdx +0 -13
  355. package/src/components/PhoneField/Accessibilite.stories.ts +0 -32
  356. package/src/components/PhoneField/tests/PhoneField.a11y.spec.ts +0 -34
  357. package/src/components/RangeField/Accessibilite.mdx +0 -13
  358. package/src/components/RangeField/Accessibilite.stories.ts +0 -32
  359. package/src/components/RatingPicker/Accessibilite.mdx +0 -13
  360. package/src/components/RatingPicker/Accessibilite.stories.ts +0 -30
  361. package/src/components/SearchListField/Accessibilite.mdx +0 -13
  362. package/src/components/SearchListField/Accessibilite.stories.ts +0 -30
  363. package/src/components/SkipLink/Accessibilite.stories.ts +0 -36
  364. package/src/components/SocialMediaLinks/Accessibilite.mdx +0 -13
  365. package/src/components/SocialMediaLinks/Accessibilite.stories.ts +0 -36
  366. package/src/components/SubHeader/Accessibilite.mdx +0 -13
  367. package/src/components/SubHeader/Accessibilite.stories.ts +0 -36
  368. package/src/components/SyAlert/Accessibilite.mdx +0 -13
  369. package/src/components/SyAlert/Accessibilite.stories.ts +0 -30
  370. package/src/components/TableToolbar/Accessibilite.mdx +0 -13
  371. package/src/components/TableToolbar/Accessibilite.stories.ts +0 -26
  372. package/src/components/UploadWorkflow/Accessibilite.mdx +0 -13
  373. package/src/components/UploadWorkflow/Accessibilite.stories.ts +0 -26
  374. package/src/components/UserMenuBtn/Accessibilite.mdx +0 -13
  375. package/src/components/UserMenuBtn/Accessibilite.stories.ts +0 -25
  376. /package/src/components/HeaderBar/{Usages.stories.ts → usages/Usages.stories.ts} +0 -0
  377. /package/src/components/NotFoundPage/assets/{not-found.svg → not-found-cnam.svg} +0 -0
  378. /package/src/components/SyBtnMenu/accessibilite/{AccessibilityGuide.mdx → Accessibility.mdx} +0 -0
@@ -50,7 +50,10 @@ export { default as Captcha } from './Captcha/Captcha.vue'
50
50
  export { default as SelectBtnField } from './Customs/Selects/SelectBtnField/SelectBtnField.vue'
51
51
  export { default as SyInputSelect } from './Customs/Selects/SyInputSelect/SyInputSelect.vue'
52
52
  export { default as SySelect } from './Customs/Selects/SySelect/SySelect.vue'
53
+ export { default as SyAutocomplete } from './Customs/Selects/SyAutocomplete/SyAutocomplete.vue'
54
+ // export { default as SyBtnSelect } from './Customs/Selects/SyBtnSelect/SyBtnSelect.vue'
53
55
  export { default as SyCheckbox } from './Customs/SyCheckbox/SyCheckbox.vue'
56
+ export { default as SyCheckBoxGroup } from './Customs/SyCheckBoxGroup/SyCheckBoxGroup.vue'
54
57
  export { default as SyForm } from './Customs/SyForm/SyForm.vue'
55
58
  export { default as SyRadioGroup } from './Customs/SyRadioGroup/SyRadioGroup.vue'
56
59
  export { default as SyTextField } from './Customs/SyTextField/SyTextField.vue'
@@ -117,6 +120,8 @@ export { default as SyAlert } from './SyAlert/SyAlert.vue'
117
120
  export { default as ErrorPage } from './ErrorPage/ErrorPage.vue'
118
121
  export { default as MaintenancePage } from './MaintenancePage/MaintenancePage.vue'
119
122
  export { default as NotFoundPage } from './NotFoundPage/NotFoundPage.vue'
123
+ export { default as StatusPage } from './StatusPage/StatusPage.vue'
124
+ export { default as DeclarationAccessibilityPage } from './DeclarationAccessibilityPage/DeclarationAccessibilityPage.vue'
120
125
 
121
126
  // ===========================
122
127
  // Amelipro
@@ -0,0 +1,10 @@
1
+ import type { RouteLocationRaw } from 'vue-router'
2
+
3
+ /**
4
+ * Type pour les props de navigation
5
+ * Permet de spécifier soit href (lien externe), soit to (route interne), soit ni l'un ni l'autre
6
+ */
7
+ export type NavigationProps =
8
+ | { href: string, to?: never }
9
+ | { to: RouteLocationRaw, href?: never }
10
+ | { href?: never, to?: never }
@@ -284,6 +284,18 @@ describe('useFieldValidation', () => {
284
284
  }])[0]!
285
285
  expect(ruleWithoutDate(new Date())).toEqual({ error: 'Configuration de la règle invalide' })
286
286
  expect(rule('')).toEqual({}) // Empty string should be ignored
287
+
288
+ const ruleWithEmptyDate = generateRules([{
289
+ type: 'notBeforeDate',
290
+ options: { date: '', message: 'Date cannot be before reference date.' },
291
+ }])[0]!
292
+ expect(ruleWithEmptyDate(new Date())).toEqual({})
293
+
294
+ const ruleWithUndefinedDate = generateRules([{
295
+ type: 'notBeforeDate',
296
+ options: { date: undefined as unknown as string, message: 'Date cannot be before reference date.' },
297
+ }])[0]!
298
+ expect(ruleWithUndefinedDate(new Date())).toEqual({})
287
299
  })
288
300
 
289
301
  it('should throw when date reference is not a string in notBeforeDate rule', () => {
@@ -296,7 +308,7 @@ describe('useFieldValidation', () => {
296
308
  },
297
309
  }])[0]!
298
310
  invalidRule(new Date())
299
- }).toThrow('Date reference must be a string in DD/MM/YYYY format')
311
+ }).toThrow('La date de référence doit être une chaîne au format DD/MM/YYYY')
300
312
  })
301
313
 
302
314
  it('should validate notAfterDate rule', () => {
@@ -324,6 +336,18 @@ describe('useFieldValidation', () => {
324
336
  }])[0]!
325
337
  expect(ruleWithoutDate(new Date())).toEqual({ error: 'Configuration de la règle invalide' })
326
338
  expect(rule('')).toEqual({}) // Empty string should be ignored
339
+
340
+ const ruleWithEmptyDate = generateRules([{
341
+ type: 'notAfterDate',
342
+ options: { date: '', message: 'Date cannot be after reference date.' },
343
+ }])[0]!
344
+ expect(ruleWithEmptyDate(new Date())).toEqual({})
345
+
346
+ const ruleWithUndefinedDate = generateRules([{
347
+ type: 'notAfterDate',
348
+ options: { date: undefined as unknown as string, message: 'Date cannot be after reference date.' },
349
+ }])[0]!
350
+ expect(ruleWithUndefinedDate(new Date())).toEqual({})
327
351
  })
328
352
 
329
353
  it('should throw when date reference is not a string in notAfterDate rule', () => {
@@ -336,7 +360,7 @@ describe('useFieldValidation', () => {
336
360
  },
337
361
  }])[0]!
338
362
  invalidRule(new Date())
339
- }).toThrow('Date reference must be a string in DD/MM/YYYY format')
363
+ }).toThrow('La date de référence doit être une chaîne au format DD/MM/YYYY')
340
364
  })
341
365
 
342
366
  it('should validate dateExact rule', () => {
@@ -364,6 +388,18 @@ describe('useFieldValidation', () => {
364
388
  }])[0]!
365
389
  expect(ruleWithoutDate(new Date())).toEqual({ error: 'Configuration de la règle invalide' })
366
390
  expect(rule('')).toEqual({}) // Empty string should be ignored
391
+
392
+ const ruleWithEmptyDate = generateRules([{
393
+ type: 'dateExact',
394
+ options: { date: '', message: 'Date must be exactly the reference date.' },
395
+ }])[0]!
396
+ expect(ruleWithEmptyDate(new Date())).toEqual({})
397
+
398
+ const ruleWithUndefinedDate = generateRules([{
399
+ type: 'dateExact',
400
+ options: { date: undefined as unknown as string, message: 'Date must be exactly the reference date.' },
401
+ }])[0]!
402
+ expect(ruleWithUndefinedDate(new Date())).toEqual({})
367
403
  })
368
404
 
369
405
  it('should throw when date reference is not a string in dateExact rule', () => {
@@ -376,7 +412,7 @@ describe('useFieldValidation', () => {
376
412
  },
377
413
  }])[0]!
378
414
  invalidRule(new Date())
379
- }).toThrow('Date reference must be a string in DD/MM/YYYY format')
415
+ }).toThrow('La date de référence doit être une chaîne au format DD/MM/YYYY')
380
416
  })
381
417
 
382
418
  it('should validate custom rule', () => {
@@ -233,14 +233,19 @@ export function useFieldValidation() {
233
233
  }
234
234
 
235
235
  case 'notBeforeDate': {
236
- if (typeof options.date === 'undefined') {
236
+ const hasDateOption = Object.prototype.hasOwnProperty.call(options, 'date')
237
+ if (!hasDateOption) {
237
238
  return { error: 'Configuration de la règle invalide' }
238
239
  }
239
240
  // Si la valeur est null ou vide, ne pas valider (champ vide autorisé)
240
241
  if (value === null || value === undefined || value === '') {
241
242
  return {}
242
243
  }
243
- if (options.date === null || (typeof options.date === 'string' && options.date.trim() === '')) {
244
+ if (
245
+ options.date === undefined
246
+ || options.date === null
247
+ || (typeof options.date === 'string' && options.date.trim() === '')
248
+ ) {
244
249
  return {}
245
250
  }
246
251
  const dateValue = parseDate(value)
@@ -250,7 +255,7 @@ export function useFieldValidation() {
250
255
 
251
256
  // Check if options.date is a string and in DD/MM/YYYY format
252
257
  if (typeof options.date !== 'string') {
253
- throw new Error('Date reference must be a string in DD/MM/YYYY format')
258
+ throw new Error('La date de référence doit être une chaîne au format DD/MM/YYYY')
254
259
  }
255
260
 
256
261
  const referenceDate = parseDate(options.date)
@@ -269,14 +274,19 @@ export function useFieldValidation() {
269
274
  }
270
275
 
271
276
  case 'notAfterDate': {
272
- if (typeof options.date === 'undefined') {
277
+ const hasDateOption = Object.prototype.hasOwnProperty.call(options, 'date')
278
+ if (!hasDateOption) {
273
279
  return { error: 'Configuration de la règle invalide' }
274
280
  }
275
281
  // Si la valeur est null ou vide, ne pas valider (champ vide autorisé)
276
282
  if (value === null || value === undefined || value === '') {
277
283
  return {}
278
284
  }
279
- if (options.date === null || (typeof options.date === 'string' && options.date.trim() === '')) {
285
+ if (
286
+ options.date === undefined
287
+ || options.date === null
288
+ || (typeof options.date === 'string' && options.date.trim() === '')
289
+ ) {
280
290
  return {}
281
291
  }
282
292
  const dateValue = parseDate(value)
@@ -286,7 +296,7 @@ export function useFieldValidation() {
286
296
 
287
297
  // Check if options.date is a string and in DD/MM/YYYY format
288
298
  if (typeof options.date !== 'string') {
289
- throw new Error('Date reference must be a string in DD/MM/YYYY format')
299
+ throw new Error('La date de référence doit être une chaîne au format DD/MM/YYYY')
290
300
  }
291
301
 
292
302
  const referenceDate = parseDate(options.date)
@@ -305,14 +315,19 @@ export function useFieldValidation() {
305
315
  }
306
316
 
307
317
  case 'dateExact': {
308
- if (typeof options.date === 'undefined') {
318
+ const hasDateOption = Object.prototype.hasOwnProperty.call(options, 'date')
319
+ if (!hasDateOption) {
309
320
  return { error: 'Configuration de la règle invalide' }
310
321
  }
311
322
  // Si la valeur est null ou vide, ne pas valider (champ vide autorisé)
312
323
  if (value === null || value === undefined || value === '') {
313
324
  return {}
314
325
  }
315
- if (options.date === null || (typeof options.date === 'string' && options.date.trim() === '')) {
326
+ if (
327
+ options.date === undefined
328
+ || options.date === null
329
+ || (typeof options.date === 'string' && options.date.trim() === '')
330
+ ) {
316
331
  return {}
317
332
  }
318
333
  const dateValue = parseDate(value)
@@ -321,7 +336,7 @@ export function useFieldValidation() {
321
336
  }
322
337
 
323
338
  if (typeof options.date !== 'string') {
324
- throw new Error('Date reference must be a string in DD/MM/YYYY format')
339
+ throw new Error('La date de référence doit être une chaîne au format DD/MM/YYYY')
325
340
  }
326
341
 
327
342
  const referenceDate = parseDate(options.date)
@@ -366,6 +381,13 @@ export function useFieldValidation() {
366
381
  if (result === true) {
367
382
  return { success: options.successMessage || baseMessages.success }
368
383
  }
384
+ // If result is undefined or falsy but not true, treat as invalid
385
+ if (result === false) {
386
+ return options.isWarning
387
+ ? { warning: options.warningMessage || baseMessages.warning }
388
+ : { error: options.message || baseMessages.error }
389
+ }
390
+ // If result is a string, use it as error/warning message
369
391
  return options.isWarning
370
392
  ? { warning: typeof result === 'string' ? result : options.warningMessage || baseMessages.warning }
371
393
  : { error: typeof result === 'string' ? result : options.message || baseMessages.error }
@@ -0,0 +1,141 @@
1
+ import { computed, watch, type Ref } from 'vue'
2
+ import { useValidation, type ValidationRule } from '@/composables/validation/useValidation'
3
+ import { useValidatable } from '@/composables/validation/useValidatable'
4
+
5
+ export interface UseFormFieldErrorHandlingProps {
6
+ errorMessages?: string[] | null
7
+ warningMessages?: string[] | null
8
+ successMessages?: string[] | null
9
+ hasError?: boolean
10
+ hasWarning?: boolean
11
+ hasSuccess?: boolean
12
+ customRules?: ValidationRule[]
13
+ customWarningRules?: ValidationRule[]
14
+ customSuccessRules?: ValidationRule[]
15
+ showSuccessMessages?: boolean
16
+ disableErrorHandling?: boolean
17
+ required?: boolean
18
+ label?: string
19
+ isValidateOnBlur?: boolean
20
+ }
21
+
22
+ export interface UseFormFieldErrorHandlingReturn {
23
+ validation: ReturnType<typeof useValidation>
24
+ hasError: Ref<boolean>
25
+ hasWarning: Ref<boolean>
26
+ hasSuccess: Ref<boolean>
27
+ errors: Ref<string[]>
28
+ warnings: Ref<string[]>
29
+ successes: Ref<string[]>
30
+ validateField: (value: unknown) => boolean
31
+ validateOnSubmit: () => boolean
32
+ checkErrorOnBlur: () => void
33
+ }
34
+
35
+ export const useFormFieldErrorHandling = (
36
+ props: UseFormFieldErrorHandlingProps,
37
+ modelValue: Ref<unknown>,
38
+ emitUpdate?: () => void,
39
+ ): UseFormFieldErrorHandlingReturn => {
40
+ const validation = useValidation({
41
+ customRules: props.customRules || [],
42
+ warningRules: props.customWarningRules || [],
43
+ successRules: props.customSuccessRules || [],
44
+ showSuccessMessages: props.showSuccessMessages ?? true,
45
+ fieldIdentifier: props.label,
46
+ disableErrorHandling: props.disableErrorHandling ?? false,
47
+ })
48
+
49
+ // Synchronisation des messages externes
50
+ watch(() => props.errorMessages, (newVal) => {
51
+ validation.errors.value = newVal || []
52
+ }, { immediate: true })
53
+
54
+ watch(() => props.warningMessages, (newVal) => {
55
+ validation.warnings.value = newVal || []
56
+ }, { immediate: true })
57
+
58
+ watch(() => props.successMessages, (newVal) => {
59
+ validation.successes.value = newVal || []
60
+ }, { immediate: true })
61
+
62
+ // Construction des règles de validation
63
+ const defaultRules = computed<ValidationRule[]>(() => props.required
64
+ ? [{
65
+ type: 'required',
66
+ options: {
67
+ message: `Le champ ${props.label || 'ce champ'} est requis.`,
68
+ fieldIdentifier: props.label,
69
+ },
70
+ }]
71
+ : [],
72
+ )
73
+
74
+ const validateField = (value: unknown) => {
75
+ if (props.disableErrorHandling) {
76
+ return true
77
+ }
78
+
79
+ // Ne pas valider si la valeur est null/undefined et non requise
80
+ if (value == null && !props.required) {
81
+ validation.clearValidation()
82
+ return true
83
+ }
84
+
85
+ const result = validation.validateField(
86
+ value,
87
+ [...defaultRules.value, ...props.customRules!],
88
+ props.customWarningRules!,
89
+ )
90
+
91
+ return !result.hasError
92
+ }
93
+
94
+ const validateOnSubmit = () => {
95
+ return validateField(modelValue.value)
96
+ }
97
+
98
+ const checkErrorOnBlur = () => {
99
+ validateField(modelValue.value)
100
+ if (emitUpdate) {
101
+ emitUpdate()
102
+ }
103
+ }
104
+
105
+ watch(modelValue, (newValue) => {
106
+ if (!props.isValidateOnBlur) {
107
+ validateField(newValue)
108
+ }
109
+ })
110
+
111
+ watch([() => props.required, () => props.label], () => {
112
+ // Re-valider quand les règles changent
113
+ if (modelValue.value != null) {
114
+ validateField(modelValue.value)
115
+ }
116
+ }, { immediate: true })
117
+
118
+ const hasError = computed(() => validation.hasError.value || (props.hasError ?? false))
119
+ const hasWarning = computed(() => validation.hasWarning.value || (props.hasWarning ?? false))
120
+ const hasSuccess = computed(() => ((validation.hasSuccess.value && !hasError.value && !hasWarning.value) || (props.hasSuccess ?? false)) && (props.showSuccessMessages ?? true))
121
+
122
+ const errors = computed(() => [...validation.errors.value, ...(props.errorMessages || [])])
123
+ const warnings = computed(() => validation.warnings.value)
124
+ const successes = computed(() => validation.successes.value)
125
+
126
+ // Intégration avec le système de validation du formulaire
127
+ useValidatable(validateOnSubmit, validation.clearValidation)
128
+
129
+ return {
130
+ validation,
131
+ hasError,
132
+ hasWarning,
133
+ hasSuccess,
134
+ errors,
135
+ warnings,
136
+ successes,
137
+ validateField,
138
+ validateOnSubmit,
139
+ checkErrorOnBlur,
140
+ }
141
+ }
package/src/modules.d.ts CHANGED
@@ -2,3 +2,9 @@ declare module '*.svg' {
2
2
  const content: string
3
3
  export default content
4
4
  }
5
+
6
+ declare module '*.mdx' {
7
+ import type { ComponentOptions } from 'vue'
8
+ const component: ComponentOptions
9
+ export default component
10
+ }
@@ -351,6 +351,9 @@ import '../../styles/shared.css';
351
351
 
352
352
  <h4>Outil éventuel</h4>
353
353
  <p>Utilisation du lecteur d'écran pour vérifier la navigation et l'accessibilité des formulaires, tel que l'indication du caractère obligatoire du champ, la liaison du champ aux aides à la saisie ainsi qu'aux messages d'erreurs, le comportement à la soumission du formulaire, etc.</p>
354
+
355
+ <h4>Ressources</h4>
356
+ <p><a href="https://bati-itao.github.io/learning/esdc-self-paced-web-accessibility-course/module6/forms-concepts-fr.html">Concepts des formulaires</a></p>
354
357
  </div>
355
358
 
356
359
  <div className="verification-card">
@@ -375,6 +378,8 @@ import '../../styles/shared.css';
375
378
  <li>Les en-têtes de colonnes des tableaux utilisent des balises `th` avec l'attribut `scope="col"`.</li>
376
379
  </ul>
377
380
  </div>
381
+ <h4>Ressources</h4>
382
+ <p><a href="https://bati-itao.github.io/learning/esdc-self-paced-web-accessibility-course/module4/tables-concepts-fr.html">Concepts des tableaux</a></p>
378
383
  </div>
379
384
 
380
385
  <div className="verification-card">
@@ -432,6 +437,8 @@ import '../../styles/shared.css';
432
437
  </ol>
433
438
  <h4>Outil éventuel</h4>
434
439
  <p>Aucun</p>
440
+ <h4>Ressources</h4>
441
+ <p><a href="https://bati-itao.github.io/learning/esdc-self-paced-web-accessibility-course/module9/introduction-fr.html">Concepts des contenus multimédia</a></p>
435
442
  </div>
436
443
 
437
444
  <div className="info-section">
@@ -0,0 +1,19 @@
1
+ import { computed } from 'vue'
2
+ import { useTheme } from 'vuetify'
3
+ import type { ComputedRef } from 'vue'
4
+
5
+ export function useThemeLocales<
6
+ T extends Record<string, unknown> & { default: unknown },
7
+ >(locales: T): {
8
+ themeLocales: ComputedRef<T[keyof T]>
9
+ } {
10
+ const vuetifyTheme = useTheme()
11
+
12
+ const themeLocales = computed((): T[keyof T] => {
13
+ return (locales[vuetifyTheme.name.value as keyof T] ?? locales.default) as T[keyof T]
14
+ })
15
+
16
+ return {
17
+ themeLocales,
18
+ }
19
+ }
@@ -0,0 +1,245 @@
1
+ import { describe, it, expect, beforeEach, vi } from 'vitest'
2
+ import { useThemeLocales } from '../index'
3
+ import { useTheme } from 'vuetify'
4
+ import { nextTick, ref } from 'vue'
5
+ import type { Mock } from 'vitest'
6
+
7
+ // Mock Vuetify
8
+ vi.mock('vuetify', () => ({
9
+ useTheme: vi.fn(),
10
+ }))
11
+
12
+ describe('useThemeLocales', () => {
13
+ let mockTheme: { name: ReturnType<typeof ref<string>> }
14
+
15
+ beforeEach(() => {
16
+ // Reset mock before each test
17
+ vi.clearAllMocks()
18
+
19
+ // Setup default mock theme with reactive ref
20
+ mockTheme = {
21
+ name: ref('default'),
22
+ }
23
+ ;(useTheme as Mock).mockReturnValue(mockTheme)
24
+ })
25
+
26
+ it('should return themeLocales computed property', () => {
27
+ const locales = {
28
+ default: { title: 'Default Title', pageTitle: 'Default', message: 'msg', code: '500' },
29
+ }
30
+
31
+ const { themeLocales } = useThemeLocales(locales)
32
+
33
+ expect(themeLocales).toBeDefined()
34
+ expect(themeLocales.value).toEqual({ title: 'Default Title', pageTitle: 'Default', message: 'msg', code: '500' })
35
+ })
36
+
37
+ it('should return default locale when theme name is not found', () => {
38
+ const locales = {
39
+ default: { title: 'Default Title', message: 'Default Message', pageTitle: 'Default', code: '500' },
40
+ cnam: { title: 'CNAM Title', message: 'CNAM Message', pageTitle: 'CNAM', code: '500' },
41
+ }
42
+
43
+ mockTheme.name.value = 'unknown'
44
+
45
+ const { themeLocales } = useThemeLocales(locales)
46
+
47
+ expect(themeLocales.value).toEqual({
48
+ title: 'Default Title',
49
+ message: 'Default Message',
50
+ pageTitle: 'Default',
51
+ code: '500',
52
+ })
53
+ })
54
+
55
+ it('should return locale for cnam theme', () => {
56
+ const locales = {
57
+ default: { title: 'Default Title', pageTitle: 'Default', message: 'msg', code: '500' },
58
+ cnam: { title: 'CNAM Title', message: 'CNAM Message', pageTitle: 'CNAM', code: '500' },
59
+ }
60
+
61
+ mockTheme.name.value = 'cnam'
62
+
63
+ const { themeLocales } = useThemeLocales(locales)
64
+
65
+ expect(themeLocales.value).toEqual({
66
+ title: 'CNAM Title',
67
+ message: 'CNAM Message',
68
+ pageTitle: 'CNAM',
69
+ code: '500',
70
+ })
71
+ })
72
+
73
+ it('should return locale for ap theme', () => {
74
+ const locales = {
75
+ default: { title: 'Default Title', pageTitle: 'Default', message: 'msg', code: '500' },
76
+ ap: { title: 'AP Title', message: 'AP Message', pageTitle: 'AP', code: '500' },
77
+ }
78
+
79
+ mockTheme.name.value = 'ap'
80
+
81
+ const { themeLocales } = useThemeLocales(locales)
82
+
83
+ expect(themeLocales.value).toEqual({
84
+ title: 'AP Title',
85
+ message: 'AP Message',
86
+ pageTitle: 'AP',
87
+ code: '500',
88
+ })
89
+ })
90
+
91
+ it('should return locale for ap2026 theme', () => {
92
+ const locales = {
93
+ default: { title: 'Default Title', pageTitle: 'Default', message: 'msg', code: '500' },
94
+ ap2026: { title: 'AP 2026 Title', message: 'AP 2026 Message', pageTitle: 'AP2026', code: '500' },
95
+ }
96
+
97
+ mockTheme.name.value = 'ap2026'
98
+
99
+ const { themeLocales } = useThemeLocales(locales)
100
+
101
+ expect(themeLocales.value).toEqual({
102
+ title: 'AP 2026 Title',
103
+ message: 'AP 2026 Message',
104
+ pageTitle: 'AP2026',
105
+ code: '500',
106
+ })
107
+ })
108
+
109
+ it('should update themeLocales when theme changes', async () => {
110
+ const locales = {
111
+ default: { title: 'Default Title', pageTitle: 'Default', message: 'msg', code: '500' },
112
+ cnam: { title: 'CNAM Title', pageTitle: 'CNAM', message: 'msg', code: '500' },
113
+ ap: { title: 'AP Title', pageTitle: 'AP', message: 'msg', code: '500' },
114
+ }
115
+
116
+ // Initial theme
117
+ mockTheme.name.value = 'cnam'
118
+ const { themeLocales } = useThemeLocales(locales)
119
+ expect(themeLocales.value.title).toBe('CNAM Title')
120
+
121
+ // Change theme
122
+ mockTheme.name.value = 'ap'
123
+ await nextTick()
124
+ expect(themeLocales.value.title).toBe('AP Title')
125
+
126
+ // Change to default
127
+ mockTheme.name.value = 'default'
128
+ await nextTick()
129
+ expect(themeLocales.value.title).toBe('Default Title')
130
+ })
131
+
132
+ it('should handle complex locale objects', () => {
133
+ const locales = {
134
+ default: {
135
+ pageTitle: 'Error',
136
+ message: 'An error occurred',
137
+ code: '500',
138
+ src: undefined,
139
+ },
140
+ cnam: {
141
+ pageTitle: 'Error CNAM',
142
+ message: 'An error occurred at CNAM',
143
+ code: '500',
144
+ src: undefined,
145
+ },
146
+ ap: {
147
+ pageTitle: 'Error AP',
148
+ message: 'An error occurred at AP',
149
+ code: '500',
150
+ src: 'image-ap.svg',
151
+ },
152
+ }
153
+
154
+ mockTheme.name.value = 'ap'
155
+
156
+ const { themeLocales } = useThemeLocales(locales)
157
+
158
+ expect(themeLocales.value).toEqual({
159
+ pageTitle: 'Error AP',
160
+ message: 'An error occurred at AP',
161
+ code: '500',
162
+ src: 'image-ap.svg',
163
+ })
164
+ })
165
+
166
+ it('should maintain reactivity across multiple instances', async () => {
167
+ const locales = {
168
+ default: { title: 'Default', pageTitle: 'Default', message: 'msg', code: '500' },
169
+ cnam: { title: 'CNAM', pageTitle: 'CNAM', message: 'msg', code: '500' },
170
+ }
171
+
172
+ const { themeLocales: locales1 } = useThemeLocales(locales)
173
+ const { themeLocales: locales2 } = useThemeLocales(locales)
174
+
175
+ mockTheme.name.value = 'cnam'
176
+ await nextTick()
177
+
178
+ expect(locales1.value.title).toBe('CNAM')
179
+ expect(locales2.value.title).toBe('CNAM')
180
+ })
181
+
182
+ it('should handle locale with null or undefined values', () => {
183
+ const locales = {
184
+ default: { title: 'Default', icon: null, description: undefined, pageTitle: 'Default', message: 'msg', code: '500' },
185
+ cnam: { title: 'CNAM', icon: null, description: undefined, pageTitle: 'CNAM', message: 'msg', code: '500' },
186
+ }
187
+
188
+ mockTheme.name.value = 'cnam'
189
+
190
+ const { themeLocales } = useThemeLocales(locales)
191
+
192
+ expect(themeLocales.value.title).toBe('CNAM')
193
+ expect(themeLocales.value.icon).toBeNull()
194
+ })
195
+
196
+ it('should work with generic type inference', () => {
197
+ const locales = {
198
+ default: { title: 'Default', message: 'Default message', pageTitle: 'Default', code: '500' },
199
+ cnam: {
200
+ title: 'CNAM',
201
+ message: 'CNAM message',
202
+ code: '500',
203
+ pageTitle: 'CNAM',
204
+ },
205
+ }
206
+
207
+ mockTheme.name.value = 'cnam'
208
+
209
+ const { themeLocales } = useThemeLocales(locales)
210
+
211
+ expect(themeLocales.value.title).toBe('CNAM')
212
+ expect(themeLocales.value.message).toBe('CNAM message')
213
+ })
214
+
215
+ it('should prefer theme locale over default when available', () => {
216
+ const locales = {
217
+ default: { title: 'Default Title', message: 'Default Message', pageTitle: 'Default', code: '500' },
218
+ custom: { title: 'Custom Title', message: 'Custom Message', pageTitle: 'Custom', code: '500' },
219
+ }
220
+
221
+ mockTheme.name.value = 'custom'
222
+
223
+ const { themeLocales } = useThemeLocales(locales)
224
+
225
+ expect(themeLocales.value.title).toBe('Custom Title')
226
+ expect(themeLocales.value.message).toBe('Custom Message')
227
+ })
228
+
229
+ it('should fallback to default when accessing non-existent theme', () => {
230
+ const locales = {
231
+ default: { title: 'Default', message: 'Default message', pageTitle: 'Default', code: '500' },
232
+ }
233
+
234
+ mockTheme.name.value = 'nonexistent'
235
+
236
+ const { themeLocales } = useThemeLocales(locales)
237
+
238
+ expect(themeLocales.value).toEqual({
239
+ title: 'Default',
240
+ message: 'Default message',
241
+ pageTitle: 'Default',
242
+ code: '500',
243
+ })
244
+ })
245
+ })
@@ -1,2 +0,0 @@
1
- import { default as MaintenancePage } from './MaintenancePage';
2
- export default MaintenancePage;
@@ -1,14 +0,0 @@
1
- import { Meta, Story } from '@storybook/addon-docs';
2
- import * as AccessStories from './Accessibilite.stories.ts';
3
- import '../../stories/styles/shared.css';
4
-
5
- <Meta of={AccessStories} />
6
-
7
- <div className="header">
8
- <h1>Accessibilité</h1>
9
- <p>Informations sur l'accessibilité du composant</p>
10
- </div>
11
-
12
- <Story of={AccessStories.Legende} />
13
- <br />
14
-