@cnamts/synapse 1.0.7 → 1.0.9

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 (407) hide show
  1. package/dist/{DateFilter-CHDLz2EO.js → DateFilter-BylukfjR.js} +1 -1
  2. package/dist/{NumberFilter-DXNQ4Uls.js → NumberFilter-C_bUk9o1.js} +1 -1
  3. package/dist/{PeriodFilter-C8Qf3Jcn.js → PeriodFilter-dVOmcfmt.js} +1 -1
  4. package/dist/{SelectFilter-B2Ejs4Cb.js → SelectFilter-BW8KpXkQ.js} +1 -1
  5. package/dist/{TextFilter-CfR5_A1S.js → TextFilter-diwVzTz7.js} +1 -1
  6. package/dist/components/Amelipro/AmeliproAutoCompleteField/AmeliproAutoCompleteField.d.ts +2785 -2770
  7. package/dist/components/Amelipro/AmeliproCallback/AmeliproCallback.d.ts +3 -3
  8. package/dist/components/Amelipro/AmeliproCarousel/AmeliproCarousel.d.ts +7 -7
  9. package/dist/components/Amelipro/AmeliproCarousel/AmeliproCarouselItem/AmeliproCarouselItem.d.ts +3 -3
  10. package/dist/components/Amelipro/AmeliproClickableTile/AmeliproClickableTile.d.ts +3 -3
  11. package/dist/components/Amelipro/AmeliproContentLayout/AmeliproContentLayout.d.ts +30 -0
  12. package/dist/components/Amelipro/AmeliproContentLayout/index.d.ts +2 -0
  13. package/dist/components/Amelipro/AmeliproCopyBtn/AmeliproCopyBtn.d.ts +24 -0
  14. package/dist/components/Amelipro/AmeliproErrorTemplate/AmeliproErrorTemplate.d.ts +128 -0
  15. package/dist/components/Amelipro/AmeliproErrorTemplate/errorTemplateTypes.d.ts +2 -0
  16. package/dist/components/Amelipro/AmeliproErrorTemplate/types.d.ts +7 -0
  17. package/dist/components/Amelipro/AmeliproFilePreview/AmeliproFilePreview.d.ts +91 -0
  18. package/dist/components/Amelipro/AmeliproFooter/AmeliproFooter.d.ts +18 -18
  19. package/dist/components/Amelipro/AmeliproHeader/AmeliproHeader.d.ts +9 -9
  20. package/dist/components/Amelipro/AmeliproHeader/AmeliproHeaderBar/AmeliproHeaderBar.d.ts +3 -3
  21. package/dist/components/Amelipro/AmeliproHeader/AmeliproHeaderBar/AmeliproHeaderBrandSection/AmeliproHeaderBrandSection.d.ts +3 -3
  22. package/dist/components/Amelipro/AmeliproIconBtn/AmeliproIconBtn.d.ts +3 -3
  23. package/dist/components/Amelipro/AmeliproMenu/AmeliproMenu.d.ts +3 -3
  24. package/dist/components/Amelipro/AmeliproPagination/AmeliproPaginationBtn/AmeliproPaginationBtn.d.ts +3 -3
  25. package/dist/components/Amelipro/AmeliproPatientBanner/AmeliproPatientBanner.d.ts +3 -3
  26. package/dist/components/Amelipro/AmeliproSelect/AmeliproSelect.d.ts +2766 -2751
  27. package/dist/components/Amelipro/AmeliproStateTile/AmeliproStateTile.d.ts +3 -3
  28. package/dist/components/Amelipro/AmeliproTabs/AmeliproTabs.d.ts +2766 -2751
  29. package/dist/components/Amelipro/AmeliproTextArea/AmeliproTextArea.d.ts +388 -386
  30. package/dist/components/Amelipro/AmeliproTextField/AmeliproTextField.d.ts +632 -630
  31. package/dist/components/Amelipro/AmeliproTileBtn/AmeliproTileBtn.d.ts +3 -3
  32. package/dist/components/Amelipro/AmeliproTransmission/AmeliproTransmission.d.ts +9 -9
  33. package/dist/components/CookieBanner/CookieBanner.d.ts +116 -114
  34. package/dist/components/CookiesSelection/CookiesInformation/CookiesInformation.d.ts +465 -465
  35. package/dist/components/CookiesSelection/CookiesSelection.d.ts +103 -101
  36. package/dist/components/Customs/Selects/SySelect/SySelect.d.ts +106 -1510
  37. package/dist/components/Customs/Selects/SySelect/composables/useSySelectKeyboard.d.ts +0 -1
  38. package/dist/components/Customs/SyCheckbox/SyCheckbox.d.ts +1 -1
  39. package/dist/components/Customs/SyTextField/SyTextField.d.ts +634 -632
  40. package/dist/components/DataList/DataList.d.ts +1 -1
  41. package/dist/components/DatePicker/CalendarMode/DatePicker.d.ts +2875 -2843
  42. package/dist/components/DatePicker/ComplexDatePicker/ComplexDatePicker.d.ts +1446 -1430
  43. package/dist/components/DatePicker/DateTextInput/DateTextInput.d.ts +643 -641
  44. package/dist/components/DialogBox/DialogBox.d.ts +172 -169
  45. package/dist/components/DialogBox/config.d.ts +3 -3
  46. package/dist/components/DialogBox/locales.d.ts +2 -0
  47. package/dist/components/DialogBox/useDraggable.d.ts +8 -0
  48. package/dist/components/FilterSideBar/FilterSideBar.d.ts +159 -157
  49. package/dist/components/FooterBar/FooterBar.d.ts +5 -5
  50. package/dist/components/HeaderBar/HeaderBar.d.ts +2 -2
  51. package/dist/components/HeaderBar/HeaderLogo/HeaderLogo.d.ts +1 -1
  52. package/dist/components/HeaderNavigationBar/HeaderNavigationBar.d.ts +1 -1
  53. package/dist/components/LangBtn/LangBtn.d.ts +169 -167
  54. package/dist/components/LogoBrandSection/LogoBrandSection.d.ts +1 -1
  55. package/dist/components/NirField/NirField.d.ts +1277 -1273
  56. package/dist/components/PeriodField/PeriodField.d.ts +5752 -5688
  57. package/dist/components/PhoneField/PhoneField.d.ts +647 -636
  58. package/dist/components/SearchListField/SearchListField.d.ts +105 -105
  59. package/dist/components/SyAlert/SyAlert.d.ts +29 -29
  60. package/dist/components/SyTextArea/SyTextArea.d.ts +389 -387
  61. package/dist/components/Tables/SyServerTable/SyServerTable.d.ts +207 -175
  62. package/dist/components/Tables/SyTable/SyTable.d.ts +208 -176
  63. package/dist/components/Tables/common/SyTableFilter.d.ts +1 -1
  64. package/dist/components/Tables/common/SyTablePagination.d.ts +106 -1510
  65. package/dist/components/Tables/common/filters/DateFilter.d.ts +1 -1
  66. package/dist/components/Tables/common/filters/NumberFilter.d.ts +1 -1
  67. package/dist/components/Tables/common/filters/PeriodFilter.d.ts +1 -1
  68. package/dist/components/Tables/common/filters/SelectFilter.d.ts +1 -1
  69. package/dist/components/Tables/common/filters/TextFilter.d.ts +1 -1
  70. package/dist/components/Tables/common/organizeColumns/OrganizeColumns.d.ts +82 -82
  71. package/dist/components/Tables/common/tableProps.d.ts +11 -0
  72. package/dist/components/Tables/common/types.d.ts +8 -4
  73. package/dist/components/Tables/common/useStoredOptions.d.ts +14 -0
  74. package/dist/components/Tables/common/useTableHeaders.d.ts +3 -2
  75. package/dist/components/Tables/common/useTableItems.d.ts +0 -1
  76. package/dist/components/UploadWorkflow/UploadWorkflow.d.ts +16 -16
  77. package/dist/components/index.d.ts +4 -0
  78. package/dist/design-system-v3.js +166 -162
  79. package/dist/design-system-v3.umd.cjs +269 -268
  80. package/dist/main-2eWGB7zZ.js +30203 -0
  81. package/dist/services/NotificationService.d.ts +1 -0
  82. package/dist/style.css +1 -1
  83. package/dist/vuetifyConfig.d.ts +6 -6
  84. package/package.json +1 -1
  85. package/src/assets/amelipro/img/ico_pdf.svg +15 -0
  86. package/src/assets/amelipro/img/navigateurs.png +0 -0
  87. package/src/assets/amelipro/img/visuel_deconnexion.svg +973 -0
  88. package/src/assets/amelipro/img/visuel_erreur_403.svg +3652 -0
  89. package/src/assets/amelipro/img/visuel_erreur_404.svg +1801 -0
  90. package/src/assets/amelipro/img/visuel_erreur_500.svg +989 -0
  91. package/src/assets/amelipro/img/visuel_erreur_503.svg +1005 -0
  92. package/src/assets/amelipro/img/visuel_navigateur_obsolete.svg +828 -0
  93. package/src/assets/amelipro/pdf/charte-pour-pdf.pdf +0 -0
  94. package/src/components/Accordion/Accessibilite/AccessibilityGuide.mdx +5 -2
  95. package/src/components/Accordion/Accordion.mdx +5 -3
  96. package/src/components/Amelipro/AmeliproAccordion/AmeliproAccordion.stories.ts +258 -0
  97. package/src/components/Amelipro/AmeliproAccordionGroup/AmeliproAccordionGroup.stories.ts +321 -0
  98. package/src/components/Amelipro/AmeliproAccordionList/AmeliproAccordionList.stories.ts +656 -0
  99. package/src/components/Amelipro/AmeliproAccordionResult/AmeliproAccordionResult.mdx +1 -3
  100. package/src/components/Amelipro/AmeliproAccordionResult/AmeliproAccordionResult.stories.ts +208 -0
  101. package/src/components/Amelipro/AmeliproAccordionResultList/AmeliproAccordionResultList.stories.ts +562 -0
  102. package/src/components/Amelipro/AmeliproAutoCompleteField/AmeliproAutoCompleteField.stories.ts +480 -0
  103. package/src/components/Amelipro/AmeliproCaptcha/AmeliproCaptcha.stories.ts +267 -0
  104. package/src/components/Amelipro/AmeliproCheckbox/AmeliproCheckbox.stories.ts +287 -6
  105. package/src/components/Amelipro/AmeliproCheckboxGroup/AmeliproCheckboxGroup.stories.ts +433 -0
  106. package/src/components/Amelipro/AmeliproContentLayout/AmeliproContentLayout.mdx +15 -0
  107. package/src/components/Amelipro/AmeliproContentLayout/AmeliproContentLayout.stories.ts +44 -0
  108. package/src/components/Amelipro/AmeliproContentLayout/AmeliproContentLayout.vue +55 -0
  109. package/src/components/Amelipro/AmeliproContentLayout/__tests__/AmeliproContentLayout.spec.ts +20 -0
  110. package/src/components/Amelipro/AmeliproContentLayout/__tests__/__snapshots__/AmeliproContentLayout.spec.ts.snap +24 -0
  111. package/src/components/Amelipro/AmeliproContentLayout/index.ts +3 -0
  112. package/src/components/Amelipro/AmeliproCopyBtn/AmeliproCopyBtn.mdx +18 -0
  113. package/src/components/Amelipro/AmeliproCopyBtn/AmeliproCopyBtn.stories.ts +68 -0
  114. package/src/components/Amelipro/AmeliproCopyBtn/AmeliproCopyBtn.vue +73 -0
  115. package/src/components/Amelipro/AmeliproCopyBtn/__tests__/AmeliproCopyBtn.spec.ts +20 -0
  116. package/src/components/Amelipro/AmeliproCopyBtn/__tests__/__snapshots__/AmeliproCopyBtn.spec.ts.snap +84 -0
  117. package/src/components/Amelipro/AmeliproCustomSelector/AmeliproCustomSelector.stories.ts +422 -0
  118. package/src/components/Amelipro/AmeliproCustomSelector/AmeliproCustomSelector.vue +2 -2
  119. package/src/components/Amelipro/AmeliproCustomSelector/__tests__/__snapshots__/AmeliproCustomSelector.spec.ts.snap +4 -6
  120. package/src/components/Amelipro/AmeliproDisclosure/AmeliproDisclosure.stories.ts +92 -0
  121. package/src/components/Amelipro/AmeliproErrorTemplate/AmeliproErrorTemplate.mdx +23 -0
  122. package/src/components/Amelipro/AmeliproErrorTemplate/AmeliproErrorTemplate.stories.ts +386 -0
  123. package/src/components/Amelipro/AmeliproErrorTemplate/AmeliproErrorTemplate.vue +187 -0
  124. package/src/components/Amelipro/AmeliproErrorTemplate/__tests__/AmeliproErrorTemplate.spec.ts +31 -0
  125. package/src/components/Amelipro/AmeliproErrorTemplate/__tests__/__snapshots__/AmeliproErrorTemplate.spec.ts.snap +185 -0
  126. package/src/components/Amelipro/AmeliproErrorTemplate/errorTemplateTypes.ts +85 -0
  127. package/src/components/Amelipro/AmeliproErrorTemplate/types.d.ts +7 -0
  128. package/src/components/Amelipro/AmeliproFilePreview/AmeliproFilePreview.mdx +15 -0
  129. package/src/components/Amelipro/AmeliproFilePreview/AmeliproFilePreview.stories.ts +71 -0
  130. package/src/components/Amelipro/AmeliproFilePreview/AmeliproFilePreview.vue +161 -0
  131. package/src/components/Amelipro/AmeliproFilePreview/__tests__/AmeliproFilePreview.spec.ts +28 -0
  132. package/src/components/Amelipro/AmeliproFilePreview/__tests__/__snapshots__/AmeliproFilePreview.spec.ts.snap +209 -0
  133. package/src/components/Amelipro/AmeliproIllustratedRadioGroup/AmeliproIllustratedRadioGroup.stories.ts +194 -0
  134. package/src/components/Amelipro/AmeliproRadioGroup/AmeliproRadioGroup.stories.ts +639 -0
  135. package/src/components/Amelipro/AmeliproResultList/AmeliproResultList.stories.ts +648 -0
  136. package/src/components/Amelipro/AmeliproSelect/AmeliproSelect.stories.ts +392 -0
  137. package/src/components/Amelipro/AmeliproTextArea/AmeliproTextArea.stories.ts +351 -0
  138. package/src/components/Amelipro/AmeliproTextField/AmeliproTextField.stories.ts +634 -38
  139. package/src/components/Amelipro/AmeliproTextField/AmeliproTextField.vue +1 -1
  140. package/src/components/Amelipro/ServiceMenu/ServiceMenu.mdx +5 -3
  141. package/src/components/Amelipro/StructureMenu/StructureMenu.mdx +5 -3
  142. package/src/components/Amelipro/UserMenu/UserMenu.mdx +5 -3
  143. package/src/components/BackBtn/Accessibilite.mdx +6 -2
  144. package/src/components/BackBtn/BackBtn.mdx +5 -3
  145. package/src/components/BackBtn/BackBtn.stories.ts +1 -0
  146. package/src/components/BackBtn/Usages.mdx +5 -3
  147. package/src/components/BackToTopBtn/Accessibilite.mdx +6 -2
  148. package/src/components/BackToTopBtn/BackToTopBtn.mdx +5 -4
  149. package/src/components/BackToTopBtn/Usages.mdx +5 -3
  150. package/src/components/ChipList/Accessibilite.mdx +6 -2
  151. package/src/components/ChipList/ChipList.mdx +5 -3
  152. package/src/components/CollapsibleList/Accessibilite.mdx +6 -2
  153. package/src/components/CollapsibleList/CollapsibleList.mdx +5 -3
  154. package/src/components/ContextualMenu/Accessibilite.mdx +6 -2
  155. package/src/components/ContextualMenu/ContextualMenu.mdx +7 -4
  156. package/src/components/ContextualMenu/Usages.mdx +5 -3
  157. package/src/components/CookieBanner/Accessibilite.mdx +6 -2
  158. package/src/components/CookieBanner/CookieBanner.mdx +5 -8
  159. package/src/components/CopyBtn/Accessibilite.mdx +6 -2
  160. package/src/components/CopyBtn/CopyBtn.mdx +5 -3
  161. package/src/components/CopyBtn/Usages.mdx +5 -3
  162. package/src/components/Customs/Selects/SelectBtnField/Accessibilite.mdx +6 -2
  163. package/src/components/Customs/Selects/SelectBtnField/SelectBtnField.mdx +7 -4
  164. package/src/components/Customs/Selects/SelectBtnField/Usages.mdx +5 -3
  165. package/src/components/Customs/Selects/SelectOverview.mdx +27 -60
  166. package/src/components/Customs/Selects/SyBtnSelect/Accessibilite.mdx +6 -2
  167. package/src/components/Customs/Selects/SyBtnSelect/SyBtnSelect.mdx +6 -4
  168. package/src/components/Customs/Selects/SyInputSelect/Accessibilite.mdx +6 -2
  169. package/src/components/Customs/Selects/SyInputSelect/SyInputSelect.mdx +9 -1
  170. package/src/components/Customs/Selects/SyInputSelect/SyInputSelect.stories.ts +14 -0
  171. package/src/components/Customs/Selects/SySelect/Accessibilite.mdx +7 -3
  172. package/src/components/Customs/Selects/SySelect/SySelect.mdx +6 -4
  173. package/src/components/Customs/Selects/SySelect/SySelect.stories.ts +2 -2
  174. package/src/components/Customs/Selects/SySelect/SySelect.vue +289 -375
  175. package/src/components/Customs/Selects/SySelect/Usages.mdx +5 -3
  176. package/src/components/Customs/Selects/SySelect/composables/tests/useSySelectKeyboard.spec.ts +0 -10
  177. package/src/components/Customs/Selects/SySelect/composables/useSySelectKeyboard.ts +0 -5
  178. package/src/components/Customs/Selects/SySelect/tests/SySelect.spec.ts +184 -25
  179. package/src/components/Customs/SyCheckbox/Accessibilite.mdx +6 -3
  180. package/src/components/Customs/SyCheckbox/SyCheckbox.mdx +5 -3
  181. package/src/components/Customs/SyIcon/Accessibilite.mdx +5 -5
  182. package/src/components/Customs/SyIcon/SyIcon.mdx +5 -7
  183. package/src/components/Customs/SyPagination/SyPagination.mdx +7 -4
  184. package/src/components/Customs/SyTabs/Accessibilite.mdx +4 -1
  185. package/src/components/Customs/SyTabs/SyTabs.mdx +5 -3
  186. package/src/components/Customs/SyTabs/SyTabs.vue +87 -24
  187. package/src/components/Customs/SyTabs/tests/SyTabs.spec.ts +18 -0
  188. package/src/components/Customs/SyTextField/Accessibilite.mdx +6 -2
  189. package/src/components/Customs/SyTextField/SyTextField.mdx +5 -6
  190. package/src/components/Customs/SyTextField/SyTextField.vue +17 -4
  191. package/src/components/Customs/SyTextField/Usages.mdx +1 -0
  192. package/src/components/DataList/Accessibilite.mdx +6 -2
  193. package/src/components/DataList/DataList.mdx +5 -3
  194. package/src/components/DataListGroup/Accessibilite.mdx +6 -2
  195. package/src/components/DataListGroup/DataListGroup.mdx +5 -3
  196. package/src/components/DatePicker/Accessibilite.mdx +6 -2
  197. package/src/components/DatePicker/CalendarMode/DatePicker.mdx +5 -3
  198. package/src/components/DatePicker/CalendarMode/DatePicker.vue +6 -3
  199. package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.mdx +5 -6
  200. package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.vue +14 -3
  201. package/src/components/DatePicker/DatePickerOverview.mdx +5 -3
  202. package/src/components/DatePicker/DatePickerValidationExample/DatePickerValidation.mdx +5 -3
  203. package/src/components/DatePicker/DateTextInput/DateTextInput.vue +37 -32
  204. package/src/components/DatePicker/DateTextInput/NoCalendar.mdx +5 -3
  205. package/src/components/DatePicker/DateTextInput/NoCalendar.stories.ts +3 -0
  206. package/src/components/DatePicker/Usages.mdx +5 -3
  207. package/src/components/DiacriticPicker/DiacriticPicker.mdx +5 -3
  208. package/src/components/DialogBox/Accessibilite.mdx +6 -2
  209. package/src/components/DialogBox/DialogBox.mdx +5 -3
  210. package/src/components/DialogBox/DialogBox.stories.ts +83 -0
  211. package/src/components/DialogBox/DialogBox.vue +41 -6
  212. package/src/components/DialogBox/Usages.mdx +5 -3
  213. package/src/components/DialogBox/config.ts +3 -3
  214. package/src/components/DialogBox/locales.ts +2 -0
  215. package/src/components/DialogBox/tests/DialogBox.spec.ts +132 -3
  216. package/src/components/DialogBox/tests/__snapshots__/DialogBox.spec.ts.snap +14 -11
  217. package/src/components/DialogBox/useDraggable.ts +98 -0
  218. package/src/components/DownloadBtn/Accessibilite.mdx +6 -2
  219. package/src/components/DownloadBtn/DownloadBtn.mdx +7 -4
  220. package/src/components/DownloadBtn/DownloadBtn.vue +1 -1
  221. package/src/components/DownloadBtn/tests/DownloadBtn.spec.ts +2 -3
  222. package/src/components/ErrorPage/Accessibilite.mdx +6 -2
  223. package/src/components/ErrorPage/ErrorPage.mdx +5 -3
  224. package/src/components/ExternalLinks/Accessibilite.mdx +6 -2
  225. package/src/components/ExternalLinks/ExternalLinks.mdx +5 -8
  226. package/src/components/ExternalLinks/Usages.mdx +5 -3
  227. package/src/components/FileList/Accessibilite.mdx +6 -2
  228. package/src/components/FileList/FileList.mdx +5 -4
  229. package/src/components/FilePreview/Accessibilite.mdx +6 -2
  230. package/src/components/FilePreview/FilePreview.mdx +7 -7
  231. package/src/components/FileUpload/Accessibilite.mdx +6 -2
  232. package/src/components/FileUpload/FileUpload.mdx +7 -4
  233. package/src/components/FilterInline/Accessibilite.mdx +6 -2
  234. package/src/components/FilterInline/FilterInline.mdx +5 -5
  235. package/src/components/FilterSideBar/Accessibilite.mdx +6 -2
  236. package/src/components/FilterSideBar/FilterSideBar.mdx +5 -4
  237. package/src/components/FooterBar/Accessibilite.mdx +6 -2
  238. package/src/components/FooterBar/FooterBar.mdx +5 -3
  239. package/src/components/FranceConnectBtn/Accessibilite.mdx +6 -2
  240. package/src/components/FranceConnectBtn/FranceConnectBtn.mdx +5 -3
  241. package/src/components/HeaderBar/Accessibilite.mdx +6 -2
  242. package/src/components/HeaderBar/HeaderBar.mdx +4 -4
  243. package/src/components/HeaderBar/HeaderBurgerMenu/Accessibilite.mdx +6 -2
  244. package/src/components/HeaderBar/HeaderBurgerMenu/HeaderBurgerMenu.mdx +9 -13
  245. package/src/components/HeaderBar/HeaderBurgerMenu/HeaderMenuItem/HeaderMenuItem.mdx +1 -1
  246. package/src/components/HeaderBar/HeaderBurgerMenu/HeaderMenuSection/HeaderMenuSection.mdx +5 -5
  247. package/src/components/HeaderBar/HeaderBurgerMenu/HeaderSubMenu/HeaderSubMenu.mdx +1 -2
  248. package/src/components/HeaderBar/Usages.mdx +5 -3
  249. package/src/components/HeaderLoading/Accessibilite.mdx +2 -1
  250. package/src/components/HeaderLoading/HeaderLoading.mdx +5 -3
  251. package/src/components/HeaderNavigationBar/HeaderNavigationBar.mdx +1 -8
  252. package/src/components/HeaderNavigationBar/HorizontalNavbar/HorizontalNavbar.vue +17 -9
  253. package/src/components/HeaderToolbar/Accessibilite.mdx +6 -2
  254. package/src/components/HeaderToolbar/HeaderToolbar.mdx +5 -3
  255. package/src/components/LangBtn/Accessibilite.mdx +6 -2
  256. package/src/components/LangBtn/LangBtn.mdx +5 -3
  257. package/src/components/Logo/Accessibilite.mdx +6 -2
  258. package/src/components/Logo/Logo.mdx +5 -3
  259. package/src/components/LogoBrandSection/Accessibilite.mdx +6 -2
  260. package/src/components/LogoBrandSection/LogoBrandSection.mdx +5 -3
  261. package/src/components/MaintenancePage/Accessibilite.mdx +6 -2
  262. package/src/components/MaintenancePage/MaintenancePage.mdx +6 -4
  263. package/src/components/NirField/Accessibilite.mdx +6 -2
  264. package/src/components/NirField/NirField.mdx +5 -7
  265. package/src/components/NirField/NirField.vue +13 -118
  266. package/src/components/NirField/Usages.mdx +5 -3
  267. package/src/components/NotFoundPage/Accessibilite.mdx +6 -2
  268. package/src/components/NotFoundPage/NotFoundPage.mdx +6 -4
  269. package/src/components/NotificationBar/Accessibilite.mdx +6 -2
  270. package/src/components/NotificationBar/NotificationBar.mdx +5 -1
  271. package/src/components/NotificationBar/NotificationBar.stories.ts +128 -2
  272. package/src/components/NotificationBar/NotificationBar.vue +16 -1
  273. package/src/components/NotificationBar/Usages.mdx +5 -3
  274. package/src/components/NotificationBar/tests/NotificationBar.spec.ts +65 -0
  275. package/src/components/PageContainer/Accessibilite.mdx +6 -2
  276. package/src/components/PageContainer/PageContainer.mdx +5 -3
  277. package/src/components/PaginatedTable/Accessibilite.mdx +6 -2
  278. package/src/components/PaginatedTable/PaginatedTable.mdx +5 -3
  279. package/src/components/PasswordField/Accessibilite.mdx +6 -2
  280. package/src/components/PasswordField/PasswordField.mdx +5 -3
  281. package/src/components/PeriodField/Accessibilite.mdx +6 -2
  282. package/src/components/PeriodField/PeriodField.mdx +5 -3
  283. package/src/components/PhoneField/Accessibilite.mdx +6 -2
  284. package/src/components/PhoneField/PhoneField.mdx +5 -3
  285. package/src/components/PhoneField/PhoneField.stories.ts +17 -218
  286. package/src/components/PhoneField/PhoneField.vue +17 -11
  287. package/src/components/PhoneField/Usages.mdx +5 -3
  288. package/src/components/PhoneField/tests/PhoneField.spec.ts +51 -15
  289. package/src/components/RangeField/Accessibilite.mdx +6 -2
  290. package/src/components/RangeField/RangeField.mdx +5 -7
  291. package/src/components/RatingPicker/Accessibilite.mdx +6 -2
  292. package/src/components/RatingPicker/RatingPicker.mdx +5 -4
  293. package/src/components/SearchListField/Accessibilite.mdx +6 -2
  294. package/src/components/SearchListField/SearchListField.mdx +7 -5
  295. package/src/components/SkipLink/Accessibilite.mdx +6 -2
  296. package/src/components/SkipLink/SkipLink.mdx +5 -3
  297. package/src/components/SkipLink/Usages.mdx +5 -3
  298. package/src/components/SocialMediaLinks/Accessibilite.mdx +6 -2
  299. package/src/components/SocialMediaLinks/SocialMediaLinks.mdx +5 -3
  300. package/src/components/SubHeader/Accessibilite.mdx +6 -2
  301. package/src/components/SubHeader/SubHeader.mdx +5 -3
  302. package/src/components/SyAlert/Accessibilite.mdx +6 -2
  303. package/src/components/SyAlert/SyAlert.mdx +7 -4
  304. package/src/components/SyAlert/Usages.mdx +5 -3
  305. package/src/components/SyTextArea/SyTextArea.mdx +5 -3
  306. package/src/components/TableToolbar/Accessibilite.mdx +6 -2
  307. package/src/components/TableToolbar/TableToolbar.mdx +6 -3
  308. package/src/components/Tables/SyServerTable/SyServerTable.mdx +5 -3
  309. package/src/components/Tables/SyServerTable/SyServerTable.stories.ts +4 -0
  310. package/src/components/Tables/SyServerTable/SyServerTable.vue +36 -74
  311. package/src/components/Tables/SyServerTable/tests/SyServerTable.spec.ts +46 -7
  312. package/src/components/Tables/SyTable/SyTable.mdx +5 -3
  313. package/src/components/Tables/SyTable/SyTable.stories.ts +5 -1
  314. package/src/components/Tables/SyTable/SyTable.vue +38 -60
  315. package/src/components/Tables/SyTable/tests/SyTable.spec.ts +9 -7
  316. package/src/components/Tables/common/filters/tests/SelectFilter.spec.ts +6 -1
  317. package/src/components/Tables/common/tableProps.ts +53 -0
  318. package/src/components/Tables/common/tableStyles.scss +4 -0
  319. package/src/components/Tables/common/tests/tableUtils.spec.ts +4 -151
  320. package/src/components/Tables/common/types.ts +12 -2
  321. package/src/components/Tables/common/useStoredOptions.ts +36 -0
  322. package/src/components/Tables/common/useTableHeaders.ts +10 -7
  323. package/src/components/Tables/common/useTableItems.ts +0 -20
  324. package/src/components/ToolbarContainer/ToolbarContainer.mdx +1 -0
  325. package/src/components/UploadWorkflow/Accessibilite.mdx +6 -2
  326. package/src/components/UploadWorkflow/UploadWorkflow.mdx +5 -7
  327. package/src/components/UserMenuBtn/Accessibilite.mdx +6 -2
  328. package/src/components/UserMenuBtn/UserMenuBtn.mdx +5 -3
  329. package/src/components/index.ts +4 -0
  330. package/src/services/NotificationService.ts +9 -0
  331. package/src/stories/Accessibilite/Aculturation/SensibilisationAccessibilite.mdx +2 -65
  332. package/src/stories/Accessibilite/Audit/RGAA.mdx +2 -20
  333. package/src/stories/Accessibilite/AuditDesignSystem.mdx +4 -47
  334. package/src/stories/Accessibilite/Avancement/Avancement.mdx +5 -68
  335. package/src/stories/Accessibilite/Avancement/Avancement.stories.ts +267 -198
  336. package/src/stories/Accessibilite/Introduction.mdx +2 -20
  337. package/src/stories/Accessibilite/KitDePreAudit/Echantillonnage.mdx +4 -21
  338. package/src/stories/Accessibilite/KitDePreAudit/Introduction.mdx +3 -20
  339. package/src/stories/Accessibilite/KitDePreAudit/Outils/Introduction.mdx +5 -50
  340. package/src/stories/Accessibilite/KitDePreAudit/Outils/LecteursDEcran.mdx +3 -46
  341. package/src/stories/Accessibilite/KitDePreAudit/Outils/Tanaguru/FauxPositifs.mdx +3 -39
  342. package/src/stories/Accessibilite/KitDePreAudit/Outils/Tanaguru/Utilisation.mdx +4 -54
  343. package/src/stories/Accessibilite/KitDePreAudit/Preaudit.mdx +4 -51
  344. package/src/stories/Accessibilite/Vuetify/Vuetify.mdx +3 -11
  345. package/src/stories/Accessibilite/Vuetify/Vuetify.stories.ts +2 -2
  346. package/src/stories/Accessibilite/Vuetify/VuetifyItems.ts +6 -3
  347. package/src/stories/Components/Components.stories.ts +1 -1
  348. package/src/stories/Demarrer/CreerUneIssue.mdx +4 -1
  349. package/src/stories/Demarrer/PolitiqueDeConfidentialite.mdx +0 -2
  350. package/src/stories/Demarrer/PolitiqueDeConfidentialite.stories.ts +3 -0
  351. package/src/stories/Demarrer/Releases.mdx +0 -2
  352. package/src/stories/Demarrer/Releases.stories.ts +3 -0
  353. package/src/stories/DesignTokens/Arrondis.mdx +7 -1
  354. package/src/stories/DesignTokens/Colors.mdx +7 -1
  355. package/src/stories/DesignTokens/Conteneurs.mdx +6 -1
  356. package/src/stories/DesignTokens/Elevations.mdx +7 -1
  357. package/src/stories/DesignTokens/Espacements.mdx +7 -1
  358. package/src/stories/DesignTokens/Introduction.mdx +5 -3
  359. package/src/stories/DesignTokens/StylesTypographiques.mdx +6 -1
  360. package/src/stories/DesignTokens/Typographie.mdx +5 -1
  361. package/src/stories/Directives/SvgDirective.mdx +3 -22
  362. package/src/stories/EcoConception/EcoGuideComponent.vue +569 -0
  363. package/src/stories/EcoConception/Introduction.mdx +190 -13
  364. package/src/stories/EcoConception/Referentiel.mdx +13 -0
  365. package/src/stories/EcoConception/datas/back_rules.json +184 -0
  366. package/src/stories/EcoConception/datas/ux_ui_rules.json +1073 -0
  367. package/src/stories/EcoConception/ecoconception.stories.ts +30 -0
  368. package/src/stories/GuideDuDev/ClassesUtilitaires/DataUtilities.mdx +7 -3
  369. package/src/stories/GuideDuDev/ClassesUtilitaires/DomBrowserUtilities.mdx +9 -1
  370. package/src/stories/GuideDuDev/ClassesUtilitaires/FormattingUtilities.mdx +7 -3
  371. package/src/stories/GuideDuDev/ClassesUtilitaires/StorageUtilities.mdx +5 -1
  372. package/src/stories/GuideDuDev/ClassesUtilitaires/ValidationRules.mdx +7 -3
  373. package/src/stories/GuideDuDev/ClassesUtilitaires/ValidationUtilities.mdx +7 -3
  374. package/src/stories/GuideDuDev/ClassesUtilitaires/index.mdx +5 -2
  375. package/src/stories/GuideDuDev/FormValidationGuide.mdx +7 -3
  376. package/src/stories/GuideDuDev/LesBreackingChanges.mdx +6 -2
  377. package/src/stories/GuideDuDev/MigrationDepuisBridge.mdx +7 -2
  378. package/src/stories/GuideDuDev/MigrationDepuisVue2.mdx +7 -2
  379. package/src/stories/GuideDuDev/PortailAgent.mdx +6 -1
  380. package/src/stories/GuideDuDev/Theme.mdx +8 -2
  381. package/src/stories/GuideDuDev/UtiliserLesRules.mdx +7 -3
  382. package/src/stories/GuideDuDev/moduleDeNotification.mdx +8 -3
  383. package/src/stories/GuideDuDev/vuetifyOptions.mdx +5 -1
  384. package/src/stories/Templates/Templates.stories.ts +1 -1
  385. package/src/stories/styles/shared.css +16 -0
  386. package/src/utils/rules/Rules.mdx +26 -3
  387. package/src/utils/rules/doMatchPattern/DoMachPattern.mdx +27 -4
  388. package/src/utils/rules/isDateValid/IsDateValid.mdx +27 -4
  389. package/src/utils/rules/isExactLength/IsExactLenght.mdx +27 -4
  390. package/src/utils/rules/isHolidayDay/IsHolidayDay.mdx +27 -4
  391. package/src/utils/rules/isMaxLength/IsMaxLength.mdx +27 -4
  392. package/src/utils/rules/isMinLength/IsMinLength.mdx +27 -4
  393. package/src/utils/rules/isNotAfterDate/IsNotAfterDate.mdx +27 -4
  394. package/src/utils/rules/isNotAfterToday/IsNotAfterToday.mdx +27 -4
  395. package/src/utils/rules/isNotBeforeDate/IsNotBeforeDate.mdx +27 -4
  396. package/src/utils/rules/isNotBeforeToday/IsNotBeforeToday.mdx +27 -3
  397. package/src/utils/rules/isRequired/IsRequired.mdx +27 -4
  398. package/src/utils/rules/isValidEmail/IsValidEmail.mdx +27 -4
  399. package/dist/components/Tables/common/tableStorageUtils.d.ts +0 -69
  400. package/dist/components/Tables/common/tableUtils.d.ts +0 -79
  401. package/dist/main-C66C1BkG.js +0 -29878
  402. package/dist/stories/EcoConception/ecoDesignItems.d.ts +0 -4
  403. package/src/components/DownloadBtn/tests/__snapshots__/DownloadBtn.spec.ts.snap +0 -92
  404. package/src/components/Tables/common/tableStorageUtils.ts +0 -127
  405. package/src/components/Tables/common/tableUtils.ts +0 -102
  406. package/src/stories/EcoConception/ecoDesignItems.ts +0 -55
  407. package/src/stories/EcoConception/econception.stories.ts +0 -30
