@cnamts/synapse 1.0.23 → 1.0.25

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 (574) hide show
  1. package/README.md +27 -5
  2. package/dist/AutocompleteFilter-D7qBuCAP.js +114 -0
  3. package/dist/AutocompleteFilter-Df9i5mAl.cjs +1 -0
  4. package/dist/DateFilter-BJD6FMev.cjs +1 -0
  5. package/dist/{DateFilter-Dc-gSGwk.js → DateFilter-BitMWrMU.js} +1 -1
  6. package/dist/{NumberFilter-vP38Wp6j.js → NumberFilter-BTLUxw0a.js} +3 -3
  7. package/dist/NumberFilter-DGCzCXzI.cjs +1 -0
  8. package/dist/{PeriodFilter-Ba1uYUnT.js → PeriodFilter-B5rUIPAC.js} +1 -1
  9. package/dist/PeriodFilter-DO_ecTZW.cjs +1 -0
  10. package/dist/SelectFilter-CGwcKWLm.cjs +1 -0
  11. package/dist/SelectFilter-l4QnRcuk.js +135 -0
  12. package/dist/TextFilter-B8nf7xoK.cjs +1 -0
  13. package/dist/{TextFilter-B84dpnoq.js → TextFilter-C9hj6Qrp.js} +7 -7
  14. package/dist/apLightTheme-CEK4iY3f.cjs +1 -0
  15. package/dist/apLightTheme-DnIM24Lv.js +950 -0
  16. package/dist/components/Amelipro/AmeliproAutoCompleteField/AmeliproAutoCompleteField.d.ts +7022 -9616
  17. package/dist/components/Amelipro/AmeliproCarousel/AmeliproCarousel.d.ts +2 -2
  18. package/dist/components/Amelipro/AmeliproIconBtn/AmeliproIconBtn.d.ts +2 -2
  19. package/dist/components/Amelipro/AmeliproPostalAddressField/AmeliproPostalAddressCityRow/AmeliproPostalAddressCityRow.d.ts +40 -40
  20. package/dist/components/Amelipro/AmeliproPostalAddressField/AmeliproPostalAddressField.d.ts +60 -60
  21. package/dist/components/Amelipro/AmeliproSelect/AmeliproSelect.d.ts +7168 -9762
  22. package/dist/components/Amelipro/AmeliproStepper/AmeliproStepper.d.ts +2 -2
  23. package/dist/components/Amelipro/AmeliproTabs/AmeliproTabs.d.ts +7501 -10095
  24. package/dist/components/Amelipro/AmeliproTextArea/AmeliproTextArea.d.ts +21 -21
  25. package/dist/components/Amelipro/AmeliproTextField/AmeliproTextField.d.ts +41 -41
  26. package/dist/components/Amelipro/StructureMenu/StructureTabs/StructureTabs.d.ts +2 -2
  27. package/dist/components/CookiesSelection/CookiesInformation/CookiesInformation.d.ts +20 -498
  28. package/dist/components/Customs/Selects/SyAutocomplete/SyAutocomplete.d.ts +117 -151
  29. package/dist/components/Customs/Selects/SyInputSelect/SyInputSelect.d.ts +5 -5
  30. package/dist/components/Customs/Selects/SySelect/SySelect.d.ts +12 -16
  31. package/dist/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.d.ts +8 -8
  32. package/dist/components/Customs/SyCheckbox/SyCheckbox.d.ts +31 -506
  33. package/dist/components/Customs/SyRadioGroup/SyRadioGroup.d.ts +28 -506
  34. package/dist/components/Customs/SyTabs/SyTabs.d.ts +13 -11
  35. package/dist/components/Customs/SyTextField/SyTextField.d.ts +69 -89
  36. package/dist/components/DatePicker/CalendarMode/DatePicker.d.ts +627 -791
  37. package/dist/components/DatePicker/ComplexDatePicker/ComplexDatePicker.d.ts +315 -412
  38. package/dist/components/DatePicker/DateTextInput/DateTextInput.d.ts +112 -160
  39. package/dist/components/DatePicker/composables/index.d.ts +1 -0
  40. package/dist/components/DatePicker/composables/useDatePickerFocusTrap.d.ts +11 -0
  41. package/dist/components/DatePicker/composables/useDatePickerState.d.ts +1 -0
  42. package/dist/components/DatePicker/composables/useDateTextField.d.ts +4 -4
  43. package/dist/components/DatePicker/composables/useDateValidation.d.ts +3 -3
  44. package/dist/components/DatePicker/composables/useInputBlurHandler.d.ts +2 -2
  45. package/dist/components/DatePicker/composables/useManualDateValidation.d.ts +2 -2
  46. package/dist/components/FileList/FileList.d.ts +6 -0
  47. package/dist/components/FilterSideBar/FilterSideBar.d.ts +2 -0
  48. package/dist/components/HeaderNavigationBar/HeaderNavigationBar.d.ts +17 -17
  49. package/dist/components/HeaderNavigationBar/HorizontalNavbar/HorizontalNavbar.d.ts +3 -3
  50. package/dist/components/HeaderToolbar/HeaderToolbar.d.ts +20 -28
  51. package/dist/components/LunarCalendar/useLunarCalendarValidation.d.ts +3 -3
  52. package/dist/components/MonthPicker/MonthPicker.d.ts +86 -127
  53. package/dist/components/MonthPicker/MonthPickerText/MonthPickerInput.d.ts +85 -126
  54. package/dist/components/NirField/NirField.d.ts +202 -278
  55. package/dist/components/NirField/locales.d.ts +10 -10
  56. package/dist/components/NirField/useNirValidation.d.ts +64 -0
  57. package/dist/components/PasswordField/PasswordField.d.ts +8 -9
  58. package/dist/components/PeriodField/PeriodField.d.ts +1352 -1680
  59. package/dist/components/PhoneField/PhoneField.d.ts +88 -129
  60. package/dist/components/RangeField/RangeSlider/RangeSlider.d.ts +12 -12
  61. package/dist/components/SyTextArea/SyTextArea.d.ts +34 -14
  62. package/dist/components/SyTextArea/useDefaultValidationRules.d.ts +11 -0
  63. package/dist/components/Tables/SyServerTable/SyServerTable.d.ts +10 -6
  64. package/dist/components/Tables/SyTable/SyTable.d.ts +10 -6
  65. package/dist/components/Tables/common/SyTableFilter.d.ts +2 -3
  66. package/dist/components/Tables/common/SyTablePagination.d.ts +19 -19
  67. package/dist/components/Tables/common/TableHeader.d.ts +5 -0
  68. package/dist/components/Tables/common/filters/AutocompleteFilter.d.ts +120 -0
  69. package/dist/components/Tables/common/filters/locales.d.ts +0 -1
  70. package/dist/components/Tables/common/locales.d.ts +3 -0
  71. package/dist/components/Tables/common/types.d.ts +21 -3
  72. package/dist/components/Tables/common/useClickableTableRow.d.ts +17 -0
  73. package/dist/components/Tables/common/usePagination.d.ts +3 -1
  74. package/dist/components/Tables/common/usePinnedColumns.d.ts +31 -0
  75. package/dist/components/Tables/common/useTableHeaders.d.ts +2 -0
  76. package/dist/components/Tables/common/useTableRowCheckboxAccessibility.d.ts +5 -0
  77. package/dist/components/UploadWorkflow/UploadWorkflow.d.ts +7 -6
  78. package/dist/composables/date/useDatePickerAccessibility.d.ts +1 -1
  79. package/dist/composables/rules/useFieldValidation.d.ts +4 -4
  80. package/dist/composables/unifyValidation/documentationValidationProps.d.ts +230 -0
  81. package/dist/composables/unifyValidation/useCustomValidation.d.ts +8 -0
  82. package/dist/composables/unifyValidation/useValidation.d.ts +102 -0
  83. package/dist/composables/unifyValidation/useVuetifyValidation.d.ts +18 -0
  84. package/dist/composables/useFormFieldErrorHandling.d.ts +2 -2
  85. package/dist/composables/validation/useFormValidation.d.ts +11 -2
  86. package/dist/composables/validation/useValidation.d.ts +19 -9
  87. package/dist/design-system-v3.d.ts +2 -0
  88. package/dist/design-system-v3.js +186 -187
  89. package/dist/design-system-v3.umd.cjs +1 -1066
  90. package/dist/designTokens/tokens/amelipro/apColors.d.ts +10 -10
  91. package/dist/designTokens/tokens/amelipro/apColors2026.d.ts +1 -2
  92. package/dist/designTokens/tokens/amelipro/apContextual.d.ts +44 -0
  93. package/dist/designTokens/tokens/amelipro/apSemantic.d.ts +1 -1
  94. package/dist/designTokens/tokens/baseColors.d.ts +127 -0
  95. package/dist/designTokens/tokens/baseContextualTokens.d.ts +50 -0
  96. package/dist/designTokens/tokens/cnam/cnamColors.d.ts +10 -10
  97. package/dist/designTokens/tokens/cnam/cnamSemantic.d.ts +1 -1
  98. package/dist/designTokens/tokens/pa/paColors.d.ts +1 -166
  99. package/dist/designTokens/tokens/pa/paSemantic.d.ts +1 -1
  100. package/dist/designTokens/utils/buildColorClassMap.d.ts +12 -0
  101. package/dist/designTokens/utils/createFlattenTheme.d.ts +1 -3
  102. package/dist/designTokens/utils/index.d.ts +2 -2
  103. package/dist/main-ByDPHpae.cjs +1067 -0
  104. package/dist/main-Cpx8Co6H.js +38869 -0
  105. package/dist/main.d.ts +0 -1
  106. package/dist/synapse.css +1 -0
  107. package/dist/tooth-11-D3sLWv2n.cjs +1 -0
  108. package/dist/tooth-12-CXrLuH03.cjs +1 -0
  109. package/dist/tooth-13-BSfo5fpT.cjs +1 -0
  110. package/dist/tooth-14-DMzulx0h.cjs +1 -0
  111. package/dist/tooth-15-BKRFVi-9.cjs +1 -0
  112. package/dist/tooth-16-CpuxAbuM.cjs +1 -0
  113. package/dist/tooth-17-BPoahUdg.cjs +1 -0
  114. package/dist/tooth-18-DhHJz8sy.cjs +1 -0
  115. package/dist/tooth-21-Dgd5hn_X.cjs +1 -0
  116. package/dist/tooth-22-C2Tn19sB.cjs +1 -0
  117. package/dist/tooth-23-C9uaaSGb.cjs +1 -0
  118. package/dist/tooth-24-BrK9UGpf.cjs +1 -0
  119. package/dist/tooth-25-CE_EfGNp.cjs +1 -0
  120. package/dist/tooth-26-Ctv4i9Fy.cjs +1 -0
  121. package/dist/tooth-27-C5J7JkWM.cjs +1 -0
  122. package/dist/tooth-28-Z9oWqjo0.cjs +1 -0
  123. package/dist/tooth-31-BrYqmkTi.cjs +1 -0
  124. package/dist/tooth-32-BNNR0oCZ.cjs +1 -0
  125. package/dist/tooth-33-DuxvqO2J.cjs +1 -0
  126. package/dist/tooth-34-BCSCXMB6.cjs +1 -0
  127. package/dist/tooth-35-BLUXkX88.cjs +1 -0
  128. package/dist/tooth-36-IrKHYqlA.cjs +1 -0
  129. package/dist/tooth-37-BYqpdMwo.cjs +1 -0
  130. package/dist/tooth-38-B_eNXXdu.cjs +1 -0
  131. package/dist/tooth-41-Ddva4Ot8.cjs +1 -0
  132. package/dist/tooth-42-szcDqlM0.cjs +1 -0
  133. package/dist/tooth-43-B3ka6rQm.cjs +1 -0
  134. package/dist/tooth-44-CazyQucj.cjs +1 -0
  135. package/dist/tooth-45-B4HQtc8n.cjs +1 -0
  136. package/dist/tooth-46-BPM40gbG.cjs +1 -0
  137. package/dist/tooth-47-Dvr20dlh.cjs +1 -0
  138. package/dist/tooth-48-Bd8ljGsF.cjs +1 -0
  139. package/dist/tooth-51-OBpwCOF3.cjs +1 -0
  140. package/dist/tooth-52-aKxyHcmq.cjs +1 -0
  141. package/dist/tooth-53-vCwJjTOc.cjs +1 -0
  142. package/dist/tooth-54-DsWu2iFy.cjs +1 -0
  143. package/dist/tooth-55-BxC1X2Dn.cjs +1 -0
  144. package/dist/tooth-61-BbLvxMQi.cjs +1 -0
  145. package/dist/tooth-62-CmTkWczP.cjs +1 -0
  146. package/dist/tooth-63-DI7l_2qI.cjs +1 -0
  147. package/dist/tooth-64-B21sOsJh.cjs +1 -0
  148. package/dist/tooth-65-D2ZC2VEr.cjs +1 -0
  149. package/dist/tooth-71-D473PPO5.cjs +1 -0
  150. package/dist/tooth-72-Drh1wnNu.cjs +1 -0
  151. package/dist/tooth-73-DzlwYI23.cjs +1 -0
  152. package/dist/tooth-74-8aGvcZPg.cjs +1 -0
  153. package/dist/tooth-75-BFK7At_r.cjs +1 -0
  154. package/dist/tooth-81-BZmR-I0M.cjs +1 -0
  155. package/dist/tooth-82-euVfUUZV.cjs +1 -0
  156. package/dist/tooth-83-KV010j64.cjs +1 -0
  157. package/dist/tooth-84-BBg1RjhZ.cjs +1 -0
  158. package/dist/tooth-85-Cr-kc1wM.cjs +1 -0
  159. package/dist/utils/functions/classToHex.d.ts +1 -1
  160. package/dist/utils/functions/createHexResolver.d.ts +16 -0
  161. package/dist/vuetifyConfig.js +522 -0
  162. package/dist/vuetifyConfig.umd.cjs +1 -0
  163. package/package.json +37 -20
  164. package/src/assets/amelipro/apTokens2026.scss +5 -5
  165. package/src/assets/overrides/_breakpoints.scss +25 -0
  166. package/src/assets/overrides/_btns.scss +0 -8
  167. package/src/assets/overrides/_forms.scss +1 -3
  168. package/src/assets/overrides/_icons.scss +14 -10
  169. package/src/assets/overrides/_otp.scss +41 -0
  170. package/src/assets/overrides/_tables.scss +11 -20
  171. package/src/assets/overrides/_tooltips.scss +17 -7
  172. package/src/assets/overrides/_typography.scss +35 -47
  173. package/src/assets/overrides/_utilities.scss +43 -47
  174. package/src/assets/themes.scss +1 -0
  175. package/src/components/Amelipro/AmeliproAccordion/AmeliproAccordionTemplate/AmeliproAccordionTemplate.vue +20 -20
  176. package/src/components/Amelipro/AmeliproAccordionFrieze/AmeliproAccordionFrieze.vue +12 -14
  177. package/src/components/Amelipro/AmeliproAccordionList/AmeliproAccordionList.vue +4 -6
  178. package/src/components/Amelipro/AmeliproAccordionResult/AmeliproAccordionResultTemplate/AmeliproAccordionResultTemplate.vue +5 -5
  179. package/src/components/Amelipro/AmeliproAccordionResultList/AmeliproAccordionResultList.vue +4 -6
  180. package/src/components/Amelipro/AmeliproAutoCompleteField/AmeliproAutoCompleteField.vue +4 -6
  181. package/src/components/Amelipro/AmeliproAutoCompleteField/__tests__/__snapshots__/AmeliproAutoCompleteField.spec.ts.snap +2 -2
  182. package/src/components/Amelipro/AmeliproBadge/AmeliproBadge.vue +4 -6
  183. package/src/components/Amelipro/AmeliproBreadcrumb/AmeliproBreadcrumb.vue +1 -3
  184. package/src/components/Amelipro/AmeliproBtn/AmeliproBtn.vue +4 -6
  185. package/src/components/Amelipro/AmeliproCallback/AmeliproCallback.vue +2 -2
  186. package/src/components/Amelipro/AmeliproCard/AmeliproCard.vue +31 -31
  187. package/src/components/Amelipro/AmeliproCarousel/AmeliproCarousel.vue +5 -7
  188. package/src/components/Amelipro/AmeliproCheckbox/AmeliproCheckbox.vue +13 -15
  189. package/src/components/Amelipro/AmeliproCheckboxGroup/AmeliproCheckboxGroup.vue +23 -23
  190. package/src/components/Amelipro/AmeliproChips/AmeliproChips.vue +1 -3
  191. package/src/components/Amelipro/AmeliproClickableTile/AmeliproClickableTile.vue +17 -12
  192. package/src/components/Amelipro/AmeliproClickableTile/tests/__snapshots__/AmeliproClickableTile.spec.ts.snap +2 -2
  193. package/src/components/Amelipro/AmeliproCopyBtn/AmeliproCopyBtn.vue +4 -6
  194. package/src/components/Amelipro/AmeliproCustomSelector/AmeliproCustomSelector.vue +13 -13
  195. package/src/components/Amelipro/AmeliproDentalChart/AmeliproDentalChart.vue +4 -2
  196. package/src/components/Amelipro/AmeliproDentalChart/AmeliproTooth/AmeliproTooth.vue +4 -4
  197. package/src/components/Amelipro/AmeliproDialog/AmeliproDialog.vue +5 -7
  198. package/src/components/Amelipro/AmeliproDisclosure/AmeliproDisclosure.vue +1 -3
  199. package/src/components/Amelipro/AmeliproErrorTemplate/AmeliproErrorTemplate.vue +2 -4
  200. package/src/components/Amelipro/AmeliproFilePreview/AmeliproFilePreview.vue +4 -6
  201. package/src/components/Amelipro/AmeliproFilters/AmeliproFilters.vue +13 -13
  202. package/src/components/Amelipro/AmeliproFirstLogin/AmeliproFirstLogin.vue +3 -5
  203. package/src/components/Amelipro/AmeliproFooter/AmeliproFooter.vue +1 -3
  204. package/src/components/Amelipro/AmeliproHeader/AmeliproHeader.vue +2 -4
  205. package/src/components/Amelipro/AmeliproHeader/AmeliproHeaderBar/AmeliproHeaderBar.vue +1 -3
  206. package/src/components/Amelipro/AmeliproHeader/AmeliproHeaderBar/AmeliproHeaderBrandSection/AmeliproHeaderBrandSection.vue +20 -16
  207. package/src/components/Amelipro/AmeliproHeader/AmeliproHeaderBar/AmeliproHeaderBrandSection/__tests__/__snapshots__/AmeliproHeaderBrandSection.spec.ts.snap +2 -2
  208. package/src/components/Amelipro/AmeliproIconBtn/AmeliproIconBtn.vue +2 -4
  209. package/src/components/Amelipro/AmeliproIllustratedDataTile/AmeliproIllustratedDataTile.vue +5 -7
  210. package/src/components/Amelipro/AmeliproIllustratedRadioGroup/AmeliproIllustratedRadioGroup.vue +6 -8
  211. package/src/components/Amelipro/AmeliproMailTile/AmeliproMailTile.vue +14 -14
  212. package/src/components/Amelipro/AmeliproMenu/AmeliproMenu.vue +11 -13
  213. package/src/components/Amelipro/AmeliproMessagingLayout/AmeliproDropdownMenu/AmeliproDropdownMenu.vue +2 -4
  214. package/src/components/Amelipro/AmeliproMessagingLayout/AmeliproMessagingLayout.vue +8 -8
  215. package/src/components/Amelipro/AmeliproMultipleFoldingCard/AmeliproMultipleFoldingCard.vue +40 -40
  216. package/src/components/Amelipro/AmeliproNumberedCard/AmeliproNumberedCard.vue +27 -27
  217. package/src/components/Amelipro/AmeliproOnboarding/AmeliproOnboarding.vue +3 -5
  218. package/src/components/Amelipro/AmeliproPageLayout/AmeliproPageLayout.vue +2 -4
  219. package/src/components/Amelipro/AmeliproPagination/AmeliproPagination.vue +2 -4
  220. package/src/components/Amelipro/AmeliproPagination/AmeliproPaginationBtn/AmeliproPaginationBtn.vue +3 -5
  221. package/src/components/Amelipro/AmeliproPatientBanner/AmeliproPatientBanner.vue +1 -3
  222. package/src/components/Amelipro/AmeliproPatientLogged/AmeliproPatientLogged.vue +2 -4
  223. package/src/components/Amelipro/AmeliproPatientLogin/AmeliproPatientLogin.vue +4 -4
  224. package/src/components/Amelipro/AmeliproPatientLogin/AmeliproPatientLoginForm/AmeliproPatientLoginForm.vue +1 -3
  225. package/src/components/Amelipro/AmeliproPostalAddressField/AmeliproPostalAddressCityRow/AmeliproPostalAddressCityRow.vue +3 -5
  226. package/src/components/Amelipro/AmeliproPostalAddressField/AmeliproPostalAddressField.vue +3 -5
  227. package/src/components/Amelipro/AmeliproRadioGroup/AmeliproRadioGroup.vue +23 -23
  228. package/src/components/Amelipro/AmeliproResultList/AmeliproResultList.vue +4 -6
  229. package/src/components/Amelipro/AmeliproSelect/AmeliproSelect.vue +12 -22
  230. package/src/components/Amelipro/AmeliproStateTile/AmeliproStateTile.vue +10 -12
  231. package/src/components/Amelipro/AmeliproStepper/AmeliproStepper.vue +17 -17
  232. package/src/components/Amelipro/AmeliproTable/AmeliproTable.vue +8 -10
  233. package/src/components/Amelipro/AmeliproTabs/AmeliproTabBtn/AmeliproTabBtn.vue +6 -8
  234. package/src/components/Amelipro/AmeliproTabs/AmeliproTabs.vue +4 -4
  235. package/src/components/Amelipro/AmeliproTextArea/AmeliproTextArea.vue +4 -6
  236. package/src/components/Amelipro/AmeliproTextArea/__tests__/__snapshots__/AmeliproTextArea.spec.ts.snap +2 -2
  237. package/src/components/Amelipro/AmeliproTextField/AmeliproTextField.vue +7 -9
  238. package/src/components/Amelipro/AmeliproTileBtn/AmeliproTileBtn.vue +3 -5
  239. package/src/components/Amelipro/AmeliproTooltips/AmeliproTooltips.vue +0 -2
  240. package/src/components/Amelipro/AmeliproUpload/AmeliproUpload.vue +6 -6
  241. package/src/components/Amelipro/ServiceMenu/ServiceMenu.vue +2 -2
  242. package/src/components/Amelipro/StructureMenu/StructureBtn/StructureBtn.vue +4 -4
  243. package/src/components/Amelipro/StructureMenu/StructureItem/StructureItem.vue +4 -6
  244. package/src/components/Amelipro/StructureMenu/StructureMenu.vue +2 -2
  245. package/src/components/Amelipro/StructureMenu/StructureTabs/StructureTabs.vue +2 -2
  246. package/src/components/Amelipro/UserMenu/UserMenu.vue +1 -3
  247. package/src/components/BackBtn/tests/BackBtn.visual.cy.ts +43 -0
  248. package/src/components/BackBtn/tests/__snapshots__/back-btn-custom-bg.snap.png +0 -0
  249. package/src/components/BackBtn/tests/__snapshots__/back-btn-dark-mode.snap.png +0 -0
  250. package/src/components/BackBtn/tests/__snapshots__/back-btn-default.snap.png +0 -0
  251. package/src/components/BackBtn/tests/__snapshots__/back-btn-no-icon.snap.png +0 -0
  252. package/src/components/Captcha/Captcha.vue +1 -3
  253. package/src/components/Captcha/accessibilite/Accessibility.mdx +86 -8
  254. package/src/components/Captcha/tests/__snapshots__/Captcha.spec.ts.snap +12 -12
  255. package/src/components/ChipList/ChipList.stories.ts +0 -15
  256. package/src/components/ChipList/ChipList.vue +19 -17
  257. package/src/components/ChipList/accessibilite/Accessibility.mdx +83 -10
  258. package/src/components/ChipList/tests/ChipList.a11y.spec.ts +41 -0
  259. package/src/components/CookiesSelection/CookiesInformation/CookiesInformation.vue +0 -2
  260. package/src/components/CopyBtn/CopyBtn.vue +1 -3
  261. package/src/components/Customs/Selects/SelectBtnField/SelectBtnField.vue +17 -17
  262. package/src/components/Customs/Selects/SelectBtnField/accessibilite/Accessibility.mdx +0 -9
  263. package/src/components/Customs/Selects/SelectBtnField/tests/SelectBtnField.spec.ts +31 -0
  264. package/src/components/Customs/Selects/SyAutocomplete/SyAutocomplete.stories.ts +66 -0
  265. package/src/components/Customs/Selects/SyAutocomplete/SyAutocomplete.vue +28 -7
  266. package/src/components/Customs/Selects/SyAutocomplete/tests/SyAutocomplete.a11y.spec.ts +18 -0
  267. package/src/components/Customs/Selects/SyAutocomplete/tests/SyAutocomplete.spec.ts +209 -0
  268. package/src/components/Customs/Selects/SyAutocomplete/utils/ariaManager.ts +14 -10
  269. package/src/components/Customs/Selects/SyInputSelect/SyInputSelect.stories.ts +4 -4
  270. package/src/components/Customs/Selects/SyInputSelect/SyInputSelect.vue +12 -15
  271. package/src/components/Customs/Selects/SyInputSelect/tests/SyInputSelect.spec.ts +10 -10
  272. package/src/components/Customs/Selects/SySelect/SySelect.stories.ts +1 -39
  273. package/src/components/Customs/Selects/SySelect/SySelect.vue +274 -71
  274. package/src/components/Customs/Selects/SySelect/accessibilite/Accessibility.mdx +199 -269
  275. package/src/components/Customs/Selects/SySelect/tests/SySelect.spec.ts +89 -0
  276. package/src/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.vue +6 -9
  277. package/src/components/Customs/SyCheckbox/SyCheckbox.mdx +5 -0
  278. package/src/components/Customs/SyCheckbox/SyCheckbox.stories.ts +10 -16
  279. package/src/components/Customs/SyCheckbox/SyCheckbox.vue +45 -11
  280. package/src/components/Customs/SyCheckbox/accessibilite/Accessibility.mdx +53 -3
  281. package/src/components/Customs/SyCheckbox/tests/SyCheckbox.a11y.spec.ts +134 -2
  282. package/src/components/Customs/SyForm/SyForm.stories.ts +31 -5
  283. package/src/components/Customs/SyPagination/SyPagination.vue +0 -2
  284. package/src/components/Customs/SyRadioGroup/SyRadioGroup.vue +4 -7
  285. package/src/components/Customs/SyTabs/SyTabs.mdx +0 -58
  286. package/src/components/Customs/SyTabs/SyTabs.stories.ts +32 -33
  287. package/src/components/Customs/SyTabs/SyTabs.vue +87 -67
  288. package/src/components/Customs/SyTabs/accessibilite/Accessibility.mdx +83 -23
  289. package/src/components/Customs/SyTabs/tests/SyTabs.a11y.spec.ts +88 -0
  290. package/src/components/Customs/SyTabs/tests/SyTabs.spec.ts +46 -1
  291. package/src/components/Customs/SyTextField/SyTextField.mdx +1 -1
  292. package/src/components/Customs/SyTextField/SyTextField.stories.ts +50 -68
  293. package/src/components/Customs/SyTextField/SyTextField.vue +156 -161
  294. package/src/components/Customs/SyTextField/tests/SyTextField.a11y.spec.ts +32 -0
  295. package/src/components/Customs/SyTextField/tests/SyTextField.spec.ts +120 -11
  296. package/src/components/DatePicker/CalendarMode/DatePicker.stories.ts +62 -58
  297. package/src/components/DatePicker/CalendarMode/DatePicker.vue +342 -237
  298. package/src/components/DatePicker/CalendarMode/accessibilite/Accessibility.mdx +82 -0
  299. package/src/components/DatePicker/CalendarMode/tests/DatePicker.a11y.spec.ts +141 -0
  300. package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.stories.ts +2 -56
  301. package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.vue +215 -175
  302. package/src/components/DatePicker/ComplexDatePicker/accessibilite/Accessibility.mdx +76 -0
  303. package/src/components/DatePicker/ComplexDatePicker/tests/ComplexDatePicker.spec.ts +33 -10
  304. package/src/components/DatePicker/DatePickerValidationExample/CalendarMode.stories.ts +8 -8
  305. package/src/components/DatePicker/DatePickerValidationExample/ComplexDatePicker.stories.ts +106 -8
  306. package/src/components/DatePicker/DatePickerValidationExample/DateTextInput.stories.ts +12 -11
  307. package/src/components/DatePicker/DatePickerValidationExample/MultiMode.stories.ts +12 -12
  308. package/src/components/DatePicker/DateTextInput/DateRange.stories.ts +0 -12
  309. package/src/components/DatePicker/DateTextInput/DateTextInput.vue +71 -67
  310. package/src/components/DatePicker/DateTextInput/NoCalendar.stories.ts +3 -0
  311. package/src/components/DatePicker/DateTextInput/accessibilite/Accessibility.mdx +66 -0
  312. package/src/components/DatePicker/DateTextInput/tests/DateTextInput.spec.ts +52 -1
  313. package/src/components/DatePicker/composables/index.ts +1 -0
  314. package/src/components/DatePicker/composables/tests/useCalendarKeyboardNavigation.spec.ts +109 -65
  315. package/src/components/DatePicker/composables/tests/useDatePickerFocusTrap.spec.ts +138 -0
  316. package/src/components/DatePicker/composables/tests/useDatePickerState.spec.ts +53 -0
  317. package/src/components/DatePicker/composables/tests/useDateValidation.spec.ts +74 -18
  318. package/src/components/DatePicker/composables/tests/useInputBlurHandler.spec.ts +39 -0
  319. package/src/components/DatePicker/composables/tests/useManualDateValidation.spec.ts +91 -0
  320. package/src/components/DatePicker/composables/useCalendarKeyboardNavigation.ts +442 -36
  321. package/src/components/DatePicker/composables/useDatePickerFocusTrap.ts +92 -0
  322. package/src/components/DatePicker/composables/useDatePickerState.ts +24 -0
  323. package/src/components/DatePicker/composables/useDateTextField.ts +6 -6
  324. package/src/components/DatePicker/composables/useDateValidation.ts +36 -35
  325. package/src/components/DatePicker/composables/useInputBlurHandler.ts +3 -3
  326. package/src/components/DatePicker/composables/useManualDateValidation.ts +6 -2
  327. package/src/components/DatePicker/composables/useMonthButtonCustomization.ts +9 -8
  328. package/src/components/DatePicker/playground/DatePickerHolidayRule.vue +1 -1
  329. package/src/components/DiacriticPicker/accessibilite/Accessibility.mdx +76 -8
  330. package/src/components/DialogBox/DialogBox.vue +3 -5
  331. package/src/components/DialogBox/tests/DialogBox.visual.cy.ts +76 -0
  332. package/src/components/DialogBox/tests/__snapshots__/dialog-box-custom-texts.snap.png +0 -0
  333. package/src/components/DialogBox/tests/__snapshots__/dialog-box-default.snap.png +0 -0
  334. package/src/components/DialogBox/tests/__snapshots__/dialog-box-no-actions.snap.png +0 -0
  335. package/src/components/FileList/FileList.vue +9 -2
  336. package/src/components/FileList/UploadItem/UploadItem.vue +11 -13
  337. package/src/components/FileList/tests/FileList.spec.ts +47 -0
  338. package/src/components/FileUpload/FileUpload.vue +3 -5
  339. package/src/components/FileUpload/FileUploadContent.vue +3 -5
  340. package/src/components/FilterInline/FilterInline.vue +1 -3
  341. package/src/components/FilterSideBar/FilterSideBar.mdx +44 -1
  342. package/src/components/FilterSideBar/FilterSideBar.stories.ts +105 -1
  343. package/src/components/FilterSideBar/FilterSideBar.vue +7 -0
  344. package/src/components/FilterSideBar/tests/FilterSideBar.a11y.spec.ts +54 -1
  345. package/src/components/FilterSideBar/tests/FilterSideBar.spec.ts +42 -0
  346. package/src/components/FooterBar/FooterBar.vue +9 -13
  347. package/src/components/FranceConnectBtn/FranceConnectBtn.vue +1 -1
  348. package/src/components/HeaderBar/HeaderBar.stories.ts +14 -2
  349. package/src/components/HeaderBar/HeaderBar.vue +2 -3
  350. package/src/components/HeaderBar/HeaderBurgerMenu/HeaderBurgerMenu.vue +2 -3
  351. package/src/components/HeaderBar/HeaderBurgerMenu/HeaderMenuItem/HeaderMenuItem.vue +2 -3
  352. package/src/components/HeaderBar/HeaderBurgerMenu/HeaderMenuSection/HeaderMenuSection.vue +0 -1
  353. package/src/components/HeaderBar/HeaderBurgerMenu/HeaderSubMenu/HeaderSubMenu.vue +8 -9
  354. package/src/components/HeaderBar/HeaderBurgerMenu/menu.scss +0 -8
  355. package/src/components/HeaderBar/HeaderBurgerMenu/tests/HeaderBurgerMenu.visual.cy.ts +196 -0
  356. package/src/components/HeaderBar/HeaderBurgerMenu/tests/__snapshots__/header-burger-menu-generated-submenu-open.snap.png +0 -0
  357. package/src/components/HeaderBar/HeaderBurgerMenu/tests/__snapshots__/header-burger-menu-generated.snap.png +0 -0
  358. package/src/components/HeaderBar/HeaderLogo/HeaderLogo.vue +0 -1
  359. package/src/components/HeaderBar/HeaderMenuBtn/HeaderMenuBtn.vue +6 -7
  360. package/src/components/HeaderBar/tests/HeaderBar.visual.cy.ts +81 -0
  361. package/src/components/HeaderBar/tests/__snapshots__/header-bar-custom-width.snap.png +0 -0
  362. package/src/components/HeaderBar/tests/__snapshots__/header-bar-default.snap.png +0 -0
  363. package/src/components/HeaderBar/tests/__snapshots__/header-bar-no-sticky.snap.png +0 -0
  364. package/src/components/HeaderBar/tests/__snapshots__/header-bar-with-prepend.snap.png +0 -0
  365. package/src/components/HeaderBar/tests/__snapshots__/header-bar-with-side.snap.png +0 -0
  366. package/src/components/HeaderBar/tests/__snapshots__/header-bar-with-subtitle.snap.png +0 -0
  367. package/src/components/HeaderNavigationBar/HeaderNavigationBar.vue +12 -3
  368. package/src/components/HeaderNavigationBar/HorizontalNavbar/HorizontalNavbar.vue +15 -8
  369. package/src/components/HeaderToolbar/HeaderToolbar.vue +6 -7
  370. package/src/components/LangBtn/LangBtn.vue +2 -4
  371. package/src/components/Logo/accessibilite/Accessibility.mdx +73 -11
  372. package/src/components/Logo/tests/Logo.visual.cy.ts +57 -0
  373. package/src/components/Logo/tests/__snapshots__/logo-avatar.snap.png +0 -0
  374. package/src/components/Logo/tests/__snapshots__/logo-dark.snap.png +0 -0
  375. package/src/components/Logo/tests/__snapshots__/logo-default.snap.png +0 -0
  376. package/src/components/Logo/tests/__snapshots__/logo-no-organism.snap.png +0 -0
  377. package/src/components/Logo/tests/__snapshots__/logo-no-signature.snap.png +0 -0
  378. package/src/components/Logo/tests/__snapshots__/logo-risque-pro.snap.png +0 -0
  379. package/src/components/LogoBrandSection/LogoBrandSection.vue +2 -2
  380. package/src/components/LogoBrandSection/accessibilite/Accessibility.mdx +85 -9
  381. package/src/components/LunarCalendar/tests/LunarCalendar.spec.ts +3 -1
  382. package/src/components/LunarCalendar/useLunarCalendarValidation.ts +4 -5
  383. package/src/components/MonthPicker/MonthPickerVisual/VisualPickerHeader.vue +1 -1
  384. package/src/components/MonthPicker/tests/MonthPicker.spec.ts +2 -1
  385. package/src/components/MonthPicker/tests/__snapshots__/MonthPicker.spec.ts.snap +7 -7
  386. package/src/components/NirField/NirField.stories.ts +6 -2
  387. package/src/components/NirField/NirField.vue +67 -265
  388. package/src/components/NirField/accessibilite/Accessibility.mdx +102 -7
  389. package/src/components/NirField/locales.ts +1 -1
  390. package/src/components/NirField/tests/NirField.spec.ts +124 -0
  391. package/src/components/NirField/tests/useNirValidation.spec.ts +449 -0
  392. package/src/components/NirField/useNirValidation.ts +277 -0
  393. package/src/components/NotificationBar/Notification/Notification.vue +5 -7
  394. package/src/components/NotificationBar/NotificationBar.vue +1 -3
  395. package/src/components/PaginatedTable/PaginatedTable.vue +2 -3
  396. package/src/components/PaginatedTable/Pagination.vue +3 -5
  397. package/src/components/PasswordField/PasswordField.stories.ts +4 -4
  398. package/src/components/PasswordField/PasswordField.vue +26 -34
  399. package/src/components/PasswordField/tests/PasswordField.spec.ts +6 -3
  400. package/src/components/PeriodField/PeriodField.stories.ts +4 -4
  401. package/src/components/PeriodField/PeriodField.vue +57 -57
  402. package/src/components/PeriodField/__tests__/PeriodField.async.spec.ts +32 -0
  403. package/src/components/PeriodField/accessibilite/Accessibility.mdx +68 -8
  404. package/src/components/PeriodField/tests/PeriodField.spec.ts +28 -2
  405. package/src/components/PhoneField/PhoneField.vue +8 -9
  406. package/src/components/PhoneField/tests/PhoneField.spec.ts +1 -0
  407. package/src/components/RangeField/RangeField.vue +6 -0
  408. package/src/components/RangeField/RangeSlider/RangeSlider.vue +0 -2
  409. package/src/components/RangeField/RangeSlider/Tooltip/Tooltip.vue +1 -1
  410. package/src/components/RangeField/tests/RangeField.visual.cy.ts +65 -0
  411. package/src/components/RangeField/tests/__snapshots__/range-field-custom-bg.snap.png +0 -0
  412. package/src/components/RangeField/tests/__snapshots__/range-field-custom-range.snap.png +0 -0
  413. package/src/components/RangeField/tests/__snapshots__/range-field-default.snap.png +0 -0
  414. package/src/components/RangeField/tests/__snapshots__/range-field-step.snap.png +0 -0
  415. package/src/components/RangeField/tests/__snapshots__/range-field-with-label.snap.png +0 -0
  416. package/src/components/RatingPicker/EmotionPicker/EmotionPicker.vue +6 -8
  417. package/src/components/RatingPicker/StarsPicker/StarsPicker.vue +3 -5
  418. package/src/components/SearchListField/SearchListField.vue +0 -2
  419. package/src/components/SkipLink/SkipLink.vue +2 -4
  420. package/src/components/SocialMediaLinks/SocialMediaLinks.vue +6 -6
  421. package/src/components/SubHeader/SubHeader.vue +1 -1
  422. package/src/components/SyAlert/SyAlert.vue +7 -9
  423. package/src/components/SyAlert/tests/SyAlert.visual.cy.ts +46 -0
  424. package/src/components/SyAlert/tests/__snapshots__/sy-alert-closable.snap.png +0 -0
  425. package/src/components/SyAlert/tests/__snapshots__/sy-alert-error.snap.png +0 -0
  426. package/src/components/SyAlert/tests/__snapshots__/sy-alert-info.snap.png +0 -0
  427. package/src/components/SyAlert/tests/__snapshots__/sy-alert-success.snap.png +0 -0
  428. package/src/components/SyAlert/tests/__snapshots__/sy-alert-variant-outlined.snap.png +0 -0
  429. package/src/components/SyAlert/tests/__snapshots__/sy-alert-variant-tonal.snap.png +0 -0
  430. package/src/components/SyAlert/tests/__snapshots__/sy-alert-warning.snap.png +0 -0
  431. package/src/components/SyBtnMenu/SyBtnMenu.vue +2 -4
  432. package/src/components/SyTextArea/SyTextArea.stories.ts +138 -2
  433. package/src/components/SyTextArea/SyTextArea.vue +53 -23
  434. package/src/components/SyTextArea/tests/SyTextArea.spec.ts +126 -3
  435. package/src/components/SyTextArea/useDefaultValidationRules.ts +74 -0
  436. package/src/components/TableToolbar/TableToolbar.vue +6 -8
  437. package/src/components/Tables/SyServerTable/SyServerTable.mdx +25 -0
  438. package/src/components/Tables/SyServerTable/SyServerTable.stories.ts +839 -1
  439. package/src/components/Tables/SyServerTable/SyServerTable.vue +154 -95
  440. package/src/components/Tables/SyServerTable/tests/SyServerTable.a11y.spec.ts +81 -0
  441. package/src/components/Tables/SyServerTable/tests/SyServerTable.spec.ts +390 -0
  442. package/src/components/Tables/SyTable/SyTable.mdx +25 -0
  443. package/src/components/Tables/SyTable/SyTable.stories.ts +556 -1
  444. package/src/components/Tables/SyTable/SyTable.vue +136 -60
  445. package/src/components/Tables/SyTable/tests/SyTable.a11y.spec.ts +79 -0
  446. package/src/components/Tables/SyTable/tests/SyTable.spec.ts +382 -0
  447. package/src/components/Tables/common/SyTableFilter.vue +49 -4
  448. package/src/components/Tables/common/SyTablePagination.vue +142 -19
  449. package/src/components/Tables/common/TableHeader.vue +45 -4
  450. package/src/components/Tables/common/filters/AutocompleteFilter.vue +160 -0
  451. package/src/components/Tables/common/filters/NumberFilter.vue +1 -1
  452. package/src/components/Tables/common/filters/SelectFilter.vue +11 -12
  453. package/src/components/Tables/common/filters/TextFilter.vue +1 -1
  454. package/src/components/Tables/common/filters/getFilterComponent.ts +8 -1
  455. package/src/components/Tables/common/filters/locales.ts +0 -1
  456. package/src/components/Tables/common/filters/tests/AutocompleteFilter.a11y.spec.ts +110 -0
  457. package/src/components/Tables/common/filters/tests/AutocompleteFilter.spec.ts +203 -0
  458. package/src/components/Tables/common/filters/tests/SelectFilter.a11y.spec.ts +104 -0
  459. package/src/components/Tables/common/filters/tests/SelectFilter.spec.ts +152 -16
  460. package/src/components/Tables/common/locales.ts +3 -0
  461. package/src/components/Tables/common/tableFilterUtils.ts +3 -0
  462. package/src/components/Tables/common/tableStyles.scss +60 -19
  463. package/src/components/Tables/common/tests/SyTablePagination.spec.ts +18 -0
  464. package/src/components/Tables/common/tests/TableHeader.spec.ts +39 -0
  465. package/src/components/Tables/common/tests/filterByRange.spec.ts +2 -1
  466. package/src/components/Tables/common/types.ts +15 -4
  467. package/src/components/Tables/common/useClickableTableRow.ts +103 -0
  468. package/src/components/Tables/common/usePagination.ts +13 -0
  469. package/src/components/Tables/common/usePinnedColumns.ts +237 -0
  470. package/src/components/Tables/common/useTableHeaders.ts +52 -30
  471. package/src/components/Tables/common/useTableRowCheckboxAccessibility.ts +41 -0
  472. package/src/components/UploadWorkflow/UploadWorkflow.vue +1 -0
  473. package/src/components/UploadWorkflow/tests/UploadWorkflow.spec.ts +23 -0
  474. package/src/components/UploadWorkflow/tests/__snapshots__/UploadWorkflow.spec.ts.snap +66 -0
  475. package/src/components/UploadWorkflow/useFileList.ts +3 -0
  476. package/src/components/UserMenuBtn/UserMenuBtn.vue +1 -3
  477. package/src/composables/date/tests/useDatePickerAccessibility.spec.ts +2 -6
  478. package/src/composables/date/useDatePickerAccessibility.ts +42 -207
  479. package/src/composables/rules/tests/useFieldValidation.spec.ts +120 -120
  480. package/src/composables/rules/useFieldValidation.ts +34 -17
  481. package/src/composables/unifyValidation/documentationValidationProps.ts +235 -0
  482. package/src/composables/unifyValidation/tests/useCustomValidation.spec.ts +601 -0
  483. package/src/composables/unifyValidation/tests/useValidation.spec.ts +2048 -0
  484. package/src/composables/unifyValidation/tests/useVuetifyValidation.spec.ts +184 -0
  485. package/src/composables/unifyValidation/useCustomValidation.ts +95 -0
  486. package/src/composables/unifyValidation/useValidation.ts +190 -0
  487. package/src/composables/unifyValidation/useVuetifyValidation.ts +54 -0
  488. package/src/composables/useFormFieldErrorHandling.ts +4 -7
  489. package/src/composables/validation/tests/useFormValidation.spec.ts +14 -0
  490. package/src/composables/validation/tests/useValidation.spec.ts +116 -21
  491. package/src/composables/validation/useFormValidation.ts +20 -13
  492. package/src/composables/validation/useValidatable.ts +8 -1
  493. package/src/composables/validation/useValidation.ts +151 -99
  494. package/src/composantsVuetify/Introduction.mdx +48 -0
  495. package/src/composantsVuetify/VBreadcrumbs/VBreadcrumbs.mdx +28 -0
  496. package/src/composantsVuetify/VBreadcrumbs/v-breadcrumbs.stories.ts +108 -0
  497. package/src/composantsVuetify/VBtn/VBtn.mdx +72 -0
  498. package/src/composantsVuetify/VBtn/v-btn.stories.ts +121 -0
  499. package/src/composantsVuetify/VOtpInput/VOtpInput.mdx +39 -0
  500. package/src/composantsVuetify/VOtpInput/v-otp-input.stories.ts +56 -0
  501. package/src/composantsVuetify/VSkeletonLoader/VSkeletonLoader.mdx +42 -0
  502. package/src/composantsVuetify/VSkeletonLoader/v-skeleton-loader.stories.ts +77 -0
  503. package/src/composantsVuetify/VSwitch/VSwitch.mdx +47 -0
  504. package/src/composantsVuetify/VSwitch/v-switch.stories.ts +166 -0
  505. package/src/composantsVuetify/VTooltip/VTooltip.mdx +32 -0
  506. package/src/composantsVuetify/VTooltip/v-tooltip.stories.ts +95 -0
  507. package/src/designTokens/tests/buildColorClassMap.spec.ts +31 -0
  508. package/src/designTokens/tests/generateScssTokens.spec.ts +12 -0
  509. package/src/designTokens/tests/themeUtils.spec.ts +53 -0
  510. package/src/designTokens/tokens/amelipro/apColors.ts +8 -130
  511. package/src/designTokens/tokens/amelipro/apColors2026.ts +3 -15
  512. package/src/designTokens/tokens/amelipro/apContextual.ts +55 -47
  513. package/src/designTokens/tokens/amelipro/apLightTheme.ts +1 -1
  514. package/src/designTokens/tokens/amelipro/apSemantic.ts +1 -1
  515. package/src/designTokens/tokens/baseColors.ts +129 -0
  516. package/src/designTokens/tokens/baseContextualTokens.ts +52 -0
  517. package/src/designTokens/tokens/cnam/cnamColors.ts +3 -125
  518. package/src/designTokens/tokens/cnam/cnamContextual.ts +4 -48
  519. package/src/designTokens/tokens/cnam/cnamLightTheme.ts +1 -1
  520. package/src/designTokens/tokens/cnam/cnamSemantic.ts +3 -3
  521. package/src/designTokens/tokens/pa/paColors.ts +2 -166
  522. package/src/designTokens/tokens/pa/paContextual.ts +3 -48
  523. package/src/designTokens/tokens/pa/paLightTheme.ts +1 -1
  524. package/src/designTokens/tokens/pa/paSemantic.ts +2 -2
  525. package/src/designTokens/utils/buildColorClassMap.ts +34 -0
  526. package/src/designTokens/utils/convertSemanticsToken.ts +8 -11
  527. package/src/designTokens/utils/createFlattenTheme.ts +15 -7
  528. package/src/designTokens/utils/index.ts +2 -2
  529. package/src/main.ts +0 -2
  530. package/src/stories/Accessibilite/AuditDesignSystem.mdx +0 -11
  531. package/src/stories/Accessibilite/DesignSystem/Avancement.mdx +433 -0
  532. package/src/stories/Accessibilite/DesignSystem/a11y-status.json +692 -0
  533. package/src/stories/Accessibilite/KitDePreAudit/Echantillonnage.mdx +8 -1
  534. package/src/stories/Accessibilite/KitDePreAudit/Introduction.mdx +51 -10
  535. package/src/stories/Accessibilite/KitDePreAudit/Outils/Introduction.mdx +16 -9
  536. package/src/stories/Accessibilite/KitDePreAudit/Preaudit.mdx +48 -58
  537. package/src/stories/Components/Components.stories.ts +113 -9
  538. package/src/stories/Demarrer/Accueil.stories.ts +3 -3
  539. package/src/stories/Demarrer/EnrichirLeDesignSystem.mdx +4 -9
  540. package/src/stories/Demarrer/EnrichirLeDesignSystem.stories.ts +28 -0
  541. package/src/stories/Demarrer/Releases.stories.ts +48 -5
  542. package/src/stories/DesignTokens/ColorDisplay.vue +6 -5
  543. package/src/stories/DesignTokens/ColorIntegrationExample.vue +2 -4
  544. package/src/stories/DesignTokens/colors.stories.ts +5 -6
  545. package/src/stories/GuideDuDev/Amelipro.mdx +15 -0
  546. package/src/stories/GuideDuDev/Amelipro.stories.ts +209 -0
  547. package/src/stories/GuideDuDev/CreateVuetifyInstance.mdx +95 -0
  548. package/src/stories/GuideDuDev/Theme.mdx +36 -26
  549. package/src/stories/GuideDuDev/moduleDeNotification.mdx +3 -2
  550. package/src/stories/GuideDuDev/vuetifyOptions.mdx +3 -3
  551. package/src/stories/styles/accessibility-guide.css +3 -3
  552. package/src/utils/functions/classToHex.ts +6 -34
  553. package/src/utils/functions/createHexResolver.ts +45 -0
  554. package/src/utils/functions/tests/classToHex.spec.ts +36 -0
  555. package/src/utils/functions/tests/convertToHex.spec.ts +31 -0
  556. package/src/utils/functions/tests/createHexResolver.spec.ts +66 -0
  557. package/src/utils/functions/tests/isCssColor.spec.ts +48 -0
  558. package/dist/SelectFilter-BioGT6Nn.js +0 -136
  559. package/dist/designTokens/utils/convertGaps.d.ts +0 -5
  560. package/dist/main-aLKwdMi1.js +0 -37886
  561. package/dist/style.css +0 -1
  562. package/src/assets/apTokens.scss +0 -343
  563. package/src/assets/overrides/_container.scss +0 -36
  564. package/src/assets/tokens.scss +0 -388
  565. package/src/components/DatePicker/Accessibilite.mdx +0 -14
  566. package/src/designTokens/apColors.md +0 -66
  567. package/src/designTokens/cnamColors.md +0 -193
  568. package/src/designTokens/paColors.md +0 -66
  569. package/src/designTokens/tokens/json/contextual-tokens.json +0 -156
  570. package/src/designTokens/tokens/json/primitives.json +0 -209
  571. package/src/designTokens/tokens/json/semantic.json +0 -120
  572. package/src/designTokens/utils/convertGaps.ts +0 -11
  573. package/src/stories/Accessibilite/Avancement/Avancement.mdx +0 -533
  574. package/src/stories/Accessibilite/Avancement/Avancement.stories.ts +0 -306
