@cnamts/synapse 1.0.20 → 1.0.22

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 (414) hide show
  1. package/dist/{DateFilter-XURUmpMl.js → DateFilter-B5n-ZkLi.js} +29 -24
  2. package/dist/{NumberFilter-BZc0O8wV.js → NumberFilter-CtiZ9uj8.js} +1 -1
  3. package/dist/{PeriodFilter-ZNdXcl3p.js → PeriodFilter-DzqiMb-b.js} +1 -1
  4. package/dist/{SelectFilter-DshYU5OK.js → SelectFilter-BOYlF7rX.js} +1 -1
  5. package/dist/{TextFilter-D_c5dRPl.js → TextFilter-BOFRNfcX.js} +1 -1
  6. package/dist/components/Amelipro/AmeliproAutoCompleteField/AmeliproAutoCompleteField.d.ts +7399 -5967
  7. package/dist/components/Amelipro/AmeliproBtn/AmeliproBtn.d.ts +1 -1
  8. package/dist/components/Amelipro/AmeliproCallback/AmeliproCallback.d.ts +1 -1
  9. package/dist/components/Amelipro/AmeliproCarousel/AmeliproCarousel.d.ts +10 -14
  10. package/dist/components/Amelipro/AmeliproCarousel/AmeliproCarouselItem/AmeliproCarouselItem.d.ts +1 -1
  11. package/dist/components/Amelipro/AmeliproCheckbox/AmeliproCheckbox.d.ts +1 -1
  12. package/dist/components/Amelipro/AmeliproClickableTile/AmeliproClickableTile.d.ts +1 -1
  13. package/dist/components/Amelipro/AmeliproCustomSelector/AmeliproCustomSelector.d.ts +1 -1
  14. package/dist/components/Amelipro/AmeliproErrorTemplate/AmeliproErrorTemplate.d.ts +1 -1
  15. package/dist/components/Amelipro/AmeliproFirstLogin/AmeliproFirstLogin.d.ts +1 -1
  16. package/dist/components/Amelipro/AmeliproFooter/AmeliproFooter.d.ts +8 -8
  17. package/dist/components/Amelipro/AmeliproHeader/AmeliproHeader.d.ts +3 -3
  18. package/dist/components/Amelipro/AmeliproHeader/AmeliproHeaderBar/AmeliproHeaderBar.d.ts +1 -1
  19. package/dist/components/Amelipro/AmeliproHeader/AmeliproHeaderBar/AmeliproHeaderBrandSection/AmeliproHeaderBrandSection.d.ts +1 -1
  20. package/dist/components/Amelipro/AmeliproIcon/AmeliproIcon.d.ts +1 -1
  21. package/dist/components/Amelipro/AmeliproIconBtn/AmeliproIconBtn.d.ts +16 -20
  22. package/dist/components/Amelipro/AmeliproMenu/AmeliproMenu.d.ts +1 -1
  23. package/dist/components/Amelipro/AmeliproPagination/AmeliproPaginationBtn/AmeliproPaginationBtn.d.ts +1 -1
  24. package/dist/components/Amelipro/AmeliproPatientBanner/AmeliproPatientBanner.d.ts +1 -1
  25. package/dist/components/Amelipro/AmeliproPostalAddressField/AmeliproPostalAddressCityRow/AmeliproPostalAddressCityRow.d.ts +1610 -1354
  26. package/dist/components/Amelipro/AmeliproPostalAddressField/AmeliproPostalAddressField.d.ts +2411 -2027
  27. package/dist/components/Amelipro/AmeliproSelect/AmeliproSelect.d.ts +8889 -7327
  28. package/dist/components/Amelipro/AmeliproStateTile/AmeliproStateTile.d.ts +1 -1
  29. package/dist/components/Amelipro/AmeliproStepper/AmeliproStepper.d.ts +2 -6
  30. package/dist/components/Amelipro/AmeliproTabs/AmeliproTabs.d.ts +8888 -7334
  31. package/dist/components/Amelipro/AmeliproTextArea/AmeliproTextArea.d.ts +951 -839
  32. package/dist/components/Amelipro/AmeliproTextField/AmeliproTextField.d.ts +1613 -1357
  33. package/dist/components/Amelipro/AmeliproTileBtn/AmeliproTileBtn.d.ts +223 -203
  34. package/dist/components/Amelipro/AmeliproTransmission/AmeliproTransmission.d.ts +3 -3
  35. package/dist/components/Amelipro/StructureMenu/StructureTabs/StructureTabs.d.ts +3 -7
  36. package/dist/components/CollapsibleList/CollapsibleList.d.ts +4 -1
  37. package/dist/components/CookieBanner/CookieBanner.d.ts +303 -273
  38. package/dist/components/CookiesSelection/CookiesInformation/CookiesInformation.d.ts +1297 -1156
  39. package/dist/components/CookiesSelection/CookiesSelection.d.ts +404 -377
  40. package/dist/components/Customs/Selects/SelectBtnField/SelectBtnField.d.ts +1 -1
  41. package/dist/components/Customs/Selects/SyAutocomplete/SyAutocomplete.d.ts +1088 -847
  42. package/dist/components/Customs/Selects/SyInputSelect/SyInputSelect.d.ts +1 -1
  43. package/dist/components/Customs/Selects/SySelect/SySelect.d.ts +515 -321
  44. package/dist/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.d.ts +162 -0
  45. package/dist/components/Customs/SyCheckBoxGroup/locales.d.ts +3 -0
  46. package/dist/components/Customs/SyCheckBoxGroup/types.d.ts +10 -0
  47. package/dist/components/Customs/SyCheckbox/SyCheckbox.d.ts +1668 -5
  48. package/dist/components/Customs/SyForm/SyForm.d.ts +356 -348
  49. package/dist/components/Customs/SyPagination/SyPagination.d.ts +11 -1
  50. package/dist/components/Customs/SyRadioGroup/SyRadioGroup.d.ts +1609 -4
  51. package/dist/components/Customs/SyTextField/SyTextField.d.ts +1629 -1365
  52. package/dist/components/DataList/DataList.d.ts +1 -1
  53. package/dist/components/DatePicker/CalendarMode/DatePicker.d.ts +3868 -3123
  54. package/dist/components/DatePicker/ComplexDatePicker/ComplexDatePicker.d.ts +1946 -1562
  55. package/dist/components/DatePicker/DateTextInput/DateTextInput.d.ts +833 -687
  56. package/dist/components/DeclarationAccessibilityPage/DeclarationAccessibilityPage.d.ts +60 -0
  57. package/dist/components/DialogBox/DialogBox.d.ts +482 -416
  58. package/dist/components/DownloadBtn/config.d.ts +1 -1
  59. package/dist/components/ErrorPage/ErrorPage.d.ts +5 -12
  60. package/dist/components/ErrorPage/locales.d.ts +18 -3
  61. package/dist/components/FileList/UploadItem/locales.d.ts +4 -0
  62. package/dist/components/FileUpload/FileUpload.d.ts +6 -4
  63. package/dist/components/FileUpload/locales.d.ts +1 -0
  64. package/dist/components/FilterSideBar/FilterSideBar.d.ts +418 -366
  65. package/dist/components/FooterBar/FooterBar.d.ts +13 -1
  66. package/dist/components/FooterBar/locales.d.ts +1 -0
  67. package/dist/components/FooterBar/types.d.ts +1 -0
  68. package/dist/components/HeaderBar/HeaderBar.d.ts +1 -0
  69. package/dist/components/HeaderBar/HeaderLogo/HeaderLogo.d.ts +1 -0
  70. package/dist/components/HeaderNavigationBar/HeaderNavigationBar.d.ts +3 -6
  71. package/dist/components/HeaderToolbar/HeaderToolbar.d.ts +1031 -643
  72. package/dist/components/LangBtn/LangBtn.d.ts +277 -239
  73. package/dist/components/LogoBrandSection/LogoBrandSection.d.ts +4 -0
  74. package/dist/components/MaintenancePage/MaintenancePage.d.ts +16 -1
  75. package/dist/components/MaintenancePage/locales.d.ts +18 -2
  76. package/dist/components/NirField/NirField.d.ts +1659 -1371
  77. package/dist/components/NotFoundPage/NotFoundPage.d.ts +9 -3
  78. package/dist/components/NotFoundPage/locales.d.ts +20 -4
  79. package/dist/components/PageContainer/PageContainer.d.ts +3 -1
  80. package/dist/components/PasswordField/PasswordField.d.ts +1 -1
  81. package/dist/components/PeriodField/PeriodField.d.ts +7712 -6216
  82. package/dist/components/PhoneField/PhoneField.d.ts +831 -687
  83. package/dist/components/RangeField/RangeSlider/RangeSlider.d.ts +4 -12
  84. package/dist/components/StatusPage/StatusPage.d.ts +50 -0
  85. package/dist/components/SubHeader/SubHeader.d.ts +2 -0
  86. package/dist/components/SyAlert/SyAlert.d.ts +74 -70
  87. package/dist/components/SyBtnMenu/SyBtnMenu.d.ts +10 -1
  88. package/dist/components/SyHeading/SyHeading.d.ts +20 -0
  89. package/dist/components/SyTextArea/SyTextArea.d.ts +476 -420
  90. package/dist/components/Tables/SyServerTable/SyServerTable.d.ts +759 -468
  91. package/dist/components/Tables/SyTable/SyTable.d.ts +761 -470
  92. package/dist/components/Tables/common/SyTableFilter.d.ts +1 -1
  93. package/dist/components/Tables/common/SyTablePagination.d.ts +269 -170
  94. package/dist/components/Tables/common/filters/DateFilter.d.ts +10 -1
  95. package/dist/components/Tables/common/filters/NumberFilter.d.ts +1 -1
  96. package/dist/components/Tables/common/filters/PeriodFilter.d.ts +1 -1
  97. package/dist/components/Tables/common/filters/SelectFilter.d.ts +1 -1
  98. package/dist/components/Tables/common/filters/TextFilter.d.ts +1 -1
  99. package/dist/components/Tables/common/organizeColumns/OrganizeColumns.d.ts +166 -138
  100. package/dist/components/Tables/common/types.d.ts +2 -0
  101. package/dist/components/UploadWorkflow/UploadWorkflow.d.ts +35 -1212
  102. package/dist/components/UserMenuBtn/UserMenuBtn.d.ts +1 -0
  103. package/dist/components/index.d.ts +4 -0
  104. package/dist/components/types.d.ts +2 -0
  105. package/dist/design-system-v3.js +131 -127
  106. package/dist/design-system-v3.umd.cjs +274 -274
  107. package/dist/designTokens/tokens/amelipro/apLightTheme.d.ts +26 -14
  108. package/dist/designTokens/tokens/amelipro/apSemantic.d.ts +19 -13
  109. package/dist/designTokens/tokens/cnam/cnamLightTheme.d.ts +28 -15
  110. package/dist/designTokens/tokens/cnam/cnamSemantic.d.ts +20 -13
  111. package/dist/designTokens/tokens/pa/paLightTheme.d.ts +26 -15
  112. package/dist/designTokens/tokens/pa/paSemantic.d.ts +19 -13
  113. package/dist/main-CEl4J8_T.js +37241 -0
  114. package/dist/style.css +1 -1
  115. package/dist/utils/theme/index.d.ts +6 -0
  116. package/dist/vuetifyConfig.d.ts +14 -14
  117. package/package.json +16 -7
  118. package/src/assets/amelipro/img/logo-amelipro.svg +9 -0
  119. package/src/assets/apTokens.scss +53 -17
  120. package/src/assets/overrides/_icons.scss +12 -2
  121. package/src/assets/overrides/_tooltips.scss +5 -6
  122. package/src/assets/overrides/_typography.scss +17 -2
  123. package/src/assets/overrides/_utilities.scss +49 -3
  124. package/src/assets/tokens.scss +53 -17
  125. package/src/components/Accordion/accessibilite/Accessibility.mdx +5 -4
  126. package/src/components/Amelipro/AmeliproAccordion/AmeliproAccordionTemplate/AmeliproAccordionTemplate.vue +2 -2
  127. package/src/components/Amelipro/AmeliproAccordion/AmeliproAccordionTemplate/__tests__/__snapshots__/AmeliproAccordionTemplate.spec.ts.snap +0 -2
  128. package/src/components/Amelipro/AmeliproAccordionFrieze/AmeliproAccordionFrieze.vue +2 -2
  129. package/src/components/Amelipro/AmeliproAccordionFrieze/__tests__/__snapshots__/AmeliproAccordionFrieze.spec.ts.snap +14 -56
  130. package/src/components/Amelipro/AmeliproAccordionList/AmeliproAccordionList.vue +1 -1
  131. package/src/components/Amelipro/AmeliproAccordionList/__tests__/__snapshots__/AmeliproAccordionList.spec.ts.snap +15 -23
  132. package/src/components/Amelipro/AmeliproAccordionResultList/AmeliproAccordionResultList.vue +1 -1
  133. package/src/components/Amelipro/AmeliproAccordionResultList/__tests__/__snapshots__/AmeliproAccordionResultList.spec.ts.snap +15 -3
  134. package/src/components/Amelipro/AmeliproCarousel/__tests__/__snapshots__/AmeliproCarousel.spec.ts.snap +0 -2
  135. package/src/components/Amelipro/AmeliproClickableTile/tests/__snapshots__/AmeliproClickableTile.spec.ts.snap +0 -98
  136. package/src/components/Amelipro/AmeliproContentLayout/AmeliproContentLayout.mdx +1 -1
  137. package/src/components/Amelipro/AmeliproContentLayout/AmeliproContentLayout.stories.ts +5 -16
  138. package/src/components/Amelipro/AmeliproCopyBtn/AmeliproCopyBtn.mdx +3 -1
  139. package/src/components/Amelipro/AmeliproCopyBtn/AmeliproCopyBtn.stories.ts +7 -0
  140. package/src/components/Amelipro/AmeliproDentalChart/AmeliproTooth/AmeliproTooth.vue +0 -1
  141. package/src/components/Amelipro/AmeliproDentalChart/AmeliproTooth/tests/__snapshots__/AmeliproTooth.spec.ts.snap +0 -1
  142. package/src/components/Amelipro/AmeliproDentalChart/tests/__snapshots__/AmeliproDentalChart.spec.ts.snap +0 -52
  143. package/src/components/Amelipro/AmeliproDialog/__tests__/__snapshots__/AmeliproDialog.spec.ts.snap +6 -0
  144. package/src/components/Amelipro/AmeliproErrorTemplate/AmeliproErrorTemplate.mdx +3 -1
  145. package/src/components/Amelipro/AmeliproErrorTemplate/AmeliproErrorTemplate.stories.ts +19 -0
  146. package/src/components/Amelipro/AmeliproErrorTemplate/AmeliproErrorTemplate.vue +2 -2
  147. package/src/components/Amelipro/AmeliproFirstLogin/AmeliproFirstLogin.vue +3 -4
  148. package/src/components/Amelipro/AmeliproFirstLogin/__tests__/__snapshots__/AmeliproFirstLogin.spec.ts.snap +2 -13
  149. package/src/components/Amelipro/AmeliproFooter/AmeliproFooter.mdx +3 -1
  150. package/src/components/Amelipro/AmeliproFooter/AmeliproFooter.stories.ts +7 -0
  151. package/src/components/Amelipro/AmeliproMenu/__tests__/__snapshots__/AmeliproMenu.spec.ts.snap +8 -0
  152. package/src/components/Amelipro/AmeliproPatientLogged/__tests__/__snapshots__/AmeliproPatientLogged.spec.ts.snap +9 -2
  153. package/src/components/Amelipro/AmeliproPostalAddressField/AmeliproPostalAddressCityRow/__tests__/__snapshots__/AmeliproPostalAddressCityRow.spec.ts.snap +28 -10
  154. package/src/components/Amelipro/AmeliproPostalAddressField/__tests__/__snapshots__/AmeliproPostalAddressField.spec.ts.snap +44 -8
  155. package/src/components/Amelipro/AmeliproResultList/AmeliproResultList.vue +1 -1
  156. package/src/components/Amelipro/AmeliproResultList/__tests__/__snapshots__/AmeliproResultList.spec.ts.snap +15 -3
  157. package/src/components/Amelipro/AmeliproTable/AmeliproTable.vue +1 -1
  158. package/src/components/Amelipro/AmeliproTable/__tests__/__snapshots__/AmeliproTable.spec.ts.snap +0 -1
  159. package/src/components/Amelipro/AmeliproTooltips/__tests__/__snapshots__/AmeliproTooltips.spec.ts.snap +6 -0
  160. package/src/components/Amelipro/AmeliproUpload/__tests__/__snapshots__/AmeliproUpload.spec.ts.snap +2 -4
  161. package/src/components/Amelipro/StructureMenu/StructureList/__tests__/__snapshots__/StructureList.spec.ts.snap +0 -2
  162. package/src/components/Amelipro/UserMenu/__tests__/__snapshots__/UserMenu.spec.ts.snap +8 -0
  163. package/src/components/BackBtn/BackBtn.vue +1 -1
  164. package/src/components/Captcha/tests/__snapshots__/Captcha.spec.ts.snap +36 -18
  165. package/src/components/ChipList/ChipList.vue +4 -2
  166. package/src/components/CollapsibleList/CollapsibleList.stories.ts +8 -3
  167. package/src/components/CollapsibleList/CollapsibleList.vue +14 -6
  168. package/src/components/CollapsibleList/accessibilite/Accessibility.mdx +19 -6
  169. package/src/components/CollapsibleList/tests/CollapsibleList.a11y.spec.ts +1 -0
  170. package/src/components/CollapsibleList/tests/CollapsibleList.spec.ts +2 -0
  171. package/src/components/ContextualMenu/ContextualMenu.stories.ts +0 -3
  172. package/src/components/ContextualMenu/accessibilite/Accessibility.mdx +67 -11
  173. package/src/components/CookieBanner/CookieBanner.stories.ts +21 -20
  174. package/src/components/CookieBanner/CookieBanner.vue +35 -10
  175. package/src/components/CookieBanner/accessibilite/Accessibility.mdx +76 -11
  176. package/src/components/CookieBanner/tests/CookieBanner.spec.ts +56 -4
  177. package/src/components/CookieBanner/tests/__snapshots__/CookieBanner.spec.ts.snap +21 -15
  178. package/src/components/CookiesSelection/CookiesInformation/CookiesInformation.vue +17 -8
  179. package/src/components/CookiesSelection/CookiesInformation/tests/CookiesInformation.a11y.spec.ts +1 -0
  180. package/src/components/CookiesSelection/CookiesInformation/tests/CookiesInformation.spec.ts +5 -0
  181. package/src/components/CookiesSelection/CookiesSelection.vue +7 -2
  182. package/src/components/CookiesSelection/tests/CookiesSelection.a11y.spec.ts +1 -0
  183. package/src/components/CookiesSelection/tests/CookiesSelection.spec.ts +5 -0
  184. package/src/components/CookiesSelection/tests/__snapshots__/CookiesSelection.spec.ts.snap +21 -15
  185. package/src/components/CopyBtn/CopyBtn.vue +6 -4
  186. package/src/components/CopyBtn/accessibilite/Accessibility.mdx +82 -11
  187. package/src/components/CopyBtn/tests/__snapshots__/CopyBtn.spec.ts.snap +5 -1
  188. package/src/components/Customs/Selects/SyInputSelect/SyInputSelect.stories.ts +4 -10
  189. package/src/components/Customs/Selects/SySelect/SySelect.mdx +0 -1
  190. package/src/components/Customs/Selects/SySelect/SySelect.stories.ts +10 -10
  191. package/src/components/Customs/Selects/SySelect/SySelect.vue +17 -0
  192. package/src/components/Customs/Selects/SySelect/composables/useSySelectKeyboard.ts +1 -1
  193. package/src/components/Customs/Selects/SySelect/tests/SySelect.a11y.spec.ts +1 -3
  194. package/src/components/Customs/Selects/SySelect/tests/SySelect.spec.ts +72 -0
  195. package/src/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.mdx +32 -0
  196. package/src/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.stories.ts +856 -0
  197. package/src/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.vue +334 -0
  198. package/src/components/Customs/SyCheckBoxGroup/accessibilite/Accessibility.mdx +243 -0
  199. package/src/components/Customs/SyCheckBoxGroup/locales.ts +3 -0
  200. package/src/components/Customs/SyCheckBoxGroup/tests/SyCheckBoxGroup.a11y.spec.ts +30 -0
  201. package/src/components/Customs/SyCheckBoxGroup/tests/SyCheckBoxGroup.spec.ts +152 -0
  202. package/src/components/Customs/SyCheckBoxGroup/types.ts +10 -0
  203. package/src/components/Customs/SyCheckbox/SyCheckbox.vue +17 -28
  204. package/src/components/Customs/SyCheckbox/accessibilite/Accessibility.mdx +1 -1
  205. package/src/components/Customs/SyForm/SyForm.a11y.spec.ts +1 -1
  206. package/src/components/Customs/SyIcon/SyIcon.a11y.spec.ts +31 -2
  207. package/src/components/Customs/SyIcon/SyIcon.vue +9 -5
  208. package/src/components/Customs/SyPagination/SyPagination.stories.ts +14 -2
  209. package/src/components/Customs/SyPagination/SyPagination.vue +20 -5
  210. package/src/components/Customs/SyPagination/accessibilite/Accessibility.mdx +79 -8
  211. package/src/components/Customs/SyPagination/tests/SyPagination.a11y.spec.ts +38 -12
  212. package/src/components/Customs/SyPagination/tests/SyPagination.spec.ts +12 -0
  213. package/src/components/Customs/SyRadioGroup/SyRadioGroup.vue +16 -43
  214. package/src/components/Customs/SyTextField/SyTextField.stories.ts +4 -0
  215. package/src/components/Customs/SyTextField/SyTextField.vue +39 -5
  216. package/src/components/DatePicker/CalendarMode/DatePicker.stories.ts +28 -3
  217. package/src/components/DatePicker/CalendarMode/DatePicker.vue +55 -19
  218. package/src/components/DatePicker/CalendarMode/tests/DatePicker.spec.ts +9 -3
  219. package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.stories.ts +44 -3
  220. package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.vue +70 -47
  221. package/src/components/DatePicker/ComplexDatePicker/tests/ComplexDatePicker.a11y.spec.ts +9 -1
  222. package/src/components/DatePicker/DateTextInput/DateTextInput.vue +48 -21
  223. package/src/components/DatePicker/DateTextInput/NoCalendar.stories.ts +98 -0
  224. package/src/components/DatePicker/docExamples/BidirectionalComplexValidation.vue +23 -9
  225. package/src/components/DatePicker/docExamples/DatePickerBidirectionalValidation.vue +21 -8
  226. package/src/components/DatePicker/docExamples/DatePickerValidationExamples.vue +50 -22
  227. package/src/components/DatePicker/playground/ComplexDatePickerPlayground.vue +48 -10
  228. package/src/components/DatePicker/playground/DatePickerHolidayRule.vue +16 -3
  229. package/src/components/DeclarationAccessibilityPage/DeclarationAccessibilityPage.mdx +83 -0
  230. package/src/components/DeclarationAccessibilityPage/DeclarationAccessibilityPage.stories.ts +502 -0
  231. package/src/components/DeclarationAccessibilityPage/DeclarationAccessibilityPage.vue +428 -0
  232. package/src/components/DeclarationAccessibilityPage/accessibilite/Accessibility.mdx +75 -0
  233. package/src/components/DeclarationAccessibilityPage/tests/DeclarationAccessibilityPage.a11y.spec.ts +53 -0
  234. package/src/components/DeclarationAccessibilityPage/tests/DeclarationAccessibilityPage.spec.ts +59 -0
  235. package/src/components/DiacriticPicker/DiacriticPicker.vue +20 -1
  236. package/src/components/DialogBox/DialogBox.stories.ts +13 -0
  237. package/src/components/DialogBox/DialogBox.vue +12 -5
  238. package/src/components/DialogBox/accessibilite/Accessibility.mdx +27 -7
  239. package/src/components/DialogBox/tests/DialogBox.a11y.spec.ts +1 -0
  240. package/src/components/DialogBox/tests/DialogBox.spec.ts +40 -6
  241. package/src/components/DownloadBtn/accessibilite/Accessibility.mdx +73 -11
  242. package/src/components/DownloadBtn/config.ts +1 -1
  243. package/src/components/ErrorPage/ErrorPage.mdx +6 -16
  244. package/src/components/ErrorPage/ErrorPage.stories.ts +90 -126
  245. package/src/components/ErrorPage/ErrorPage.vue +44 -125
  246. package/src/components/ErrorPage/accessibilite/Accessibility.mdx +83 -6
  247. package/src/components/ErrorPage/assets/error-ap.svg +1774 -0
  248. package/src/components/ErrorPage/locales.ts +21 -3
  249. package/src/components/ErrorPage/tests/ErrorPage.a11y.spec.ts +5 -13
  250. package/src/components/ErrorPage/tests/ErrorPage.spec.ts +2 -41
  251. package/src/components/ErrorPage/tests/__snapshots__/ErrorPage.spec.ts.snap +10 -266
  252. package/src/components/ExternalLinks/tests/__snapshots__/ExternalLinks.spec.ts.snap +13 -2
  253. package/src/components/FileList/FileList.stories.ts +4 -0
  254. package/src/components/FileList/UploadItem/UploadItem.vue +8 -3
  255. package/src/components/FileList/UploadItem/locales.ts +10 -0
  256. package/src/components/FileList/accessibilite/Accessibility.mdx +55 -7
  257. package/src/components/FileUpload/FileUpload.vue +65 -37
  258. package/src/components/FileUpload/FileUploadContent.vue +1 -1
  259. package/src/components/FileUpload/accessibilite/Accessibility.mdx +48 -5
  260. package/src/components/FileUpload/locales.ts +1 -0
  261. package/src/components/FileUpload/tests/FileUpload.spec.ts +14 -14
  262. package/src/components/FilterInline/FilterInline.stories.ts +0 -15
  263. package/src/components/FilterInline/FilterInline.vue +1 -0
  264. package/src/components/FilterInline/accessibilite/Accessibility.mdx +70 -7
  265. package/src/components/FilterInline/tests/__snapshots__/FilterInline.spec.ts.snap +3 -3
  266. package/src/components/FilterSideBar/FilterSideBar.stories.ts +0 -3
  267. package/src/components/FilterSideBar/FilterSideBar.vue +2 -1
  268. package/src/components/FilterSideBar/accessibilite/Accessibility.mdx +70 -9
  269. package/src/components/FooterBar/FooterBar.stories.ts +316 -48
  270. package/src/components/FooterBar/FooterBar.vue +67 -9
  271. package/src/components/FooterBar/config.ts +2 -2
  272. package/src/components/FooterBar/defaultSocialMediaLinks.ts +6 -4
  273. package/src/components/FooterBar/locales.ts +1 -0
  274. package/src/components/FooterBar/tests/FooterBarConfig.spec.ts +1 -1
  275. package/src/components/FooterBar/tests/__snapshots__/FooterBar.spec.ts.snap +6 -25
  276. package/src/components/FooterBar/types.d.ts +1 -0
  277. package/src/components/HeaderBar/HeaderBar.stories.ts +23 -1
  278. package/src/components/HeaderBar/HeaderBar.vue +4 -0
  279. package/src/components/HeaderBar/HeaderLogo/HeaderLogo.vue +7 -2
  280. package/src/components/HeaderBar/HeaderLogo/tests/HeaderLogo.spec.ts +5 -0
  281. package/src/components/HeaderBar/accessibilite/Accessibility.mdx +24 -5
  282. package/src/components/HeaderBar/tests/HeaderBar.a11y.spec.ts +1 -0
  283. package/src/components/HeaderBar/tests/HeaderBar.spec.ts +3 -0
  284. package/src/components/HeaderNavigationBar/HeaderNavigationBar.stories.ts +4 -0
  285. package/src/components/HeaderNavigationBar/HeaderNavigationBar.vue +2 -0
  286. package/src/components/HeaderNavigationBar/tests/HeaderNavigationBar.spec.ts +3 -0
  287. package/src/components/LogoBrandSection/LogoBrandSection.stories.ts +22 -0
  288. package/src/components/LogoBrandSection/LogoBrandSection.vue +13 -5
  289. package/src/components/LogoBrandSection/tests/LogoBrandSection.a11y.spec.ts +2 -0
  290. package/src/components/LogoBrandSection/tests/LogoBrandSection.spec.ts +44 -0
  291. package/src/components/LogoBrandSection/tests/__snapshots__/LogoBrandSection.spec.ts.snap +2 -0
  292. package/src/components/MaintenancePage/MaintenancePage.mdx +1 -1
  293. package/src/components/MaintenancePage/MaintenancePage.vue +42 -7
  294. package/src/components/MaintenancePage/accessibilite/Accessibility.mdx +63 -6
  295. package/src/components/MaintenancePage/assets/maintenance-ap.svg +1718 -0
  296. package/src/components/MaintenancePage/locales.ts +24 -3
  297. package/src/components/MaintenancePage/tests/MaintenancePage.a11y.spec.ts +76 -3
  298. package/src/components/MaintenancePage/tests/MaintenancePage.spec.ts +60 -2
  299. package/src/components/MaintenancePage/tests/__snapshots__/MaintenancePage.spec.ts.snap +5 -2
  300. package/src/components/NotFoundPage/NotFoundPage.mdx +1 -1
  301. package/src/components/NotFoundPage/NotFoundPage.stories.ts +4 -4
  302. package/src/components/NotFoundPage/NotFoundPage.vue +30 -14
  303. package/src/components/NotFoundPage/accessibilite/Accessibility.mdx +80 -6
  304. package/src/components/NotFoundPage/assets/not-found-ap.svg +2061 -0
  305. package/src/components/NotFoundPage/locales.ts +24 -4
  306. package/src/components/NotFoundPage/tests/NotFoundPage.a11y.spec.ts +217 -4
  307. package/src/components/NotFoundPage/tests/NotFoundPage.spec.ts +123 -12
  308. package/src/components/NotFoundPage/tests/__snapshots__/NotFoundPage.spec.ts.snap +4 -2
  309. package/src/components/NotificationBar/NotificationBar.mdx +2 -2
  310. package/src/components/NotificationBar/accessibilite/Accessibility.mdx +68 -8
  311. package/src/components/PageContainer/PageContainer.stories.ts +47 -0
  312. package/src/components/PageContainer/PageContainer.vue +4 -2
  313. package/src/components/PageContainer/accessibilite/Accessibility.mdx +67 -0
  314. package/src/components/PageContainer/tests/PageContainer.a11y.spec.ts +14 -7
  315. package/src/components/PaginatedTable/PaginatedTable.mdx +3 -3
  316. package/src/components/PaginatedTable/PaginatedTable.stories.ts +9 -1
  317. package/src/components/PeriodField/PeriodField.vue +4 -0
  318. package/src/components/PeriodField/tests/PeriodField.a11y.spec.ts +10 -1
  319. package/src/components/PhoneField/PhoneField.stories.ts +115 -69
  320. package/src/components/PhoneField/PhoneField.vue +152 -83
  321. package/src/components/PhoneField/accessibilite/Accessibility.mdx +306 -9
  322. package/src/components/PhoneField/indicatifs.ts +2 -2
  323. package/src/components/PhoneField/tests/PhoneField.a11y.spec.ts +22 -9
  324. package/src/components/PhoneField/tests/PhoneField.spec.ts +82 -5
  325. package/src/components/SearchListField/SearchListField.vue +1 -1
  326. package/src/components/SearchListField/accessibilite/Accessibility.mdx +69 -9
  327. package/src/components/SearchListField/tests/SearchListField.a11y.spec.ts +37 -0
  328. package/src/components/SocialMediaLinks/DefaultSocialMediaLinks.ts +6 -4
  329. package/src/components/SocialMediaLinks/SocialMediaLinks.mdx +7 -5
  330. package/src/components/SocialMediaLinks/SocialMediaLinks.stories.ts +17 -13
  331. package/src/components/SocialMediaLinks/SocialMediaLinks.vue +10 -2
  332. package/src/components/SocialMediaLinks/accessibilite/Accessibility.mdx +63 -11
  333. package/src/components/SocialMediaLinks/tests/DefaultSocialMediaLinks.spec.ts +5 -5
  334. package/src/components/SocialMediaLinks/tests/SocialMediaLinks.a11y.spec.ts +59 -0
  335. package/src/components/SocialMediaLinks/tests/SocialMediaLinks.spec.ts +9 -7
  336. package/src/components/StatusPage/StatusPage.mdx +31 -0
  337. package/src/components/StatusPage/StatusPage.stories.ts +236 -0
  338. package/src/components/StatusPage/StatusPage.vue +167 -0
  339. package/src/components/StatusPage/accessibilite/Accessibility.mdx +100 -0
  340. package/src/components/StatusPage/tests/StatusPage.a11y.spec.ts +30 -0
  341. package/src/components/StatusPage/tests/StatusPage.spec.ts +53 -0
  342. package/src/components/StatusPage/tests/__snapshots__/StatusPage.spec.ts.snap +272 -0
  343. package/src/components/SubHeader/SubHeader.stories.ts +16 -0
  344. package/src/components/SubHeader/SubHeader.vue +6 -3
  345. package/src/components/SubHeader/accessibilite/Accessibility.mdx +27 -6
  346. package/src/components/SyAlert/SyAlert.vue +21 -20
  347. package/src/components/SyBtnMenu/SyBtnMenu.vue +33 -17
  348. package/src/components/SyBtnMenu/tests/SyBtnMenu.a11y.spec.ts +38 -0
  349. package/src/components/SyBtnMenu/tests/SyBtnMenu.spec.ts +41 -0
  350. package/src/components/SyHeading/SyHeading.vue +18 -0
  351. package/src/components/TableToolbar/TableToolbar.stories.ts +6 -6
  352. package/src/components/TableToolbar/TableToolbar.vue +1 -1
  353. package/src/components/TableToolbar/tests/__snapshots__/TableToolbar.spec.ts.snap +96 -35
  354. package/src/components/Tables/SyServerTable/SyServerTable.vue +2 -0
  355. package/src/components/Tables/SyTable/SyTable.vue +2 -0
  356. package/src/components/Tables/common/SyTablePagination.vue +16 -10
  357. package/src/components/Tables/common/filters/DateFilter.vue +5 -0
  358. package/src/components/Tables/common/tests/SyTablePagination.spec.ts +40 -24
  359. package/src/components/Tables/common/types.ts +3 -0
  360. package/src/components/UploadWorkflow/UploadWorkflow.mdx +11 -1
  361. package/src/components/UploadWorkflow/UploadWorkflow.stories.ts +118 -14
  362. package/src/components/UploadWorkflow/UploadWorkflow.vue +59 -31
  363. package/src/components/UploadWorkflow/accessibilite/Accessibility.mdx +56 -5
  364. package/src/components/UploadWorkflow/accessibilite/UploadWorkflow.a11y.spec.ts +110 -0
  365. package/src/components/UploadWorkflow/tests/UploadWorkflow.spec.ts +37 -7
  366. package/src/components/UploadWorkflow/tests/__snapshots__/UploadWorkflow.spec.ts.snap +139 -112
  367. package/src/components/UploadWorkflow/useFileList.ts +7 -0
  368. package/src/components/UserMenuBtn/UserMenuBtn.stories.ts +53 -31
  369. package/src/components/UserMenuBtn/UserMenuBtn.vue +4 -1
  370. package/src/components/UserMenuBtn/accessibilite/Accessibility.mdx +72 -8
  371. package/src/components/index.ts +4 -0
  372. package/src/components/types.ts +4 -0
  373. package/src/composables/date/tests/useDateInitialization.spec.ts +22 -1
  374. package/src/composables/date/useDateInitializationDayjs.ts +4 -7
  375. package/src/composables/date/useDatePickerAccessibility.ts +2 -3
  376. package/src/composables/rules/tests/useFieldValidation.spec.ts +39 -3
  377. package/src/composables/rules/useFieldValidation.ts +24 -9
  378. package/src/composables/useFilterable/useFilterable.spec.ts +52 -2
  379. package/src/composables/useFilterable/useFilterable.ts +7 -1
  380. package/src/designTokens/tokens/amelipro/apLightTheme.ts +27 -15
  381. package/src/designTokens/tokens/amelipro/apSemantic.ts +21 -15
  382. package/src/designTokens/tokens/cnam/cnamLightTheme.ts +28 -15
  383. package/src/designTokens/tokens/cnam/cnamSemantic.ts +21 -14
  384. package/src/designTokens/tokens/pa/paLightTheme.ts +27 -16
  385. package/src/designTokens/tokens/pa/paSemantic.ts +19 -13
  386. package/src/directives/rgaaSvgFix.ts +2 -7
  387. package/src/stories/Accessibilite/{Audit → AuditEtContreAudit}/Exemptions-derogations.mdx +1 -1
  388. package/src/stories/Accessibilite/AuditEtContreAudit/Introduction.mdx +188 -0
  389. package/src/stories/Accessibilite/{Audit → AuditEtContreAudit}/RGAA.mdx +1 -1
  390. package/src/stories/Accessibilite/Introduction.mdx +22 -3
  391. package/src/stories/Accessibilite/KitDePreAudit/Introduction.mdx +21 -22
  392. package/src/stories/Accessibilite/KitDePreAudit/Preaudit.mdx +7 -0
  393. package/src/stories/DeprecationNotice/DeprecationNotice.ts +41 -0
  394. package/src/stories/DesignTokens/ColorDisplay.vue +12 -5
  395. package/src/stories/DesignTokens/Colors.mdx +8 -59
  396. package/src/stories/DesignTokens/colors.stories.ts +1862 -1071
  397. package/src/stories/EcoConception/EcoGuideComponent.vue +10 -4
  398. package/src/utils/theme/index.ts +19 -0
  399. package/src/utils/theme/tests/useThemeLocales.spec.ts +245 -0
  400. package/dist/components/MaintenancePage/index.d.ts +0 -2
  401. package/dist/main-CuI6xaPq.js +0 -36396
  402. package/src/components/Customs/SyTabs/tests/SyTabs.a11y.spec.ts +0 -51
  403. package/src/components/DataListItem/tests/DataListItem.a11y.spec.ts +0 -31
  404. package/src/components/DatePicker/CalendarMode/tests/DatePicker.a11y.spec.ts +0 -27
  405. package/src/components/DownloadBtn/tests/DownloadBtn.a11y.spec.ts +0 -26
  406. package/src/components/ExternalLinks/tests/ExternalLinks.a11y.spec.ts +0 -39
  407. package/src/components/HeaderNavigationBar/tests/HeaderNavigationBar.a11y.spec.ts +0 -45
  408. package/src/components/HeaderToolbar/tests/HeaderToolbar.a11y.spec.ts +0 -25
  409. package/src/components/LunarCalendar/tests/LunarCalendar.a11y.spec.ts +0 -31
  410. package/src/components/MaintenancePage/index.ts +0 -3
  411. package/src/components/PageContainer/Accessibilite/Accessibility.mdx +0 -53
  412. package/src/components/PageContainer/Accessibilite/AccessibilityGuide.mdx +0 -0
  413. package/src/components/PaginatedTable/tests/PaginatedTable.a11y.spec.ts +0 -43
  414. /package/src/components/NotFoundPage/assets/{not-found.svg → not-found-cnam.svg} +0 -0
