@cnamts/synapse 1.0.25 → 1.0.27

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 (393) hide show
  1. package/dist/{AutocompleteFilter-D7qBuCAP.js → AutocompleteFilter-C9eLKyW8.js} +3 -3
  2. package/dist/{DateFilter-BitMWrMU.js → DateFilter-y-GLkAkn.js} +9 -9
  3. package/dist/{NumberFilter-BTLUxw0a.js → NumberFilter-DN6hIBS7.js} +1 -1
  4. package/dist/{PeriodFilter-B5rUIPAC.js → PeriodFilter-MoUUp9qS.js} +1 -1
  5. package/dist/{SelectFilter-l4QnRcuk.js → SelectFilter-bCbrdLmu.js} +1 -1
  6. package/dist/{TextFilter-C9hj6Qrp.js → TextFilter-CvjgEaoM.js} +4 -4
  7. package/dist/apLightTheme2026-ug4Y23ns.js +611 -0
  8. package/dist/components/Customs/Selects/SyAutocomplete/SyAutocomplete.d.ts +2369 -351
  9. package/dist/components/Customs/Selects/SyAutocomplete/composables/useSyAutocompleteValidation.d.ts +18 -0
  10. package/dist/components/Customs/Selects/SyAutocomplete/utils/ariaManager.d.ts +1 -1
  11. package/dist/components/Customs/Selects/SyAutocomplete/utils/useKeyboardHandler.d.ts +3 -1
  12. package/dist/components/Customs/Selects/SySelect/SySelect.d.ts +58 -288
  13. package/dist/components/Customs/Selects/SySelect/composables/useSySelectKeyboard.d.ts +1 -0
  14. package/dist/components/Customs/Selects/SySelect/composables/useSySelectValidation.d.ts +15 -0
  15. package/dist/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.d.ts +4 -3
  16. package/dist/components/Customs/SyCheckbox/SyCheckbox.d.ts +4 -3
  17. package/dist/components/Customs/SyIconButton/SyIconButton.d.ts +18 -0
  18. package/dist/components/Customs/SyRadioGroup/SyRadioGroup.d.ts +20 -37
  19. package/dist/components/Customs/SyRadioGroup/composables/useSyRadioGroupValidation.d.ts +50 -0
  20. package/dist/components/Customs/SyTextField/SyTextField.d.ts +8 -10
  21. package/dist/components/DatePicker/CalendarMode/DatePicker.d.ts +197 -185
  22. package/dist/components/DatePicker/ComplexDatePicker/ComplexDatePicker.d.ts +91 -82
  23. package/dist/components/DatePicker/DateTextInput/DateTextInput.d.ts +35 -32
  24. package/dist/components/DatePicker/composables/index.d.ts +1 -0
  25. package/dist/components/DatePicker/composables/useDatePickerState.d.ts +3 -3
  26. package/dist/components/DatePicker/composables/useDatePickerValidationBridge.d.ts +51 -0
  27. package/dist/components/DatePicker/composables/useDateTextField.d.ts +2 -2
  28. package/dist/components/DatePicker/composables/useInputBlurHandler.d.ts +2 -2
  29. package/dist/components/DatePicker/types.d.ts +1 -2
  30. package/dist/components/LunarCalendar/useLunarCalendarValidation.d.ts +1 -0
  31. package/dist/components/MonthPicker/MonthPicker.d.ts +24 -24
  32. package/dist/components/MonthPicker/MonthPickerText/MonthPickerInput.d.ts +24 -24
  33. package/dist/components/NirField/NirField.d.ts +64 -60
  34. package/dist/components/NirField/useNirValidation.d.ts +6 -2
  35. package/dist/components/PasswordField/PasswordField.d.ts +3 -3
  36. package/dist/components/PeriodField/PeriodField.d.ts +338 -314
  37. package/dist/components/PhoneField/PhoneField.d.ts +34 -24
  38. package/dist/components/RangeField/RangeSlider/RangeSlider.d.ts +0 -3
  39. package/dist/components/RatingPicker/EmotionPicker/EmotionPicker.d.ts +3 -1
  40. package/dist/components/RatingPicker/NumberPicker/NumberPicker.d.ts +4 -3
  41. package/dist/components/RatingPicker/RatingPicker.d.ts +18 -5
  42. package/dist/components/RatingPicker/StarsPicker/StarsPicker.d.ts +3 -1
  43. package/dist/components/RatingPicker/useRatingFocus.d.ts +18 -0
  44. package/dist/components/SyTextArea/SyTextArea.d.ts +25 -15
  45. package/dist/components/SyTextArea/composables/useSyTextAreaValidation.d.ts +20 -0
  46. package/dist/components/SyTextArea/locales.d.ts +1 -0
  47. package/dist/components/Tables/SyServerTable/SyServerTable.d.ts +5 -4
  48. package/dist/components/Tables/SyTable/SyTable.d.ts +5 -4
  49. package/dist/components/Tables/common/SyTablePagination.d.ts +152 -364
  50. package/dist/components/Tables/common/TableHeader.d.ts +1 -1
  51. package/dist/components/Tables/common/filters/DateFilter.d.ts +4 -4
  52. package/dist/components/Tables/common/types.d.ts +2 -0
  53. package/dist/components/index.d.ts +1 -0
  54. package/dist/composables/date/useDateInitializationDayjs.d.ts +3 -1
  55. package/dist/composables/unifyValidation/documentationValidationProps.d.ts +160 -160
  56. package/dist/composables/unifyValidation/useCustomValidation.d.ts +3 -1
  57. package/dist/composables/unifyValidation/useValidation.d.ts +27 -19
  58. package/dist/composables/unifyValidation/useVuetifyValidation.d.ts +1 -1
  59. package/dist/composables/validation/useValidation.d.ts +1 -0
  60. package/dist/design-system-v3.js +81 -80
  61. package/dist/designTokens/tokens/amelipro/apContextual.d.ts +6 -6
  62. package/dist/designTokens/tokens/amelipro/apDarkTheme.d.ts +3 -1
  63. package/dist/designTokens/tokens/amelipro/apLightTheme.d.ts +53 -98
  64. package/dist/designTokens/tokens/baseContextualTokens.d.ts +0 -6
  65. package/dist/designTokens/tokens/baseTokens.d.ts +232 -0
  66. package/dist/designTokens/tokens/cnam/cnamContextual.d.ts +6 -6
  67. package/dist/designTokens/tokens/cnam/cnamDarkTheme.d.ts +1 -1
  68. package/dist/designTokens/tokens/cnam/cnamLightTheme.d.ts +57 -99
  69. package/dist/designTokens/tokens/pa/paContextual.d.ts +0 -6
  70. package/dist/designTokens/tokens/pa/paDarkTheme.d.ts +1 -1
  71. package/dist/designTokens/tokens/pa/paLightTheme.d.ts +53 -97
  72. package/dist/designTokens/tokens/pa/paSemantic.d.ts +1 -0
  73. package/dist/designTokens/tokens/semanticTokens.d.ts +112 -0
  74. package/dist/{main-Cpx8Co6H.js → main-CI6Q9nmO.js} +13843 -13478
  75. package/dist/synapse.css +1 -1
  76. package/dist/vuetifyConfig.js +208 -72
  77. package/package.json +10 -7
  78. package/src/assets/overrides/_icons.scss +5 -17
  79. package/src/assets/overrides/_otp.scss +4 -5
  80. package/src/assets/overrides/_typography.scss +2 -1
  81. package/src/assets/overrides/_utilities.scss +1 -42
  82. package/src/components/Accordion/Accordion.vue +2 -0
  83. package/src/components/ChipList/ChipList.vue +30 -18
  84. package/src/components/ChipList/tests/chipList.spec.ts +4 -4
  85. package/src/components/CookiesSelection/CookiesInformation/CookiesInformation.vue +2 -1
  86. package/src/components/CookiesSelection/CookiesSelection.vue +2 -1
  87. package/src/components/CopyBtn/CopyBtn.vue +9 -0
  88. package/src/components/Customs/Selects/SelectBtnField/SelectBtnField.stories.ts +4 -0
  89. package/src/components/Customs/Selects/SelectBtnField/SelectBtnField.vue +7 -6
  90. package/src/components/Customs/Selects/SelectBtnField/tests/SelectBtnField.spec.ts +223 -0
  91. package/src/components/Customs/Selects/SyAutocomplete/SyAutocomplete.stories.ts +283 -351
  92. package/src/components/Customs/Selects/SyAutocomplete/SyAutocomplete.vue +183 -219
  93. package/src/components/Customs/Selects/SyAutocomplete/composables/useSyAutocompleteValidation.ts +101 -0
  94. package/src/components/Customs/Selects/SyAutocomplete/tests/SyAutocomplete.spec.ts +761 -1
  95. package/src/components/Customs/Selects/SyAutocomplete/utils/ariaManager.ts +3 -1
  96. package/src/components/Customs/Selects/SyAutocomplete/utils/useKeyboardHandler.ts +79 -5
  97. package/src/components/Customs/Selects/SyAutocomplete/validation/Validation.stories.ts +1029 -0
  98. package/src/components/Customs/Selects/SySelect/SySelect.stories.ts +52 -217
  99. package/src/components/Customs/Selects/SySelect/SySelect.vue +248 -236
  100. package/src/components/Customs/Selects/SySelect/composables/useSySelectKeyboard.ts +3 -0
  101. package/src/components/Customs/Selects/SySelect/composables/useSySelectValidation.ts +64 -0
  102. package/src/components/Customs/Selects/SySelect/tests/SySelect.spec.ts +440 -5
  103. package/src/components/Customs/Selects/SySelect/validation/Validation.stories.ts +1026 -0
  104. package/src/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.stories.ts +18 -7
  105. package/src/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.vue +5 -5
  106. package/src/components/Customs/SyCheckbox/SyCheckbox.stories.ts +8 -8
  107. package/src/components/Customs/SyCheckbox/SyCheckbox.vue +27 -6
  108. package/src/components/Customs/SyCheckbox/tests/SyCheckbox.spec.ts +1 -1
  109. package/src/components/Customs/SyIcon/accessibilite/Accessibility.mdx +0 -6
  110. package/src/components/Customs/SyIcon/utils/tests/iconUtils.spec.ts +107 -0
  111. package/src/components/Customs/SyRadioGroup/SyRadioGroup.mdx +2 -2
  112. package/src/components/Customs/SyRadioGroup/SyRadioGroup.stories.ts +395 -200
  113. package/src/components/Customs/SyRadioGroup/SyRadioGroup.vue +100 -127
  114. package/src/components/Customs/SyRadioGroup/composables/useSyRadioGroupValidation.ts +127 -0
  115. package/src/components/Customs/SyRadioGroup/tests/SyRadioGroup.a11y.spec.ts +93 -1
  116. package/src/components/Customs/SyRadioGroup/tests/SyRadioGroup.spec.ts +146 -9
  117. package/src/components/Customs/SyRadioGroup/tests/SyRadioGroup.visual.cy.ts +165 -0
  118. package/src/components/Customs/SyRadioGroup/validation/Validation.stories.ts +773 -0
  119. package/src/components/Customs/SyTabs/SyTabs.stories.ts +5 -5
  120. package/src/components/Customs/SyTabs/config.ts +3 -3
  121. package/src/components/Customs/SyTabs/tests/SyTabs.spec.ts +265 -0
  122. package/src/components/Customs/SyTabs/tests/useTabTransition.spec.ts +188 -0
  123. package/src/components/Customs/SyTextField/SyTextField.stories.ts +10 -29
  124. package/src/components/Customs/SyTextField/SyTextField.vue +52 -17
  125. package/src/components/DataList/DataList.stories.ts +1 -1
  126. package/src/components/DataListItem/tests/DataListItem.spec.ts +3 -1
  127. package/src/components/DatePicker/CalendarMode/DatePicker.stories.ts +1 -1
  128. package/src/components/DatePicker/CalendarMode/DatePicker.vue +52 -154
  129. package/src/components/DatePicker/CalendarMode/tests/DatePicker.coverage.spec.ts +156 -0
  130. package/src/components/DatePicker/CalendarMode/tests/DatePicker.spec.ts +495 -4
  131. package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.stories.ts +1 -1
  132. package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.vue +55 -73
  133. package/src/components/DatePicker/ComplexDatePicker/tests/ComplexDatePicker.spec.ts +207 -1
  134. package/src/components/DatePicker/ComplexDatePicker/tests/bridge-integration.regression.spec.ts +210 -0
  135. package/src/components/DatePicker/ComplexDatePicker/tests/calendar-navigation.regression.spec.ts +214 -0
  136. package/src/components/DatePicker/ComplexDatePicker/tests/validation-cross.regression.spec.ts +194 -0
  137. package/src/components/DatePicker/ComplexDatePicker/tests/validation-success-messages.regression.spec.ts +83 -0
  138. package/src/components/DatePicker/DatePickerValidationExample/DatePickerValidation.stories.ts +1 -1
  139. package/src/components/DatePicker/DateTextInput/DateTextInput.vue +169 -60
  140. package/src/components/DatePicker/DateTextInput/NoCalendar.stories.ts +1 -1
  141. package/src/components/DatePicker/DateTextInput/tests/DateTextInput.spec.ts +320 -0
  142. package/src/components/DatePicker/composables/index.ts +1 -0
  143. package/src/components/DatePicker/composables/tests/useCalendarKeyboardNavigation.spec.ts +360 -0
  144. package/src/components/DatePicker/composables/tests/useDatePickerValidationBridge.spec.ts +129 -0
  145. package/src/components/DatePicker/composables/useDatePickerState.ts +33 -14
  146. package/src/components/DatePicker/composables/useDatePickerValidationBridge.ts +205 -0
  147. package/src/components/DatePicker/composables/useDateRangeInput.ts +2 -1
  148. package/src/components/DatePicker/composables/useDateSelection.ts +2 -1
  149. package/src/components/DatePicker/composables/useDateTextField.ts +2 -2
  150. package/src/components/DatePicker/composables/useInputBlurHandler.ts +2 -2
  151. package/src/components/DatePicker/docExamples/BidirectionalComplexValidation.vue +1 -1
  152. package/src/components/DatePicker/docExamples/DatePickerBidirectionalValidation.vue +1 -1
  153. package/src/components/DatePicker/tests/exposed-methods.coverage.spec.ts +75 -0
  154. package/src/components/DatePicker/types.ts +1 -2
  155. package/src/components/DialogBox/DialogBox.stories.ts +8 -8
  156. package/src/components/DialogBox/DialogBox.vue +1 -1
  157. package/src/components/DialogBox/accessibilite/Accessibility.mdx +86 -22
  158. package/src/components/FileList/UploadItem/UploadItem.vue +4 -4
  159. package/src/components/FileUpload/FileUpload.vue +2 -2
  160. package/src/components/FileUpload/FileUploadContent.vue +1 -1
  161. package/src/components/FilterInline/FilterInline.mdx +2 -2
  162. package/src/components/FilterSideBar/FilterSideBar.stories.ts +1 -1
  163. package/src/components/FilterSideBar/FilterSideBar.vue +4 -3
  164. package/src/components/FooterBar/FooterBar.vue +7 -7
  165. package/src/components/FranceConnectBtn/FranceConnectBtn.vue +1 -1
  166. package/src/components/HeaderBar/HeaderBurgerMenu/HeaderMenuItem/HeaderMenuItem.vue +2 -2
  167. package/src/components/HeaderBar/HeaderBurgerMenu/HeaderSubMenu/HeaderSubMenu.vue +7 -7
  168. package/src/components/HeaderBar/HeaderMenuBtn/HeaderMenuBtn.vue +2 -2
  169. package/src/components/HeaderLoading/tests/HeaderLoading.spec.ts +87 -8
  170. package/src/components/HeaderNavigationBar/HorizontalNavbar/HorizontalNavbar.vue +3 -3
  171. package/src/components/HeaderNavigationBar/HorizontalNavbar/tests/HorizontalNavbar.spec.ts +589 -0
  172. package/src/components/HeaderToolbar/tests/HeaderToolBar.spec.ts +153 -1
  173. package/src/components/HeaderToolbar/tests/useMobileRightMenu.spec.ts +258 -0
  174. package/src/components/LangBtn/LangBtn.vue +2 -1
  175. package/src/components/LogoBrandSection/tests/LogoBrandSection.spec.ts +2 -2
  176. package/src/components/LogoBrandSection/tests/__snapshots__/LogoBrandSection.spec.ts.snap +1 -1
  177. package/src/components/LunarCalendar/tests/useLunarCalendarRules.spec.ts +184 -0
  178. package/src/components/MonthPicker/MonthPickerVisual/MonthSelector.vue +3 -3
  179. package/src/components/MonthPicker/MonthPickerVisual/VisualPickerFooter.vue +1 -1
  180. package/src/components/MonthPicker/MonthPickerVisual/VisualPickerHeader.vue +2 -2
  181. package/src/components/MonthPicker/MonthPickerVisual/YearSelector.vue +1 -1
  182. package/src/components/NirField/NirField.vue +3 -3
  183. package/src/components/NotificationBar/Notification/Notification.vue +12 -12
  184. package/src/components/NotificationBar/NotificationBar.stories.ts +8 -8
  185. package/src/components/PaginatedTable/PaginatedTable.vue +1 -1
  186. package/src/components/PaginatedTable/Pagination.vue +3 -3
  187. package/src/components/PasswordField/PasswordField.vue +15 -11
  188. package/src/components/PasswordField/tests/PasswordField.spec.ts +3 -3
  189. package/src/components/PhoneField/PhoneField.vue +4 -2
  190. package/src/components/RangeField/RangeSlider/RangeSlider.vue +11 -18
  191. package/src/components/RangeField/RangeSlider/Tooltip/Tooltip.vue +1 -1
  192. package/src/components/RatingPicker/EmotionPicker/EmotionPicker.vue +32 -48
  193. package/src/components/RatingPicker/EmotionPicker/tests/__snapshots__/EmotionPicker.spec.ts.snap +5 -0
  194. package/src/components/RatingPicker/NumberPicker/NumberPicker.vue +48 -53
  195. package/src/components/RatingPicker/NumberPicker/tests/NumberPicker.spec.ts +2 -1
  196. package/src/components/RatingPicker/NumberPicker/tests/__snapshots__/NumberPicker.spec.ts.snap +40 -13
  197. package/src/components/RatingPicker/RatingPicker.stories.ts +65 -88
  198. package/src/components/RatingPicker/RatingPicker.vue +71 -15
  199. package/src/components/RatingPicker/StarsPicker/StarsPicker.vue +28 -37
  200. package/src/components/RatingPicker/StarsPicker/tests/StarsPicker.spec.ts +1 -1
  201. package/src/components/RatingPicker/StarsPicker/tests/__snapshots__/StarsPicker.spec.ts.snap +5 -0
  202. package/src/components/RatingPicker/accessibilite/Accessibility.mdx +137 -9
  203. package/src/components/RatingPicker/tests/RatingPicker.a11y.spec.ts +123 -0
  204. package/src/components/RatingPicker/tests/RatingPicker.spec.ts +3 -2
  205. package/src/components/RatingPicker/tests/__snapshots__/RatingPicker.spec.ts.snap +40 -11
  206. package/src/components/RatingPicker/useRatingFocus.ts +97 -0
  207. package/src/components/StatusPage/tests/StatusPage.spec.ts +149 -0
  208. package/src/components/SubHeader/SubHeader.vue +1 -1
  209. package/src/components/SyAlert/SyAlert.vue +23 -23
  210. package/src/components/SyTextArea/SyTextArea.stories.ts +177 -131
  211. package/src/components/SyTextArea/SyTextArea.vue +257 -74
  212. package/src/components/SyTextArea/composables/useSyTextAreaValidation.ts +81 -0
  213. package/src/components/SyTextArea/locales.ts +1 -0
  214. package/src/components/SyTextArea/tests/SyTextArea.spec.ts +449 -1
  215. package/src/components/SyTextArea/useDefaultValidationRules.ts +2 -7
  216. package/src/components/SyTextArea/validation/Validation.stories.ts +856 -0
  217. package/src/components/TableToolbar/TableToolbar.vue +6 -6
  218. package/src/components/TableToolbar/accessibilite/Accessibility.mdx +81 -7
  219. package/src/components/Tables/SyServerTable/SyServerTable.stories.ts +163 -0
  220. package/src/components/Tables/SyServerTable/SyServerTable.vue +3 -2
  221. package/src/components/Tables/SyServerTable/tests/SyServerTable.spec.ts +67 -0
  222. package/src/components/Tables/SyTable/SyTable.stories.ts +94 -0
  223. package/src/components/Tables/SyTable/SyTable.vue +3 -2
  224. package/src/components/Tables/SyTable/tests/SyTable.spec.ts +64 -0
  225. package/src/components/Tables/common/SyTableFilter.vue +4 -4
  226. package/src/components/Tables/common/SyTablePagination.vue +1 -0
  227. package/src/components/Tables/common/TableHeader.vue +3 -3
  228. package/src/components/Tables/common/filters/DateFilter.vue +2 -2
  229. package/src/components/Tables/common/filters/logics/tests/NumberFilterLogic.spec.ts +176 -0
  230. package/src/components/Tables/common/filters/logics/tests/SelectFilterLogic.spec.ts +111 -0
  231. package/src/components/Tables/common/tableStyles.scss +6 -6
  232. package/src/components/Tables/common/types.ts +2 -0
  233. package/src/components/UploadWorkflow/tests/UploadWorkflow.spec.ts +2 -0
  234. package/src/components/index.ts +1 -0
  235. package/src/composables/date/tests/useDateFormatDayjs.spec.ts +112 -0
  236. package/src/composables/date/tests/{useDateInitialization.spec.ts → useDateInitializationDayjs.spec.ts} +39 -3
  237. package/src/composables/date/tests/useHolidayDay.spec.ts +109 -0
  238. package/src/composables/date/useDateInitializationDayjs.ts +4 -1
  239. package/src/composables/rules/tests/useFieldValidation.spec.ts +374 -0
  240. package/src/composables/tests/useError.spec.ts +30 -0
  241. package/src/composables/tests/useFormFieldErrorHandling.spec.ts +234 -0
  242. package/src/composables/unifyValidation/documentationValidationProps.ts +12 -12
  243. package/src/composables/unifyValidation/tests/documentationValidationProps.spec.ts +177 -0
  244. package/src/composables/unifyValidation/tests/useCustomValidation.spec.ts +32 -1
  245. package/src/composables/unifyValidation/tests/useValidation.spec.ts +28 -2
  246. package/src/composables/unifyValidation/useCustomValidation.ts +34 -12
  247. package/src/composables/unifyValidation/useValidation.ts +55 -27
  248. package/src/composables/unifyValidation/useVuetifyValidation.ts +2 -2
  249. package/src/composables/useFilterable/useFilterable.spec.ts +42 -0
  250. package/src/composables/useFilterable/useFilterable.ts +11 -7
  251. package/src/composables/useFormFieldErrorHandling.ts +6 -3
  252. package/src/composables/validation/tests/useValidation.spec.ts +2 -2
  253. package/src/composables/validation/useValidation.ts +15 -3
  254. package/src/composantsVuetify/VBtn/VBtn.mdx +9 -39
  255. package/src/composantsVuetify/VBtn/v-btn.stories.ts +26 -86
  256. package/src/composantsVuetify/VCard/VCard.mdx +59 -0
  257. package/src/composantsVuetify/VCard/v-card.stories.ts +279 -0
  258. package/src/designTokens/tokens/amelipro/apColors2026.ts +1 -1
  259. package/src/designTokens/tokens/amelipro/apContextual.ts +6 -0
  260. package/src/designTokens/tokens/amelipro/apDarkTheme.ts +2 -2
  261. package/src/designTokens/tokens/amelipro/apLightTheme.ts +72 -100
  262. package/src/designTokens/tokens/amelipro/apSemantic.ts +1 -1
  263. package/src/designTokens/tokens/baseContextualTokens.ts +1 -6
  264. package/src/designTokens/tokens/baseTokens.ts +232 -0
  265. package/src/designTokens/tokens/cnam/cnamContextual.ts +6 -0
  266. package/src/designTokens/tokens/cnam/cnamDarkTheme.ts +2 -2
  267. package/src/designTokens/tokens/cnam/cnamLightTheme.ts +76 -101
  268. package/src/designTokens/tokens/pa/paDarkTheme.ts +2 -2
  269. package/src/designTokens/tokens/pa/paLightTheme.ts +73 -99
  270. package/src/designTokens/tokens/pa/paSemantic.ts +2 -0
  271. package/src/designTokens/tokens/semanticTokens.ts +114 -0
  272. package/src/stories/Accessibilite/Aculturation/SensibilisationAccessibilite.mdx +61 -91
  273. package/src/stories/Accessibilite/AuditDesignSystem.mdx +5 -8
  274. package/src/stories/Accessibilite/AuditEtContreAudit/Exemptions-derogations.mdx +1 -1
  275. package/src/stories/Accessibilite/AuditEtContreAudit/Introduction.mdx +11 -8
  276. package/src/stories/Accessibilite/AuditEtContreAudit/RGAA.mdx +6 -7
  277. package/src/stories/Accessibilite/Introduction.mdx +30 -30
  278. package/src/stories/Accessibilite/KitDePreAudit/Echantillonnage.mdx +168 -78
  279. package/src/stories/Accessibilite/KitDePreAudit/Introduction.mdx +13 -6
  280. package/src/stories/Accessibilite/KitDePreAudit/Outils/Introduction.mdx +66 -45
  281. package/src/stories/Accessibilite/KitDePreAudit/Outils/LecteursDEcran.mdx +23 -49
  282. package/src/stories/Accessibilite/KitDePreAudit/Outils/Tanaguru/FauxPositifs.stories.ts +6 -0
  283. package/src/stories/Accessibilite/KitDePreAudit/Outils/Tanaguru/Utilisation.mdx +7 -19
  284. package/src/stories/Accessibilite/KitDePreAudit/Preaudit.mdx +18 -20
  285. package/src/stories/Components/Components.stories.ts +59 -6
  286. package/src/stories/DesignTokens/ColorIntegrationExample.vue +2 -3
  287. package/src/stories/DesignTokens/Colors.mdx +6 -8
  288. package/src/stories/DesignTokens/colors.stories.ts +244 -1081
  289. package/src/utils/amelipro/toKebabCase/tests/toKebabCase.spec.ts +52 -0
  290. package/src/utils/formatNir/tests/formatNir.spec.ts +34 -0
  291. package/src/utils/tests/insertAt.spec.ts +44 -0
  292. package/dist/AutocompleteFilter-Df9i5mAl.cjs +0 -1
  293. package/dist/DateFilter-BJD6FMev.cjs +0 -1
  294. package/dist/NumberFilter-DGCzCXzI.cjs +0 -1
  295. package/dist/PeriodFilter-DO_ecTZW.cjs +0 -1
  296. package/dist/SelectFilter-CGwcKWLm.cjs +0 -1
  297. package/dist/TextFilter-B8nf7xoK.cjs +0 -1
  298. package/dist/apLightTheme-CEK4iY3f.cjs +0 -1
  299. package/dist/apLightTheme-DnIM24Lv.js +0 -950
  300. package/dist/composables/date/useDateFormat.d.ts +0 -26
  301. package/dist/composables/date/useDateInitialization.d.ts +0 -18
  302. package/dist/design-system-v3.umd.cjs +0 -1
  303. package/dist/main-ByDPHpae.cjs +0 -1067
  304. package/dist/tooth-11-D3sLWv2n.cjs +0 -1
  305. package/dist/tooth-12-CXrLuH03.cjs +0 -1
  306. package/dist/tooth-13-BSfo5fpT.cjs +0 -1
  307. package/dist/tooth-14-DMzulx0h.cjs +0 -1
  308. package/dist/tooth-15-BKRFVi-9.cjs +0 -1
  309. package/dist/tooth-16-CpuxAbuM.cjs +0 -1
  310. package/dist/tooth-17-BPoahUdg.cjs +0 -1
  311. package/dist/tooth-18-DhHJz8sy.cjs +0 -1
  312. package/dist/tooth-21-Dgd5hn_X.cjs +0 -1
  313. package/dist/tooth-22-C2Tn19sB.cjs +0 -1
  314. package/dist/tooth-23-C9uaaSGb.cjs +0 -1
  315. package/dist/tooth-24-BrK9UGpf.cjs +0 -1
  316. package/dist/tooth-25-CE_EfGNp.cjs +0 -1
  317. package/dist/tooth-26-Ctv4i9Fy.cjs +0 -1
  318. package/dist/tooth-27-C5J7JkWM.cjs +0 -1
  319. package/dist/tooth-28-Z9oWqjo0.cjs +0 -1
  320. package/dist/tooth-31-BrYqmkTi.cjs +0 -1
  321. package/dist/tooth-32-BNNR0oCZ.cjs +0 -1
  322. package/dist/tooth-33-DuxvqO2J.cjs +0 -1
  323. package/dist/tooth-34-BCSCXMB6.cjs +0 -1
  324. package/dist/tooth-35-BLUXkX88.cjs +0 -1
  325. package/dist/tooth-36-IrKHYqlA.cjs +0 -1
  326. package/dist/tooth-37-BYqpdMwo.cjs +0 -1
  327. package/dist/tooth-38-B_eNXXdu.cjs +0 -1
  328. package/dist/tooth-41-Ddva4Ot8.cjs +0 -1
  329. package/dist/tooth-42-szcDqlM0.cjs +0 -1
  330. package/dist/tooth-43-B3ka6rQm.cjs +0 -1
  331. package/dist/tooth-44-CazyQucj.cjs +0 -1
  332. package/dist/tooth-45-B4HQtc8n.cjs +0 -1
  333. package/dist/tooth-46-BPM40gbG.cjs +0 -1
  334. package/dist/tooth-47-Dvr20dlh.cjs +0 -1
  335. package/dist/tooth-48-Bd8ljGsF.cjs +0 -1
  336. package/dist/tooth-51-OBpwCOF3.cjs +0 -1
  337. package/dist/tooth-52-aKxyHcmq.cjs +0 -1
  338. package/dist/tooth-53-vCwJjTOc.cjs +0 -1
  339. package/dist/tooth-54-DsWu2iFy.cjs +0 -1
  340. package/dist/tooth-55-BxC1X2Dn.cjs +0 -1
  341. package/dist/tooth-61-BbLvxMQi.cjs +0 -1
  342. package/dist/tooth-62-CmTkWczP.cjs +0 -1
  343. package/dist/tooth-63-DI7l_2qI.cjs +0 -1
  344. package/dist/tooth-64-B21sOsJh.cjs +0 -1
  345. package/dist/tooth-65-D2ZC2VEr.cjs +0 -1
  346. package/dist/tooth-71-D473PPO5.cjs +0 -1
  347. package/dist/tooth-72-Drh1wnNu.cjs +0 -1
  348. package/dist/tooth-73-DzlwYI23.cjs +0 -1
  349. package/dist/tooth-74-8aGvcZPg.cjs +0 -1
  350. package/dist/tooth-75-BFK7At_r.cjs +0 -1
  351. package/dist/tooth-81-BZmR-I0M.cjs +0 -1
  352. package/dist/tooth-82-euVfUUZV.cjs +0 -1
  353. package/dist/tooth-83-KV010j64.cjs +0 -1
  354. package/dist/tooth-84-BBg1RjhZ.cjs +0 -1
  355. package/dist/tooth-85-Cr-kc1wM.cjs +0 -1
  356. package/dist/vuetifyConfig.umd.cjs +0 -1
  357. package/src/components/BackBtn/tests/__snapshots__/back-btn-custom-bg.snap.png +0 -0
  358. package/src/components/BackBtn/tests/__snapshots__/back-btn-dark-mode.snap.png +0 -0
  359. package/src/components/BackBtn/tests/__snapshots__/back-btn-default.snap.png +0 -0
  360. package/src/components/BackBtn/tests/__snapshots__/back-btn-no-icon.snap.png +0 -0
  361. package/src/components/DatePicker/CalendarMode/tests/DatePicker.events.spec.ts +0 -178
  362. package/src/components/DialogBox/tests/__snapshots__/dialog-box-custom-texts.snap.png +0 -0
  363. package/src/components/DialogBox/tests/__snapshots__/dialog-box-default.snap.png +0 -0
  364. package/src/components/DialogBox/tests/__snapshots__/dialog-box-no-actions.snap.png +0 -0
  365. package/src/components/HeaderBar/HeaderBurgerMenu/tests/__snapshots__/header-burger-menu-generated-submenu-open.snap.png +0 -0
  366. package/src/components/HeaderBar/HeaderBurgerMenu/tests/__snapshots__/header-burger-menu-generated.snap.png +0 -0
  367. package/src/components/HeaderBar/tests/__snapshots__/header-bar-custom-width.snap.png +0 -0
  368. package/src/components/HeaderBar/tests/__snapshots__/header-bar-default.snap.png +0 -0
  369. package/src/components/HeaderBar/tests/__snapshots__/header-bar-no-sticky.snap.png +0 -0
  370. package/src/components/HeaderBar/tests/__snapshots__/header-bar-with-prepend.snap.png +0 -0
  371. package/src/components/HeaderBar/tests/__snapshots__/header-bar-with-side.snap.png +0 -0
  372. package/src/components/HeaderBar/tests/__snapshots__/header-bar-with-subtitle.snap.png +0 -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/RangeField/tests/__snapshots__/range-field-custom-bg.snap.png +0 -0
  380. package/src/components/RangeField/tests/__snapshots__/range-field-custom-range.snap.png +0 -0
  381. package/src/components/RangeField/tests/__snapshots__/range-field-default.snap.png +0 -0
  382. package/src/components/RangeField/tests/__snapshots__/range-field-step.snap.png +0 -0
  383. package/src/components/RangeField/tests/__snapshots__/range-field-with-label.snap.png +0 -0
  384. package/src/components/SyAlert/tests/__snapshots__/sy-alert-closable.snap.png +0 -0
  385. package/src/components/SyAlert/tests/__snapshots__/sy-alert-error.snap.png +0 -0
  386. package/src/components/SyAlert/tests/__snapshots__/sy-alert-info.snap.png +0 -0
  387. package/src/components/SyAlert/tests/__snapshots__/sy-alert-success.snap.png +0 -0
  388. package/src/components/SyAlert/tests/__snapshots__/sy-alert-variant-outlined.snap.png +0 -0
  389. package/src/components/SyAlert/tests/__snapshots__/sy-alert-variant-tonal.snap.png +0 -0
  390. package/src/components/SyAlert/tests/__snapshots__/sy-alert-warning.snap.png +0 -0
  391. package/src/composables/date/tests/useDateFormat.spec.ts +0 -67
  392. package/src/composables/date/useDateFormat.ts +0 -110
  393. package/src/composables/date/useDateInitialization.ts +0 -92
