@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
@@ -4,9 +4,8 @@
4
4
  inheritAttrs: false,
5
5
  })
6
6
  import { mdiAlertCircle, mdiAlertOutline, mdiCheck, mdiChevronDown, mdiClose, mdiCloseCircle, mdiInformationOutline } from '@mdi/js'
7
- import { ref, watch, watchEffect, onMounted, onBeforeUnmount, computed, nextTick, useAttrs, type PropType } from 'vue'
7
+ import { ref, watch, watchEffect, onMounted, onBeforeUnmount, computed, nextTick, useAttrs } from 'vue'
8
8
  import { useSySelectKeyboard } from './composables/useSySelectKeyboard'
9
- import { useValidatable } from '@/composables/validation/useValidatable'
10
9
  import type { ColorType, IconType, VariantStyle } from '@/types/vuetifyTypes'
11
10
  import type { VList, VTextField } from 'vuetify/components'
12
11
  import { VChip } from 'vuetify/components'
@@ -14,6 +13,8 @@
14
13
  import IconSlot from '@/components/Common/IconSlot/IconSlot.vue'
15
14
  import SyIcon from '@/components/Customs/SyIcon/SyIcon.vue'
16
15
  import { locales } from './locales'
16
+ import { validationPropsDefaults, type FieldValidationProps } from '@/composables/unifyValidation/useValidation'
17
+ import { useSySelectValidation } from './composables/useSySelectValidation'
17
18
 