@@ -0,0 +1,152 @@
1
+ import SyCheckBoxGroup from '../SyCheckBoxGroup.vue'
2
+ import SyCheckbox from '@/components/Customs/SyCheckbox/SyCheckbox.vue'
3
+ import { mount } from '@vue/test-utils'
4
+ import { describe, it, expect } from 'vitest'
5
+ import { nextTick } from 'vue'
6
+
7
+ describe('SyCheckBoxGroup', () => {
8
+ it('should render correctly', () => {
9
+ const wrapper = mount(SyCheckBoxGroup, {
10
+ props: {
11
+ label: 'Test checkbox group',
12
+ options: [
13
+ { label: 'A', value: 'A', id: 'opt-a' },
14
+ { label: 'B', value: 'B', id: 'opt-b' },
15
+ ],
16
+ },
17
+ })
18
+
19
+ expect(wrapper.find('.sy-checkbox-group').exists()).toBe(true)
20
+ expect(wrapper.text()).toContain('Test checkbox group')
21
+ expect(wrapper.findAll('input[type="checkbox"]').length).toBe(2)
22
+ })
23
+
24
+ it('should handle v-model correctly (single)', async () => {
25
+ const wrapper = mount(SyCheckBoxGroup, {
26
+ props: {
27
+ 'modelValue': null,
28
+ 'onUpdate:modelValue': e => wrapper.setProps({ modelValue: e }),
29
+ 'options': [
30
+ { label: 'Option A', value: 'A', id: 'opt-a' },
31
+ { label: 'Option B', value: 'B', id: 'opt-b' },
32
+ ],
33
+ },
34
+ })
35
+
36
+ const checkboxes = wrapper.findAllComponents(SyCheckbox)
37
+ expect(checkboxes.length).toBe(2)
38
+
39
+ await checkboxes[0]?.find('input').setValue(true)
40
+
41
+ expect(wrapper.emitted('update:modelValue')?.[0]).toEqual(['A'])
42
+ expect(wrapper.emitted('change')?.[0]).toEqual(['A'])
43
+
44
+ // Uncheck
45
+ await checkboxes[0]?.find('input').setValue(false)
46
+ expect(wrapper.emitted('update:modelValue')?.[1]).toEqual([null])
47
+ expect(wrapper.emitted('change')?.[1]).toEqual([null])
48
+ })
49
+
50
+ it('should handle v-model correctly (multiple)', async () => {
51
+ const wrapper = mount(SyCheckBoxGroup, {
52
+ props: {
53
+ 'multiple': true,
54
+ 'modelValue': [],
55
+ 'onUpdate:modelValue': e => wrapper.setProps({ modelValue: e }),
56
+ 'options': [
57
+ { label: 'Option A', value: 'A', id: 'opt-a' },
58
+ { label: 'Option B', value: 'B', id: 'opt-b' },
59
+ ],
60
+ },
61
+ })
62
+
63
+ const checkboxes = wrapper.findAllComponents(SyCheckbox)
64
+ expect(checkboxes.length).toBe(2)
65
+
66
+ await checkboxes[0]?.find('input').setValue(true)
67
+ expect(wrapper.emitted('update:modelValue')?.[0]).toEqual([['A']])
68
+
69
+ await checkboxes[1]?.find('input').setValue(true)
70
+ expect(wrapper.emitted('update:modelValue')?.[1]).toEqual([['A', 'B']])
71
+ })
72
+
73
+ it('should handle validation correctly (required)', async () => {
74
+ const wrapper = mount(SyCheckBoxGroup, {
75
+ props: {
76
+ 'modelValue': null,
77
+ 'label': 'Required CheckBoxGroup',
78
+ 'required': true,
79
+ 'isValidateOnBlur': false,
80
+ 'onUpdate:modelValue': e => wrapper.setProps({ modelValue: e }),
81
+ 'options': [{ label: 'X', value: 'X', id: 'opt-x' }],
82
+ },
83
+ })
84
+
85
+ await wrapper.vm.validateOnSubmit()
86
+ await nextTick()
87
+ expect(wrapper.vm.validation.hasError.value).toBe(true)
88
+ expect(wrapper.vm.validation.errors.value[0]).toContain('est requis')
89
+
90
+ await wrapper.find('input').setValue(true)
91
+
92
+ await wrapper.vm.validateOnSubmit()
93
+ await nextTick()
94
+
95
+ expect(wrapper.vm.validation.hasError.value).toBe(false)
96
+ expect(wrapper.props('modelValue')).toBe('X')
97
+ })
98
+
99
+ it('should handle readonly and disabled states', async () => {
100
+ const wrapper = mount(SyCheckBoxGroup, {
101
+ props: {
102
+ modelValue: null,
103
+ readonly: true,
104
+ options: [{ label: 'X', value: 'X', id: 'opt-x' }],
105
+ },
106
+ })
107
+
108
+ wrapper.findComponent(SyCheckbox).vm.$emit('update:modelValue', true)
109
+ await nextTick()
110
+ expect(wrapper.emitted('update:modelValue')).toBeFalsy()
111
+
112
+ await wrapper.setProps({ readonly: false, disabled: true })
113
+ wrapper.findComponent(SyCheckbox).vm.$emit('update:modelValue', true)
114
+ await nextTick()
115
+ expect(wrapper.emitted('update:modelValue')).toBeFalsy()
116
+ })
117
+
118
+ it('should handle custom validation rules', async () => {
119
+ const customRule = {
120
+ type: 'custom',
121
+ options: {
122
+ validate: (value: unknown) => value === 'OK',
123
+ message: 'Vous devez sélectionner une option.',
124
+ fieldIdentifier: 'Custom CheckBoxGroup',
125
+ },
126
+ }
127
+
128
+ const wrapper = mount(SyCheckBoxGroup, {
129
+ props: {
130
+ 'modelValue': null,
131
+ 'required': true,
132
+ 'customRules': [customRule],
133
+ 'isValidateOnBlur': false,
134
+ 'options': [
135
+ { label: 'Non', value: 'NO', id: 'opt-no' },
136
+ { label: 'Oui', value: 'OK', id: 'opt-ok' },
137
+ ],
138
+ 'onUpdate:modelValue': e => wrapper.setProps({ modelValue: e }),
139
+ },
140
+ })
141
+
142
+ const isValidInitial = await wrapper.vm.validateOnSubmit()
143
+ expect(isValidInitial).toBe(false)
144
+ expect(wrapper.vm.validation.errors.value).toContain('Vous devez sélectionner une option.')
145
+
146
+ await wrapper.setProps({ modelValue: 'OK' })
147
+
148
+ const isValidCorrect = await wrapper.vm.validateOnSubmit()
149
+ expect(isValidCorrect).toBe(true)
150
+ expect(wrapper.vm.validation.errors.value).toHaveLength(0)
151
+ })
152
+ })
@@ -0,0 +1,10 @@
1
+ export type Option = {
2
+ label: string
3
+ value: string | number
4
+ disabled?: boolean
5
+ readonly?: boolean
6
+ id?: string
7
+ name?: string
8
+ ariaLabel?: string
9
+ title?: string
10
+ }
@@ -1,5 +1,6 @@
1
1
  <script lang="ts" setup>