@@ -311,4 +311,364 @@ describe('useCalendarKeyboardNavigation', () => {
311
311
  addEventListenerSpy.mockRestore()
312
312
  vi.useRealTimers()
313
313
  })
314
+
315
+ it('handles Home/End/PageUp/PageDown navigation', () => {
316
+ vi.useFakeTimers()
317
+ const isDatePickerVisible = ref(true)
318
+ const getCurrentDate = vi.fn(() => new Date(2023, 0, 15))
319
+ const setCurrentDate = vi.fn()
320
+
321
+ let savedListener: ((e: KeyboardEvent) => void) | null = null
322
+ const addEventListenerSpy = vi.spyOn(document, 'addEventListener').mockImplementation((type, listener) => {
323
+ if (type === 'keydown') savedListener = listener as (e: KeyboardEvent) => void
324
+ })
325
+
326
+ let attachListeners!: () => void
327
+ const TestComponent = defineComponent({
328
+ setup() {
329
+ const result = useCalendarKeyboardNavigation({
330
+ isDatePickerVisible,
331
+ datePickerRef: ref(null),
332
+ getCurrentDate,
333
+ setCurrentDate,
334
+ })
335
+ attachListeners = result.attachListeners
336
+ return () => null
337
+ },
338
+ })
339
+ mount(TestComponent)
340
+ attachListeners()
341
+ vi.advanceTimersByTime(150)
342
+
343
+ const fireKey = (key: string, shiftKey = false) => {
344
+ setCurrentDate.mockClear()
345
+ const event = new KeyboardEvent('keydown', { key, shiftKey, bubbles: true })
346
+ Object.defineProperty(event, 'target', { value: document.createElement('div') })
347
+ savedListener!(event)
348
+ return setCurrentDate.mock.calls[0]?.[0] as Date | undefined
349
+ }
350
+
351
+ // Home → premier jour du mois (1 Jan)
352
+ const homeDate = fireKey('Home')
353
+ expect(homeDate?.getDate()).toBe(1)
354
+ expect(homeDate?.getMonth()).toBe(0)
355
+
356
+ // End → dernier jour du mois (31 Jan)
357
+ const endDate = fireKey('End')
358
+ expect(endDate?.getDate()).toBe(31)
359
+
360
+ // PageUp → premier jour du mois précédent (1 Dec 2022)
361
+ const pageUpDate = fireKey('PageUp')
362
+ expect(pageUpDate?.getDate()).toBe(1)
363
+ expect(pageUpDate?.getMonth()).toBe(11)
364
+ expect(pageUpDate?.getFullYear()).toBe(2022)
365
+
366
+ // PageDown → premier jour du mois suivant (1 Feb 2023)
367
+ const pageDownDate = fireKey('PageDown')
368
+ expect(pageDownDate?.getDate()).toBe(1)
369
+ expect(pageDownDate?.getMonth()).toBe(1)
370
+
371
+ // PageUp + Shift → année précédente (1 Jan 2022)
372
+ const pageUpShiftDate = fireKey('PageUp', true)
373
+ expect(pageUpShiftDate?.getFullYear()).toBe(2022)
374
+
375
+ // PageDown + Shift → année suivante (1 Jan 2024)
376
+ const pageDownShiftDate = fireKey('PageDown', true)
377
+ expect(pageDownShiftDate?.getFullYear()).toBe(2024)
378
+
379
+ addEventListenerSpy.mockRestore()
380
+ vi.useRealTimers()
381
+ })
382
+
383
+ it('handles Enter/Space on a day cell', () => {
384
+ vi.useFakeTimers()
385
+ const isDatePickerVisible = ref(true)
386
+ const setCurrentDate = vi.fn()
387
+
388
+ // Créer un rootEl contenant la cellule de jour (nécessaire pour clickDateButton)
389
+ const rootEl = document.createElement('div')
390
+ const dayWrapper = document.createElement('div')
391
+ dayWrapper.setAttribute('data-v-date', '2023-01-10')
392
+ dayWrapper.className = 'v-date-picker-month__day'
393
+ const btn = document.createElement('button')
394
+ btn.type = 'button'
395
+ const clickSpy = vi.spyOn(btn, 'click')
396
+ dayWrapper.appendChild(btn)
397
+ rootEl.appendChild(dayWrapper)
398
+ document.body.appendChild(rootEl)
399
+
400
+ // Le listener est attaché sur rootEl (fallback datePickerEl = rootEl), pas sur document
401
+ let savedListener: ((e: KeyboardEvent) => void) | null = null
402
+ const addSpy = vi.spyOn(rootEl, 'addEventListener').mockImplementation((type, listener) => {
403
+ if (type === 'keydown') savedListener = listener as (e: KeyboardEvent) => void
404
+ })
405
+
406
+ let attachListeners!: () => void
407
+ const TestComponent = defineComponent({
408
+ setup() {
409
+ const result = useCalendarKeyboardNavigation({
410
+ isDatePickerVisible,
411
+ datePickerRef: ref({ $el: rootEl } as unknown as ComponentPublicInstance),
412
+ getCurrentDate: vi.fn(() => new Date(2023, 0, 10)),
413
+ setCurrentDate,
414
+ })
415
+ attachListeners = result.attachListeners
416
+ return () => null
417
+ },
418
+ })
419
+ mount(TestComponent)
420
+ attachListeners()
421
+ vi.advanceTimersByTime(150)
422
+
423
+ const enterEvent = new KeyboardEvent('keydown', { key: 'Enter', bubbles: true })
424
+ Object.defineProperty(enterEvent, 'target', { value: btn })
425
+ savedListener!(enterEvent)
426
+
427
+ expect(clickSpy).toHaveBeenCalled()
428
+ document.body.removeChild(rootEl)
429
+
430
+ addSpy.mockRestore()
431
+ vi.useRealTimers()
432
+ })
433
+
434
+ it('handles Enter on header button (month/year control)', () => {
435
+ vi.useFakeTimers()
436
+ const isDatePickerVisible = ref(true)
437
+ const setCurrentDate = vi.fn()
438
+
439
+ let savedListener: ((e: KeyboardEvent) => void) | null = null
440
+ const addEventListenerSpy = vi.spyOn(document, 'addEventListener').mockImplementation((type, listener) => {
441
+ if (type === 'keydown') savedListener = listener as (e: KeyboardEvent) => void
442
+ })
443
+
444
+ let attachListeners!: () => void
445
+ const TestComponent = defineComponent({
446
+ setup() {
447
+ const result = useCalendarKeyboardNavigation({
448
+ isDatePickerVisible,
449
+ datePickerRef: ref(null),
450
+ getCurrentDate: vi.fn(() => null),
451
+ setCurrentDate,
452
+ })
453
+ attachListeners = result.attachListeners
454
+ return () => null
455
+ },
456
+ })
457
+ mount(TestComponent)
458
+ attachListeners()
459
+ vi.advanceTimersByTime(150)
460
+
461
+ // Simuler un bouton dans les contrôles d'entête
462
+ const controls = document.createElement('div')
463
+ controls.className = 'v-date-picker-controls'
464
+ const headerBtn = document.createElement('button')
465
+ const clickSpy = vi.spyOn(headerBtn, 'click')
466
+ controls.appendChild(headerBtn)
467
+ document.body.appendChild(controls)
468
+
469
+ const enterEvent = new KeyboardEvent('keydown', { key: 'Enter', bubbles: true })
470
+ Object.defineProperty(enterEvent, 'target', { value: headerBtn })
471
+ savedListener!(enterEvent)
472
+
473
+ expect(clickSpy).toHaveBeenCalled()
474
+ document.body.removeChild(controls)
475
+
476
+ addEventListenerSpy.mockRestore()
477
+ vi.useRealTimers()
478
+ })
479
+
480
+ it('handles ArrowLeft/Right/Up/Down in month dialog', () => {
481
+ vi.useFakeTimers()
482
+ const isDatePickerVisible = ref(true)
483
+ const setCurrentDate = vi.fn()
484
+
485
+ let savedListener: ((e: KeyboardEvent) => void) | null = null
486
+ const addEventListenerSpy = vi.spyOn(document, 'addEventListener').mockImplementation((type, listener) => {
487
+ if (type === 'keydown') savedListener = listener as (e: KeyboardEvent) => void
488
+ })
489
+
490
+ let attachListeners!: () => void
491
+ const TestComponent = defineComponent({
492
+ setup() {
493
+ const result = useCalendarKeyboardNavigation({
494
+ isDatePickerVisible,
495
+ datePickerRef: ref(null),
496
+ getCurrentDate: vi.fn(() => null),
497
+ setCurrentDate,
498
+ })
499
+ attachListeners = result.attachListeners
500
+ return () => null
501
+ },
502
+ })
503
+ mount(TestComponent)
504
+ attachListeners()
505
+ vi.advanceTimersByTime(150)
506
+
507
+ // Créer 3 boutons de mois dans le DOM
508
+ const monthsContainer = document.createElement('div')
509
+ monthsContainer.className = 'v-date-picker-months'
510
+ const buttons = Array.from({ length: 3 }, (_, i) => {
511
+ const b = document.createElement('button')
512
+ b.textContent = `Month ${i + 1}`
513
+ monthsContainer.appendChild(b)
514
+ return b
515
+ })
516
+ document.body.appendChild(monthsContainer)
517
+
518
+ const fireMonthKey = (key: string, targetBtn: HTMLButtonElement) => {
519
+ const event = new KeyboardEvent('keydown', { key, bubbles: true })
520
+ Object.defineProperty(event, 'target', { value: targetBtn })
521
+ savedListener!(event)
522
+ }
523
+
524
+ const focusSpy = vi.spyOn(buttons[1]!, 'focus')
525
+ // ArrowRight depuis bouton 0 → focus sur bouton 1
526
+ fireMonthKey('ArrowRight', buttons[0]!)
527
+ expect(focusSpy).toHaveBeenCalled()
528
+
529
+ // Enter sur un bouton de mois
530
+ const clickSpy = vi.spyOn(buttons[0]!, 'click')
531
+ fireMonthKey('Enter', buttons[0]!)
532
+ expect(clickSpy).toHaveBeenCalled()
533
+
534
+ document.body.removeChild(monthsContainer)
535
+ addEventListenerSpy.mockRestore()
536
+ vi.useRealTimers()
537
+ })
538
+
539
+ it('handles ArrowLeft/Right in year dialog', () => {
540
+ vi.useFakeTimers()
541
+ const isDatePickerVisible = ref(true)
542
+ const setCurrentDate = vi.fn()
543
+
544
+ let savedListener: ((e: KeyboardEvent) => void) | null = null
545
+ const addEventListenerSpy = vi.spyOn(document, 'addEventListener').mockImplementation((type, listener) => {
546
+ if (type === 'keydown') savedListener = listener as (e: KeyboardEvent) => void
547
+ })
548
+
549
+ let attachListeners!: () => void
550
+ const TestComponent = defineComponent({
551
+ setup() {
552
+ const result = useCalendarKeyboardNavigation({
553
+ isDatePickerVisible,
554
+ datePickerRef: ref(null),
555
+ getCurrentDate: vi.fn(() => null),
556
+ setCurrentDate,
557
+ })
558
+ attachListeners = result.attachListeners
559
+ return () => null
560
+ },
561
+ })
562
+ mount(TestComponent)
563
+ attachListeners()
564
+ vi.advanceTimersByTime(150)
565
+
566
+ // Créer 3 boutons d'années dans le DOM
567
+ const yearsContainer = document.createElement('div')
568
+ yearsContainer.className = 'v-date-picker-years'
569
+ const buttons = Array.from({ length: 3 }, (_, i) => {
570
+ const b = document.createElement('button')
571
+ b.textContent = `${2020 + i}`
572
+ yearsContainer.appendChild(b)
573
+ return b
574
+ })
575
+ document.body.appendChild(yearsContainer)
576
+
577
+ const fireYearKey = (key: string, targetBtn: HTMLButtonElement) => {
578
+ const event = new KeyboardEvent('keydown', { key, bubbles: true })
579
+ Object.defineProperty(event, 'target', { value: targetBtn })
580
+ savedListener!(event)
581
+ }
582
+
583
+ const focusSpy = vi.spyOn(buttons[1]!, 'focus')
584
+ // ArrowRight depuis bouton 0 → focus sur bouton 1
585
+ fireYearKey('ArrowRight', buttons[0]!)
586
+ expect(focusSpy).toHaveBeenCalled()
587
+
588
+ // Enter sur un bouton d'année
589
+ const clickSpy = vi.spyOn(buttons[0]!, 'click')
590
+ fireYearKey('Enter', buttons[0]!)
591
+ expect(clickSpy).toHaveBeenCalled()
592
+
593
+ document.body.removeChild(yearsContainer)
594
+ addEventListenerSpy.mockRestore()
595
+ vi.useRealTimers()
596
+ })
597
+
598
+ it('attaches on datePickerEl when no containerEl and detaches from it', () => {
599
+ vi.useFakeTimers()
600
+ const isDatePickerVisible = ref(true)
601
+
602
+ // Créer un rootEl avec .v-date-picker dedans
603
+ const rootEl = document.createElement('div')
604
+ const datePickerEl = document.createElement('div')
605
+ datePickerEl.className = 'v-date-picker'
606
+ rootEl.appendChild(datePickerEl)
607
+ document.body.appendChild(rootEl)
608
+
609
+ const addSpy = vi.spyOn(datePickerEl, 'addEventListener')
610
+ const removeSpy = vi.spyOn(datePickerEl, 'removeEventListener')
611
+
612
+ let detachListeners!: () => void
613
+ const TestComponent = defineComponent({
614
+ setup() {
615
+ const result = useCalendarKeyboardNavigation({
616
+ isDatePickerVisible,
617
+ datePickerRef: ref({ $el: rootEl } as unknown as ComponentPublicInstance),
618
+ getCurrentDate: vi.fn(() => null),
619
+ setCurrentDate: vi.fn(),
620
+ })
621
+ detachListeners = result.detachListeners
622
+ result.attachListeners()
623
+ vi.advanceTimersByTime(150)
624
+ return () => null
625
+ },
626
+ })
627
+ mount(TestComponent)
628
+
629
+ expect(addSpy).toHaveBeenCalledWith('keydown', expect.any(Function), true)
630
+
631
+ detachListeners()
632
+ expect(removeSpy).toHaveBeenCalledWith('keydown', expect.any(Function), true)
633
+
634
+ document.body.removeChild(rootEl)
635
+ vi.useRealTimers()
636
+ })
637
+
638
+ it('does not attach listener when already attached', () => {
639
+ vi.useFakeTimers()
640
+ const isDatePickerVisible = ref(true)
641
+
642
+ const addSpy = vi.spyOn(document, 'addEventListener')
643
+ let attachListeners!: () => void
644
+
645
+ const TestComponent = defineComponent({
646
+ setup() {
647
+ const result = useCalendarKeyboardNavigation({
648
+ isDatePickerVisible,
649
+ datePickerRef: ref(null),
650
+ getCurrentDate: vi.fn(() => null),
651
+ setCurrentDate: vi.fn(),
652
+ })
653
+ attachListeners = result.attachListeners
654
+ return () => null
655
+ },
656
+ })
657
+ mount(TestComponent)
658
+
659
+ const callsBefore = addSpy.mock.calls.length
660
+ attachListeners()
661
+ vi.advanceTimersByTime(150)
662
+ const callsAfterFirst = addSpy.mock.calls.length - callsBefore
663
+
664
+ // Second attach ne doit pas ajouter de listener supplémentaire
665
+ attachListeners()
666
+ vi.advanceTimersByTime(150)
667
+ const callsAfterSecond = addSpy.mock.calls.length - callsBefore
668
+
669
+ expect(callsAfterSecond).toBe(callsAfterFirst)
670
+
671
+ addSpy.mockRestore()
672
+ vi.useRealTimers()
673
+ })
314
674
  })
