@cnamts/synapse 1.0.24 → 1.0.25

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 (367) hide show
  1. package/README.md +27 -5
  2. package/dist/{AutocompleteFilter-BWLR3U7W.js → AutocompleteFilter-D7qBuCAP.js} +1 -1
  3. package/dist/{AutocompleteFilter-D9jzRzAL.cjs → AutocompleteFilter-Df9i5mAl.cjs} +1 -1
  4. package/dist/{DateFilter-DTUl8hb1.cjs → DateFilter-BJD6FMev.cjs} +1 -1
  5. package/dist/{DateFilter-BpwFexzi.js → DateFilter-BitMWrMU.js} +1 -1
  6. package/dist/{NumberFilter-Bz_NTdX9.js → NumberFilter-BTLUxw0a.js} +1 -1
  7. package/dist/{NumberFilter-MAEojdk0.cjs → NumberFilter-DGCzCXzI.cjs} +1 -1
  8. package/dist/{PeriodFilter-DX_wy9g-.js → PeriodFilter-B5rUIPAC.js} +1 -1
  9. package/dist/{PeriodFilter-CC4WgIhl.cjs → PeriodFilter-DO_ecTZW.cjs} +1 -1
  10. package/dist/{SelectFilter-BR3fvl-a.cjs → SelectFilter-CGwcKWLm.cjs} +1 -1
  11. package/dist/{SelectFilter-xqiPtPgX.js → SelectFilter-l4QnRcuk.js} +2 -2
  12. package/dist/{TextFilter-CCfYFl5F.cjs → TextFilter-B8nf7xoK.cjs} +1 -1
  13. package/dist/{TextFilter-BBl3JFqK.js → TextFilter-C9hj6Qrp.js} +1 -1
  14. package/dist/apLightTheme-CEK4iY3f.cjs +1 -0
  15. package/dist/{apLightTheme-D1P4jcD0.js → apLightTheme-DnIM24Lv.js} +441 -722
  16. package/dist/components/Customs/Selects/SyAutocomplete/SyAutocomplete.d.ts +10 -6
  17. package/dist/components/Customs/SyCheckbox/SyCheckbox.d.ts +3 -0
  18. package/dist/components/Customs/SyTabs/SyTabs.d.ts +13 -11
  19. package/dist/components/Customs/SyTextField/SyTextField.d.ts +4 -4
  20. package/dist/components/DatePicker/CalendarMode/DatePicker.d.ts +4 -24
  21. package/dist/components/DatePicker/ComplexDatePicker/ComplexDatePicker.d.ts +2 -12
  22. package/dist/components/DatePicker/DateTextInput/DateTextInput.d.ts +1 -6
  23. package/dist/components/DatePicker/composables/useDatePickerState.d.ts +1 -0
  24. package/dist/components/FileList/FileList.d.ts +6 -0
  25. package/dist/components/FilterSideBar/FilterSideBar.d.ts +2 -0
  26. package/dist/components/HeaderNavigationBar/HeaderNavigationBar.d.ts +13 -13
  27. package/dist/components/HeaderNavigationBar/HorizontalNavbar/HorizontalNavbar.d.ts +3 -3
  28. package/dist/components/MonthPicker/MonthPicker.d.ts +1 -6
  29. package/dist/components/MonthPicker/MonthPickerText/MonthPickerInput.d.ts +1 -6
  30. package/dist/components/NirField/NirField.d.ts +4 -16
  31. package/dist/components/PeriodField/PeriodField.d.ts +8 -48
  32. package/dist/components/PhoneField/PhoneField.d.ts +1 -6
  33. package/dist/components/Tables/SyServerTable/SyServerTable.d.ts +1 -0
  34. package/dist/components/Tables/SyTable/SyTable.d.ts +1 -0
  35. package/dist/components/Tables/common/SyTablePagination.d.ts +2 -0
  36. package/dist/components/Tables/common/TableHeader.d.ts +5 -0
  37. package/dist/components/Tables/common/locales.d.ts +3 -0
  38. package/dist/components/Tables/common/types.d.ts +2 -0
  39. package/dist/components/UploadWorkflow/UploadWorkflow.d.ts +1 -0
  40. package/dist/composables/unifyValidation/documentationValidationProps.d.ts +230 -0
  41. package/dist/composables/validation/useValidation.d.ts +5 -1
  42. package/dist/design-system-v3.js +2 -2
  43. package/dist/design-system-v3.umd.cjs +1 -1
  44. package/dist/designTokens/tokens/amelipro/apColors.d.ts +10 -10
  45. package/dist/designTokens/tokens/amelipro/apColors2026.d.ts +1 -2
  46. package/dist/designTokens/tokens/amelipro/apContextual.d.ts +44 -0
  47. package/dist/designTokens/tokens/amelipro/apSemantic.d.ts +1 -1
  48. package/dist/designTokens/tokens/baseColors.d.ts +127 -0
  49. package/dist/designTokens/tokens/baseContextualTokens.d.ts +50 -0
  50. package/dist/designTokens/tokens/cnam/cnamColors.d.ts +10 -10
  51. package/dist/designTokens/tokens/cnam/cnamSemantic.d.ts +1 -1
  52. package/dist/designTokens/tokens/pa/paColors.d.ts +1 -166
  53. package/dist/designTokens/tokens/pa/paSemantic.d.ts +1 -1
  54. package/dist/designTokens/utils/buildColorClassMap.d.ts +12 -0
  55. package/dist/designTokens/utils/createFlattenTheme.d.ts +1 -3
  56. package/dist/designTokens/utils/index.d.ts +2 -2
  57. package/dist/main-ByDPHpae.cjs +1067 -0
  58. package/dist/main-Cpx8Co6H.js +38869 -0
  59. package/dist/synapse.css +1 -1
  60. package/dist/utils/functions/classToHex.d.ts +1 -1
  61. package/dist/utils/functions/createHexResolver.d.ts +16 -0
  62. package/dist/vuetifyConfig.js +113 -152
  63. package/dist/vuetifyConfig.umd.cjs +1 -1
  64. package/package.json +29 -18
  65. package/src/assets/amelipro/apTokens2026.scss +5 -5
  66. package/src/assets/overrides/_breakpoints.scss +25 -0
  67. package/src/assets/overrides/_btns.scss +0 -2
  68. package/src/assets/overrides/_forms.scss +1 -3
  69. package/src/assets/overrides/_icons.scss +7 -11
  70. package/src/assets/overrides/_otp.scss +41 -0
  71. package/src/assets/overrides/_tables.scss +11 -20
  72. package/src/assets/overrides/_tooltips.scss +17 -7
  73. package/src/assets/overrides/_typography.scss +35 -37
  74. package/src/assets/overrides/_utilities.scss +43 -47
  75. package/src/assets/themes.scss +1 -0
  76. package/src/components/Amelipro/AmeliproAccordion/AmeliproAccordionTemplate/AmeliproAccordionTemplate.vue +20 -20
  77. package/src/components/Amelipro/AmeliproAccordionFrieze/AmeliproAccordionFrieze.vue +12 -14
  78. package/src/components/Amelipro/AmeliproAccordionList/AmeliproAccordionList.vue +4 -6
  79. package/src/components/Amelipro/AmeliproAccordionResult/AmeliproAccordionResultTemplate/AmeliproAccordionResultTemplate.vue +5 -5
  80. package/src/components/Amelipro/AmeliproAccordionResultList/AmeliproAccordionResultList.vue +4 -6
  81. package/src/components/Amelipro/AmeliproAutoCompleteField/AmeliproAutoCompleteField.vue +4 -6
  82. package/src/components/Amelipro/AmeliproBadge/AmeliproBadge.vue +4 -6
  83. package/src/components/Amelipro/AmeliproBreadcrumb/AmeliproBreadcrumb.vue +1 -3
  84. package/src/components/Amelipro/AmeliproBtn/AmeliproBtn.vue +4 -6
  85. package/src/components/Amelipro/AmeliproCallback/AmeliproCallback.vue +2 -2
  86. package/src/components/Amelipro/AmeliproCard/AmeliproCard.vue +31 -31
  87. package/src/components/Amelipro/AmeliproCarousel/AmeliproCarousel.vue +5 -7
  88. package/src/components/Amelipro/AmeliproCheckbox/AmeliproCheckbox.vue +13 -15
  89. package/src/components/Amelipro/AmeliproCheckboxGroup/AmeliproCheckboxGroup.vue +23 -23
  90. package/src/components/Amelipro/AmeliproChips/AmeliproChips.vue +1 -3
  91. package/src/components/Amelipro/AmeliproClickableTile/AmeliproClickableTile.vue +17 -12
  92. package/src/components/Amelipro/AmeliproClickableTile/tests/__snapshots__/AmeliproClickableTile.spec.ts.snap +2 -2
  93. package/src/components/Amelipro/AmeliproCopyBtn/AmeliproCopyBtn.vue +4 -6
  94. package/src/components/Amelipro/AmeliproCustomSelector/AmeliproCustomSelector.vue +13 -13
  95. package/src/components/Amelipro/AmeliproDentalChart/AmeliproDentalChart.vue +4 -2
  96. package/src/components/Amelipro/AmeliproDentalChart/AmeliproTooth/AmeliproTooth.vue +4 -4
  97. package/src/components/Amelipro/AmeliproDialog/AmeliproDialog.vue +5 -7
  98. package/src/components/Amelipro/AmeliproDisclosure/AmeliproDisclosure.vue +1 -3
  99. package/src/components/Amelipro/AmeliproErrorTemplate/AmeliproErrorTemplate.vue +2 -4
  100. package/src/components/Amelipro/AmeliproFilePreview/AmeliproFilePreview.vue +4 -6
  101. package/src/components/Amelipro/AmeliproFilters/AmeliproFilters.vue +13 -13
  102. package/src/components/Amelipro/AmeliproFirstLogin/AmeliproFirstLogin.vue +3 -5
  103. package/src/components/Amelipro/AmeliproFooter/AmeliproFooter.vue +1 -3
  104. package/src/components/Amelipro/AmeliproHeader/AmeliproHeader.vue +2 -4
  105. package/src/components/Amelipro/AmeliproHeader/AmeliproHeaderBar/AmeliproHeaderBar.vue +1 -3
  106. package/src/components/Amelipro/AmeliproHeader/AmeliproHeaderBar/AmeliproHeaderBrandSection/AmeliproHeaderBrandSection.vue +20 -16
  107. package/src/components/Amelipro/AmeliproHeader/AmeliproHeaderBar/AmeliproHeaderBrandSection/__tests__/__snapshots__/AmeliproHeaderBrandSection.spec.ts.snap +1 -1
  108. package/src/components/Amelipro/AmeliproIconBtn/AmeliproIconBtn.vue +2 -4
  109. package/src/components/Amelipro/AmeliproIllustratedDataTile/AmeliproIllustratedDataTile.vue +5 -7
  110. package/src/components/Amelipro/AmeliproIllustratedRadioGroup/AmeliproIllustratedRadioGroup.vue +6 -8
  111. package/src/components/Amelipro/AmeliproMailTile/AmeliproMailTile.vue +14 -14
  112. package/src/components/Amelipro/AmeliproMenu/AmeliproMenu.vue +11 -13
  113. package/src/components/Amelipro/AmeliproMessagingLayout/AmeliproDropdownMenu/AmeliproDropdownMenu.vue +2 -4
  114. package/src/components/Amelipro/AmeliproMessagingLayout/AmeliproMessagingLayout.vue +8 -8
  115. package/src/components/Amelipro/AmeliproMultipleFoldingCard/AmeliproMultipleFoldingCard.vue +40 -40
  116. package/src/components/Amelipro/AmeliproNumberedCard/AmeliproNumberedCard.vue +27 -27
  117. package/src/components/Amelipro/AmeliproOnboarding/AmeliproOnboarding.vue +3 -5
  118. package/src/components/Amelipro/AmeliproPageLayout/AmeliproPageLayout.vue +2 -4
  119. package/src/components/Amelipro/AmeliproPagination/AmeliproPagination.vue +2 -4
  120. package/src/components/Amelipro/AmeliproPagination/AmeliproPaginationBtn/AmeliproPaginationBtn.vue +3 -5
  121. package/src/components/Amelipro/AmeliproPatientBanner/AmeliproPatientBanner.vue +1 -3
  122. package/src/components/Amelipro/AmeliproPatientLogged/AmeliproPatientLogged.vue +2 -4
  123. package/src/components/Amelipro/AmeliproPatientLogin/AmeliproPatientLogin.vue +4 -4
  124. package/src/components/Amelipro/AmeliproPatientLogin/AmeliproPatientLoginForm/AmeliproPatientLoginForm.vue +1 -3
  125. package/src/components/Amelipro/AmeliproPostalAddressField/AmeliproPostalAddressCityRow/AmeliproPostalAddressCityRow.vue +3 -5
  126. package/src/components/Amelipro/AmeliproPostalAddressField/AmeliproPostalAddressField.vue +3 -5
  127. package/src/components/Amelipro/AmeliproRadioGroup/AmeliproRadioGroup.vue +23 -23
  128. package/src/components/Amelipro/AmeliproResultList/AmeliproResultList.vue +4 -6
  129. package/src/components/Amelipro/AmeliproSelect/AmeliproSelect.vue +12 -22
  130. package/src/components/Amelipro/AmeliproStateTile/AmeliproStateTile.vue +10 -12
  131. package/src/components/Amelipro/AmeliproStepper/AmeliproStepper.vue +17 -17
  132. package/src/components/Amelipro/AmeliproTable/AmeliproTable.vue +8 -10
  133. package/src/components/Amelipro/AmeliproTabs/AmeliproTabBtn/AmeliproTabBtn.vue +6 -8
  134. package/src/components/Amelipro/AmeliproTabs/AmeliproTabs.vue +4 -4
  135. package/src/components/Amelipro/AmeliproTextArea/AmeliproTextArea.vue +4 -6
  136. package/src/components/Amelipro/AmeliproTextField/AmeliproTextField.vue +7 -9
  137. package/src/components/Amelipro/AmeliproTileBtn/AmeliproTileBtn.vue +3 -5
  138. package/src/components/Amelipro/AmeliproTooltips/AmeliproTooltips.vue +0 -2
  139. package/src/components/Amelipro/AmeliproUpload/AmeliproUpload.vue +6 -6
  140. package/src/components/Amelipro/ServiceMenu/ServiceMenu.vue +2 -2
  141. package/src/components/Amelipro/StructureMenu/StructureBtn/StructureBtn.vue +4 -4
  142. package/src/components/Amelipro/StructureMenu/StructureItem/StructureItem.vue +4 -6
  143. package/src/components/Amelipro/StructureMenu/StructureMenu.vue +2 -2
  144. package/src/components/Amelipro/StructureMenu/StructureTabs/StructureTabs.vue +2 -2
  145. package/src/components/Amelipro/UserMenu/UserMenu.vue +1 -3
  146. package/src/components/BackBtn/tests/BackBtn.visual.cy.ts +43 -0
  147. package/src/components/BackBtn/tests/__snapshots__/back-btn-custom-bg.snap.png +0 -0
  148. package/src/components/BackBtn/tests/__snapshots__/back-btn-dark-mode.snap.png +0 -0
  149. package/src/components/BackBtn/tests/__snapshots__/back-btn-default.snap.png +0 -0
  150. package/src/components/BackBtn/tests/__snapshots__/back-btn-no-icon.snap.png +0 -0
  151. package/src/components/Captcha/Captcha.vue +1 -3
  152. package/src/components/ChipList/ChipList.vue +14 -16
  153. package/src/components/CookiesSelection/CookiesInformation/CookiesInformation.vue +0 -2
  154. package/src/components/CopyBtn/CopyBtn.vue +1 -3
  155. package/src/components/Customs/Selects/SelectBtnField/SelectBtnField.vue +17 -17
  156. package/src/components/Customs/Selects/SelectBtnField/tests/SelectBtnField.spec.ts +31 -0
  157. package/src/components/Customs/Selects/SyAutocomplete/SyAutocomplete.stories.ts +66 -0
  158. package/src/components/Customs/Selects/SyAutocomplete/SyAutocomplete.vue +7 -3
  159. package/src/components/Customs/Selects/SyAutocomplete/tests/SyAutocomplete.a11y.spec.ts +18 -0
  160. package/src/components/Customs/Selects/SyAutocomplete/tests/SyAutocomplete.spec.ts +66 -0
  161. package/src/components/Customs/Selects/SyInputSelect/SyInputSelect.vue +4 -6
  162. package/src/components/Customs/Selects/SySelect/SySelect.stories.ts +1 -39
  163. package/src/components/Customs/Selects/SySelect/SySelect.vue +263 -63
  164. package/src/components/Customs/Selects/SySelect/accessibilite/Accessibility.mdx +199 -269
  165. package/src/components/Customs/Selects/SySelect/tests/SySelect.spec.ts +35 -0
  166. package/src/components/Customs/SyCheckbox/SyCheckbox.mdx +5 -0
  167. package/src/components/Customs/SyCheckbox/SyCheckbox.vue +29 -0
  168. package/src/components/Customs/SyCheckbox/accessibilite/Accessibility.mdx +18 -3
  169. package/src/components/Customs/SyPagination/SyPagination.vue +0 -2
  170. package/src/components/Customs/SyTabs/SyTabs.mdx +0 -58
  171. package/src/components/Customs/SyTabs/SyTabs.stories.ts +32 -33
  172. package/src/components/Customs/SyTabs/SyTabs.vue +87 -67
  173. package/src/components/Customs/SyTabs/accessibilite/Accessibility.mdx +83 -23
  174. package/src/components/Customs/SyTabs/tests/SyTabs.a11y.spec.ts +88 -0
  175. package/src/components/Customs/SyTabs/tests/SyTabs.spec.ts +46 -1
  176. package/src/components/Customs/SyTextField/SyTextField.stories.ts +21 -41
  177. package/src/components/Customs/SyTextField/SyTextField.vue +4 -6
  178. package/src/components/DatePicker/CalendarMode/DatePicker.vue +12 -14
  179. package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.vue +20 -16
  180. package/src/components/DatePicker/ComplexDatePicker/tests/ComplexDatePicker.spec.ts +23 -0
  181. package/src/components/DatePicker/DateTextInput/DateTextInput.vue +8 -10
  182. package/src/components/DatePicker/composables/tests/useDatePickerState.spec.ts +53 -0
  183. package/src/components/DatePicker/composables/useDatePickerState.ts +24 -0
  184. package/src/components/DatePicker/composables/useDateTextField.ts +0 -1
  185. package/src/components/DatePicker/composables/useMonthButtonCustomization.ts +9 -8
  186. package/src/components/DatePicker/playground/DatePickerHolidayRule.vue +1 -1
  187. package/src/components/DialogBox/DialogBox.vue +3 -5
  188. package/src/components/DialogBox/tests/DialogBox.visual.cy.ts +76 -0
  189. package/src/components/DialogBox/tests/__snapshots__/dialog-box-custom-texts.snap.png +0 -0
  190. package/src/components/DialogBox/tests/__snapshots__/dialog-box-default.snap.png +0 -0
  191. package/src/components/DialogBox/tests/__snapshots__/dialog-box-no-actions.snap.png +0 -0
  192. package/src/components/FileList/FileList.vue +9 -2
  193. package/src/components/FileList/UploadItem/UploadItem.vue +11 -13
  194. package/src/components/FileList/tests/FileList.spec.ts +47 -0
  195. package/src/components/FileUpload/FileUpload.vue +3 -5
  196. package/src/components/FileUpload/FileUploadContent.vue +3 -5
  197. package/src/components/FilterInline/FilterInline.vue +1 -3
  198. package/src/components/FilterSideBar/FilterSideBar.mdx +44 -1
  199. package/src/components/FilterSideBar/FilterSideBar.stories.ts +105 -1
  200. package/src/components/FilterSideBar/FilterSideBar.vue +7 -0
  201. package/src/components/FilterSideBar/tests/FilterSideBar.a11y.spec.ts +54 -1
  202. package/src/components/FilterSideBar/tests/FilterSideBar.spec.ts +42 -0
  203. package/src/components/FooterBar/FooterBar.vue +9 -13
  204. package/src/components/FranceConnectBtn/FranceConnectBtn.vue +1 -1
  205. package/src/components/HeaderBar/HeaderBar.vue +2 -3
  206. package/src/components/HeaderBar/HeaderBurgerMenu/HeaderBurgerMenu.vue +2 -3
  207. package/src/components/HeaderBar/HeaderBurgerMenu/HeaderMenuItem/HeaderMenuItem.vue +2 -3
  208. package/src/components/HeaderBar/HeaderBurgerMenu/HeaderMenuSection/HeaderMenuSection.vue +0 -1
  209. package/src/components/HeaderBar/HeaderBurgerMenu/HeaderSubMenu/HeaderSubMenu.vue +8 -9
  210. package/src/components/HeaderBar/HeaderBurgerMenu/menu.scss +0 -8
  211. package/src/components/HeaderBar/HeaderBurgerMenu/tests/HeaderBurgerMenu.visual.cy.ts +196 -0
  212. package/src/components/HeaderBar/HeaderBurgerMenu/tests/__snapshots__/header-burger-menu-generated-submenu-open.snap.png +0 -0
  213. package/src/components/HeaderBar/HeaderBurgerMenu/tests/__snapshots__/header-burger-menu-generated.snap.png +0 -0
  214. package/src/components/HeaderBar/HeaderLogo/HeaderLogo.vue +0 -1
  215. package/src/components/HeaderBar/HeaderMenuBtn/HeaderMenuBtn.vue +6 -7
  216. package/src/components/HeaderBar/tests/HeaderBar.visual.cy.ts +81 -0
  217. package/src/components/HeaderBar/tests/__snapshots__/header-bar-custom-width.snap.png +0 -0
  218. package/src/components/HeaderBar/tests/__snapshots__/header-bar-default.snap.png +0 -0
  219. package/src/components/HeaderBar/tests/__snapshots__/header-bar-no-sticky.snap.png +0 -0
  220. package/src/components/HeaderBar/tests/__snapshots__/header-bar-with-prepend.snap.png +0 -0
  221. package/src/components/HeaderBar/tests/__snapshots__/header-bar-with-side.snap.png +0 -0
  222. package/src/components/HeaderBar/tests/__snapshots__/header-bar-with-subtitle.snap.png +0 -0
  223. package/src/components/HeaderNavigationBar/HeaderNavigationBar.vue +12 -3
  224. package/src/components/HeaderNavigationBar/HorizontalNavbar/HorizontalNavbar.vue +15 -8
  225. package/src/components/HeaderToolbar/HeaderToolbar.vue +6 -7
  226. package/src/components/LangBtn/LangBtn.vue +2 -4
  227. package/src/components/Logo/tests/Logo.visual.cy.ts +57 -0
  228. package/src/components/Logo/tests/__snapshots__/logo-avatar.snap.png +0 -0
  229. package/src/components/Logo/tests/__snapshots__/logo-dark.snap.png +0 -0
  230. package/src/components/Logo/tests/__snapshots__/logo-default.snap.png +0 -0
  231. package/src/components/Logo/tests/__snapshots__/logo-no-organism.snap.png +0 -0
  232. package/src/components/Logo/tests/__snapshots__/logo-no-signature.snap.png +0 -0
  233. package/src/components/Logo/tests/__snapshots__/logo-risque-pro.snap.png +0 -0
  234. package/src/components/LogoBrandSection/LogoBrandSection.vue +2 -2
  235. package/src/components/MonthPicker/MonthPickerVisual/VisualPickerHeader.vue +1 -1
  236. package/src/components/NirField/NirField.stories.ts +2 -2
  237. package/src/components/NirField/NirField.vue +3 -5
  238. package/src/components/NirField/accessibilite/Accessibility.mdx +100 -5
  239. package/src/components/NirField/tests/NirField.spec.ts +118 -0
  240. package/src/components/NirField/tests/useNirValidation.spec.ts +449 -0
  241. package/src/components/NirField/useNirValidation.ts +38 -32
  242. package/src/components/NotificationBar/Notification/Notification.vue +5 -7
  243. package/src/components/NotificationBar/NotificationBar.vue +1 -3
  244. package/src/components/PaginatedTable/PaginatedTable.vue +2 -3
  245. package/src/components/PaginatedTable/Pagination.vue +3 -5
  246. package/src/components/PasswordField/PasswordField.vue +8 -10
  247. package/src/components/PhoneField/PhoneField.vue +3 -3
  248. package/src/components/RangeField/RangeSlider/RangeSlider.vue +0 -2
  249. package/src/components/RangeField/RangeSlider/Tooltip/Tooltip.vue +1 -1
  250. package/src/components/RangeField/tests/RangeField.visual.cy.ts +65 -0
  251. package/src/components/RangeField/tests/__snapshots__/range-field-custom-bg.snap.png +0 -0
  252. package/src/components/RangeField/tests/__snapshots__/range-field-custom-range.snap.png +0 -0
  253. package/src/components/RangeField/tests/__snapshots__/range-field-default.snap.png +0 -0
  254. package/src/components/RangeField/tests/__snapshots__/range-field-step.snap.png +0 -0
  255. package/src/components/RangeField/tests/__snapshots__/range-field-with-label.snap.png +0 -0
  256. package/src/components/RatingPicker/EmotionPicker/EmotionPicker.vue +6 -8
  257. package/src/components/RatingPicker/StarsPicker/StarsPicker.vue +3 -5
  258. package/src/components/SearchListField/SearchListField.vue +0 -2
  259. package/src/components/SkipLink/SkipLink.vue +2 -4
  260. package/src/components/SocialMediaLinks/SocialMediaLinks.vue +6 -6
  261. package/src/components/SubHeader/SubHeader.vue +1 -1
  262. package/src/components/SyAlert/SyAlert.vue +7 -9
  263. package/src/components/SyAlert/tests/SyAlert.visual.cy.ts +46 -0
  264. package/src/components/SyAlert/tests/__snapshots__/sy-alert-closable.snap.png +0 -0
  265. package/src/components/SyAlert/tests/__snapshots__/sy-alert-error.snap.png +0 -0
  266. package/src/components/SyAlert/tests/__snapshots__/sy-alert-info.snap.png +0 -0
  267. package/src/components/SyAlert/tests/__snapshots__/sy-alert-success.snap.png +0 -0
  268. package/src/components/SyAlert/tests/__snapshots__/sy-alert-variant-outlined.snap.png +0 -0
  269. package/src/components/SyAlert/tests/__snapshots__/sy-alert-variant-tonal.snap.png +0 -0
  270. package/src/components/SyAlert/tests/__snapshots__/sy-alert-warning.snap.png +0 -0
  271. package/src/components/SyBtnMenu/SyBtnMenu.vue +2 -4
  272. package/src/components/TableToolbar/TableToolbar.vue +6 -8
  273. package/src/components/Tables/SyServerTable/SyServerTable.stories.ts +166 -0
  274. package/src/components/Tables/SyServerTable/SyServerTable.vue +9 -7
  275. package/src/components/Tables/SyServerTable/tests/SyServerTable.a11y.spec.ts +23 -0
  276. package/src/components/Tables/SyServerTable/tests/SyServerTable.spec.ts +268 -0
  277. package/src/components/Tables/SyTable/SyTable.stories.ts +104 -0
  278. package/src/components/Tables/SyTable/SyTable.vue +9 -7
  279. package/src/components/Tables/SyTable/tests/SyTable.a11y.spec.ts +22 -0
  280. package/src/components/Tables/SyTable/tests/SyTable.spec.ts +274 -0
  281. package/src/components/Tables/common/SyTableFilter.vue +27 -2
  282. package/src/components/Tables/common/SyTablePagination.vue +142 -19
  283. package/src/components/Tables/common/TableHeader.vue +40 -3
  284. package/src/components/Tables/common/filters/SelectFilter.vue +1 -1
  285. package/src/components/Tables/common/locales.ts +3 -0
  286. package/src/components/Tables/common/tableStyles.scss +16 -19
  287. package/src/components/Tables/common/tests/SyTablePagination.spec.ts +18 -0
  288. package/src/components/Tables/common/tests/TableHeader.spec.ts +39 -0
  289. package/src/components/Tables/common/types.ts +2 -0
  290. package/src/components/Tables/common/useTableHeaders.ts +49 -27
  291. package/src/components/UploadWorkflow/UploadWorkflow.vue +1 -0
  292. package/src/components/UploadWorkflow/tests/UploadWorkflow.spec.ts +23 -0
  293. package/src/components/UploadWorkflow/tests/__snapshots__/UploadWorkflow.spec.ts.snap +66 -0
  294. package/src/components/UploadWorkflow/useFileList.ts +3 -0
  295. package/src/components/UserMenuBtn/UserMenuBtn.vue +1 -3
  296. package/src/composables/unifyValidation/documentationValidationProps.ts +235 -0
  297. package/src/composables/validation/useValidation.ts +17 -1
  298. package/src/composantsVuetify/VBreadcrumbs/VBreadcrumbs.mdx +28 -0
  299. package/src/composantsVuetify/VBreadcrumbs/v-breadcrumbs.stories.ts +108 -0
  300. package/src/composantsVuetify/VOtpInput/VOtpInput.mdx +39 -0
  301. package/src/composantsVuetify/VOtpInput/v-otp-input.stories.ts +56 -0
  302. package/src/composantsVuetify/VSkeletonLoader/VSkeletonLoader.mdx +42 -0
  303. package/src/composantsVuetify/VSkeletonLoader/v-skeleton-loader.stories.ts +77 -0
  304. package/src/composantsVuetify/VSwitch/VSwitch.mdx +47 -0
  305. package/src/composantsVuetify/VSwitch/v-switch.stories.ts +166 -0
  306. package/src/designTokens/tests/buildColorClassMap.spec.ts +31 -0
  307. package/src/designTokens/tests/generateScssTokens.spec.ts +12 -0
  308. package/src/designTokens/tests/themeUtils.spec.ts +53 -0
  309. package/src/designTokens/tokens/amelipro/apColors.ts +8 -130
  310. package/src/designTokens/tokens/amelipro/apColors2026.ts +3 -15
  311. package/src/designTokens/tokens/amelipro/apContextual.ts +55 -47
  312. package/src/designTokens/tokens/amelipro/apLightTheme.ts +1 -1
  313. package/src/designTokens/tokens/amelipro/apSemantic.ts +1 -1
  314. package/src/designTokens/tokens/baseColors.ts +129 -0
  315. package/src/designTokens/tokens/baseContextualTokens.ts +52 -0
  316. package/src/designTokens/tokens/cnam/cnamColors.ts +3 -125
  317. package/src/designTokens/tokens/cnam/cnamContextual.ts +4 -48
  318. package/src/designTokens/tokens/cnam/cnamLightTheme.ts +1 -1
  319. package/src/designTokens/tokens/cnam/cnamSemantic.ts +1 -1
  320. package/src/designTokens/tokens/pa/paColors.ts +2 -166
  321. package/src/designTokens/tokens/pa/paContextual.ts +3 -48
  322. package/src/designTokens/tokens/pa/paLightTheme.ts +1 -1
  323. package/src/designTokens/tokens/pa/paSemantic.ts +2 -2
  324. package/src/designTokens/utils/buildColorClassMap.ts +34 -0
  325. package/src/designTokens/utils/convertSemanticsToken.ts +8 -11
  326. package/src/designTokens/utils/createFlattenTheme.ts +15 -7
  327. package/src/designTokens/utils/index.ts +2 -2
  328. package/src/stories/Accessibilite/AuditDesignSystem.mdx +0 -11
  329. package/src/stories/Accessibilite/DesignSystem/Avancement.mdx +433 -0
  330. package/src/stories/Accessibilite/DesignSystem/a11y-status.json +692 -0
  331. package/src/stories/Accessibilite/KitDePreAudit/Echantillonnage.mdx +8 -1
  332. package/src/stories/Accessibilite/KitDePreAudit/Introduction.mdx +51 -10
  333. package/src/stories/Accessibilite/KitDePreAudit/Outils/Introduction.mdx +16 -9
  334. package/src/stories/Accessibilite/KitDePreAudit/Preaudit.mdx +48 -58
  335. package/src/stories/Components/Components.stories.ts +40 -1
  336. package/src/stories/Demarrer/EnrichirLeDesignSystem.mdx +4 -9
  337. package/src/stories/Demarrer/EnrichirLeDesignSystem.stories.ts +28 -0
  338. package/src/stories/Demarrer/Releases.stories.ts +48 -5
  339. package/src/stories/DesignTokens/ColorDisplay.vue +6 -5
  340. package/src/stories/DesignTokens/ColorIntegrationExample.vue +2 -4
  341. package/src/stories/DesignTokens/colors.stories.ts +5 -6
  342. package/src/stories/GuideDuDev/CreateVuetifyInstance.mdx +95 -0
  343. package/src/stories/GuideDuDev/Theme.mdx +36 -26
  344. package/src/stories/GuideDuDev/moduleDeNotification.mdx +3 -2
  345. package/src/stories/styles/accessibility-guide.css +3 -3
  346. package/src/utils/functions/classToHex.ts +6 -34
  347. package/src/utils/functions/createHexResolver.ts +45 -0
  348. package/src/utils/functions/tests/classToHex.spec.ts +36 -0
  349. package/src/utils/functions/tests/convertToHex.spec.ts +31 -0
  350. package/src/utils/functions/tests/createHexResolver.spec.ts +66 -0
  351. package/src/utils/functions/tests/isCssColor.spec.ts +48 -0
  352. package/dist/apLightTheme-CFSRrjv2.cjs +0 -1
  353. package/dist/designTokens/utils/convertGaps.d.ts +0 -5
  354. package/dist/main-BtTqyn4z.js +0 -38648
  355. package/dist/main-C1e3eoxd.cjs +0 -1067
  356. package/src/assets/apTokens.scss +0 -343
  357. package/src/assets/overrides/_container.scss +0 -36
  358. package/src/assets/tokens.scss +0 -388
  359. package/src/designTokens/apColors.md +0 -66
  360. package/src/designTokens/cnamColors.md +0 -193
  361. package/src/designTokens/paColors.md +0 -66
  362. package/src/designTokens/tokens/json/contextual-tokens.json +0 -156
  363. package/src/designTokens/tokens/json/primitives.json +0 -209
  364. package/src/designTokens/tokens/json/semantic.json +0 -120
  365. package/src/designTokens/utils/convertGaps.ts +0 -11
  366. package/src/stories/Accessibilite/Avancement/Avancement.mdx +0 -533
  367. package/src/stories/Accessibilite/Avancement/Avancement.stories.ts +0 -306
