@cnamts/synapse 1.0.19 → 1.0.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (378) hide show
  1. package/dist/{DateFilter-CeVuSfJ9.js → DateFilter-uN8OURoP.js} +1 -1
  2. package/dist/{NumberFilter-C8PAu_sw.js → NumberFilter-sm1dQNQi.js} +1 -1
  3. package/dist/{PeriodFilter-UMUaxx3d.js → PeriodFilter-Cklsxnh9.js} +1 -1
  4. package/dist/{SelectFilter-CqZl8CYt.js → SelectFilter-CWefj27Z.js} +1 -1
  5. package/dist/{TextFilter-D_RhhNOh.js → TextFilter-Ddyj885L.js} +1 -1
  6. package/dist/components/Amelipro/AmeliproAutoCompleteField/AmeliproAutoCompleteField.d.ts +4 -4
  7. package/dist/components/Amelipro/AmeliproClickableTile/AmeliproClickableTile.d.ts +17 -7
  8. package/dist/components/Amelipro/AmeliproSelect/AmeliproSelect.d.ts +4 -4
  9. package/dist/components/Amelipro/AmeliproTabs/AmeliproTabs.d.ts +4 -4
  10. package/dist/components/Customs/Selects/SyAutocomplete/SyAutocomplete.d.ts +2416 -0
  11. package/dist/components/Customs/Selects/SyAutocomplete/types.d.ts +5 -0
  12. package/dist/components/Customs/Selects/SyAutocomplete/utils/ariaManager.d.ts +14 -0
  13. package/dist/components/Customs/Selects/SyAutocomplete/utils/useItemUtils.d.ts +16 -0
  14. package/dist/components/Customs/Selects/SyAutocomplete/utils/useKeyboardHandler.d.ts +28 -0
  15. package/dist/components/Customs/Selects/SyAutocomplete/utils/useSelectionLogic.d.ts +12 -0
  16. package/dist/components/Customs/Selects/SySelect/composables/useSySelectKeyboard.d.ts +2 -0
  17. package/dist/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.d.ts +160 -0
  18. package/dist/components/Customs/SyCheckBoxGroup/locales.d.ts +3 -0
  19. package/dist/components/Customs/SyCheckBoxGroup/types.d.ts +10 -0
  20. package/dist/components/Customs/SyCheckbox/SyCheckbox.d.ts +1545 -2
  21. package/dist/components/Customs/SyIcon/SyIcon.d.ts +2 -1
  22. package/dist/components/Customs/SyRadioGroup/SyRadioGroup.d.ts +1495 -2
  23. package/dist/components/DatePicker/composables/useDateSelection.d.ts +1 -0
  24. package/dist/components/DeclarationAccessibilityPage/DeclarationAccessibilityPage.d.ts +60 -0
  25. package/dist/components/ErrorPage/ErrorPage.d.ts +1 -12
  26. package/dist/components/ErrorPage/locales.d.ts +18 -3
  27. package/dist/components/FileUpload/FileUpload.d.ts +2 -0
  28. package/dist/components/MaintenancePage/locales.d.ts +18 -2
  29. package/dist/components/NotFoundPage/locales.d.ts +20 -4
  30. package/dist/components/PaginatedTable/PaginatedTable.d.ts +1 -1
  31. package/dist/components/PaginatedTable/Pagination.d.ts +17 -0
  32. package/dist/components/StatusPage/StatusPage.d.ts +39 -0
  33. package/dist/components/Tables/SyServerTable/SyServerTable.d.ts +5 -5
  34. package/dist/components/Tables/SyTable/SyTable.d.ts +5 -5
  35. package/dist/components/UploadWorkflow/UploadWorkflow.d.ts +13 -3
  36. package/dist/components/index.d.ts +4 -0
  37. package/dist/components/types.d.ts +15 -0
  38. package/dist/composables/useFormFieldErrorHandling.d.ts +31 -0
  39. package/dist/design-system-v3.js +126 -122
  40. package/dist/design-system-v3.umd.cjs +325 -314
  41. package/dist/{main-B39UVv5p.js → main-CWniLr0s.js} +15837 -14587
  42. package/dist/modules.d.ts +6 -0
  43. package/dist/style.css +1 -1
  44. package/dist/utils/theme/index.d.ts +6 -0
  45. package/package.json +12 -10
  46. package/src/assets/amelipro/icons.ts +166 -153
  47. package/src/components/Accordion/Accordion.mdx +4 -1
  48. package/src/components/Accordion/{Accessibilite/AccessibilityGuide.mdx → accessibilite/Accessibility.mdx} +2 -2
  49. package/src/components/Amelipro/AmeliproClickableTile/AmeliproClickableTile.stories.ts +73 -14
  50. package/src/components/Amelipro/AmeliproClickableTile/AmeliproClickableTile.vue +119 -27
  51. package/src/components/Amelipro/AmeliproClickableTile/tests/AmeliproClickableTile.a11y.spec.ts +304 -0
  52. package/src/components/Amelipro/AmeliproClickableTile/tests/AmeliproClickableTile.spec.ts +435 -9
  53. package/src/components/Amelipro/AmeliproClickableTile/tests/__snapshots__/AmeliproClickableTile.spec.ts.snap +60 -0
  54. package/src/components/Amelipro/AmeliproIcon/__tests__/AmeliproIcon.spec.ts +1 -1
  55. package/src/components/Amelipro/AmeliproIcon/iconList.ts +2 -0
  56. package/src/components/BackBtn/BackBtn.vue +5 -4
  57. package/src/components/BackBtn/accessibilite/Accessibility.mdx +15 -0
  58. package/src/components/BackToTopBtn/BackToTopBtn.vue +6 -3
  59. package/src/components/BackToTopBtn/accessibilite/Accessibility.mdx +15 -0
  60. package/src/components/Captcha/Captcha.vue +5 -1
  61. package/src/components/Captcha/CaptchaAlert.vue +9 -7
  62. package/src/components/Captcha/accessibilite/Accessibility.mdx +10 -0
  63. package/src/components/ChipList/accessibilite/Accessibility.mdx +15 -0
  64. package/src/components/CollapsibleList/{Accessibilite.mdx → accessibilite/Accessibility.mdx} +8 -6
  65. package/src/components/Common/IconSlot/IconSlot.vue +1 -1
  66. package/src/components/ContextualMenu/ContextualMenu.stories.ts +0 -3
  67. package/src/components/ContextualMenu/accessibilite/Accessibility.mdx +71 -0
  68. package/src/components/CookieBanner/CookieBanner.stories.ts +11 -20
  69. package/src/components/CookieBanner/CookieBanner.vue +20 -5
  70. package/src/components/CookieBanner/accessibilite/Accessibility.mdx +71 -0
  71. package/src/components/CookieBanner/tests/CookieBanner.spec.ts +48 -4
  72. package/src/components/CookiesSelection/CookiesInformation/CookiesInformation.vue +5 -4
  73. package/src/components/CopyBtn/CopyBtn.vue +6 -3
  74. package/src/components/CopyBtn/accessibilite/Accessibility.mdx +15 -0
  75. package/src/components/Customs/Selects/SelectBtnField/accessibilite/Accessibility.mdx +15 -0
  76. package/src/components/Customs/Selects/SelectOverview.mdx +112 -1
  77. package/src/components/Customs/Selects/SyAutocomplete/SyAutocomplete.mdx +52 -0
  78. package/src/components/Customs/Selects/SyAutocomplete/SyAutocomplete.stories.ts +979 -0
  79. package/src/components/Customs/Selects/SyAutocomplete/SyAutocomplete.vue +653 -0
  80. package/src/components/Customs/Selects/{SySelect → SyAutocomplete/accessibilite}/Accessibilite.stories.ts +7 -38
  81. package/src/components/Customs/Selects/{SySelect/Accessibilite.mdx → SyAutocomplete/accessibilite/Accessibility.mdx} +15 -20
  82. package/src/components/Customs/Selects/SyAutocomplete/tests/SyAutocomplete.a11y.spec.ts +72 -0
  83. package/src/components/Customs/Selects/SyAutocomplete/tests/SyAutocomplete.spec.ts +345 -0
  84. package/src/components/Customs/Selects/SyAutocomplete/types.ts +7 -0
  85. package/src/components/Customs/Selects/SyAutocomplete/utils/ariaManager.ts +180 -0
  86. package/src/components/Customs/Selects/SyAutocomplete/utils/useItemUtils.ts +46 -0
  87. package/src/components/Customs/Selects/SyAutocomplete/utils/useKeyboardHandler.ts +107 -0
  88. package/src/components/Customs/Selects/SyAutocomplete/utils/useSelectionLogic.ts +74 -0
  89. package/src/components/Customs/Selects/SyInputSelect/SyInputSelect.vue +13 -9
  90. package/src/components/Customs/Selects/SyInputSelect/accessibilite/Accessibility.mdx +12 -0
  91. package/src/components/Customs/Selects/SySelect/SySelect.stories.ts +43 -34
  92. package/src/components/Customs/Selects/SySelect/SySelect.vue +19 -2
  93. package/src/components/Customs/Selects/SySelect/accessibilite/Accessibility.mdx +274 -0
  94. package/src/components/Customs/Selects/SySelect/composables/useSySelectKeyboard.ts +21 -16
  95. package/src/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.mdx +32 -0
  96. package/src/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.stories.ts +856 -0
  97. package/src/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.vue +334 -0
  98. package/src/components/Customs/SyCheckBoxGroup/accessibilite/Accessibility.mdx +243 -0
  99. package/src/components/Customs/SyCheckBoxGroup/locales.ts +3 -0
  100. package/src/components/Customs/SyCheckBoxGroup/tests/SyCheckBoxGroup.a11y.spec.ts +30 -0
  101. package/src/components/Customs/SyCheckBoxGroup/tests/SyCheckBoxGroup.spec.ts +152 -0
  102. package/src/components/Customs/SyCheckBoxGroup/types.ts +10 -0
  103. package/src/components/Customs/SyCheckbox/SyCheckbox.vue +16 -27
  104. package/src/components/Customs/SyCheckbox/{Accessibilite.mdx → accessibilite/Accessibility.mdx} +3 -3
  105. package/src/components/Customs/SyForm/SyForm.a11y.spec.ts +1 -1
  106. package/src/components/Customs/SyForm/accessibilite/Accessibility.mdx +10 -0
  107. package/src/components/Customs/SyIcon/SyIcon.mdx +4 -1
  108. package/src/components/Customs/SyIcon/SyIcon.vue +4 -3
  109. package/src/components/Customs/SyIcon/{Accessibilite.stories.ts → accessibilite/Accessibilite.stories.ts} +3 -3
  110. package/src/components/Customs/SyIcon/{Accessibilite.mdx → accessibilite/Accessibility.mdx} +2 -2
  111. package/src/components/Customs/SyPagination/SyPagination.mdx +4 -2
  112. package/src/components/Customs/SyPagination/accessibilite/Accessibility.mdx +10 -0
  113. package/src/components/Customs/SyRadioGroup/SyRadioGroup.vue +16 -43
  114. package/src/components/Customs/SyRadioGroup/{Accessibilite.mdx → accessibilite/Accessibility.mdx} +2 -2
  115. package/src/components/Customs/SyTabs/SyTabs.mdx +4 -2
  116. package/src/components/Customs/SyTabs/{Accessibilite.mdx → accessibilite/Accessibility.mdx} +2 -2
  117. package/src/components/Customs/SyTextField/SyTextField.mdx +1 -2
  118. package/src/components/Customs/SyTextField/SyTextField.vue +13 -0
  119. package/src/components/Customs/SyTextField/accessibilite/Accessibility.mdx +15 -0
  120. package/src/components/DataList/accessibilite/Accessibility.mdx +15 -0
  121. package/src/components/DataListGroup/accessibilite/Accessibility.mdx +14 -0
  122. package/src/components/DatePicker/Accessibilite.mdx +1 -1
  123. package/src/components/DatePicker/Accessibilite.stories.ts +1 -1
  124. package/src/components/DatePicker/CalendarMode/DatePicker.stories.ts +7 -4
  125. package/src/components/DatePicker/CalendarMode/DatePicker.vue +49 -13
  126. package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.stories.ts +43 -2
  127. package/src/components/DatePicker/DatePickerValidationExample/DatePickerValidation.stories.ts +297 -0
  128. package/src/components/DatePicker/DateTextInput/DateTextInput.vue +48 -21
  129. package/src/components/DatePicker/DateTextInput/NoCalendar.stories.ts +98 -0
  130. package/src/components/DatePicker/composables/useDateSelection.ts +5 -0
  131. package/src/components/DatePicker/docExamples/BidirectionalComplexValidation.vue +273 -0
  132. package/src/components/DatePicker/docExamples/DatePickerBidirectionalValidation.vue +4 -4
  133. package/src/components/DatePicker/docExamples/DatePickerValidationExamples.vue +10 -0
  134. package/src/components/DeclarationAccessibilityPage/DeclarationAccessibilityPage.mdx +83 -0
  135. package/src/components/DeclarationAccessibilityPage/DeclarationAccessibilityPage.stories.ts +502 -0
  136. package/src/components/DeclarationAccessibilityPage/DeclarationAccessibilityPage.vue +428 -0
  137. package/src/components/DeclarationAccessibilityPage/accessibilite/Accessibility.mdx +75 -0
  138. package/src/components/DeclarationAccessibilityPage/tests/DeclarationAccessibilityPage.a11y.spec.ts +53 -0
  139. package/src/components/DeclarationAccessibilityPage/tests/DeclarationAccessibilityPage.spec.ts +59 -0
  140. package/src/components/DiacriticPicker/DiacriticPicker.vue +20 -1
  141. package/src/components/DiacriticPicker/accessibilite/Accessibility.mdx +10 -0
  142. package/src/components/DialogBox/accessibilite/Accessibility.mdx +15 -0
  143. package/src/components/DownloadBtn/DownloadBtn.vue +5 -4
  144. package/src/components/DownloadBtn/accessibilite/Accessibility.mdx +15 -0
  145. package/src/components/ErrorPage/ErrorPage.mdx +6 -16
  146. package/src/components/ErrorPage/ErrorPage.stories.ts +16 -87
  147. package/src/components/ErrorPage/ErrorPage.vue +38 -125
  148. package/src/components/ErrorPage/accessibilite/Accessibility.mdx +77 -0
  149. package/src/components/ErrorPage/assets/error-ap.svg +1774 -0
  150. package/src/components/ErrorPage/locales.ts +21 -3
  151. package/src/components/ErrorPage/tests/ErrorPage.a11y.spec.ts +5 -13
  152. package/src/components/ErrorPage/tests/ErrorPage.spec.ts +2 -41
  153. package/src/components/ErrorPage/tests/__snapshots__/ErrorPage.spec.ts.snap +8 -266
  154. package/src/components/ExternalLinks/accessibilite/Accessibility.mdx +15 -0
  155. package/src/components/FileList/UploadItem/UploadItem.vue +25 -20
  156. package/src/components/FileList/accessibilite/Accessibility.mdx +12 -0
  157. package/src/components/FilePreview/accessibilite/Accessibility.mdx +12 -0
  158. package/src/components/FileUpload/FileUpload.vue +5 -0
  159. package/src/components/FileUpload/FileUploadContent.vue +5 -4
  160. package/src/components/FileUpload/accessibilite/Accessibility.mdx +12 -0
  161. package/src/components/FilterInline/FilterInline.vue +5 -4
  162. package/src/components/FilterInline/accessibilite/Accessibility.mdx +12 -0
  163. package/src/components/FilterSideBar/accessibilite/Accessibility.mdx +15 -0
  164. package/src/components/FooterBar/FooterBar.stories.ts +18 -14
  165. package/src/components/FooterBar/{Accessibilite.mdx → accessibilite/Accessibility.mdx} +3 -4
  166. package/src/components/FooterBar/defaultSocialMediaLinks.ts +6 -4
  167. package/src/components/FranceConnectBtn/FranceConnectBtn.vue +6 -5
  168. package/src/components/FranceConnectBtn/accessibilite/Accessibility.mdx +15 -0
  169. package/src/components/FranceConnectBtn/tests/__snapshots__/FranceConnectBtn.spec.ts.snap +3 -0
  170. package/src/components/HeaderBar/HeaderBurgerMenu/accessibilite/Accessibility.mdx +15 -0
  171. package/src/components/HeaderBar/accessibilite/Accessibility.mdx +15 -0
  172. package/src/components/HeaderBar/{Usages.mdx → usages/Usages.mdx} +2 -2
  173. package/src/components/HeaderLoading/{Accessibilite.mdx → accessibilite/Accessibility.mdx} +9 -5
  174. package/src/components/HeaderToolbar/accessibilite/Accessibility.mdx +15 -0
  175. package/src/components/LangBtn/LangBtn.vue +5 -4
  176. package/src/components/LangBtn/accessibilite/Accessibility.mdx +15 -0
  177. package/src/components/Logo/accessibilite/Accessibility.mdx +17 -0
  178. package/src/components/LogoBrandSection/accessibilite/Accessibility.mdx +12 -0
  179. package/src/components/LunarCalendar/accessibilite/Accessibility.mdx +10 -0
  180. package/src/components/MaintenancePage/MaintenancePage.mdx +1 -1
  181. package/src/components/MaintenancePage/MaintenancePage.vue +15 -7
  182. package/src/components/MaintenancePage/accessibilite/Accessibility.mdx +70 -0
  183. package/src/components/MaintenancePage/assets/maintenance-ap.svg +1718 -0
  184. package/src/components/MaintenancePage/locales.ts +24 -3
  185. package/src/components/MaintenancePage/tests/MaintenancePage.a11y.spec.ts +75 -3
  186. package/src/components/MaintenancePage/tests/MaintenancePage.spec.ts +42 -2
  187. package/src/components/MaintenancePage/tests/__snapshots__/MaintenancePage.spec.ts.snap +3 -2
  188. package/src/components/NirField/accessibilite/Accessibility.mdx +15 -0
  189. package/src/components/NotFoundPage/NotFoundPage.mdx +1 -1
  190. package/src/components/NotFoundPage/NotFoundPage.stories.ts +3 -3
  191. package/src/components/NotFoundPage/NotFoundPage.vue +16 -11
  192. package/src/components/NotFoundPage/accessibilite/Accessibility.mdx +87 -0
  193. package/src/components/NotFoundPage/assets/not-found-ap.svg +2061 -0
  194. package/src/components/NotFoundPage/locales.ts +24 -4
  195. package/src/components/NotFoundPage/tests/NotFoundPage.a11y.spec.ts +168 -4
  196. package/src/components/NotFoundPage/tests/NotFoundPage.spec.ts +100 -12
  197. package/src/components/NotFoundPage/tests/__snapshots__/NotFoundPage.spec.ts.snap +2 -2
  198. package/src/components/NotificationBar/Notification/Notification.vue +1 -1
  199. package/src/components/NotificationBar/NotificationBar.mdx +2 -2
  200. package/src/components/NotificationBar/accessibilite/Accessibility.mdx +75 -0
  201. package/src/components/PageContainer/{AccessibilityGuide.mdx → accessibilite/Accessibility.mdx} +7 -4
  202. package/src/components/PageContainer/tests/PageContainer.a11y.spec.ts +14 -7
  203. package/src/components/PaginatedTable/PaginatedTable.vue +27 -47
  204. package/src/components/PaginatedTable/Pagination.vue +93 -0
  205. package/src/components/PaginatedTable/accessibilite/Accessibility.mdx +12 -0
  206. package/src/components/PasswordField/PasswordField.vue +2 -1
  207. package/src/components/PasswordField/accessibilite/Accessibility.mdx +108 -0
  208. package/src/components/PeriodField/accessibilite/Accessibility.mdx +12 -0
  209. package/src/components/PhoneField/PhoneField.stories.ts +46 -38
  210. package/src/components/PhoneField/accessibilite/Accessibility.mdx +15 -0
  211. package/src/components/RangeField/accessibilite/Accessibility.mdx +15 -0
  212. package/src/components/RatingPicker/accessibilite/Accessibility.mdx +15 -0
  213. package/src/components/SearchListField/SearchListField.vue +6 -3
  214. package/src/components/SearchListField/accessibilite/Accessibility.mdx +15 -0
  215. package/src/components/SkipLink/{Accessibilite.mdx → accessibilite/Accessibility.mdx} +7 -4
  216. package/src/components/SocialMediaLinks/DefaultSocialMediaLinks.ts +6 -4
  217. package/src/components/SocialMediaLinks/SocialMediaLinks.mdx +7 -5
  218. package/src/components/SocialMediaLinks/SocialMediaLinks.stories.ts +17 -13
  219. package/src/components/SocialMediaLinks/SocialMediaLinks.vue +9 -1
  220. package/src/components/SocialMediaLinks/accessibilite/Accessibility.mdx +67 -0
  221. package/src/components/SocialMediaLinks/tests/DefaultSocialMediaLinks.spec.ts +5 -5
  222. package/src/components/SocialMediaLinks/tests/SocialMediaLinks.a11y.spec.ts +59 -0
  223. package/src/components/SocialMediaLinks/tests/SocialMediaLinks.spec.ts +9 -7
  224. package/src/components/StatusPage/StatusPage.mdx +22 -0
  225. package/src/components/StatusPage/StatusPage.stories.ts +193 -0
  226. package/src/components/StatusPage/StatusPage.vue +145 -0
  227. package/src/components/StatusPage/accessibilite/Accessibility.mdx +81 -0
  228. package/src/components/StatusPage/tests/StatusPage.a11y.spec.ts +29 -0
  229. package/src/components/StatusPage/tests/StatusPage.spec.ts +50 -0
  230. package/src/components/StatusPage/tests/__snapshots__/StatusPage.spec.ts.snap +270 -0
  231. package/src/components/SubHeader/accessibilite/Accessibility.mdx +15 -0
  232. package/src/components/SyAlert/SyAlert.vue +6 -6
  233. package/src/components/SyAlert/accessibilite/Accessibility.mdx +12 -0
  234. package/src/components/SyTextArea/accessibilite/Accessibility.mdx +10 -0
  235. package/src/components/TableToolbar/TableToolbar.stories.ts +6 -6
  236. package/src/components/TableToolbar/TableToolbar.vue +7 -4
  237. package/src/components/TableToolbar/accessibilite/Accessibility.mdx +12 -0
  238. package/src/components/TableToolbar/tests/__snapshots__/TableToolbar.spec.ts.snap +0 -5
  239. package/src/components/Tables/SyServerTable/SyServerTable.mdx +4 -1
  240. package/src/components/Tables/SyServerTable/accessibilite/Accessibility.mdx +10 -0
  241. package/src/components/Tables/SyTable/SyTable.mdx +4 -1
  242. package/src/components/Tables/SyTable/accessibilite/Accessibility.mdx +10 -0
  243. package/src/components/Tables/common/TableHeader.vue +3 -1
  244. package/src/components/Tables/common/organizeColumns/OrganizeColumns.vue +18 -14
  245. package/src/components/ToolbarContainer/ToolbarContainer.mdx +2 -1
  246. package/src/components/ToolbarContainer/ToolbarContainer.stories.ts +563 -420
  247. package/src/components/ToolbarContainer/accessibilite/Accessibility.mdx +69 -0
  248. package/src/components/UploadWorkflow/UploadWorkflow.mdx +11 -1
  249. package/src/components/UploadWorkflow/UploadWorkflow.stories.ts +107 -3
  250. package/src/components/UploadWorkflow/UploadWorkflow.vue +35 -24
  251. package/src/components/UploadWorkflow/accessibilite/Accessibility.mdx +12 -0
  252. package/src/components/UploadWorkflow/tests/UploadWorkflow.spec.ts +48 -0
  253. package/src/components/UploadWorkflow/tests/__snapshots__/UploadWorkflow.spec.ts.snap +9 -5
  254. package/src/components/UploadWorkflow/useFileList.ts +7 -0
  255. package/src/components/Usages/Usages.vue +3 -2
  256. package/src/components/UserMenuBtn/UserMenuBtn.vue +7 -5
  257. package/src/components/UserMenuBtn/accessibilite/Accessibility.mdx +12 -0
  258. package/src/components/index.ts +5 -0
  259. package/src/components/types.ts +10 -0
  260. package/src/composables/rules/tests/useFieldValidation.spec.ts +39 -3
  261. package/src/composables/rules/useFieldValidation.ts +31 -9
  262. package/src/composables/useFormFieldErrorHandling.ts +141 -0
  263. package/src/modules.d.ts +6 -0
  264. package/src/stories/Accessibilite/KitDePreAudit/Preaudit.mdx +7 -0
  265. package/src/utils/theme/index.ts +19 -0
  266. package/src/utils/theme/tests/useThemeLocales.spec.ts +245 -0
  267. package/dist/components/MaintenancePage/index.d.ts +0 -2
  268. package/src/components/BackBtn/Accessibilite.mdx +0 -14
  269. package/src/components/BackBtn/Accessibilite.stories.ts +0 -30
  270. package/src/components/BackToTopBtn/Accessibilite.mdx +0 -14
  271. package/src/components/BackToTopBtn/Accessibilite.stories.ts +0 -31
  272. package/src/components/ChipList/Accessibilite.mdx +0 -14
  273. package/src/components/ChipList/Accessibilite.stories.ts +0 -31
  274. package/src/components/CollapsibleList/Accessibilite.stories.ts +0 -29
  275. package/src/components/ContextualMenu/Accessibilite.mdx +0 -13
  276. package/src/components/ContextualMenu/Accessibilite.stories.ts +0 -29
  277. package/src/components/CookieBanner/Accessibilite.mdx +0 -13
  278. package/src/components/CookieBanner/Accessibilite.stories.ts +0 -30
  279. package/src/components/CopyBtn/Accessibilite.mdx +0 -13
  280. package/src/components/CopyBtn/Accessibilite.stories.ts +0 -29
  281. package/src/components/Customs/Selects/SelectBtnField/Accessibilite.mdx +0 -14
  282. package/src/components/Customs/Selects/SelectBtnField/Accessibilite.stories.ts +0 -29
  283. package/src/components/Customs/Selects/SyInputSelect/Accessibilite.mdx +0 -13
  284. package/src/components/Customs/Selects/SyInputSelect/Accessibilite.stories.ts +0 -25
  285. package/src/components/Customs/SyPagination/tests/SyPagination.a11y.spec.ts +0 -27
  286. package/src/components/Customs/SyTabs/tests/SyTabs.a11y.spec.ts +0 -51
  287. package/src/components/Customs/SyTextField/Accessibilite.mdx +0 -14
  288. package/src/components/Customs/SyTextField/Accessibilite.stories.ts +0 -34
  289. package/src/components/DataList/Accessibilite.mdx +0 -13
  290. package/src/components/DataList/Accessibilite.stories.ts +0 -29
  291. package/src/components/DataListGroup/Accessibilite.mdx +0 -13
  292. package/src/components/DataListGroup/Accessibilite.stories.ts +0 -29
  293. package/src/components/DataListItem/tests/DataListItem.a11y.spec.ts +0 -31
  294. package/src/components/DatePicker/CalendarMode/tests/DatePicker.a11y.spec.ts +0 -27
  295. package/src/components/DatePicker/ComplexDatePicker/tests/ComplexDatePicker.a11y.spec.ts +0 -26
  296. package/src/components/DatePicker/DateTextInput/tests/DateTextInput.a11y.spec.ts +0 -27
  297. package/src/components/DialogBox/Accessibilite.mdx +0 -14
  298. package/src/components/DialogBox/Accessibilite.stories.ts +0 -29
  299. package/src/components/DownloadBtn/Accessibilite.mdx +0 -14
  300. package/src/components/DownloadBtn/Accessibilite.stories.ts +0 -29
  301. package/src/components/DownloadBtn/tests/DownloadBtn.a11y.spec.ts +0 -26
  302. package/src/components/ErrorPage/Accessibilite.mdx +0 -13
  303. package/src/components/ErrorPage/Accessibilite.stories.ts +0 -36
  304. package/src/components/ExternalLinks/Accessibilite.mdx +0 -18
  305. package/src/components/ExternalLinks/Accessibilite.stories.ts +0 -62
  306. package/src/components/ExternalLinks/tests/ExternalLinks.a11y.spec.ts +0 -39
  307. package/src/components/FileList/Accessibilite.mdx +0 -13
  308. package/src/components/FileList/Accessibilite.stories.ts +0 -26
  309. package/src/components/FilePreview/Accessibilite.mdx +0 -14
  310. package/src/components/FilePreview/Accessibilite.stories.ts +0 -26
  311. package/src/components/FileUpload/Accessibilite.mdx +0 -13
  312. package/src/components/FileUpload/Accessibilite.stories.ts +0 -26
  313. package/src/components/FilterInline/Accessibilite.mdx +0 -15
  314. package/src/components/FilterInline/Accessibilite.stories.ts +0 -26
  315. package/src/components/FilterSideBar/Accessibilite.mdx +0 -13
  316. package/src/components/FilterSideBar/Accessibilite.stories.ts +0 -30
  317. package/src/components/FooterBar/Accessibilite.stories.ts +0 -26
  318. package/src/components/FranceConnectBtn/Accessibilite.mdx +0 -13
  319. package/src/components/FranceConnectBtn/Accessibilite.stories.ts +0 -30
  320. package/src/components/HeaderBar/Accessibilite.mdx +0 -13
  321. package/src/components/HeaderBar/Accessibilite.stories.ts +0 -31
  322. package/src/components/HeaderBar/HeaderBurgerMenu/Accessibilite.mdx +0 -13
  323. package/src/components/HeaderBar/HeaderBurgerMenu/Accessibilite.stories.ts +0 -30
  324. package/src/components/HeaderLoading/Accessibilite.stories.ts +0 -31
  325. package/src/components/HeaderNavigationBar/tests/HeaderNavigationBar.a11y.spec.ts +0 -45
  326. package/src/components/HeaderToolbar/Accessibilite.mdx +0 -13
  327. package/src/components/HeaderToolbar/Accessibilite.stories.ts +0 -36
  328. package/src/components/HeaderToolbar/tests/HeaderToolbar.a11y.spec.ts +0 -25
  329. package/src/components/LangBtn/Accessibilite.mdx +0 -13
  330. package/src/components/LangBtn/Accessibilite.stories.ts +0 -32
  331. package/src/components/Logo/Accessibilite.mdx +0 -13
  332. package/src/components/Logo/Accessibilite.stories.ts +0 -30
  333. package/src/components/LogoBrandSection/Accessibilite.mdx +0 -13
  334. package/src/components/LogoBrandSection/Accessibilite.stories.ts +0 -26
  335. package/src/components/LunarCalendar/tests/LunarCalendar.a11y.spec.ts +0 -31
  336. package/src/components/MaintenancePage/Accessibilite.mdx +0 -13
  337. package/src/components/MaintenancePage/Accessibilite.stories.ts +0 -36
  338. package/src/components/MaintenancePage/index.ts +0 -3
  339. package/src/components/NirField/Accessibilite.mdx +0 -13
  340. package/src/components/NirField/Accessibilite.stories.ts +0 -31
  341. package/src/components/NotFoundPage/Accessibilite.mdx +0 -13
  342. package/src/components/NotFoundPage/Accessibilite.stories.ts +0 -36
  343. package/src/components/NotificationBar/Accessibilite.mdx +0 -13
  344. package/src/components/NotificationBar/Accessibilite.stories.ts +0 -30
  345. package/src/components/PageContainer/Accessibilite.mdx +0 -13
  346. package/src/components/PageContainer/Accessibilite.stories.ts +0 -30
  347. package/src/components/PaginatedTable/Accessibilite.mdx +0 -13
  348. package/src/components/PaginatedTable/Accessibilite.stories.ts +0 -26
  349. package/src/components/PaginatedTable/tests/PaginatedTable.a11y.spec.ts +0 -43
  350. package/src/components/PasswordField/Accessibilite.mdx +0 -13
  351. package/src/components/PasswordField/Accessibilite.stories.ts +0 -121
  352. package/src/components/PeriodField/Accessibilite.mdx +0 -13
  353. package/src/components/PeriodField/Accessibilite.stories.ts +0 -27
  354. package/src/components/PhoneField/Accessibilite.mdx +0 -13
  355. package/src/components/PhoneField/Accessibilite.stories.ts +0 -32
  356. package/src/components/PhoneField/tests/PhoneField.a11y.spec.ts +0 -34
  357. package/src/components/RangeField/Accessibilite.mdx +0 -13
  358. package/src/components/RangeField/Accessibilite.stories.ts +0 -32
  359. package/src/components/RatingPicker/Accessibilite.mdx +0 -13
  360. package/src/components/RatingPicker/Accessibilite.stories.ts +0 -30
  361. package/src/components/SearchListField/Accessibilite.mdx +0 -13
  362. package/src/components/SearchListField/Accessibilite.stories.ts +0 -30
  363. package/src/components/SkipLink/Accessibilite.stories.ts +0 -36
  364. package/src/components/SocialMediaLinks/Accessibilite.mdx +0 -13
  365. package/src/components/SocialMediaLinks/Accessibilite.stories.ts +0 -36
  366. package/src/components/SubHeader/Accessibilite.mdx +0 -13
  367. package/src/components/SubHeader/Accessibilite.stories.ts +0 -36
  368. package/src/components/SyAlert/Accessibilite.mdx +0 -13
  369. package/src/components/SyAlert/Accessibilite.stories.ts +0 -30
  370. package/src/components/TableToolbar/Accessibilite.mdx +0 -13
  371. package/src/components/TableToolbar/Accessibilite.stories.ts +0 -26
  372. package/src/components/UploadWorkflow/Accessibilite.mdx +0 -13
  373. package/src/components/UploadWorkflow/Accessibilite.stories.ts +0 -26
  374. package/src/components/UserMenuBtn/Accessibilite.mdx +0 -13
  375. package/src/components/UserMenuBtn/Accessibilite.stories.ts +0 -25
  376. /package/src/components/HeaderBar/{Usages.stories.ts → usages/Usages.stories.ts} +0 -0
  377. /package/src/components/NotFoundPage/assets/{not-found.svg → not-found-cnam.svg} +0 -0
  378. /package/src/components/SyBtnMenu/accessibilite/{AccessibilityGuide.mdx → Accessibility.mdx} +0 -0