18
19
  export type ItemType = {
19
20
  [key: string]: unknown
@@ -22,147 +23,71 @@
22
23
  export type SelectItemValueType = Record<string, unknown> | string | number | null | undefined
23
24
  export type SelectItemArrayType = Array<Record<string, unknown> | string | number>
24
25
 
25
- // Définition des props avec typage correct pour modelValue
26
- const props = defineProps({
27
- modelValue: {
28
- // En Vue, on ne peut pas mettre null directement comme type
29
- // On utilise PropType pour définir le type complet incluant null
30
- type: [Object, String, Number, Array] as PropType<Record<string, unknown> | string | number | null | SelectItemArrayType>,
31
- default: null,
26
+ const props = withDefaults(
27
+ defineProps<{
28
+ modelValue?: Record<string, unknown> | string | number | null | SelectItemArrayType
29
+ items?: ItemType[]
30
+ label?: string
31
+ menuId?: string
32
+ outlined?: boolean
33
+ variantStyle?: VariantStyle
34
+ color?: ColorType
35
+ textKey?: string
36
+ plainTextKey?: string
37
+ valueKey?: string
38
+ displayAsterisk?: boolean
39
+ returnObject?: boolean
40
+ density?: 'default' | 'comfortable' | 'compact'
41
+ bgColor?: string
42
+ clearable?: boolean
43
+ hideDetails?: boolean
44
+ width?: string
45
+ multiple?: boolean
46
+ chips?: boolean
47
+ helpText?: string
48
+ allowHtml?: boolean
49
+ autocomplete?: 'on' | 'off' | string
50
+ prependIcon?: IconType
51
+ appendIcon?: IconType
52
+ prependTooltip?: string
53
+ appendTooltip?: string
54
+ tooltipLocation?: 'top' | 'bottom' | 'start' | 'end'
55
+ noIcon?: boolean
56
+ disableClickButton?: boolean
57
+ } & FieldValidationProps>(),
58
+ {
59
+ modelValue: null,
60
+ items: () => [],
61
+ label: 'Sélectionnez une option',
62
+ menuId: 'sy-select-menu',
63
+ outlined: true,
64
+ variantStyle: undefined,
65
+ color: 'primary',
66
+ textKey: 'text',
67
+ plainTextKey: '',
68
+ valueKey: 'value',
69
+ displayAsterisk: false,
70
+ returnObject: false,
71
+ density: 'default',
72
+ bgColor: 'white',
73
+ clearable: false,
74
+ hideDetails: false,
75
+ width: 'undefined',
76
+ multiple: false,
77
+ chips: false,
78
+ helpText: '',
79
+ allowHtml: false,
80
+ autocomplete: 'on',
81
+ prependIcon: undefined,
82
+ appendIcon: undefined,
83
+ prependTooltip: undefined,
84
+ appendTooltip: undefined,
85
+ tooltipLocation: 'top',
86
+ noIcon: false,
87
+ disableClickButton: true,
88
+ ...validationPropsDefaults,
32
89
  },
33
- items: {
34
- type: Array as PropType<ItemType[]>,
35
- default: () => [],
36
- },
37
- label: {
38
- type: String,
39
- default: 'Sélectionnez une option',
40
- },
41
- errorMessages: {
42
- type: [String, Array] as PropType<string | readonly string[]>,
43
- default: () => [],
44
- },
45
- required: {
46
- type: Boolean,
47
- default: false,
48
- },
49
- disabled: {
50
- type: Boolean,
51
- default: false,
52
- },
53
- menuId: {
54
- type: String,
55
- default: 'sy-select-menu',
56
- },
57
- outlined: {
58
- type: Boolean,
59
- default: true,
60
- },
61
- variantStyle: {
62
- type: String as PropType<VariantStyle | undefined>,
63
- default: undefined,
64
- },
65
- color: {
66
- type: String as PropType<ColorType>,
67
- default: 'primary',
68
- },
69
- textKey: {
70
- type: String,
71
- default: 'text',
72
- },
73
- plainTextKey: {
74
- type: String,
75
- default: '',
76
- },
77
- valueKey: {
78
- type: String,
79
- default: 'value',
80
- },
81
- displayAsterisk: {
82
- type: Boolean,
83
- default: false,
84
- },
85
- returnObject: {
86
- type: Boolean,
87
- default: false,
88
- },
89
- disableErrorHandling: {
90
- type: Boolean,
91
- default: false,
92
- },
93
- density: {
94
- type: String as PropType<'default' | 'comfortable' | 'compact' | undefined>,
95
- default: 'default',
96
- },
97
- bgColor: {
98
- type: String,
99
- default: 'white',
100
- },
101
- readonly: {
102
- type: Boolean,
103
- default: false,
104
- },
105
- clearable: {
106
- type: Boolean,
107
- default: false,
108
- },
109
- hideMessages: {
110
- type: Boolean,
111
- default: false,
112
- },
113
- width: {
114
- type: String,
115
- default: 'undefined',
116
- },
117
- multiple: {
118
- type: Boolean,
119
- default: false,
120
- },
121
- chips: {
122
- type: Boolean,
123
- default: false,
124
- },
125
- helpText: {
126
- type: String,
127
- default: '',
128
- },
129
- allowHtml: {
130
- type: Boolean,
131
- default: false,
132
- },
133
- autocomplete: {
134
- type: String as PropType<'on' | 'off' | undefined | string>,
135
- default: 'on',
136
- },
137
- prependIcon: {
138
- type: String as PropType<IconType>,
139
- default: undefined,
140
- },
141
- appendIcon: {
142
- type: String as PropType<IconType>,
143
- default: undefined,
144
- },
145
- prependTooltip: {
146
- type: String,
147
- default: undefined,
148
- },
149
- appendTooltip: {
150
- type: String,
151
- default: undefined,
152
- },
153
- tooltipLocation: {
154
- type: String as PropType<'top' | 'bottom' | 'start' | 'end'>,
155
- default: 'top',
156
- },
157
- noIcon: {
158
- type: Boolean,
159
- default: false,
160
- },
161
- disableClickButton: {
162
- type: Boolean,
163
- default: true,
164
- },
165
- })
90
+ )
166
91
 
167
92
  // pr récupérer proprement aria-label
168
93
  const attrs = useAttrs()
@@ -195,8 +120,10 @@
195
120
  const disableClickButton = computed(() => props.disableClickButton)
196
121
 
197
122
  const iconColor = computed(() => {
198
- if (hasError.value || props.errorMessages.length > 0) return 'error'
199
- return 'rgb(var(--v-theme-iconBase))'
123
+ if (hasError.value) return 'error'
124
+ if (hasWarning.value) return 'onWarningVariant'
125
+ if (hasSuccess.value) return 'onSuccessVariant'
126
+ return 'rgb(var(--v-theme-onSurface))'
200
127
  })
201
128
 
202
129
  const variant = computed(() => {
@@ -207,9 +134,10 @@
207
134
  const isOpen = ref(false)
208
135
  // Initialize selectedItem with props.modelValue or empty array for multiple mode
209
136
  const selectedItem = ref<SelectItemValueType | SelectItemArrayType>(props.modelValue)
210
- const hasError = ref(false)
211
137
  const menuMinWidth = ref<number | null>(null)
212
138
 
139
+ const { focused, validate, clearValidation, errors, warnings, successes, hasError, hasWarning, hasSuccess, validationIcon } = useSySelectValidation(props)
140
+
213
141
  const labelWidth = ref(0)
214
142
  const labelRef = ref<HTMLElement | null>(null)
215
143
  const list = ref<VList | null>(null)
@@ -262,7 +190,7 @@
262
190
  // text d'aide
263
191
  const helpTextId = computed(() => `${inputId.value}-help`)
264
192
  // messages d'erreur, success avertissement
265
- const messagesId = computed(() => `${inputId.value}-messages`)
193
+ const messagesId = computed(() => `${inputId.value}-sr-messages`)
266
194
  // live region pour le lecteur ecran
267
195
  const liveRegionId = computed(() => `${inputId.value}-live`)
268
196
  // un libellé caché pour la popup/grid
@@ -315,6 +243,7 @@
315
243
  if (item === null || item === undefined) {
316
244
  selectedItem.value = props.multiple ? [] : null
317
245
  emit('update:modelValue', props.multiple ? [] : null)
246
+ clearValidation()
318
247
 
319
248
  // Garder la liste ouverte après une suppression et réinitialiser la navigation au clavier
320
249
  const target = event?.target as HTMLElement | undefined
@@ -500,12 +429,25 @@
500
429
  return !props.chips && props.multiple && Array.isArray(selectedItem.value) && (selectedItem.value as unknown[]).length > 0
501
430
  })
502
431
 
432
+ const hasSingleSelection = computed(() => {
433
+ return !props.multiple && selectedItem.value !== null && selectedItem.value !== undefined && selectedItemText.value !== ''
434
+ })
435
+
503
436
  const hasSelectionToClear = computed(() => {
504
437
  return props.multiple
505
438
  ? (((selectedItem.value as unknown[] | null | undefined)?.length) ?? 0) > 0
506
439
  : selectedItem.value != null
507
440
  })
508
441
 
442
+ const isFieldActive = computed(() => {
443
+ return hasChips.value
444
+ || hasMultipleSelections.value
445
+ || hasSingleSelection.value
446
+ || isOpen.value
447
+ || focused.value
448
+ || hasMessages.value
449
+ })
450
+
509
451
  const labelWithAsterisk = computed(() => {
510
452
  return isShouldDisplayAsterisk.value ? `${props.label} *` : props.label
511
453
  })
@@ -520,15 +462,14 @@
520
462
  })
521
463
 
522
464
  const isRequired = computed(() => {
523
- if (props.disableErrorHandling) return false
524
- if (props.readonly) return
525
- return (props.required || props.errorMessages.length > 0) && !selectedItem.value
465
+ if (props.readonly) return false
466
+ return props.required === true
526
467
  })
527
468
 
528
469
  // Détecte s'il y a des messages d'erreur, de succès ou d'avertissement
529
470
  const hasMessages = computed(() => {
530
471
  if (props.disableErrorHandling) return false
531
- return props.errorMessages.length > 0 || hasError.value
472
+ return hasError.value || hasWarning.value || hasSuccess.value
532
473
  })
533
474
 
534
475
  // Détermine si le helpText doit être affiché à la position du message ou en dessous
@@ -538,8 +479,8 @@
538
479
  })
