@cnamts/synapse 1.0.24 → 1.0.26

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 (493) hide show
  1. package/README.md +27 -5
  2. package/dist/{AutocompleteFilter-BWLR3U7W.js → AutocompleteFilter-BPR-a55G.js} +1 -1
  3. package/dist/{DateFilter-BpwFexzi.js → DateFilter-CknrJWs2.js} +2 -2
  4. package/dist/{NumberFilter-Bz_NTdX9.js → NumberFilter-DJ-yNlzv.js} +1 -1
  5. package/dist/{PeriodFilter-DX_wy9g-.js → PeriodFilter-CiB5Oa9Z.js} +1 -1
  6. package/dist/{SelectFilter-xqiPtPgX.js → SelectFilter-EiafX97M.js} +2 -2
  7. package/dist/{TextFilter-BBl3JFqK.js → TextFilter-BzOmpdxj.js} +1 -1
  8. package/dist/{apLightTheme-D1P4jcD0.js → apLightTheme-DS0Uy44H.js} +446 -723
  9. package/dist/components/Customs/Selects/SyAutocomplete/SyAutocomplete.d.ts +14 -8
  10. package/dist/components/Customs/Selects/SySelect/SySelect.d.ts +60 -289
  11. package/dist/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.d.ts +1 -0
  12. package/dist/components/Customs/SyCheckbox/SyCheckbox.d.ts +4 -0
  13. package/dist/components/Customs/SyRadioGroup/SyRadioGroup.d.ts +1 -0
  14. package/dist/components/Customs/SyTabs/SyTabs.d.ts +13 -11
  15. package/dist/components/Customs/SyTextField/SyTextField.d.ts +0 -2
  16. package/dist/components/DatePicker/CalendarMode/DatePicker.d.ts +54 -73
  17. package/dist/components/DatePicker/ComplexDatePicker/ComplexDatePicker.d.ts +31 -40
  18. package/dist/components/DatePicker/DateTextInput/DateTextInput.d.ts +9 -14
  19. package/dist/components/DatePicker/composables/useDatePickerState.d.ts +4 -3
  20. package/dist/components/DatePicker/composables/useDateTextField.d.ts +2 -2
  21. package/dist/components/DatePicker/composables/useInputBlurHandler.d.ts +2 -2
  22. package/dist/components/DatePicker/types.d.ts +1 -2
  23. package/dist/components/FileList/FileList.d.ts +6 -0
  24. package/dist/components/FilterSideBar/FilterSideBar.d.ts +2 -0
  25. package/dist/components/HeaderNavigationBar/HeaderNavigationBar.d.ts +13 -13
  26. package/dist/components/HeaderNavigationBar/HorizontalNavbar/HorizontalNavbar.d.ts +3 -3
  27. package/dist/components/LunarCalendar/useLunarCalendarValidation.d.ts +1 -0
  28. package/dist/components/MonthPicker/MonthPicker.d.ts +2 -7
  29. package/dist/components/MonthPicker/MonthPickerText/MonthPickerInput.d.ts +2 -7
  30. package/dist/components/NirField/NirField.d.ts +12 -20
  31. package/dist/components/NirField/useNirValidation.d.ts +6 -2
  32. package/dist/components/PeriodField/PeriodField.d.ts +110 -150
  33. package/dist/components/PhoneField/PhoneField.d.ts +12 -7
  34. package/dist/components/RangeField/RangeSlider/RangeSlider.d.ts +0 -3
  35. package/dist/components/RatingPicker/EmotionPicker/EmotionPicker.d.ts +3 -1
  36. package/dist/components/RatingPicker/NumberPicker/NumberPicker.d.ts +4 -3
  37. package/dist/components/RatingPicker/RatingPicker.d.ts +18 -5
  38. package/dist/components/RatingPicker/StarsPicker/StarsPicker.d.ts +3 -1
  39. package/dist/components/RatingPicker/tests/RatingPicker.a11y.spect.d.ts +1 -0
  40. package/dist/components/RatingPicker/useRatingFocus.d.ts +18 -0
  41. package/dist/components/Tables/SyServerTable/SyServerTable.d.ts +5 -4
  42. package/dist/components/Tables/SyTable/SyTable.d.ts +5 -4
  43. package/dist/components/Tables/common/SyTablePagination.d.ts +154 -364
  44. package/dist/components/Tables/common/TableHeader.d.ts +6 -1
  45. package/dist/components/Tables/common/filters/DateFilter.d.ts +4 -4
  46. package/dist/components/Tables/common/locales.d.ts +3 -0
  47. package/dist/components/Tables/common/types.d.ts +2 -0
  48. package/dist/components/UploadWorkflow/UploadWorkflow.d.ts +1 -0
  49. package/dist/composables/date/useDateInitializationDayjs.d.ts +3 -1
  50. package/dist/composables/unifyValidation/documentationValidationProps.d.ts +230 -0
  51. package/dist/composables/unifyValidation/useCustomValidation.d.ts +3 -1
  52. package/dist/composables/unifyValidation/useValidation.d.ts +12 -6
  53. package/dist/composables/unifyValidation/useVuetifyValidation.d.ts +1 -1
  54. package/dist/composables/validation/useValidation.d.ts +6 -1
  55. package/dist/design-system-v3.js +2 -2
  56. package/dist/designTokens/tokens/amelipro/apColors.d.ts +10 -10
  57. package/dist/designTokens/tokens/amelipro/apColors2026.d.ts +1 -2
  58. package/dist/designTokens/tokens/amelipro/apContextual.d.ts +44 -0
  59. package/dist/designTokens/tokens/amelipro/apLightTheme.d.ts +2 -0
  60. package/dist/designTokens/tokens/amelipro/apSemantic.d.ts +1 -1
  61. package/dist/designTokens/tokens/baseColors.d.ts +127 -0
  62. package/dist/designTokens/tokens/baseContextualTokens.d.ts +50 -0
  63. package/dist/designTokens/tokens/cnam/cnamColors.d.ts +10 -10
  64. package/dist/designTokens/tokens/cnam/cnamLightTheme.d.ts +2 -0
  65. package/dist/designTokens/tokens/cnam/cnamSemantic.d.ts +1 -1
  66. package/dist/designTokens/tokens/pa/paColors.d.ts +1 -166
  67. package/dist/designTokens/tokens/pa/paSemantic.d.ts +1 -1
  68. package/dist/designTokens/utils/buildColorClassMap.d.ts +12 -0
  69. package/dist/designTokens/utils/createFlattenTheme.d.ts +1 -3
  70. package/dist/designTokens/utils/index.d.ts +2 -2
  71. package/dist/{main-BtTqyn4z.js → main-BsJ9ec3i.js} +16021 -15715
  72. package/dist/synapse.css +1 -1
  73. package/dist/utils/functions/classToHex.d.ts +1 -1
  74. package/dist/utils/functions/createHexResolver.d.ts +16 -0
  75. package/dist/vuetifyConfig.js +113 -152
  76. package/package.json +35 -23
  77. package/src/assets/amelipro/apTokens2026.scss +5 -5
  78. package/src/assets/overrides/_breakpoints.scss +25 -0
  79. package/src/assets/overrides/_btns.scss +0 -2
  80. package/src/assets/overrides/_forms.scss +1 -3
  81. package/src/assets/overrides/_icons.scss +5 -22
  82. package/src/assets/overrides/_otp.scss +40 -0
  83. package/src/assets/overrides/_tables.scss +11 -20
  84. package/src/assets/overrides/_tooltips.scss +17 -7
  85. package/src/assets/overrides/_typography.scss +35 -37
  86. package/src/assets/overrides/_utilities.scss +43 -47
  87. package/src/assets/themes.scss +1 -0
  88. package/src/components/Accordion/Accordion.vue +2 -0
  89. package/src/components/Amelipro/AmeliproAccordion/AmeliproAccordionTemplate/AmeliproAccordionTemplate.vue +20 -20
  90. package/src/components/Amelipro/AmeliproAccordionFrieze/AmeliproAccordionFrieze.vue +12 -14
  91. package/src/components/Amelipro/AmeliproAccordionList/AmeliproAccordionList.vue +4 -6
  92. package/src/components/Amelipro/AmeliproAccordionResult/AmeliproAccordionResultTemplate/AmeliproAccordionResultTemplate.vue +5 -5
  93. package/src/components/Amelipro/AmeliproAccordionResultList/AmeliproAccordionResultList.vue +4 -6
  94. package/src/components/Amelipro/AmeliproAutoCompleteField/AmeliproAutoCompleteField.vue +4 -6
  95. package/src/components/Amelipro/AmeliproBadge/AmeliproBadge.vue +4 -6
  96. package/src/components/Amelipro/AmeliproBreadcrumb/AmeliproBreadcrumb.vue +1 -3
  97. package/src/components/Amelipro/AmeliproBtn/AmeliproBtn.vue +4 -6
  98. package/src/components/Amelipro/AmeliproCallback/AmeliproCallback.vue +2 -2
  99. package/src/components/Amelipro/AmeliproCard/AmeliproCard.vue +31 -31
  100. package/src/components/Amelipro/AmeliproCarousel/AmeliproCarousel.vue +5 -7
  101. package/src/components/Amelipro/AmeliproCheckbox/AmeliproCheckbox.vue +13 -15
  102. package/src/components/Amelipro/AmeliproCheckboxGroup/AmeliproCheckboxGroup.vue +23 -23
  103. package/src/components/Amelipro/AmeliproChips/AmeliproChips.vue +1 -3
  104. package/src/components/Amelipro/AmeliproClickableTile/AmeliproClickableTile.vue +17 -12
  105. package/src/components/Amelipro/AmeliproClickableTile/tests/__snapshots__/AmeliproClickableTile.spec.ts.snap +2 -2
  106. package/src/components/Amelipro/AmeliproCopyBtn/AmeliproCopyBtn.vue +4 -6
  107. package/src/components/Amelipro/AmeliproCustomSelector/AmeliproCustomSelector.vue +13 -13
  108. package/src/components/Amelipro/AmeliproDentalChart/AmeliproDentalChart.vue +4 -2
  109. package/src/components/Amelipro/AmeliproDentalChart/AmeliproTooth/AmeliproTooth.vue +4 -4
  110. package/src/components/Amelipro/AmeliproDialog/AmeliproDialog.vue +5 -7
  111. package/src/components/Amelipro/AmeliproDisclosure/AmeliproDisclosure.vue +1 -3
  112. package/src/components/Amelipro/AmeliproErrorTemplate/AmeliproErrorTemplate.vue +2 -4
  113. package/src/components/Amelipro/AmeliproFilePreview/AmeliproFilePreview.vue +4 -6
  114. package/src/components/Amelipro/AmeliproFilters/AmeliproFilters.vue +13 -13
  115. package/src/components/Amelipro/AmeliproFirstLogin/AmeliproFirstLogin.vue +3 -5
  116. package/src/components/Amelipro/AmeliproFooter/AmeliproFooter.vue +1 -3
  117. package/src/components/Amelipro/AmeliproHeader/AmeliproHeader.vue +2 -4
  118. package/src/components/Amelipro/AmeliproHeader/AmeliproHeaderBar/AmeliproHeaderBar.vue +1 -3
  119. package/src/components/Amelipro/AmeliproHeader/AmeliproHeaderBar/AmeliproHeaderBrandSection/AmeliproHeaderBrandSection.vue +20 -16
  120. package/src/components/Amelipro/AmeliproHeader/AmeliproHeaderBar/AmeliproHeaderBrandSection/__tests__/__snapshots__/AmeliproHeaderBrandSection.spec.ts.snap +1 -1
  121. package/src/components/Amelipro/AmeliproIconBtn/AmeliproIconBtn.vue +2 -4
  122. package/src/components/Amelipro/AmeliproIllustratedDataTile/AmeliproIllustratedDataTile.vue +5 -7
  123. package/src/components/Amelipro/AmeliproIllustratedRadioGroup/AmeliproIllustratedRadioGroup.vue +6 -8
  124. package/src/components/Amelipro/AmeliproMailTile/AmeliproMailTile.vue +14 -14
  125. package/src/components/Amelipro/AmeliproMenu/AmeliproMenu.vue +11 -13
  126. package/src/components/Amelipro/AmeliproMessagingLayout/AmeliproDropdownMenu/AmeliproDropdownMenu.vue +2 -4
  127. package/src/components/Amelipro/AmeliproMessagingLayout/AmeliproMessagingLayout.vue +8 -8
  128. package/src/components/Amelipro/AmeliproMultipleFoldingCard/AmeliproMultipleFoldingCard.vue +40 -40
  129. package/src/components/Amelipro/AmeliproNumberedCard/AmeliproNumberedCard.vue +27 -27
  130. package/src/components/Amelipro/AmeliproOnboarding/AmeliproOnboarding.vue +3 -5
  131. package/src/components/Amelipro/AmeliproPageLayout/AmeliproPageLayout.vue +2 -4
  132. package/src/components/Amelipro/AmeliproPagination/AmeliproPagination.vue +2 -4
  133. package/src/components/Amelipro/AmeliproPagination/AmeliproPaginationBtn/AmeliproPaginationBtn.vue +3 -5
  134. package/src/components/Amelipro/AmeliproPatientBanner/AmeliproPatientBanner.vue +1 -3
  135. package/src/components/Amelipro/AmeliproPatientLogged/AmeliproPatientLogged.vue +2 -4
  136. package/src/components/Amelipro/AmeliproPatientLogin/AmeliproPatientLogin.vue +4 -4
  137. package/src/components/Amelipro/AmeliproPatientLogin/AmeliproPatientLoginForm/AmeliproPatientLoginForm.vue +1 -3
  138. package/src/components/Amelipro/AmeliproPostalAddressField/AmeliproPostalAddressCityRow/AmeliproPostalAddressCityRow.vue +3 -5
  139. package/src/components/Amelipro/AmeliproPostalAddressField/AmeliproPostalAddressField.vue +3 -5
  140. package/src/components/Amelipro/AmeliproRadioGroup/AmeliproRadioGroup.vue +23 -23
  141. package/src/components/Amelipro/AmeliproResultList/AmeliproResultList.vue +4 -6
  142. package/src/components/Amelipro/AmeliproSelect/AmeliproSelect.vue +12 -22
  143. package/src/components/Amelipro/AmeliproStateTile/AmeliproStateTile.vue +10 -12
  144. package/src/components/Amelipro/AmeliproStepper/AmeliproStepper.vue +17 -17
  145. package/src/components/Amelipro/AmeliproTable/AmeliproTable.vue +8 -10
  146. package/src/components/Amelipro/AmeliproTabs/AmeliproTabBtn/AmeliproTabBtn.vue +6 -8
  147. package/src/components/Amelipro/AmeliproTabs/AmeliproTabs.vue +4 -4
  148. package/src/components/Amelipro/AmeliproTextArea/AmeliproTextArea.vue +4 -6
  149. package/src/components/Amelipro/AmeliproTextField/AmeliproTextField.vue +7 -9
  150. package/src/components/Amelipro/AmeliproTileBtn/AmeliproTileBtn.vue +3 -5
  151. package/src/components/Amelipro/AmeliproTooltips/AmeliproTooltips.vue +0 -2
  152. package/src/components/Amelipro/AmeliproUpload/AmeliproUpload.vue +6 -6
  153. package/src/components/Amelipro/ServiceMenu/ServiceMenu.vue +2 -2
  154. package/src/components/Amelipro/StructureMenu/StructureBtn/StructureBtn.vue +4 -4
  155. package/src/components/Amelipro/StructureMenu/StructureItem/StructureItem.vue +4 -6
  156. package/src/components/Amelipro/StructureMenu/StructureMenu.vue +2 -2
  157. package/src/components/Amelipro/StructureMenu/StructureTabs/StructureTabs.vue +2 -2
  158. package/src/components/Amelipro/UserMenu/UserMenu.vue +1 -3
  159. package/src/components/BackBtn/tests/BackBtn.visual.cy.ts +43 -0
  160. package/src/components/BackBtn/tests/__snapshots__/back-btn-custom-bg.snap.png +0 -0
  161. package/src/components/BackBtn/tests/__snapshots__/back-btn-dark-mode.snap.png +0 -0
  162. package/src/components/BackBtn/tests/__snapshots__/back-btn-default.snap.png +0 -0
  163. package/src/components/BackBtn/tests/__snapshots__/back-btn-no-icon.snap.png +0 -0
  164. package/src/components/Captcha/Captcha.vue +1 -3
  165. package/src/components/ChipList/ChipList.vue +14 -16
  166. package/src/components/CookiesSelection/CookiesInformation/CookiesInformation.vue +2 -3
  167. package/src/components/CookiesSelection/CookiesSelection.vue +2 -1
  168. package/src/components/CopyBtn/CopyBtn.vue +10 -3
  169. package/src/components/Customs/Selects/SelectBtnField/SelectBtnField.vue +17 -17
  170. package/src/components/Customs/Selects/SelectBtnField/tests/SelectBtnField.spec.ts +31 -0
  171. package/src/components/Customs/Selects/SyAutocomplete/SyAutocomplete.stories.ts +66 -0
  172. package/src/components/Customs/Selects/SyAutocomplete/SyAutocomplete.vue +8 -4
  173. package/src/components/Customs/Selects/SyAutocomplete/tests/SyAutocomplete.a11y.spec.ts +18 -0
  174. package/src/components/Customs/Selects/SyAutocomplete/tests/SyAutocomplete.spec.ts +66 -0
  175. package/src/components/Customs/Selects/SyInputSelect/SyInputSelect.vue +4 -6
  176. package/src/components/Customs/Selects/SySelect/SySelect.stories.ts +414 -135
  177. package/src/components/Customs/Selects/SySelect/SySelect.vue +502 -257
  178. package/src/components/Customs/Selects/SySelect/accessibilite/Accessibility.mdx +199 -269
  179. package/src/components/Customs/Selects/SySelect/tests/SySelect.spec.ts +278 -4
  180. package/src/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.vue +3 -3
  181. package/src/components/Customs/SyCheckbox/SyCheckbox.mdx +5 -0
  182. package/src/components/Customs/SyCheckbox/SyCheckbox.vue +52 -2
  183. package/src/components/Customs/SyCheckbox/accessibilite/Accessibility.mdx +18 -3
  184. package/src/components/Customs/SyPagination/SyPagination.vue +0 -2
  185. package/src/components/Customs/SyRadioGroup/SyRadioGroup.vue +23 -5
  186. package/src/components/Customs/SyTabs/SyTabs.mdx +0 -58
  187. package/src/components/Customs/SyTabs/SyTabs.stories.ts +34 -35
  188. package/src/components/Customs/SyTabs/SyTabs.vue +87 -67
  189. package/src/components/Customs/SyTabs/accessibilite/Accessibility.mdx +83 -23
  190. package/src/components/Customs/SyTabs/config.ts +3 -3
  191. package/src/components/Customs/SyTabs/tests/SyTabs.a11y.spec.ts +88 -0
  192. package/src/components/Customs/SyTabs/tests/SyTabs.spec.ts +46 -1
  193. package/src/components/Customs/SyTextField/SyTextField.stories.ts +21 -41
  194. package/src/components/Customs/SyTextField/SyTextField.vue +34 -9
  195. package/src/components/DatePicker/CalendarMode/DatePicker.stories.ts +1 -1
  196. package/src/components/DatePicker/CalendarMode/DatePicker.vue +29 -28
  197. package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.stories.ts +1 -1
  198. package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.vue +28 -23
  199. package/src/components/DatePicker/ComplexDatePicker/tests/ComplexDatePicker.spec.ts +24 -1
  200. package/src/components/DatePicker/DatePickerValidationExample/DatePickerValidation.stories.ts +1 -1
  201. package/src/components/DatePicker/DateTextInput/DateTextInput.vue +65 -33
  202. package/src/components/DatePicker/DateTextInput/NoCalendar.stories.ts +1 -1
  203. package/src/components/DatePicker/composables/tests/useDatePickerState.spec.ts +53 -0
  204. package/src/components/DatePicker/composables/useDatePickerState.ts +56 -13
  205. package/src/components/DatePicker/composables/useDateRangeInput.ts +2 -1
  206. package/src/components/DatePicker/composables/useDateSelection.ts +2 -1
  207. package/src/components/DatePicker/composables/useDateTextField.ts +2 -3
  208. package/src/components/DatePicker/composables/useInputBlurHandler.ts +2 -2
  209. package/src/components/DatePicker/composables/useMonthButtonCustomization.ts +9 -8
  210. package/src/components/DatePicker/playground/DatePickerHolidayRule.vue +1 -1
  211. package/src/components/DatePicker/types.ts +1 -2
  212. package/src/components/DialogBox/DialogBox.stories.ts +8 -8
  213. package/src/components/DialogBox/DialogBox.vue +3 -5
  214. package/src/components/DialogBox/accessibilite/Accessibility.mdx +86 -22
  215. package/src/components/DialogBox/tests/DialogBox.visual.cy.ts +76 -0
  216. package/src/components/DialogBox/tests/__snapshots__/dialog-box-custom-texts.snap.png +0 -0
  217. package/src/components/DialogBox/tests/__snapshots__/dialog-box-default.snap.png +0 -0
  218. package/src/components/DialogBox/tests/__snapshots__/dialog-box-no-actions.snap.png +0 -0
  219. package/src/components/FileList/FileList.vue +9 -2
  220. package/src/components/FileList/UploadItem/UploadItem.vue +11 -13
  221. package/src/components/FileList/tests/FileList.spec.ts +47 -0
  222. package/src/components/FileUpload/FileUpload.vue +3 -5
  223. package/src/components/FileUpload/FileUploadContent.vue +3 -5
  224. package/src/components/FilterInline/FilterInline.vue +1 -3
  225. package/src/components/FilterSideBar/FilterSideBar.mdx +44 -1
  226. package/src/components/FilterSideBar/FilterSideBar.stories.ts +105 -1
  227. package/src/components/FilterSideBar/FilterSideBar.vue +9 -1
  228. package/src/components/FilterSideBar/tests/FilterSideBar.a11y.spec.ts +54 -1
  229. package/src/components/FilterSideBar/tests/FilterSideBar.spec.ts +42 -0
  230. package/src/components/FooterBar/FooterBar.vue +9 -13
  231. package/src/components/FranceConnectBtn/FranceConnectBtn.vue +1 -1
  232. package/src/components/HeaderBar/HeaderBar.vue +2 -3
  233. package/src/components/HeaderBar/HeaderBurgerMenu/HeaderBurgerMenu.vue +2 -3
  234. package/src/components/HeaderBar/HeaderBurgerMenu/HeaderMenuItem/HeaderMenuItem.vue +2 -3
  235. package/src/components/HeaderBar/HeaderBurgerMenu/HeaderMenuSection/HeaderMenuSection.vue +0 -1
  236. package/src/components/HeaderBar/HeaderBurgerMenu/HeaderSubMenu/HeaderSubMenu.vue +8 -9
  237. package/src/components/HeaderBar/HeaderBurgerMenu/menu.scss +0 -8
  238. package/src/components/HeaderBar/HeaderBurgerMenu/tests/HeaderBurgerMenu.visual.cy.ts +196 -0
  239. package/src/components/HeaderBar/HeaderBurgerMenu/tests/__snapshots__/header-burger-menu-generated-submenu-open.snap.png +0 -0
  240. package/src/components/HeaderBar/HeaderBurgerMenu/tests/__snapshots__/header-burger-menu-generated.snap.png +0 -0
  241. package/src/components/HeaderBar/HeaderLogo/HeaderLogo.vue +0 -1
  242. package/src/components/HeaderBar/HeaderMenuBtn/HeaderMenuBtn.vue +6 -7
  243. package/src/components/HeaderBar/tests/HeaderBar.visual.cy.ts +81 -0
  244. package/src/components/HeaderBar/tests/__snapshots__/header-bar-custom-width.snap.png +0 -0
  245. package/src/components/HeaderBar/tests/__snapshots__/header-bar-default.snap.png +0 -0
  246. package/src/components/HeaderBar/tests/__snapshots__/header-bar-no-sticky.snap.png +0 -0
  247. package/src/components/HeaderBar/tests/__snapshots__/header-bar-with-prepend.snap.png +0 -0
  248. package/src/components/HeaderBar/tests/__snapshots__/header-bar-with-side.snap.png +0 -0
  249. package/src/components/HeaderBar/tests/__snapshots__/header-bar-with-subtitle.snap.png +0 -0
  250. package/src/components/HeaderNavigationBar/HeaderNavigationBar.vue +12 -3
  251. package/src/components/HeaderNavigationBar/HorizontalNavbar/HorizontalNavbar.vue +15 -8
  252. package/src/components/HeaderToolbar/HeaderToolbar.vue +6 -7
  253. package/src/components/LangBtn/LangBtn.vue +4 -5
  254. package/src/components/Logo/tests/Logo.visual.cy.ts +57 -0
  255. package/src/components/Logo/tests/__snapshots__/logo-avatar.snap.png +0 -0
  256. package/src/components/Logo/tests/__snapshots__/logo-dark.snap.png +0 -0
  257. package/src/components/Logo/tests/__snapshots__/logo-default.snap.png +0 -0
  258. package/src/components/Logo/tests/__snapshots__/logo-no-organism.snap.png +0 -0
  259. package/src/components/Logo/tests/__snapshots__/logo-no-signature.snap.png +0 -0
  260. package/src/components/Logo/tests/__snapshots__/logo-risque-pro.snap.png +0 -0
  261. package/src/components/LogoBrandSection/LogoBrandSection.vue +2 -2
  262. package/src/components/MonthPicker/MonthPickerVisual/VisualPickerHeader.vue +1 -1
  263. package/src/components/NirField/NirField.stories.ts +2 -2
  264. package/src/components/NirField/NirField.vue +3 -5
  265. package/src/components/NirField/accessibilite/Accessibility.mdx +100 -5
  266. package/src/components/NirField/tests/NirField.spec.ts +118 -0
  267. package/src/components/NirField/tests/useNirValidation.spec.ts +449 -0
  268. package/src/components/NirField/useNirValidation.ts +38 -32
  269. package/src/components/NotificationBar/Notification/Notification.vue +7 -9
  270. package/src/components/NotificationBar/NotificationBar.vue +1 -3
  271. package/src/components/PaginatedTable/PaginatedTable.vue +3 -4
  272. package/src/components/PaginatedTable/Pagination.vue +4 -6
  273. package/src/components/PasswordField/PasswordField.vue +15 -13
  274. package/src/components/PhoneField/PhoneField.vue +7 -5
  275. package/src/components/RangeField/RangeSlider/RangeSlider.vue +11 -20
  276. package/src/components/RangeField/RangeSlider/Tooltip/Tooltip.vue +1 -1
  277. package/src/components/RangeField/tests/RangeField.visual.cy.ts +65 -0
  278. package/src/components/RangeField/tests/__snapshots__/range-field-custom-bg.snap.png +0 -0
  279. package/src/components/RangeField/tests/__snapshots__/range-field-custom-range.snap.png +0 -0
  280. package/src/components/RangeField/tests/__snapshots__/range-field-default.snap.png +0 -0
  281. package/src/components/RangeField/tests/__snapshots__/range-field-step.snap.png +0 -0
  282. package/src/components/RangeField/tests/__snapshots__/range-field-with-label.snap.png +0 -0
  283. package/src/components/RatingPicker/EmotionPicker/EmotionPicker.vue +38 -56
  284. package/src/components/RatingPicker/EmotionPicker/tests/__snapshots__/EmotionPicker.spec.ts.snap +5 -0
  285. package/src/components/RatingPicker/NumberPicker/NumberPicker.vue +48 -53
  286. package/src/components/RatingPicker/NumberPicker/tests/NumberPicker.spec.ts +2 -1
  287. package/src/components/RatingPicker/NumberPicker/tests/__snapshots__/NumberPicker.spec.ts.snap +40 -13
  288. package/src/components/RatingPicker/RatingPicker.stories.ts +65 -88
  289. package/src/components/RatingPicker/RatingPicker.vue +71 -15
  290. package/src/components/RatingPicker/StarsPicker/StarsPicker.vue +31 -42
  291. package/src/components/RatingPicker/StarsPicker/tests/StarsPicker.spec.ts +1 -1
  292. package/src/components/RatingPicker/StarsPicker/tests/__snapshots__/StarsPicker.spec.ts.snap +5 -0
  293. package/src/components/RatingPicker/accessibilite/Accessibility.mdx +137 -9
  294. package/src/components/RatingPicker/tests/RatingPicker.a11y.spect.ts +123 -0
  295. package/src/components/RatingPicker/tests/RatingPicker.spec.ts +3 -2
  296. package/src/components/RatingPicker/tests/__snapshots__/RatingPicker.spec.ts.snap +40 -11
  297. package/src/components/RatingPicker/useRatingFocus.ts +97 -0
  298. package/src/components/SearchListField/SearchListField.vue +0 -2
  299. package/src/components/SkipLink/SkipLink.vue +2 -4
  300. package/src/components/SocialMediaLinks/SocialMediaLinks.vue +6 -6
  301. package/src/components/SubHeader/SubHeader.vue +1 -1
  302. package/src/components/SyAlert/SyAlert.vue +7 -9
  303. package/src/components/SyAlert/tests/SyAlert.visual.cy.ts +46 -0
  304. package/src/components/SyAlert/tests/__snapshots__/sy-alert-closable.snap.png +0 -0
  305. package/src/components/SyAlert/tests/__snapshots__/sy-alert-error.snap.png +0 -0
  306. package/src/components/SyAlert/tests/__snapshots__/sy-alert-info.snap.png +0 -0
  307. package/src/components/SyAlert/tests/__snapshots__/sy-alert-success.snap.png +0 -0
  308. package/src/components/SyAlert/tests/__snapshots__/sy-alert-variant-outlined.snap.png +0 -0
  309. package/src/components/SyAlert/tests/__snapshots__/sy-alert-variant-tonal.snap.png +0 -0
  310. package/src/components/SyAlert/tests/__snapshots__/sy-alert-warning.snap.png +0 -0
  311. package/src/components/SyBtnMenu/SyBtnMenu.vue +2 -4
  312. package/src/components/SyTextArea/SyTextArea.vue +32 -1
  313. package/src/components/TableToolbar/TableToolbar.vue +6 -8
  314. package/src/components/Tables/SyServerTable/SyServerTable.stories.ts +166 -0
  315. package/src/components/Tables/SyServerTable/SyServerTable.vue +10 -8
  316. package/src/components/Tables/SyServerTable/tests/SyServerTable.a11y.spec.ts +23 -0
  317. package/src/components/Tables/SyServerTable/tests/SyServerTable.spec.ts +268 -0
  318. package/src/components/Tables/SyTable/SyTable.stories.ts +104 -0
  319. package/src/components/Tables/SyTable/SyTable.vue +10 -8
  320. package/src/components/Tables/SyTable/tests/SyTable.a11y.spec.ts +22 -0
  321. package/src/components/Tables/SyTable/tests/SyTable.spec.ts +274 -0
  322. package/src/components/Tables/common/SyTableFilter.vue +31 -6
  323. package/src/components/Tables/common/SyTablePagination.vue +143 -19
  324. package/src/components/Tables/common/TableHeader.vue +41 -4
  325. package/src/components/Tables/common/filters/DateFilter.vue +2 -2
  326. package/src/components/Tables/common/filters/SelectFilter.vue +1 -1
  327. package/src/components/Tables/common/locales.ts +3 -0
  328. package/src/components/Tables/common/tableStyles.scss +16 -19
  329. package/src/components/Tables/common/tests/SyTablePagination.spec.ts +18 -0
  330. package/src/components/Tables/common/tests/TableHeader.spec.ts +39 -0
  331. package/src/components/Tables/common/types.ts +2 -0
  332. package/src/components/Tables/common/useTableHeaders.ts +49 -27
  333. package/src/components/UploadWorkflow/UploadWorkflow.vue +1 -0
  334. package/src/components/UploadWorkflow/tests/UploadWorkflow.spec.ts +23 -0
  335. package/src/components/UploadWorkflow/tests/__snapshots__/UploadWorkflow.spec.ts.snap +66 -0
  336. package/src/components/UploadWorkflow/useFileList.ts +3 -0
  337. package/src/components/UserMenuBtn/UserMenuBtn.vue +1 -3
  338. package/src/composables/date/tests/useDateFormatDayjs.spec.ts +81 -0
  339. package/src/composables/date/tests/{useDateInitialization.spec.ts → useDateInitializationDayjs.spec.ts} +39 -3
  340. package/src/composables/date/useDateInitializationDayjs.ts +4 -1
  341. package/src/composables/unifyValidation/documentationValidationProps.ts +235 -0
  342. package/src/composables/unifyValidation/tests/useCustomValidation.spec.ts +2 -1
  343. package/src/composables/unifyValidation/tests/useValidation.spec.ts +22 -0
  344. package/src/composables/unifyValidation/useCustomValidation.ts +16 -4
  345. package/src/composables/unifyValidation/useValidation.ts +46 -15
  346. package/src/composables/unifyValidation/useVuetifyValidation.ts +2 -2
  347. package/src/composables/useFormFieldErrorHandling.ts +4 -1
  348. package/src/composables/validation/tests/useValidation.spec.ts +2 -2
  349. package/src/composables/validation/useValidation.ts +32 -4
  350. package/src/composantsVuetify/VBreadcrumbs/VBreadcrumbs.mdx +28 -0
  351. package/src/composantsVuetify/VBreadcrumbs/v-breadcrumbs.stories.ts +108 -0
  352. package/src/composantsVuetify/VCard/VCard.mdx +59 -0
  353. package/src/composantsVuetify/VCard/v-card.stories.ts +279 -0
  354. package/src/composantsVuetify/VOtpInput/VOtpInput.mdx +39 -0
  355. package/src/composantsVuetify/VOtpInput/v-otp-input.stories.ts +56 -0
  356. package/src/composantsVuetify/VSkeletonLoader/VSkeletonLoader.mdx +42 -0
  357. package/src/composantsVuetify/VSkeletonLoader/v-skeleton-loader.stories.ts +77 -0
  358. package/src/composantsVuetify/VSwitch/VSwitch.mdx +47 -0
  359. package/src/composantsVuetify/VSwitch/v-switch.stories.ts +166 -0
  360. package/src/designTokens/tests/buildColorClassMap.spec.ts +31 -0
  361. package/src/designTokens/tests/generateScssTokens.spec.ts +12 -0
  362. package/src/designTokens/tests/themeUtils.spec.ts +53 -0
  363. package/src/designTokens/tokens/amelipro/apColors.ts +8 -130
  364. package/src/designTokens/tokens/amelipro/apColors2026.ts +3 -15
  365. package/src/designTokens/tokens/amelipro/apContextual.ts +55 -47
  366. package/src/designTokens/tokens/amelipro/apLightTheme.ts +4 -1
  367. package/src/designTokens/tokens/amelipro/apSemantic.ts +1 -1
  368. package/src/designTokens/tokens/baseColors.ts +129 -0
  369. package/src/designTokens/tokens/baseContextualTokens.ts +52 -0
  370. package/src/designTokens/tokens/cnam/cnamColors.ts +3 -125
  371. package/src/designTokens/tokens/cnam/cnamContextual.ts +4 -48
  372. package/src/designTokens/tokens/cnam/cnamLightTheme.ts +4 -1
  373. package/src/designTokens/tokens/cnam/cnamSemantic.ts +1 -1
  374. package/src/designTokens/tokens/pa/paColors.ts +2 -166
  375. package/src/designTokens/tokens/pa/paContextual.ts +3 -48
  376. package/src/designTokens/tokens/pa/paLightTheme.ts +1 -1
  377. package/src/designTokens/tokens/pa/paSemantic.ts +2 -2
  378. package/src/designTokens/utils/buildColorClassMap.ts +34 -0
  379. package/src/designTokens/utils/convertSemanticsToken.ts +8 -11
  380. package/src/designTokens/utils/createFlattenTheme.ts +15 -7
  381. package/src/designTokens/utils/index.ts +2 -2
  382. package/src/stories/Accessibilite/Aculturation/SensibilisationAccessibilite.mdx +61 -91
  383. package/src/stories/Accessibilite/AuditDesignSystem.mdx +5 -19
  384. package/src/stories/Accessibilite/AuditEtContreAudit/Exemptions-derogations.mdx +1 -1
  385. package/src/stories/Accessibilite/AuditEtContreAudit/Introduction.mdx +11 -8
  386. package/src/stories/Accessibilite/AuditEtContreAudit/RGAA.mdx +6 -7
  387. package/src/stories/Accessibilite/DesignSystem/Avancement.mdx +433 -0
  388. package/src/stories/Accessibilite/DesignSystem/a11y-status.json +692 -0
  389. package/src/stories/Accessibilite/Introduction.mdx +30 -30
  390. package/src/stories/Accessibilite/KitDePreAudit/Echantillonnage.mdx +176 -79
  391. package/src/stories/Accessibilite/KitDePreAudit/Introduction.mdx +67 -19
  392. package/src/stories/Accessibilite/KitDePreAudit/Outils/Introduction.mdx +78 -50
  393. package/src/stories/Accessibilite/KitDePreAudit/Outils/LecteursDEcran.mdx +23 -49
  394. package/src/stories/Accessibilite/KitDePreAudit/Outils/Tanaguru/FauxPositifs.stories.ts +6 -0
  395. package/src/stories/Accessibilite/KitDePreAudit/Outils/Tanaguru/Utilisation.mdx +7 -19
  396. package/src/stories/Accessibilite/KitDePreAudit/Preaudit.mdx +55 -67
  397. package/src/stories/Components/Components.stories.ts +92 -4
  398. package/src/stories/Demarrer/EnrichirLeDesignSystem.mdx +4 -9
  399. package/src/stories/Demarrer/EnrichirLeDesignSystem.stories.ts +28 -0
  400. package/src/stories/Demarrer/Releases.stories.ts +48 -5
  401. package/src/stories/DesignTokens/ColorDisplay.vue +6 -5
  402. package/src/stories/DesignTokens/ColorIntegrationExample.vue +2 -4
  403. package/src/stories/DesignTokens/colors.stories.ts +5 -6
  404. package/src/stories/GuideDuDev/CreateVuetifyInstance.mdx +95 -0
  405. package/src/stories/GuideDuDev/Theme.mdx +36 -26
  406. package/src/stories/GuideDuDev/moduleDeNotification.mdx +3 -2
  407. package/src/stories/styles/accessibility-guide.css +3 -3
  408. package/src/utils/functions/classToHex.ts +6 -34
  409. package/src/utils/functions/createHexResolver.ts +45 -0
  410. package/src/utils/functions/tests/classToHex.spec.ts +36 -0
  411. package/src/utils/functions/tests/convertToHex.spec.ts +31 -0
  412. package/src/utils/functions/tests/createHexResolver.spec.ts +66 -0
  413. package/src/utils/functions/tests/isCssColor.spec.ts +48 -0
  414. package/dist/AutocompleteFilter-D9jzRzAL.cjs +0 -1
  415. package/dist/DateFilter-DTUl8hb1.cjs +0 -1
  416. package/dist/NumberFilter-MAEojdk0.cjs +0 -1
  417. package/dist/PeriodFilter-CC4WgIhl.cjs +0 -1
  418. package/dist/SelectFilter-BR3fvl-a.cjs +0 -1
  419. package/dist/TextFilter-CCfYFl5F.cjs +0 -1
  420. package/dist/apLightTheme-CFSRrjv2.cjs +0 -1
  421. package/dist/composables/date/useDateFormat.d.ts +0 -26
  422. package/dist/composables/date/useDateInitialization.d.ts +0 -18
  423. package/dist/design-system-v3.umd.cjs +0 -1
  424. package/dist/designTokens/utils/convertGaps.d.ts +0 -5
  425. package/dist/main-C1e3eoxd.cjs +0 -1067
  426. package/dist/tooth-11-D3sLWv2n.cjs +0 -1
  427. package/dist/tooth-12-CXrLuH03.cjs +0 -1
  428. package/dist/tooth-13-BSfo5fpT.cjs +0 -1
  429. package/dist/tooth-14-DMzulx0h.cjs +0 -1
  430. package/dist/tooth-15-BKRFVi-9.cjs +0 -1
  431. package/dist/tooth-16-CpuxAbuM.cjs +0 -1
  432. package/dist/tooth-17-BPoahUdg.cjs +0 -1
  433. package/dist/tooth-18-DhHJz8sy.cjs +0 -1
  434. package/dist/tooth-21-Dgd5hn_X.cjs +0 -1
  435. package/dist/tooth-22-C2Tn19sB.cjs +0 -1
  436. package/dist/tooth-23-C9uaaSGb.cjs +0 -1
  437. package/dist/tooth-24-BrK9UGpf.cjs +0 -1
  438. package/dist/tooth-25-CE_EfGNp.cjs +0 -1
  439. package/dist/tooth-26-Ctv4i9Fy.cjs +0 -1
  440. package/dist/tooth-27-C5J7JkWM.cjs +0 -1
  441. package/dist/tooth-28-Z9oWqjo0.cjs +0 -1
  442. package/dist/tooth-31-BrYqmkTi.cjs +0 -1
  443. package/dist/tooth-32-BNNR0oCZ.cjs +0 -1
  444. package/dist/tooth-33-DuxvqO2J.cjs +0 -1
  445. package/dist/tooth-34-BCSCXMB6.cjs +0 -1
  446. package/dist/tooth-35-BLUXkX88.cjs +0 -1
  447. package/dist/tooth-36-IrKHYqlA.cjs +0 -1
  448. package/dist/tooth-37-BYqpdMwo.cjs +0 -1
  449. package/dist/tooth-38-B_eNXXdu.cjs +0 -1
  450. package/dist/tooth-41-Ddva4Ot8.cjs +0 -1
  451. package/dist/tooth-42-szcDqlM0.cjs +0 -1
  452. package/dist/tooth-43-B3ka6rQm.cjs +0 -1
  453. package/dist/tooth-44-CazyQucj.cjs +0 -1
  454. package/dist/tooth-45-B4HQtc8n.cjs +0 -1
  455. package/dist/tooth-46-BPM40gbG.cjs +0 -1
  456. package/dist/tooth-47-Dvr20dlh.cjs +0 -1
  457. package/dist/tooth-48-Bd8ljGsF.cjs +0 -1
  458. package/dist/tooth-51-OBpwCOF3.cjs +0 -1
  459. package/dist/tooth-52-aKxyHcmq.cjs +0 -1
  460. package/dist/tooth-53-vCwJjTOc.cjs +0 -1
  461. package/dist/tooth-54-DsWu2iFy.cjs +0 -1
  462. package/dist/tooth-55-BxC1X2Dn.cjs +0 -1
  463. package/dist/tooth-61-BbLvxMQi.cjs +0 -1
  464. package/dist/tooth-62-CmTkWczP.cjs +0 -1
  465. package/dist/tooth-63-DI7l_2qI.cjs +0 -1
  466. package/dist/tooth-64-B21sOsJh.cjs +0 -1
  467. package/dist/tooth-65-D2ZC2VEr.cjs +0 -1
  468. package/dist/tooth-71-D473PPO5.cjs +0 -1
  469. package/dist/tooth-72-Drh1wnNu.cjs +0 -1
  470. package/dist/tooth-73-DzlwYI23.cjs +0 -1
  471. package/dist/tooth-74-8aGvcZPg.cjs +0 -1
  472. package/dist/tooth-75-BFK7At_r.cjs +0 -1
  473. package/dist/tooth-81-BZmR-I0M.cjs +0 -1
  474. package/dist/tooth-82-euVfUUZV.cjs +0 -1
  475. package/dist/tooth-83-KV010j64.cjs +0 -1
  476. package/dist/tooth-84-BBg1RjhZ.cjs +0 -1
  477. package/dist/tooth-85-Cr-kc1wM.cjs +0 -1
  478. package/dist/vuetifyConfig.umd.cjs +0 -1
  479. package/src/assets/apTokens.scss +0 -343
  480. package/src/assets/overrides/_container.scss +0 -36
  481. package/src/assets/tokens.scss +0 -388
  482. package/src/composables/date/tests/useDateFormat.spec.ts +0 -67
  483. package/src/composables/date/useDateFormat.ts +0 -110
  484. package/src/composables/date/useDateInitialization.ts +0 -92
  485. package/src/designTokens/apColors.md +0 -66
  486. package/src/designTokens/cnamColors.md +0 -193
  487. package/src/designTokens/paColors.md +0 -66
  488. package/src/designTokens/tokens/json/contextual-tokens.json +0 -156
  489. package/src/designTokens/tokens/json/primitives.json +0 -209
  490. package/src/designTokens/tokens/json/semantic.json +0 -120
  491. package/src/designTokens/utils/convertGaps.ts +0 -11
  492. package/src/stories/Accessibilite/Avancement/Avancement.mdx +0 -533
  493. package/src/stories/Accessibilite/Avancement/Avancement.stories.ts +0 -306
