@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
@@ -1,68 +1,51 @@
1
1
  <script lang="ts" setup>
2
2
 
3
- import { computed, nextTick, onMounted, onUpdated, ref, watch } from 'vue'
3
+ import { computed, nextTick, onMounted, onUpdated, ref } from 'vue'
4
4
  import type { VRadioGroup } from 'vuetify/components'
5
- import { useValidation, type ValidationRule } from '@/composables/validation/useValidation'
5
+ import { VMessages } from 'vuetify/components'
6
+ import { validationPropsDefaults, type FieldValidationProps } from '@/composables/unifyValidation/useValidation'
6
7
  import { useValidatable } from '@/composables/validation/useValidatable'
8
+ import { useSyRadioGroupValidation } from './composables/useSyRadioGroupValidation'
7
9
  import { locales } from './locales'
8
10
 
9
11
  const props = withDefaults(
10
12
  defineProps<{
11
- modelValue?: PropertyKey | null
12
- label?: string
13
- displayAsterisk?: boolean
14
13
  ariaLabel?: string
15
14
  ariaLabelledby?: string
16
- title?: string
17
15
  color?: string
18
- disabled?: boolean
19
- readonly?: boolean
20
- hideDetails?: boolean | 'auto'
21
16
  density?: 'default' | 'comfortable' | 'compact'
22
- options?: Array<{ label: string, value: PropertyKey }>
23
- name?: string
17
+ displayAsterisk?: boolean
18
+ helpText?: string
19
+ hideDetails?: boolean | 'auto'
24
20
  id?: string
25
- required?: boolean
26
- errorMessages?: string[] | null
27
- warningMessages?: string[] | null
28
- successMessages?: string[] | null
29
- customRules?: ValidationRule[]
30
- customWarningRules?: ValidationRule[]
31
- customSuccessRules?: ValidationRule[]
32
- showSuccessMessages?: boolean
33
- isValidateOnBlur?: boolean
34
- disableErrorHandling?: boolean
35
- }>(),
21
+ label?: string
22
+ modelValue?: PropertyKey | null
23
+ name?: string
24
+ options?: Array<{ label: string, value: PropertyKey }>
25
+ title?: string
26
+ } & FieldValidationProps>(),
36
27
  {
37
- modelValue: null,
38
- label: undefined,
39
- displayAsterisk: false,
40
28
  ariaLabel: undefined,
41
29
  ariaLabelledby: undefined,
42
- title: undefined,
43
30
  color: 'primary',
44
- disabled: false,
45
- readonly: false,
46
- hideDetails: 'auto',
47
31
  density: 'default',
48
- options: () => [],
49
- name: undefined,
32
+ displayAsterisk: false,
33
+ helpText: '',
34
+ hideDetails: 'auto',
50
35
  id: undefined,
51
- required: false,
52
- errorMessages: null,
53
- warningMessages: null,
54
- successMessages: null,
55
- customRules: () => [],
56
- customWarningRules: () => [],
57
- customSuccessRules: () => [],
58
- showSuccessMessages: true,
59
- isValidateOnBlur: false,
60
- disableErrorHandling: false,
36
+ label: undefined,
37
+ modelValue: null,
38
+ name: undefined,
39
+ options: () => [],
40
+ title: undefined,
41
+ ...validationPropsDefaults,
42
+ isValidateOnBlur: false, // La validation se déclenche immédiatement à la sélection pour les radios
61
43
  },
62
44
  )
63
45
 
64
46
  const emit = defineEmits(['update:modelValue', 'change'])
65
47
  const radioGroupRef = ref<VRadioGroup | null>(null)