539
480
 
540
481
  const showHelpTextBelow = computed(() => {
541
- // Afficher en dessous si il y a des messages d'erreur ET hideMessages n'est pas activé
542
- return props.helpText && hasMessages.value && !props.hideMessages
482
+ // Afficher en dessous si il y a des messages d'erreur ET hideDetails n'est pas activé
483
+ return props.helpText && hasMessages.value && !props.hideDetails
543
484
  })
544
485
 
545
486
  // Ici on calcule dynamiquement la liste des ids à rattacher à l'input :
@@ -551,11 +492,11 @@
551
492
  ids.push(helpTextId.value)
552
493
  }
553
494
  // messages affichés
554
- if (!props.hideMessages && hasMessages.value) {
495
+ if (!props.hideDetails && hasMessages.value) {
555
496
  ids.push(messagesId.value)
556
497
  }
557
498
  // live region si erreur
558
- if (hasError.value || (Array.isArray(props.errorMessages) && props.errorMessages.length > 0)) {
499
+ if (hasError.value || errors.value.length > 0) {
559
500
  ids.push(liveRegionId.value)
560
501
  }
561
502
 
@@ -578,21 +519,13 @@
578
519
  return undefined
579
520
  })
580
521
 
581
- const validationRules = computed(() => {
582
- return hasError.value && !props.disableErrorHandling ? ['Le champ est requis.'] : []
583
- })
584
-
585
522
  const menuTarget = computed<HTMLElement | undefined>(() => {
586
523
  const rootEl = textInput.value?.$el as HTMLElement | undefined
587
524
  if (!rootEl) return undefined
588
525
  return (rootEl.querySelector('.v-field') as HTMLElement | null) ?? rootEl
589
526
  })