@@ -1,6 +1,7 @@
1
1
  import { mount } from '@vue/test-utils'
2
- import { describe, expect, it } from 'vitest'
2
+ import { describe, expect, it, vi } from 'vitest'
3
3
  import { VList } from 'vuetify/components'
4
+ import { nextTick } from 'vue'
4
5
  import SySelect from '../SySelect.vue'
5
6
 
6
7
  type ItemType = {
@@ -129,7 +130,7 @@ describe('SySelect.vue', () => {
129
130
  it('renders error messages when provided', () => {
130
131
  const errorMessages = ['Error 1']
131
132
  const wrapper = mount(SySelect, {
132
- props: { errorMessages, hideMessages: false },
133
+ props: { errorMessages, hideDetails: false },
133
134
  attachTo: document.body,
134
135
  })
135
136
  const message = wrapper.find('.v-messages__message')
@@ -139,6 +140,99 @@ describe('SySelect.vue', () => {
139
140
  wrapper.unmount()
140
141
  })
141
142
 
143
+ describe('hideDetails', () => {
144
+ it('masque les messages de validation quand hideDetails est true', async () => {
145
+ const wrapper = mount(SySelect, {
146
+ props: {
147
+ errorMessages: ['Erreur de test'],
148
+ hideDetails: true,
149
+ },
150
+ attachTo: document.body,
151
+ })
152
+
153
+ expect(wrapper.find('.v-messages__message').exists()).toBe(false)
154
+
155
+ wrapper.unmount()
156
+ })
157
+
158
+ it('affiche les messages de validation quand hideDetails est false', async () => {
159
+ const wrapper = mount(SySelect, {
160
+ props: {
161
+ errorMessages: ['Erreur de test'],
162
+ hideDetails: false,
163
+ },
164
+ attachTo: document.body,
165
+ })
166
+
167
+ const message = wrapper.find('.v-messages__message')
168
+ expect(message.exists()).toBe(true)
169
+ expect(message.text()).toContain('Erreur de test')
170
+
171
+ wrapper.unmount()
172
+ })
173
+
174
+ it('affiche la zone de messages par défaut (hideDetails vaut false par défaut)', () => {
175
+ const wrapper = mount(SySelect, {
176
+ attachTo: document.body,
177
+ })
178
+
179
+ expect(wrapper.find('.v-messages').exists()).toBe(true)
180
+
181
+ wrapper.unmount()
182
+ })
183
+
184
+ it('n\'affiche pas le helpText en dessous du champ quand hideDetails est true et qu\'il y a des erreurs', () => {
185
+ const wrapper = mount(SySelect, {
186
+ props: {
187
+ helpText: 'Texte d\'aide',
188
+ errorMessages: ['Erreur de test'],
189
+ hideDetails: true,
190
+ },
191
+ attachTo: document.body,
192
+ })
193
+
194
+ expect(wrapper.find('.help-text-below').exists()).toBe(false)
195
+
196
+ wrapper.unmount()
197
+ })
198
+
199
+ it('affiche le helpText en dessous du champ quand hideDetails est false et qu\'il y a des erreurs', () => {
200
+ const wrapper = mount(SySelect, {
201
+ props: {
202
+ helpText: 'Texte d\'aide',
203
+ errorMessages: ['Erreur de test'],
204
+ hideDetails: false,
205
+ },
206
+ attachTo: document.body,
207
+ })
208
+
209
+ expect(wrapper.find('.help-text-below').exists()).toBe(true)
210
+ expect(wrapper.find('.help-text-below').text()).toContain('Texte d\'aide')
211
+
212
+ wrapper.unmount()
213
+ })
214
+ })
215
+
216
+ it('keeps the label active when a validation error is displayed', async () => {
217
+ const wrapper = mount(SySelect, {
218
+ props: {
219
+ items: [{ text: 'Option 1', value: '1' }],
220
+ label: 'Option',
221
+ required: true,
222
+ },
223
+ attachTo: document.body,
224
+ })
225
+
226
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- exposed method is not part of the inferred public instance type
227
+ const isValid = await (wrapper.vm as any).validateOnSubmit()
228
+ await nextTick()
229
+
230
+ expect(isValid).toBe(false)
231
+ expect(wrapper.find('.v-field').classes()).toContain('v-field--active')
232
+
233
+ wrapper.unmount()
234
+ })
235
+
142
236
  it('does not render error messages when not provided', () => {
143
237
  const wrapper = mount(SySelect, {
144
238
  attachTo: document.body,
@@ -487,26 +581,206 @@ describe('SySelect.vue', () => {
487
581
  wrapper.unmount()
488
582
  })
489
583
 
490
- it('n\'affiche pas d\'erreur quand disableErrorHandling est true', async () => {
584
+ it('n\'affiche pas d\'erreur à l\'ouverture du menu mais seulement à la fermeture', async () => {
491
585
  const wrapper = mount(SySelect, {
492
586
  props: {
493
587
  required: true,
494
588
  label: 'Test Label',
495
589
  modelValue: undefined,
496
- disableErrorHandling: true,
590
+ items: [
591
+ { text: 'Option 1', value: '1' },
592
+ { text: 'Option 2', value: '2' },
593
+ ],
497
594
  },
498
595
  attachTo: document.body,
499
596
  })
500
597
 
598
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- This is a generic type
599
+ const instance = wrapper.vm as any
600
+
601
+ // Au départ, pas d'erreur
602
+ expect(instance.hasError).toBe(false)
603
+
604
+ // Ouverture du menu - l'erreur ne doit pas s'afficher
501
605
  await wrapper.find('.v-field').trigger('click')
502
606
  await wrapper.vm.$nextTick()
607
+ expect(instance.hasError).toBe(false)
608
+ expect(instance.isOpen).toBe(true)
609
+
610
+ // Fermeture du menu sans sélection - l'erreur doit s'afficher
503
611
  await wrapper.find('.v-field').trigger('click')
504
612
  await wrapper.vm.$nextTick()
613
+ expect(instance.hasError).toBe(true)
614
+ expect(instance.isOpen).toBe(false)
615
+
616
+ wrapper.unmount()
617
+ })
618
+
619
+ describe('disableErrorHandling', () => {
620
+ it('n\'affiche pas d\'erreur pour un champ requis sans valeur quand disableErrorHandling est true', async () => {
621
+ const wrapper = mount(SySelect, {
622
+ props: {
623
+ required: true,
624
+ label: 'Test Label',
625
+ modelValue: undefined,
626
+ disableErrorHandling: true,
627
+ },
628
+ attachTo: document.body,
629
+ })
630
+
631
+ await wrapper.find('.v-field').trigger('click')
632
+ await wrapper.vm.$nextTick()
633
+ await wrapper.find('.v-field').trigger('click')
634
+ await wrapper.vm.$nextTick()
635
+
636
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- This is a generic type
637
+ const instance = wrapper.vm as any
638
+ expect(instance.hasError).toBe(false)
639
+
640
+ wrapper.unmount()
641
+ })
642
+
643
+ it('ignore les errorMessages quand disableErrorHandling est true', () => {
644
+ const wrapper = mount(SySelect, {
645
+ props: {
646
+ errorMessages: ['Erreur forcée'],
647
+ disableErrorHandling: true,
648
+ },
649
+ attachTo: document.body,
650
+ })
651
+
652
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- This is a generic type
653
+ const instance = wrapper.vm as any
654
+ expect(instance.hasError).toBe(false)
655
+ expect(wrapper.find('.v-messages__message').exists()).toBe(false)
656
+
657
+ wrapper.unmount()
658
+ })
659
+
660
+ it('n\'évalue pas les customRules quand disableErrorHandling est true', async () => {
661
+ const wrapper = mount(SySelect, {
662
+ props: {
663
+ modelValue: '1',
664
+ disableErrorHandling: true,
665
+ isValidateOnBlur: false,
666
+ customRules: [{
667
+ type: 'custom',
668
+ options: {
669
+ validate: () => false,
670
+ message: 'Toujours invalide',
671
+ },
672
+ }],
673
+ },
674
+ attachTo: document.body,
675
+ })
676
+
677
+ await wrapper.vm.$nextTick()
678
+
679
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- This is a generic type
680
+ const instance = wrapper.vm as any
681
+ expect(instance.hasError).toBe(false)
682
+ expect(wrapper.find('.v-messages__message').exists()).toBe(false)
683
+
684
+ wrapper.unmount()
685
+ })
686
+
687
+ it('affiche les erreurs normalement quand disableErrorHandling est false', async () => {
688
+ const wrapper = mount(SySelect, {
689
+ props: {
690
+ errorMessages: ['Erreur visible'],
691
+ disableErrorHandling: false,
692
+ },
693
+ attachTo: document.body,
694
+ })
695
+
696
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- This is a generic type
697
+ const instance = wrapper.vm as any
698
+ expect(instance.hasError).toBe(true)
699
+ expect(wrapper.find('.v-messages__message').text()).toContain('Erreur visible')
700
+
701
+ wrapper.unmount()
702
+ })
703
+ })
704
+
705
+ it('valide immédiatement quand isValidateOnBlur est false', async () => {
706
+ const wrapper = mount(SySelect, {
707
+ props: {
708
+ items: [
709
+ { text: 'Option 1', value: '1' },
710
+ { text: 'Option 2', value: '2' },
711
+ ],
712
+ label: 'Test Label',
713
+ modelValue: undefined,
714
+ isValidateOnBlur: false,
715
+ customRules: [{
716
+ type: 'custom',
717
+ options: {
718
+ validate: (value: unknown) => value === '2',
719
+ message: 'Test error message',
720
+ },
721
+ }],
722
+ },
723
+ attachTo: document.body,
724
+ })
505
725
 
506
726
  // eslint-disable-next-line @typescript-eslint/no-explicit-any -- This is a generic type
507
727
  const instance = wrapper.vm as any
508
728
  expect(instance.hasError).toBe(false)
509
729
 
730
+ // Sélection de Option 1 via interaction utilisateur
731
+ await wrapper.find('.v-field').trigger('click')
732
+ await wrapper.vm.$nextTick()
733
+ await wrapper.findComponent(VList).findAll('.v-list-item').at(0)!.trigger('click')
734
+ await wrapper.setProps({ modelValue: '1' })
735
+
736
+ await vi.waitUntil(() => instance.hasError === true)
737
+ expect(wrapper.find('.v-messages').text()).toContain('Test error message')
738
+
739
+ // Sélection de Option 2 via interaction utilisateur
740
+ await wrapper.find('.v-field').trigger('click')
741
+ await wrapper.vm.$nextTick()
742
+ await wrapper.findComponent(VList).findAll('.v-list-item').at(1)!.trigger('click')
743
+ await wrapper.setProps({ modelValue: '2' })
744
+
745
+ await vi.waitUntil(() => instance.hasError === false)
746
+ expect(wrapper.find('.v-messages').text()).not.toContain('Test error message')
747
+
748
+ wrapper.unmount()
749
+ })
750
+
751
+ it('masque le message de succes mais conserve l\'etat de succes quand showSuccessMessages est false', async () => {
752
+ const wrapper = mount(SySelect, {
753
+ props: {
754
+ items: [
755
+ { text: 'Option 1', value: '1' },
756
+ { text: 'Option 2', value: '2' },
757
+ ],
758
+ label: 'Test Label',
759
+ modelValue: undefined,
760
+ isValidateOnBlur: false,
761
+ showSuccessMessages: false,
762
+ customSuccessRules: [{
763
+ type: 'custom',
764
+ options: {
765
+ validate: (value: unknown) => value === '2',
766
+ successMessage: 'Test success message',
767
+ },
768
+ }],
769
+ },
770
+ attachTo: document.body,
771
+ })
772
+
773
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- This is a generic type
774
+ const instance = wrapper.vm as any
775
+ expect(instance.hasSuccess).toBe(false)
776
+
777
+ await wrapper.setProps({ modelValue: '2' })
778
+
779
+ await vi.waitUntil(() => instance.hasSuccess === true)
780
+ expect(wrapper.find('.success-field').exists()).toBe(true)
781
+ expect(wrapper.findAll('.v-messages__message')).toHaveLength(0)
782
+ expect(wrapper.text()).not.toContain('Test success message')
783
+
510
784
  wrapper.unmount()
511
785
  })
512
786
  })
@@ -175,7 +175,7 @@
175
175
 
176
176
  const errors = computed(() => validation.errors.value)
177
177
  const warnings = computed(() => validation.warnings.value)
178
- const successes = computed(() => validation.successes.value)
178
+ const displaySuccesses = computed(() => validation.displaySuccesses.value)
179
179
 
180
180
  const labelId = computed(() => (props.id ? `${props.id}-label` : undefined))
181
181
  const computedAriaLabelledby = computed(() => {
@@ -267,8 +267,8 @@
267
267
  >
268
268
  <VMessages
269
269
  ref="messagesRef"
270
- :active="hasError || hasWarning || (hasSuccess && props.showSuccessMessages)"
271
- :messages="hasError ? errors : (hasWarning ? warnings : (hasSuccess && props.showSuccessMessages ? successes : []))"
270
+ :active="hasError || hasWarning || (hasSuccess && displaySuccesses.length > 0)"
271
+ :messages="hasError ? errors : (hasWarning ? warnings : (hasSuccess ? displaySuccesses : []))"
272
272
  />
273
273
  </div>
274
274
 
@@ -51,4 +51,9 @@ La propriété `controlsIds` permet d'établir une relation entre une case à co
51
51
 
52
52
  <Canvas of={SyCheckboxStories.WithControlsIds} />
53
53
 
54
+ ## Mode Décoratif
55
+
56
+ La propriété `decorative` permet d'afficher la case à cocher uniquement de manière visuelle, sans rendre l'élément interactif natif (`<input type="checkbox">`) dans le DOM.
57
+ Ce mode est essentiel lorsque la case à cocher est imbriquée à l'intérieur d'un autre élément interactif (comme une ligne d'un tableau cliquable ou une option de liste déroulante). Il permet de respecter les règles d'accessibilité (qui interdisent l'imbrication de contrôles interactifs) tout en offrant le rendu visuel attendu. Le composant parent devient alors responsable de l'annonce de l'état (ex: via `aria-selected`).
58
+
54
59
  <a href="/?path=/docs/guide-du-dev-guide-de-validation-des-formulaires--docs" className="action-link">Pour plus d'informations sur la validation, consultez le guide de validation des formulaires.</a>
@@ -36,6 +36,7 @@
36
36
  falseValue?: unknown
37
37
  controlsIds?: string[]
38
38
  displayAsterisk?: boolean
39
+ decorative?: boolean
39
40
  }>(),
40
41
  {
41
42
  modelValue: false,
@@ -66,11 +67,15 @@
66
67
  falseValue: () => false,
67
68
  controlsIds: () => [],
68
69
  displayAsterisk: false,
70
+ decorative: false,
69
71
  },
70
72
  )
71
73
 
72
74
  const emit = defineEmits(['update:modelValue', 'update:indeterminate', 'change'])
73
75
 
76
+ import SyIcon from '@/components/Customs/SyIcon/SyIcon.vue'
77
+ import { mdiCheckboxBlankOutline, mdiCheckboxMarked, mdiMinusBox } from '@mdi/js'
78
+
74
79
  const checkboxRef = ref<VCheckbox | null>(null)
75
80
 
76
81
  const internalIndeterminate = ref(props.indeterminate)
@@ -199,7 +204,7 @@
199
204
 
200
205
  const errors = computed(() => validation.errors.value)
201
206
  const warnings = computed(() => validation.warnings.value)
202
- const successes = computed(() => validation.successes.value)
207
+ const displaySuccesses = computed(() => validation.displaySuccesses.value)
203
208
 
204
209
  const ariaChecked = computed(() => {
205
210
  if (internalIndeterminate.value) return 'mixed'
@@ -308,7 +313,31 @@
308
313
 
309
314
  <template>
310
315
  <div>
316
+ <!-- Rendu purement visuel/décoratif, ignoré par les lecteurs d'écran -->
317
+ <div
318
+ v-if="props.decorative"
319
+ class="d-flex align-center pointer-events-none sy-checkbox-decorative"
320
+ aria-hidden="true"
321
+ >
322
+ <SyIcon
323
+ :icon="internalIndeterminate ? mdiMinusBox : (model ? mdiCheckboxMarked : mdiCheckboxBlankOutline)"
324
+ :color="(model || internalIndeterminate) ? props.color : '#727273'"
325
+ :class="{'text-disabled': props.disabled}"
326
+ :decorative="true"
327
+ class="mr-2"
328
+ />
329
+ <slot name="label">
330
+ <span
331
+ v-if="generatedLabel"
332
+ :class="{'text-disabled': props.disabled}"
333
+ :style="{ color: labelColor }"
334
+ >{{ generatedLabel }}</span>
335
+ </slot>
336
+ </div>
337
+
338
+ <!-- Rendu interactif standard -->
311
339
  <VCheckbox
340
+ v-else
312
341
  :id="props.id"
313
342
  ref="checkboxRef"
314
343
  v-model="model"
@@ -318,6 +347,11 @@
318
347
  :aria-labelledby="props.ariaLabelledby"
319
348
  :title="props.title"
320
349
  :color="props.color"
350
+ :class="{
351
+ 'success-field': hasSuccess && !hasError && !hasWarning,
352
+ 'warning-field': hasWarning && !hasError,
353
+ 'error-field': hasError,
354
+ }"
321
355
  :style="{ color: labelColor }"
322
356
  :disabled="props.disabled"
323
357
  :readonly="props.readonly"
@@ -325,7 +359,7 @@
325
359
  :density="props.density"
326
360
  :error="hasError"
327
361
  :error-messages="errors"
328
- :messages="hasError ? errors : (hasWarning ? warnings : (hasSuccess && props.showSuccessMessages ? successes : []))"
362
+ :messages="hasError ? errors : (hasWarning ? warnings : (hasSuccess ? displaySuccesses : []))"
329
363
  :indeterminate="internalIndeterminate"
330
364
  :true-value="props.trueValue"
331
365
  :false-value="props.falseValue"
@@ -358,6 +392,22 @@
358
392
  </template>
359
393
 
360
394
  <style scoped>
395
+ .success-field :deep(.v-messages__message) {
396
+ color: rgb(var(--v-theme-success)) !important;
397
+ }
398
+
399
+ .success-field :deep(.v-selection-control__input) {
400
+ color: rgb(var(--v-theme-success));
401
+ }
402
+
403
+ .warning-field :deep(.v-messages__message) {
404
+ color: rgb(var(--v-theme-borderWarning)) !important;
405
+ }
406
+
407
+ .warning-field :deep(.v-selection-control__input) {
408
+ color: rgb(var(--v-theme-borderWarning));
409
+ }
410
+
361
411
  :deep(.v-input--dirty .v-selection-control__input) {
362
412
  color: v-bind('props.color');
363
413
  }
@@ -143,7 +143,19 @@ import '@/stories/styles/shared.css';
143
143
  <p>
144
144
  Cette relation est établie via la propriété <code>controlsIds</code> qui liste les identifiants des cases à cocher enfants.
145
145
  </p>
146
- </div>
146
+ </div>
147
+
148
+ <div className="decorative-mode-section">
149
+ <h2>Mode Décoratif (Imbrication)</h2>
150
+ <p>
151
+ Le composant SyCheckbox dispose d'une propriété <code>decorative</code> permettant de l'utiliser de manière purement visuelle.
152
+ Dans ce mode, la case à cocher n'inclut pas d'élément <code>&lt;input type="checkbox"&gt;</code> natif et est masquée aux lecteurs d'écran via <code>aria-hidden="true"</code>.
153
+ </p>
154
+ <p>
155
+ Ce mode est <strong>indispensable pour respecter l'accessibilité</strong> lorsque la case à cocher doit être imbriquée dans un autre composant interactif (par exemple, une option de <code>listbox</code> ou une ligne cliquable de tableau).
156
+ Les règles WAI-ARIA interdisent l'imbrication d'éléments interactifs. Le composant parent assume alors la responsabilité d'annoncer l'état de sélection (ex: via <code>aria-selected</code> ou <code>aria-checked</code> au niveau de la ligne).
157
+ </p>
158
+ </div>
147
159
 
148
160
  <div className="best-practices">
149
161
  <h2>Bonnes pratiques d'utilisation</h2>
@@ -210,6 +222,7 @@ import '@/stories/styles/shared.css';
210
222
  .aria-management-section h2,
211
223
  .tri-state-section h2,
212
224
  .parent-child-section h2,
225
+ .decorative-mode-section h2,
213
226
  .best-practices h2,
214
227
  .resources-section h2 {
215
228
  border-bottom: 2px solid #eaecef;
@@ -279,7 +292,8 @@ import '@/stories/styles/shared.css';
279
292
  }
280
293
 
281
294
  .tri-state-section,
282
- .parent-child-section {
295
+ .parent-child-section,
296
+ .decorative-mode-section {
283
297
  background-color: #f0f7ff;
284
298
  padding: 20px;
285
299
  border-radius: 8px;
@@ -287,7 +301,8 @@ import '@/stories/styles/shared.css';
287
301
  }
288
302
 
289
303
  .tri-state-section p,
290
- .parent-child-section p {
304
+ .parent-child-section p,
305
+ .decorative-mode-section p {
291
306
  line-height: 1.6;
292
307
  }
293
308
 
@@ -352,8 +352,6 @@
352
352
  </template>
353
353
 
354
354
  <style lang="scss" scoped>
355
- @use '@/assets/tokens';
356
-
357
355
  .sy-pagination {
358
356
  display: flex;
359
357
  align-items: center;
@@ -2,6 +2,7 @@
2
2
 
3
3
  import { computed, nextTick, onMounted, onUpdated, ref, watch } from 'vue'
4
4
  import type { VRadioGroup } from 'vuetify/components'
5
+ import { VMessages } from 'vuetify/components'
5
6
  import { useValidation, type ValidationRule } from '@/composables/validation/useValidation'
6
7
  import { useValidatable } from '@/composables/validation/useValidatable'
7
8
  import { locales } from './locales'
@@ -148,7 +149,7 @@
148
149
 
149
150
  const errors = computed(() => validation.errors.value)
150
151
  const warnings = computed(() => validation.warnings.value)
151
- const successes = computed(() => validation.successes.value)
152
+ const displaySuccesses = computed(() => validation.displaySuccesses.value)
152
153
 
153
154
  const getAriaChecked = (value: PropertyKey) => {
154
155
  return model.value === value ? 'true' : 'false'
@@ -224,10 +225,6 @@
224
225
  :error="hasError"
225
226
  :error-messages="hasError ? errors : undefined"
226
227
  :aria-describedby="messageId"
227
- :messages="hasError ? errors :
228
- hasWarning ? warnings :
229
- (hasSuccess && props.showSuccessMessages ? successes : [])
230
- "
231
228
  >
232
229
  <v-radio
233
230
  v-for="opt in props.options"
@@ -258,14 +255,35 @@
258
255
  {{ locales.labelledbyMessage }} <span v-if="props.label">{{ props.label + (props.displayAsterisk ? '*' : '')
259
256
  }}</span>.
260
257
  </span>
258
+ <template
259
+ v-if="!hasError && (hasWarning || hasSuccess)"
260
+ #details
261
+ >
262
+ <div class="v-input__details sy-radio-group__messages">
263
+ <VMessages
264
+ :active="hasWarning || (hasSuccess && displaySuccesses.length > 0)"
265
+ :messages="hasWarning ? warnings : displaySuccesses"
266
+ />
267
+ </div>
268
+ </template>
261
269
  </v-radio-group>
262
270
  </template>
263
271
 
264
272
  <style scoped>
273
+ :deep(.v-input__details) {
274
+ display: block !important;
275
+ padding-inline: 0 !important;
276
+ margin-top: -10px !important;
277
+ }
278
+
265
279
  :deep(.v-selection-control--error .v-selection-control__input) {
266
280
  color: rgb(var(--v-theme-error));
267
281
  }
268
282
 
283
+ .sy-radio-group__messages {
284
+ align-items: flex-start;
285
+ }
286
+
269
287
  .sb-show-main.sb-main-centered #storybook-root {
270
288
  margin: none !important;
271
289
  }
@@ -9,16 +9,6 @@ import * as SyTabsStories from "./SyTabs.stories";
9
9
  <p>Le composant `SyTabs` est un système de navigation par onglets conforme au Design System qui respecte les règles d'accessibilité <abbr title="Référentiel Général d'Amélioration de l'Accessibilité">RGAA</abbr>. Il permet d'organiser le contenu en sections navigables facilement via une interface à onglets.</p>
10
10
  </div>
11
11
 
12
- Il implémente les fonctionnalités suivantes :
13
-
14
- - Navigation complète au clavier
15
- - Attributs ARIA appropriés
16
- - Gestion du focus accessible
17
- - Structure HTML sémantique
18
- - Design personnalisable
19
-
20
- <Canvas of={SyTabsStories.Default} />
21
-
22
12
  ## API
23
13
 
24
14
  <Controls of={SyTabsStories.Default} />
@@ -36,54 +26,6 @@ export interface TabItem {
36
26
  }
37
27
  ```
38
28
 
39
- <div className="header">
40
- <h1>Accessibilité</h1>
41
- </div>
42
-
43
- Le composant `SyTabs` respecte les critères d'accessibilité RGAA suivants :
44
-
45
- ### Structure sémantique
46
-
47
- - Utilise les éléments `<nav>`, `<ul>` et `<li>` pour une structure de navigation sémantique
48
- - Associe chaque onglet à son panneau de contenu via les attributs `aria-controls` et `aria-labelledby`
49
- - Utilise l'attribut `aria-label="Onglets de navigation"` sur l'élément `<nav>` pour identifier la navigation
50
-
51
- ### Rôles ARIA
52
-
53
- - `role="tablist"` sur le conteneur de navigation
54
- - `role="presentation"` sur les éléments de liste
55
- - `role="tab"` sur les boutons d'onglets
56
- - `role="tabpanel"` sur les panneaux de contenu
57
-
58
- ### États et propriétés
59
-
60
- - `aria-selected="true|false"` indique l'onglet actif
61
- - Attribut `hidden` sur les panneaux non actifs
62
- - Focus visible avec outline adapté au design system
63
-
64
- ### Navigation au clavier
65
-
66
- Le composant implémente toutes les interactions clavier recommandées par les [Pratiques Authoring WAI-ARIA 1.2](https://www.w3.org/WAI/ARIA/apg/patterns/tabpanel/) :
67
-
68
- - **Flèches gauche/droite** : Navigation entre les onglets
69
- - **Touches Home/End** : Accès au premier/dernier onglet
70
- - **Entrée/Espace** : Activation de l'onglet
71
- - **Échap** : Gestion du focus
72
-
73
- ### Contraste et visibilité
74
-
75
- - Contraste suffisant entre le texte et le fond (minimum 4.5:1)
76
- - Indication visuelle claire de l'onglet actif (changement de couleur et bordure)
77
- - Focus visible conforme aux exigences RGAA
78
-
79
- ### Tests d'accessibilité
80
-
81
- Le composant a été testé avec :
82
- - Lecteurs d'écran (NVDA, VoiceOver)
83
- - Navigation clavier
84
- - Outils de vérification de contraste
85
-
86
- <Canvas of={SyTabsStories.Default} />
87
29
 
88
30
  ## Personnalisation
89
31