48
+ const focused = ref(false)
66
49
  const model = computed({
67
50
  get() {
68
51
  return props.modelValue
@@ -74,81 +57,29 @@
74
57
  })
75
58
 
76
59
  const generatedLabel = computed(() =>
77
- (props.label || '') + (props.displayAsterisk ? '*' : ''),
60
+ (props.label || '') + (props.displayAsterisk ? ' *' : ''),
78
61
  )
79
62
 
80
- // Initialisation du composable de validation
81
- // Variable pour suivre si le formulaire a été soumis
82
- const isSubmitted = ref(false)
83
-
84
- const validation = useValidation({
85
- showSuccessMessages: props.showSuccessMessages,
86
- fieldIdentifier: props.label,
87
- disableErrorHandling: props.disableErrorHandling,
88
- })
63
+ // Utilisation du composable de validation dédié
64
+ const {
65
+ validateOnSubmit,
66
+ errors,
67
+ warnings,
68
+ successes,
69
+ hasError,
70
+ hasWarning,
71
+ hasSuccess,
72
+ } = useSyRadioGroupValidation(props, model, focused)
89
73
 
90
- // Synchronisation des messages externes
91
- watch(() => props.errorMessages, value => (validation.errors.value = value || []), { immediate: true })
92
- watch(() => props.warningMessages, value => (validation.warnings.value = value || []), { immediate: true })
93
- watch(() => props.successMessages, value => (validation.successes.value = value || []), { immediate: true })
74
+ // Intégration avec le système de validation du formulaire
75
+ useValidatable(validateOnSubmit)
94
76
 
95
- // Construction des règles de validation
96
- const defaultRules = computed<ValidationRule[]>(() =>
97
- props.required
98
- ? [{
99
- type: 'required',
100
- options: {
101
- message: `Le champ ${props.label || 'ce champ'} est requis.`,
102
- fieldIdentifier: props.label,
103
- },
104
- }]
105
- : [],
77
+ const hasMessages = computed(() =>
78
+ errors.value.length > 0 || warnings.value.length > 0 || successes.value.length > 0,
106
79
  )
107
80
 
108
- const validateField = async (value: PropertyKey | null) => {
109
- // const stringValue = value != null ? String(value) : null
110
-
111
- if (props.readonly) {
112
- validation.clearValidation()
113
- return true
114
- }
115
-
116
- if (value === null && !props.required) {
117
- validation.clearValidation()
118
- return true
119
- }
120
-
121
- const result = await validation.validateField(
122
- value,
123
- [...defaultRules.value, ...props.customRules],
124
- props.customWarningRules,
125
- props.customSuccessRules,
126
- )
127
- return !result.hasError
128
- }
129
-
130
- const validateOnSubmit = async () => {
131
- isSubmitted.value = true
132
- return await validateField(model.value)
133
- }
134
-
135
- const checkErrorOnBlur = () => {
136
- validateField(model.value)
137
- }
138
-
139
- watch(model, (newValue) => {
140
- if (!props.isValidateOnBlur) {
141
- validateField(newValue)
142
- }
143
- })
144
-
145
- const hasError = computed(() => validation.hasError.value)
146
- const hasWarning = computed(() => validation.hasWarning.value)
147
- const hasSuccess = computed(() => validation.hasSuccess.value)
148
-
149
- const errors = computed(() => validation.errors.value)
150
- const warnings = computed(() => validation.warnings.value)
151
- const successes = computed(() => validation.successes.value)
81
+ const showHelpTextAsMessage = computed(() => !!props.helpText && !hasMessages.value)
82
+ const showHelpTextBelow = computed(() => !!props.helpText && hasMessages.value && props.hideDetails !== true)
152
83
 
153
84
  const getAriaChecked = (value: PropertyKey) => {
154
85
  return model.value === value ? 'true' : 'false'
@@ -167,6 +98,9 @@
167
98
  return undefined
168
99
  })
169
100
 
101
+ // Workaround Vuetify: Vuetify ajoute aria-disabled="false" sur tous les radios non désactivés
102
+ // Ce n'est pas nécessaire car la spécification ARIA ne requiert pas aria-disabled="false"
103
+ // On supprime cet attribut pour éviter le bruit dans les lecteurs d'écran
170
104
  const removeAriaAttributesForRadio = () => {
171
105
  nextTick(() => {
172
106
  if (radioGroupRef.value) {
@@ -181,22 +115,14 @@
181
115
  // Appliquer la correction lors du montage et de la mise à jour du composant
182
116
  onMounted(() => {
183
117
  removeAriaAttributesForRadio()
184
- if (!props.isValidateOnBlur && !props.required) {
185
- validateField(model.value)
186
- }
187
118
  })
188
119
 
189
120
  onUpdated(() => {
190
121
  removeAriaAttributesForRadio()
191
122
  })
192
123
 
193
- // Intégration avec le système de validation du formulaire
194
- useValidatable(validateOnSubmit)
195
-
196
124
  defineExpose({
197
- validation,
198
125
  validateOnSubmit,
199
- checkErrorOnBlur,
200
126
  })
201
127
 
202
128
  </script>
@@ -219,15 +145,11 @@
219
145
  :color="props.color"
220
146
  :disabled="props.disabled"
221
147
  :readonly="props.readonly"
222
- :hide-details="props.hideDetails"
148
+ :hide-details="showHelpTextAsMessage ? false : props.hideDetails"
223
149
  :density="props.density"
224
150
  :error="hasError"
225
151
  :error-messages="hasError ? errors : undefined"
226
152
  :aria-describedby="messageId"
227
- :messages="hasError ? errors :
228
- hasWarning ? warnings :
229
- (hasSuccess && props.showSuccessMessages ? successes : [])
230
- "
231
153
  >
232
154
  <v-radio
233
155
  v-for="opt in props.options"
@@ -236,7 +158,8 @@
236
158
  role="radio"
237
159
  :label="opt.label"
238
160
  :aria-checked="getAriaChecked(opt.value)"
239
- @blur="checkErrorOnBlur"
161
+ @focus="focused = true"
162
+ @blur="focused = false"
240
163
  />
241
164
  <template
242
165
  v-if="$slots.label"
@@ -258,25 +181,71 @@
258
181
  {{ locales.labelledbyMessage }} <span v-if="props.label">{{ props.label + (props.displayAsterisk ? '*' : '')
259
182
  }}</span>.
260
183
  </span>
184
+ <template
185
+ v-if="(!hasError && (hasWarning || hasSuccess) && props.showSuccessMessages) || showHelpTextAsMessage"
186
+ #details
187
+ >
188
+ <div class="v-input__details sy-radio-group__messages">
189
+ <VMessages
190
+ v-if="!hasError && (hasWarning || hasSuccess) && props.showSuccessMessages"
191
+ :active="hasWarning || (hasSuccess && successes.length > 0)"
192
+ :messages="hasWarning ? warnings : successes"
193
+ />
194
+ <div
195
+ v-if="showHelpTextAsMessage"
196
+ class="sy-radio-group__help-text"
197
+ :class="{ 'text-disabled': props.disabled }"
198
+ >
199
+ {{ props.helpText }}
200
+ </div>
201
+ </div>
202
+ </template>
261
203
  </v-radio-group>
204
+ <div
205
+ v-if="showHelpTextBelow"
206
+ class="help-text-below px-1 mt-1"
207
+ :class="{ 'text-disabled': props.disabled }"
208
+ >
209
+ {{ props.helpText }}
210
+ </div>
262
211
  </template>
263
212
 
264
213
  <style scoped>
214
+ :deep(.v-input__details) {
215
+ display: block !important;
216
+ padding-inline: 0 !important;
217
+ margin-top: -10px !important;
218
+ }
219
+
265
220
  :deep(.v-selection-control--error .v-selection-control__input) {
266
221
  color: rgb(var(--v-theme-error));
267
222
  }
268
223
 
224
+ :deep(.sy-radio-group__messages) {
225
+ align-items: flex-start;
226
+ margin-top: -22px !important;
227
+ }
228
+
229
+ .sy-radio-group__help-text {
230
+ font-size: 0.75rem;
231
+ color: rgba(var(--v-theme-on-surface), var(--v-medium-emphasis-opacity));
232
+ }
233
+
269
234
  .sb-show-main.sb-main-centered #storybook-root {
270
235
  margin: none !important;
271
236
  }
272
237
 
238
+ :deep(.v-messages) {
239
+ opacity: 1 !important;
240
+ }
241
+
273
242
  .warning-field {
274
243
  :deep(.v-messages__message) {
275
- color: rgb(var(--v-theme-warning)) !important;
244
+ color: rgb(var(--v-theme-onWarningVariant)) !important;
276
245
  }
277
246
 
278
247
  :deep(.v-selection-control__input) {
279
- color: rgb(var(--v-theme-warning));
248
+ color: rgb(var(--v-theme-onWarningVariant));
280
249
  }
281
250
  }
282
251
 
@@ -288,7 +257,7 @@
288
257
 
289
258
  .success-field {
290
259
  :deep(.v-messages__message) {
291
- color: rgb(var(--v-theme-success)) !important;
260
+ color: rgb(var(--v-theme-onSuccessVariant)) !important;
292
261
  }
293
262
  }
294
263
 
@@ -296,6 +265,10 @@
296
265
  animation: sy-messages-in 0.25s cubic-bezier(0.4, 0, 0.2, 1) !important;
297
266
  }
298
267
 
268
+ :deep(.v-label) {
269
+ margin-inline-start: 0 !important;
270
+ }
271
+
299
272
  @keyframes sy-messages-in {
300
273
  from {
301
274
  opacity: 0;
@@ -0,0 +1,127 @@
1
+ import { computed, ref, toRef, type ComputedRef, type Ref } from 'vue'
2
+ import { useValidation, type FieldValidationProps, type ValidationRule, type VuetifyValidationRule } from '@/composables/unifyValidation/useValidation'
3
+
4
+ export interface SyRadioGroupValidationProps extends FieldValidationProps {
5
+ modelValue?: PropertyKey | null
6
+ required?: boolean
7
+ readonly?: boolean
8
+ disabled?: boolean
9
+ customRules?: ValidationRule[]
10
+ customWarningRules?: ValidationRule[]
11
+ customSuccessRules?: ValidationRule[]
12
+ isValidateOnBlur?: boolean
13
+ showSuccessMessages?: boolean
14
+ useVuetifyValidation?: boolean
15
+ rules?: VuetifyValidationRule[]
16
+ errorMessages?: string[] | null
17
+ warningMessages?: string[] | null
18
+ successMessages?: string[] | null
19
+ hasError?: boolean
20
+ hasWarning?: boolean
21
+ hasSuccess?: boolean
22
+ maxErrors?: number
23
+ disableErrorHandling?: boolean
24
+ fieldIdentifier?: string
25
+ }
26
+
27
+ export interface UseSyRadioGroupValidationReturn {
28
+ validate: () => Promise<boolean>
29
+ validateOnSubmit: () => Promise<boolean>
30
+ errors: Ref<string[]>
31
+ warnings: Ref<string[]>
32
+ successes: Ref<string[]>
33
+ hasError: ComputedRef<boolean | undefined>
34
+ hasWarning: ComputedRef<boolean | undefined>
35
+ hasSuccess: ComputedRef<boolean | undefined>
36
+ defaultRules: ComputedRef<ValidationRule[]>
37
+ focused: Ref<boolean>
38
+ }
39
+
40
+ /**
41
+ * Composable pour gérer la validation du composant SyRadioGroup
42
+ *
43
+ * Ce composable encapsule toute la logique de validation spécifique aux groupes de radios :
44
+ * - Validation required avec message personnalisé
45
+ * - Validation immédiate à la sélection (isValidateOnBlur = false par défaut)
46
+ * - Support des customRules, customWarningRules, customSuccessRules
47
+ * - Désactivation automatique des messages de succès en mode Vuetify
48
+ * - Intégration avec useValidation du design system
49
+ *
50
+ * @example
51
+ * const { validate, errors, hasError, defaultRules } = useSyRadioGroupValidation(props, model)
52
+ */
53
+ export function useSyRadioGroupValidation(
54
+ props: SyRadioGroupValidationProps,
55
+ model: Ref<PropertyKey | null>,
56
+ focused?: Ref<boolean>,
57
+ ): UseSyRadioGroupValidationReturn {
58
+ // Utiliser la variable focused passée en paramètre, sinon en créer une locale
59
+ const focusedRef = focused || ref(false)
60
+
61
+ // Construction des règles de validation par défaut (required)
62
+ const defaultRules = computed<ValidationRule[]>(() =>
63
+ props.required
64
+ ? [{
65
+ type: 'required',
66
+ options: {
67
+ message: `Le champ ${props.fieldIdentifier || props.label || 'ce champ'} est requis.`,
68
+ fieldIdentifier: props.label,
69
+ },
70
+ }]
71
+ : [],
72
+ )
73
+
74
+ // Vuetify ne gère pas les messages de succès, on désactive automatiquement en mode Vuetify
75
+ const effectiveShowSuccessMessages = computed(() =>
76
+ props.useVuetifyValidation ? false : (props.showSuccessMessages ?? true),
77
+ )
78
+
79
+ const {
80
+ validate,
81
+ errors,
82
+ warnings,
83
+ successes,
84
+ hasError,
85
+ hasWarning,
86
+ hasSuccess,
87
+ } = useValidation({
88
+ modelValue: model,
89
+ readonly: toRef(() => props.readonly ?? false),
90
+ disabled: toRef(() => props.disabled ?? false),
91
+ required: toRef(() => props.required ?? false),
92
+ isValidateOnBlur: toRef(() => props.isValidateOnBlur ?? false), // false par défaut pour les radios
93
+ showSuccessMessages: effectiveShowSuccessMessages,
94
+ disableErrorHandling: toRef(() => props.disableErrorHandling ?? false),
95
+ useVuetifyValidation: toRef(() => props.useVuetifyValidation ?? false),
96
+ label: toRef(() => props.label ?? ''),
97
+ rules: toRef(() => props.rules),
98
+ customRules: computed(() => [...defaultRules.value, ...(props.customRules || [])]),
99
+ customWarningRules: toRef(() => props.customWarningRules ?? []),
100
+ customSuccessRules: toRef(() => props.customSuccessRules ?? []),
101
+ errorMessages: toRef(() => props.errorMessages ?? null),
102
+ warningMessages: toRef(() => props.warningMessages ?? null),
103
+ successMessages: toRef(() => props.successMessages ?? null),
104
+ hasErrorProp: toRef(() => props.hasError ?? false),
105
+ hasWarningProp: toRef(() => props.hasWarning ?? false),
106
+ hasSuccessProp: toRef(() => props.hasSuccess ?? false),
107
+ maxErrors: toRef(() => props.maxErrors ?? 1),
108
+ focused: focusedRef,
109
+ })
110
+
111
+ const validateOnSubmit = async (): Promise<boolean> => {
112
+ return await validate()
113
+ }
114
+
115
+ return {
116
+ validate,
117
+ validateOnSubmit,
118
+ errors,
119
+ warnings,
120
+ successes,
121
+ hasError,
122
+ hasWarning,
123
+ hasSuccess,
124
+ defaultRules,
125
+ focused: focusedRef,
126
+ }
127
+ }
@@ -6,7 +6,7 @@ import { axe } from 'vitest-axe'
6
6
  import { assertNoA11yViolations } from '@tests/unit/accessibility/axeUtils'
7
7
  import SyRadioGroup from '../SyRadioGroup.vue'
8
8
 
9
- // Scénario daccessibilité : groupe de boutons radio requis avec label.
9
+ // Scénarios d'accessibilité pour le groupe de boutons radio
10
10
 
11
11
  describe('SyRadioGroup – accessibility (axe)', () => {
12
12
  it('has no obvious axe violations for required radio group', async () => {
@@ -27,4 +27,96 @@ describe('SyRadioGroup – accessibility (axe)', () => {
27
27
  ignoreRules: ['region'],
28
28
  })
29
29
  })
30
+
31
+ it('has no obvious axe violations with error state', async () => {
32
+ const wrapper = mount(SyRadioGroup, {
33
+ props: {
34
+ label: 'Choisissez une option',
35
+ modelValue: null,
36
+ required: true,
37
+ errorMessages: ['Veuillez sélectionner une option'],
38
+ options: [
39
+ { label: 'Option A', value: 'A' },
40
+ { label: 'Option B', value: 'B' },
41
+ ],
42
+ },
43
+ })
44
+
45
+ const results = await axe(wrapper.element as HTMLElement)
46
+ assertNoA11yViolations(results, 'SyRadioGroup – error state', {
47
+ ignoreRules: ['region'],
48
+ })
49
+ })
50
+
51
+ it('has no obvious axe violations when disabled', async () => {
52
+ const wrapper = mount(SyRadioGroup, {
53
+ props: {
54
+ label: 'Choisissez une option',
55
+ modelValue: 'A',
56
+ disabled: true,
57
+ options: [
58
+ { label: 'Option A', value: 'A' },
59
+ { label: 'Option B', value: 'B' },
60
+ ],
61
+ },
62
+ })
63
+
64
+ const results = await axe(wrapper.element as HTMLElement)
65
+ assertNoA11yViolations(results, 'SyRadioGroup – disabled state', {
66
+ ignoreRules: ['region'],
67
+ })
68
+ })
69
+
70
+ it('has no obvious axe violations with aria-label', async () => {
71
+ const wrapper = mount(SyRadioGroup, {
72
+ props: {
73
+ ariaLabel: 'Groupe de boutons radio personnalisé',
74
+ label: 'Radio avec aria-label',
75
+ modelValue: null,
76
+ options: [
77
+ { label: 'Option A', value: 'A' },
78
+ { label: 'Option B', value: 'B' },
79
+ ],
80
+ },
81
+ })
82
+
83
+ const results = await axe(wrapper.element as HTMLElement)
84
+ assertNoA11yViolations(results, 'SyRadioGroup – avec aria-label', {
85
+ ignoreRules: ['region'],
86
+ })
87
+ })
88
+
89
+ it('has no obvious axe violations with aria-labelledby', async () => {
90
+ const container = document.createElement('div')
91
+ document.body.appendChild(container)
92
+
93
+ const heading = document.createElement('h2')
94
+ heading.id = 'custom-heading'
95
+ heading.textContent = 'Titre du groupe'
96
+ container.appendChild(heading)
97
+
98
+ const wrapper = mount(SyRadioGroup, {
99
+ attachTo: container,
100
+ props: {
101
+ ariaLabelledby: 'custom-heading',
102
+ label: 'Radio avec aria-labelledby',
103
+ modelValue: null,
104
+ options: [
105
+ { label: 'Option A', value: 'A' },
106
+ { label: 'Option B', value: 'B' },
107
+ ],
108
+ },
109
+ })
110
+
111
+ try {
112
+ const results = await axe(container)
113
+ assertNoA11yViolations(results, 'SyRadioGroup – avec aria-labelledby', {
114
+ ignoreRules: ['region'],
115
+ })
116
+ }
117
+ finally {
118
+ wrapper.unmount()
119
+ document.body.removeChild(container)
120
+ }
121
+ })
30
122
  })