590
527
 
591
- const formattedErrorMessages = computed(() => {
592
- return Array.isArray(props.errorMessages)
593
- ? props.errorMessages.join(' ')
594
- : props.errorMessages
595
- })
528
+ const formattedErrorMessages = computed(() => errors.value.join(' '))
596
529
 
597
530
  const liveRegionMessage = computed(() => {
598
531
  if (!hasError.value) return ''
@@ -720,35 +653,6 @@
720
653
  }
721
654
  }
722
655
 
723
- watch(isOpen, (newIsOpen) => {
724
- if (!newIsOpen) {
725
- // Valider uniquement à la fermeture du menu
726
- if (props.disableErrorHandling || props.readonly) {
727
- hasError.value = false
728
- }
729
- else {
730
- const shouldHaveError = (!selectedItem.value && isRequired.value) || props.errorMessages.length > 0
731
- hasError.value = shouldHaveError
732
-
733
- // Forcer la validation du VTextField avec nextTick pour que le DOM soit à jour
734
- nextTick(() => {
735
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
736
- if (textInput.value && (textInput.value as any).validate) {
737
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
738
- ;(textInput.value as any).validate()
739
- }
740
- })
741
- }
742
- }
743
- // Ne rien faire à l'ouverture pour préserver l'état actuel
744
- })
745
-
746
- watch(() => props.errorMessages, (newValue) => {
747
- if (!props.disableErrorHandling) {
748
- hasError.value = newValue.length > 0
749
- }
750
- })
751
-
752
656
  const ariaManager = {
753
657
  cleanInputAttributes(inputElement: HTMLElement): void {
754
658
  if (!inputElement) return
@@ -886,6 +790,8 @@
886
790
  watch(isOpen, async (newValue) => {
887
791
  await nextTick()
888
792
 
793
+ focused.value = newValue
794
+
889
795
  if (!textInput.value || !textInput.value.$el) return
890
796
 
891
797
  setupAriaAttributes()
@@ -937,25 +843,6 @@
937
843
  })
938
844
  }, { deep: true })
939
845
 