2
- import { computed, ref, watch, onMounted, nextTick } from 'vue'
2
+ import { computed, ref, watch, onMounted, onUpdated, nextTick } from 'vue'
3
+ import type { VCheckbox } from 'vuetify/components'
3
4
  import { useValidation, type ValidationRule } from '@/composables/validation/useValidation'
4
5
  import { useValidatable } from '@/composables/validation/useValidatable'
5
6
  import { locales } from './locales'
@@ -70,6 +71,8 @@
70
71
 
71
72
  const emit = defineEmits(['update:modelValue', 'update:indeterminate', 'change'])
72
73
 
74
+ const checkboxRef = ref<VCheckbox | null>(null)
75
+
73
76
  const internalIndeterminate = ref(props.indeterminate)
74
77
 
75
78
  const generatedLabel = computed(() => {
@@ -203,7 +206,7 @@
203
206
 
204
207
  const ariaChecked = computed(() => {
205
208
  if (internalIndeterminate.value) return 'mixed'
206
- return model.value ? 'true' : 'false'
209
+ return model.value ? 'true' : undefined
207
210
  })
208
211
 
209
212
  const labelColor = computed(() => {
@@ -239,39 +242,24 @@
239
242
  // Fonction pour supprimer les attributs ARIA non désirés des éléments input
240
243
  const removeAriaAttributes = () => {
241
244
  nextTick(() => {
242
- // Sélectionner tous les inputs de type checkbox dans le composant
243
- // Pour aria-disabled
244
- const checkboxInputsDisabled = document.querySelectorAll('input[type="checkbox"][aria-disabled="false"]')
245
- checkboxInputsDisabled.forEach((input) => {
246
- input.removeAttribute('aria-disabled')
247
- })
248
-
249
- // Configurer un MutationObserver pour surveiller les changements futurs
250
- const observer = new MutationObserver((mutations) => {
251
- mutations.forEach(() => {
252
- // Pour aria-disabled
253
- const newCheckboxInputsDisabled = document.querySelectorAll('input[type="checkbox"][aria-disabled="false"]')
254
- newCheckboxInputsDisabled.forEach((input) => {
255
- input.removeAttribute('aria-disabled')
256
- })
257
- })
258
- })
259
-
260
- // Observer le document pour les changements
261
- observer.observe(document.body, {
262
- subtree: true,
263
- childList: true,
264
- attributes: true,
265
- attributeFilter: ['aria-disabled'],
266
- })
245
+ if (checkboxRef.value) {
246
+ const checkboxInput = checkboxRef.value.$el.querySelector('input[type="checkbox"][aria-disabled="false"]')
247
+ if (checkboxInput) {
248
+ checkboxInput.removeAttribute('aria-disabled')
249
+ }
250
+ }
267
251
  })
268
252
  }
269
253
 
270
- // Appliquer la correction lors du montage du composant
254
+ // Appliquer la correction lors du montage et de la mise à jour du composant
271
255
  onMounted(() => {
272
256
  removeAriaAttributes()
273
257
  })
274
258
 
259
+ onUpdated(() => {
260
+ removeAriaAttributes()
261
+ })
262
+
275
263
  // Intégration avec le système de validation du formulaire
276
264
  useValidatable(validateOnSubmit)
277
265
 
@@ -317,6 +305,7 @@
317
305
  <div>
318
306
  <VCheckbox
319
307
  :id="props.id"
308
+ ref="checkboxRef"
320
309
  v-model="model"
321
310
  :name="props.name"
322
311
  :label="generatedLabel"
@@ -3,7 +3,7 @@ import * as SyCheckboxStories from '../SyCheckbox.stories';
3
3
  import AccessibilityIcon from '@/common/imgs/accessibility-svgrepo-com.svg';
4
4
  import '@/stories/styles/shared.css';
5
5
 
6
- <Meta of={SyCheckboxStories} />
6
+ <Meta of={SyCheckboxStories} name="Accessibility" />
7
7
 
8
8
  <div className="accessibility-guide">
9
9
  <div className="header">
@@ -4,7 +4,7 @@ import { describe, it } from 'vitest'
4
4
  import { mount } from '@vue/test-utils'
5
5
  import { axe } from 'vitest-axe'
6
6
  import { assertNoA11yViolations } from '@tests/unit/accessibility/axeUtils'
7
- import SyForm from '../SyForm.vue'
7
+ import SyForm from './SyForm.vue'
8
8
 
9
9
  // Scénario d’accessibilité : formulaire contenant un champ et un bouton de soumission.
10
10
 
@@ -1,6 +1,6 @@
1
1
  // @vitest-environment jsdom
2
2
 
3
- import { describe, it } from 'vitest'
3
+ import { describe, it, expect } from 'vitest'
4
4
  import { mount } from '@vue/test-utils'
5
5
  import { axe } from 'vitest-axe'
6
6
  import { assertNoA11yViolations } from '@tests/unit/accessibility/axeUtils'
@@ -19,7 +19,7 @@ describe('SyIcon – accessibility (axe)', () => {
19
19
  global: {
20
20
  stubs: {
21
21
  'v-icon': {
22
- template: '<span class="v-icon" role="img" :aria-label="ariaLabel"><slot></slot></span>',
22
+ template: '<span class="v-icon" :role="role" :aria-label="ariaLabel" :aria-hidden="ariaHidden"><svg><slot></slot></svg></span>',
23
23
  props: ['color', 'size', 'role', 'aria-hidden', 'aria-label'],
24
24
  },
25
25
  },
@@ -34,4 +34,33 @@ describe('SyIcon – accessibility (axe)', () => {
34
34
  ignoreRules: ['region'],
35
35
  })
36
36
  })
37
+
38
+ it('hides decorative icons from assistive tech (aria-hidden)', async () => {
39
+ const wrapper = mount(SyIcon, {
40
+ props: {
41
+ icon: 'mdi-star',
42
+ decorative: true,
43
+ },
44
+ global: {
45
+ stubs: {
46
+ 'v-icon': {
47
+ template: '<span class="v-icon" :role="role" :aria-label="ariaLabel" :aria-hidden="ariaHidden"><svg><slot></slot></svg></span>',
48
+ props: ['color', 'size', 'role', 'aria-hidden', 'aria-label'],
49
+ },
50
+ },
51
+ directives: {
52
+ 'rgaa-svg-fix': () => {},
53
+ },
54
+ },
55
+ })
56
+
57
+ const iconEl = wrapper.find('.v-icon')
58
+ expect(iconEl.attributes('aria-hidden')).toBe('true')
59
+
60
+ // Axe should not report a visible control with missing label since it is hidden
61
+ const results = await axe(wrapper.element as HTMLElement)
62
+ assertNoA11yViolations(results, 'SyIcon – decorative icon hidden from AT', {
63
+ ignoreRules: ['region'],
64
+ })
65
+ })
37
66
  })
@@ -34,10 +34,12 @@
34
34
  size?: string
35
35
  }>()
36
36
 
37
+ const resolvedDecorative = computed(() => props.decorative ?? true)
38
+
37
39
  // Configuration pour la directive rgaaSvgFix
38
40
  const rgaaSvgFixConfig = computed(() => {
39
41
  return {
40
- isDecorative: props.decorative,
42
+ isDecorative: resolvedDecorative.value,
41
43
  role: props.role,
42
44
  autoDetectButton: props.autoDetectButton,
43
45
  }
@@ -45,16 +47,16 @@
45
47
 
46
48
  // Vérification à l'initialisation du composant
47
49
  onMounted(() => {
48
- checkAccessibility(props.icon, props.decorative, props.label)
50
+ checkAccessibility(props.icon, resolvedDecorative.value, props.label)
49
51
  })
50
52
 
51
53
  // Vérification à chaque changement des props concernées
52
54
  watch(
53
55
  [() => props.decorative, () => props.label, () => props.icon],
54
- ([decorative, label, icon]) => {
56
+ ([, label, icon]) => {
55
57
  checkAccessibility(
56
58
  icon as string,
57
- decorative as boolean | undefined,
59
+ resolvedDecorative.value,
58
60
  label as string | undefined,
59
61
  )
60
62
  },
@@ -66,7 +68,9 @@
66
68
  v-rgaa-svg-fix="rgaaSvgFixConfig"
67
69
  :color="props.color"
68
70
  :size="props.size"
69
- :aria-label="props.label"
71
+ :role="props.role"
72
+ :aria-label="resolvedDecorative ? undefined : props.label"
73
+ :aria-hidden="resolvedDecorative ? 'true' : undefined"
70
74
  >
71
75
  {{ icon }}
72
76
  </v-icon>
@@ -41,6 +41,10 @@ const meta: Meta<typeof SyPagination> = {
41
41
  'append': {
42
42
  description: 'Slot pour ajouter du contenu après la pagination',
43
43
  },
44
+ 'headingLevel': {
45
+ control: { type: 'select' },
46
+ options: [1, 2, 3, 4, 5, 6],
47
+ },
44
48
  },
45
49
  } as Meta<typeof SyPagination>
46
50
 
@@ -57,6 +61,7 @@ export const Default: Story = {
57
61
  },
58
62
  },
59
63
  args: {
64
+ 'headingLevel': 2,
60
65
  'modelValue': 1,
61
66
  'pages': 5,
62
67
  'visible': 5,
@@ -74,6 +79,7 @@ export const Default: Story = {
74
79
  <SyPagination
75
80
  v-model="currentPage"
76
81
  :pages="args.pages"
82
+ :headingLevel="args.headingLevel"
77
83
  :visible="args.visible"
78
84
  :label="args.label"
79
85
  @update:model-value="args['onUpdate:modelValue']"
@@ -92,6 +98,7 @@ export const ManyPages: Story = {
92
98
  },
93
99
  },
94
100
  args: {
101
+ 'headingLevel': 2,
95
102
  'modelValue': 5,
96
103
  'pages': 20,
97
104
  'visible': 5,
@@ -111,6 +118,7 @@ export const ManyPages: Story = {
111
118
  :pages="args.pages"
112
119
  :visible="args.visible"
113
120
  :label="args.label"
121
+ :headingLevel="args.headingLevel"
114
122
  @update:model-value="args['onUpdate:modelValue']"
115
123
  />
116
124
  </div>
@@ -127,6 +135,7 @@ export const CustomButtons: Story = {
127
135
  },
128
136
  },
129
137
  args: {
138
+ 'headingLevel': 2,
130
139
  'modelValue': 5,
131
140
  'pages': 20,
132
141
  'visible': 5,
@@ -145,6 +154,7 @@ export const CustomButtons: Story = {
145
154
  v-model="currentPage"
146
155
  :pages="args.pages"
147
156
  :visible="args.visible"
157
+ :headingLevel="args.headingLevel"
148
158
  :label="args.label"
149
159
  @update:model-value="args['onUpdate:modelValue']"
150
160
  >
@@ -175,6 +185,7 @@ export const Slots: Story = {
175
185
  },
176
186
  },
177
187
  args: {
188
+ 'headingLevel': 2,
178
189
  'modelValue': 3,
179
190
  'pages': 10,
180
191
  'visible': 5,
@@ -186,11 +197,11 @@ export const Slots: Story = {
186
197
  const currentPage = ref(args.modelValue)
187
198
  const itemsPerPage = 10
188
199
  const totalItems = 100
189
-
200
+ const headingLevel = 2
190
201
  const startItem = computed(() => (currentPage.value - 1) * itemsPerPage + 1)
191
202
  const endItem = computed(() => Math.min(currentPage.value * itemsPerPage, totalItems))
192
203
 
193
- return { args, currentPage, totalItems, startItem, endItem }
204
+ return { args, currentPage, totalItems, startItem, endItem, headingLevel }
194
205
  },
195
206
  template: `
196
207
  <div>
@@ -199,6 +210,7 @@ export const Slots: Story = {
199
210
  :pages="args.pages"
200
211
  :visible="args.visible"
201
212
  :label="args.label"
213
+ :headingLevel="args.headingLevel"
202
214
  @update:model-value="args['onUpdate:modelValue']"
203
215
  >
204
216
  <template #prepend>
@@ -1,8 +1,9 @@
1
1
  <script setup lang="ts">
2
2
  import { computed, ref } from 'vue'
3
+ import SyHeading from '@/components/SyHeading/SyHeading.vue'
3
4
 
4
5
  // Props definition
5
- const props = defineProps<{
6
+ const props = withDefaults(defineProps<{
6
7
  /**
7
8
  * Current page number
8
9
  */
@@ -23,7 +24,18 @@
23
24
  * ID of the element controlled by this pagination
24
25
  */
25
26
  ariaControls?: string
26
- }>()
27
+ /**
28
+ * Heading level for the pagination label (for accessibility)
29
+ */
30
+ headingLevel?: 1 | 2 | 3 | 4 | 5 | 6
31
+
32
+ }>(), {
33
+ pages: undefined,
34
+ visible: undefined,
35
+ label: undefined,
36
+ ariaControls: undefined,
37
+ headingLevel: 2,
38
+ })
27
39
 
28
40
  // Default values for optional props
29
41
  const visiblePages = computed(() => props.visible || 5)
@@ -187,12 +199,13 @@
187
199
  :aria-labelledby="uniqueId"
188
200
  :aria-controls="ariaControls"
189
201
  >
190
- <h2
202
+ <SyHeading
191
203
  :id="uniqueId"
192
204
  class="d-sr-only"
205
+ :level="headingLevel"
193
206
  >
194
207
  {{ `${label}` }}
195
- </h2>
208
+ </SyHeading>
196
209
  <ul class="list">
197
210
  <!-- First page button (optional) -->
198
211
  <li v-if="$slots['first-page']">
@@ -390,7 +403,9 @@
390
403
  }
391
404
 
392
405
  &.disabled {
393
- color: rgb(0 0 0 / 60%); /* Increased from 40% to 60% for better contrast */
406
+ color: rgb(0 0 0 / 60%);
407
+
408
+ /* Increased from 40% to 60% for better contrast */
394
409
  border-color: rgb(0 0 0 / 20%);
395
410
  pointer-events: none;
396
411
  }
@@ -1,10 +1,81 @@
1
- import { Meta, Story } from '@storybook/addon-docs';
2
- import * as SyPagination from '../SyPagination.stories';
3
- import '@/stories/styles/shared.css';
1
+ import { Meta, Primary } from '@storybook/blocks';
2
+ import * as SyPaginationStories from '../SyPagination.stories';
3
+ import AccessibilityIcon from '@/common/imgs/accessibility-svgrepo-com.svg';
4
+ import {
5
+ AccessibilityGuideLayout,
6
+ CriteriaSection,
7
+ CriteriaCard,
8
+ DemoSection,
9
+ BestPracticesSection,
10
+ ResourcesSection,
11
+ } from '@/stories/accessibility/AccessibilityGuideLayout.mdx';
4
12
 
5
- <Meta of={SyPagination} />
13
+ <Meta of={SyPaginationStories} />
6
14
 
7
- <div className="header">
8
- <h1>Accessibilité</h1>
9
- <p>Cette page sera bientôt disponible</p>
10
- </div>
15
+ <AccessibilityGuideLayout
16
+ componentName="SyPagination"
17
+ iconSrc={AccessibilityIcon}
18
+ >
19
+ <CriteriaSection>
20
+ <CriteriaCard icon="🧩" title="Niveau de titre configurable via la prop headingLevel">
21
+ <ul>
22
+ <li>Le niveau du titre (h1 à h6) est défini grâce à la propriété <strong>headingLevel</strong> déclarée dans le composant. Si aucune valeur n’est fournie, le composant applique par défaut un titre de niveau h2, défini dans l’implémentation du composant.</li>
23
+ <code>&lt;SyPagination
24
+ :heading-level="2" /&gt; </code>
25
+
26
+ <li><strong>Accessibilité</strong> : Permet que la hiérarchie entre les titres soit pertinente (critère 9.1.1 RGAA) </li>
27
+ </ul>
28
+ </CriteriaCard>
29
+ <CriteriaCard icon="🔍" title="Structure sémantique">
30
+ <ul>
31
+ <li><strong>Zone de navigation</strong> : utilisation de <code>&lt;nav&gt;</code> et <code>&lt;ul&gt;</code> pour structurer la pagination.</li>
32
+ <li><strong>Nom accessible</strong> : titre <code>&lt;h2&gt;</code> caché (classe <code>d-sr-only</code>) relié au <code>nav</code> via <code>aria-labelledby</code>; libellé personnalisable avec la prop <code>label</code> (par défaut «&nbsp;Pagination&nbsp;»).</li>
33
+ <li><strong>Association au contenu</strong> : prise en charge de <code>aria-controls</code> pour relier la pagination à la zone paginée.</li>
34
+ <li><strong>Page active</strong> : l’attribut <code>aria-current="page"</code> est appliqué au lien de la page courante.</li>
35
+ </ul>
36
+ </CriteriaCard>
37
+
38
+ <CriteriaCard icon="⌨️" title="Navigation clavier">
39
+ <ul>
40
+ <li><strong>Tabulation</strong> : l’ordre de tab suit la séquence logique (Précédent → numéros → Suivant).</li>
41
+ <li><strong>Activation</strong> : les liens de pagination se déclenchent à l’Entrée (ou Espace selon le navigateur).</li>
42
+ <li><strong>Focus visible</strong> : le focus natif reste apparent sur les liens (<code>&lt;a&gt;</code>).</li>
43
+ </ul>
44
+ </CriteriaCard>
45
+
46
+ <CriteriaCard icon="📱" title="États et retours d’information">
47
+ <ul>
48
+ <li><strong>Boutons indisponibles</strong> : <code>aria-disabled="true"</code> est ajouté sur «&nbsp;Précédent&nbsp;» / «&nbsp;Suivant&nbsp;» / premières/dernières pages lorsque non actionnables.</li>
49
+ <li><strong>Ellipses non interactives</strong> : les séparateurs «&nbsp;…&nbsp;» sont rendus non cliquables pour éviter la confusion.</li>
50
+ </ul>
51
+ </CriteriaCard>
52
+
53
+ <CriteriaCard icon="🎨" title="Personnalisation accessible">
54
+ <ul>
55
+ <li>Slots pour <code>first-page</code>, <code>previous</code>, <code>next</code>, <code>last-page</code> et <code>page-number</code> afin d’adapter les libellés ou ajouter des icônes.</li>
56
+ <li>Possibilité d’ajouter du contexte via <code>prepend</code> / <code>append</code> (ex. compteur «&nbsp;Éléments 21-40 sur 200&nbsp;»).</li>
57
+ </ul>
58
+ </CriteriaCard>
59
+ </CriteriaSection>
60
+
61
+ <DemoSection componentName="SyPagination">
62
+ <Primary />
63
+ </DemoSection>
64
+
65
+ <BestPracticesSection>
66
+ <ul>
67
+ <li>Renseigner un <strong>label</strong> explicite (ex. «&nbsp;Pagination des résultats de recherche&nbsp;») pour nommer la navigation.</li>
68
+ <li>Relier la pagination à la zone de contenu avec <code>aria-controls</code> et un <code>id</code> stable sur le conteneur paginé.</li>
69
+ <li>Conserver des libellés textuels même si des icônes sont utilisées dans les slots (ou ajouter du texte masqué).</li>
70
+ <li>S’assurer d’un <strong>contraste suffisant</strong> et d’une taille de cible d’au moins 44px pour les liens.</li>
71
+ <li>Limiter le nombre de pages affichées en choisissant un <code>visible</code> adapté et en gardant des libellés courts.</li>
72
+ </ul>
73
+ </BestPracticesSection>
74
+
75
+ <ResourcesSection>
76
+ <ul>
77
+ <li><a href="https://www.w3.org/TR/wai-aria-1.2/#navigation" target="_blank" rel="noopener noreferrer">Rôle ARIA « navigation »</a></li>
78
+ <li><a href="https://www.w3.org/WAI/WCAG21/quickref/#navigation-mechanisms-headings-and-labels" target="_blank" rel="noopener noreferrer">WCAG 2.4 - Mécanismes de navigation</a></li>
79
+ </ul>
80
+ </ResourcesSection>
81
+ </AccessibilityGuideLayout>
@@ -1,27 +1,53 @@
1
1
  // @vitest-environment jsdom
2
2
 
3
- import { describe, it } from 'vitest'
3
+ import { afterEach, beforeEach, describe, it } from 'vitest'
4
4
  import { mount } from '@vue/test-utils'
5
5
  import { axe } from 'vitest-axe'
6
6
  import { assertNoA11yViolations } from '@tests/unit/accessibility/axeUtils'
7
7
  import SyPagination from '../SyPagination.vue'
8
8
 
9
- // Scénario d’accessibilité : pagination avec libellé, aria-controls et page active.
10
-
11
9
  describe('SyPagination – accessibility (axe)', () => {
12
- it('has no obvious axe violations with labelled navigation and active page', async () => {
10
+ beforeEach(() => {
11
+ const content = document.createElement('div')
12
+ content.id = 'paginated-content'
13
+ document.body.appendChild(content)
14
+ })
15
+
16
+ afterEach(() => {
17
+ document.body.innerHTML = ''
18
+ })
19
+
20
+ const baseProps = {
21
+ modelValue: 1,
22
+ pages: 5,
23
+ visible: 5,
24
+ ariaControls: 'paginated-content',
25
+ label: 'Pagination des résultats',
26
+ }
27
+
28
+ it('has no obvious axe violations on default pagination', async () => {
29
+ const wrapper = mount(SyPagination, {
30
+ props: baseProps,
31
+ attachTo: document.body,
32
+ })
33
+ const results = await axe(document.body)
34
+ assertNoA11yViolations(results, 'SyPagination – default')
35
+ wrapper.unmount()
36
+ })
37
+
38
+ it('has no obvious axe violations with ellipses and disabled controls', async () => {
13
39
  const wrapper = mount(SyPagination, {
14
40
  props: {
15
- modelValue: 3,
41
+ modelValue: 1,
16
42
  pages: 10,
17
- label: 'Pagination des résultats',
18
- ariaControls: 'liste-resultats',
43
+ visible: 3,
44
+ ariaControls: 'paginated-content',
45
+ label: 'Pagination ellipses',
19
46
  },
47
+ attachTo: document.body,
20
48
  })
21
-
22
- const results = await axe(wrapper.element as HTMLElement)
23
- assertNoA11yViolations(results, 'SyPagination – labelled navigation', {
24
- ignoreRules: ['region'],
25
- })
49
+ const results = await axe(document.body)
50
+ assertNoA11yViolations(results, 'SyPagination ellipsis variant')
51
+ wrapper.unmount()
26
52
  })
27
53
  })