@@ -0,0 +1,653 @@
1
+ <script setup lang="ts">
2
+ import { computed, onMounted, ref, watch, type PropType } from 'vue'
3
+ import { VMenu, VList, VListItem, VListItemTitle, VChip } from 'vuetify/components'
4
+ import { mdiChevronDown, mdiCloseCircle } from '@mdi/js'
5
+ import SyTextField from '@/components/Customs/SyTextField/SyTextField.vue'
6
+ import SyIcon from '@/components/Customs/SyIcon/SyIcon.vue'
7
+ import SyCheckbox from '@/components/Customs/SyCheckbox/SyCheckbox.vue'
8
+ import { ariaManager } from './utils/ariaManager'
9
+ import { useFormFieldErrorHandling } from '@/composables/useFormFieldErrorHandling'
10
+ import { type ValidationRule } from '@/composables/validation/useValidation'
11
+ import type { ItemType, SelectValue, SelectArray } from './types'
12
+ import { useItemUtils } from './utils/useItemUtils'
13
+ import { useSelectionLogic } from './utils/useSelectionLogic'
14
+ import { useSyAutocompleteKeyboard } from './utils/useKeyboardHandler'
15
+
16
+ const props = defineProps({
17
+ bgColor: {
18
+ type: String,
19
+ default: 'white',
20
+ },
21
+ chips: {
22
+ type: Boolean,
23
+ default: false,
24
+ },
25
+ clearable: {
26
+ type: Boolean,
27
+ default: false,
28
+ },
29
+ customRules: {
30
+ type: Array as PropType<ValidationRule[]>,
31
+ default: () => [],
32
+ },
33
+ customSuccessRules: {
34
+ type: Array as PropType<ValidationRule[]>,
35
+ default: () => [],
36
+ },
37
+ customWarningRules: {
38
+ type: Array as PropType<ValidationRule[]>,
39
+ default: () => [],
40
+ },
41
+ debounce: {
42
+ type: Number,
43
+ default: 200,
44
+ },
45
+ density: {
46
+ type: String as PropType<'default' | 'comfortable' | 'compact' | undefined>,
47
+ default: 'default',
48
+ },
49
+ disableErrorHandling: {
50
+ type: Boolean,
51
+ default: false,
52
+ },
53
+ displayAsterisk: {
54
+ type: Boolean,
55
+ default: false,
56
+ },
57
+ errorMessages: {
58
+ type: Array as PropType<string[] | null>,
59
+ default: null,
60
+ },
61
+ filter: {
62
+ type: Boolean,
63
+ default: true,
64
+ },
65
+ hasError: {
66
+ type: Boolean,
67
+ default: false,
68
+ },
69
+ hasSuccess: {
70
+ type: Boolean,
71
+ default: false,
72
+ },
73
+ hasWarning: {
74
+ type: Boolean,
75
+ default: false,
76
+ },
77
+ hideNoData: {
78
+ type: Boolean,
79
+ default: false,
80
+ },
81
+ isValidateOnBlur: {
82
+ type: Boolean,
83
+ default: false,
84
+ },
85
+ items: {
86
+ type: Array as PropType<ItemType[]>,
87
+ default: () => [],
88
+ },
89
+ label: {
90
+ type: String,
91
+ default: 'Rechercher',
92
+ },
93
+ loading: {
94
+ type: Boolean,
95
+ default: false,
96
+ },
97
+ menuId: {
98
+ type: String,
99
+ default: 'sy-autocomplete-menu',
100
+ },
101
+ modelValue: {
102
+ type: [Object, String, Number, Array, null] as PropType<SelectValue | SelectArray>,
103
+ default: null,
104
+ },
105
+ multiple: {
106
+ type: Boolean,
107
+ default: false,
108
+ },
109
+ noDataText: {
110
+ type: String,
111
+ default: 'Aucune option',
112
+ },
113
+ placeholder: {
114
+ type: String,
115
+ default: '',
116
+ },
117
+ plainTextKey: {
118
+ type: String,
119
+ default: '',
120
+ },
121
+ readonly: {
122
+ type: Boolean,
123
+ default: false,
124
+ },
125
+ required: {
126
+ type: Boolean,
127
+ default: false,
128
+ },
129
+ returnObject: {
130
+ type: Boolean,
131
+ default: false,
132
+ },
133
+ showSuccessMessages: {
134
+ type: Boolean,
135
+ default: true,
136
+ },
137
+ successMessages: {
138
+ type: Array as PropType<string[] | null>,
139
+ default: null,
140
+ },
141
+ textKey: {
142
+ type: String,
143
+ default: 'text',
144
+ },
145
+ valueKey: {
146
+ type: String,
147
+ default: 'value',
148
+ },
149
+ warningMessages: {
150
+ type: Array as PropType<string[] | null>,
151
+ default: null,
152
+ },
153
+ })
154
+
155
+ const emit = defineEmits(['update:modelValue'])
156
+
157
+ const isOpen = ref(false)
158
+ const search = ref('')
159
+ const selected = ref<SelectValue | SelectArray>(props.modelValue as SelectValue | SelectArray)
160
+ const hasInteracted = ref(false)
161
+ const suppressNextInput = ref(false)
162
+ let suppressOpenOnSearch = false
163
+ type SyTextFieldInstance = InstanceType<typeof SyTextField> & { $refs?: { input?: HTMLInputElement } }
164
+ const textFieldRef = ref<SyTextFieldInstance | null>(null)
165
+ const randomId = Math.random().toString(36).slice(2)
166
+ const uniqueMenuId = computed(() => props.menuId === 'sy-autocomplete-menu' ? `sy-autocomplete-menu-${randomId}` : props.menuId)
167
+ const optionIdPrefixed = computed(() => `${uniqueMenuId.value}-option`)
168
+ const activeDescendantId = ref('')
169
+
170
+ const errorHandling = useFormFieldErrorHandling(props, selected)
171
+
172
+ const formattedItems = computed(() => props.items.map((item) => {
173
+ if (typeof item === 'string') {
174
+ return { [props.textKey]: item, [props.valueKey]: item }
175
+ }
176
+ return item
177
+ }))
178
+
179
+ const { getItemText, getPlainText, getValueKey, getStoredValue, getChipLabel } = useItemUtils({
180
+ textKey: props.textKey,
181
+ valueKey: props.valueKey,
182
+ plainTextKey: props.plainTextKey,
183
+ returnObject: props.returnObject,
184
+ }, formattedItems)
185
+
186
+ const { updateValue } = useSelectionLogic({
187
+ multiple: props.multiple,
188
+ returnObject: props.returnObject,
189
+ valueKey: props.valueKey,
190
+ }, getValueKey, getStoredValue, getPlainText, selected, search, emit)
191
+
192
+ const syncSearchFromValue = () => {
193
+ if (props.multiple) return
194
+ if (!selected.value) {
195
+ search.value = ''
196
+ return
197
+ }
198
+ const found = formattedItems.value.find(i => props.returnObject ? i[props.valueKey] === (selected.value as ItemType)[props.valueKey] : i[props.valueKey] === selected.value)
199
+ search.value = found ? getPlainText(found) : ''
200
+ }
201
+
202
+ const normalizedSearch = computed(() => (search.value || '').toLowerCase())
203
+
204
+ const filteredItems = computed(() => {
205
+ if (!props.filter) return formattedItems.value
206
+ return formattedItems.value.filter((item) => {
207
+ const text = String(item[props.plainTextKey || props.textKey] ?? item[props.textKey] ?? '').toLowerCase()
208
+ return text.includes(normalizedSearch.value)
209
+ })
210
+ })
211
+
212
+ const markInteracted = () => {
213
+ hasInteracted.value = true
214
+ }
215
+
216
+ const selectItem = (item: ItemType | string | number | null | undefined) => {
217
+ markInteracted()
218
+ suppressOpenOnSearch = true
219
+ updateValue(item ?? null)
220
+ if (props.multiple) {
221
+ suppressNextInput.value = true
222
+ search.value = ''
223
+ }
224
+ if (!props.multiple) isOpen.value = false
225
+ }
226
+
227
+ watch(() => props.modelValue, (val) => {
228
+ selected.value = val as SelectValue | SelectArray
229
+ suppressOpenOnSearch = true
230
+ syncSearchFromValue()
231
+ }, { immediate: true })
232
+
233
+ let debounceHandle: ReturnType<typeof setTimeout> | null = null
234
+
235
+ watch(search, () => {
236
+ if (suppressOpenOnSearch) {
237
+ suppressOpenOnSearch = false
238
+ return
239
+ }
240
+
241
+ if (!isOpen.value) {
242
+ isOpen.value = true
243
+ }
244
+
245
+ focusInput(textFieldRef)
246
+
247
+ if (!props.filter) return
248
+
249
+ if (debounceHandle) {
250
+ clearTimeout(debounceHandle)
251
+ }
252
+
253
+ debounceHandle = setTimeout(() => {
254
+ }, props.debounce)
255
+ })
256
+
257
+ const hasSelectionToClear = computed(() => {
258
+ return props.multiple
259
+ ? Array.isArray(selected.value) && selected.value.length > 0
260
+ : selected.value != null
261
+ })
262
+
263
+ const hasChips = computed(() => props.multiple && props.chips && Array.isArray(selected.value) && selected.value.length > 0)
264
+
265
+ const displayValue = computed(() => {
266
+ if (props.multiple && !props.chips) {
267
+ const selectedItems = Array.isArray(selected.value) ? selected.value : []
268
+ const selectedTexts: string[] = selectedItems.map(item => getChipLabel(item as ItemType | string | number))
269
+ const prefix = selectedTexts.length > 0 ? selectedTexts.join(', ') + ', ' : ''
270
+ return prefix + search.value
271
+ }
272
+ return search.value
273
+ })
274
+
275
+ const isItemSelected = (item: ItemType) => {
276
+ if (!selected.value) return false
277
+ if (props.multiple && Array.isArray(selected.value)) {
278
+ return selected.value.some(sel => props.returnObject ? (sel as ItemType)[props.valueKey] === item[props.valueKey] : sel === item[props.valueKey])
279
+ }
280
+ return props.returnObject
281
+ ? (selected.value as ItemType)[props.valueKey] === item[props.valueKey]
282
+ : selected.value === item[props.valueKey]
283
+ }
284
+
285
+ const getItemKey = (item: ItemType, index: number): string | number => {
286
+ const raw = item[props.valueKey]
287
+ if (raw === undefined || raw === null) return index
288
+ return typeof raw === 'string' || typeof raw === 'number' ? raw : index
289
+ }
290
+
291
+ const getChipKey = (
292
+ item: ItemType | string | number,
293
+ index: number,
294
+ ): string | number => {
295
+ if (typeof item !== 'object') return item
296
+
297
+ const raw = item?.[props.valueKey]
298
+ return typeof raw === 'string' || typeof raw === 'number'
299
+ ? raw
300
+ : index
301
+ }
302
+
303
+ const { focusInput, keyboardActiveId, handleTabKey } = useSyAutocompleteKeyboard({
304
+ multiple: props.multiple,
305
+ chips: props.chips,
306
+ }, {
307
+ search,
308
+ selected,
309
+ isOpen,
310
+ selectItem,
311
+ getItemText,
312
+ filteredItems,
313
+ uniqueMenuId,
314
+ focusListItem: false,
315
+ })
316
+
317
+ watch(keyboardActiveId, (val) => {
318
+ activeDescendantId.value = val
319
+ })
320
+
321
+ watch(textFieldRef, (tf) => {
322
+ if (tf) {
323
+ focusInput(textFieldRef, true)
324
+ }
325
+ }, { immediate: true })
326
+
327
+ const menuTarget = computed<HTMLElement | undefined>(() => {
328
+ return (textFieldRef.value?.$el as HTMLElement | undefined)?.querySelector('.v-field') ?? undefined
329
+ })
330
+
331
+ const externalErrors = computed(() => props.errorMessages || [])
332
+ const displayErrors = computed(() => externalErrors.value.length > 0 ? externalErrors.value : (hasInteracted.value ? errorHandling.errors.value : []))
333
+ const displayWarnings = computed(() => hasInteracted.value ? errorHandling.warnings.value : [])
334
+ const displaySuccesses = computed(() => hasInteracted.value ? errorHandling.successes.value : [])
335
+ const displayHasError = computed(() => externalErrors.value.length > 0 || (hasInteracted.value && errorHandling.hasError.value))
336
+ const displayHasWarning = computed(() => hasInteracted.value && errorHandling.hasWarning.value)
337
+ const displayHasSuccess = computed(() => hasInteracted.value && errorHandling.hasSuccess.value)
338
+
339
+ const validateOnSubmit = () => {
340
+ markInteracted()
341
+ return errorHandling.validateOnSubmit()
342
+ }
343
+
344
+ const checkErrorOnBlur = () => {
345
+ markInteracted()
346
+ return errorHandling.checkErrorOnBlur()
347
+ }
348
+
349
+ const getInputValue = (value: string | Event): string | null => {
350
+ if (typeof value === 'string') return value
351
+ if (value instanceof Event && value.target instanceof HTMLInputElement) {
352
+ return value.target.value
353
+ }
354
+ return null
355
+ }
356
+
357
+ const handleInput = (value: string | Event) => {
358
+ if (suppressNextInput.value) {
359
+ suppressNextInput.value = false
360
+ return
361
+ }
362
+
363
+ const inputValue = getInputValue(value)
364
+ if (inputValue === null) return
365
+
366
+ if (props.multiple && !props.chips) {
367
+ const selectedItems = Array.isArray(selected.value) ? selected.value : []
368
+ const labels = selectedItems.map(item =>
369
+ getChipLabel(item as ItemType | string | number),
370
+ )
371
+
372
+ const parts = inputValue.split(',').map(p => p.trim())
373
+ let matched = 0
374
+ for (let i = 0; i < Math.min(parts.length, labels.length); i++) {
375
+ if (parts[i] === labels[i]) {
376
+ matched++
377
+ }
378
+ else {
379
+ break
380
+ }
381
+ }
382
+
383
+ if (matched < selectedItems.length) {
384
+ const kept = selectedItems.slice(0, matched)
385
+ selected.value = kept
386
+ emit('update:modelValue', kept)
387
+ }
388
+
389
+ const remainingParts = parts.slice(matched).filter(p => p !== '')
390
+ search.value = remainingParts.join(', ')
391
+ }
392
+ else {
393
+ search.value = inputValue
394
+ }
395
+
396
+ openAndFocus()
397
+ }
398
+
399
+ const openAndFocus = () => {
400
+ markInteracted()
401
+ isOpen.value = true
402
+ focusInput(textFieldRef)
403
+ }
404
+
405
+ const getOptionId = (index: number) => `${optionIdPrefixed.value}-${index}`
406
+
407
+ const resultsLiveText = computed(() => {
408
+ if (props.loading) return 'Chargement des résultats'
409
+ const count = filteredItems.value.length
410
+ if (!props.filter) return ''
411
+ if (count === 0) return props.hideNoData ? 'Aucun résultat' : props.noDataText
412
+ return `${count} option${count > 1 ? 's' : ''} disponible${count > 1 ? 's' : ''}`
413
+ })
414
+
415
+ onMounted(() => {
416
+ syncSearchFromValue()
417
+ ariaManager.setupAriaAttributesForAutocomplete(textFieldRef, isOpen, uniqueMenuId.value, activeDescendantId, props.loading, props.label)
418
+ focusInput(textFieldRef, true)
419
+ })
420
+
421
+ watch([isOpen, activeDescendantId, () => props.loading], () => {
422
+ ariaManager.setupAriaAttributesForAutocomplete(textFieldRef, isOpen, uniqueMenuId.value, activeDescendantId, props.loading, props.label)
423
+ }, { flush: 'post' })
424
+
425
+ watch(isOpen, (open) => {
426
+ if (!open && props.multiple) {
427
+ suppressOpenOnSearch = true
428
+ search.value = ''
429
+ }
430
+ })
431
+
432
+ defineExpose({
433
+ validation: errorHandling.validation,
434
+ validateOnSubmit,
435
+ checkErrorOnBlur,
436
+ isOpen,
437
+ selectItem,
438
+ search,
439
+ })
440
+ </script>
441
+
442
+ <template>
443
+ <div class="sy-autocomplete">
444
+ <VMenu
445
+ v-model="isOpen"
446
+ transition="slide-y-transition"
447
+ max-height="300px"
448
+ location="bottom"
449
+ offset="4"
450
+ origin="top"
451
+ :open-on-click="false"
452
+ :open-on-focus="false"
453
+ :close-on-content-click="false"
454
+ :target="menuTarget"
455
+ >
456
+ <template #activator>
457
+ <SyTextField
458
+ :id="`${uniqueMenuId}-input`"
459
+ ref="textFieldRef"
460
+ :model-value="displayValue"
461
+ :label="hasChips ? '' : label"
462
+ :placeholder="hasChips ? '' : placeholder"
463
+ :readonly="readonly"
464
+ :bg-color="bgColor"
465
+ :density="density"
466
+ :autocomplete="'off'"
467
+ :class="{ 'sy-autocomplete--clearable': clearable }"
468
+ :error-messages="displayErrors"
469
+ :warning-messages="displayWarnings"
470
+ :success-messages="displaySuccesses"
471
+ :has-error="displayHasError"
472
+ :has-warning="displayHasWarning"
473
+ :has-success="displayHasSuccess"
474
+ :required="required"
475
+ :display-asterisk="required && displayAsterisk"
476
+ :aria-label="hasChips ? label : undefined"
477
+ @click="openAndFocus"
478
+ @update:model-value="handleInput"
479
+ @blur="checkErrorOnBlur"
480
+ @keydown.tab="handleTabKey"
481
+ >
482
+ <template #append-inner>
483
+ <button
484
+ v-if="clearable && hasSelectionToClear && !hasChips"
485
+ type="button"
486
+ class="sy-autocomplete__clear-button"
487
+ :aria-label="'Réinitialiser la sélection'"
488
+ @click.stop.prevent="selectItem(null)"
489
+ >
490
+ <SyIcon
491
+ :icon="mdiCloseCircle"
492
+ decorative
493
+ class="sy-autocomplete__clear-icon"
494
+ />
495
+ </button>
496
+ <SyIcon
497
+ class="arrow"
498
+ :icon="mdiChevronDown"
499
+ decorative
500
+ />
501
+ </template>
502
+ <template
503
+ v-if="hasChips"
504
+ #prepend-inner
505
+ >
506
+ <div class="sy-autocomplete__chips">
507
+ <VChip
508
+ v-for="(item, index) in selected as SelectArray"
509
+ :key="getChipKey(item, index)"
510
+ size="small"
511
+ class="ma-1"
512
+ closable
513
+ :close-label="`Supprimer ${getChipLabel(item as ItemType)}`"
514
+ @click:close="() => selectItem(item as ItemType)"
515
+ >
516
+ {{ getChipLabel(item as ItemType) }}
517
+ </VChip>
518
+ </div>
519
+ </template>
520
+ </SyTextField>
521
+ </template>
522
+
523
+ <VList
524
+ :id="uniqueMenuId"
525
+ ref="listRef"
526
+ role="listbox"
527
+ :aria-label="label"
528
+ :aria-labelledby="`${uniqueMenuId}-input`"
529
+ :aria-multiselectable="multiple ? 'true' : undefined"
530
+ :style="{ minWidth: `${textFieldRef?.$el?.offsetWidth || 0}px` }"
531
+ tag="ul"
532
+ tabindex="-1"
533
+ @click.stop
534
+ >
535
+ <template v-if="loading">
536
+ <VListItem
537
+ title="Chargement..."
538
+ tag="li"
539
+ />
540
+ </template>
541
+ <template v-else-if="filteredItems.length === 0 && !hideNoData">
542
+ <VListItem
543
+ :title="noDataText"
544
+ disabled
545
+ tag="li"
546
+ />
547
+ </template>
548
+ <template v-else>
549
+ <VListItem
550
+ v-for="(item, index) in filteredItems"
551
+ :id="getOptionId(index)"
552
+ :key="getItemKey(item, index)"
553
+ role="option"
554
+ :aria-selected="isItemSelected(item) ? 'true' : 'false'"
555
+ :class="{ active: isItemSelected(item) || getOptionId(index) === activeDescendantId }"
556
+ tag="li"
557
+ @mousedown.prevent.stop="() => selectItem(item)"
558
+ >
559
+ <template
560
+ v-if="multiple"
561
+ #prepend
562
+ >
563
+ <SyCheckbox
564
+ :model-value="isItemSelected(item)"
565
+ density="compact"
566
+ hide-details
567
+ color="primary"
568
+ class="mt-0 pt-0 mr-1"
569
+ :title="getItemText(item) as string"
570
+ :aria-label="getItemText(item) as string"
571
+ @mousedown.stop.prevent="() => selectItem(item)"
572
+ />
573
+ </template>
574
+ <VListItemTitle>
575
+ {{ getItemText(item) }}
576
+ </VListItemTitle>
577
+ </VListItem>
578
+ </template>
579
+ </VList>
580
+ </VMenu>
581
+ <div
582
+ class="sy-autocomplete__sr-only"
583
+ role="status"
584
+ aria-live="polite"
585
+ aria-atomic="true"
586
+ >
587
+ {{ resultsLiveText }}
588
+ </div>
589
+ </div>
590
+ </template>
591
+
592
+ <style scoped lang="scss">
593
+ @use '@/assets/tokens';
594
+
595
+ .sy-autocomplete {
596
+ width: 100%;
597
+ position: relative;
598
+ }
599
+
600
+ .sy-autocomplete__sr-only {
601
+ position: absolute;
602
+ width: 1px;
603
+ height: 1px;
604
+ overflow: hidden;
605
+ clip: rect(1px, 1px, 1px, 1px);
606
+ clip-path: inset(50%);
607
+ white-space: nowrap;
608
+ border: 0;
609
+ }
610
+
611
+ .sy-autocomplete__clear-button {
612
+ background: transparent;
613
+ border: none;
614
+ padding: 0;
615
+ cursor: pointer;
616
+ display: flex;
617
+ align-items: center;
618
+ justify-content: center;
619
+ }
620
+
621
+ .sy-autocomplete__clear-icon {
622
+ color: rgb(0 0 0 / 54%);
623
+ }
624
+
625
+ .sy-autocomplete__chips {
626
+ display: flex;
627
+ flex-direction: row !important;
628
+ gap: 4px;
629
+ align-items: center;
630
+ }
631
+
632
+ .v-list-item.active,
633
+ .v-list-item[aria-selected='true'],
634
+ li.active,
635
+ li[aria-selected='true'] {
636
+ background-color: rgb(0 0 0 / 8%);
637
+ }
638
+
639
+ .v-list-item:hover,
640
+ li:hover {
641
+ background-color: rgb(0 0 0 / 4%);
642
+ }
643
+
644
+ /* Ensure focus styles match selection styles for keyboard navigation (align with SySelect) */
645
+ .v-list-item:focus-visible,
646
+ .v-list-item.keyboard-focused,
647
+ li:focus-visible,
648
+ li.keyboard-focused {
649
+ outline: 2px solid tokens.$primary-base;
650
+ outline-offset: -2px;
651
+ background-color: rgb(0 0 0 / 8%);
652
+ }
653
+ </style>