940
- // Méthode de validation pour l'enregistrement avec le système de validation du formulaire
941
- const validateOnSubmit = (): boolean => {
942
- // Si en mode readonly ou si la gestion d'erreur est désactivée, toujours valide
943
- if (props.readonly || props.disableErrorHandling) {
944
- return true
945
- }
946
-
947
- // Vérifier si une valeur est sélectionnée quand le champ est requis
948
- const isValid = !isRequired.value
949
-
950
- // Mettre à jour l'état d'erreur
951
- hasError.value = !isValid || props.errorMessages.length > 0
952
-
953
- return isValid
954
- }
955
-
956
- // Intégration avec le système de validation du formulaire
957
- useValidatable(validateOnSubmit)
958
-
959
846
  watch(isOpen, () => {
960
847
  nextTick(() => {
961
848
  updateMenuMinWidth()
@@ -970,7 +857,7 @@
970
857
  defineExpose({
971
858
  isOpen,
972
859
  closeList,
973
- validateOnSubmit,
860
+ validateOnSubmit: validate,
974
861
  })
975
862
 
976
863
  // on reprend la mm methode que pour le datepicker : useDatePickerAccesssibity (updateAccessibility)
@@ -1015,6 +902,14 @@
1015
902
  }
1016
903
  }
1017
904
 
905
+ const onBlur = () => {
906
+ // Trigger blur validation only when focus truly leaves the component.
907
+ // Skip if the menu is open — focus is moving to the dropdown list, not exiting.
908
+ if (!isOpen.value) {
909
+ validate()
910
+ }
911
+ }
912
+
1018
913
  return {
1019
914
  ...activatorProps,
1020
915
  onKeydown: undefined,
@@ -1024,7 +919,8 @@
1024
919
  textInput.value = el
1025
920
  activatorProps.ref?.(el)
1026
921
  },
1027
- onFocus: onFocus,
922
+ onFocus,
923
+ onBlur,
1028
924
  }
1029
925
  }
1030
926
  </script>
@@ -1058,19 +954,26 @@
1058
954
  :disabled="disabled"
1059
955
  :label="labelWithAsterisk"
1060
956
  :aria-label="accessibleLabel"
1061
- :error-messages="props.disableErrorHandling ? [] : errorMessages"
957
+ :error="hasError"
958
+ :error-messages="errors"
959
+ :messages="hasError ? errors : (hasWarning ? warnings : (hasSuccess && props.showSuccessMessages ? successes : undefined))"
1062
960
  :variant="variant"
1063
- :rules="validationRules"
1064
961
  :bg-color="props.bgColor"
1065
962
  :density="props.density"
1066
- :active="hasChips || hasMultipleSelections || isOpen"
963
+ :active="isFieldActive"
1067
964
  readonly
1068
- :hide-details="props.hideMessages && !showHelpTextAsMessage"
965
+ :hide-details="props.hideDetails && !showHelpTextAsMessage"
1069
966
  :hint="showHelpTextAsMessage ? props.helpText : ''"
1070
967
  :persistent-hint="!!showHelpTextAsMessage"
1071
968
  :autocomplete="props.autocomplete"
1072
969
  :width="calculatedWidth"
1073
970
  :style="hasError ? { minWidth: `${labelWidth + 18}px`} : { minWidth: `${labelWidth}px` }"
971
+ :class="{
972
+ 'error-field': hasError,
973
+ 'warning-field': hasWarning,
974
+ 'success-field': hasSuccess,
975
+ 'basic-field': !hasError && !hasWarning && !hasSuccess,
976
+ }"
1074
977
  v-bind="{
1075
978
  ...Object.fromEntries(Object.entries($attrs).filter(([key]) => key !== 'display-asterisk')),
1076
979
  ...initializeActivatorProps(activatorProps),
@@ -1165,19 +1068,18 @@
1165
1068
 
1166
1069
  <template #append-inner>
1167
1070
  <SyIcon
1168
- v-if="hasError"
1071
+ v-if="validationIcon"
1169
1072
  class="mr-6"
1170
- color="error"
1171
- :icon="mdiAlertCircle"
1172
- :decorative="false"
1173
- label="Information"
1174
- role="img"
1073
+ :color="hasError ? 'error' : (hasWarning ? 'warning' : 'success')"
1074
+ :icon="validationIcon"
1075
+ :decorative="true"
1076
+ role="presentation"
1175
1077
  />
1176
1078
  <button
1177
1079
  v-if="props.clearable && hasSelectionToClear"
1178
1080
  type="button"
1179
1081
  class="sy-select__clear-button"
1180
- :style="{ right: hasError ? '62px' : '42px' }"
1082
+ :style="{ right: (hasError || hasWarning || hasSuccess) ? '62px' : '42px' }"
1181
1083
  :aria-label="locales.clear"
1182
1084
  @keydown.enter.prevent="$event => selectItem(null, $event)"
1183
1085
  @keydown.space.prevent="$event => selectItem(null, $event)"
@@ -1297,11 +1199,11 @@
1297
1199
  </div>
1298
1200
 
1299
1201
  <div
