@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
@@ -118,7 +118,7 @@ export const WithVModel: Story = {
118
118
  Onglet actif: {{ activeTab }}
119
119
  <button
120
120
  class="ml-4 px-2 py-1 bg-primary text-white rounded"
121
- @click="activeTab = activeTab === 'tab1' ? 'tab2' : 'tab1'"
121
+ @click="activeTab = activeTab === 'tab1' ? 'tab2' : activeTab === 'tab2' ? 'tab3' : 'tab1'"
122
122
  >
123
123
  Changer d'onglet
124
124
  </button>
@@ -138,7 +138,7 @@ export const WithVModel: Story = {
138
138
  Onglet actif: {{ activeTab }}
139
139
  <button
140
140
  class="ml-4 px-2 py-1 bg-primary text-white rounded"
141
- @click="activeTab = activeTab === 'tab1' ? 'tab2' : 'tab1'"
141
+ @click="activeTab = activeTab === 'tab1' ? 'tab2' : activeTab === 'tab2' ? 'tab3' : 'tab1'"
142
142
  >
143
143
  Changer d'onglet
144
144
  </button>
@@ -476,9 +476,9 @@ const items = [
476
476
  export const NavigationMode: Story = {
477
477
  args: {
478
478
  items: [
479
- { label: 'Accueil', value: 'home', href: '#' },
480
- { label: 'Profil', value: 'profile', href: '#profile' },
481
- { label: 'Paramètres', value: 'settings', href: '#settings' },
479
+ { label: 'Accueil', value: 'home', href: 'javascript:void(0)' },
480
+ { label: 'Profil', value: 'profile', href: 'javascript:void(0)' },
481
+ { label: 'Paramètres', value: 'settings', href: 'javascript:void(0)' },
482
482
  ],
483
483
  },
484
484
  parameters: {
@@ -9,9 +9,9 @@ export const config = {
9
9
  'show-arrows': true,
10
10
  },
11
11
  tab: {
12
- 'base-color': '#0C419A',
13
- 'active-color': '#0C419A',
14
- 'slider-color': '#0C419A',
12
+ 'base-color': 'rgb(var(--v-theme-primary))',
13
+ 'active-color': 'rgb(var(--v-theme-primary))',
14
+ 'slider-color': 'rgb(var(--v-theme-primary))',
15
15
  'ripple': false,
16
16
  },
17
17
  }
@@ -450,6 +450,271 @@ describe('SyTabs', () => {
450
450
  })
451
451
  })
452
452
 
453
+ // Tests items désactivés avec navigation (branches template lignes 444-504)
454
+ describe('Items désactivés en mode navigation', () => {
455
+ it('rend un <button> désactivé pour un item avec to et disabled', () => {
456
+ const wrapper = createWrapper({
457
+ props: {
458
+ ...defaultMountOptions.props,
459
+ items: [
460
+ { label: 'Nav 1', value: 'nav1', to: '/path-1' },
461
+ { label: 'Désactivé', value: 'nav2', to: '/path-2', disabled: true },
462
+ ],
463
+ },
464
+ })
465
+
466
+ const buttons = wrapper.findAll('.sy-tabs__button')
467
+ const disabledBtn = buttons.find(b => b.attributes('disabled') !== undefined)
468
+ expect(disabledBtn).toBeDefined()
469
+ expect(disabledBtn!.element.tagName).toBe('BUTTON')
470
+ })
471
+
472
+ it('rend un <button> désactivé pour un item avec href et disabled', () => {
473
+ const wrapper = createWrapper({
474
+ props: {
475
+ ...defaultMountOptions.props,
476
+ items: [
477
+ { label: 'Externe', value: 'ext', href: 'https://example.com', disabled: true },
478
+ ],
479
+ },
480
+ })
481
+
482
+ const btn = wrapper.find('.sy-tabs__button')
483
+ expect(btn.element.tagName).toBe('BUTTON')
484
+ expect(btn.attributes('disabled')).toBeDefined()
485
+ expect(btn.attributes('aria-disabled')).toBe('true')
486
+ })
487
+
488
+ it('rend un <a> pour un item avec href non désactivé', () => {
489
+ const wrapper = createWrapper({
490
+ props: {
491
+ ...defaultMountOptions.props,
492
+ items: [
493
+ { label: 'Externe', value: 'ext', href: 'https://example.com' },
494
+ ],
495
+ },
496
+ })
497
+
498
+ const link = wrapper.find('.sy-tabs__button')
499
+ expect(link.element.tagName).toBe('A')
500
+ expect(link.attributes('href')).toBe('https://example.com')
501
+ })
502
+
503
+ it('ne change pas d\'onglet au clic sur un item désactivé (button)', async () => {
504
+ const wrapper = createWrapper({
505
+ props: {
506
+ ...defaultMountOptions.props,
507
+ items: [
508
+ { label: 'Tab 1', value: 'tab1', content: 'Contenu 1' },
509
+ { label: 'Désactivé', value: 'tab2', content: '', disabled: true },
510
+ ],
511
+ },
512
+ })
513
+
514
+ const vm = wrapper.vm as unknown as { activeItemIndex: number }
515
+ expect(vm.activeItemIndex).toBe(0)
516
+
517
+ const disabledBtn = wrapper.findAll('.sy-tabs__button')[1]!
518
+ await disabledBtn.trigger('click')
519
+
520
+ expect(vm.activeItemIndex).toBe(0)
521
+ })
522
+ })
523
+
524
+ // Tests Escape key (setupAccessibilityFeatures)
525
+ describe('Escape key', () => {
526
+ it('remet focusedItemIndex à -1 sur Escape quand focus >= 0', async () => {
527
+ const wrapper = createWrapper()
528
+ const vm = wrapper.vm as unknown as { focusedItemIndex: number }
529
+
530
+ vm.focusedItemIndex = 1
531
+
532
+ window.dispatchEvent(new KeyboardEvent('keydown', { key: 'Escape' }))
533
+ await nextTick()
534
+
535
+ expect(vm.focusedItemIndex).toBe(-1)
536
+ })
537
+
538
+ it('ne fait rien sur Escape quand focusedItemIndex est -1', async () => {
539
+ const wrapper = createWrapper()
540
+ const vm = wrapper.vm as unknown as { focusedItemIndex: number }
541
+
542
+ vm.focusedItemIndex = -1
543
+ window.dispatchEvent(new KeyboardEvent('keydown', { key: 'Escape' }))
544
+ await nextTick()
545
+
546
+ expect(vm.focusedItemIndex).toBe(-1)
547
+ })
548
+
549
+ it('retire l\'écouteur keydown au démontage', () => {
550
+ const removeSpy = vi.spyOn(window, 'removeEventListener')
551
+ const wrapper = createWrapper()
552
+ wrapper.unmount()
553
+
554
+ expect(removeSpy).toHaveBeenCalledWith('keydown', expect.any(Function))
555
+ })
556
+ })
557
+
558
+ // Tests lazy prop
559
+ describe('Lazy loading', () => {
560
+ it('ne rend le panneau que quand il devient actif avec lazy=true', async () => {
561
+ const wrapper = createWrapper({
562
+ props: {
563
+ ...defaultMountOptions.props,
564
+ lazy: true,
565
+ },
566
+ })
567
+
568
+ const secondTab = wrapper.findAll('.sy-tabs__button')[1]!
569
+ await secondTab.trigger('click')
570
+ await nextTick()
571
+
572
+ expect(wrapper.find('#panel-1').exists()).toBe(true)
573
+ })
574
+ })
575
+
576
+ // Tests onMounted branches
577
+ describe('onMounted — branches', () => {
578
+ it('ne plante pas avec items vides', () => {
579
+ expect(() => createWrapper({
580
+ props: { items: [] },
581
+ })).not.toThrow()
582
+ })
583
+
584
+ it('utilise pathname pour trouver l\'index actif si modelValue est un nombre', async () => {
585
+ Object.defineProperty(window, 'location', {
586
+ value: { ...window.location, pathname: '/tab2' },
587
+ writable: true,
588
+ })
589
+
590
+ const items = [
591
+ { label: 'Tab 1', value: 'tab1', content: 'C1', to: '/tab1' },
592
+ { label: 'Tab 2', value: 'tab2', content: 'C2', to: '/tab2' },
593
+ ]
594
+ const wrapper = createWrapper({
595
+ props: { items, modelValue: 0 },
596
+ })
597
+ await nextTick()
598
+
599
+ const vm = wrapper.vm as unknown as { activeItemIndex: number }
600
+ expect(vm.activeItemIndex).toBe(1)
601
+
602
+ Object.defineProperty(window, 'location', {
603
+ value: { ...window.location, pathname: '/' },
604
+ writable: true,
605
+ })
606
+ })
607
+ })
608
+
609
+ // Tests find*EnabledTab avec tous désactivés
610
+ describe('Navigation avec tous les onglets désactivés', () => {
611
+ it('findNextEnabledTab retourne -1 si tous désactivés', async () => {
612
+ const allDisabled = [
613
+ { label: 'A', value: 'a', content: '', disabled: true },
614
+ { label: 'B', value: 'b', content: '', disabled: true },
615
+ ]
616
+ const wrapper = createWrapper({ props: { items: allDisabled } })
617
+ const vm = wrapper.vm as unknown as {
618
+ findNextEnabledTab: (i: number) => number
619
+ }
620
+ expect(vm.findNextEnabledTab(0)).toBe(-1)
621
+ })
622
+
623
+ it('findPreviousEnabledTab retourne -1 si tous désactivés', () => {
624
+ const allDisabled = [
625
+ { label: 'A', value: 'a', content: '', disabled: true },
626
+ { label: 'B', value: 'b', content: '', disabled: true },
627
+ ]
628
+ const wrapper = createWrapper({ props: { items: allDisabled } })
629
+ const vm = wrapper.vm as unknown as {
630
+ findPreviousEnabledTab: (i: number) => number
631
+ }
632
+ expect(vm.findPreviousEnabledTab(0)).toBe(-1)
633
+ })
634
+
635
+ it('findFirstEnabledTab retourne -1 si tous désactivés', () => {
636
+ const allDisabled = [
637
+ { label: 'A', value: 'a', content: '', disabled: true },
638
+ ]
639
+ const wrapper = createWrapper({ props: { items: allDisabled } })
640
+ const vm = wrapper.vm as unknown as {
641
+ findFirstEnabledTab: () => number
642
+ }
643
+ expect(vm.findFirstEnabledTab()).toBe(-1)
644
+ })
645
+
646
+ it('findLastEnabledTab retourne -1 si tous désactivés', () => {
647
+ const allDisabled = [
648
+ { label: 'A', value: 'a', content: '', disabled: true },
649
+ ]
650
+ const wrapper = createWrapper({ props: { items: allDisabled } })
651
+ const vm = wrapper.vm as unknown as {
652
+ findLastEnabledTab: () => number
653
+ }
654
+ expect(vm.findLastEnabledTab()).toBe(-1)
655
+ })
656
+
657
+ it('handleArrowNavigation ne fait rien si items est vide', () => {
658
+ const wrapper = createWrapper({ props: { items: [] } })
659
+ const vm = wrapper.vm as unknown as {
660
+ handleArrowNavigation: (event: KeyboardEvent, index: number) => void
661
+ }
662
+ const event = new KeyboardEvent('keydown', { key: 'ArrowRight' })
663
+ event.preventDefault = vi.fn()
664
+ expect(() => vm.handleArrowNavigation(event, 0)).not.toThrow()
665
+ })
666
+
667
+ it('handleArrowNavigation ne fait rien pour une touche non gérée', () => {
668
+ const wrapper = createWrapper()
669
+ const vm = wrapper.vm as unknown as {
670
+ handleArrowNavigation: (event: KeyboardEvent, index: number) => void
671
+ }
672
+ const event = new KeyboardEvent('keydown', { key: 'Tab' })
673
+ expect(() => vm.handleArrowNavigation(event, 0)).not.toThrow()
674
+ expect(wrapper.emitted('update:modelValue')).toBeFalsy()
675
+ })
676
+ })
677
+
678
+ // Tests watcher modelValue
679
+ describe('Watcher modelValue', () => {
680
+ it('ne fait rien si newValue est undefined', async () => {
681
+ const wrapper = createWrapper({
682
+ props: { ...defaultMountOptions.props, modelValue: 1 },
683
+ })
684
+ const vm = wrapper.vm as unknown as { activeItemIndex: number }
685
+
686
+ await wrapper.setProps({ modelValue: undefined })
687
+ await nextTick()
688
+
689
+ expect(vm.activeItemIndex).toBe(1)
690
+ })
691
+
692
+ it('met à jour activeItemIndex via watcher modelValue string', async () => {
693
+ const wrapper = createWrapper({
694
+ props: { ...defaultMountOptions.props, modelValue: 'tab1' },
695
+ })
696
+ const vm = wrapper.vm as unknown as { activeItemIndex: number }
697
+
698
+ await wrapper.setProps({ modelValue: 'tab3' })
699
+ await nextTick()
700
+
701
+ expect(vm.activeItemIndex).toBe(2)
702
+ })
703
+
704
+ it('ne change pas activeItemIndex si modelValue string inconnu', async () => {
705
+ const wrapper = createWrapper({
706
+ props: { ...defaultMountOptions.props, modelValue: 'tab1' },
707
+ })
708
+ const vm = wrapper.vm as unknown as { activeItemIndex: number }
709
+ const before = vm.activeItemIndex
710
+
711
+ await wrapper.setProps({ modelValue: 'unknown-value' })
712
+ await nextTick()
713
+
714
+ expect(vm.activeItemIndex).toBe(before)
715
+ })
716
+ })
717
+
453
718
  // Tests avec différentes configurations
454
719
  describe('Configurations personnalisées', () => {
455
720
  it('doit permettre de personnaliser les options', () => {
@@ -0,0 +1,188 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'
2
+ import { ref, nextTick, defineComponent } from 'vue'
3
+ import { mount } from '@vue/test-utils'
4
+ import { useTabTransition } from '../useTabTransition'
5
+
6
+ function makeTablistEl(activeLeft = 50, activeWidth = 120, containerLeft = 10): HTMLElement {
7
+ const container = document.createElement('div')
8
+ const activeBtn = document.createElement('button')
9
+ activeBtn.classList.add('sy-tabs__button--active')
10
+
11
+ vi.spyOn(activeBtn, 'getBoundingClientRect').mockReturnValue({
12
+ left: activeLeft,
13
+ width: activeWidth,
14
+ top: 0,
15
+ right: activeLeft + activeWidth,
16
+ bottom: 0,
17
+ height: 0,
18
+ x: activeLeft,
19
+ y: 0,
20
+ toJSON: () => ({}),
21
+ } as DOMRect)
22
+
23
+ vi.spyOn(container, 'getBoundingClientRect').mockReturnValue({
24
+ left: containerLeft,
25
+ width: 500,
26
+ top: 0,
27
+ right: containerLeft + 500,
28
+ bottom: 0,
29
+ height: 0,
30
+ x: containerLeft,
31
+ y: 0,
32
+ toJSON: () => ({}),
33
+ } as DOMRect)
34
+
35
+ container.appendChild(activeBtn)
36
+ return container
37
+ }
38
+
39
+ function makeComponent(tablistEl: HTMLElement | null, initialIndex = 0) {
40
+ return defineComponent({
41
+ setup() {
42
+ const tablist = ref<HTMLElement | null>(tablistEl)
43
+ const activeItemIndex = ref(initialIndex)
44
+ const result = useTabTransition(tablist, activeItemIndex)
45
+ return { ...result, activeItemIndex, tablist }
46
+ },
47
+ template: '<div />',
48
+ })
49
+ }
50
+
51
+ describe('useTabTransition', () => {
52
+ beforeEach(() => {
53
+ vi.useFakeTimers()
54
+ })
55
+
56
+ afterEach(() => {
57
+ vi.restoreAllMocks()
58
+ vi.useRealTimers()
59
+ })
60
+
61
+ describe('positionIndicator — sans activeTab', () => {
62
+ it('remet xPosition et width à 0 si tablist est null', async () => {
63
+ const wrapper = mount(makeComponent(null))
64
+ await nextTick()
65
+ await nextTick()
66
+
67
+ expect(wrapper.vm.xPosition).toBe(0)
68
+ expect(wrapper.vm.width).toBe(0)
69
+ })
70
+
71
+ it('remet xPosition et width à 0 si aucun bouton actif n\'existe', async () => {
72
+ const container = document.createElement('div')
73
+ vi.spyOn(container, 'getBoundingClientRect').mockReturnValue({
74
+ left: 0, width: 500, top: 0, right: 500, bottom: 0, height: 0, x: 0, y: 0, toJSON: () => ({}),
75
+ } as DOMRect)
76
+
77
+ const wrapper = mount(makeComponent(container))
78
+ await nextTick()
79
+ await nextTick()
80
+
81
+ expect(wrapper.vm.xPosition).toBe(0)
82
+ expect(wrapper.vm.width).toBe(0)
83
+ })
84
+ })
85
+
86
+ describe('positionIndicator — avec activeTab', () => {
87
+ it('calcule xPosition = activeLeft - containerLeft', async () => {
88
+ const el = makeTablistEl(50, 120, 10)
89
+ const wrapper = mount(makeComponent(el))
90
+ await nextTick()
91
+ await nextTick()
92
+
93
+ expect(wrapper.vm.xPosition).toBe(40) // 50 - 10
94
+ })
95
+
96
+ it('calcule width = activeTab.width', async () => {
97
+ const el = makeTablistEl(50, 120, 10)
98
+ const wrapper = mount(makeComponent(el))
99
+ await nextTick()
100
+ await nextTick()
101
+
102
+ expect(wrapper.vm.width).toBe(120)
103
+ })
104
+
105
+ it('met à jour la position quand activeItemIndex change', async () => {
106
+ const container = document.createElement('div')
107
+ const btn1 = document.createElement('button')
108
+ const btn2 = document.createElement('button')
109
+ btn1.classList.add('sy-tabs__button--active')
110
+
111
+ vi.spyOn(btn1, 'getBoundingClientRect').mockReturnValue({
112
+ left: 50, width: 100, top: 0, right: 150, bottom: 0, height: 0, x: 50, y: 0, toJSON: () => ({}),
113
+ } as DOMRect)
114
+ vi.spyOn(btn2, 'getBoundingClientRect').mockReturnValue({
115
+ left: 200, width: 150, top: 0, right: 350, bottom: 0, height: 0, x: 200, y: 0, toJSON: () => ({}),
116
+ } as DOMRect)
117
+ vi.spyOn(container, 'getBoundingClientRect').mockReturnValue({
118
+ left: 0, width: 500, top: 0, right: 500, bottom: 0, height: 0, x: 0, y: 0, toJSON: () => ({}),
119
+ } as DOMRect)
120
+
121
+ container.appendChild(btn1)
122
+ container.appendChild(btn2)
123
+
124
+ const wrapper = mount(makeComponent(container, 0))
125
+ await nextTick()
126
+ await nextTick()
127
+
128
+ expect(wrapper.vm.xPosition).toBe(50)
129
+
130
+ btn1.classList.remove('sy-tabs__button--active')
131
+ btn2.classList.add('sy-tabs__button--active')
132
+ wrapper.vm.activeItemIndex = 1
133
+ await nextTick()
134
+ await nextTick()
135
+
136
+ expect(wrapper.vm.xPosition).toBe(200)
137
+ expect(wrapper.vm.width).toBe(150)
138
+ })
139
+ })
140
+
141
+ describe('resize listener', () => {
142
+ it('ajoute un écouteur resize au montage', () => {
143
+ const addSpy = vi.spyOn(window, 'addEventListener')
144
+ const el = makeTablistEl()
145
+ mount(makeComponent(el))
146
+
147
+ expect(addSpy).toHaveBeenCalledWith('resize', expect.any(Function))
148
+ })
149
+
150
+ it('retire l\'écouteur resize au démontage', () => {
151
+ const removeSpy = vi.spyOn(window, 'removeEventListener')
152
+ const el = makeTablistEl()
153
+ const wrapper = mount(makeComponent(el))
154
+
155
+ wrapper.unmount()
156
+
157
+ expect(removeSpy).toHaveBeenCalledWith('resize', expect.any(Function))
158
+ })
159
+
160
+ it('recalcule la position lors d\'un événement resize', async () => {
161
+ const el = makeTablistEl(50, 120, 10)
162
+ const wrapper = mount(makeComponent(el))
163
+ await nextTick()
164
+ await nextTick()
165
+
166
+ const btn = el.querySelector('.sy-tabs__button--active') as HTMLButtonElement
167
+ vi.spyOn(btn, 'getBoundingClientRect').mockReturnValue({
168
+ left: 100, width: 200, top: 0, right: 300, bottom: 0, height: 0, x: 100, y: 0, toJSON: () => ({}),
169
+ } as DOMRect)
170
+
171
+ window.dispatchEvent(new Event('resize'))
172
+ await nextTick()
173
+ await nextTick()
174
+
175
+ expect(wrapper.vm.width).toBe(200)
176
+ })
177
+ })
178
+
179
+ describe('valeurs retournées', () => {
180
+ it('expose xPosition et width comme refs réactives', () => {
181
+ const el = makeTablistEl()
182
+ const wrapper = mount(makeComponent(el))
183
+
184
+ expect(wrapper.vm.xPosition).toBeDefined()
185
+ expect(wrapper.vm.width).toBeDefined()
186
+ })
187
+ })
188
+ })
@@ -1109,19 +1109,22 @@ Cette story montre l'utilisation de la règle \`matchPattern\` pour valider un f
1109
1109
  }),
1110
1110
  }
1111
1111
 
1112
+ // Persistent value for WithTooltips
1113
+ const withTooltipsValueMain = ref('')
1114
+
1112
1115
  export const WithTooltips: Story = {
1113
1116
  args: {
1114
- modelValue: '',
1115
1117
  label: 'Champ avec tooltips',
1116
1118
  prependTooltip: 'Information à gauche du champ',
1117
1119
  appendTooltip: 'Information à droite du champ',
1118
1120
  tooltipLocation: 'top',
1121
+ isClearable: true,
1122
+ disableClickButton: true,
1119
1123
  },
1120
1124
  render: args => ({
1121
1125
  components: { SyTextField },
1122
1126
  setup() {
1123
- const value = ref(args.modelValue)
1124
- return { args, value }
1127
+ return { args, value: withTooltipsValueMain }
1125
1128
  },
1126
1129
  template: `
1127
1130
  <div>
@@ -1398,20 +1401,9 @@ export const FormValidation: Story = {
1398
1401
  </ul>
1399
1402
  </div>
1400
1403
 
1401
- <button
1402
- type="submit"
1403
- style="
1404
- background-color: #1976d2;
1405
- color: white;
1406
- padding: 8px 16px;
1407
- border: none;
1408
- border-radius: 4px;
1409
- cursor: pointer;
1410
- font-size: 1rem;
1411
- "
1412
- >
1404
+ <VBtn type="submit" color="primary">
1413
1405
  Soumettre
1414
- </button>
1406
+ </VBtn>
1415
1407
  </form>
1416
1408
  </div>
1417
1409
  `,
@@ -1479,20 +1471,9 @@ export const FormValidation: Story = {
1479
1471
  </ul>
1480
1472
  </div>
1481
1473
 
1482
- <button
1483
- type="submit"
1484
- style="
1485
- background-color: #1976d2;
1486
- color: white;
1487
- padding: 8px 16px;
1488
- border: none;
1489
- border-radius: 4px;
1490
- cursor: pointer;
1491
- font-size: 1rem;
1492
- "
1493
- >
1474
+ <VBtn type="submit" color="primary">
1494
1475
  Soumettre
1495
- </button>
1476
+ </VBtn>
1496
1477
  </form>
1497
1478
  </div>
1498
1479
  </div>