@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
@@ -51,9 +51,6 @@ type Story = StoryObj<typeof meta>
51
51
  export const Default: Story = {
52
52
  args: {},
53
53
  parameters: {
54
- a11y: {
55
- disable: true,
56
- },
57
54
  sourceCode: [
58
55
  {
59
56
  name: 'Template',
@@ -85,9 +82,6 @@ export const Disabled: Story = {
85
82
  ],
86
83
  },
87
84
  parameters: {
88
- a11y: {
89
- disable: true,
90
- },
91
85
  sourceCode: [
92
86
  {
93
87
  name: 'Template',
@@ -124,7 +118,7 @@ export const WithVModel: Story = {
124
118
  Onglet actif: {{ activeTab }}
125
119
  <button
126
120
  class="ml-4 px-2 py-1 bg-primary text-white rounded"
127
- @click="activeTab = activeTab === 'tab1' ? 'tab2' : 'tab1'"
121
+ @click="activeTab = activeTab === 'tab1' ? 'tab2' : activeTab === 'tab2' ? 'tab3' : 'tab1'"
128
122
  >
129
123
  Changer d'onglet
130
124
  </button>
@@ -134,9 +128,6 @@ export const WithVModel: Story = {
134
128
  `,
135
129
  }),
136
130
  parameters: {
137
- a11y: {
138
- disable: true,
139
- },
140
131
  sourceCode: [
141
132
  {
142
133
  name: 'Template',
@@ -147,7 +138,7 @@ export const WithVModel: Story = {
147
138
  Onglet actif: {{ activeTab }}
148
139
  <button
149
140
  class="ml-4 px-2 py-1 bg-primary text-white rounded"
150
- @click="activeTab = activeTab === 'tab1' ? 'tab2' : 'tab1'"
141
+ @click="activeTab = activeTab === 'tab1' ? 'tab2' : activeTab === 'tab2' ? 'tab3' : 'tab1'"
151
142
  >
152
143
  Changer d'onglet
153
144
  </button>
@@ -194,9 +185,6 @@ export const WithTabsPrependSlot: Story = {
194
185
  `,
195
186
  }),
196
187
  parameters: {
197
- a11y: {
198
- disable: true,
199
- },
200
188
  sourceCode: [
201
189
  {
202
190
  name: 'Template',
@@ -234,9 +222,6 @@ export const WithTabsAppendSlot: Story = {
234
222
  `,
235
223
  }),
236
224
  parameters: {
237
- a11y: {
238
- disable: true,
239
- },
240
225
  sourceCode: [
241
226
  {
242
227
  name: 'Template',
@@ -277,9 +262,6 @@ export const WithTabPrependSlot: Story = {
277
262
  `,
278
263
  }),
279
264
  parameters: {
280
- a11y: {
281
- disable: true,
282
- },
283
265
  sourceCode: [
284
266
  {
285
267
  name: 'Template',
@@ -328,9 +310,6 @@ export const WithTabAppendSlot: Story = {
328
310
  `,
329
311
  }),
330
312
  parameters: {
331
- a11y: {
332
- disable: true,
333
- },
334
313
  sourceCode: [
335
314
  {
336
315
  name: 'Template',
@@ -383,9 +362,6 @@ export const WithCustomContent: Story = {
383
362
  `,
384
363
  }),
385
364
  parameters: {
386
- a11y: {
387
- disable: true,
388
- },
389
365
  sourceCode: [
390
366
  {
391
367
  name: 'Template',
@@ -422,9 +398,6 @@ export const ManyTabs: Story = {
422
398
  })),
423
399
  },
424
400
  parameters: {
425
- a11y: {
426
- disable: true,
427
- },
428
401
  sourceCode: [
429
402
  {
430
403
  name: 'Template',
@@ -466,9 +439,6 @@ export const CustomTheme: Story = {
466
439
  `,
467
440
  }),
468
441
  parameters: {
469
- a11y: {
470
- disable: true,
471
- },
472
442
  sourceCode: [
473
443
  {
474
444
  name: 'Template',
@@ -499,6 +469,38 @@ const items = [
499
469
  },
500
470
  }
501
471
 
472
+ /**
473
+ * Exemple de SyTabs utilisé comme menu de navigation (Routing).
474
+ * La sémantique d'accessibilité s'adapte automatiquement (utilisation d'une balise <nav> et retrait des rôles ARIA d'onglets).
475
+ */
476
+ export const NavigationMode: Story = {
477
+ args: {
478
+ items: [
479
+ { label: 'Accueil', value: 'home', href: 'javascript:void(0)' },
480
+ { label: 'Profil', value: 'profile', href: 'javascript:void(0)' },
481
+ { label: 'Paramètres', value: 'settings', href: 'javascript:void(0)' },
482
+ ],
483
+ },
484
+ parameters: {
485
+ sourceCode: [
486
+ {
487
+ name: 'Template',
488
+ code: `<SyTabs :items="items" />`,
489
+ },
490
+ {
491
+ name: 'Script',
492
+ code: `
493
+ const items = [
494
+ { label: 'Accueil', value: 'home', href: '#' },
495
+ { label: 'Profil', value: 'profile', href: '#profile' },
496
+ { label: 'Paramètres', value: 'settings', href: '#settings' },
497
+ ]
498
+ `,
499
+ },
500
+ ],
501
+ },
502
+ }
503
+
502
504
  /**
503
505
  * Exemple avec confirmation avant changement d'onglet.
504
506
  * Démontre comment utiliser la propriété confirmTabChange et gérer l'événement confirm-tab-change.
@@ -533,9 +535,6 @@ export const WithTabConfirmation: Story = {
533
535
  `,
534
536
  }),
535
537
  parameters: {
536
- a11y: {
537
- disable: true,
538
- },
539
538
  sourceCode: [
540
539
  {
541
540
  name: 'Template',
@@ -1,6 +1,6 @@
1
1
  <script setup lang="ts">
2
2
  import useCustomizableOptions from '@/composables/useCustomizableOptions'
3
- import { getCurrentInstance, onMounted, onUnmounted, ref, watch } from 'vue'
3
+ import { computed, getCurrentInstance, onMounted, onUnmounted, ref, watch } from 'vue'
4
4
  import type { Router } from 'vue-router'
5
5
  import { config } from './config'
6
6
  import type { TabItem } from './types'
@@ -12,8 +12,9 @@
12
12
  /** Si activé, une confirmation sera demandée avant de changer d'onglet */
13
13
  confirmTabChange?: boolean
14
14
  /** Message affiché dans la boîte de dialogue de confirmation */
15
- confirmationMessage?: boolean
16
- /** Options personnalisées pour les composants Vuetify */
15
+ confirmationMessage?: string
16
+ /** Si activé, le contenu des onglets ne sera rendu que lorsqu'ils deviendront actifs */
17
+ lazy?: boolean
17
18
  vuetifyOptions?: {
18
19
  sheet?: {
19
20
  theme?: string
@@ -34,7 +35,8 @@
34
35
  }>(), {
35
36
  modelValue: undefined,
36
37
  confirmTabChange: false,
37
- confirmationMessage: false,
38
+ confirmationMessage: 'Voulez-vous vraiment changer d\'onglet ?',
39
+ lazy: false,
38
40
  vuetifyOptions: () => ({}),
39
41
  })
40
42
 
@@ -43,7 +45,11 @@
43
45
  inheritAttrs: false,
44
46
  })
45
47
 
46
- const emit = defineEmits(['update:modelValue', 'cancel-navigation', 'confirm-tab-change'])
48
+ const emit = defineEmits<{
49
+ 'update:modelValue': [value: number | string]
50
+ 'cancel-navigation': []
51
+ 'confirm-tab-change': [message: string, resolve: (confirmed: boolean) => void]
52
+ }>()
47
53
 
48
54
  defineSlots<{
49
55
  'tabs-prepend': () => unknown
@@ -55,6 +61,9 @@
55
61
 
56
62
  const options = useCustomizableOptions(config, { vuetifyOptions: props.vuetifyOptions })
57
63
 
64
+ // Détecte automatiquement si le composant est utilisé pour la navigation
65
+ const isNavigationMode = computed(() => props.items.some(item => !!item.to || !!item.href))
66
+
58
67
  // Safely get router through getCurrentInstance - it might not be available in all contexts
59
68
  const instance = getCurrentInstance()
60
69
  const router = instance?.appContext.config.globalProperties.$router as Router | null || null
@@ -64,6 +73,16 @@
64
73
  // Élément actuellement focusé (pour la navigation clavier)
65
74
  const focusedItemIndex = ref<number>(-1)
66
75
 
76
+ // Keep track of rendered panels for lazy loading
77
+ const renderedPanels = ref<Set<number>>(new Set([0]))
78
+
79
+ // Observer les changements pour le lazy loading
80
+ watch(activeItemIndex, (newIndex) => {
81
+ if (props.lazy && !renderedPanels.value.has(newIndex)) {
82
+ renderedPanels.value.add(newIndex)
83
+ }
84
+ }, { immediate: true })
85
+
67
86
  // Émet un événement pour gérer la confirmation de changement d'onglet
68
87
  async function handleTabChangeConfirmation(message: string): Promise<boolean> {
69
88
  // Émettre l'événement avec le message et retourner une promesse
@@ -91,10 +110,8 @@
91
110
  // Ne rien faire si l'élément est désactivé
92
111
  if (item?.disabled) return
93
112
 
94
- const hasHref = item && (item.href || item.to)
95
-
96
113
  // Si la confirmation est activée, demander confirmation
97
- if (props.confirmTabChange && hasHref) {
114
+ if (props.confirmTabChange) {
98
115
  const confirmMessage = props.confirmationMessage
99
116
  const confirmed = await handleTabChangeConfirmation(confirmMessage.toString())
100
117
 
@@ -103,7 +120,6 @@
103
120
  emit('cancel-navigation')
104
121
  return
105
122
  }
106
- // Si confirmé, laisser la navigation se faire naturellement (RouterLink ou href)
107
123
  }
108
124
 
109
125
  // Mettre à jour l'onglet actif
@@ -118,16 +134,23 @@
118
134
  function handleKeyPress(event: KeyboardEvent, index: number) {
119
135
  if (event.key === 'Enter' || event.key === ' ') {
120
136
  const item = props.items[index] as TabItem | undefined
121
- // Ne rien faire si l'élément est désactivé
122
137
  if (item?.disabled) {
123
138
  event.preventDefault()
124
139
  return
125
140
  }
126
- // Don't prevent default for external links - let them navigate naturally
127
- if (!item?.href) {
141
+
142
+ if (isNavigationMode.value) {
143
+ // En mode navigation, Enter active le lien nativement.
144
+ // Espace doit forcer le clic pour éviter le scroll
145
+ if (event.key === ' ') {
146
+ event.preventDefault()
147
+ document.getElementById(`tab-${index}`)?.click()
148
+ }
149
+ }
150
+ else {
128
151
  event.preventDefault()
152
+ void setActiveItem(index)
129
153
  }
130
- void setActiveItem(index) // void pour ignorer la promesse
131
154
  }
132
155
  }
133
156
 
@@ -178,12 +201,14 @@
178
201
  // Mettre à jour l'index de l'élément focusé et actif
179
202
  focusedItemIndex.value = newIndex
180
203
 
181
- // Focus sur le nouvel élément et l'activer
182
- // Vérifier si l'élément existe et se focaliser sur le bouton
204
+ // Focus sur le nouvel élément
183
205
  const tabButton = document.getElementById(`tab-${newIndex}`)
184
206
  if (tabButton) {
185
207
  tabButton.focus()
186
- setActiveItem(newIndex)
208
+ // Activer automatiquement seulement en mode onglets locaux
209
+ if (!isNavigationMode.value) {
210
+ setActiveItem(newIndex)
211
+ }
187
212
  }
188
213
  }
189
214
 
@@ -192,8 +217,8 @@
192
217
  // Configurer l'accessibilité
193
218
  setupAccessibilityFeatures()
194
219
 
195
- // Si les items ne sont pas un tableau ou vides, ne rien faire
196
- if (!Array.isArray(props.items) || props.items.length === 0) return
220
+ // Si les items sont vides, ne rien faire
221
+ if (!props.items?.length) return
197
222
 
198
223
  // Si modelValue est défini, utiliser cette valeur pour déterminer l'index actif
199
224
  if (props.modelValue !== undefined) {
@@ -319,20 +344,17 @@
319
344
  <div class="sy-tabs px-xl-0 px-4">
320
345
  <slot name="tabs-prepend" />
321
346
  <slot>
322
- <nav
323
- role="tablist"
324
- aria-label="Onglets de navigation"
325
- class="sy-tabs__nav"
326
- >
327
- <ul
347
+ <div class="sy-tabs__nav">
348
+ <component
349
+ :is="isNavigationMode ? 'nav' : 'div'"
328
350
  ref="tablist"
351
+ :role="isNavigationMode ? 'navigation' : 'tablist'"
352
+ :aria-label="isNavigationMode ? 'Menu de navigation' : 'Onglets de navigation'"
329
353
  class="sy-tabs__list"
330
354
  >
331
- <li
332
- v-for="(item, index) in Array.isArray(items) ? items : []"
355
+ <template
356
+ v-for="(item, index) in items"
333
357
  :key="item.label || index"
334
- class="sy-tabs__item"
335
- role="presentation"
336
358
  >
337
359
  <!-- Use RouterLink for internal navigation -->
338
360
  <RouterLink
@@ -344,11 +366,12 @@
344
366
  'sy-tabs__button--active': activeItemIndex === index,
345
367
  'sy-tabs__button--disabled': item.disabled
346
368
  }"
347
- role="tab"
348
- :aria-selected="activeItemIndex === index"
349
- :aria-controls="`panel-${index}`"
369
+ :role="isNavigationMode ? undefined : 'tab'"
370
+ :aria-current="isNavigationMode && activeItemIndex === index ? 'page' : undefined"
371
+ :aria-selected="!isNavigationMode ? activeItemIndex === index : undefined"
372
+ :aria-controls="!isNavigationMode ? `panel-${index}` : undefined"
350
373
  :aria-disabled="item.disabled || undefined"
351
- :tabindex="item.disabled ? -1 : 0"
374
+ :tabindex="(activeItemIndex === index && !item.disabled) ? 0 : -1"
352
375
  @click="item.disabled ? undefined : setActiveItem(index)"
353
376
  @keydown="(event) => {
354
377
  if (!item.disabled) {
@@ -381,11 +404,12 @@
381
404
  'sy-tabs__button--active': activeItemIndex === index,
382
405
  'sy-tabs__button--disabled': item.disabled
383
406
  }"
384
- role="tab"
385
- :aria-selected="activeItemIndex === index"
386
- :aria-controls="`panel-${index}`"
407
+ :role="isNavigationMode ? undefined : 'tab'"
408
+ :aria-current="isNavigationMode && activeItemIndex === index ? 'page' : undefined"
409
+ :aria-selected="!isNavigationMode ? activeItemIndex === index : undefined"
410
+ :aria-controls="!isNavigationMode ? `panel-${index}` : undefined"
387
411
  :aria-disabled="item.disabled || undefined"
388
- :tabindex="item.disabled ? -1 : 0"
412
+ :tabindex="(activeItemIndex === index && !item.disabled) ? 0 : -1"
389
413
  @click="(event) => {
390
414
  if (item.disabled) {
391
415
  event.preventDefault();
@@ -425,9 +449,10 @@
425
449
  'sy-tabs__button--active': activeItemIndex === index,
426
450
  'sy-tabs__button--disabled': true
427
451
  }"
428
- role="tab"
429
- :aria-selected="activeItemIndex === index"
430
- :aria-controls="`panel-${index}`"
452
+ :role="isNavigationMode ? undefined : 'tab'"
453
+ :aria-current="isNavigationMode && activeItemIndex === index ? 'page' : undefined"
454
+ :aria-selected="!isNavigationMode ? activeItemIndex === index : undefined"
455
+ :aria-controls="!isNavigationMode ? `panel-${index}` : undefined"
431
456
  aria-disabled="true"
432
457
  tabindex="-1"
433
458
  disabled
@@ -455,9 +480,10 @@
455
480
  'sy-tabs__button--active': activeItemIndex === index,
456
481
  'sy-tabs__button--disabled': true
457
482
  }"
458
- role="tab"
459
- :aria-selected="activeItemIndex === index"
460
- :aria-controls="`panel-${index}`"
483
+ :role="isNavigationMode ? undefined : 'tab'"
484
+ :aria-current="isNavigationMode && activeItemIndex === index ? 'page' : undefined"
485
+ :aria-selected="!isNavigationMode ? activeItemIndex === index : undefined"
486
+ :aria-controls="!isNavigationMode ? `panel-${index}` : undefined"
461
487
  aria-disabled="true"
462
488
  tabindex="-1"
463
489
  disabled
@@ -485,11 +511,12 @@
485
511
  'sy-tabs__button--active': activeItemIndex === index,
486
512
  'sy-tabs__button--disabled': item.disabled
487
513
  }"
488
- role="tab"
489
- :aria-selected="activeItemIndex === index"
490
- :aria-controls="`panel-${index}`"
514
+ :role="isNavigationMode ? undefined : 'tab'"
515
+ :aria-current="isNavigationMode && activeItemIndex === index ? 'page' : undefined"
516
+ :aria-selected="!isNavigationMode ? activeItemIndex === index : undefined"
517
+ :aria-controls="!isNavigationMode ? `panel-${index}` : undefined"
491
518
  :aria-disabled="item.disabled || undefined"
492
- :tabindex="item.disabled ? -1 : 0"
519
+ :tabindex="(activeItemIndex === index && !item.disabled) ? 0 : -1"
493
520
  :disabled="item.disabled"
494
521
  @click="setActiveItem(index)"
495
522
  @keydown="(event) => {
@@ -513,9 +540,9 @@
513
540
  :is-active="activeItemIndex === index"
514
541
  />
515
542
  </button>
516
- </li>
517
- </ul>
518
- </nav>
543
+ </template>
544
+ </component>
545
+ </div>
519
546
  </slot>
520
547
  <slot name="tabs-append" />
521
548
  </div>
@@ -524,27 +551,27 @@
524
551
  <!-- Panneau de contenu des onglets -->
525
552
  <div class="sy-tabs-panels">
526
553
  <div
527
- v-for="(item, index) in Array.isArray(items) ? items : []"
554
+ v-for="(item, index) in items"
528
555
  :id="`panel-${index}`"
529
556
  :key="`panel-${index}`"
530
557
  class="sy-tabs-panel"
531
- role="tabpanel"
532
- :aria-labelledby="`tab-${index}`"
558
+ :role="!isNavigationMode ? 'tabpanel' : undefined"
559
+ :aria-labelledby="!isNavigationMode ? `tab-${index}` : undefined"
533
560
  :hidden="activeItemIndex !== index"
534
561
  >
535
- <slot
536
- :name="`panel-${index}`"
537
- :active="activeItemIndex === index"
538
- >
539
- {{ item.content || '' }}
540
- </slot>
562
+ <template v-if="!lazy || renderedPanels.has(index)">
563
+ <slot
564
+ :name="`panel-${index}`"
565
+ :active="activeItemIndex === index"
566
+ >
567
+ {{ item.content || '' }}
568
+ </slot>
569
+ </template>
541
570
  </div>
542
571
  </div>
543
572
  </template>
544
573
 
545
574
  <style lang="scss" scoped>
546
- @use '@/assets/tokens.scss' as *;
547
-
548
575
  .sy-tabs {
549
576
  display: flex;
550
577
  align-items: center;
@@ -558,7 +585,6 @@
558
585
  .sy-tabs__list {
559
586
  display: flex;
560
587
  position: relative;
561
- list-style-type: none;
562
588
  padding: 0;
563
589
  margin: 0;
564
590
  width: 100%;
@@ -576,12 +602,6 @@
576
602
  background-color: v-bind("options.tab['slider-color']");
577
603
  }
578
604
 
579
- .sy-tabs__item {
580
- cursor: pointer;
581
- display: flex;
582
- align-items: stretch;
583
- }
584
-
585
605
  .sy-tabs__button {
586
606
  display: flex;
587
607
  align-items: center;
@@ -32,10 +32,11 @@ import '@/stories/styles/shared.css';
32
32
  <h3>Structure sémantique</h3>
33
33
  </div>
34
34
  <ul>
35
- <li><strong>Rôles ARIA appropriés</strong> : <code>role="tablist"</code> pour la liste d'onglets, <code>role="tab"</code> pour chaque onglet et <code>role="tabpanel"</code> pour chaque panneau de contenu</li>
36
- <li><strong>État des onglets</strong> : <code>aria-selected</code> avec les valeurs <code>true</code> ou <code>false</code> pour indiquer l'onglet actif</li>
37
- <li><strong>Relations entre éléments</strong> : <code>aria-controls</code> pour associer chaque onglet à son panneau, et <code>aria-labelledby</code> pour associer chaque panneau à son onglet</li>
38
- <li><strong>Navigation structurée</strong> : Utilisation d'éléments <code>&lt;nav&gt;</code> et <code>&lt;ul&gt;</code> pour créer une structure de navigation sémantique et accessible</li>
35
+ <li><strong>Rôles et sémantique adaptatifs</strong> : Utilisation dynamique de <code>role="tablist"</code> / <code>role="tab"</code> / <code>role="tabpanel"</code> (mode Onglets) ou de la balise native <code>&lt;nav role="navigation"&gt;</code> (mode Navigation)</li>
36
+ <li><strong>État de l'élément actif</strong> : Utilisation de <code>aria-selected="true"</code> (mode Onglets) ou <code>aria-current="page"</code> (mode Navigation)</li>
37
+ <li><strong>Relations programmatiques</strong> : <code>aria-controls</code> et <code>aria-labelledby</code> lient les onglets à leurs panneaux respectifs (uniquement en mode Onglets)</li>
38
+ <li><strong>Nommage accessible</strong> : Le conteneur principal possède un <code>aria-label</code> dynamique (<em>"Onglets de navigation"</em> ou <em>"Menu de navigation"</em> selon le mode)</li>
39
+ <li><strong>Structure HTML aplatie</strong> : Les éléments interactifs (boutons ou liens) sont contenus directement dans leur parent sémantique (<code>&lt;div&gt;</code> ou <code>&lt;nav&gt;</code>) sans balises de liste (<code>&lt;ul&gt;</code>) superflues, optimisant l'arbre d'accessibilité</li>
39
40
  </ul>
40
41
  </div>
41
42
 
@@ -60,10 +61,11 @@ import '@/stories/styles/shared.css';
60
61
  <h3>États et retours d'information</h3>
61
62
  </div>
62
63
  <ul>
63
- <li><strong>État de sélection</strong> : <code>aria-selected="true"</code> indique l'onglet actif aux technologies d'assistance</li>
64
- <li><strong>Visibilité des panneaux</strong> : L'attribut <code>hidden</code> sur les panneaux inactifs les rend invisibles aux lecteurs d'écran</li>
65
- <li><strong>Indication visuelle</strong> : Styles distinctifs pour l'onglet actif (couleur, bordure inférieure)</li>
66
- <li><strong>Association explicite</strong> : Chaque panneau de contenu est clairement associé à son onglet via <code>aria-labelledby</code></li>
64
+ <li><strong>État de sélection</strong> : <code>aria-selected="true"</code> ou <code>aria-current="page"</code> indique l'élément actif aux technologies d'assistance</li>
65
+ <li><strong>Éléments désactivés</strong> : Utilisation de l'attribut natif <code>disabled</code> (pour les boutons) ou <code>aria-disabled="true"</code> (pour les liens), qui sont par ailleurs exclus de la navigation au clavier (flèches)</li>
66
+ <li><strong>Visibilité des panneaux</strong> : L'attribut HTML <code>hidden</code> sur les panneaux inactifs les retire correctement de l'arbre d'accessibilité</li>
67
+ <li><strong>Indication visuelle</strong> : Styles distinctifs pour l'onglet actif (couleur de texte, barre de soulignement animée)</li>
68
+ <li><strong>Focus visible</strong> : Un <code>outline</code> de 3px est appliqué lors de la navigation au clavier (<code>:focus-visible</code>)</li>
67
69
  </ul>
68
70
  </div>
69
71
 
@@ -81,25 +83,52 @@ import '@/stories/styles/shared.css';
81
83
  </div>
82
84
  </div>
83
85
 
86
+ <div className="adaptive-mode-section">
87
+ <h2>Mode adaptatif (Onglets vs Navigation)</h2>
88
+ <div className="section-description">
89
+ Le composant SyTabs détecte automatiquement son contexte d'utilisation et adapte sa structure sémantique en conséquence :
90
+ </div>
91
+
92
+ <div className="criteria-card">
93
+ <div className="criteria-header">
94
+ <span className="criteria-icon">📑</span>
95
+ <h3>Mode Onglets (par défaut)</h3>
96
+ </div>
97
+ <p>Utilisé pour permuter du contenu local sans changer d'URL.</p>
98
+ <ul>
99
+ <li>Utilise le modèle WAI-ARIA complet pour les onglets (<code>role="tablist"</code>, <code>role="tab"</code>, <code>role="tabpanel"</code>).</li>
100
+ <li>L'activation de l'onglet par les flèches du clavier est <strong>automatique</strong>.</li>
101
+ </ul>
102
+ </div>
103
+
104
+ <div className="criteria-card">
105
+ <div className="criteria-header">
106
+ <span className="criteria-icon">🧭</span>
107
+ <h3>Mode Navigation (Routing)</h3>
108
+ </div>
109
+ <p>Activé automatiquement si au moins un onglet utilise les attributs <code>to</code> ou <code>href</code>.</p>
110
+ <ul>
111
+ <li>Utilise une sémantique de navigation standard (<code>&lt;nav role="navigation"&gt;</code>) au lieu des rôles ARIA d'onglets pour éviter la confusion des utilisateurs de lecteurs d'écran.</li>
112
+ <li>Indique l'élément actif via <code>aria-current="page"</code> au lieu de <code>aria-selected</code>.</li>
113
+ <li>L'activation au clavier est <strong>manuelle</strong> : les flèches déplacent le focus sans déclencher le lien, la touche Entrée valide le choix.</li>
114
+ <li>Les rôles <code>tabpanel</code> ne sont pas générés car ce concept n'est pas applicable à la navigation entre différentes pages.</li>
115
+ </ul>
116
+ </div>
117
+ </div>
118
+
84
119
  <div className="automatic-section">
85
- <h2>Activation automatique des onglets</h2>
120
+ <h2>Activation automatique (Mode Onglets)</h2>
86
121
  <div className="section-description">
87
- Le composant SyTabs implémente un modèle d'activation automatique, ce qui signifie que :
122
+ En <strong>Mode Onglets</strong>, le composant implémente un modèle d'activation automatique :
88
123
  </div>
89
124
  <ul>
90
- <li>La sélection d'un nouvel onglet via la navigation par flèches active immédiatement cet onglet</li>
91
- <li>Le contenu du panneau associé est affiché sans nécessiter une action supplémentaire</li>
92
- <li>Le focus reste sur l'onglet activé pour permettre de continuer la navigation par clavier</li>
125
+ <li>La sélection d'un nouvel onglet via la navigation par flèches (Gauche/Droite) active immédiatement cet onglet</li>
126
+ <li>Le contenu du panneau associé est affiché sans nécessiter une action supplémentaire (Entrée/Espace)</li>
127
+ <li>Le focus reste sur l'onglet activé pour permettre de continuer la navigation au clavier</li>
93
128
  </ul>
94
129
  <div className="section-description">
95
- Cette implémentation suit les meilleures pratiques WAI-ARIA pour les interfaces à onglets :
130
+ <em>Note : En Mode Navigation (Routing), l'activation est manuelle (déplacement du focus avec les flèches, puis validation avec Entrée) pour éviter les redirections inattendues.</em>
96
131
  </div>
97
- <ul>
98
- <li>Réduction du nombre d'actions nécessaires pour naviguer entre les contenus</li>
99
- <li>Mise à jour dynamique de l'attribut <code>aria-selected</code> pour informer des changements</li>
100
- <li>Gestion efficace du focus pour éviter les sauts d'interface désorientants</li>
101
- <li>Mise à jour de l'affichage des panneaux avec l'attribut <code>hidden</code> pour les panneaux inactifs</li>
102
- </ul>
103
132
  </div>
104
133
 
105
134
  <div className="demo-section">
@@ -112,9 +141,9 @@ import '@/stories/styles/shared.css';
112
141
  </div>
113
142
 
114
143
  <div className="tab-panel-section">
115
- <h2>Relation onglet-panneau</h2>
144
+ <h2>Relation onglet-panneau (Mode Onglets)</h2>
116
145
  <div className="section-description">
117
- Le composant SyTabs établit une relation claire entre chaque onglet et son panneau de contenu associé :
146
+ Lorsqu'il n'est pas utilisé pour la navigation de pages, le composant établit une relation programmatique stricte :
118
147
  </div>
119
148
  <ul>
120
149
  <li>Chaque onglet (<code>role="tab"</code>) est associé à un panneau de contenu via <code>aria-controls</code></li>
@@ -132,6 +161,13 @@ import '@/stories/styles/shared.css';
132
161
  </div>
133
162
  </div>
134
163
 
164
+ <div className="warning-section">
165
+ <h2>Note d'audit (Faux positif Tanaguru)</h2>
166
+ <p>
167
+ Un faux positif (éléments interactifs non atteignables en navigation clavier) est remonté par Tanaguru. En réalité, le composant gère intentionnellement le focus via un <em>roving tabindex</em> dans ses deux modes (Onglets et Navigation) pour une meilleure ergonomie : seul l'élément actif est dans l'ordre de tabulation classique (Tab), les autres éléments étant atteignables via les touches fléchées. Une vérification manuelle au clavier confirme que tous les éléments sont parfaitement accessibles et activables, conformément aux comportements attendus.
168
+ </p>
169
+ </div>
170
+
135
171
  <div className="best-practices">
136
172
  <h2>Bonnes pratiques d'utilisation</h2>
137
173
  <ul>
@@ -195,11 +231,15 @@ import '@/stories/styles/shared.css';
195
231
  }
196
232
 
197
233
  .criteria-section h2,
234
+ .adaptive-mode-section h2,
198
235
  .demo-section h2,
199
236
  .tri-state-section h2,
200
237
  .parent-child-section h2,
201
238
  .best-practices h2,
202
- .resources-section h2 {
239
+ .automatic-section h2,
240
+ .tab-panel-section h2,
241
+ .resources-section h2,
242
+ .warning-section h2 {
203
243
  border-bottom: 2px solid #eaecef;
204
244
  padding-bottom: 10px;
205
245
  margin-top: 30px;
@@ -207,6 +247,12 @@ import '@/stories/styles/shared.css';
207
247
  color: #0077cc;
208
248
  }
209
249
 
250
+ .warning-section h2 {
251
+ color: #856404;
252
+ border-bottom-color: #ffeeba;
253
+ margin-top: 0;
254
+ }
255
+
210
256
  .criteria-card {
211
257
  background-color: #fff;
212
258
  border-radius: 8px;
@@ -257,6 +303,20 @@ import '@/stories/styles/shared.css';
257
303
  margin-bottom: 30px;
258
304
  }
259
305
 
306
+ .warning-section {
307
+ background-color: #fff3cd;
308
+ border-left: 5px solid #ffeeba;
309
+ padding: 20px;
310
+ border-radius: 8px;
311
+ margin-bottom: 40px;
312
+ }
313
+
314
+ .warning-section p {
315
+ color: #856404;
316
+ line-height: 1.6;
317
+ margin: 0;
318
+ }
319
+
260
320
  .tri-state-section p,
261
321
  .parent-child-section p {
262
322
  line-height: 1.6;
@@ -9,9 +9,9 @@ export const config = {
9
9
  'show-arrows': true,
10
10
  },
11
11
  tab: {
12
- 'base-color': '#0C419A',
13
- 'active-color': '#0C419A',
14
- 'slider-color': '#0C419A',
12
+ 'base-color': 'rgb(var(--v-theme-colorPrimary))',
13
+ 'active-color': 'rgb(var(--v-theme-colorPrimary))',
14
+ 'slider-color': 'rgb(var(--v-theme-colorPrimary))',
15
15
  'ripple': false,
16
16
  },
17
17
  }