@@ -4,7 +4,7 @@
4
4
  inheritAttrs: false,
5
5
  })
6
6
  import { mdiInformation, mdiMenuDown, mdiCloseCircle } from '@mdi/js'
7
- import { ref, watch, onMounted, onUnmounted, computed, nextTick, type PropType } from 'vue'
7
+ import { ref, watch, onMounted, computed, nextTick, type PropType } from 'vue'
8
8
  import { useSySelectKeyboard } from './composables/useSySelectKeyboard'
9
9
  import { vRgaaSvgFix } from '../../../../directives/rgaaSvgFix'
10
10
  import type { VList, VTextField } from 'vuetify/components'
@@ -136,12 +136,12 @@
136
136
  const labelWidth = ref(0)
137
137
  const labelRef = ref<HTMLElement | null>(null)
138
138
  const list = ref<VList | null>(null)
139
+ const textInput = ref<InstanceType<typeof VTextField> | null>(null)
139
140
 
140
141
  const toggleMenu = (skipInitialFocus = false) => {
141
142
  if (props.readonly) return
142
143
  isOpen.value = !isOpen.value
143
144
  if (isOpen.value) {
144
- updateListPosition()
145
145
  // Initialiser la sélection à l'ouverture seulement si pas ouvert via clavier
146
146
  if (!skipInitialFocus) {
147
147
  nextTick(() => {
@@ -173,18 +173,6 @@
173
173
  const inputId = ref(`sy-select-${Math.random().toString(36).substring(7)}`)
174
174
  // Generate unique menu ID for each component instance to avoid conflicts and validation issues
175
175
  const uniqueMenuId = ref(props.menuId === 'sy-select-menu' ? `sy-select-menu-${Math.random().toString(36).substring(7)}` : props.menuId)
176
- const listStyles = ref<Record<string, string>>({})
177
- const updateListPosition = () => {
178
- if (textInput.value?.$el) {
179
- const rect = textInput.value.$el.getBoundingClientRect()
180
- listStyles.value = {
181
- position: 'fixed',
182
- top: props.density === 'compact' ? `${rect.bottom + 22}px` : `${rect.bottom}px`,
183
- left: `${rect.left}px`,
184
- zIndex: '999',
185
- }
186
- }
187
- }
188
176
 
189
177
  const selectItem = (item: ItemType | null, event?: Event) => {
190
178
  // Prevent default action if event is provided
@@ -217,7 +205,6 @@
217
205
  if (event?.type === 'keydown' || event?.type === 'click') {
218
206
  if (!isOpen.value) {
219
207
  isOpen.value = true
220
- updateListPosition()
221
208
  }
222
209
 
223
210
  // S'assurer que le focus DOM revient à l'input et restaurer le focus visuel
@@ -388,8 +375,6 @@
388
375
  return (props.required || props.errorMessages.length > 0) && !selectedItem.value
389
376
  })
390
377
 
391
- const textInput = ref<InstanceType<typeof VTextField> | null>(null)
392
-
393
378
  // Détecte s'il y a des messages d'erreur, de succès ou d'avertissement
394
379
  const hasMessages = computed(() => {
395
380
  if (props.disableErrorHandling) return false
@@ -449,7 +434,6 @@
449
434
  toggleMenu,
450
435
  selectItem,
451
436
  getItemText,
452
- updateListPosition,
453
437
  })
454
438
 
455
439
  // Function to check if an item is the default option (e.g., "-choisir-")
@@ -541,11 +525,6 @@
541
525
 
542
526
  // Then emit the update to the parent
543
527
  emit('update:modelValue', updatedArray)
544
-
545
- // Force update of the UI
546
- nextTick(() => {
547
- updateListPosition()
548
- })
549
528
  }
550
529
  }
551
530
 
@@ -569,63 +548,95 @@
569
548
  }
570
549
  })