@@ -0,0 +1,129 @@
1
+ import { describe, expect, it, vi } from 'vitest'
2
+ import { computed, nextTick, ref } from 'vue'
3
+ import { useDatePickerValidationBridge } from '../useDatePickerValidationBridge'
4
+ import type { DateObjectValue } from '../../types'
5
+
6
+ const createBridgeOptions = (overrides = {}) => ({
7
+ showSuccessMessages: true,
8
+ disableErrorHandling: false,
9
+ noCalendar: false,
10
+ required: false,
11
+ displayRange: false,
12
+ customRules: ref([]),
13
+ customWarningRules: ref([]),
14
+ selectedDates: ref<DateObjectValue>(null),
15
+ isUpdatingFromInternal: ref(false),
16
+ currentRangeIsValid: ref(true),
17
+ getRangeValidationError: ref(''),
18
+ ...overrides,
19
+ })
20
+
21
+ describe('useDatePickerValidationBridge', () => {
22
+ it('conserve un retour synchrone pour le flux standard', () => {
23
+ const selectedDates = ref<DateObjectValue>(new Date('2026-05-13'))
24
+ const { validateDates } = useDatePickerValidationBridge(createBridgeOptions({
25
+ selectedDates,
26
+ }))
27
+
28
+ const result = validateDates()
29
+
30
+ expect(result).not.toBeInstanceOf(Promise)
31
+ expect(result).toMatchObject({
32
+ hasError: false,
33
+ })
34
+ })
35
+
36
+ it('conserve le flux required specifique CalendarMode', async () => {
37
+ const { errors, validateDates } = useDatePickerValidationBridge(createBridgeOptions({
38
+ required: true,
39
+ useCalendarModeRequiredFlow: true,
40
+ isInitialValidation: ref(false),
41
+ isValidateOnBlur: computed(() => true),
42
+ onblur: ref(false),
43
+ }))
44
+
45
+ await validateDates(true)
46
+
47
+ expect(errors.value).toContain('La date est requise.')
48
+ })
49
+
50
+ it('court-circuite validateField en readonly quand demande', () => {
51
+ const readonly = ref(true)
52
+ const { validateField } = useDatePickerValidationBridge(createBridgeOptions({
53
+ readonly,
54
+ skipValidationWhenReadonly: true,
55
+ }))
56
+
57
+ const result = validateField(
58
+ new Date('2026-05-13'),
59
+ [{ type: 'custom', options: { validate: () => false, message: 'Erreur' } }],
60
+ )
61
+
62
+ expect(result).toMatchObject({
63
+ hasError: false,
64
+ state: {
65
+ errors: [],
66
+ warnings: [],
67
+ successes: [],
68
+ },
69
+ })
70
+ })
71
+
72
+ it('nettoie les messages quand readonly change sur le flux CalendarMode', async () => {
73
+ const readonly = ref(false)
74
+ const { errors } = useDatePickerValidationBridge(createBridgeOptions({
75
+ readonly,
76
+ skipValidationWhenReadonly: true,
77
+ }))
78
+
79
+ errors.value = ['Erreur persistante']
80
+ readonly.value = true
81
+ await nextTick()
82
+
83
+ expect(errors.value).toEqual([])
84
+ })
85
+
86
+ it('revalide les dates selectionnees quand les customRules changent si active', async () => {
87
+ const firstValidate = vi.fn(() => true)
88
+ const secondValidate = vi.fn(() => true)
89
+ const customRules = ref([
90
+ { type: 'custom', options: { validate: firstValidate } },
91
+ ])
92
+
93
+ useDatePickerValidationBridge(createBridgeOptions({
94
+ customRules,
95
+ selectedDates: ref<DateObjectValue>(new Date('2026-05-13')),
96
+ revalidateOnCustomRulesChange: true,
97
+ }))
98
+
99
+ customRules.value = [
100
+ { type: 'custom', options: { validate: secondValidate } },
101
+ ]
102
+
103
+ await nextTick()
104
+
105
+ expect(secondValidate).toHaveBeenCalledTimes(1)
106
+ expect(firstValidate).not.toHaveBeenCalled()
107
+ })
108
+
109
+ it('ne revalide pas les customRules si aucune date nest selectionnee', async () => {
110
+ const validate = vi.fn(() => true)
111
+ const customRules = ref([
112
+ { type: 'custom', options: { validate } },
113
+ ])
114
+
115
+ useDatePickerValidationBridge(createBridgeOptions({
116
+ customRules,
117
+ selectedDates: ref<DateObjectValue>(null),
118
+ revalidateOnCustomRulesChange: true,
119
+ }))
120
+
121
+ customRules.value = [
122
+ { type: 'custom', options: { validate } },
123
+ ]
124
+
125
+ await nextTick()
126
+
127
+ expect(validate).not.toHaveBeenCalled()
128
+ })
129
+ })
@@ -1,5 +1,6 @@
1
1
  import { computed, ref, watch, type Ref, type ComputedRef } from 'vue'
