@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
@@ -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>
@@ -0,0 +1,53 @@
1
+ // @vitest-environment jsdom
2
+
3
+ import { afterEach, beforeEach, describe, it } from 'vitest'
4
+ import { mount } from '@vue/test-utils'
5
+ import { axe } from 'vitest-axe'
6
+ import { assertNoA11yViolations } from '@tests/unit/accessibility/axeUtils'
7
+ import SyPagination from '../SyPagination.vue'
8
+
9
+ describe('SyPagination – accessibility (axe)', () => {
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 () => {
39
+ const wrapper = mount(SyPagination, {
40
+ props: {
41
+ modelValue: 1,
42
+ pages: 10,
43
+ visible: 3,
44
+ ariaControls: 'paginated-content',
45
+ label: 'Pagination ellipses',
46
+ },
47
+ attachTo: document.body,
48
+ })
49
+ const results = await axe(document.body)
50
+ assertNoA11yViolations(results, 'SyPagination – ellipsis variant')
51
+ wrapper.unmount()
52
+ })
53
+ })
@@ -6,6 +6,7 @@ describe('SyPagination', () => {
6
6
  it('renders correctly with default props', () => {
7
7
  const wrapper = mount(SyPagination, {
8
8
  props: {
9
+ headingLevel: 2,
9
10
  modelValue: 1,
10
11
  pages: 10,
11
12
  },
@@ -20,6 +21,7 @@ describe('SyPagination', () => {
20
21
  it('does not render pagination if pages is 1', () => {
21
22
  const wrapper = mount(SyPagination, {
22
23
  props: {
24
+ headingLevel: 2,
23
25
  modelValue: 1,
24
26
  pages: 1,
25
27
  },
@@ -31,6 +33,7 @@ describe('SyPagination', () => {
31
33
  it('emits update:modelValue when page is changed', async () => {
32
34
  const wrapper = mount(SyPagination, {
33
35
  props: {
36
+ headingLevel: 2,
34
37
  modelValue: 1,
35
38
  pages: 10,
36
39
  },
@@ -58,6 +61,7 @@ describe('SyPagination', () => {
58
61
  it('disables previous button on first page', () => {
59
62
  const wrapper = mount(SyPagination, {
60
63
  props: {
64
+ headingLevel: 2,
61
65
  modelValue: 1,
62
66
  pages: 10,
63
67
  },
@@ -70,6 +74,7 @@ describe('SyPagination', () => {
70
74
  it('disables next button on last page', () => {
71
75
  const wrapper = mount(SyPagination, {
72
76
  props: {
77
+ headingLevel: 2,
73
78
  modelValue: 10,
74
79
  pages: 10,
75
80
  },
@@ -82,6 +87,7 @@ describe('SyPagination', () => {
82
87
  it('shows correct aria-current attribute', () => {
83
88
  const wrapper = mount(SyPagination, {
84
89
  props: {
90
+ headingLevel: 2,
85
91
  modelValue: 3,
86
92
  pages: 10,
87
93
  },
@@ -94,6 +100,7 @@ describe('SyPagination', () => {
94
100
  it('respects visible prop for number of visible pages', () => {
95
101
  const wrapper = mount(SyPagination, {
96
102
  props: {
103
+ headingLevel: 2,
97
104
  modelValue: 5,
98
105
  pages: 10,
99
106
  visible: 3,
@@ -113,6 +120,7 @@ describe('SyPagination', () => {
113
120
  it('uses custom label when provided', () => {
114
121
  const wrapper = mount(SyPagination, {
115
122
  props: {
123
+ headingLevel: 2,
116
124
  modelValue: 1,
117
125
  pages: 10,
118
126
  label: 'Test Pagination',
@@ -125,6 +133,7 @@ describe('SyPagination', () => {
125
133
  it('sets aria-controls when provided', () => {
126
134
  const wrapper = mount(SyPagination, {
127
135
  props: {
136
+ headingLevel: 2,
128
137
  modelValue: 1,
129
138
  pages: 10,
130
139
  ariaControls: 'test-content',
@@ -137,6 +146,7 @@ describe('SyPagination', () => {
137
146
  it('uses d-sr-only class for screen reader text', () => {
138
147
  const wrapper = mount(SyPagination, {
139
148
  props: {
149
+ headingLevel: 2,
140
150
  modelValue: 1,
141
151
  pages: 10,
142
152
  },
@@ -149,6 +159,7 @@ describe('SyPagination', () => {
149
159
  it('shows start ellipsis when current page is far from first page', () => {
150
160
  const wrapper = mount(SyPagination, {
151
161
  props: {
162
+ headingLevel: 2,
152
163
  modelValue: 8, // Current page far from first page
153
164
  pages: 10,
154
165
  visible: 3, // Small visible count to ensure ellipsis appears
@@ -163,6 +174,7 @@ describe('SyPagination', () => {
163
174
  it('shows both ellipses when current page is in the middle of a large range', () => {
164
175
  const wrapper = mount(SyPagination, {
165
176
  props: {
177
+ headingLevel: 2,
166
178
  modelValue: 10, // Middle page
167
179
  pages: 20,
168
180
  visible: 3, // Small visible count to ensure ellipsis appears
@@ -185,6 +185,10 @@ const meta = {
185
185
  description: 'Texte d\'aide affiché sous le champ',
186
186
  control: 'text',
187
187
  },
188
+ 'maxlength': {
189
+ description: 'Nombre maximal de caractères autorisés dans le champ',
190
+ control: { type: 'text' },
191
+ },
188
192
  'loading': {
189
193
  description: 'Affiche un indicateur de chargement',
190
194
  control: 'boolean',
@@ -90,6 +90,8 @@
90
90
  disableClickButton?: boolean
91
91
  autocomplete?: string
92
92
  helpText?: string
93
+ maxlength?: string | number
94
+ title?: string | false
93
95
  }>(),
94
96
  {
95
97
  modelValue: undefined,
@@ -159,6 +161,8 @@
159
161
  disableClickButton: true,
160
162
  autocomplete: 'off',
161
163
  helpText: '',
164
+ maxlength: undefined,
165
+ title: undefined,
162
166
  },
163
167
  )
164
168
 
@@ -173,6 +177,8 @@
173
177
 
174
178
  const emit = defineEmits([
175
179
  'update:modelValue',
180
+ 'input',
181
+ 'keydown',
176
182
  'clear',
177
183
  'prepend-icon-click',
178
184
  'append-icon-click',
@@ -197,6 +203,11 @@
197
203
  Object.entries(attrs).filter(([key]) => key !== 'display-asterisk'),
198
204
  ) as Record<string, unknown>
199
205
 
206
+ // aria-controls coming from menu activators is invalid on the input itself; drop it
207
+ if ('aria-controls' in filteredAttrs) {
208
+ delete filteredAttrs['aria-controls']
209
+ }
210
+
200
211
  if (!('validate-on' in filteredAttrs) && 'rules' in filteredAttrs && props.isValidateOnBlur) {
201
212
  filteredAttrs['validate-on'] = 'blur lazy'
202
213
  }
@@ -300,7 +311,11 @@
300
311
  }
301
312
  })
302
313
 
303
- const hasError = computed(() => validation.hasError.value || props.hasError)
314
+ const hasError = computed(() =>
315
+ validation.hasError.value
316
+ || (props.errorMessages?.length ?? 0) > 0
317
+ || props.hasError,
318
+ )
304
319
  const hasWarning = computed(() => validation.hasWarning.value || props.hasWarning)
305
320
  const hasSuccess = computed(() => ((validation.hasSuccess.value && !hasError.value && !hasWarning.value) || props.hasSuccess) && props.showSuccessMessages)
306
321
 
@@ -355,7 +370,13 @@
355
370
  return props.helpText && hasMessages.value && !props.areDetailsHidden
356
371
  })
357
372
 
358
- // Accessible label that includes prefix and suffix content for screen readers
373
+ // Use title prop if provided, otherwise fall back to accessible label
374
+ const titleValue = computed(() => {
375
+ // If title is explicitly false, don't show any title
376
+ if (props.title === false) return undefined
377
+ // Otherwise use title if provided, or accessibleLabel as fallback
378
+ return props.title || accessibleLabel.value
379
+ })
359
380
  const accessibleLabel = computed(() => {
360
381
  let label = labelWithAsterisk.value
361
382
 
@@ -449,7 +470,12 @@
449
470
  const describedbyIds = existingIds.join(' ').trim()
450
471
 
451
472
  // Associate input with messages via aria-describedby (preserve existing IDs)
452
- inputElement.setAttribute('aria-describedby', describedbyIds)
473
+ if (describedbyIds) {
474
+ inputElement.setAttribute('aria-describedby', describedbyIds)
475
+ }
476
+ else {
477
+ inputElement.removeAttribute('aria-describedby')
478
+ }
453
479
 
454
480
  // Remove problematic ARIA attributes from details container (parent)
455
481
  if (detailsContainer) {
@@ -517,7 +543,12 @@
517
543
  const describedbyIds = existingIds.join(' ').trim()
518
544
 
519
545
  // Associate input with messages via aria-describedby (preserve existing IDs)
520
- inputElement.setAttribute('aria-describedby', describedbyIds)
546
+ if (describedbyIds) {
547
+ inputElement.setAttribute('aria-describedby', describedbyIds)
548
+ }
549
+ else {
550
+ inputElement.removeAttribute('aria-describedby')
551
+ }
521
552
 
522
553
  // Remove problematic ARIA attributes from details container (parent)
523
554
  if (detailsContainer) {
@@ -579,7 +610,7 @@
579
610
  v-model="model"
580
611
  :autocomplete="props.autocomplete"
581
612
  :active="props.isActive"
582
- :title="accessibleLabel"
613
+ :title="titleValue"
583
614
  :aria-label="accessibleLabel"
584
615
  :aria-required="props.required ? 'true' : undefined"
585
616
  :base-color="props.baseColor"
@@ -600,6 +631,7 @@
600
631
  :hint="showHelpTextAsMessage ? props.helpText : props.hint"
601
632
  :label="labelWithAsterisk"
602
633
  :loading="props.loading"
634
+ :maxlength="props.maxlength"
603
635
  :max-errors="props.maxErrors"
604
636
  :max-width="props.maxWidth"
605
637
  :messages="hasError ? errors : (hasWarning ? warnings : (hasSuccess && props.showSuccessMessages ? successes : []))"
@@ -630,6 +662,8 @@
630
662
  'basic-field': !hasError && !hasWarning && !hasSuccess
631
663
  }"
632
664
  @blur="checkErrorOnBlur"
665
+ @input="(e: Event) => emit('input', e)"
666
+ @keydown="(e: KeyboardEvent) => emit('keydown', e)"
633
667
  >
634
668
  <!-- Prepend -->
635
669
  <template
@@ -38,6 +38,10 @@ const meta = {
38
38
  },
39
39
  },
40
40
  argTypes: {
41
+ 'headingLevel': {
42
+ control: { type: 'select' },
43
+ options: [1, 2, 3, 4, 5, 6],
44
+ },
41
45
  'onUpdate:modelValue': {
42
46
  description: 'Émis lorsque la valeur du champ est mise à jour',
43
47
  table: {
@@ -345,6 +349,7 @@ export const Default: Story = {
345
349
  ],
346
350
  },
347
351
  args: {
352
+ 'headingLevel': 3,
348
353
  'placeholder': 'Sélectionner une date',
349
354
  'format': 'DD/MM/YYYY',
350
355
  'isBirthDate': false,
@@ -417,6 +422,7 @@ export const Required: Story = {
417
422
  ],
418
423
  },
419
424
  args: {
425
+ 'headingLevel': 3,
420
426
  'placeholder': 'Sélectionner une date',
421
427
  'format': 'DD/MM/YYYY',
422
428
  'isBirthDate': false,
@@ -489,6 +495,7 @@ export const DateRange: Story = {
489
495
  ],
490
496
  },
491
497
  args: {
498
+ 'headingLevel': 3,
492
499
  'placeholder': 'Sélectionner une période',
493
500
  'label': 'Sélectionner une période',
494
501
  'format': 'DD/MM/YYYY',
@@ -575,6 +582,7 @@ export const WithCustomPeriod: Story = {
575
582
  ],
576
583
  },
577
584
  args: {
585
+ 'headingLevel': 3,
578
586
  'placeholder': 'Sélectionner une date',
579
587
  'format': 'DD/MM/YYYY',
580
588
  'isBirthDate': false,
@@ -671,6 +679,7 @@ export const WithAppendIcon: Story = {
671
679
  ],
672
680
  },
673
681
  args: {
682
+ 'headingLevel': 3,
674
683
  'placeholder': 'Sélectionner une date',
675
684
  'format': 'DD/MM/YYYY',
676
685
  'dateFormatReturn': '',
@@ -738,6 +747,7 @@ export const WithoutIcon: Story = {
738
747
  ],
739
748
  },
740
749
  args: {
750
+ 'headingLevel': 3,
741
751
  'placeholder': 'Sélectionner une date',
742
752
  'format': 'DD/MM/YYYY',
743
753
  'dateFormatReturn': '',
@@ -805,6 +815,7 @@ export const BirthDate: Story = {
805
815
  ],
806
816
  },
807
817
  args: {
818
+ 'headingLevel': 3,
808
819
  'placeholder': 'Date de naissance',
809
820
  'format': 'DD/MM/YYYY',
810
821
  'dateFormatReturn': '',
@@ -873,6 +884,7 @@ export const WithError: Story = {
873
884
  ],
874
885
  },
875
886
  args: {
887
+ 'headingLevel': 3,
876
888
  'placeholder': 'Sélectionner une date',
877
889
  'format': 'DD/MM/YYYY',
878
890
  'dateFormatReturn': '',
@@ -948,6 +960,7 @@ export const WithWarning: Story = {
948
960
  ],
949
961
  },
950
962
  args: {
963
+ 'headingLevel': 3,
951
964
  'placeholder': 'Date avec avertissement',
952
965
  'format': 'DD/MM/YYYY',
953
966
  'dateFormatReturn': '',
@@ -1026,6 +1039,7 @@ export const WithSuccess: Story = {
1026
1039
  ],
1027
1040
  },
1028
1041
  args: {
1042
+ 'headingLevel': 3,
1029
1043
  'placeholder': 'Date valide',
1030
1044
  'format': 'DD/MM/YYYY',
1031
1045
  'dateFormatReturn': '',
@@ -1222,6 +1236,7 @@ export const WithDateFormatReturn: Story = {
1222
1236
  ],
1223
1237
  },
1224
1238
  args: {
1239
+ 'headingLevel': 3,
1225
1240
  'placeholder': 'Sélectionner une date',
1226
1241
  'format': 'DD/MM/YYYY',
1227
1242
  'dateFormatReturn': '',
@@ -1333,6 +1348,7 @@ export const WithDayjsFormat: Story = {
1333
1348
  ],
1334
1349
  },
1335
1350
  args: {
1351
+ headingLevel: 3,
1336
1352
  placeholder: 'Sélectionner une date',
1337
1353
  format: 'DD/MM/YYYY',
1338
1354
  isBirthDate: false,
@@ -1465,6 +1481,7 @@ export const UTC: Story = {
1465
1481
  ],
1466
1482
  },
1467
1483
  args: {
1484
+ 'headingLevel': 3,
1468
1485
  'placeholder': 'Sélectionner une date',
1469
1486
  'format': 'DD/MM/YYYY',
1470
1487
  'dateFormatReturn': '',
@@ -1496,12 +1513,20 @@ export const UTC: Story = {
1496
1513
 
1497
1514
  const dateString = computed({
1498
1515
  get() {
1499
- return dayjs.utc(utcIso.value).tz(selectedTimeZone.value).format(DISPLAY_FORMAT.value)
1516
+ return dayjs.utc(utcIso.value).format(DISPLAY_FORMAT.value)
1500
1517
  },
1501
1518
  set(v: string) {
1502
- const parsed = dayjs.tz(v, DISPLAY_FORMAT.value, selectedTimeZone.value)
1519
+ const parsed = dayjs.utc(v, DISPLAY_FORMAT.value, true)
1503
1520
  if (!parsed.isValid() || parsed.format(DISPLAY_FORMAT.value) !== v) return
1504
- utcIso.value = parsed.utc().toISOString()
1521
+ utcIso.value = dayjs.utc()
1522
+ .year(parsed.year())
1523
+ .month(parsed.month())
1524
+ .date(parsed.date())
1525
+ .hour(0)
1526
+ .minute(0)
1527
+ .second(0)
1528
+ .millisecond(0)
1529
+ .toISOString()
1505
1530
  args['onUpdate:modelValue']?.(v)
1506
1531
  },
1507
1532
  })