571
550
 
572
- let mutationObserver: MutationObserver | null = null
551
+ const ariaManager = {
552
+ cleanInputAttributes(inputElement: HTMLElement): void {
553
+ if (!inputElement) return
573
554
 
574
- // Function to set up proper ARIA attributes
575
- const setupAriaAttributes = () => {
576
- if (textInput.value && textInput.value.$el) {
577
- // Find the input element
578
- const inputElement = textInput.value.$el?.querySelector?.('input')
579
- if (inputElement) {
580
- // Remove problematic attributes that shouldn't be on input
581
- inputElement.removeAttribute('aria-describedby')
582
- inputElement.removeAttribute('size')
583
- inputElement.removeAttribute('tabindex')
584
- inputElement.removeAttribute('aria-hidden')
585
-
586
- // Set proper combobox attributes on input element (following CNSA standard)
587
- inputElement.setAttribute('role', 'combobox')
588
- inputElement.setAttribute('aria-expanded', isOpen.value ? 'true' : 'false')
589
- // Only set aria-controls when menu is open and element exists
590
- if (isOpen.value) {
591
- inputElement.setAttribute('aria-controls', uniqueMenuId.value)
592
- }
593
- else {
594
- inputElement.removeAttribute('aria-controls')
595
- }
596
- // Note: aria-autocomplete is omitted for select-only combobox (invalid to set to 'none')
597
- inputElement.setAttribute('aria-haspopup', 'listbox')
598
- if (isOpen.value && activeDescendantId.value) {
599
- inputElement.setAttribute('aria-activedescendant', activeDescendantId.value)
600
- }
601
- if (isRequired.value) {
602
- inputElement.setAttribute('aria-required', 'true')
603
- }
604
- if (hasError.value) {
605
- inputElement.setAttribute('aria-invalid', 'true')
606
- }
555
+ inputElement.removeAttribute('aria-describedby')
556
+ inputElement.removeAttribute('size')
557
+ inputElement.removeAttribute('tabindex')
558
+ inputElement.removeAttribute('aria-hidden')
559
+ },
560
+
561
+ updateInputState(inputElement: HTMLElement, isOpenValue: boolean, menuId: string, activeDescendant?: string): void {
562
+ if (!inputElement) return
563
+
564
+ inputElement.setAttribute('role', 'combobox')
565
+ inputElement.setAttribute('aria-expanded', isOpenValue ? 'true' : 'false')
566
+ inputElement.setAttribute('aria-haspopup', 'listbox')
567
+
568
+ if (isOpenValue) {
569
+ inputElement.setAttribute('aria-controls', menuId)
570
+ }
571
+ else {
572
+ inputElement.removeAttribute('aria-controls')
607
573
  }
608
574
 
609
- // Clean up parent element - remove any conflicting attributes
610
- const parentElement = textInput.value.$el
611
- if (parentElement) {
612
- // Remove any role or ARIA attributes from parent that should be on input
613
- parentElement.removeAttribute('role')
614
- parentElement.removeAttribute('aria-expanded')
615
- parentElement.removeAttribute('aria-controls')
616
- parentElement.removeAttribute('aria-haspopup')
617
- parentElement.removeAttribute('aria-activedescendant')
618
- parentElement.removeAttribute('aria-required')
619
- parentElement.removeAttribute('aria-invalid')
620
- parentElement.removeAttribute('aria-hidden')
621
-
622
- // Remove role="alert" and aria-live from message containers to prevent screen reader interruption
623
- const messagesElements = parentElement.querySelectorAll('[role="alert"]')
624
- messagesElements.forEach((element: Element) => {
625
- element.removeAttribute('role')
626
- element.removeAttribute('aria-live')
627
- })
575
+ if (isOpenValue && activeDescendant) {
576
+ inputElement.setAttribute('aria-activedescendant', activeDescendant)
577
+ }
578
+ else {
579
+ inputElement.removeAttribute('aria-activedescendant')
628
580
  }
581
+ },
582
+
583
+ updateValidationAttributes(inputElement: HTMLElement, isRequiredValue: boolean, hasErrorValue: boolean): void {
584
+ if (!inputElement) return
585
+
586
+ if (isRequiredValue) {
587
+ inputElement.setAttribute('aria-required', 'true')
588
+ }
589
+ else {
590
+ inputElement.removeAttribute('aria-required')
591
+ }
592
+
593
+ if (hasErrorValue) {
594
+ inputElement.setAttribute('aria-invalid', 'true')
595
+ }
596
+ else {
597
+ inputElement.removeAttribute('aria-invalid')
598
+ }
599
+ },
600
+
601
+ cleanParentAttributes(parentElement: HTMLElement): void {
602
+ if (!parentElement) return
603
+
604
+ parentElement.removeAttribute('role')
605
+ parentElement.removeAttribute('aria-expanded')
606
+ parentElement.removeAttribute('aria-controls')
607
+ parentElement.removeAttribute('aria-haspopup')
608
+ parentElement.removeAttribute('aria-activedescendant')
609
+ parentElement.removeAttribute('aria-required')
610
+ parentElement.removeAttribute('aria-invalid')
611
+ parentElement.removeAttribute('aria-hidden')
612
+ },
613
+
614
+ cleanAlertAttributes(parentElement: HTMLElement): void {
615
+ if (!parentElement) return
616
+
617
+ const messagesElements = parentElement.querySelectorAll('[role="alert"]')
618
+ messagesElements.forEach((element: Element) => {
619
+ element.removeAttribute('role')
620
+ element.removeAttribute('aria-live')
621
+ })
622
+ },
623
+ }
624
+
625
+ const setupAriaAttributes = () => {
626
+ if (!textInput.value || !textInput.value.$el) return
627
+
628
+ const inputElement = textInput.value.$el.querySelector('input') as HTMLElement
629
+ const parentElement = textInput.value.$el as HTMLElement
630
+
631
+ if (inputElement) {
632
+ ariaManager.cleanInputAttributes(inputElement)
633
+ ariaManager.updateInputState(inputElement, isOpen.value, uniqueMenuId.value, activeDescendantId.value)
634
+ ariaManager.updateValidationAttributes(inputElement, Boolean(isRequired.value), Boolean(hasError.value))
635
+ }
636
+
637
+ if (parentElement) {
638
+ ariaManager.cleanParentAttributes(parentElement)
639
+ ariaManager.cleanAlertAttributes(parentElement)
629
640
  }
630
641
  }
631
642
 
@@ -633,94 +644,37 @@
633
644
  if (labelRef.value) {
634
645
  labelWidth.value = labelRef.value.offsetWidth + 64
635
646
  }
636
- window.addEventListener('scroll', updateListPosition, true)
637
- window.addEventListener('resize', updateListPosition)
638
647
 
639
- // Use nextTick to ensure the DOM is fully rendered
640
648
  nextTick(() => {
641
- // Initial setup
642
649
  setupAriaAttributes()
643
650
 
644
- // Set up MutationObserver to monitor attribute changes
645
- if (textInput.value && textInput.value.$el) {
646
- mutationObserver = new MutationObserver((mutations) => {
647
- let needsCleanup = false
648
- mutations.forEach((mutation) => {
649
- if (mutation.type === 'attributes') {
650
- const target = mutation.target as HTMLElement
651
- const attributeName = mutation.attributeName
652
-
653
- // Check if problematic attributes were added to input
654
- if (target.tagName === 'INPUT' && (
655
- attributeName === 'role'
656
- || attributeName === 'aria-hidden'
657
- || attributeName === 'aria-expanded'
658
- || attributeName === 'aria-controls'
659
- || attributeName === 'aria-haspopup'
660
- )) {
661
- needsCleanup = true
662
- }
663
-
664
- // Check if aria-hidden was added to parent
665
- if (target === textInput.value?.$el && attributeName === 'aria-hidden') {
666
- needsCleanup = true
667
- }
668
-
669
- // Check if role="alert" or aria-live was added to any element (error messages)
670
- if (attributeName === 'role' && (target as HTMLElement).getAttribute('role') === 'alert') {
671
- needsCleanup = true
672
- }
673
- if (attributeName === 'aria-live') {
674
- needsCleanup = true
675
- }
676
- }
677
- })
678
-
679
- if (needsCleanup) {
680
- // Use setTimeout to avoid infinite loops
681
- setTimeout(setupAriaAttributes, 0)
682
- }
683
- })
684
-
685
- // Observe both the parent element and its children
686
- mutationObserver.observe(textInput.value.$el, {
687
- attributes: true,
688
- subtree: true,
689
- attributeFilter: ['role', 'aria-hidden', 'aria-expanded', 'aria-controls', 'aria-haspopup', 'aria-live'],
690
- })
691
- }
651
+ setTimeout(setupAriaAttributes, 100)
652
+ setTimeout(setupAriaAttributes, 300)
692
653
  })
693
654
  })
694
655
 
695
- // Watchers to update ARIA attributes dynamically on input element
696
656
  watch(isOpen, (newValue) => {
697
657
  nextTick(() => {
698
- if (textInput.value && textInput.value.$el) {
699
- const inputElement = textInput.value.$el?.querySelector?.('input')
700
- if (inputElement) {
701
- inputElement.setAttribute('aria-expanded', newValue ? 'true' : 'false')
702
- if (newValue && activeDescendantId.value) {
703
- inputElement.setAttribute('aria-activedescendant', activeDescendantId.value)
704
- }
705
- else {
706
- inputElement.removeAttribute('aria-activedescendant')
707
- }
708
- }
658
+ if (!textInput.value || !textInput.value.$el) return
659
+
660
+ const inputElement = textInput.value.$el.querySelector('input') as HTMLElement
661
+ if (inputElement) {
662
+ ariaManager.updateInputState(inputElement, newValue, uniqueMenuId.value, activeDescendantId.value)
709
663
  }
710
664
  })
711
665
  })
712
666
 
713
667
  watch(activeDescendantId, (newValue) => {
714
668
  nextTick(() => {
715
- if (textInput.value && textInput.value.$el && isOpen.value) {
716
- const inputElement = textInput.value.$el?.querySelector?.('input')
717
- if (inputElement) {
718
- if (newValue) {
719
- inputElement.setAttribute('aria-activedescendant', newValue)
720
- }
721
- else {
722
- inputElement.removeAttribute('aria-activedescendant')
723
- }
669
+ if (!textInput.value || !textInput.value.$el || !isOpen.value) return
670
+
671
+ const inputElement = textInput.value.$el.querySelector('input') as HTMLElement
672
+ if (inputElement) {
673
+ if (newValue) {
674
+ inputElement.setAttribute('aria-activedescendant', newValue)
675
+ }
676
+ else {
677
+ inputElement.removeAttribute('aria-activedescendant')
724
678
  }
725
679
  }
726
680
  })
@@ -728,244 +682,214 @@
728
682
 
729
683
  watch(hasError, (newValue) => {
730
684
  nextTick(() => {
731
- if (textInput.value && textInput.value.$el) {
732
- const inputElement = textInput.value.$el?.querySelector?.('input')
733
- if (inputElement) {
734
- if (newValue) {
735
- inputElement.setAttribute('aria-invalid', 'true')
736
- }
737
- else {
738
- inputElement.removeAttribute('aria-invalid')
739
- }
740
- }
685
+ if (!textInput.value || !textInput.value.$el) return
686
+
687
+ const inputElement = textInput.value.$el.querySelector('input') as HTMLElement
688
+ if (inputElement) {
689
+ ariaManager.updateValidationAttributes(
690
+ inputElement,
691
+ Boolean(isRequired.value),
692
+ Boolean(newValue),
693
+ )
741
694
  }
742
695
  })
743
696
  })
744
697
 
745
- // Watch for selection changes to enforce correct accessibility attributes
746
- // This prevents Vuetify from overriding our combobox attributes
747
698
  watch(selectedItem, () => {
748
699
  nextTick(() => {
749
- if (textInput.value && textInput.value.$el) {
750
- const inputElement = textInput.value.$el?.querySelector?.('input')
751
- if (inputElement) {
752
- // Ensure combobox role is maintained on input
753
- inputElement.setAttribute('role', 'combobox')
754
- // Ensure aria-hidden is never set to true
755
- inputElement.removeAttribute('aria-hidden')
756
- // Maintain other combobox attributes
757
- inputElement.setAttribute('aria-expanded', isOpen.value ? 'true' : 'false')
758
- inputElement.setAttribute('aria-haspopup', 'listbox')
759
- // Note: aria-autocomplete is omitted for select-only combobox
760
- // Only set aria-controls when menu is open and element exists
761
- if (isOpen.value) {
762
- inputElement.setAttribute('aria-controls', uniqueMenuId.value)
763
- }
764
- else {
765
- inputElement.removeAttribute('aria-controls')
766
- }
767
-
768
- // Only add aria-required if the component is actually required
769
- if (isRequired.value) {
770
- inputElement.setAttribute('aria-required', 'true')
771
- }
772
- else {
773
- inputElement.removeAttribute('aria-required')
774
- }
775
- }
700
+ if (!textInput.value || !textInput.value.$el) return
776
701
 
777
- // Clean up parent element
778
- const parentElement = textInput.value.$el
779
- if (parentElement) {
780
- parentElement.removeAttribute('role')
781
- parentElement.removeAttribute('aria-hidden')
782
- parentElement.removeAttribute('aria-expanded')
783
- parentElement.removeAttribute('aria-haspopup')
784
- parentElement.removeAttribute('aria-controls')
785
- parentElement.removeAttribute('aria-required')
786
- }
787
- }
702
+ setupAriaAttributes()
788
703
  })
789
704
  }, { deep: true })
790
705
 
791
- onUnmounted(() => {
792
- window.removeEventListener('scroll', updateListPosition, true)
793
- window.removeEventListener('resize', updateListPosition)
794
-
795
- // Clean up MutationObserver
796
- if (mutationObserver) {
797
- mutationObserver.disconnect()
798
- mutationObserver = null
799
- }
800
- })
801
-
802
706
  defineExpose({
803
707
  isOpen,
804
708
  closeList,
805
709
  })
710
+
711
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
712
+ function initializeActivatorProps(activatorProps: Record<string, any>) {
713
+ return {
714
+ // the ref is needed by Vuetify to position the menu and by us for accessibility
715
+ ref: (el) => {
716
+ textInput.value = el
717
+ activatorProps.ref?.(el)
718
+ },
719
+ }
720
+ }
806
721
  </script>
807
722
 
808
723
  <template>
809
- <VTextField
810
- :id="inputId"
811
- ref="textInput"
812
- v-model="selectedItemText"
813
- v-click-outside="closeList"
814
- v-rgaa-svg-fix="true"
815
- :title="$attrs['aria-label'] || labelWithAsterisk"
816
- color="primary"
817
- :disabled="disabled"
818
- :label="labelWithAsterisk"
819
- :aria-label="$attrs['aria-label'] || labelWithAsterisk"
820
- :error-messages="props.disableErrorHandling ? [] : errorMessages"
821
- :variant="outlined ? 'outlined' : 'underlined'"
822
- :rules="isRequired && !props.disableErrorHandling ? ['Le champ est requis.'] : []"
823
- :bg-color="props.bgColor"
824
- :density="props.density"
825
- :active="hasChips || isOpen"
826
- readonly
827
- :hide-details="props.hideMessages && !showHelpTextAsMessage"
828
- :hint="showHelpTextAsMessage ? props.helpText : ''"
829
- :persistent-hint="!!showHelpTextAsMessage"
830
- :autocomplete="props.autocomplete"
831
- class="sy-select"
832
- :class="{ 'sy-select--clearable': props.clearable }"
833
- :width="calculatedWidth"
834
- :style="hasError ? { minWidth: `${labelWidth + 18}px`} : {minWidth: `${labelWidth}px`}"
835
- v-bind="Object.fromEntries(Object.entries($attrs).filter(([key]) => key !== 'display-asterisk'))"
836
- @click="toggleMenu"
837
- @keydown.enter.prevent="handleEnterKey"
838
- @keydown.space.prevent="handleSpaceKey"
839
- @keydown.down.prevent="handleDownKey"
840
- @keydown.up.prevent="handleUpKey"
841
- @keydown.esc.prevent="handleEscapeKey"
842
- @keydown.home.prevent="handleHomeKey"
843
- @keydown.end.prevent="handleEndKey"
844
- @keydown.page-up.prevent="handlePageUpKey"
845
- @keydown.page-down.prevent="handlePageDownKey"
846
- @keydown.tab="handleTabKey"
847
- @keydown="(e) => {
848
- // Handle printable characters for keyboard navigation
849
- if (!e.ctrlKey && !e.altKey && !e.metaKey) {
850
- handleCharacterKey(e.key)
851
- }
852
- }"
724
+ <VMenu
725
+ v-model="isOpen"
726
+ transition="slide-y-transition"
727
+ max-height="300px"
853
728
  >
854
- <div
855
- v-if="hasChips"
856
- class="d-flex flex-wrap gap-1"
857
- >
858
- <VChip
859
- v-for="item in selectedItem"
860
- :key="props.returnObject ? item[props.valueKey] : item"
861
- size="small"
862
- class="ma-1"
863
- closable
864
- :close-label="`Supprimer ${getChipText(item)}`"
865
- @click:close="removeChip(item)"
866
- >
867
- {{ getChipText(item) }}
868
- </VChip>
869
- </div>
870
- <template #append-inner>
871
- <SyIcon
872
- v-if="hasError"
873
- class="mr-6"
874
- color="error"
875
- :icon="mdiInformation"
876
- :decorative="false"
877
- label="Information"
878
- role="img"
879
- />
880
- <button
881
- v-if="props.clearable && selectedItemText"
882
- type="button"
883
- class="sy-select__clear-button"
884
- :style="{ right: hasError ? '62px' : '42px' }"
885
- :aria-label="locales.clear"
886
- @keydown.enter.prevent="$event => selectItem(null, $event)"
887
- @keydown.space.prevent="$event => selectItem(null, $event)"
888
- @click.stop.prevent="$event => selectItem(null, $event)"
729
+ <template #activator="{ props: activatorProps }">
730
+ <VTextField
731
+ :id="inputId"
732
+ v-model="selectedItemText"
733
+ v-click-outside="closeList"
734
+ v-rgaa-svg-fix="true"
735
+ :title="$attrs['aria-label'] || labelWithAsterisk"
736
+ color="primary"
737
+ :disabled="disabled"
738
+ :label="labelWithAsterisk"
739
+ :aria-label="$attrs['aria-label'] || labelWithAsterisk"
740
+ :error-messages="props.disableErrorHandling ? [] : errorMessages"
741
+ :variant="outlined ? 'outlined' : 'underlined'"
742
+ :rules="isRequired && !props.disableErrorHandling ? ['Le champ est requis.'] : []"
743
+ :bg-color="props.bgColor"
744
+ :density="props.density"
745
+ :active="hasChips || isOpen"
746
+ readonly
747
+ :hide-details="props.hideMessages && !showHelpTextAsMessage"
748
+ :hint="showHelpTextAsMessage ? props.helpText : ''"
749
+ :persistent-hint="!!showHelpTextAsMessage"
750
+ :autocomplete="props.autocomplete"
751
+ class="sy-select"
752
+ :class="{ 'sy-select--clearable': props.clearable }"
753
+ :width="calculatedWidth"
754
+ :style="hasError ? { minWidth: `${labelWidth + 18}px`} : {minWidth: `${labelWidth}px`}"
755
+ v-bind="{
756
+ ...Object.fromEntries(Object.entries($attrs).filter(([key]) => key !== 'display-asterisk')),
757
+ ...initializeActivatorProps(activatorProps),
758
+ }"
759
+ @click="toggleMenu"
760
+ @keydown.enter.prevent="handleEnterKey"
761
+ @keydown.space.prevent="handleSpaceKey"
762
+ @keydown.down.prevent="handleDownKey"
763
+ @keydown.up.prevent="handleUpKey"
764
+ @keydown.esc.prevent="handleEscapeKey"
765
+ @keydown.home.prevent="handleHomeKey"
766
+ @keydown.end.prevent="handleEndKey"
767
+ @keydown.page-up.prevent="handlePageUpKey"
768
+ @keydown.page-down.prevent="handlePageDownKey"
769
+ @keydown.tab="handleTabKey"
770
+ @keydown="(e) => {
771
+ // Handle printable characters for keyboard navigation
772
+ if (!e.ctrlKey && !e.altKey && !e.metaKey) {
773
+ handleCharacterKey(e.key)
774
+ }
775
+ }"
889
776
  >
890
- <SyIcon
891
- class="sy-select__clear-icon"
892
- :icon="mdiCloseCircle"
893
- :decorative="true"
894
- />
895
- </button>
896
- <SyIcon
897
- class="arrow"
898
- :icon="mdiMenuDown"
899
- :decorative="true"
900
- />
777
+ <div
778
+ v-if="hasChips"
779
+ class="d-flex flex-wrap gap-1"
780
+ >
781
+ <VChip
782
+ v-for="item in selectedItem"
783
+ :key="props.returnObject ? item[props.valueKey] : item"
784
+ size="small"
785
+ class="ma-1"
786
+ closable
787
+ :close-label="`Supprimer ${getChipText(item)}`"
788
+ @click:close="removeChip(item)"
789
+ >
790
+ {{ getChipText(item) }}
791
+ </VChip>
792
+ </div>
793
+ <template #append-inner>
794
+ <SyIcon
795
+ v-if="hasError"
796
+ class="mr-6"
797
+ color="error"
798
+ :icon="mdiInformation"
799
+ :decorative="false"
800
+ label="Information"
801
+ role="img"
802
+ />
803
+ <button
804
+ v-if="props.clearable && selectedItemText"
805
+ type="button"
806
+ class="sy-select__clear-button"
807
+ :style="{ right: hasError ? '62px' : '42px' }"
808
+ :aria-label="locales.clear"
809
+ @keydown.enter.prevent="$event => selectItem(null, $event)"
810
+ @keydown.space.prevent="$event => selectItem(null, $event)"
811
+ @click.stop.prevent="$event => selectItem(null, $event)"
812
+ >
813
+ <SyIcon
814
+ class="sy-select__clear-icon"
815
+ :icon="mdiCloseCircle"
816
+ :decorative="true"
817
+ />
818
+ </button>
819
+ <SyIcon
820
+ class="arrow"
821
+ :icon="mdiMenuDown"
822
+ :decorative="true"
823
+ />
824
+ </template>
825
+ </VTextField>
826
+ <span
827
+ ref="labelRef"
828
+ class="hidden-label"
829
+ >{{ label }}</span>
901
830
  </template>
902
- </VTextField>
903
- <span
904
- ref="labelRef"
905
- class="hidden-label"
906
- >{{ label }}</span>
907
- <VList
908
- v-if="isOpen"
909
- :id="uniqueMenuId"
910
- ref="list"
911
- class="v-list"
912
- role="listbox"
913
- :aria-multiselectable="props.multiple ? 'true' : undefined"
914
- :aria-label="$attrs['aria-label'] || labelWithAsterisk"
915
- :style="{
916
- minWidth: `${textInput?.$el.offsetWidth}px`,
917
- ...listStyles
918
- }"
919
- bg-color="white"
920
- tabindex="0"
921
- :title="props.multiple ? 'Sélection multiple' : 'Sélection'"
922
- @keydown.esc.prevent="closeList"
923
- @keydown.tab="handleTabKey"
924
- @keydown.enter.prevent="handleEnterKey"
925
- @keydown.down.prevent="handleDownKey"
926
- @keydown.up.prevent="handleUpKey"
927
- @keydown.home.prevent="handleHomeKey"
928
- @keydown.end.prevent="handleEndKey"
929
- @keydown.page-up.prevent="handlePageUpKey"
930
- @keydown.page-down.prevent="handlePageDownKey"
931
- @click.stop
932
- >
933
- <VListItem
934
- v-for="(item, index) in formattedItems"
935
- :id="`option-${index}`"
936
- :key="index"
937
- :ref="'options-' + index"
938
- role="option"
939
- class="v-list-item"
940
- :aria-selected="isItemSelected(item) ? 'true' : 'false'"
941
- tabindex="-1"
942
- :class="{ active: isItemSelected(item) || `option-${index}` === activeDescendantId }"
943
- @click.stop="(event) => selectItem(item, event)"
831
+ <VList
832
+ :id="uniqueMenuId"
833
+ ref="list"
834
+ class="v-list"
835
+ role="listbox"
836
+ :aria-multiselectable="props.multiple ? 'true' : undefined"
837
+ :aria-label="$attrs['aria-label'] || labelWithAsterisk"
838
+ :style="{
839
+ minWidth: `${textInput?.$el.offsetWidth}px`,
840
+ marginTop: props.hideMessages ? '0' : '-22px',
841
+ }"
842
+ bg-color="white"
843
+ tabindex="0"
844
+ :title="props.multiple ? 'Sélection multiple' : 'Sélection'"
845
+ @keydown.esc.prevent="closeList"
846
+ @keydown.tab="handleTabKey"
847
+ @keydown.enter.prevent="handleEnterKey"
848
+ @keydown.down.prevent="handleDownKey"
849
+ @keydown.up.prevent="handleUpKey"
850
+ @keydown.home.prevent="handleHomeKey"
851
+ @keydown.end.prevent="handleEndKey"
852
+ @keydown.page-up.prevent="handlePageUpKey"
853
+ @keydown.page-down.prevent="handlePageDownKey"
854
+ @click.stop
944
855
  >
945
- <template
946
- v-if="props.multiple && !isDefaultOption(item)"
947
- #prepend
856
+ <VListItem
857
+ v-for="(item, index) in formattedItems"
858
+ :id="`option-${index}`"
859
+ :key="index"
860
+ :ref="'options-' + index"
861
+ role="option"
862
+ class="v-list-item"
863
+ :aria-selected="isItemSelected(item) ? 'true' : 'false'"
864
+ tabindex="-1"
865
+ :class="{ active: isItemSelected(item) || `option-${index}` === activeDescendantId }"
866
+ @click.stop="(event) => selectItem(item, event)"
948
867
  >
949
- <SyCheckbox
950
- :model-value="isItemSelected(item)"
951
- density="compact"
952
- hide-details
953
- color="primary"
954
- class="mt-0 pt-0 mr-1"
955
- :title="getItemText(item)"
956
- :aria-label="getItemText(item)"
957
- @click.stop="(event) => selectItem(item, event)"
958
- />
959
- </template>
960
- <VListItemTitle>
961
- <span
962
- v-if="allowHtml"
963
- v-html="getItemText(item)"
964
- />
965
- <span v-else>{{ getItemText(item) }}</span>
966
- </VListItemTitle>
967
- </VListItem>
968
- </VList>
868
+ <template
869
+ v-if="props.multiple && !isDefaultOption(item)"
870
+ #prepend
871
+ >
872
+ <SyCheckbox
873
+ :model-value="isItemSelected(item)"
874
+ density="compact"
875
+ hide-details
876
+ color="primary"
877
+ class="mt-0 pt-0 mr-1"
878
+ :title="getItemText(item)"
879
+ :aria-label="getItemText(item)"
880
+ @click.stop="(event) => selectItem(item, event)"
881
+ />
882
+ </template>
883
+ <VListItemTitle>
884
+ <span
885
+ v-if="allowHtml"
886
+ v-html="getItemText(item)"
887
+ />
888
+ <span v-else>{{ getItemText(item) }}</span>
889
+ </VListItemTitle>
890
+ </VListItem>
891
+ </VList>
892
+ </VMenu>
969
893
 
970
894
  <div
971
895
  v-if="showHelpTextBelow"
@@ -994,16 +918,6 @@
994
918
  }
995
919
  }
996
920
 
997
- .v-list {
998
- margin-top: -22px;
999
- max-height: 300px;
1000
- padding: 0;
1001
- box-shadow: 0 2px 5px rgb(0 0 0 / 12%), 0 2px 10px rgb(0 0 0 / 8%);
1002
- border-radius: 4px;
1003
- overflow-y: auto;
1004
- z-index: 2;
1005
- }
1006
-
1007
921
  .v-list-item:hover {
1008
922
  background-color: rgb(0 0 0 / 4%);
1009
923
  }