1300
- v-if="!props.hideMessages && hasMessages"
1202
+ v-if="!props.hideDetails && hasMessages"
1301
1203
  :id="messagesId"
1302
1204
  class="d-sr-only"
1303
1205
  >
1304
- {{ formattedErrorMessages }}
1206
+ {{ hasError ? errors.join(' ') : (hasWarning ? warnings.join(' ') : successes.join(' ')) }}
1305
1207
  </div>
1306
1208
 
1307
1209
  <div
@@ -1335,17 +1237,128 @@
1335
1237
 
1336
1238
  :deep(.v-input__prepend > .v-icon__svg),
1337
1239
  :deep(.v-input__append > .v-icon__svg) {
1338
- fill: rgb(var(--v-theme-iconBase));
1240
+ fill: rgb(var(--v-theme-onSurface));
1339
1241
  }
1340
1242
 
1341
1243
  :deep(.v-input__prepend .v-icon:focus-visible),
1342
1244
  :deep(.v-input__append .v-icon:focus-visible) {
1343
- outline: 2px solid rgb(var(--v-theme-borderAccentPrimary));
1245
+ outline: 2px solid rgb(var(--v-theme-primary));
1344
1246
  outline-offset: 2px;
1345
1247
  opacity: 1;
1346
1248
  }
1347
1249
  }
1348
1250
 
1251
+ .warning-field {
1252
+ :deep(.v-icon__svg) {
1253
+ fill: rgb(var(--v-theme-onWarningVariant)) !important;
1254
+ }
1255
+
1256
+ :deep(.v-icon.arrow) {
1257
+ color: rgb(var(--v-theme-primary)) !important;
1258
+ }
1259
+
1260
+ :deep(.v-icon.arrow .v-icon__svg) {
1261
+ fill: rgb(var(--v-theme-primary)) !important;
1262
+ }
1263
+
1264
+ :deep(.sy-select__clear-icon .v-icon__svg) {
1265
+ fill: rgb(var(--v-theme-primary)) !important;
1266
+ }
1267
+
1268
+ :deep(.v-field) {
1269
+ color: rgb(var(--v-theme-onWarningVariant)) !important;
1270
+
1271
+ --v-medium-emphasis-opacity: 1;
1272
+
1273
+ .v-field__outline {
1274
+ --v-field-border-opacity: 1;
1275
+
1276
+ color: rgb(var(--v-theme-onWarningVariant)) !important;
1277
+ }
1278
+ }
1279
+
1280
+ :deep(.v-messages) {
1281
+ opacity: 1 !important;
1282
+
1283
+ .v-messages__message {
1284
+ color: rgb(var(--v-theme-onWarningVariant)) !important;
1285
+ }
1286
+ }
1287
+ }
1288
+
1289
+ .error-field {
1290
+ :deep(.v-field) {
1291
+ color: rgb(var(--v-theme-error)) !important;
1292
+
1293
+ .v-field__outline {
1294
+ --v-field-border-opacity: 1;
1295
+
1296
+ color: rgb(var(--v-theme-error)) !important;
1297
+ }
1298
+ }
1299
+
1300
+ :deep(.v-messages) {
1301
+ opacity: 1 !important;
1302
+
1303
+ .v-messages__message {
1304
+ color: rgb(var(--v-theme-error)) !important;
1305
+ }
1306
+ }
1307
+
1308
+ :deep(.v-icon.arrow) {
1309
+ color: rgb(var(--v-theme-onSurfaceVariant)) !important;
1310
+ }
1311
+
1312
+ :deep(.v-icon.arrow .v-icon__svg) {
1313
+ fill: rgb(var(--v-theme-onSurfaceVariant)) !important;
1314
+ }
1315
+ }
1316
+
1317
+ .success-field {
1318
+ :deep(.v-icon__svg) {
1319
+ fill: rgb(var(--v-theme-onSuccessVariant)) !important;
1320
+ }
1321
+
1322
+ :deep(.v-icon.arrow) {
1323
+ color: rgb(var(--v-theme-onSurface)) !important;
1324
+ }
1325
+
1326
+ :deep(.v-icon.arrow .v-icon__svg) {
1327
+ fill: rgb(var(--v-theme-onSurface)) !important;
1328
+ }
1329
+
1330
+ :deep(.sy-select__clear-icon .v-icon__svg) {
1331
+ fill: rgb(var(--v-theme-onSurface)) !important;
1332
+ }
1333
+
1334
+ :deep(.v-field) {
1335
+ color: rgb(var(--v-theme-onSuccessVariant)) !important;
1336
+
1337
+ --v-medium-emphasis-opacity: 1;
1338
+
1339
+ .v-field__outline {
1340
+ --v-field-border-opacity: 1;
1341
+
1342
+ color: rgb(var(--v-theme-onSuccessVariant)) !important;
1343
+ }
1344
+ }
1345
+
1346
+ :deep(.v-messages) {
1347
+ opacity: 1 !important;
1348
+
1349
+ .v-messages__message {
1350
+ color: rgb(var(--v-theme-onSuccessVariant)) !important;
1351
+ }
1352
+ }
1353
+ }
1354
+
1355
+ .basic-field {
1356
+ :deep(.v-field--focused .v-field__outline) {
1357
+ color: rgb(var(--v-theme-primary)) !important;
1358
+ opacity: 1 !important;
1359
+ }
1360
+ }
1361
+
1349
1362
  .v-field {
1350
1363
  position: relative;
1351
1364
  }
