@cnamts/synapse 1.0.21 → 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 (341) hide show
  1. package/dist/{DateFilter-uN8OURoP.js → DateFilter-B5n-ZkLi.js} +29 -24
  2. package/dist/{NumberFilter-sm1dQNQi.js → NumberFilter-CtiZ9uj8.js} +1 -1
  3. package/dist/{PeriodFilter-Cklsxnh9.js → PeriodFilter-DzqiMb-b.js} +1 -1
  4. package/dist/{SelectFilter-CWefj27Z.js → SelectFilter-BOYlF7rX.js} +1 -1
  5. package/dist/{TextFilter-Ddyj885L.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 +41 -39
  45. package/dist/components/Customs/SyCheckbox/SyCheckbox.d.ts +921 -801
  46. package/dist/components/Customs/SyForm/SyForm.d.ts +356 -348
  47. package/dist/components/Customs/SyPagination/SyPagination.d.ts +11 -1
  48. package/dist/components/Customs/SyRadioGroup/SyRadioGroup.d.ts +907 -795
  49. package/dist/components/Customs/SyTextField/SyTextField.d.ts +1629 -1365
  50. package/dist/components/DataList/DataList.d.ts +1 -1
  51. package/dist/components/DatePicker/CalendarMode/DatePicker.d.ts +3868 -3123
  52. package/dist/components/DatePicker/ComplexDatePicker/ComplexDatePicker.d.ts +1946 -1562
  53. package/dist/components/DatePicker/DateTextInput/DateTextInput.d.ts +833 -687
  54. package/dist/components/DialogBox/DialogBox.d.ts +482 -416
  55. package/dist/components/DownloadBtn/config.d.ts +1 -1
  56. package/dist/components/ErrorPage/ErrorPage.d.ts +4 -0
  57. package/dist/components/FileList/UploadItem/locales.d.ts +4 -0
  58. package/dist/components/FileUpload/FileUpload.d.ts +4 -4
  59. package/dist/components/FileUpload/locales.d.ts +1 -0
  60. package/dist/components/FilterSideBar/FilterSideBar.d.ts +418 -366
  61. package/dist/components/FooterBar/FooterBar.d.ts +13 -1
  62. package/dist/components/FooterBar/locales.d.ts +1 -0
  63. package/dist/components/FooterBar/types.d.ts +1 -0
  64. package/dist/components/HeaderBar/HeaderBar.d.ts +1 -0
  65. package/dist/components/HeaderBar/HeaderLogo/HeaderLogo.d.ts +1 -0
  66. package/dist/components/HeaderNavigationBar/HeaderNavigationBar.d.ts +3 -6
  67. package/dist/components/HeaderToolbar/HeaderToolbar.d.ts +1031 -643
  68. package/dist/components/LangBtn/LangBtn.d.ts +277 -239
  69. package/dist/components/LogoBrandSection/LogoBrandSection.d.ts +4 -0
  70. package/dist/components/MaintenancePage/MaintenancePage.d.ts +16 -1
  71. package/dist/components/NirField/NirField.d.ts +1659 -1371
  72. package/dist/components/NotFoundPage/NotFoundPage.d.ts +9 -3
  73. package/dist/components/PageContainer/PageContainer.d.ts +3 -1
  74. package/dist/components/PasswordField/PasswordField.d.ts +1 -1
  75. package/dist/components/PeriodField/PeriodField.d.ts +7712 -6216
  76. package/dist/components/PhoneField/PhoneField.d.ts +831 -687
  77. package/dist/components/RangeField/RangeSlider/RangeSlider.d.ts +4 -12
  78. package/dist/components/StatusPage/StatusPage.d.ts +12 -1
  79. package/dist/components/SubHeader/SubHeader.d.ts +2 -0
  80. package/dist/components/SyAlert/SyAlert.d.ts +74 -70
  81. package/dist/components/SyBtnMenu/SyBtnMenu.d.ts +10 -1
  82. package/dist/components/SyHeading/SyHeading.d.ts +20 -0
  83. package/dist/components/SyTextArea/SyTextArea.d.ts +476 -420
  84. package/dist/components/Tables/SyServerTable/SyServerTable.d.ts +759 -468
  85. package/dist/components/Tables/SyTable/SyTable.d.ts +761 -470
  86. package/dist/components/Tables/common/SyTableFilter.d.ts +1 -1
  87. package/dist/components/Tables/common/SyTablePagination.d.ts +269 -170
  88. package/dist/components/Tables/common/filters/DateFilter.d.ts +10 -1
  89. package/dist/components/Tables/common/filters/NumberFilter.d.ts +1 -1
  90. package/dist/components/Tables/common/filters/PeriodFilter.d.ts +1 -1
  91. package/dist/components/Tables/common/filters/SelectFilter.d.ts +1 -1
  92. package/dist/components/Tables/common/filters/TextFilter.d.ts +1 -1
  93. package/dist/components/Tables/common/organizeColumns/OrganizeColumns.d.ts +166 -138
  94. package/dist/components/Tables/common/types.d.ts +2 -0
  95. package/dist/components/UploadWorkflow/UploadWorkflow.d.ts +24 -1211
  96. package/dist/components/UserMenuBtn/UserMenuBtn.d.ts +1 -0
  97. package/dist/components/index.d.ts +1 -0
  98. package/dist/components/types.d.ts +2 -0
  99. package/dist/design-system-v3.js +70 -69
  100. package/dist/design-system-v3.umd.cjs +265 -265
  101. package/dist/designTokens/tokens/amelipro/apLightTheme.d.ts +26 -14
  102. package/dist/designTokens/tokens/amelipro/apSemantic.d.ts +19 -13
  103. package/dist/designTokens/tokens/cnam/cnamLightTheme.d.ts +28 -15
  104. package/dist/designTokens/tokens/cnam/cnamSemantic.d.ts +20 -13
  105. package/dist/designTokens/tokens/pa/paLightTheme.d.ts +26 -15
  106. package/dist/designTokens/tokens/pa/paSemantic.d.ts +19 -13
  107. package/dist/main-CEl4J8_T.js +37241 -0
  108. package/dist/style.css +1 -1
  109. package/dist/vuetifyConfig.d.ts +14 -14
  110. package/package.json +13 -7
  111. package/src/assets/amelipro/img/logo-amelipro.svg +9 -0
  112. package/src/assets/apTokens.scss +53 -17
  113. package/src/assets/overrides/_icons.scss +12 -2
  114. package/src/assets/overrides/_tooltips.scss +5 -6
  115. package/src/assets/overrides/_typography.scss +17 -2
  116. package/src/assets/overrides/_utilities.scss +49 -3
  117. package/src/assets/tokens.scss +53 -17
  118. package/src/components/Accordion/accessibilite/Accessibility.mdx +5 -4
  119. package/src/components/Amelipro/AmeliproAccordion/AmeliproAccordionTemplate/AmeliproAccordionTemplate.vue +2 -2
  120. package/src/components/Amelipro/AmeliproAccordion/AmeliproAccordionTemplate/__tests__/__snapshots__/AmeliproAccordionTemplate.spec.ts.snap +0 -2
  121. package/src/components/Amelipro/AmeliproAccordionFrieze/AmeliproAccordionFrieze.vue +2 -2
  122. package/src/components/Amelipro/AmeliproAccordionFrieze/__tests__/__snapshots__/AmeliproAccordionFrieze.spec.ts.snap +14 -56
  123. package/src/components/Amelipro/AmeliproAccordionList/AmeliproAccordionList.vue +1 -1
  124. package/src/components/Amelipro/AmeliproAccordionList/__tests__/__snapshots__/AmeliproAccordionList.spec.ts.snap +15 -23
  125. package/src/components/Amelipro/AmeliproAccordionResultList/AmeliproAccordionResultList.vue +1 -1
  126. package/src/components/Amelipro/AmeliproAccordionResultList/__tests__/__snapshots__/AmeliproAccordionResultList.spec.ts.snap +15 -3
  127. package/src/components/Amelipro/AmeliproCarousel/__tests__/__snapshots__/AmeliproCarousel.spec.ts.snap +0 -2
  128. package/src/components/Amelipro/AmeliproClickableTile/tests/__snapshots__/AmeliproClickableTile.spec.ts.snap +0 -98
  129. package/src/components/Amelipro/AmeliproContentLayout/AmeliproContentLayout.mdx +1 -1
  130. package/src/components/Amelipro/AmeliproContentLayout/AmeliproContentLayout.stories.ts +5 -16
  131. package/src/components/Amelipro/AmeliproCopyBtn/AmeliproCopyBtn.mdx +3 -1
  132. package/src/components/Amelipro/AmeliproCopyBtn/AmeliproCopyBtn.stories.ts +7 -0
  133. package/src/components/Amelipro/AmeliproDentalChart/AmeliproTooth/AmeliproTooth.vue +0 -1
  134. package/src/components/Amelipro/AmeliproDentalChart/AmeliproTooth/tests/__snapshots__/AmeliproTooth.spec.ts.snap +0 -1
  135. package/src/components/Amelipro/AmeliproDentalChart/tests/__snapshots__/AmeliproDentalChart.spec.ts.snap +0 -52
  136. package/src/components/Amelipro/AmeliproDialog/__tests__/__snapshots__/AmeliproDialog.spec.ts.snap +6 -0
  137. package/src/components/Amelipro/AmeliproErrorTemplate/AmeliproErrorTemplate.mdx +3 -1
  138. package/src/components/Amelipro/AmeliproErrorTemplate/AmeliproErrorTemplate.stories.ts +19 -0
  139. package/src/components/Amelipro/AmeliproErrorTemplate/AmeliproErrorTemplate.vue +2 -2
  140. package/src/components/Amelipro/AmeliproFirstLogin/AmeliproFirstLogin.vue +3 -4
  141. package/src/components/Amelipro/AmeliproFirstLogin/__tests__/__snapshots__/AmeliproFirstLogin.spec.ts.snap +2 -13
  142. package/src/components/Amelipro/AmeliproFooter/AmeliproFooter.mdx +3 -1
  143. package/src/components/Amelipro/AmeliproFooter/AmeliproFooter.stories.ts +7 -0
  144. package/src/components/Amelipro/AmeliproMenu/__tests__/__snapshots__/AmeliproMenu.spec.ts.snap +8 -0
  145. package/src/components/Amelipro/AmeliproPatientLogged/__tests__/__snapshots__/AmeliproPatientLogged.spec.ts.snap +9 -2
  146. package/src/components/Amelipro/AmeliproPostalAddressField/AmeliproPostalAddressCityRow/__tests__/__snapshots__/AmeliproPostalAddressCityRow.spec.ts.snap +28 -10
  147. package/src/components/Amelipro/AmeliproPostalAddressField/__tests__/__snapshots__/AmeliproPostalAddressField.spec.ts.snap +44 -8
  148. package/src/components/Amelipro/AmeliproResultList/AmeliproResultList.vue +1 -1
  149. package/src/components/Amelipro/AmeliproResultList/__tests__/__snapshots__/AmeliproResultList.spec.ts.snap +15 -3
  150. package/src/components/Amelipro/AmeliproTable/AmeliproTable.vue +1 -1
  151. package/src/components/Amelipro/AmeliproTable/__tests__/__snapshots__/AmeliproTable.spec.ts.snap +0 -1
  152. package/src/components/Amelipro/AmeliproTooltips/__tests__/__snapshots__/AmeliproTooltips.spec.ts.snap +6 -0
  153. package/src/components/Amelipro/AmeliproUpload/__tests__/__snapshots__/AmeliproUpload.spec.ts.snap +2 -4
  154. package/src/components/Amelipro/StructureMenu/StructureList/__tests__/__snapshots__/StructureList.spec.ts.snap +0 -2
  155. package/src/components/Amelipro/UserMenu/__tests__/__snapshots__/UserMenu.spec.ts.snap +8 -0
  156. package/src/components/BackBtn/BackBtn.vue +1 -1
  157. package/src/components/Captcha/tests/__snapshots__/Captcha.spec.ts.snap +36 -18
  158. package/src/components/ChipList/ChipList.vue +4 -2
  159. package/src/components/CollapsibleList/CollapsibleList.stories.ts +8 -3
  160. package/src/components/CollapsibleList/CollapsibleList.vue +14 -6
  161. package/src/components/CollapsibleList/accessibilite/Accessibility.mdx +19 -6
  162. package/src/components/CollapsibleList/tests/CollapsibleList.a11y.spec.ts +1 -0
  163. package/src/components/CollapsibleList/tests/CollapsibleList.spec.ts +2 -0
  164. package/src/components/CookieBanner/CookieBanner.stories.ts +10 -0
  165. package/src/components/CookieBanner/CookieBanner.vue +15 -5
  166. package/src/components/CookieBanner/accessibilite/Accessibility.mdx +9 -0
  167. package/src/components/CookieBanner/tests/CookieBanner.spec.ts +10 -2
  168. package/src/components/CookieBanner/tests/__snapshots__/CookieBanner.spec.ts.snap +21 -15
  169. package/src/components/CookiesSelection/CookiesInformation/CookiesInformation.vue +17 -8
  170. package/src/components/CookiesSelection/CookiesInformation/tests/CookiesInformation.a11y.spec.ts +1 -0
  171. package/src/components/CookiesSelection/CookiesInformation/tests/CookiesInformation.spec.ts +5 -0
  172. package/src/components/CookiesSelection/CookiesSelection.vue +7 -2
  173. package/src/components/CookiesSelection/tests/CookiesSelection.a11y.spec.ts +1 -0
  174. package/src/components/CookiesSelection/tests/CookiesSelection.spec.ts +5 -0
  175. package/src/components/CookiesSelection/tests/__snapshots__/CookiesSelection.spec.ts.snap +21 -15
  176. package/src/components/CopyBtn/CopyBtn.vue +6 -4
  177. package/src/components/CopyBtn/accessibilite/Accessibility.mdx +82 -11
  178. package/src/components/CopyBtn/tests/__snapshots__/CopyBtn.spec.ts.snap +5 -1
  179. package/src/components/Customs/Selects/SyInputSelect/SyInputSelect.stories.ts +4 -10
  180. package/src/components/Customs/Selects/SySelect/SySelect.mdx +0 -1
  181. package/src/components/Customs/Selects/SySelect/SySelect.stories.ts +10 -10
  182. package/src/components/Customs/Selects/SySelect/SySelect.vue +17 -0
  183. package/src/components/Customs/Selects/SySelect/composables/useSySelectKeyboard.ts +1 -1
  184. package/src/components/Customs/Selects/SySelect/tests/SySelect.a11y.spec.ts +1 -3
  185. package/src/components/Customs/Selects/SySelect/tests/SySelect.spec.ts +72 -0
  186. package/src/components/Customs/SyCheckbox/SyCheckbox.vue +1 -1
  187. package/src/components/Customs/SyIcon/SyIcon.a11y.spec.ts +31 -2
  188. package/src/components/Customs/SyIcon/SyIcon.vue +9 -5
  189. package/src/components/Customs/SyPagination/SyPagination.stories.ts +14 -2
  190. package/src/components/Customs/SyPagination/SyPagination.vue +20 -5
  191. package/src/components/Customs/SyPagination/accessibilite/Accessibility.mdx +79 -8
  192. package/src/components/Customs/SyPagination/tests/SyPagination.a11y.spec.ts +53 -0
  193. package/src/components/Customs/SyPagination/tests/SyPagination.spec.ts +12 -0
  194. package/src/components/Customs/SyTextField/SyTextField.stories.ts +4 -0
  195. package/src/components/Customs/SyTextField/SyTextField.vue +39 -5
  196. package/src/components/DatePicker/CalendarMode/DatePicker.stories.ts +28 -3
  197. package/src/components/DatePicker/CalendarMode/DatePicker.vue +20 -8
  198. package/src/components/DatePicker/CalendarMode/tests/DatePicker.spec.ts +9 -3
  199. package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.stories.ts +1 -1
  200. package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.vue +70 -47
  201. package/src/components/DatePicker/ComplexDatePicker/tests/ComplexDatePicker.a11y.spec.ts +34 -0
  202. package/src/components/DatePicker/DateTextInput/tests/DateTextInput.a11y.spec.ts +27 -0
  203. package/src/components/DatePicker/docExamples/BidirectionalComplexValidation.vue +23 -9
  204. package/src/components/DatePicker/docExamples/DatePickerBidirectionalValidation.vue +21 -8
  205. package/src/components/DatePicker/docExamples/DatePickerValidationExamples.vue +50 -22
  206. package/src/components/DatePicker/playground/ComplexDatePickerPlayground.vue +48 -10
  207. package/src/components/DatePicker/playground/DatePickerHolidayRule.vue +16 -3
  208. package/src/components/DialogBox/DialogBox.stories.ts +13 -0
  209. package/src/components/DialogBox/DialogBox.vue +12 -5
  210. package/src/components/DialogBox/accessibilite/Accessibility.mdx +27 -7
  211. package/src/components/DialogBox/tests/DialogBox.a11y.spec.ts +1 -0
  212. package/src/components/DialogBox/tests/DialogBox.spec.ts +40 -6
  213. package/src/components/DownloadBtn/accessibilite/Accessibility.mdx +73 -11
  214. package/src/components/DownloadBtn/config.ts +1 -1
  215. package/src/components/ErrorPage/ErrorPage.stories.ts +82 -47
  216. package/src/components/ErrorPage/ErrorPage.vue +6 -0
  217. package/src/components/ErrorPage/accessibilite/Accessibility.mdx +15 -0
  218. package/src/components/ErrorPage/tests/__snapshots__/ErrorPage.spec.ts.snap +2 -0
  219. package/src/components/ExternalLinks/tests/__snapshots__/ExternalLinks.spec.ts.snap +13 -2
  220. package/src/components/FileList/FileList.stories.ts +4 -0
  221. package/src/components/FileList/UploadItem/UploadItem.vue +8 -3
  222. package/src/components/FileList/UploadItem/locales.ts +10 -0
  223. package/src/components/FileList/accessibilite/Accessibility.mdx +55 -7
  224. package/src/components/FileUpload/FileUpload.vue +60 -37
  225. package/src/components/FileUpload/FileUploadContent.vue +1 -1
  226. package/src/components/FileUpload/accessibilite/Accessibility.mdx +48 -5
  227. package/src/components/FileUpload/locales.ts +1 -0
  228. package/src/components/FileUpload/tests/FileUpload.spec.ts +14 -14
  229. package/src/components/FilterInline/FilterInline.stories.ts +0 -15
  230. package/src/components/FilterInline/FilterInline.vue +1 -0
  231. package/src/components/FilterInline/accessibilite/Accessibility.mdx +70 -7
  232. package/src/components/FilterInline/tests/__snapshots__/FilterInline.spec.ts.snap +3 -3
  233. package/src/components/FilterSideBar/FilterSideBar.stories.ts +0 -3
  234. package/src/components/FilterSideBar/FilterSideBar.vue +2 -1
  235. package/src/components/FilterSideBar/accessibilite/Accessibility.mdx +70 -9
  236. package/src/components/FooterBar/FooterBar.stories.ts +298 -34
  237. package/src/components/FooterBar/FooterBar.vue +67 -9
  238. package/src/components/FooterBar/config.ts +2 -2
  239. package/src/components/FooterBar/locales.ts +1 -0
  240. package/src/components/FooterBar/tests/FooterBarConfig.spec.ts +1 -1
  241. package/src/components/FooterBar/tests/__snapshots__/FooterBar.spec.ts.snap +6 -25
  242. package/src/components/FooterBar/types.d.ts +1 -0
  243. package/src/components/HeaderBar/HeaderBar.stories.ts +23 -1
  244. package/src/components/HeaderBar/HeaderBar.vue +4 -0
  245. package/src/components/HeaderBar/HeaderLogo/HeaderLogo.vue +7 -2
  246. package/src/components/HeaderBar/HeaderLogo/tests/HeaderLogo.spec.ts +5 -0
  247. package/src/components/HeaderBar/accessibilite/Accessibility.mdx +24 -5
  248. package/src/components/HeaderBar/tests/HeaderBar.a11y.spec.ts +1 -0
  249. package/src/components/HeaderBar/tests/HeaderBar.spec.ts +3 -0
  250. package/src/components/HeaderNavigationBar/HeaderNavigationBar.stories.ts +4 -0
  251. package/src/components/HeaderNavigationBar/HeaderNavigationBar.vue +2 -0
  252. package/src/components/HeaderNavigationBar/tests/HeaderNavigationBar.spec.ts +3 -0
  253. package/src/components/LogoBrandSection/LogoBrandSection.stories.ts +22 -0
  254. package/src/components/LogoBrandSection/LogoBrandSection.vue +13 -5
  255. package/src/components/LogoBrandSection/tests/LogoBrandSection.a11y.spec.ts +2 -0
  256. package/src/components/LogoBrandSection/tests/LogoBrandSection.spec.ts +44 -0
  257. package/src/components/LogoBrandSection/tests/__snapshots__/LogoBrandSection.spec.ts.snap +2 -0
  258. package/src/components/MaintenancePage/MaintenancePage.vue +33 -6
  259. package/src/components/MaintenancePage/accessibilite/Accessibility.mdx +3 -1
  260. package/src/components/MaintenancePage/tests/MaintenancePage.a11y.spec.ts +3 -2
  261. package/src/components/MaintenancePage/tests/MaintenancePage.spec.ts +18 -0
  262. package/src/components/MaintenancePage/tests/__snapshots__/MaintenancePage.spec.ts.snap +2 -0
  263. package/src/components/NotFoundPage/NotFoundPage.stories.ts +1 -1
  264. package/src/components/NotFoundPage/NotFoundPage.vue +16 -5
  265. package/src/components/NotFoundPage/accessibilite/Accessibility.mdx +2 -0
  266. package/src/components/NotFoundPage/tests/NotFoundPage.a11y.spec.ts +49 -0
  267. package/src/components/NotFoundPage/tests/NotFoundPage.spec.ts +25 -2
  268. package/src/components/NotFoundPage/tests/__snapshots__/NotFoundPage.spec.ts.snap +2 -0
  269. package/src/components/PageContainer/PageContainer.stories.ts +47 -0
  270. package/src/components/PageContainer/PageContainer.vue +4 -2
  271. package/src/components/PageContainer/accessibilite/Accessibility.mdx +31 -17
  272. package/src/components/PaginatedTable/PaginatedTable.mdx +3 -3
  273. package/src/components/PaginatedTable/PaginatedTable.stories.ts +9 -1
  274. package/src/components/PeriodField/PeriodField.vue +4 -0
  275. package/src/components/PeriodField/tests/PeriodField.a11y.spec.ts +10 -1
  276. package/src/components/PhoneField/PhoneField.stories.ts +73 -35
  277. package/src/components/PhoneField/PhoneField.vue +152 -83
  278. package/src/components/PhoneField/accessibilite/Accessibility.mdx +306 -9
  279. package/src/components/PhoneField/indicatifs.ts +2 -2
  280. package/src/components/PhoneField/tests/PhoneField.a11y.spec.ts +47 -0
  281. package/src/components/PhoneField/tests/PhoneField.spec.ts +82 -5
  282. package/src/components/SearchListField/SearchListField.vue +1 -1
  283. package/src/components/SearchListField/accessibilite/Accessibility.mdx +69 -9
  284. package/src/components/SearchListField/tests/SearchListField.a11y.spec.ts +37 -0
  285. package/src/components/SocialMediaLinks/SocialMediaLinks.vue +1 -1
  286. package/src/components/StatusPage/StatusPage.mdx +10 -1
  287. package/src/components/StatusPage/StatusPage.stories.ts +43 -0
  288. package/src/components/StatusPage/StatusPage.vue +26 -4
  289. package/src/components/StatusPage/accessibilite/Accessibility.mdx +24 -5
  290. package/src/components/StatusPage/tests/StatusPage.a11y.spec.ts +1 -0
  291. package/src/components/StatusPage/tests/StatusPage.spec.ts +3 -0
  292. package/src/components/StatusPage/tests/__snapshots__/StatusPage.spec.ts.snap +2 -0
  293. package/src/components/SubHeader/SubHeader.stories.ts +16 -0
  294. package/src/components/SubHeader/SubHeader.vue +6 -3
  295. package/src/components/SubHeader/accessibilite/Accessibility.mdx +27 -6
  296. package/src/components/SyAlert/SyAlert.vue +21 -20
  297. package/src/components/SyBtnMenu/SyBtnMenu.vue +33 -17
  298. package/src/components/SyBtnMenu/tests/SyBtnMenu.a11y.spec.ts +38 -0
  299. package/src/components/SyBtnMenu/tests/SyBtnMenu.spec.ts +41 -0
  300. package/src/components/SyHeading/SyHeading.vue +18 -0
  301. package/src/components/TableToolbar/tests/__snapshots__/TableToolbar.spec.ts.snap +96 -30
  302. package/src/components/Tables/SyServerTable/SyServerTable.vue +2 -0
  303. package/src/components/Tables/SyTable/SyTable.vue +2 -0
  304. package/src/components/Tables/common/SyTablePagination.vue +16 -10
  305. package/src/components/Tables/common/filters/DateFilter.vue +5 -0
  306. package/src/components/Tables/common/tests/SyTablePagination.spec.ts +40 -24
  307. package/src/components/Tables/common/types.ts +3 -0
  308. package/src/components/UploadWorkflow/UploadWorkflow.stories.ts +11 -11
  309. package/src/components/UploadWorkflow/UploadWorkflow.vue +30 -13
  310. package/src/components/UploadWorkflow/accessibilite/Accessibility.mdx +56 -5
  311. package/src/components/UploadWorkflow/accessibilite/UploadWorkflow.a11y.spec.ts +110 -0
  312. package/src/components/UploadWorkflow/tests/UploadWorkflow.spec.ts +7 -25
  313. package/src/components/UploadWorkflow/tests/__snapshots__/UploadWorkflow.spec.ts.snap +144 -121
  314. package/src/components/UserMenuBtn/UserMenuBtn.stories.ts +53 -31
  315. package/src/components/UserMenuBtn/UserMenuBtn.vue +4 -1
  316. package/src/components/UserMenuBtn/accessibilite/Accessibility.mdx +72 -8
  317. package/src/components/index.ts +1 -0
  318. package/src/components/types.ts +4 -0
  319. package/src/composables/date/tests/useDateInitialization.spec.ts +22 -1
  320. package/src/composables/date/useDateInitializationDayjs.ts +4 -7
  321. package/src/composables/date/useDatePickerAccessibility.ts +2 -3
  322. package/src/composables/useFilterable/useFilterable.spec.ts +52 -2
  323. package/src/composables/useFilterable/useFilterable.ts +7 -1
  324. package/src/designTokens/tokens/amelipro/apLightTheme.ts +27 -15
  325. package/src/designTokens/tokens/amelipro/apSemantic.ts +21 -15
  326. package/src/designTokens/tokens/cnam/cnamLightTheme.ts +28 -15
  327. package/src/designTokens/tokens/cnam/cnamSemantic.ts +21 -14
  328. package/src/designTokens/tokens/pa/paLightTheme.ts +27 -16
  329. package/src/designTokens/tokens/pa/paSemantic.ts +19 -13
  330. package/src/directives/rgaaSvgFix.ts +2 -7
  331. package/src/stories/Accessibilite/{Audit → AuditEtContreAudit}/Exemptions-derogations.mdx +1 -1
  332. package/src/stories/Accessibilite/AuditEtContreAudit/Introduction.mdx +188 -0
  333. package/src/stories/Accessibilite/{Audit → AuditEtContreAudit}/RGAA.mdx +1 -1
  334. package/src/stories/Accessibilite/Introduction.mdx +22 -3
  335. package/src/stories/Accessibilite/KitDePreAudit/Introduction.mdx +21 -22
  336. package/src/stories/DeprecationNotice/DeprecationNotice.ts +41 -0
  337. package/src/stories/DesignTokens/ColorDisplay.vue +12 -5
  338. package/src/stories/DesignTokens/Colors.mdx +8 -59
  339. package/src/stories/DesignTokens/colors.stories.ts +1862 -1071
  340. package/src/stories/EcoConception/EcoGuideComponent.vue +10 -4
  341. package/dist/main-CWniLr0s.js +0 -36919
@@ -5,9 +5,13 @@
5
5
  import { locales } from './locales'
6
6
  import type { CookieTypes, CookiesItems, Preferences } from './types'
7
7
 
8
- const props = defineProps<{
8
+ const props = withDefaults(defineProps<{
9
9
  items: CookiesItems
10
- }>()
10
+ headingLevel?: 1 | 2 | 3 | 4 | 5 | 6
11
+
12
+ }>(), {
13
+ headingLevel: 2,
14
+ })
11
15
 
12
16
  const emits = defineEmits<{
13
17
  submit: [preferences: Partial<Preferences>]
@@ -109,6 +113,7 @@
109
113
  :type="cookieType"
110
114
  :table-items="cookies"
111
115
  class="mb-6"
116
+ :heading-level="headingLevel"
112
117
  >
113
118
  <template
114
119
  v-for="(_, slotName) in $slots"
@@ -42,6 +42,7 @@ describe('CookiesSelection – accessibility (axe)', () => {
42
42
  it('has no obvious axe violations for full cookie preferences form', async () => {
43
43
  const wrapper = mount(CookiesSelection, {
44
44
  props: {
45
+ headingLevel: 2,
45
46
  items: cookiesList,
46
47
  },
47
48
  })
@@ -35,6 +35,7 @@ describe('CookiesSelection', () => {
35
35
  it('renders correctly', () => {
36
36
  const wrapper = mount(CookiesSelection, {
37
37
  propsData: {
38
+ headingLevel: 2,
38
39
  items: cookiesList,
39
40
  },
40
41
  })
@@ -49,6 +50,7 @@ describe('CookiesSelection', () => {
49
50
  it('sets global preferences', async () => {
50
51
  const wrapper = mount(CookiesSelection, {
51
52
  props: {
53
+ headingLevel: 2,
52
54
  items: cookiesList,
53
55
  },
54
56
  })
@@ -78,6 +80,7 @@ describe('CookiesSelection', () => {
78
80
  it('sets preferences for each category', async () => {
79
81
  const wrapper = mount(CookiesSelection, {
80
82
  props: {
83
+ headingLevel: 2,
81
84
  items: cookiesList,
82
85
  },
83
86
  })
@@ -118,6 +121,7 @@ describe('CookiesSelection', () => {
118
121
  it('requires all categories to be set', async () => {
119
122
  const wrapper = mount(CookiesSelection, {
120
123
  props: {
124
+ headingLevel: 2,
121
125
  items: cookiesList,
122
126
  modelValue: undefined,
123
127
  },
@@ -151,6 +155,7 @@ describe('CookiesSelection', () => {
151
155
  it('displays the cookie description as a scoped slot', () => {
152
156
  const wrapper = mount(CookiesSelection, {
153
157
  props: {
158
+ headingLevel: 2,
154
159
  items: cookiesList,
155
160
  },
156
161
  slots: {
@@ -136,6 +136,7 @@ exports[`CookiesSelection > renders correctly 1`] = `
136
136
  <h2 class="
137
137
  font-weight-bold
138
138
  mb-2
139
+ sy-heading
139
140
  text-subtitle-1
140
141
  ">
141
142
  Cookies requis
@@ -224,14 +225,15 @@ exports[`CookiesSelection > renders correctly 1`] = `
224
225
  <!---->
225
226
  </div>
226
227
  </details>
227
- <div
228
- aria-level="3"
229
- class="vd-cookies-information__heading"
228
+ <h3
229
+ class="
230
+ sy-heading
231
+ vd-cookies-information__heading
232
+ "
230
233
  id="radio-group-essentials"
231
- role="heading"
232
234
  >
233
235
  Accepter les cookies de type Cookies requis, ce champ est requis.
234
- </div>
236
+ </h3>
235
237
  <!-- v-if -->
236
238
  </div>
237
239
  <div class="
@@ -241,6 +243,7 @@ exports[`CookiesSelection > renders correctly 1`] = `
241
243
  <h2 class="
242
244
  font-weight-bold
243
245
  mb-2
246
+ sy-heading
244
247
  text-subtitle-1
245
248
  ">
246
249
  Cookies fonctionnels
@@ -318,14 +321,15 @@ exports[`CookiesSelection > renders correctly 1`] = `
318
321
  <!---->
319
322
  </div>
320
323
  </details>
321
- <div
322
- aria-level="3"
323
- class="vd-cookies-information__heading"
324
+ <h3
325
+ class="
326
+ sy-heading
327
+ vd-cookies-information__heading
328
+ "
324
329
  id="radio-group-functional"
325
- role="heading"
326
330
  >
327
331
  Accepter les cookies de type Cookies fonctionnels, ce champ est requis.
328
- </div>
332
+ </h3>
329
333
  <div class="
330
334
  v-input
331
335
  v-input--center-affix
@@ -444,6 +448,7 @@ exports[`CookiesSelection > renders correctly 1`] = `
444
448
  <h2 class="
445
449
  font-weight-bold
446
450
  mb-2
451
+ sy-heading
447
452
  text-subtitle-1
448
453
  ">
449
454
  Cookies d’analyse
@@ -521,14 +526,15 @@ exports[`CookiesSelection > renders correctly 1`] = `
521
526
  <!---->
522
527
  </div>
523
528
  </details>
524
- <div
525
- aria-level="3"
526
- class="vd-cookies-information__heading"
529
+ <h3
530
+ class="
531
+ sy-heading
532
+ vd-cookies-information__heading
533
+ "
527
534
  id="radio-group-analytics"
528
- role="heading"
529
535
  >
530
536
  Accepter les cookies de type Cookies d’analyse, ce champ est requis.
531
- </div>
537
+ </h3>
532
538
  <div class="
533
539
  v-input
534
540
  v-input--center-affix
@@ -1,5 +1,5 @@
1
1
  <script setup lang="ts">
2
- import { ref, onUnmounted } from 'vue'
2
+ import { ref, onUnmounted, useId } from 'vue'
3
3
  import { mdiContentCopy } from '@mdi/js'
4
4
 
5
5
  import useCustomizableOptions, { type CustomizableOptions } from '@/composables/useCustomizableOptions'
@@ -27,6 +27,7 @@
27
27
 
28
28
  const options = useCustomizableOptions(config, props)
29
29
 
30
+ const id = useId()
30
31
  const tooltip = ref(false)
31
32
  const copyIcon = mdiContentCopy
32
33
  let tooltipTimeoutId: ReturnType<typeof setTimeout> | undefined
@@ -87,7 +88,7 @@
87
88
 
88
89
  <template>
89
90
  <div
90
- :id="props.ariaOwns"
91
+ :id="`${props.ariaOwns}-${id}`"
91
92
  class="sy-copy-btn"
92
93
  >
93
94
  <VTooltip
@@ -96,14 +97,15 @@
96
97
  :open-on-click="true"
97
98
  :open-on-hover="false"
98
99
  :disabled="hideTooltip"
100
+ content-class="tooltip"
99
101
  >
100
102
  <template #activator="{ props: tooltipProps }">
101
103
  <VBtn
102
104
  v-bind="{...tooltipProps,...options.btn}"
103
105
  :aria-label="props.ariaLabel"
104
- :aria-owns="props.ariaOwns"
106
+ :aria-owns="`${props.ariaOwns}-${id}`"
105
107
  :data-test-id="props.ariaOwns"
106
- aria-controls="copy-btn"
108
+ :aria-controls="`copy-btn-${id}`"
107
109
  @click="copy"
108
110
  >
109
111
  <slot name="icon">
@@ -1,15 +1,86 @@
1
- import { Meta, Story } from '@storybook/addon-docs';
2
- import * as Stories from '../CopyBtn.stories.ts';
3
- import '@/stories/styles/shared.css';
1
+ import { Meta, Primary } from '@storybook/blocks';
2
+ import * as CopyBtnStories from '../CopyBtn.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
+ AuditSection
12
+ } from '@/stories/accessibility/AccessibilityGuideLayout.mdx';
4
13
 
5
- <Meta of={Stories} />
14
+ <Meta of={CopyBtnStories}/>
6
15
 
7
- <div className="header">
8
- <h1>Accessibilité</h1>
9
- </div>
16
+ <AccessibilityGuideLayout
17
+ componentName="CopyBtn"
18
+ iconSrc={AccessibilityIcon}
19
+ >
20
+ <CriteriaSection>
21
+ <CriteriaCard icon="🔍" title="Structure sémantique">
22
+ <ul>
23
+ <li><strong>Bouton natif</strong> : utilisation du composant<code>VBtn</code> qui génère un élément <code>&lt;button&gt;</code>, garantissant un comportement accessible par défaut.</li>
24
+ <li><strong>Nom accessible</strong> : l’attribut <code>aria-label</code>permet de fournir une description explicite de l’action (ex. « Copier le numéro de compte »).</li>
25
+ <li><strong>Association ARIA</strong> : les attributs<code>aria-owns</code> et <code>aria-controls</code> peuvent être utilisés pour relier le bouton à un élément spécifique de l’interface.</li>
26
+ <li><strong>Identifiants uniques</strong> : l’utilisation de<code>useId()</code> garantit des identifiants uniques pour chaque instance du composant.</li>
27
+ </ul>
28
+ </CriteriaCard>
10
29
 
30
+ <CriteriaCard icon="⌨️" title="Navigation clavier">
31
+ <ul>
32
+ <li><strong>Tabulation</strong> : le bouton est accessible dans l’ordre de tabulation standard de la page.</li>
33
+ <li><strong>Activation</strong> : l’action de copie peut être déclenchée avec la touche <kbd>Entrée</kbd> ou <kbd>Espace</kbd>.</li>
34
+ <li><strong>Focus visible</strong> : un style de focus est appliqué via<code>:focus-visible</code> pour assurer un repère visuel lors de la navigation clavier.</li>
35
+ </ul>
36
+ </CriteriaCard>
11
37
 
12
- <div class="mt-2">
13
- <p>Rapport d’audit manuel : <a href="/audits/CopyBtn.xlsx" style={{ color:'#0C41BD' }}>Voir le rapport</a></p>
14
- <p style={{ color: 'grey', fontSize: '14px', marginTop: '0px' }}>Correctifs associés (<a href="https://github.com/assurance-maladie-digital/design-system-v3/issues/4008" target="_blank" style={{color:'#0C41BD'}}>issue #4008</a>)</p>
15
- </div>
38
+ <CriteriaCard icon="📢" title="Retour d’information">
39
+ <ul>
40
+ <li><strong>Tooltip informatif</strong> : un message visuel indique que l’action de copie a été effectuée.</li>
41
+ <li><strong>Annonce aux technologies d’assistance</strong> : le message est contenu dans un élément avec <code>role="status"</code>, permettant aux lecteurs d’écran d’annoncer l’information.</li>
42
+ <li><strong>Durée configurable</strong> : l’affichage du tooltip peut être contrôlé via la prop <code>tooltipDuration</code>.</li>
43
+ <li><strong>Désactivation possible</strong> : la prop<code>hideTooltip</code> permet de désactiver l’affichage du retour visuel si nécessaire.</li>
44
+ </ul>
45
+ </CriteriaCard>
46
+
47
+ <CriteriaCard icon="🧩" title="Personnalisation accessible">
48
+ <ul>
49
+ <li><strong>Slots personnalisables</strong> : possibilité de remplacer l’icône ou le contenu du tooltip via les slots<code>icon</code> et <code>tooltip</code>.</li>
50
+ <li><strong>Libellés adaptables</strong> : les propriétés<code>ariaLabel</code> et <code>ariaOwns</code> permettent d’adapter les descriptions selon le contexte.</li>
51
+ <li><strong>Nettoyage du contenu copié</strong> : la prop<code>separatorsToRemove</code> permet de retirer des caractères visuels (ex. espaces ou tirets) avant la copie.</li>
52
+ </ul>
53
+ </CriteriaCard>
54
+ </CriteriaSection>
55
+
56
+ <DemoSection componentName="CopyBtn">
57
+ <Primary/>
58
+ </DemoSection>
59
+
60
+ <BestPracticesSection>
61
+ <ul>
62
+ <li>Fournir un <strong>aria-label explicite</strong> décrivant clairement l’action (ex. « Copier l’adresse email »).</li>
63
+ <li>Conserver un <strong>retour d’information visible ou vocal</strong>après l’action de copie pour informer l’utilisateur.</li>
64
+ <li>Si une icône seule est utilisée, toujours garantir la présence d’un<strong>nom accessible</strong>.</li>
65
+ <li>Veiller à une <strong>taille de cible suffisante</strong>(au moins 44px) pour les interactions tactiles.</li>
66
+ <li>S’assurer que le contenu copié correspond bien à ce que l’utilisateur attend (ex. numéro sans espaces).</li>
67
+ </ul>
68
+ </BestPracticesSection>
69
+
70
+ <ResourcesSection>
71
+ <ul>
72
+ <li><a href="https://www.w3.org/WAI/WCAG22/quickref/#name-role-value" target="_blank" rel="noopener noreferrer">Guide des pratiques d'auteur WAI-ARIA pour les Name, role, value</a></li>
73
+ <li><a href="https://www.w3.org/WAI/WCAG22/Techniques/aria/ARIA22" target="_blank" rel="noopener noreferrer">WAI-ARIA – rôle « status »</a></li>
74
+ <li><a href="https://www.w3.org/WAI/WCAG22/Understanding/focus-visible.html" target="_blank" rel="noopener noreferrer">WCAG 2.2 - Focus Visible</a></li>
75
+ </ul>
76
+ </ResourcesSection>
77
+
78
+ <AuditSection>
79
+
80
+ <div class="mt-2">
81
+ <p>Rapport d’audit manuel : <a href="/audits/CopyBtn.xlsx" style={{color: '#0C41BD'}}>Voir le rapport</a></p>
82
+ <p style={{color: 'grey', fontSize: '14px', marginTop: '0px'}}>Correctifs associés (<a href="https://github.com/assurance-maladie-digital/design-system-v3/issues/4008" target="_blank" style={{color: '#0C41BD'}}>issue #4008</a>)</p>
83
+ </div>
84
+
85
+ </AuditSection>
86
+ </AccessibilityGuideLayout>
@@ -3,7 +3,7 @@
3
3
  exports[`CopyBtn > renders correctly 1`] = `
4
4
  <div
5
5
  class="sy-copy-btn"
6
- id="copy-btn"
6
+ id="copy-btn-v-0"
7
7
  label="test"
8
8
  >
9
9
  <v-tooltip-stub
@@ -12,6 +12,7 @@ exports[`CopyBtn > renders correctly 1`] = `
12
12
  closeonback="false"
13
13
  closeoncontentclick="false"
14
14
  contained="false"
15
+ contentclass="tooltip"
15
16
  disabled="false"
16
17
  eager="true"
17
18
  interactive="false"
@@ -24,8 +25,11 @@ exports[`CopyBtn > renders correctly 1`] = `
24
25
  openonclick="true"
25
26
  openonhover="false"
26
27
  origin="auto"
28
+ persistent="false"
27
29
  scrim="false"
28
30
  scrollstrategy="reposition"
31
+ sticktotarget="false"
32
+ viewportmargin="12"
29
33
  zindex="2000"
30
34
  ></v-tooltip-stub>
31
35
  </div>
@@ -3,6 +3,7 @@ import SyInputSelect from './SyInputSelect.vue'
3
3
  import { VBtn, VMenu, VList, VListItem, VListItemTitle, VForm } from 'vuetify/components'
4
4
  import { ref } from 'vue'
5
5
  import SyAlert from '../../../SyAlert/SyAlert.vue'
6
+ import { createDeprecationNotice } from '@/stories/DeprecationNotice/DeprecationNotice'
6
7
 
7
8
  const meta = {
8
9
  title: 'Composants/Formulaires/Selects/SyInputSelect',
@@ -601,16 +602,9 @@ const validateForm = () => {
601
602
  },
602
603
  }
603
604
 
604
- // depreciation notice
605
605
  export const DeprecationNotice = {
606
- render: () => ({
607
- components: { SyAlert },
608
- template: `
609
- <SyAlert type="warning" variant="tonal" :closable="false">
610
- <b>Ce composant est déprécié</b>, il ne sera plus maintenu ou mis à jour.<br/>
611
- Nous vous recommandons d'utiliser à la place le composant <a class="text-primary" href="/?path=/docs/composants-formulaires-selects-syselect--docs"><code>SySelect</code></a>.
612
- </SyAlert>
613
- `,
614
- }),
606
+ ...createDeprecationNotice([
607
+ { label: 'SySelect', url: '/?path=/docs/composants-formulaires-selects-syselect--docs' },
608
+ ]),
615
609
  tags: ['!dev'],
616
610
  }
@@ -25,7 +25,6 @@ Il est basé sur un `v-textfield`.</p>
25
25
  import { SySelect } from '@cnamts/synapse'
26
26
 
27
27
  const selectedValue = ref(undefined)
28
- import '../../../../stories/styles/shared.css';
29
28
 
30
29
  const items = [
31
30
  { text: 'Option 1', value: '1' },
@@ -116,7 +116,7 @@ type Story = StoryObj<typeof meta>
116
116
  export const Default: Story = {
117
117
  parameters: {
118
118
  a11y: {
119
- disable: true,
119
+ disable: false,
120
120
  },
121
121
  sourceCode: [
122
122
  {
@@ -189,7 +189,7 @@ export const Default: Story = {
189
189
  export const HelpText: Story = {
190
190
  parameters: {
191
191
  a11y: {
192
- disable: true,
192
+ disable: false,
193
193
  },
194
194
  sourceCode: [
195
195
  {
@@ -266,7 +266,7 @@ export const HelpText: Story = {
266
266
  export const Required: Story = {
267
267
  parameters: {
268
268
  a11y: {
269
- disable: true,
269
+ disable: false,
270
270
  },
271
271
  sourceCode: [
272
272
  {
@@ -327,7 +327,7 @@ export const Required: Story = {
327
327
  export const RequiredWithAsterisk: Story = {
328
328
  parameters: {
329
329
  a11y: {
330
- disable: true,
330
+ disable: false,
331
331
  },
332
332
  docs: {
333
333
  description: {
@@ -395,7 +395,7 @@ const items = [
395
395
  export const SlotPrepend: Story = {
396
396
  parameters: {
397
397
  a11y: {
398
- disable: true,
398
+ disable: false,
399
399
  },
400
400
  sourceCode: [
401
401
  {
@@ -462,7 +462,7 @@ export const SlotPrepend: Story = {
462
462
  export const SlotAppend: Story = {
463
463
  parameters: {
464
464
  a11y: {
465
- disable: true,
465
+ disable: false,
466
466
  },
467
467
  sourceCode: [
468
468
  {
@@ -562,7 +562,7 @@ export const WithTooltips: Story = {
562
562
  },
563
563
  parameters: {
564
564
  a11y: {
565
- disable: true,
565
+ disable: false,
566
566
  },
567
567
  docs: {
568
568
  description: {
@@ -777,7 +777,7 @@ const options = [
777
777
  export const withCustomError: Story = {
778
778
  parameters: {
779
779
  a11y: {
780
- disable: true,
780
+ disable: false,
781
781
  },
782
782
  sourceCode: [
783
783
  {
@@ -855,7 +855,7 @@ export const withCustomError: Story = {
855
855
  export const withCustomKey: Story = {
856
856
  parameters: {
857
857
  a11y: {
858
- disable: true,
858
+ disable: false,
859
859
  },
860
860
  sourceCode: [
861
861
  {
@@ -936,7 +936,7 @@ export const Info: Story = {
936
936
  export const FormValidation: Story = {
937
937
  parameters: {
938
938
  a11y: {
939
- disable: true,
939
+ disable: false,
940
940
  },
941
941
  docs: {
942
942
  description: {
@@ -1048,8 +1048,21 @@
1048
1048
  <VList
1049
1049
  :id="uniqueMenuId"
1050
1050
  ref="list"
1051
+ class="v-list"
1052
+ role="listbox"
1051
1053
  :aria-label="$attrs['aria-label'] || labelWithAsterisk"
1052
1054
  :title="$attrs['aria-label'] || labelWithAsterisk"
1055
+ :style="{
1056
+ minWidth: `${textInput?.$el.offsetWidth}px`
1057
+ }"
1058
+ bg-color="white"
1059
+ tabindex="0"
1060
+ @keydown.esc.prevent="closeList"
1061
+ @keydown.tab="handleTabKey"
1062
+ @keydown.enter.prevent="handleEnterKey"
1063
+ @keydown.down.prevent="handleDownKey"
1064
+ @keydown.up.prevent="handleUpKey"
1065
+ @keydown.home.prevent="handleHomeKey"
1053
1066
  @keydown.end.prevent="handleEndKey"
1054
1067
  @keydown.page-up.prevent="handlePageUpKey"
1055
1068
  @keydown.page-down.prevent="handlePageDownKey"
@@ -1184,6 +1197,10 @@
1184
1197
  background-color: rgb(0 0 0 / 8%);
1185
1198
  }
1186
1199
 
1200
+ .v-list-item :deep(.v-list-item__overlay) {
1201
+ background-color: transparent;
1202
+ }
1203
+
1187
1204
  /* Permettre le passage à la ligne pour les textes longs dans la liste déroulante */
1188
1205
  .v-list-item-title {
1189
1206
  white-space: normal;
@@ -61,10 +61,10 @@ export function useSySelectKeyboard(options: UseSySelectKeyboardOptions) {
61
61
  allItems.forEach((item) => {
62
62
  if (item !== element) {
63
63
  item.classList.remove('keyboard-focused')
64
+ item.setAttribute('tabindex', '-1')
64
65
  }
65
66
  })
66
67
 
67
- element.setAttribute('tabindex', '0')
68
68
  element.setAttribute('tabindex', focusListItem ? '0' : '-1')
69
69
  if (focusListItem) {
70
70
  element.focus()
@@ -26,9 +26,7 @@ describe('SySelect – accessibility (axe)', () => {
26
26
 
27
27
  // Ouvrir le menu pour inclure la liste déroulante dans l’analyse axe
28
28
  const activator = wrapper.find('.sy-select')
29
- if (activator.exists()) {
30
- await activator.trigger('click')
31
- }
29
+ await activator.trigger('click')
32
30
 
33
31
  const results = await axe(document.body)
34
32
  assertNoA11yViolations(results, 'SySelect – required select with menu open', {
@@ -965,4 +965,76 @@ describe('SySelect.vue', () => {
965
965
  wrapper.unmount()
966
966
  })
967
967
  })
968
+
969
+ describe('keyboard navigation', () => {
970
+ it('navigates options with arrow keys', async () => {
971
+ const items = [
972
+ { text: 'Option 1', value: '1' },
973
+ { text: 'Option 2', value: '2' },
974
+ { text: 'Option 3', value: '3' },
975
+ ]
976
+ const wrapper = mount(SySelect, {
977
+ props: {
978
+ items,
979
+ modelValue: null,
980
+ textKey: 'text',
981
+ valueKey: 'value',
982
+ },
983
+ attachTo: document.body,
984
+ })
985
+
986
+ await wrapper.find('.v-field').trigger('click')
987
+ await wrapper.vm.$nextTick()
988
+
989
+ const list = wrapper.findComponent(VList).find('.v-list')!
990
+
991
+ // expect the first item to be highlighted
992
+ const firstItem = wrapper.findComponent(VList).findAll('.v-list-item').at(0)
993
+
994
+ await wrapper.vm.$nextTick()
995
+ expect(firstItem?.classes()).toContain('active')
996
+ expect(firstItem?.attributes('tabindex')).toBe('0')
997
+
998
+ await list.trigger('keydown.down')
999
+ await wrapper.vm.$nextTick()
1000
+
1001
+ const secondItem = wrapper.findComponent(VList).findAll('.v-list-item').at(1)
1002
+ expect(firstItem?.classes()).not.toContain('keyboard-focused')
1003
+ expect(firstItem?.attributes('tabindex')).toBe('-1')
1004
+ expect(secondItem?.classes()).toContain('keyboard-focused')
1005
+ expect(secondItem?.attributes('tabindex')).toBe('0')
1006
+
1007
+ wrapper.unmount()
1008
+ })
1009
+
1010
+ it('selects an option with enter key', async () => {
1011
+ const items = [
1012
+ { text: 'Option 1', value: '1' },
1013
+ { text: 'Option 2', value: '2' },
1014
+ { text: 'Option 3', value: '3' },
1015
+ ]
1016
+ const wrapper = mount(SySelect, {
1017
+ props: {
1018
+ items,
1019
+ modelValue: null,
1020
+ textKey: 'text',
1021
+ valueKey: 'value',
1022
+ },
1023
+ attachTo: document.body,
1024
+ })
1025
+
1026
+ await wrapper.find('.v-field').trigger('click')
1027
+ await wrapper.vm.$nextTick()
1028
+
1029
+ const list = wrapper.findComponent(VList).find('.v-list')!
1030
+ await list.trigger('keydown.down')
1031
+ await wrapper.vm.$nextTick()
1032
+ await list.trigger('keydown.enter')
1033
+ await wrapper.vm.$nextTick()
1034
+
1035
+ expect(wrapper.emitted()['update:modelValue']).toEqual([['2']])
1036
+
1037
+ wrapper.unmount()
1038
+ })
1039
+ })
968
1040
  })
@@ -206,7 +206,7 @@
206
206
 
207
207
  const ariaChecked = computed(() => {
208
208
  if (internalIndeterminate.value) return 'mixed'
209
- return model.value ? 'true' : 'false'
209
+ return model.value ? 'true' : undefined
210
210
  })
211
211
 
212
212
  const labelColor = computed(() => {
@@ -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
  })