@@ -28,20 +28,162 @@ export const useCalendarKeyboardNavigation = (options: CalendarKeyboardNavigatio
28
28
  } = options
29
29
 
30
30
  const addDays = (date: Date, amount: number) => dayjs(date).add(amount, 'day').toDate()
31
+ const addMonths = (date: Date, amount: number) => dayjs(date).add(amount, 'month').toDate()
32
+ const addYears = (date: Date, amount: number) => dayjs(date).add(amount, 'year').toDate()
31
33
 
32
34
  const toISO = (date: Date) => dayjs(date).format('YYYY-MM-DD')
33
35
 
34
36
  let isListenerAttached = false
35
37
 
38
+ const focusMonthButton = (button: HTMLButtonElement | undefined | null) => {
39
+ button?.focus({ preventScroll: true })
40
+ }
41
+
42
+ const focusYearButton = (button: HTMLButtonElement | undefined | null) => {
43
+ if (!button) return
44
+ button.scrollIntoView({ block: 'nearest', inline: 'nearest' })
45
+ button.focus({ preventScroll: true })
46
+ }
47
+
48
+ const handleMonthDialogNavigation = (event: KeyboardEvent): boolean => {
49
+ const targetBtn = (event.target as HTMLElement | null)?.closest<HTMLButtonElement>('.v-date-picker-months button')
50
+ if (!targetBtn) return false
51
+
52
+ const buttons = Array.from(document.querySelectorAll<HTMLButtonElement>('.v-date-picker-months button')).filter(btn => !btn.disabled)
53
+ if (buttons.length === 0) return false
54
+
55
+ const currentIndex = buttons.indexOf(targetBtn)
56
+ if (currentIndex === -1) return false
57
+
58
+ const key = event.key
59
+
60
+ // Enter/Space : click manuel sans scroll pour garantir l'activation
61
+ if (key === 'Enter' || key === ' ') {
62
+ event.preventDefault()
63
+ targetBtn.click()
64
+ focusMonthButton(targetBtn)
65
+ return true
66
+ }
67
+
68
+ if (!['ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Home', 'End'].includes(key)) return false
69
+
70
+ event.preventDefault()
71
+
72
+ const firstRowTop = buttons[0]?.offsetTop ?? 0
73
+ const columns = buttons.filter(btn => btn.offsetTop === firstRowTop).length || 3
74
+
75
+ const moveIndex = (delta: number) => {
76
+ const nextIndex = Math.min(Math.max(currentIndex + delta, 0), buttons.length - 1)
77
+ focusMonthButton(buttons[nextIndex])
78
+ }
79
+
80
+ switch (key) {
81
+ case 'ArrowLeft':
82
+ moveIndex(-1)
83
+ return true
84
+ case 'ArrowRight':
85
+ moveIndex(1)
86
+ return true
87
+ case 'ArrowUp':
88
+ moveIndex(-columns)
89
+ return true
90
+ case 'ArrowDown':
91
+ moveIndex(columns)
92
+ return true
93
+ case 'Home':
94
+ focusMonthButton(buttons[0])
95
+ return true
96
+ case 'End':
97
+ focusMonthButton(buttons[buttons.length - 1])
98
+ return true
99
+ }
100
+
101
+ return false
102
+ }
103
+
104
+ const handleYearDialogNavigation = (event: KeyboardEvent): boolean => {
105
+ const targetBtn = (event.target as HTMLElement | null)?.closest<HTMLButtonElement>('.v-date-picker-years button')
106
+ if (!targetBtn) return false
107
+
108
+ const buttons = Array.from(document.querySelectorAll<HTMLButtonElement>('.v-date-picker-years button')).filter(btn => !btn.disabled)
109
+ if (buttons.length === 0) return false
110
+
111
+ const currentIndex = buttons.indexOf(targetBtn)
112
+ if (currentIndex === -1) return false
113
+
114
+ const key = event.key
115
+
116
+ if (key === 'Enter' || key === ' ') {
117
+ event.preventDefault()
118
+ targetBtn.click()
119
+ focusYearButton(targetBtn)
120
+ return true
121
+ }
122
+
123
+ if (!['ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Home', 'End'].includes(key)) return false
124
+
125
+ event.preventDefault()
126
+
127
+ const firstRowTop = buttons[0]?.offsetTop ?? 0
128
+ const columns = buttons.filter(btn => btn.offsetTop === firstRowTop).length || 3
129
+
130
+ const moveIndex = (delta: number) => {
131
+ const nextIndex = Math.min(Math.max(currentIndex + delta, 0), buttons.length - 1)
132
+ focusYearButton(buttons[nextIndex])
133
+ }
134
+
135
+ switch (key) {
136
+ case 'ArrowLeft':
137
+ moveIndex(-1)
138
+ return true
139
+ case 'ArrowRight':
140
+ moveIndex(1)
141
+ return true
142
+ case 'ArrowUp':
143
+ moveIndex(-columns)
144
+ return true
145
+ case 'ArrowDown':
146
+ moveIndex(columns)
147
+ return true
148
+ case 'Home':
149
+ focusYearButton(buttons[0])
150
+ return true
151
+ case 'End':
152
+ focusYearButton(buttons[buttons.length - 1])
153
+ return true
154
+ }
155
+
156
+ return false
157
+ }
158
+
36
159
  const getBaseDateFromEvent = (event: KeyboardEvent): { date: Date | null, fromDayCell: boolean } => {
37
160
  const target = event.target as HTMLElement | null
161
+ // Chercher d'abord avec data-v-date, puis avec les classes Vuetify
38
162
  const dayWrapper = target?.closest<HTMLElement>('[data-v-date]')
39
- const iso = dayWrapper?.getAttribute('data-v-date')
163
+ || target?.closest<HTMLElement>('.v-date-picker-month__day')
164
+
165
+ // Essayer d'abord l'attribut data-v-date
166
+ let iso = dayWrapper?.getAttribute('data-v-date')
167
+
168
+ // Si pas d'attribut data-v-date, essayer de récupérer la date depuis les classes Vuetify
169
+ if (!iso && dayWrapper) {
170
+ // Vuetify utilise souvent des classes spécifiques pour identifier les dates
171
+ // On peut essayer de récupérer la date depuis l'élément bouton lui-même
172
+ const button = dayWrapper.querySelector<HTMLElement>('.v-btn')
173
+ if (button) {
174
+ // Vuetify peut stocker la date dans un attribut data ou via aria-label
175
+ iso = button.getAttribute('data-date')
176
+ || button.getAttribute('aria-label')?.split(' ').pop()
177
+ }
178
+ }
179
+
40
180
  if (!iso) {
41
181
  return { date: getCurrentDate(), fromDayCell: false }
42
182
  }
43
183
 
44
- const parsed = dayjs(iso, 'YYYY-MM-DD', true)
184
+ // Nettoyer le format si nécessaire (enlever le texte si c'est aria-label)
185
+ const cleanIso = iso.replace(/^\D+/, '')
186
+ const parsed = dayjs(cleanIso, 'YYYY-MM-DD', true)
45
187
  if (!parsed.isValid()) {
46
188
  return { date: getCurrentDate(), fromDayCell: false }
47
189
  }
@@ -49,6 +191,147 @@ export const useCalendarKeyboardNavigation = (options: CalendarKeyboardNavigatio
49
191
  return { date: parsed.toDate(), fromDayCell: true }
50
192
  }
51
193
 
194
+ let latestFocusToken = 0
195
+
196
+ const focusDateButton = (date: Date, attempt = 0, token?: number) => {
197
+ if (attempt === 0) {
198
+ latestFocusToken++
199
+ token = latestFocusToken
200
+ }
201
+
202
+ // Si un autre focus a été demandé entre-temps, on annule
203
+ if (token !== latestFocusToken) return
204
+
205
+ // Utiliser setTimeout pour la première tentative pour laisser Vue et Vuetify commencer la mise à jour du DOM
206
+ if (attempt === 0) {
207
+ setTimeout(() => focusDateButton(date, 1, token), 10)
208
+ return
209
+ }
210
+
211
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
212
+ const rootEl = (datePickerRef.value as any)?.$el as HTMLElement | undefined
213
+ if (!rootEl) return
214
+
215
+ const iso = toISO(date)
216
+ const dayNum = date.getDate()
217
+
218
+ // Exclure les éléments qui sont dans une fenêtre en cours de disparition
219
+ const isActiveContext = (el: Element) => {
220
+ const windowItem = el.closest('.v-window-item')
221
+ if (!windowItem) return true
222
+ const classes = Array.from(windowItem.classList)
223
+ const isLeaving = classes.some(c => c.includes('leave-active') || c.includes('leave-to') || c === 'v-window-item--leave')
224
+ return !isLeaving
225
+ }
226
+
227
+ const candidates: HTMLElement[] = []
228
+
229
+ // 1. Chercher par data-v-date
230
+ const dataDateElements = rootEl.querySelectorAll(`[data-v-date="${iso}"]`)
231
+ for (const el of Array.from(dataDateElements)) {
232
+ const btn = (el.tagName === 'BUTTON' ? el : el.querySelector('button')) as HTMLElement
233
+ if (btn && isActiveContext(btn)) candidates.push(btn)
234
+ }
235
+
236
+ // 2. Chercher par texte ou aria-label si vide
237
+ if (candidates.length === 0) {
238
+ const allButtons = rootEl.querySelectorAll<HTMLElement>('.v-date-picker-month__day .v-btn')
239
+ for (const btn of Array.from(allButtons)) {
240
+ if (!isActiveContext(btn)) continue
241
+ const text = btn.textContent?.trim() || ''
242
+ const ariaLabel = btn.getAttribute('aria-label') || ''
243
+ if (text === dayNum.toString() || new RegExp(`\\b${dayNum}\\b`).test(ariaLabel)) {
244
+ candidates.push(btn)
245
+ }
246
+ }
247
+ }
248
+
249
+ // Filtrer ceux qui ne sont pas visibles
250
+ const visibleCandidates = candidates.filter((btn) => {
251
+ // Autoriser les éléments en transition (opacity peut être 0 au tout début)
252
+ const windowItem = btn.closest('.v-window-item')
253
+ const isEntering = windowItem && Array.from(windowItem.classList).some(c => c.includes('enter-active') || c.includes('enter-to'))
254
+
255
+ if (!isEntering && btn.offsetParent === null) return false
256
+
257
+ const style = window.getComputedStyle(btn)
258
+ return style.display !== 'none' && style.visibility !== 'hidden'
259
+ })
260
+
261
+ if (visibleCandidates.length > 0) {
262
+ // Préférer les non-adjacents
263
+ visibleCandidates.sort((a, b) => {
264
+ const aAdj = a.closest('.v-date-picker-month__day--adjacent') ? 1 : 0
265
+ const bAdj = b.closest('.v-date-picker-month__day--adjacent') ? 1 : 0
266
+ return aAdj - bAdj
267
+ })
268
+
269
+ const bestCandidate = visibleCandidates[0]
270
+ if (bestCandidate) {
271
+ bestCandidate.focus({ preventScroll: true })
272
+
273
+ // Revérifier le focus après la durée typique d'une transition Vuetify (~350ms)
274
+ // car le DOM peut être re-rendu et l'élément détruit, ou le focus perdu pendant l'animation
275
+ if (attempt === 1) {
276
+ setTimeout(() => {
277
+ if (token === latestFocusToken && (document.activeElement !== bestCandidate || !bestCandidate.isConnected)) {
278
+ // Forcer un retry silencieux
279
+ focusDateButton(date, 2, token)
280
+ }
281
+ }, 350)
282
+ }
283
+ return
284
+ }
285
+ }
286
+
287
+ if (attempt < 15) {
288
+ setTimeout(() => focusDateButton(date, attempt + 1, token), 30)
289
+ }
290
+ }
291
+
292
+ const clickDateButton = (date: Date) => {
293
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- mock Axios headers
294
+ const rootEl = (datePickerRef.value as any)?.$el as HTMLElement | undefined
295
+ if (!rootEl) return
296
+
297
+ const iso = toISO(date)
298
+
299
+ // Essayer plusieurs sélecteurs pour trouver le bouton du jour
300
+ const selectors = [
301
+ `[data-v-date="${iso}"] > [type="button"]`, // Bouton enfant direct avec data-v-date
302
+ `[data-v-date="${iso}"] button`, // N'importe quel bouton dans l'élément avec data-v-date
303
+ `[data-v-date="${iso}"] .v-btn`, // Bouton Vuetify spécifique avec data-v-date
304
+ `[data-v-date="${iso}"] [role="button"]`, // Élément avec role="button" et data-v-date
305
+ // Sélecteurs Vuetify sans data-v-date
306
+ `.v-date-picker-month__day:has(.v-btn[aria-label*="${date.getDate()}"]) .v-btn`,
307
+ `.v-date-picker-month__day .v-btn[aria-label*="${date.getDate()}"]`,
308
+ ]
309
+
310
+ let dayButton: HTMLButtonElement | null = null
311
+ for (const selector of selectors) {
312
+ dayButton = rootEl.querySelector<HTMLButtonElement>(selector)
313
+ if (dayButton) {
314
+ break
315
+ }
316
+ }
317
+
318
+ // Si aucun sélecteur précis ne fonctionne, chercher par aria-label complet
319
+ if (!dayButton) {
320
+ const ariaLabelPattern = new RegExp(`\\b${date.getDate()}\\b`)
321
+ const allButtons = rootEl.querySelectorAll<HTMLElement>('.v-date-picker-month__day .v-btn')
322
+ for (const button of allButtons) {
323
+ const ariaLabel = button.getAttribute('aria-label')
324
+ if (ariaLabel && ariaLabelPattern.test(ariaLabel)) {
325
+ dayButton = button as HTMLButtonElement
326
+ break
327
+ }
328
+ }
329
+ }
330
+
331
+ dayButton?.click()
332
+ dayButton?.focus()
333
+ }
334
+
52
335
  const handleArrowNavigation = (event: KeyboardEvent) => {
53
336
  if (!['ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown'].includes(event.key)) {
54
337
  return
@@ -59,47 +342,104 @@ export const useCalendarKeyboardNavigation = (options: CalendarKeyboardNavigatio
59
342
  return
60
343
  }
61
344
 
62
- const { date: current, fromDayCell } = getBaseDateFromEvent(event)
345
+ // Laisser les flèches fonctionner nativement dans les contrôles d'entête
346
+ if ((event.target as HTMLElement | null)?.closest('.v-date-picker-controls')) return
347
+
348
+ // Si on n'a pas de date courante sélectionnée, on essaie de l'extraire du focus
349
+ const { date: current } = getBaseDateFromEvent(event)
350
+
351
+ // Si toujours aucune date n'est résolue, on abandonne
63
352
  if (!current) return
64
353
 
65
354
  event.preventDefault()
66
355
 
356
+ // Navigation normale des jours
67
357
  let nextDate = current
68
- // Si l'événement ne vient pas d'un jour du calendrier (par ex. après un
69
- // changement de mois via les contrôles), on utilise la date de base
70
- // telle quelle pour « entrer » dans le mois (souvent le 1er jour),
71
- // sans appliquer immédiatement le décalage lié à la flèche. À partir du
72
- // moment où le focus est sur un jour (fromDayCell = true), les flèches
73
- // se comportent normalement.
74
- if (fromDayCell) {
75
- switch (event.key) {
76
- case 'ArrowLeft':
77
- nextDate = addDays(current, -1)
78
- break
79
- case 'ArrowRight':
80
- nextDate = addDays(current, 1)
81
- break
82
- case 'ArrowUp':
83
- nextDate = addDays(current, -7)
84
- break
85
- case 'ArrowDown':
86
- nextDate = addDays(current, 7)
87
- break
88
- }
358
+ switch (event.key) {
359
+ case 'ArrowLeft':
360
+ nextDate = addDays(current, -1)
361
+ break
362
+ case 'ArrowRight':
363
+ nextDate = addDays(current, 1)
364
+ break
365
+ case 'ArrowUp':
366
+ nextDate = addDays(current, -7)
367
+ break
368
+ case 'ArrowDown':
369
+ nextDate = addDays(current, 7)
370
+ break
89
371
  }
90
372
 
373
+ // Mettre à jour l'état (ce qui peut déclencher un changement de mois dans Vuetify)
91
374
  setCurrentDate(nextDate)
92
375
 
93
- nextTick(() => {
94
- // eslint-disable-next-line @typescript-eslint/no-explicit-any -- mock Axios headers
95
- const rootEl = (datePickerRef.value as any)?.$el as HTMLElement | undefined
96
- if (!rootEl) return
376
+ // Forcer le focus sur le nouveau jour de manière résiliente
377
+ focusDateButton(nextDate)
378
+ }
97
379
 
98
- const selector = `[data-v-date="${toISO(nextDate)}"] > [type="button"]`
99
- const dayButton = rootEl.querySelector<HTMLElement>(selector)
380
+ const handleHomeEndPageNavigation = (event: KeyboardEvent) => {
381
+ if (!['Home', 'End', 'PageUp', 'PageDown'].includes(event.key)) {
382
+ return
383
+ }
100
384
 
101
- dayButton?.focus()
102
- })
385
+ // Pour la navigation de mois, toujours utiliser la date courante sélectionnée
386
+ // plutôt que de dépendre du DOM qui peut ne pas avoir le focus sur un jour
387
+ const current = getCurrentDate()
388
+ if (!current) return
389
+
390
+ // Respecter les combinaisons système (Ctrl/Alt/Meta), mais autoriser Shift pour année
391
+ if (event.altKey || event.ctrlKey || event.metaKey) {
392
+ return
393
+ }
394
+
395
+ event.preventDefault()
396
+
397
+ let nextDate = current
398
+ if (event.key === 'Home') {
399
+ nextDate = dayjs(current).startOf('month').toDate()
400
+ }
401
+ else if (event.key === 'End') {
402
+ nextDate = dayjs(current).endOf('month').toDate()
403
+ }
404
+ else if (event.key === 'PageUp') {
405
+ nextDate = event.shiftKey ? addYears(current, -1) : addMonths(current, -1)
406
+ // Focus sur le premier jour du mois précédent
407
+ nextDate = dayjs(nextDate).startOf('month').toDate()
408
+ }
409
+ else if (event.key === 'PageDown') {
410
+ nextDate = event.shiftKey ? addYears(current, 1) : addMonths(current, 1)
411
+ // Focus sur le premier jour du mois suivant
412
+ nextDate = dayjs(nextDate).startOf('month').toDate()
413
+ }
414
+
415
+ setCurrentDate(nextDate)
416
+ focusDateButton(nextDate)
417
+ }
418
+
419
+ const handleEnterSpaceNavigation = (event: KeyboardEvent) => {
420
+ if (!['Enter', ' '].includes(event.key)) {
421
+ return
422
+ }
423
+
424
+ // Gérer manuellement les contrôles d'entête (mois/année et flèches) car le composant natif est surchargé
425
+ const headerButton = (event.target as HTMLElement | null)?.closest<HTMLButtonElement>('.v-date-picker-controls button, .v-date-picker-header button')
426
+ if (headerButton) {
427
+ if (event.key === ' ' || event.key === 'Enter') {
428
+ event.preventDefault()
429
+ headerButton.click()
430
+ // Garder le focus sur le contrôle pour éviter la lecture de toute la grille
431
+ headerButton.focus({ preventScroll: true })
432
+ setTimeout(() => headerButton.focus({ preventScroll: true }), 0)
433
+ }
434
+ return
435
+ }
436
+
437
+ const { date: current, fromDayCell } = getBaseDateFromEvent(event)
438
+ if (!current || !fromDayCell) return
439
+
440
+ // Enter/Space : empêcher le scroll et déclencher la sélection explicite
441
+ event.preventDefault()
442
+ clickDateButton(current)
103
443
  }
104
444
 
105
445
  const keydownListener = (event: Event) => {
@@ -109,23 +449,89 @@ export const useCalendarKeyboardNavigation = (options: CalendarKeyboardNavigatio
109
449
  // Ne pas interférer avec la saisie dans les champs de formulaire ou zones éditables
110
450
  if (target) {
111
451
  const tagName = target.tagName
112
- if (tagName === 'INPUT' || tagName === 'TEXTAREA' || tagName === 'SELECT' || (target as HTMLElement).isContentEditable) {
452
+ if (tagName === 'INPUT' || tagName === 'TEXTAREA' || target.isContentEditable) {
113
453
  return
114
454
  }
115
455
  }
116
456
 
457
+ // Ignorer les modificateurs sauf Shift pour PageUp/PageDown (année)
458
+ if (keyboardEvent.ctrlKey || keyboardEvent.altKey || keyboardEvent.metaKey) {
459
+ return
460
+ }
461
+
462
+ // Gérer les dialogues mois/année ouverts
463
+ if (handleMonthDialogNavigation(keyboardEvent) || handleYearDialogNavigation(keyboardEvent)) {
464
+ return
465
+ }
466
+
467
+ // Gérer la navigation fléchée
117
468
  handleArrowNavigation(keyboardEvent)
469
+
470
+ // Gérer Home/End/Page navigation
471
+ handleHomeEndPageNavigation(keyboardEvent)
472
+
473
+ // Gérer Enter/Espace pour sélectionner
474
+ handleEnterSpaceNavigation(keyboardEvent)
118
475
  }
119
476
 
120
477
  const attachListeners = () => {
121
478
  if (isListenerAttached) return
122
- document.addEventListener('keydown', keydownListener as EventListener, true)
123
- isListenerAttached = true
479
+
480
+ // Utiliser un watcher pour attendre que le VDatePicker soit disponible
481
+ const tryAttach = () => {
482
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- sorry
483
+ const rootEl = (datePickerRef.value as any)?.$el as HTMLElement | undefined
484
+
485
+ // Chercher le conteneur parent avec tabindex="-1" (le focusTrap)
486
+ const containerEl = rootEl?.parentElement?.querySelector('[tabindex="-1"]') as HTMLElement | undefined
487
+ || rootEl?.closest('[tabindex="-1"]') as HTMLElement | undefined
488
+
489
+ // Chercher le VDatePicker lui-même
490
+ const datePickerEl = rootEl?.querySelector('.v-date-picker') || rootEl
491
+
492
+ if (containerEl) {
493
+ // Attacher sur le conteneur du focusTrap (plus prioritaire que le document)
494
+ containerEl.addEventListener('keydown', keydownListener as EventListener, true)
495
+ isListenerAttached = true
496
+ }
497
+ else if (datePickerEl) {
498
+ // Attacher sur le VDatePicker directement
499
+ datePickerEl.addEventListener('keydown', keydownListener as EventListener, true)
500
+ isListenerAttached = true
501
+ }
502
+ else {
503
+ // Fallback : attacher sur le document
504
+ document.addEventListener('keydown', keydownListener as EventListener, true)
505
+ isListenerAttached = true
506
+ }
507
+ }
508
+
509
+ // Attendre plusieurs ticks pour être sûr que le focusTrap est déjà attaché
510
+ setTimeout(tryAttach, 100)
124
511
  }
125
512
 
126
513
  const detachListeners = () => {
127
514
  if (!isListenerAttached) return
128
- document.removeEventListener('keydown', keydownListener as EventListener, true)
515
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- sorry
516
+ const rootEl = (datePickerRef.value as any)?.$el as HTMLElement | undefined
517
+
518
+ // Chercher le conteneur parent avec tabindex="-1" (le focusTrap)
519
+ const containerEl = rootEl?.parentElement?.querySelector('[tabindex="-1"]') as HTMLElement | undefined
520
+ || rootEl?.closest('[tabindex="-1"]') as HTMLElement | undefined
521
+
522
+ // Chercher le VDatePicker lui-même
523
+ const datePickerEl = rootEl?.querySelector('.v-date-picker') || rootEl
524
+
525
+ if (containerEl) {
526
+ containerEl.removeEventListener('keydown', keydownListener as EventListener, true)
527
+ }
528
+ else if (datePickerEl) {
529
+ datePickerEl.removeEventListener('keydown', keydownListener as EventListener, true)
530
+ }
531
+ else {
532
+ document.removeEventListener('keydown', keydownListener as EventListener, true)
533
+ }
534
+
129
535
  isListenerAttached = false
130
536
  }
131
537
 
@@ -0,0 +1,92 @@
1
+ import { type Ref } from 'vue'
2
+ import type { ComponentPublicInstance } from 'vue'
3
+
4
+ interface UseDatePickerFocusTrapOptions {
5
+ isDatePickerVisible: Ref<boolean>
6
+ datePickerRef: Ref<ComponentPublicInstance | null>
7
+ onClose?: () => void
8
+ restoreFocus?: () => void
9
+ }
10
+
11
+ const getFocusableElements = (root: HTMLElement): HTMLElement[] => {
12
+ const allFocusable = Array.from(root.querySelectorAll<HTMLElement>('button,[href],input,select,textarea,[tabindex]'))
13
+ return allFocusable.filter(el => !el.hasAttribute('disabled') && el.getAttribute('aria-hidden') !== 'true' && el.tabIndex !== -1)
14
+ }
15
+
16
+ export function useDatePickerFocusTrap(options: UseDatePickerFocusTrapOptions) {
17
+ const { isDatePickerVisible, datePickerRef, onClose, restoreFocus } = options
18
+
19
+ const handleMenuKeydown = (event: KeyboardEvent) => {
20
+ if (!isDatePickerVisible.value) return
21
+
22
+ // Ne gérer que Escape et Tab, laisser toutes les autres touches passer
23
+ if (event.key === 'Escape' || event.key === 'Esc') {
24
+ isDatePickerVisible.value = false
25
+ onClose?.()
26
+ restoreFocus?.()
27
+ event.preventDefault()
28
+ event.stopPropagation()
29
+ return
30
+ }
31
+
32
+ // Pour Tab, on gère mais on laisse les autres touches (flèches, etc.) passer complètement
33
+ if (event.key !== 'Tab') {
34
+ // Laisser toutes les autres touches passer sans aucune intervention
35
+ return
36
+ }
37
+
38
+ if (event.ctrlKey || event.altKey || event.metaKey) return // Laisser les combinaisons système
39
+
40
+ const root = (datePickerRef.value as ComponentPublicInstance | null)?.$el as HTMLElement | undefined
41
+ if (!root) return
42
+
43
+ // Empêcher la fermeture du menu avec Tab et garder le focus à l'intérieur
44
+ event.preventDefault()
45
+ event.stopPropagation()
46
+
47
+ const target = event.target as HTMLElement | null
48
+ const todayButton = root.querySelector<HTMLElement>('.date-picker__today-button')
49
+ const focusables = getFocusableElements(root)
50
+ const firstFocusable = focusables[0]
51
+ if (!firstFocusable) {
52
+ // Aucun focusable : rester dans le menu via le bouton Aujourd'hui si présent
53
+ todayButton?.focus({ preventScroll: true })
54
+ return
55
+ }
56
+
57
+ const active = document.activeElement as HTMLElement | null
58
+
59
+ // Si on appuie sur Tab (sans Shift) depuis la grille des jours, des mois ou des années,
60
+ // on force le focus vers le bouton Aujourd'hui (s'il existe)
61
+ const isFromGrid = Boolean(
62
+ target?.closest('.v-date-picker-months')
63
+ || target?.closest('.v-date-picker-years')
64
+ || target?.closest('.v-date-picker-month'),
65
+ )
66
+
67
+ if (!event.shiftKey && isFromGrid && todayButton) {
68
+ todayButton.focus({ preventScroll: true })
69
+ return
70
+ }
71
+
72
+ if (!event.shiftKey && active === focusables.at(-1)) {
73
+ firstFocusable.focus({ preventScroll: true })
74
+ return
75
+ }
76
+
77
+ if (event.shiftKey && active === focusables[0]) {
78
+ focusables.at(-1)?.focus({ preventScroll: true })
79
+ return
80
+ }
81
+
82
+ // Comportement par défaut : laisser Tab circuler mais au sein du menu
83
+ const baseActive = active ?? firstFocusable
84
+ const currentIndex = focusables.indexOf(baseActive)
85
+ const safeIndex = currentIndex === -1 ? 0 : currentIndex
86
+ const nextIndex = event.shiftKey ? (safeIndex - 1 + focusables.length) % focusables.length : (safeIndex + 1) % focusables.length
87
+ const nextFocusable = focusables[nextIndex]
88
+ nextFocusable?.focus({ preventScroll: true })
89
+ }
90
+
91
+ return { handleMenuKeydown }
92
+ }
@@ -12,6 +12,7 @@ export interface UseDatePickerStateOptions {
12
12
  initializeSelectedDates: (value: DateInput | null, format: string, dateFormatReturn?: string) => Date | (Date | null)[] | null
13
13
  validateDates: (forceValidation?: boolean) => void
14
14
  updateModel: (value: DateValue) => void
15
+ generateDateRange?: (start: Date, end: Date) => Date[]
15
16
  }
16
17
 
17
18
  export interface UseDatePickerStateResult {
@@ -37,6 +38,7 @@ export const useDatePickerState = (options: UseDatePickerStateOptions): UseDateP
37
38
  initializeSelectedDates,
38
39
  validateDates,
39
40
  // updateModel,
41
+ generateDateRange,
40
42
  } = options
41
43
 
42
44
  const textInputValue = ref('')
@@ -115,6 +117,16 @@ export const useDatePickerState = (options: UseDatePickerStateOptions): UseDateP
115
117
  }
116
118
 
117
119
  selectedDates.value = initializeSelectedDates(newValue ?? null, format, dateFormatReturn)
120
+
121
+ if (displayRange && Array.isArray(selectedDates.value) && selectedDates.value.length === 2) {
122
+ const startDate = selectedDates.value[0]
123
+ const endDate = selectedDates.value[1]
124
+ if (startDate && endDate && generateDateRange) {
125
+ // Regenerate intermediate dates for Vuetify range selection
126
+ selectedDates.value = generateDateRange(startDate, endDate)
127
+ }
128
+ }
129
+
118
130
  if (selectedDates.value) {
119
131
  const firstDate = Array.isArray(selectedDates.value)
120
132
  ? selectedDates.value[0]
@@ -141,6 +153,18 @@ export const useDatePickerState = (options: UseDatePickerStateOptions): UseDateP
141
153
  return
142
154
  }
143
155
 
156
+ if (displayRange && Array.isArray(value) && value.length >= 2) {
157
+ const startDate = value[0]
158
+ const endDate = value[value.length - 1]
159
+ if (startDate && endDate) {
160
+ const formattedForInput = `${formatDate(startDate, format)} - ${formatDate(endDate, format)}`
161
+ if (textInputValue.value !== formattedForInput) {
162
+ textInputValue.value = formattedForInput
163
+ }
164
+ return
165
+ }
166
+ }
167
+
144
168
  const firstDate = Array.isArray(value) ? (value[0] ?? null) : value
145
169
  if (!firstDate) return
146
170