@@ -1369,29 +1382,29 @@
1369
1382
  }
1370
1383
 
1371
1384
  .help-text {
1372
- color: rgba(var(--v-theme-on-surface), var(--v-medium-emphasis-opacity));
1385
+ color: rgba(var(--v-theme-onSurface), var(--v-medium-emphasis-opacity));
1373
1386
  font-size: var(--v-fontSize-liensEtLibelles);
1374
1387
  line-height: 1.2;
1375
1388
  }
1376
1389
 
1377
1390
  .help-text.text-disabled {
1378
- color: rgba(var(--v-theme-on-surface), var(--v-disabled-opacity));
1391
+ color: rgba(var(--v-theme-onSurface), var(--v-disabled-opacity));
1379
1392
  }
1380
1393
 
1381
1394
  .help-text-below {
1382
- color: rgba(var(--v-theme-on-surface), var(--v-medium-emphasis-opacity));
1395
+ color: rgba(var(--v-theme-onSurface), var(--v-medium-emphasis-opacity));
1383
1396
  font-size: var(--v-fontSize-liensEtLibelles);
1384
1397
  line-height: 1.2;
1385
1398
  }
1386
1399
 
1387
1400
  .help-text-below.text-disabled {
1388
- color: rgba(var(--v-theme-on-surface), var(--v-disabled-opacity));
1401
+ color: rgba(var(--v-theme-onSurface), var(--v-disabled-opacity));
1389
1402
  }
1390
1403
 
1391
1404
  /* Ensure focus styles match selection styles for keyboard navigation */
1392
1405
  .v-list-item:focus-visible,
1393
1406
  .v-list-item.keyboard-focused {
1394
- outline: 2px solid rgb(var(--v-theme-borderAccentPrimary));
1407
+ outline: 2px solid rgb(var(--v-theme-primary));
1395
1408
  outline-offset: -2px;
1396
1409
  background-color: rgb(0 0 0 / 8%);
1397
1410
  }
@@ -1418,11 +1431,10 @@
1418
1431
  .v-icon.arrow {
1419
1432
  position: absolute;
1420
1433
  right: 10px;
1421
- color: rgb(var(--v-theme-iconBase));
1422
1434
  }
1423
1435
 
1424
1436
  .sy-select__clear-icon {
1425
- color: rgb(var(--v-theme-iconBase)) !important;
1437
+ color: rgb(var(--v-theme-onSurface)) !important;
1426
1438
  opacity: var(--v-medium-emphasis-opacity) !important;
1427
1439
  }
1428
1440
 
@@ -1467,7 +1479,7 @@
1467
1479
 
1468
1480
  .sy-select :deep(.v-field__input) {
1469
1481
  opacity: 1;
1470
- color: rgb(var(--v-theme-iconBase)) !important;
1482
+ color: rgb(var(--v-theme-onSurface)) !important;
1471
1483
  cursor: pointer;
1472
1484
  caret-color: transparent;
1473
1485
  padding-right: 25px;