@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
@@ -12,6 +12,7 @@ export interface UseSySelectKeyboardOptions {
12
12
  getItemText: (item: unknown) => unknown
13
13
  optionIdPrefix?: string
14
14
  focusListItem?: boolean
15
+ skipInitialFocus?: Ref<boolean>
15
16
  }
16
17
 
17
18
  export function useSySelectKeyboard(options: UseSySelectKeyboardOptions) {
@@ -23,6 +24,7 @@ export function useSySelectKeyboard(options: UseSySelectKeyboardOptions) {
23
24
  getItemText,
24
25
  optionIdPrefix = 'option',
25
26
  focusListItem = true,
27
+ skipInitialFocus,
26
28
  } = options
27
29
 
28
30
  const getOptionId = (index: number) => `${optionIdPrefix}-${index}`
@@ -339,6 +341,7 @@ export function useSySelectKeyboard(options: UseSySelectKeyboardOptions) {
339
341
  // Gérer l'ouverture et la fermeture de la liste
340
342
  watch(isOpen, (open) => {
341
343
  if (open) {
344
+ if (skipInitialFocus?.value) return
342
345
  // À l'ouverture, restaurer le dernier focus ou initialiser au premier élément
343
346
  nextTick(() => {
344
347
  if (lastFocusedIndex.value >= 0 && lastFocusedIndex.value < formattedItems.value.length) {
@@ -0,0 +1,64 @@
1
+ import { computed, ref } from 'vue'
2
+ import { mdiAlertCircle, mdiAlertOutline, mdiCheck } from '@mdi/js'
3
+ import { useValidation, type FieldValidationProps } from '@/composables/unifyValidation/useValidation'
4
+ import type { ValidationRule } from '@/composables/validation/useValidation'
5
+
6
+ export function useSySelectValidation(props: FieldValidationProps & { modelValue?: unknown }) {
7
+ const focused = ref(false)
8
+
9
+ const defaultRules = computed<ValidationRule[]>(() => props.required
10
+ ? [{
11
+ type: 'required',
12
+ options: {
13
+ message: `Le champ ${props.label || 'ce champ'} est requis.`,
14
+ fieldIdentifier: props.label,
15
+ },
16
+ }]
17
+ : [],
18
+ )
19
+
20
+ const { validate, clearValidation, errors, warnings, successes, hasError, hasWarning, hasSuccess } = useValidation({
21
+ modelValue: computed(() => props.modelValue),
22
+ readonly: computed(() => props.readonly ?? false),
23
+ disabled: computed(() => props.disabled ?? false),
24
+ required: computed(() => props.required ?? false),
25
+ isValidateOnBlur: computed(() => props.isValidateOnBlur ?? false),
26
+ showSuccessMessages: computed(() => props.showSuccessMessages ?? false),
27
+ disableErrorHandling: computed(() => props.disableErrorHandling ?? false),
28
+ useVuetifyValidation: computed(() => props.useVuetifyValidation ?? false),
29
+ label: computed(() => props.label ?? ''),
30
+ rules: computed(() => props.rules ?? []),
31
+ customRules: computed(() => [...defaultRules.value, ...(props.customRules ?? [])]),
32
+ customWarningRules: computed(() => props.customWarningRules ?? []),
33
+ customSuccessRules: computed(() => props.customSuccessRules ?? []),
34
+ errorMessages: computed(() => props.errorMessages ?? []),
35
+ warningMessages: computed(() => props.warningMessages ?? []),
36
+ successMessages: computed(() => props.successMessages ?? []),
37
+ hasErrorProp: computed(() => props.hasError ?? false),
38
+ hasWarningProp: computed(() => props.hasWarning ?? false),
39
+ hasSuccessProp: computed(() => props.hasSuccess ?? false),
40
+ maxErrors: computed(() => props.maxErrors ?? 1),
41
+ focused,
42
+ })
43
+
44
+ const validationIcon = computed(() => {
45
+ if (props.useVuetifyValidation) return null
46
+ if (hasError.value) return mdiAlertCircle
47
+ if (hasWarning.value) return mdiAlertOutline
48
+ if (hasSuccess.value) return mdiCheck
49
+ return null
50
+ })
51
+
52
+ return {
53
+ focused,
54
+ validate,
55
+ clearValidation,
56
+ errors,
57
+ warnings,
58
+ successes,
59
+ hasError,
60
+ hasWarning,
61
+ hasSuccess,
62
+ validationIcon,
63
+ }
64
+ }
@@ -1,6 +1,7 @@
1
1
  import { mount } from '@vue/test-utils'
2
- import { describe, expect, it } from 'vitest'
2
+ import { describe, expect, it, vi } from 'vitest'
3
3
  import { VList } from 'vuetify/components'
4
+ import { nextTick } from 'vue'
4
5
  import SySelect from '../SySelect.vue'
5
6
 
6
7
  type ItemType = {
@@ -129,7 +130,7 @@ describe('SySelect.vue', () => {
129
130
  it('renders error messages when provided', () => {
130
131
  const errorMessages = ['Error 1']
131
132
  const wrapper = mount(SySelect, {
132
- props: { errorMessages, hideMessages: false },
133
+ props: { errorMessages, hideDetails: false },
133
134
  attachTo: document.body,
134
135
  })
135
136
  const message = wrapper.find('.v-messages__message')
@@ -139,6 +140,99 @@ describe('SySelect.vue', () => {
139
140
  wrapper.unmount()
140
141
  })
141
142
 
143
+ describe('hideDetails', () => {
144
+ it('masque les messages de validation quand hideDetails est true', async () => {
145
+ const wrapper = mount(SySelect, {
146
+ props: {
147
+ errorMessages: ['Erreur de test'],
148
+ hideDetails: true,
149
+ },
150
+ attachTo: document.body,
151
+ })
152
+
153
+ expect(wrapper.find('.v-messages__message').exists()).toBe(false)
154
+
155
+ wrapper.unmount()
156
+ })
157
+
158
+ it('affiche les messages de validation quand hideDetails est false', async () => {
159
+ const wrapper = mount(SySelect, {
160
+ props: {
161
+ errorMessages: ['Erreur de test'],
162
+ hideDetails: false,
163
+ },
164
+ attachTo: document.body,
165
+ })
166
+
167
+ const message = wrapper.find('.v-messages__message')
168
+ expect(message.exists()).toBe(true)
169
+ expect(message.text()).toContain('Erreur de test')
170
+
171
+ wrapper.unmount()
172
+ })
173
+
174
+ it('affiche la zone de messages par défaut (hideDetails vaut false par défaut)', () => {
175
+ const wrapper = mount(SySelect, {
176
+ attachTo: document.body,
177
+ })
178
+
179
+ expect(wrapper.find('.v-messages').exists()).toBe(true)
180
+
181
+ wrapper.unmount()
182
+ })
183
+
184
+ it('n\'affiche pas le helpText en dessous du champ quand hideDetails est true et qu\'il y a des erreurs', () => {
185
+ const wrapper = mount(SySelect, {
186
+ props: {
187
+ helpText: 'Texte d\'aide',
188
+ errorMessages: ['Erreur de test'],
189
+ hideDetails: true,
190
+ },
191
+ attachTo: document.body,
192
+ })
193
+
194
+ expect(wrapper.find('.help-text-below').exists()).toBe(false)
195
+
196
+ wrapper.unmount()
197
+ })
198
+
199
+ it('affiche le helpText en dessous du champ quand hideDetails est false et qu\'il y a des erreurs', () => {
200
+ const wrapper = mount(SySelect, {
201
+ props: {
202
+ helpText: 'Texte d\'aide',
203
+ errorMessages: ['Erreur de test'],
204
+ hideDetails: false,
205
+ },
206
+ attachTo: document.body,
207
+ })
208
+
209
+ expect(wrapper.find('.help-text-below').exists()).toBe(true)
210
+ expect(wrapper.find('.help-text-below').text()).toContain('Texte d\'aide')
211
+
212
+ wrapper.unmount()
213
+ })
214
+ })
215
+
216
+ it('keeps the label active when a validation error is displayed', async () => {
217
+ const wrapper = mount(SySelect, {
218
+ props: {
219
+ items: [{ text: 'Option 1', value: '1' }],
220
+ label: 'Option',
221
+ required: true,
222
+ },
223
+ attachTo: document.body,
224
+ })
225
+
226
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- exposed method is not part of the inferred public instance type
227
+ const isValid = await (wrapper.vm as any).validateOnSubmit()
228
+ await nextTick()
229
+
230
+ expect(isValid).toBe(false)
231
+ expect(wrapper.find('.v-field').classes()).toContain('v-field--active')
232
+
233
+ wrapper.unmount()
234
+ })
235
+
142
236
  it('does not render error messages when not provided', () => {
143
237
  const wrapper = mount(SySelect, {
144
238
  attachTo: document.body,
@@ -522,26 +616,367 @@ describe('SySelect.vue', () => {
522
616
  wrapper.unmount()
523
617
  })
524
618
 
525
- it('n\'affiche pas d\'erreur quand disableErrorHandling est true', async () => {
619
+ describe('disableErrorHandling', () => {
620
+ it('n\'affiche pas d\'erreur pour un champ requis sans valeur quand disableErrorHandling est true', async () => {
621
+ const wrapper = mount(SySelect, {
622
+ props: {
623
+ required: true,
624
+ label: 'Test Label',
625
+ modelValue: undefined,
626
+ disableErrorHandling: true,
627
+ },
628
+ attachTo: document.body,
629
+ })
630
+
631
+ await wrapper.find('.v-field').trigger('click')
632
+ await wrapper.vm.$nextTick()
633
+ await wrapper.find('.v-field').trigger('click')
634
+ await wrapper.vm.$nextTick()
635
+
636
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- This is a generic type
637
+ const instance = wrapper.vm as any
638
+ expect(instance.hasError).toBe(false)
639
+
640
+ wrapper.unmount()
641
+ })
642
+
643
+ it('ignore les errorMessages quand disableErrorHandling est true', () => {
644
+ const wrapper = mount(SySelect, {
645
+ props: {
646
+ errorMessages: ['Erreur forcée'],
647
+ disableErrorHandling: true,
648
+ },
649
+ attachTo: document.body,
650
+ })
651
+
652
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- This is a generic type
653
+ const instance = wrapper.vm as any
654
+ expect(instance.hasError).toBe(false)
655
+ expect(wrapper.find('.v-messages__message').exists()).toBe(false)
656
+
657
+ wrapper.unmount()
658
+ })
659
+
660
+ it('n\'évalue pas les customRules quand disableErrorHandling est true', async () => {
661
+ const wrapper = mount(SySelect, {
662
+ props: {
663
+ modelValue: '1',
664
+ disableErrorHandling: true,
665
+ isValidateOnBlur: false,
666
+ customRules: [{
667
+ type: 'custom',
668
+ options: {
669
+ validate: () => false,
670
+ message: 'Toujours invalide',
671
+ },
672
+ }],
673
+ },
674
+ attachTo: document.body,
675
+ })
676
+
677
+ await wrapper.vm.$nextTick()
678
+
679
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- This is a generic type
680
+ const instance = wrapper.vm as any
681
+ expect(instance.hasError).toBe(false)
682
+ expect(wrapper.find('.v-messages__message').exists()).toBe(false)
683
+
684
+ wrapper.unmount()
685
+ })
686
+
687
+ it('affiche les erreurs normalement quand disableErrorHandling est false', async () => {
688
+ const wrapper = mount(SySelect, {
689
+ props: {
690
+ errorMessages: ['Erreur visible'],
691
+ disableErrorHandling: false,
692
+ },
693
+ attachTo: document.body,
694
+ })
695
+
696
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- This is a generic type
697
+ const instance = wrapper.vm as any
698
+ expect(instance.hasError).toBe(true)
699
+ expect(wrapper.find('.v-messages__message').text()).toContain('Erreur visible')
700
+
701
+ wrapper.unmount()
702
+ })
703
+ })
704
+
705
+ it('valide immédiatement quand isValidateOnBlur est false', async () => {
526
706
  const wrapper = mount(SySelect, {
527
707
  props: {
528
- required: true,
708
+ items: [
709
+ { text: 'Option 1', value: '1' },
710
+ { text: 'Option 2', value: '2' },
711
+ ],
529
712
  label: 'Test Label',
530
713
  modelValue: undefined,
531
- disableErrorHandling: true,
714
+ isValidateOnBlur: false,
715
+ customRules: [{
716
+ type: 'custom',
717
+ options: {
718
+ validate: (value: unknown) => value === '2',
719
+ message: 'Test error message',
720
+ },
721
+ }],
532
722
  },
533
723
  attachTo: document.body,
534
724
  })
535
725
 
726
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- This is a generic type
727
+ const instance = wrapper.vm as any
728
+ expect(instance.hasError).toBe(false)
729
+
730
+ // Sélection de Option 1 via interaction utilisateur
536
731
  await wrapper.find('.v-field').trigger('click')
537
732
  await wrapper.vm.$nextTick()
733
+ await wrapper.findComponent(VList).findAll('.v-list-item').at(0)!.trigger('click')
734
+ await wrapper.setProps({ modelValue: '1' })
735
+
736
+ await vi.waitUntil(() => instance.hasError === true)
737
+ expect(wrapper.find('.v-messages').text()).toContain('Test error message')
738
+
739
+ // Sélection de Option 2 via interaction utilisateur
538
740
  await wrapper.find('.v-field').trigger('click')
539
741
  await wrapper.vm.$nextTick()
742
+ await wrapper.findComponent(VList).findAll('.v-list-item').at(1)!.trigger('click')
743
+ await wrapper.setProps({ modelValue: '2' })
744
+
745
+ await vi.waitUntil(() => instance.hasError === false)
746
+ expect(wrapper.find('.v-messages').text()).not.toContain('Test error message')
747
+
748
+ wrapper.unmount()
749
+ })
750
+
751
+ it('masque le message de succes mais conserve l\'etat de succes quand showSuccessMessages est false', async () => {
752
+ const wrapper = mount(SySelect, {
753
+ props: {
754
+ items: [
755
+ { text: 'Option 1', value: '1' },
756
+ { text: 'Option 2', value: '2' },
757
+ ],
758
+ label: 'Test Label',
759
+ modelValue: undefined,
760
+ isValidateOnBlur: false,
761
+ showSuccessMessages: false,
762
+ customSuccessRules: [{
763
+ type: 'custom',
764
+ options: {
765
+ validate: (value: unknown) => value === '2',
766
+ successMessage: 'Test success message',
767
+ },
768
+ }],
769
+ },
770
+ attachTo: document.body,
771
+ })
772
+
773
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- This is a generic type
774
+ const instance = wrapper.vm as any
775
+ expect(instance.hasSuccess).toBe(false)
776
+
777
+ await wrapper.setProps({ modelValue: '2' })
778
+
779
+ await vi.waitUntil(() => instance.hasSuccess === true)
780
+ expect(wrapper.find('.success-field').exists()).toBe(true)
781
+ expect(wrapper.findAll('.v-messages__message')).toHaveLength(0)
782
+ expect(wrapper.text()).not.toContain('Test success message')
783
+
784
+ wrapper.unmount()
785
+ })
786
+
787
+ it('ne valide pas lors d\'un changement de valeur mais seulement à la fermeture du menu quand isValidateOnBlur est true', async () => {
788
+ const wrapper = mount(SySelect, {
789
+ props: {
790
+ items: [
791
+ { text: 'Option 1', value: '1' },
792
+ { text: 'Option 2', value: '2' },
793
+ ],
794
+ label: 'Test Label',
795
+ modelValue: undefined,
796
+ isValidateOnBlur: true,
797
+ customRules: [{
798
+ type: 'custom',
799
+ options: {
800
+ validate: (value: unknown) => value === '2',
801
+ message: 'Test error message',
802
+ },
803
+ }],
804
+ },
805
+ attachTo: document.body,
806
+ })
540
807
 
541
808
  // eslint-disable-next-line @typescript-eslint/no-explicit-any -- This is a generic type
542
809
  const instance = wrapper.vm as any
543
810
  expect(instance.hasError).toBe(false)
544
811
 
812
+ // Changement de valeur programmatique — l'erreur ne doit PAS apparaître
813
+ await wrapper.setProps({ modelValue: '1' })
814
+ await wrapper.vm.$nextTick()
815
+ expect(instance.hasError).toBe(false)
816
+
817
+ // Ouverture puis fermeture du menu (= blur) — l'erreur doit apparaître
818
+ await wrapper.find('.v-field').trigger('click')
819
+ await wrapper.vm.$nextTick()
820
+ await wrapper.find('.v-field').trigger('click')
821
+ await wrapper.vm.$nextTick()
822
+
823
+ await vi.waitUntil(() => instance.hasError === true)
824
+ expect(wrapper.find('.v-messages').text()).toContain('Test error message')
825
+
826
+ wrapper.unmount()
827
+ })
828
+
829
+ it('déclenche la validation au blur natif sans ouvrir le menu', async () => {
830
+ const wrapper = mount(SySelect, {
831
+ props: {
832
+ required: true,
833
+ label: 'Test Label',
834
+ modelValue: undefined,
835
+ items: [
836
+ { text: 'Option 1', value: '1' },
837
+ { text: 'Option 2', value: '2' },
838
+ ],
839
+ },
840
+ attachTo: document.body,
841
+ })
842
+
843
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- This is a generic type
844
+ const instance = wrapper.vm as any
845
+ expect(instance.hasError).toBe(false)
846
+
847
+ // Simuler un blur natif sur l'input sans jamais ouvrir le menu
848
+ const input = wrapper.find('input')
849
+ await input.trigger('blur')
850
+ await wrapper.vm.$nextTick()
851
+
852
+ await vi.waitUntil(() => instance.hasError === true)
853
+ expect(wrapper.find('.v-messages').text()).toContain('requis')
854
+
855
+ wrapper.unmount()
856
+ })
857
+
858
+ it('affiche un avertissement avec customWarningRules', async () => {
859
+ const wrapper = mount(SySelect, {
860
+ props: {
861
+ items: [
862
+ { text: 'Option 1', value: '1' },
863
+ { text: 'Option 2', value: '2' },
864
+ ],
865
+ label: 'Test Label',
866
+ modelValue: undefined,
867
+ isValidateOnBlur: false,
868
+ customWarningRules: [{
869
+ type: 'custom',
870
+ options: {
871
+ validate: (value: unknown) => value === '2',
872
+ warningMessage: 'Option 1 est dépréciée.',
873
+ },
874
+ }],
875
+ },
876
+ attachTo: document.body,
877
+ })
878
+
879
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- This is a generic type
880
+ const instance = wrapper.vm as any
881
+ expect(instance.hasWarning).toBe(false)
882
+
883
+ await wrapper.find('.v-field').trigger('click')
884
+ await wrapper.vm.$nextTick()
885
+ await wrapper.findComponent(VList).findAll('.v-list-item').at(0)!.trigger('click')
886
+ await wrapper.setProps({ modelValue: '1' })
887
+
888
+ await vi.waitUntil(() => instance.hasWarning === true)
889
+ expect(wrapper.find('.v-messages').text()).toContain('Option 1 est dépréciée.')
890
+
891
+ wrapper.unmount()
892
+ })
893
+
894
+ it('validateOnSubmit retourne true quand le champ est valide', async () => {
895
+ const wrapper = mount(SySelect, {
896
+ props: {
897
+ required: true,
898
+ label: 'Test Label',
899
+ modelValue: '1',
900
+ items: [
901
+ { text: 'Option 1', value: '1' },
902
+ { text: 'Option 2', value: '2' },
903
+ ],
904
+ },
905
+ attachTo: document.body,
906
+ })
907
+
908
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- This is a generic type
909
+ const isValid = await (wrapper.vm as any).validateOnSubmit()
910
+ await nextTick()
911
+
912
+ expect(isValid).toBe(true)
913
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- This is a generic type
914
+ expect((wrapper.vm as any).hasError).toBe(false)
915
+
916
+ wrapper.unmount()
917
+ })
918
+
919
+ it('affiche le message de succès avec customSuccessRules quand showSuccessMessages est true', async () => {
920
+ const wrapper = mount(SySelect, {
921
+ props: {
922
+ items: [
923
+ { text: 'Option 1', value: '1' },
924
+ { text: 'Option 2', value: '2' },
925
+ ],
926
+ label: 'Test Label',
927
+ modelValue: undefined,
928
+ isValidateOnBlur: false,
929
+ showSuccessMessages: true,
930
+ customSuccessRules: [{
931
+ type: 'custom',
932
+ options: {
933
+ validate: (value: unknown) => value === '2',
934
+ successMessage: 'Test success message',
935
+ },
936
+ }],
937
+ },
938
+ attachTo: document.body,
939
+ })
940
+
941
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- This is a generic type
942
+ const instance = wrapper.vm as any
943
+ expect(instance.hasSuccess).toBe(false)
944
+
945
+ await wrapper.setProps({ modelValue: '2' })
946
+
947
+ await vi.waitUntil(() => instance.hasSuccess === true)
948
+ expect(wrapper.find('.success-field').exists()).toBe(true)
949
+ expect(wrapper.find('.v-messages').text()).toContain('Test success message')
950
+
951
+ wrapper.unmount()
952
+ })
953
+
954
+ it('clearValidation remet l\'état d\'erreur à zéro', async () => {
955
+ const wrapper = mount(SySelect, {
956
+ props: {
957
+ required: true,
958
+ label: 'Test Label',
959
+ modelValue: undefined,
960
+ items: [
961
+ { text: 'Option 1', value: '1' },
962
+ { text: 'Option 2', value: '2' },
963
+ ],
964
+ },
965
+ attachTo: document.body,
966
+ })
967
+
968
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- This is a generic type
969
+ const instance = wrapper.vm as any
970
+
971
+ await instance.validateOnSubmit()
972
+ await nextTick()
973
+ expect(instance.hasError).toBe(true)
974
+
975
+ instance.clearValidation()
976
+ await nextTick()
977
+ expect(instance.hasError).toBe(false)
978
+ expect(wrapper.find('.v-messages__message').exists()).toBe(false)
979
+
545
980
  wrapper.unmount()
546
981
  })
547
982
  })