2
- import type { DateInput, DateValue } from '@/composables/date/useDateInitializationDayjs'
2
+ import type { DateInput, DateModelValue } from '@/composables/date/useDateInitializationDayjs'
3
+ import { DATE_PICKER_MESSAGES } from '../constants/messages'
3
4
 
4
5
  export interface UseDatePickerStateOptions {
5
6
  selectedDates: Ref<Date | (Date | null)[] | null>
@@ -11,7 +12,7 @@ export interface UseDatePickerStateOptions {
11
12
  formatDate: (date: Date | null, format: string) => string
12
13
  initializeSelectedDates: (value: DateInput | null, format: string, dateFormatReturn?: string) => Date | (Date | null)[] | null
13
14
  validateDates: (forceValidation?: boolean) => void
14
- updateModel: (value: DateValue) => void
15
+ updateModel: (value: DateModelValue) => void
15
16
  generateDateRange?: (start: Date, end: Date) => Date[]
16
17
  }
17
18
 
@@ -20,7 +21,7 @@ export interface UseDatePickerStateResult {
20
21
  rangeBoundaryDates?: Ref<[Date | null, Date | null] | null>
21
22
  textInputValue: Ref<string>
22
23
  displayFormattedDate: Ref<string>
23
- formattedDate: Ref<DateValue>
24
+ formattedDate: Ref<DateModelValue>
24
25
  displayFormattedFromSelectedDates: ComputedRef<string | null>
25
26
  syncFromModelValue: (newValue: DateInput | undefined) => void
26
27
  syncTextInputFromSelection: () => void
@@ -44,7 +45,7 @@ export const useDatePickerState = (options: UseDatePickerStateOptions): UseDateP
44
45
  const textInputValue = ref('')
45
46
  const displayFormattedDate = ref('')
46
47
 
47
- const formattedDate = computed<DateValue>(() => {
48
+ const formattedDate = computed<DateModelValue>(() => {
48
49
  if (!selectedDates.value) return ''
49
50
  const rf = dateFormatReturn || format
50
51
 
@@ -73,7 +74,7 @@ export const useDatePickerState = (options: UseDatePickerStateOptions): UseDateP
73
74
 
74
75
  if (Array.isArray(selectedDates.value)) {
75
76
  if (selectedDates.value.length >= 2) {
76
- return `${formatDate(selectedDates.value[0]!, format)} - ${formatDate(
77
+ return `${formatDate(selectedDates.value[0]!, format)}${DATE_PICKER_MESSAGES.RANGE_SEPARATOR}${formatDate(
77
78
  selectedDates.value[selectedDates.value.length - 1]!,
78
79
  format,
79
80
  )}`
@@ -91,7 +92,17 @@ export const useDatePickerState = (options: UseDatePickerStateOptions): UseDateP
91
92
  textInputValue.value = ''
92
93
  return
93
94
  }
94
- if (typeof newValue === 'string') {
95
+ if (Array.isArray(newValue) && newValue.length === 2) {
96
+ // Mode plage : afficher "startDate - endDate" dans l'input
97
+ const startStr = dateFormatReturn
98
+ ? formatDate(parseDate(newValue[0]!, dateFormatReturn), format)
99
+ : newValue[0]!
100
+ const endStr = dateFormatReturn
101
+ ? formatDate(parseDate(newValue[1]!, dateFormatReturn), format)
102
+ : newValue[1]!
103
+ textInputValue.value = `${startStr}${DATE_PICKER_MESSAGES.RANGE_SEPARATOR}${endStr}`
104
+ }
105
+ else if (typeof newValue === 'string') {
95
106
  if (dateFormatReturn) {
96
107
  const date = parseDate(newValue, dateFormatReturn)
97
108
  if (date) {
@@ -128,16 +139,24 @@ export const useDatePickerState = (options: UseDatePickerStateOptions): UseDateP
128
139
  }
129
140
 
130
141
  if (selectedDates.value) {
131
- const firstDate = Array.isArray(selectedDates.value)
132
- ? selectedDates.value[0]
133
- : selectedDates.value
134
- if (firstDate) {
135
- const formattedForInput = formatDate(firstDate, format)
136
- textInputValue.value = formattedForInput
142
+ if (displayRange && Array.isArray(selectedDates.value) && selectedDates.value.length >= 2) {
143
+ const startDate = selectedDates.value[0]
144
+ const endDate = selectedDates.value[selectedDates.value.length - 1]
145
+ if (startDate && endDate) {
146
+ textInputValue.value = `${formatDate(startDate, format)}${DATE_PICKER_MESSAGES.RANGE_SEPARATOR}${formatDate(endDate, format)}`
147
+ }
148
+ }
149
+ else {
150
+ const firstDate = Array.isArray(selectedDates.value)
151
+ ? selectedDates.value[0]
152
+ : selectedDates.value
153
+ if (firstDate) {
154
+ textInputValue.value = formatDate(firstDate, format)
155
+ }
137
156
  }
138
157
  if (Array.isArray(formattedDate.value)) {
139
158
  // Pour les plages, formater avec le séparateur standard " - "
140
- displayFormattedDate.value = formattedDate.value.join(' - ')
159
+ displayFormattedDate.value = formattedDate.value.join(DATE_PICKER_MESSAGES.RANGE_SEPARATOR)
141
160
  }
142
161
  else {
143
162
  displayFormattedDate.value = (formattedDate.value as string) || ''
@@ -157,7 +176,7 @@ export const useDatePickerState = (options: UseDatePickerStateOptions): UseDateP
157
176
  const startDate = value[0]
158
177
  const endDate = value[value.length - 1]
159
178
  if (startDate && endDate) {
160
- const formattedForInput = `${formatDate(startDate, format)} - ${formatDate(endDate, format)}`
179
+ const formattedForInput = `${formatDate(startDate, format)}${DATE_PICKER_MESSAGES.RANGE_SEPARATOR}${formatDate(endDate, format)}`
161
180
  if (textInputValue.value !== formattedForInput) {
162
181
  textInputValue.value = formattedForInput
163
182
  }