@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,5 +1,5 @@
1
1
  <script setup lang="ts">
2
- import { type PropType, computed, ref, watch } from 'vue'
2
+ import { type PropType, computed, ref, watch, nextTick } from 'vue'
3
3
 
4
4
  import EmotionPicker from './EmotionPicker/EmotionPicker.vue'
5
5
  import NumberPicker from './NumberPicker/NumberPicker.vue'
@@ -44,13 +44,19 @@
44
44
  type: Boolean,
45
45
  default: false,
46
46
  },
47
+ freeTextLabel: {
48
+ type: String,
49
+ default: 'Pouvez-vous nous en dire plus ?',
50
+ },
47
51
  })
48
52
 
49
- const emit = defineEmits(['update:modelValue'])
53
+ const emit = defineEmits<{
54
+ (e: 'update:modelValue', value: number): void
55
+ }>()
50
56
 
51
- const alertTypeEnumRef = ref(AlertTypeEnum)
52
57
  const internalValue = ref(-1)
53
58
  const displayAdditionalContent = ref(false)
59
+ const ratingPickerRef = ref<{ focus?: () => void } | null>(null)
54
60
 
55
61
  const ratingComponent = computed(() => {
56
62
  if (props.type === RatingEnum.EMOTION) {
@@ -71,17 +77,29 @@
71
77
  return undefined
72
78
  })
73
79
 
74
- const hasAnswered = computed(() => props.modelValue !== -1)
75
-
80
+ const hasAnswered = computed(() => internalValue.value !== -1)
76
81
  function showAdditionalContent(value: number): void {
77
- const starsUnsatisfied = props.type === RatingEnum.STARS && value <= 3
78
- const numberUnsatisfied = props.type === RatingEnum.NUMBER && value <= 7
79
- const isEmotion = props.type === RatingEnum.EMOTION
80
- const isEmotionLow = props.twoEmotions ? value < 2 : value < 3
81
- const emotionUnsatisfied = isEmotion && isEmotionLow
82
- if (starsUnsatisfied || numberUnsatisfied || emotionUnsatisfied) {
83
- displayAdditionalContent.value = true
82
+ const max = props.type === RatingEnum.EMOTION
83
+ ? (props.twoEmotions ? 2 : 3)
84
+ : props.type === RatingEnum.STARS
85
+ ? 5
86
+ : 10
87
+
88
+ if (value < 1 || value > max) {
89
+ displayAdditionalContent.value = false
90
+ return
84
91
  }
92
+
93
+ const starsUnsatisfied = props.type === RatingEnum.STARS && value <= 2
94
+ const numberUnsatisfied = props.type === RatingEnum.NUMBER && value <= 7
95
+ const emotionUnsatisfied = props.type === RatingEnum.EMOTION
96
+ && (
97
+ (props.twoEmotions && value < 2)
98
+ || (!props.twoEmotions && value < 3)
99
+ )
100
+
101
+ displayAdditionalContent.value
102
+ = starsUnsatisfied || numberUnsatisfied || emotionUnsatisfied
85
103
  }
86
104
 
87
105
  function setValue(value: number): void {
@@ -92,7 +110,18 @@
92
110
 
93
111
  watch(() => props.modelValue, (newVal) => {
94
112
  internalValue.value = newVal
113
+ showAdditionalContent(newVal)
95
114
  }, { immediate: true })
115
+
116
+ // focus auto
117
+ watch(
118
+ () => props.type,
119
+ async () => {
120
+ await nextTick()
121
+ ratingPickerRef.value?.focus?.()
122
+ },
123
+ { immediate: true },
124
+ )
96
125
  </script>
97
126
 
98
127
  <template>
@@ -104,9 +133,10 @@
104
133
  >
105
134
  <component
106
135
  :is="ratingComponent"
136
+ ref="ratingPickerRef"
107
137
  :model-value="internalValue"
108
138
  :label="props.label"
109
- :length="length"
139
+ :length="length || undefined"
110
140
  :readonly="props.readonly || hasAnswered"
111
141
  :item-labels="props.itemLabels || undefined"
112
142
  @update:model-value="setValue"
@@ -123,14 +153,22 @@
123
153
  v-if="!props.hideAlert"
124
154
  :class="{ 'mb-4': displayAdditionalContent }"
125
155
  outlined
126
- :type="alertTypeEnumRef.SUCCESS"
156
+ :type="AlertTypeEnum.SUCCESS"
127
157
  role="status"
158
+ aria-live="polite"
128
159
  class="mt-4"
129
160
  >
130
161
  {{ locales.thanks }}
131
162
  </SyAlert>
132
163
 
133
- <slot v-if="displayAdditionalContent" />
164
+ <div
165
+ v-if="displayAdditionalContent"
166
+ role="region"
167
+ aria-live="polite"
168
+ class="mt-4"
169
+ >
170
+ <slot />
171
+ </div>
134
172
  </template>
135
173
  </div>
136
174
  </template>
@@ -146,4 +184,22 @@
146
184
  text-align: center;
147
185
  }
148
186
 
187
+ .sy-rating-picker__free-text {
188
+ display: flex;
189
+ flex-direction: column;
190
+ gap: 0.5rem;
191
+ }
192
+
193
+ .sy-rating-picker__free-text-label {
194
+ font-weight: 600;
195
+ }
196
+
197
+ .sy-rating-picker__free-text-textarea {
198
+ min-height: 120px;
199
+ padding: 0.75rem;
200
+ border: 1px solid #ccc;
201
+ border-radius: 0.375rem;
202
+ resize: vertical;
203
+ font: inherit;
204
+ }
149
205
  </style>
@@ -1,9 +1,10 @@
1
1
  <script lang="ts" setup>
2
- import { ref, type PropType, onMounted } from 'vue'
2
+ import { ref, type PropType, onMounted, toRef } from 'vue'
3
3
  import { RatingEnum, useRating } from '../Rating'
4
4
  import { mdiStarOutline, mdiStar } from '@mdi/js'
5
5
  import SyIcon from '@/components/Customs/SyIcon/SyIcon.vue'
6
6
  import { locales } from '../locales'
7
+ import { useRatingFocus } from '../useRatingFocus'
7
8
 
8
9
  const props = defineProps({
9
10
  label: {
@@ -41,37 +42,26 @@
41
42
  return (isHovered && !hasAnswered.value) || isActive
42
43
  }
43
44
 
44
- const ratingElement = ref<HTMLDivElement[]>([])
45
- function focusNextElement(index: number) {
46
- const currentIndex = ratingElement.value?.findIndex(el => el === ratingElement.value[index]) ?? -1
47
- const nextIndex = currentIndex < (props.length - 1) ? currentIndex + 1 : props.length - 1
48
- const nextElem = ratingElement.value?.[nextIndex]
49
- nextElem?.focus()
50
- }
51
-
52
- function focusPrevElement(index: number) {
53
- const currentIndex = ratingElement.value?.findIndex(el => el === ratingElement.value[index]) ?? -1
54
- const prevIndex = currentIndex > 0 ? currentIndex - 1 : 0
55
- const prevElem = ratingElement.value?.[prevIndex]
56
- prevElem?.focus()
57
- }
45
+ const {
46
+ ratingElement,
47
+ initFocus,
48
+ selectAndFocus,
49
+ focusNextElement,
50
+ focusPrevElement,
51
+ focus,
52
+ } = useRatingFocus({
53
+ length: toRef(props, 'length'),
54
+ modelValue: toRef(props, 'modelValue'),
55
+ selectValue: emitInputEvent,
56
+ wrap: true,
57
+ })
58
58
 
59
- function setFocus(index: number) {
60
- ratingElement.value.forEach((el, i) => {
61
- if (i === index) {
62
- el?.setAttribute('tabindex', '0')
63
- }
64
- else {
65
- el?.setAttribute('tabindex', '-1')
66
- }
67
- })
68
- }
59
+ defineExpose({
60
+ focus,
61
+ })
69
62
 
70
63
  onMounted(() => {
71
- ratingElement.value[0]?.setAttribute('tabindex', '0')
72
- for (let i = 1; i < ratingElement.value.length; i++) {
73
- ratingElement.value[i]?.setAttribute('tabindex', '-1')
74
- }
64
+ initFocus()
75
65
  })
76
66
  </script>
77
67
 
@@ -93,19 +83,20 @@
93
83
  ref="ratingElement"
94
84
  class="sy-stars-picker__item d-flex align-center justify-center"
95
85
  role="radio"
86
+ :tabindex="-1"
96
87
  :aria-disabled="(props.readonly || hasAnswered) ? 'true' : undefined"
97
- :aria-checked="isActive(index) ? 'true' : undefined"
88
+ :aria-checked="isActive(index) ? 'true' : 'false'"
98
89
  @mouseover="hoverIndex = index"
99
90
  @focus="hoverIndex = index"
100
91
  @mouseleave="hoverIndex = -1"
101
92
  @blur="hoverIndex = -1"
102
- @click="emitInputEvent(index); setFocus(index - 1)"
103
- @keyup.enter="emitInputEvent(index); setFocus(index - 1)"
104
- @keyup.space="emitInputEvent(index); setFocus(index - 1)"
105
- @keyup.right="focusNextElement(index - 1)"
106
- @keyup.left="focusPrevElement(index - 1)"
107
- @keyup.up="focusPrevElement(index - 1)"
108
- @keyup.down="focusNextElement(index - 1)"
93
+ @click="selectAndFocus(index - 1)"
94
+ @keydown.enter.prevent="selectAndFocus(index - 1)"
95
+ @keydown.space.prevent="selectAndFocus(index - 1)"
96
+ @keydown.right.prevent="focusNextElement(index - 1)"
97
+ @keydown.left.prevent="focusPrevElement(index - 1)"
98
+ @keydown.up.prevent="focusPrevElement(index - 1)"
99
+ @keydown.down.prevent="focusNextElement(index - 1)"
109
100
  >
110
101
  <span class="d-sr-only">{{ locales.etoiles(index) }}</span>
111
102
  <SyIcon
@@ -125,8 +116,6 @@
125
116
  </template>
126
117
 
127
118
  <style lang="scss" scoped>
128
- @use '@/assets/tokens';
129
-
130
119
  .sy-stars-picker {
131
120
  border: 0;
132
121
  }
@@ -140,15 +129,15 @@
140
129
  height: 36px !important;
141
130
 
142
131
  &--disabled.text-primary {
143
- color: tokens.$primary-base !important;
132
+ color: rgb(var(--v-theme-primary)) !important;
144
133
  }
145
134
 
146
135
  &.text-blue-lighten {
147
- color: tokens.$blue-lighten-60 !important;
136
+ color: rgb(var(--v-theme-blue-lighten60)) !important;
148
137
  }
149
138
 
150
139
  &--disabled.text-blue-lighten {
151
- color: tokens.$blue-lighten-60 !important;
140
+ color: rgb(var(--v-theme-blue-lighten60)) !important;
152
141
  }
153
142
  }
154
143
  </style>
@@ -37,7 +37,7 @@ describe('StarsPicker', () => {
37
37
  )
38
38
  await wrapper.setProps({ modelValue: 1 })
39
39
  expect(wrapper.findAll('[role="radio"]')[3]?.attributes('aria-checked')).toBe(
40
- undefined,
40
+ 'false',
41
41
  )
42
42
  expect(wrapper.findAll('[role="radio"]')[0]?.attributes('aria-checked')).toBe(
43
43
  'true',
@@ -18,6 +18,7 @@ exports[`StarsPicker > renders correctly 1`] = `
18
18
  role="radiogroup"
19
19
  >
20
20
  <div
21
+ aria-checked="false"
21
22
  class="
22
23
  align-center
23
24
  d-flex
@@ -50,6 +51,7 @@ exports[`StarsPicker > renders correctly 1`] = `
50
51
  ></i>
51
52
  </div>
52
53
  <div
54
+ aria-checked="false"
53
55
  class="
54
56
  align-center
55
57
  d-flex
@@ -82,6 +84,7 @@ exports[`StarsPicker > renders correctly 1`] = `
82
84
  ></i>
83
85
  </div>
84
86
  <div
87
+ aria-checked="false"
85
88
  class="
86
89
  align-center
87
90
  d-flex
@@ -114,6 +117,7 @@ exports[`StarsPicker > renders correctly 1`] = `
114
117
  ></i>
115
118
  </div>
116
119
  <div
120
+ aria-checked="false"
117
121
  class="
118
122
  align-center
119
123
  d-flex
@@ -146,6 +150,7 @@ exports[`StarsPicker > renders correctly 1`] = `
146
150
  ></i>
147
151
  </div>
148
152
  <div
153
+ aria-checked="false"
149
154
  class="
150
155
  align-center
151
156
  d-flex
@@ -1,15 +1,143 @@
1
- import { Meta, Story } from '@storybook/addon-docs';
2
- import * as RatingPickerStories from '../RatingPicker.stories.ts';
1
+ import { Meta, Primary } from '@storybook/addon-docs';
2
+ import * as Stories from '../RatingPicker.stories.ts';
3
+ import AccessibilityIcon from '@/common/imgs/accessibility-svgrepo-com.svg';
3
4
  import '@/stories/styles/shared.css';
5
+ import {
6
+ AccessibilityGuideLayout,
7
+ CriteriaSection,
8
+ CriteriaCard,
9
+ BestPracticesSection,
10
+ ResourcesSection,
11
+ DemoSection
12
+ } from '@/stories/accessibility/AccessibilityGuideLayout.mdx';
4
13
 
5
- <Meta of={RatingPickerStories} />
14
+ <Meta of={Stories} />
6
15
 
7
- <div className="header">
8
- <h1>Accessibilité</h1>
16
+ <AccessibilityGuideLayout
17
+ componentName="RatingPicker"
18
+ iconSrc={AccessibilityIcon}
19
+ >
20
+
21
+ <div class="mt-2">
22
+ <p>
23
+ Rapport d’audit manuel : <a href="/audits/RatingPicker.xlsx" style={{ color:'#0C41BD' }}>Voir le rapport</a>
24
+ </p>
25
+ <p style={{ color: 'grey', fontSize: '14px', marginTop: '0px' }}>
26
+ Correctifs associés (
27
+ <a
28
+ href="https://github.com/assurance-maladie-digital/design-system-v3/pull/1159"
29
+ target="_blank"
30
+ style={{ color:'#0C41BD' }}
31
+ >#1159</a>
32
+ )
33
+ </p>
9
34
  </div>
10
35
 
36
+ <CriteriaSection>
37
+ <CriteriaCard icon="🎯" title="Choisir une seule note">
38
+ <ul>
39
+ <li>Le composant permet de sélectionner <strong>une seule valeur</strong> (comme une note).</li>
40
+ <li>On recommande d’utiliser un <code>fieldset</code> avec un <code>legend</code> pour donner le contexte.</li>
41
+ <li>Le comportement attendu est celui d’un <strong>groupe de boutons radio</strong>.</li>
42
+ <li>Le libellé doit être clair, par exemple : <code>Êtes-vous satisfait ?</code>.</li>
43
+ <li>Éviter les structures trop complexes qui rendent le composant difficile à comprendre (surtout pour les lecteurs d’écran).</li>
44
+ </ul>
45
+ </CriteriaCard>
11
46
 
12
- <div class="mt-2">
13
- <p>Rapport d’audit manuel : <a href="/audits/RatingPicker.xlsx" style={{ color:'#0C41BD' }}>Voir le rapport</a></p>
14
- <p style={{ color: 'grey', fontSize: '14px', marginTop: '0px' }}>Correctifs associés (<a href="https://github.com/assurance-maladie-digital/design-system-v3/issues/910" target="_blank" style={{color:'#0C41BD'}}>issue #910</a>)</p>
15
- </div>
47
+ <CriteriaCard icon="⌨️" title="Navigation au clavier">
48
+ <ul>
49
+ <li>Le composant doit être utilisable <strong>entièrement au clavier</strong>.</li>
50
+ <li>On doit pouvoir se déplacer entre les notes facilement.</li>
51
+ <li>Les flèches du clavier sont attendues pour naviguer entre les options.</li>
52
+ <li>Quand une note est sélectionnée, cela doit être clairement annoncé.</li>
53
+ <li>Si la note ne peut être choisie qu’une seule fois, il faut le préciser à l’utilisateur.</li>
54
+ </ul>
55
+ </CriteriaCard>
56
+
57
+ <CriteriaCard icon="🗣️" title="Message après la sélection">
58
+ <ul>
59
+ <li>Après avoir choisi une note, un message s’affiche (ex : <code>Merci pour votre réponse</code>).</li>
60
+ <li>Ce message doit être annoncé automatiquement, sans déplacer le focus.</li>
61
+ <li>On utilise pour ça <code>role="status"</code>.</li>
62
+ <li>Ne pas utiliser <code>role="alert"</code> pour ce type de message.</li>
63
+ </ul>
64
+ </CriteriaCard>
65
+
66
+ <CriteriaCard icon="📝" title="Champ de commentaire">
67
+ <ul>
68
+ <li>Un champ texte peut apparaître selon la note choisie.</li>
69
+ <li>Ce champ doit avoir un <strong>label clair</strong> (ex : <code>Pouvez-vous nous en dire plus ?</code>).</li>
70
+ <li>Le label doit être visible et bien associé au champ.</li>
71
+ <li>Le champ ne doit exister que quand il est utile (pas caché mais toujours présent pour les lecteurs d’écran).</li>
72
+ </ul>
73
+ </CriteriaCard>
74
+
75
+ <CriteriaCard icon="🎨" title="Focus et visibilité">
76
+ <ul>
77
+ <li>Quand on navigue au clavier, le focus doit être <strong>bien visible</strong>.</li>
78
+ <li>Attention au contraste : le focus doit ressortir clairement.</li>
79
+ <li>Ne pas confondre visuellement un élément sélectionné et un élément en focus.</li>
80
+ </ul>
81
+ </CriteriaCard>
82
+
83
+ <CriteriaCard icon="🖼️" title="Icônes décoratives">
84
+ <ul>
85
+ <li>Les icônes (étoiles, emojis, etc.) sont souvent décoratives.</li>
86
+ <li>Elles ne doivent pas être lues par les lecteurs d’écran si elles n’apportent pas d’info.</li>
87
+ <li>Attention à ne pas mélanger <code>aria-hidden</code> avec un <code>role="img"</code>.</li>
88
+ </ul>
89
+ </CriteriaCard>
90
+
91
+ <CriteriaCard icon="🧱" title="Code propre et valide">
92
+ <ul>
93
+ <li>Le HTML doit rester simple et valide.</li>
94
+ <li>Éviter les attributs non autorisés (ex : <code>readonly</code> sur un radio).</li>
95
+ <li>Une structure claire améliore la compatibilité avec les outils d’accessibilité.</li>
96
+ </ul>
97
+ </CriteriaCard>
98
+ </CriteriaSection>
99
+
100
+ <DemoSection componentName="RatingPicker">
101
+ <Primary />
102
+ </DemoSection>
103
+
104
+ <BestPracticesSection>
105
+ <ul>
106
+ <li>Utiliser <code>fieldset</code> + <code>legend</code> pour structurer le composant.</li>
107
+ <li>Garder un comportement de <strong>groupe radio</strong>.</li>
108
+ <li>Assurer une navigation clavier complète et fluide.</li>
109
+ <li>Afficher un focus bien visible.</li>
110
+ <li>Masquer correctement les éléments décoratifs.</li>
111
+ <li>Utiliser <code>role="status"</code> pour le message de confirmation.</li>
112
+ <li>Ajouter un label clair pour le champ de commentaire.</li>
113
+ <li>Rester simple : moins de complexité = meilleure accessibilité.</li>
114
+ </ul>
115
+ </BestPracticesSection>
116
+
117
+ <ResourcesSection>
118
+ <ul>
119
+ <li>
120
+ <a
121
+ href="https://accessibilite.numerique.gouv.fr/methode/criteres-et-tests/"
122
+ target="_blank"
123
+ style={{ color: '#0C41BD' }}
124
+ >RGAA 4.1.2 – Critères et tests</a>
125
+ </li>
126
+ <li>
127
+ <a
128
+ href="https://www.accede-web.com/notices/html-et-css/formulaires/regrouper-et-titrer-les-champs-de-meme-nature-avec-fieldset-et-legend/"
129
+ target="_blank"
130
+ style={{ color: '#0C41BD' }}
131
+ >AcceDe Web – fieldset et legend</a>
132
+ </li>
133
+ <li>
134
+ <a
135
+ href="https://www.accede-web.com/notices/interface-riche/message-de-notification/"
136
+ target="_blank"
137
+ style={{ color: '#0C41BD' }}
138
+ >AcceDe Web – Messages de notification</a>
139
+ </li>
140
+ </ul>
141
+ </ResourcesSection>
142
+
143
+ </AccessibilityGuideLayout>
@@ -0,0 +1,123 @@
1
+ // @vitest-environment jsdom
2
+
3
+ import { describe, it } from 'vitest'
4
+ import { mount } from '@vue/test-utils'
5
+ import { axe } from 'vitest-axe'
6
+
7
+ import { assertNoA11yViolations } from '@tests/unit/accessibility/axeUtils'
8
+ import RatingPicker from '../RatingPicker.vue'
9
+ import { RatingEnum } from '../Rating'
10
+
11
+ describe('RatingPicker – accessibility (axe)', () => {
12
+ it('has no obvious axe violations with emotion picker and fieldset label', async () => {
13
+ const wrapper = mount(RatingPicker, {
14
+ props: {
15
+ type: RatingEnum.EMOTION,
16
+ label: 'Êtes-vous satisfait de votre expérience ?',
17
+ itemLabels: ['Pas satisfait', 'Moyen', 'Satisfait'],
18
+ modelValue: -1,
19
+ },
20
+ global: {
21
+ stubs: {
22
+ EmotionPicker: {
23
+ template: `
24
+ <fieldset>
25
+ <legend><slot name="label" /></legend>
26
+ <input id="e1" type="radio" name="emotion" />
27
+ <label for="e1">Option</label>
28
+ </fieldset>
29
+ `,
30
+ },
31
+ StarsPicker: true,
32
+ NumberPicker: true,
33
+ SyAlert: {
34
+ template: `<div role="status"><slot /></div>`,
35
+ },
36
+ },
37
+ },
38
+ attachTo: document.body,
39
+ })
40
+
41
+ const results = await axe(wrapper.element as HTMLElement)
42
+ assertNoA11yViolations(results, 'RatingPicker – emotion picker with label', {
43
+ ignoreRules: ['region'],
44
+ })
45
+
46
+ wrapper.unmount()
47
+ })
48
+
49
+ it('has no obvious axe violations when free text is displayed for a low stars rating', async () => {
50
+ const wrapper = mount(RatingPicker, {
51
+ props: {
52
+ type: RatingEnum.STARS,
53
+ label: 'Comment évaluez-vous votre expérience ?',
54
+ modelValue: 2,
55
+ enableFreeText: true,
56
+ freeTextLabel: 'Pouvez-vous nous en dire plus ?',
57
+ freeTextValue: 'Le parcours était peu clair.',
58
+ },
59
+ global: {
60
+ stubs: {
61
+ EmotionPicker: true,
62
+ StarsPicker: {
63
+ template: `
64
+ <fieldset>
65
+ <legend><slot name="label" /></legend>
66
+ <input id="s1" type="radio" name="stars" />
67
+ <label for="s1">1 étoile</label>
68
+ </fieldset>
69
+ `,
70
+ },
71
+ NumberPicker: true,
72
+ SyAlert: {
73
+ template: `<div role="status"><slot /></div>`,
74
+ },
75
+ },
76
+ },
77
+ attachTo: document.body,
78
+ })
79
+
80
+ const results = await axe(wrapper.element as HTMLElement)
81
+ assertNoA11yViolations(results, 'RatingPicker – stars picker with free text', {
82
+ ignoreRules: ['region'],
83
+ })
84
+
85
+ wrapper.unmount()
86
+ })
87
+
88
+ it('has no obvious axe violations with number picker', async () => {
89
+ const wrapper = mount(RatingPicker, {
90
+ props: {
91
+ type: RatingEnum.NUMBER,
92
+ label: 'Notez votre expérience de 1 à 10',
93
+ modelValue: 5,
94
+ },
95
+ global: {
96
+ stubs: {
97
+ EmotionPicker: true,
98
+ StarsPicker: true,
99
+ NumberPicker: {
100
+ template: `
101
+ <fieldset>
102
+ <legend><slot name="label" /></legend>
103
+ <input id="n1" type="radio" name="number" />
104
+ <label for="n1">1</label>
105
+ </fieldset>
106
+ `,
107
+ },
108
+ SyAlert: {
109
+ template: `<div role="status"><slot /></div>`,
110
+ },
111
+ },
112
+ },
113
+ attachTo: document.body,
114
+ })
115
+
116
+ const results = await axe(wrapper.element as HTMLElement)
117
+ assertNoA11yViolations(results, 'RatingPicker – number picker', {
118
+ ignoreRules: ['region'],
119
+ })
120
+
121
+ wrapper.unmount()
122
+ })
123
+ })
@@ -51,6 +51,7 @@ describe('RatingPicker', () => {
51
51
  const wrapper = mount(RatingPicker, {
52
52
  stubs: {
53
53
  StarsPicker: {
54
+ name: 'StarsPicker',
54
55
  template: '<div />',
55
56
  },
56
57
  },
@@ -62,8 +63,8 @@ describe('RatingPicker', () => {
62
63
  },
63
64
  })
64
65
 
65
- wrapper.findComponent(StarsPicker).vm.$emit('update:modelValue', 3)
66
- await wrapper.setProps({ modelValue: 3 })
66
+ wrapper.findComponent(StarsPicker).vm.$emit('update:modelValue', 2)
67
+ await wrapper.setProps({ modelValue: 2 })
67
68
 
68
69
  expect(wrapper.text()).toContain(locales.thanks)
69
70
  expect(wrapper.text()).toContain('Additional content')