@@ -1,274 +1,204 @@
1
- import { Meta, Story } from '@storybook/addon-docs';
1
+ import { Meta, Primary } from '@storybook/blocks';
2
2
  import * as Stories from '../SySelect.stories.ts';
3
3
  import AccessibilityIcon from '@/common/imgs/accessibility-svgrepo-com.svg';
4
- import '@/stories/styles/shared.css';
4
+ import {
5
+ AccessibilityGuideLayout,
6
+ CriteriaSection,
7
+ CriteriaCard,
8
+ DemoSection,
9
+ BestPracticesSection,
10
+ ResourcesSection,
11
+ } from '@/stories/accessibility/AccessibilityGuideLayout.mdx';
5
12
 
6
13
  <Meta of={Stories} />
7
14
 
8
-
9
- <div className="accessibility-guide">
10
- <h1>Guide d'Accessibilité du Composant SySelect</h1>
11
-
12
-
13
- <div className="intro-section">
14
- <img
15
- src={AccessibilityIcon}
16
- alt="Icône d'accessibilité"
17
- className="accessibility-icon"
18
- />
19
- <p className="intro-text">
20
- Le composant SySelect a été conçu en suivant rigoureusement les recommandations d'accessibilité du W3C,
21
- notamment le modèle <a href="https://www.w3.org/WAI/ARIA/apg/patterns/combobox/examples/combobox-select-only/" target="_blank" rel="noopener noreferrer">WAI-ARIA pour les combobox select-only</a>.
22
- Ce guide détaille comment notre implémentation respecte ces standards et garantit une expérience utilisateur inclusive.
23
- </p>
24
- </div>
25
-
26
- <div className="criteria-section">
27
- <h2>Critères d'accessibilité respectés</h2>
28
-
29
- <div className="criteria-card">
30
- <div className="criteria-header">
31
- <span className="criteria-icon">🔍</span>
32
- <h3>Structure sémantique</h3>
33
- </div>
34
- <ul>
35
- <li><strong>Rôles ARIA appropriés</strong> : <code>role="combobox"</code> sur l'input, <code>role="listbox"</code> sur le menu déroulant</li>
36
- <li><strong>Relations entre éléments</strong> : <code>aria-controls</code> pour lier le combobox au listbox</li>
37
- <li><strong>Type d'interaction</strong> : <code>aria-haspopup="listbox"</code> et <code>aria-autocomplete="list"</code></li>
38
- <li><strong>État du menu</strong> : <code>aria-expanded</code> indique si le menu est ouvert ou fermé</li>
39
- </ul>
40
- </div>
41
-
42
- <div className="criteria-card">
43
- <div className="criteria-header">
44
- <span className="criteria-icon">⌨️</span>
45
- <h3>Navigation clavier complète</h3>
46
- </div>
47
- <ul>
48
- <li><strong>Flèches haut/bas</strong> : Navigation entre les options sans modifier la sélection</li>
49
- <li><strong>Entrée</strong> : Sélection de l'option active et fermeture du menu</li>
50
- <li><strong>Échap</strong> : Fermeture du menu sans modifier la sélection</li>
51
- <li><strong>Caractères imprimables</strong> : Navigation vers l'option commençant par le(s) caractère(s) saisi(s)</li>
52
- </ul>
53
- </div>
54
-
55
- <div className="criteria-card">
56
- <div className="criteria-header">
57
- <span className="criteria-icon">📱</span>
58
- <h3>États et retours d'information</h3>
59
- </div>
60
- <ul>
61
- <li><strong>Sélection active</strong> : <code>aria-activedescendant</code> indique l'option active pendant la navigation</li>
62
- <li><strong>Option sélectionnée</strong> : <code>aria-selected="true"</code> sur l'option sélectionnée</li>
63
- <li><strong>État de validation</strong> : <code>aria-required="true"</code> et <code>aria-invalid="true"</code> pour les champs obligatoires et en erreur</li>
64
- <li><strong>Scroll automatique</strong> : Les options sont automatiquement scrollées dans la vue lors de la navigation</li>
65
- </ul>
66
- </div>
67
- </div>
68
-
69
- <div className="keyboard-section">
70
- <h2>Détail de la navigation clavier</h2>
71
- Le composant **SySelect** implémente le pattern de navigation au clavier recommandé par le W3C pour les *combobox select-only*.
72
- <table
73
- style={{
74
- width: '100%',
75
- borderCollapse: 'collapse',
76
- marginTop: '1em',
77
- }}
78
- >
79
- <thead>
80
- <tr style={{ borderBottom: '1px solid #ddd', textAlign: 'left' }}>
81
- <th style={{ padding: '8px' }}>Touche</th>
82
- <th style={{ padding: '8px' }}>Action</th>
83
- </tr>
84
- </thead>
85
- <tbody>
86
- <tr>
87
- <td style={{ padding: '8px' }}><code>Flèche bas</code></td>
88
- <td style={{ padding: '8px' }}>
89
- Ouvre le menu et déplace le focus sur la première option (ou la suivante si une option est déjà sélectionnée)
90
- </td>
91
- </tr>
92
- <tr>
93
- <td style={{ padding: '8px' }}><code>Flèche haut</code></td>
94
- <td style={{ padding: '8px' }}>
95
- Ouvre le menu et déplace le focus sur la dernière option
96
- </td>
97
- </tr>
98
- <tr>
99
- <td style={{ padding: '8px' }}><code>Flèches haut/bas</code></td>
100
- <td style={{ padding: '8px' }}>
101
- Déplace le focus dans la liste des options (sans modifier la sélection)
102
- </td>
103
- </tr>
104
- <tr>
105
- <td style={{ padding: '8px' }}><code>Entrée</code></td>
106
- <td style={{ padding: '8px' }}>
107
- Sélectionne l'option active et ferme le menu
108
- </td>
109
- </tr>
110
- <tr>
111
- <td style={{ padding: '8px' }}><code>Échap</code></td>
112
- <td style={{ padding: '8px' }}>
113
- Ferme le menu sans modifier la sélection
114
- </td>
115
- </tr>
116
- <tr>
117
- <td style={{ padding: '8px' }}><code>Caractères imprimables</code></td>
118
- <td style={{ padding: '8px' }}>
119
- Déplace le focus sur l'option commençant par le(s) caractère(s) saisi(s)
120
- </td>
121
- </tr>
122
- </tbody>
123
- </table>
124
- <p style={{ marginTop: '1em' }}>
125
- <strong>Note :</strong> Le focus DOM reste toujours sur l'élément <em>combobox</em>, tandis que le focus visuel est géré via <code>aria-activedescendant</code>.
126
- </p>
127
- </div>
128
-
129
- <div className="implementation-section">
130
- <h2>Spécificités d'implémentation</h2>
131
- <p>
132
- Conformément aux recommandations WAI-ARIA pour les combobox avec auto-complétion, notre implémentation :
133
- </p>
134
- <ul>
135
- <li>Maintient le focus DOM sur l'input combobox pendant toute l'interaction</li>
136
- <li>Utilise <code>aria-activedescendant</code> pour indiquer l'option active aux technologies d'assistance</li>
137
- <li>Sépare clairement la navigation (flèches) de la sélection (Entrée)</li>
138
- <li>Gère correctement les états visuels et programmatiques des options</li>
139
- <li>Implémente un filtrage en temps réel des options basé sur la saisie utilisateur</li>
140
- <li>Désactive l'auto-complétion du navigateur pour éviter les conflits</li>
141
- </ul>
142
- </div>
143
- </div>
144
-
145
- <div className="accessibility-guide">
146
- <div className="header">
147
- <h1>Accessibilité</h1>
148
- </div>
149
-
150
- <div class="mt-2">
151
- <p>Rapport d’audit manuel : <a href="/audits/SySelect.xlsx" style={{ color:'#0C41BD' }}>Voir le rapport</a></p>
152
- <p style={{ color: 'grey', fontSize: '14px', marginTop: '0px' }}>Correctifs associés (<a href="https://github.com/assurance-maladie-digital/design-system-v3/issues/787" target="_blank" style={{color:'#0C41BD'}}>issue #787</a>), (<a href="https://github.com/assurance-maladie-digital/design-system-v3/issues/931" target="_blank" style={{color:'#0C41BD'}}>issue #931</a>)</p>
153
- </div>
154
-
155
- <br />
156
-
157
- </div>
158
-
159
- <style>
160
- {
161
- `
162
- .accessibility-guide {
163
- font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
164
- max-width: 1200px;
165
- margin: 0 auto;
166
- padding: 20px;
167
- color: #333;
168
- }
169
-
170
- .intro-section {
171
- display: flex;
172
- align-items: center;
173
- margin-bottom: 30px;
174
- background-color: #f8f9fa;
175
- padding: 20px;
176
- border-radius: 8px;
177
- border-left: 5px solid #0077cc;
178
- }
179
-
180
- .accessibility-icon {
181
- width: 60px;
182
- height: 60px;
183
- margin-right: 20px;
184
- flex-shrink: 0;
185
- }
186
-
187
- .intro-text {
188
- font-size: 1.1em;
189
- line-height: 1.6;
190
- margin: 0;
191
- }
192
-
193
- .criteria-section {
194
- margin-bottom: 40px;
195
- }
196
-
197
- .criteria-section h2,
198
- .keyboard-section h2,
199
- .implementation-section h2 {
200
- border-bottom: 2px solid #eaecef;
201
- padding-bottom: 10px;
202
- margin-top: 30px;
203
- margin-bottom: 20px;
204
- color: #0077cc;
205
- }
206
-
207
- .criteria-card {
208
- background-color: #fff;
209
- border-radius: 8px;
210
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
211
- padding: 20px;
212
- margin-bottom: 20px;
213
- }
214
-
215
- .criteria-header {
216
- display: flex;
217
- align-items: center;
218
- margin-bottom: 15px;
219
- }
220
-
221
- .criteria-icon {
222
- font-size: 1.8em;
223
- margin-right: 15px;
224
- }
225
-
226
- .criteria-header h3 {
227
- margin: 0;
228
- font-size: 1.3em;
229
- color: #0077cc;
230
- }
231
-
232
- .criteria-card ul {
233
- margin: 0;
234
- padding-left: 20px;
235
- }
236
-
237
- .criteria-card li {
238
- margin-bottom: 8px;
239
- line-height: 1.5;
240
- }
241
-
242
- .keyboard-section {
243
- background-color: #f0f7ff;
244
- padding: 20px;
245
- border-radius: 8px;
246
- margin-bottom: 30px;
247
- }
248
-
249
- .implementation-section {
250
- background-color: #f5f5f5;
251
- padding: 20px;
252
- border-radius: 8px;
253
- margin-bottom: 30px;
254
- }
255
-
256
- .implementation-section ul {
257
- padding-left: 20px;
258
- }
259
-
260
- .implementation-section li {
261
- margin-bottom: 10px;
262
- line-height: 1.5;
263
- }
264
-
265
- code {
266
- background-color: #f0f0f0;
267
- padding: 2px 5px;
268
- border-radius: 3px;
269
- font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, monospace;
270
- font-size: 0.9em;
271
- }
272
- `
273
- }
274
- </style>
15
+ <AccessibilityGuideLayout
16
+ componentName="SySelect"
17
+ iconSrc={AccessibilityIcon}
18
+ apgHref="https://www.w3.org/WAI/ARIA/apg/patterns/combobox/"
19
+ >
20
+
21
+ <div class="mt-8">
22
+ <p>Rapport d’audit manuel : <a href="/audits/SySelect.xlsx" style={{ color:'#0C41BD' }}>Voir le rapport</a></p>
23
+ <p style={{ color: 'grey', fontSize: '14px', marginTop: '0px' }}>Correctifs associés (<a href="https://github.com/assurance-maladie-digital/design-system-v3/issues/787" target="_blank" style={{color:'#0C41BD'}}>issue #787</a>), (<a href="https://github.com/assurance-maladie-digital/design-system/issues/4028" target="_blank" style={{color:'#0C41BD'}}>issue #931</a>)</p>
24
+ </div>
25
+
26
+ <CriteriaSection>
27
+ <CriteriaCard icon="☑️" title="Accessibilité et Multi-sélection">
28
+ <p>
29
+ Afin de respecter les directives du <abbr title="Référentiel Général d’Amélioration de l’Accessibilité">RGAA</abbr>, le composant <code>SySelect</code> implémente rigoureusement le pattern WAI-ARIA <code>combobox</code> associé à une <code>listbox</code>.
30
+ </p>
31
+ <p>
32
+ En mode <strong>sélection multiple</strong>, des cases à cocher sont affichées à côté de chaque option pour faciliter la compréhension visuelle. Cependant, les règles d'accessibilité interdisent l'imbrication d'éléments interactifs (comme placer un véritable <code>&lt;input type="checkbox"&gt;</code> à l'intérieur d'un élément <code>&lt;div role="option"&gt;</code>).
33
+ </p>
34
+ <p>
35
+ Pour résoudre ce problème, <code>SySelect</code> utilise la propriété <code>decorative</code> du composant <code>SyCheckbox</code>. La case à cocher devient alors purement visuelle et est ignorée par les lecteurs d'écran (<code>aria-hidden="true"</code>). C'est le conteneur de l'option (<code>role="option"</code>) qui se charge de communiquer l'état de sélection de manière standardisée via l'attribut <code>aria-selected="true|false"</code>. Cela garantit une navigation au clavier fluide et une restitution vocale sans erreur.
36
+ </p>
37
+ </CriteriaCard>
38
+
39
+ <CriteriaCard icon="🔍" title="Nom accessible, rôle et associations programmatiques">
40
+ <ul>
41
+ <li>
42
+ <strong>Nom accessible du champ</strong> : le composant calcule un nom
43
+ accessible robuste en priorisant <code>aria-label</code>, puis le
44
+ <code>label</code>, puis le texte d’aide.
45
+ </li>
46
+ <li>
47
+ <strong>Gestion du libellé</strong> : le champ conserve un libellé visible via
48
+ la prop <code>label</code>, avec gestion optionnelle de l’astérisque pour les
49
+ champs requis.
50
+ </li>
51
+ <li>
52
+ <strong>Rôle du composant</strong> : l’input exposé par le composant reçoit
53
+ le rôle <code>combobox</code> avec les états et propriétés associés
54
+ (<code>aria-expanded</code>, <code>aria-controls</code>,
55
+ <code>aria-activedescendant</code>, <code>aria-autocomplete</code>).
56
+ </li>
57
+ <li>
58
+ <strong>Popup nommée</strong> : la liste déroulante est exposée avec le rôle
59
+ <code>grid</code> et associée à un libellé caché via
60
+ <code>aria-labelledby</code>.
61
+ </li>
62
+ <li>
63
+ <strong>Descriptions associées</strong> : le composant construit
64
+ dynamiquement <code>aria-describedby</code> pour relier le champ au texte
65
+ d’aide, aux messages et à la zone de statut selon le contexte.
66
+ </li>
67
+ </ul>
68
+ </CriteriaCard>
69
+
70
+ <CriteriaCard icon="⌨️" title="Navigation clavier et gestion du focus">
71
+ <ul>
72
+ <li>
73
+ <strong>Ouverture et navigation</strong> : la navigation clavier est gérée sur
74
+ le champ avec <kbd>Entrée</kbd>, <kbd>Espace</kbd>, <kbd>Flèche bas</kbd>,
75
+ <kbd>Flèche haut</kbd>, <kbd>Home</kbd>, <kbd>End</kbd>,
76
+ <kbd>Page Up</kbd>, <kbd>Page Down</kbd>, <kbd>Tab</kbd> et
77
+ <kbd>Échap</kbd>.
78
+ </li>
79
+ <li>
80
+ <strong>Focus DOM conservé sur le champ</strong> : le focus reste sur l’input
81
+ et l’option active est exposée via <code>aria-activedescendant</code>.
82
+ </li>
83
+ <li>
84
+ <strong>Focus visible</strong> : un style de focus spécifique est prévu pour
85
+ les éléments interactifs et pour les lignes actives de la liste.
86
+ </li>
87
+ <li>
88
+ <strong>Pas de suppression arbitraire du focus</strong> : à la fermeture, le
89
+ composant peut restaurer le focus sur l’input afin de conserver un parcours
90
+ clavier cohérent.
91
+ </li>
92
+ <li>
93
+ <strong>Bouton de réinitialisation</strong> : le bouton de suppression de la
94
+ sélection est un vrai <code>button</code>, actionnable à la souris, à
95
+ <kbd>Entrée</kbd> et à <kbd>Espace</kbd>, avec un libellé accessible.
96
+ </li>
97
+ </ul>
98
+ </CriteriaCard>
99
+
100
+ <CriteriaCard icon="🧾" title="États, erreurs et aide à la saisie">
101
+ <ul>
102
+ <li>
103
+ <strong>Champ requis</strong> : le composant expose <code>aria-required</code>
104
+ lorsque cela est nécessaire.
105
+ </li>
106
+ <li>
107
+ <strong>Champ invalide</strong> : le composant expose
108
+ <code>aria-invalid="true"</code> lorsque la validation échoue ou lorsque des
109
+ messages d’erreur sont présents.
110
+ </li>
111
+ <li>
112
+ <strong>Messages associés</strong> : les messages d’erreur et le texte d’aide
113
+ sont liés au champ par des identifiants dédiés.
114
+ </li>
115
+ <li>
116
+ <strong>Annonce dynamique</strong> : une zone de statut en
117
+ <code>aria-live="polite"</code> et <code>aria-atomic="true"</code> est
118
+ prévue pour annoncer les erreurs.
119
+ </li>
120
+ <li>
121
+ <strong>Indications visibles</strong> : le texte d’aide peut être affiché
122
+ dans la zone de message ou sous le champ selon l’état du composant.
123
+ </li>
124
+ </ul>
125
+ </CriteriaCard>
126
+
127
+ <CriteriaCard icon="✅" title="Sélection simple, multiple et commandes associées">
128
+ <ul>
129
+ <li>
130
+ <strong>Sélection simple</strong> : la sélection d’une option met à jour la
131
+ valeur puis referme la liste.
132
+ </li>
133
+ <li>
134
+ <strong>Sélection multiple</strong> : le composant permet de conserver la
135
+ liste ouverte pendant la sélection de plusieurs options.
136
+ </li>
137
+ <li>
138
+ <strong>Restitution des sélections</strong> : les valeurs sélectionnées sont
139
+ affichées soit sous forme de texte, soit sous forme de <em>chips</em>.
140
+ </li>
141
+ <li>
142
+ <strong>Suppression d’une sélection</strong> : chaque <em>chip</em> peut être
143
+ retirée via son contrôle de fermeture avec un libellé dédié.
144
+ </li>
145
+ <li>
146
+ <strong>Cas particulier de l’option par défaut</strong> : une option
147
+ placeholder de type « choisir / sélectionner » est traitée spécifiquement
148
+ pour éviter une sélection non pertinente.
149
+ </li>
150
+ </ul>
151
+ </CriteriaCard>
152
+ </CriteriaSection>
153
+
154
+ <DemoSection componentName="SySelect">
155
+ <Primary />
156
+ </DemoSection>
157
+
158
+ <BestPracticesSection>
159
+ <ul>
160
+ <li>
161
+ <strong>Conserver un libellé visible pertinent</strong> : utilisez un
162
+ <code>label</code> explicite décrivant clairement la donnée attendue.
163
+ </li>
164
+ <li>
165
+ <strong>Ne pas s’appuyer uniquement sur un placeholder</strong> : le nom du
166
+ champ doit rester disponible même lorsque la valeur change.
167
+ </li>
168
+ <li>
169
+ <strong>Afficher les indications utiles avant validation</strong> : pour un
170
+ champ obligatoire ou avec format attendu, affichez l’information dans le
171
+ libellé ou le texte associé.
172
+ </li>
173
+ <li>
174
+ <strong>Rédiger des messages d’erreur explicites</strong> : les messages
175
+ doivent identifier le champ concerné et, si nécessaire, suggérer le format ou
176
+ un exemple de valeur attendue.
177
+ </li>
178
+ <li>
179
+ <strong>Vérifier manuellement la restitution</strong> : pour un composant piloté
180
+ par script, testez la restitution avec les technologies d’assistance de la
181
+ base de référence, et pas uniquement avec l’inspection DOM.
182
+ </li>
183
+ <li>
184
+ <strong>Surveiller les contenus HTML autorisés</strong> : lorsque
185
+ <code>allowHtml</code> est activé, vérifier que le contenu injecté reste
186
+ compréhensible, lisible et compatible avec les technologies d’assistance.
187
+ </li>
188
+ <li>
189
+ <strong>Préserver l’ordre de tabulation</strong> : l’ouverture, la fermeture,
190
+ la sélection multiple et la suppression de sélection ne doivent pas créer de
191
+ rupture dans le parcours clavier.
192
+ </li>
193
+ </ul>
194
+ </BestPracticesSection>
195
+
196
+ <ResourcesSection>
197
+ <ul>
198
+ <li><a href="https://accessibilite.numerique.gouv.fr/methode/criteres-et-tests/" target="_blank" rel="noopener noreferrer">RGAA 4.1 — Critères et tests</a></li>
199
+ <li><a href="https://accessibilite.numerique.gouv.fr/doc/RGAA-v4.1.pdf" target="_blank" rel="noopener noreferrer">RGAA 4.1 — Référentiel technique (PDF)</a></li>
200
+ <li><a href="https://www.w3.org/WAI/ARIA/apg/patterns/combobox/" target="_blank" rel="noopener noreferrer">WAI-ARIA Authoring Practices — Combobox pattern</a></li>
201
+ <li><a href="https://www.w3.org/TR/wai-aria-1.2/#combobox" target="_blank" rel="noopener noreferrer">WAI-ARIA 1.2 — Combobox role</a></li>
202
+ </ul>
203
+ </ResourcesSection>
204
+ </AccessibilityGuideLayout>
@@ -487,6 +487,41 @@ describe('SySelect.vue', () => {
487
487
  wrapper.unmount()
488
488
  })
489
489
 
490
+ it('n\'affiche pas d\'erreur à l\'ouverture du menu mais seulement à la fermeture', async () => {
491
+ const wrapper = mount(SySelect, {
492
+ props: {
493
+ required: true,
494
+ label: 'Test Label',
495
+ modelValue: undefined,
496
+ items: [
497
+ { text: 'Option 1', value: '1' },
498
+ { text: 'Option 2', value: '2' },
499
+ ],
500
+ },
501
+ attachTo: document.body,
502
+ })
503
+
504
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- This is a generic type
505
+ const instance = wrapper.vm as any
506
+
507
+ // Au départ, pas d'erreur
508
+ expect(instance.hasError).toBe(false)
509
+
510
+ // Ouverture du menu - l'erreur ne doit pas s'afficher
511
+ await wrapper.find('.v-field').trigger('click')
512
+ await wrapper.vm.$nextTick()
513
+ expect(instance.hasError).toBe(false)
514
+ expect(instance.isOpen).toBe(true)
515
+
516
+ // Fermeture du menu sans sélection - l'erreur doit s'afficher
517
+ await wrapper.find('.v-field').trigger('click')
518
+ await wrapper.vm.$nextTick()
519
+ expect(instance.hasError).toBe(true)
520
+ expect(instance.isOpen).toBe(false)
521
+
522
+ wrapper.unmount()
523
+ })
524
+
490
525
  it('n\'affiche pas d\'erreur quand disableErrorHandling est true', async () => {
491
526
  const wrapper = mount(SySelect, {
492
527
  props: {
@@ -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)
@@ -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"
@@ -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