@cnamts/synapse 1.0.6 → 1.0.7

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 (223) hide show
  1. package/dist/{DateFilter-BlOpwEVq.js → DateFilter-CHDLz2EO.js} +1 -1
  2. package/dist/{NumberFilter-BPUXE4wY.js → NumberFilter-DXNQ4Uls.js} +1 -1
  3. package/dist/{PeriodFilter-B2yx329_.js → PeriodFilter-C8Qf3Jcn.js} +1 -1
  4. package/dist/{SelectFilter-CedKn1oV.js → SelectFilter-B2Ejs4Cb.js} +1 -1
  5. package/dist/{TextFilter-DkhJjRtR.js → TextFilter-CfR5_A1S.js} +1 -1
  6. package/dist/components/Amelipro/AmeliproAccordionGroup/AmeliproAccordionGroup.d.ts +116 -0
  7. package/dist/components/Amelipro/AmeliproAccordionGroup/types.d.ts +4 -0
  8. package/dist/components/Amelipro/AmeliproAccordionList/AmeliproAccordionList.d.ts +220 -0
  9. package/dist/components/Amelipro/AmeliproAccordionResult/AmeliproAccordionResult.d.ts +68 -0
  10. package/dist/components/Amelipro/AmeliproAccordionResult/AmeliproAccordionResultTemplate/AmeliproAccordionResultTemplate.d.ts +70 -0
  11. package/dist/components/Amelipro/AmeliproAccordionResultList/AmeliproAccordionResultList.d.ts +204 -0
  12. package/dist/components/Amelipro/AmeliproAutoCompleteField/AmeliproAutoCompleteField.d.ts +26 -26
  13. package/dist/components/Amelipro/AmeliproBadge/AmeliproBadge.d.ts +59 -0
  14. package/dist/components/Amelipro/AmeliproBtn/AmeliproBtn.d.ts +3 -3
  15. package/dist/components/Amelipro/AmeliproCaptcha/AmeliproCaptcha.d.ts +1 -1
  16. package/dist/components/Amelipro/AmeliproCarousel/AmeliproCarousel.d.ts +214 -0
  17. package/dist/components/Amelipro/AmeliproCarousel/AmeliproCarouselItem/AmeliproCarouselItem.d.ts +70 -0
  18. package/dist/components/Amelipro/AmeliproCarousel/types.d.ts +7 -0
  19. package/dist/components/Amelipro/AmeliproClickableTile/AmeliproClickableTile.d.ts +125 -0
  20. package/dist/components/Amelipro/AmeliproIconBtn/AmeliproIconBtn.d.ts +1 -1
  21. package/dist/components/Amelipro/AmeliproIllustratedDataTile/AmeliproIllustratedDataTile.d.ts +2 -2
  22. package/dist/components/Amelipro/AmeliproResultList/AmeliproResultList.d.ts +164 -0
  23. package/dist/components/Amelipro/AmeliproSelect/AmeliproSelect.d.ts +27 -27
  24. package/dist/components/Amelipro/AmeliproStateTile/AmeliproStateTile.d.ts +1 -1
  25. package/dist/components/Amelipro/AmeliproTable/AmeliproTable.d.ts +1 -1
  26. package/dist/components/Amelipro/AmeliproTabs/AmeliproTabs.d.ts +32 -32
  27. package/dist/components/Amelipro/AmeliproTextArea/AmeliproTextArea.d.ts +6 -6
  28. package/dist/components/Amelipro/AmeliproTextField/AmeliproTextField.d.ts +7 -7
  29. package/dist/components/Amelipro/AmeliproTileBtn/AmeliproTileBtn.d.ts +1 -1
  30. package/dist/components/Amelipro/AmeliproTooltips/AmeliproTooltips.d.ts +2 -2
  31. package/dist/components/ChipList/ChipList.d.ts +4 -0
  32. package/dist/components/ChipList/locales.d.ts +4 -2
  33. package/dist/components/CookiesSelection/CookiesInformation/CookiesInformation.d.ts +8 -8
  34. package/dist/components/Customs/Selects/SySelect/SySelect.d.ts +445 -8
  35. package/dist/components/Customs/SyCheckbox/SyCheckbox.d.ts +2 -0
  36. package/dist/components/Customs/SyTabs/SyTabs.d.ts +71 -0
  37. package/dist/components/Customs/SyTabs/config.d.ts +17 -0
  38. package/dist/components/Customs/SyTabs/types.d.ts +11 -0
  39. package/dist/components/Customs/SyTextField/SyTextField.d.ts +9 -9
  40. package/dist/components/DataList/DataList.d.ts +1 -1
  41. package/dist/components/DatePicker/CalendarMode/DatePicker.d.ts +4811 -240
  42. package/dist/components/DatePicker/ComplexDatePicker/ComplexDatePicker.d.ts +52 -33
  43. package/dist/components/DatePicker/DateTextInput/DateTextInput.d.ts +23 -10
  44. package/dist/components/DatePicker/composables/useDateInputEditing.d.ts +1 -0
  45. package/dist/components/DatePicker/composables/useTodayButton.d.ts +1 -0
  46. package/dist/components/DialogBox/DialogBox.d.ts +219 -0
  47. package/dist/components/HeaderLoading/HeaderLoading.d.ts +27 -0
  48. package/dist/components/HeaderNavigationBar/HeaderNavigationBar.d.ts +110 -3
  49. package/dist/components/HeaderNavigationBar/HorizontalNavbar/HorizontalNavbar.d.ts +19 -1
  50. package/dist/components/LangBtn/LangBtn.d.ts +2 -2
  51. package/dist/components/NirField/NirField.d.ts +18 -18
  52. package/dist/components/PeriodField/PeriodField.d.ts +10766 -1620
  53. package/dist/components/PhoneField/PhoneField.d.ts +1866 -2
  54. package/dist/components/PhoneField/indicatifs.d.ts +1 -0
  55. package/dist/components/PhoneField/locales.d.ts +1 -0
  56. package/dist/components/RangeField/RangeField.d.ts +1 -1
  57. package/dist/components/RangeField/RangeSlider/RangeSlider.d.ts +1 -1
  58. package/dist/components/SubHeader/SubHeader.d.ts +8 -0
  59. package/dist/components/SubHeader/locales.d.ts +1 -0
  60. package/dist/components/SyTextArea/SyTextArea.d.ts +6 -6
  61. package/dist/components/Tables/SyServerTable/SyServerTable.d.ts +5 -4
  62. package/dist/components/Tables/SyTable/SyTable.d.ts +5 -4
  63. package/dist/components/Tables/common/SyTablePagination.d.ts +448 -7
  64. package/dist/components/Tables/common/organizeColumns/OrganizeColumns.d.ts +2 -2
  65. package/dist/components/Tables/common/types.d.ts +2 -0
  66. package/dist/components/index.d.ts +9 -0
  67. package/dist/design-system-v3.js +173 -164
  68. package/dist/design-system-v3.umd.cjs +288 -261
  69. package/dist/{main-BXPFSAB4.js → main-C66C1BkG.js} +12984 -11291
  70. package/dist/style.css +1 -1
  71. package/package.json +1 -1
  72. package/src/assets/amelipro/icons.ts +38 -11
  73. package/src/components/Amelipro/AmeliproAccordionGroup/AmeliproAccordionGroup.mdx +20 -0
  74. package/src/components/Amelipro/AmeliproAccordionGroup/AmeliproAccordionGroup.stories.ts +135 -0
  75. package/src/components/Amelipro/AmeliproAccordionGroup/AmeliproAccordionGroup.vue +107 -0
  76. package/src/components/Amelipro/AmeliproAccordionGroup/__tests__/AmeliproAccordionGroup.spec.ts +37 -0
  77. package/src/components/Amelipro/AmeliproAccordionGroup/__tests__/__snapshots__/AmeliproAccordionGroup.spec.ts.snap +513 -0
  78. package/src/components/Amelipro/AmeliproAccordionGroup/types.d.ts +4 -0
  79. package/src/components/Amelipro/AmeliproAccordionList/AmeliproAccordionList.mdx +16 -0
  80. package/src/components/Amelipro/AmeliproAccordionList/AmeliproAccordionList.stories.ts +300 -0
  81. package/src/components/Amelipro/AmeliproAccordionList/AmeliproAccordionList.vue +288 -0
  82. package/src/components/Amelipro/AmeliproAccordionList/__tests__/AmeliproAccordionList.spec.ts +38 -0
  83. package/src/components/Amelipro/AmeliproAccordionList/__tests__/__snapshots__/AmeliproAccordionList.spec.ts.snap +1712 -0
  84. package/src/components/Amelipro/AmeliproAccordionResult/AmeliproAccordionResult.mdx +19 -0
  85. package/src/components/Amelipro/AmeliproAccordionResult/AmeliproAccordionResult.stories.ts +68 -0
  86. package/src/components/Amelipro/AmeliproAccordionResult/AmeliproAccordionResult.vue +66 -0
  87. package/src/components/Amelipro/AmeliproAccordionResult/AmeliproAccordionResultTemplate/AmeliproAccordionResultTemplate.vue +145 -0
  88. package/src/components/Amelipro/AmeliproAccordionResult/AmeliproAccordionResultTemplate/__tests__/AmeliproAccordionResultTemplate.spec.ts +24 -0
  89. package/src/components/Amelipro/AmeliproAccordionResult/AmeliproAccordionResultTemplate/__tests__/__snapshots__/AmeliproAccordionResultTemplate.spec.ts.snap +127 -0
  90. package/src/components/Amelipro/AmeliproAccordionResult/__tests__/AmeliproAccordionResult.spec.ts +24 -0
  91. package/src/components/Amelipro/AmeliproAccordionResult/__tests__/__snapshots__/AmeliproAccordionResult.spec.ts.snap +123 -0
  92. package/src/components/Amelipro/AmeliproAccordionResultList/AmeliproAccordionResultList.mdx +20 -0
  93. package/src/components/Amelipro/AmeliproAccordionResultList/AmeliproAccordionResultList.stories.ts +273 -0
  94. package/src/components/Amelipro/AmeliproAccordionResultList/AmeliproAccordionResultList.vue +275 -0
  95. package/src/components/Amelipro/AmeliproAccordionResultList/__tests__/AmeliproAccordionResultList.spec.ts +38 -0
  96. package/src/components/Amelipro/AmeliproAccordionResultList/__tests__/__snapshots__/AmeliproAccordionResultList.spec.ts.snap +1593 -0
  97. package/src/components/Amelipro/AmeliproBadge/AmeliproBadge.mdx +15 -0
  98. package/src/components/Amelipro/AmeliproBadge/AmeliproBadge.stories.ts +54 -0
  99. package/src/components/Amelipro/AmeliproBadge/AmeliproBadge.vue +76 -0
  100. package/src/components/Amelipro/AmeliproBadge/__tests__/AmeliproBadge.spec.ts +20 -0
  101. package/src/components/Amelipro/AmeliproBadge/__tests__/__snapshots__/AmeliproBadge.spec.ts.snap +19 -0
  102. package/src/components/Amelipro/AmeliproCarousel/AmeliproCarousel.mdx +15 -0
  103. package/src/components/Amelipro/AmeliproCarousel/AmeliproCarousel.stories.ts +191 -0
  104. package/src/components/Amelipro/AmeliproCarousel/AmeliproCarousel.vue +263 -0
  105. package/src/components/Amelipro/AmeliproCarousel/AmeliproCarouselItem/AmeliproCarouselItem.vue +93 -0
  106. package/src/components/Amelipro/AmeliproCarousel/AmeliproCarouselItem/__tests__/AmeliproCarouselItem.spec.ts +24 -0
  107. package/src/components/Amelipro/AmeliproCarousel/AmeliproCarouselItem/__tests__/__snapshots__/AmeliproCarouselItem.spec.ts.snap +43 -0
  108. package/src/components/Amelipro/AmeliproCarousel/__tests__/AmeliproCarousel.spec.ts +40 -0
  109. package/src/components/Amelipro/AmeliproCarousel/__tests__/__snapshots__/AmeliproCarousel.spec.ts.snap +342 -0
  110. package/src/components/Amelipro/AmeliproCarousel/types.d.ts +8 -0
  111. package/src/components/Amelipro/AmeliproClickableTile/AmeliproClickableTile.mdx +18 -0
  112. package/src/components/Amelipro/AmeliproClickableTile/AmeliproClickableTile.stories.ts +67 -0
  113. package/src/components/Amelipro/AmeliproClickableTile/AmeliproClickableTile.vue +233 -0
  114. package/src/components/Amelipro/AmeliproClickableTile/tests/AmeliproClickableTile.spec.ts +21 -0
  115. package/src/components/Amelipro/AmeliproClickableTile/tests/__snapshots__/AmeliproClickableTile.spec.ts.snap +140 -0
  116. package/src/components/Amelipro/AmeliproHeader/AmeliproHeader.vue +7 -1
  117. package/src/components/Amelipro/AmeliproHeader/tests/__snapshots__/AmeliproHeader.spec.ts.snap +5 -4
  118. package/src/components/Amelipro/AmeliproIcon/iconList.ts +6 -0
  119. package/src/components/Amelipro/AmeliproPageLayout/tests/__snapshots__/AmeliproPageLayout.spec.ts.snap +5 -4
  120. package/src/components/Amelipro/AmeliproResultList/AmeliproResultList.mdx +15 -0
  121. package/src/components/Amelipro/AmeliproResultList/AmeliproResultList.stories.ts +264 -0
  122. package/src/components/Amelipro/AmeliproResultList/AmeliproResultList.vue +231 -0
  123. package/src/components/Amelipro/AmeliproResultList/__tests__/AmeliproResultList.spec.ts +37 -0
  124. package/src/components/Amelipro/AmeliproResultList/__tests__/__snapshots__/AmeliproResultList.spec.ts.snap +434 -0
  125. package/src/components/Amelipro/AmeliproTable/AmeliproTable.vue +6 -5
  126. package/src/components/Amelipro/AmeliproTable/__tests__/__snapshots__/AmeliproTable.spec.ts.snap +23 -26
  127. package/src/components/Amelipro/AmeliproTileBtn/AmeliproTileBtn.stories.ts +2 -2
  128. package/src/components/ChipList/Accessibilite.stories.ts +4 -0
  129. package/src/components/ChipList/ChipList.vue +185 -42
  130. package/src/components/ChipList/locales.ts +4 -2
  131. package/src/components/ChipList/tests/chipList.spec.ts +7 -4
  132. package/src/components/Customs/Selects/SelectOverview.mdx +18 -15
  133. package/src/components/Customs/Selects/SyBtnSelect/SyBtnSelect.stories.ts +10 -10
  134. package/src/components/Customs/Selects/SySelect/SySelect.stories.ts +13 -5
  135. package/src/components/Customs/Selects/SySelect/SySelect.vue +108 -37
  136. package/src/components/Customs/SyCheckbox/SyCheckbox.mdx +3 -1
  137. package/src/components/Customs/SyCheckbox/SyCheckbox.stories.ts +165 -0
  138. package/src/components/Customs/SyCheckbox/SyCheckbox.vue +28 -9
  139. package/src/components/Customs/SyTabs/Accessibilite.mdx +309 -0
  140. package/src/components/Customs/SyTabs/SyTabs.mdx +117 -0
  141. package/src/components/Customs/SyTabs/SyTabs.stories.ts +354 -0
  142. package/src/components/Customs/SyTabs/SyTabs.vue +350 -0
  143. package/src/components/Customs/SyTabs/config.ts +17 -0
  144. package/src/components/Customs/SyTabs/tests/SyTabs.spec.ts +425 -0
  145. package/src/components/Customs/SyTabs/types.ts +12 -0
  146. package/src/components/Customs/SyTextField/SyTextField.mdx +3 -0
  147. package/src/components/Customs/SyTextField/SyTextField.stories.ts +142 -1
  148. package/src/components/Customs/SyTextField/SyTextField.vue +19 -16
  149. package/src/components/DataList/DataList.vue +47 -49
  150. package/src/components/DataListGroup/DataListGroup.vue +1 -1
  151. package/src/components/DataListItem/DataListItem.vue +67 -63
  152. package/src/components/DataListItem/tests/DataListItem.spec.ts +2 -2
  153. package/src/components/DatePicker/CalendarMode/DatePicker.stories.ts +3 -3
  154. package/src/components/DatePicker/CalendarMode/DatePicker.vue +49 -13
  155. package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.vue +412 -649
  156. package/src/components/DatePicker/DatePickerValidationExample/CalendarMode.stories.ts +215 -0
  157. package/src/components/DatePicker/DatePickerValidationExample/ComplexDatePicker.stories.ts +218 -0
  158. package/src/components/DatePicker/DatePickerValidationExample/DatePickerValidation.mdx +2 -0
  159. package/src/components/DatePicker/DatePickerValidationExample/DatePickerValidation.stories.ts +1 -1
  160. package/src/components/DatePicker/DatePickerValidationExample/DateTextInput.stories.ts +218 -0
  161. package/src/components/DatePicker/DatePickerValidationExample/MultiMode.stories.ts +281 -0
  162. package/src/components/DatePicker/DateTextInput/DateTextInput.events.spec.ts +17 -4
  163. package/src/components/DatePicker/DateTextInput/DateTextInput.range.spec.ts +111 -18
  164. package/src/components/DatePicker/DateTextInput/DateTextInput.spec.ts +238 -6
  165. package/src/components/DatePicker/DateTextInput/DateTextInput.vue +716 -757
  166. package/src/components/DatePicker/composables/tests/useDateInputEditing.spec.ts +4 -4
  167. package/src/components/DatePicker/composables/tests/useDisplayedDateString.spec.ts +17 -10
  168. package/src/components/DatePicker/composables/useDateInputEditing.ts +52 -22
  169. package/src/components/DatePicker/composables/useDisplayedDateString.ts +18 -4
  170. package/src/components/DatePicker/composables/useTodayButton.ts +13 -1
  171. package/src/components/DatePicker/utils/dateFormattingUtils.ts +79 -14
  172. package/src/components/DialogBox/DialogBox.stories.ts +12 -0
  173. package/src/components/DialogBox/DialogBox.vue +16 -11
  174. package/src/components/DialogBox/tests/DialogBox.spec.ts +22 -0
  175. package/src/components/HeaderLoading/Accessibilite.mdx +429 -8
  176. package/src/components/HeaderLoading/Accessibilite.stories.ts +4 -0
  177. package/src/components/HeaderLoading/HeaderLoading.vue +59 -0
  178. package/src/components/HeaderNavigationBar/HeaderNavigationBar.mdx +17 -2
  179. package/src/components/HeaderNavigationBar/HeaderNavigationBar.stories.ts +91 -2
  180. package/src/components/HeaderNavigationBar/HeaderNavigationBar.vue +37 -1
  181. package/src/components/HeaderNavigationBar/HorizontalNavbar/HorizontalNavbar.vue +276 -21
  182. package/src/components/HeaderNavigationBar/tests/HeaderNavigationBar.spec.ts +2 -2
  183. package/src/components/NirField/NirField.mdx +3 -0
  184. package/src/components/NirField/NirField.vue +10 -1
  185. package/src/components/NirField/tests/NirField.spec.ts +81 -0
  186. package/src/components/PasswordField/PasswordField.mdx +3 -0
  187. package/src/components/PeriodField/PeriodField.mdx +2 -0
  188. package/src/components/PeriodField/PeriodField.stories.ts +195 -0
  189. package/src/components/PhoneField/Accessibilite.stories.ts +4 -0
  190. package/src/components/PhoneField/PhoneField.mdx +3 -1
  191. package/src/components/PhoneField/PhoneField.stories.ts +285 -1
  192. package/src/components/PhoneField/PhoneField.vue +228 -95
  193. package/src/components/PhoneField/indicatifs.ts +102 -102
  194. package/src/components/PhoneField/locales.ts +1 -0
  195. package/src/components/PhoneField/tests/PhoneField.spec.ts +429 -2
  196. package/src/components/SkipLink/SkipLink.vue +3 -31
  197. package/src/components/SkipLink/tests/skipLink.spec.ts +0 -21
  198. package/src/components/SubHeader/Accessibilite.stories.ts +8 -0
  199. package/src/components/SubHeader/SubHeader.mdx +1 -0
  200. package/src/components/SubHeader/SubHeader.stories.ts +179 -60
  201. package/src/components/SubHeader/SubHeader.vue +45 -15
  202. package/src/components/SubHeader/locales.ts +1 -0
  203. package/src/components/SyAlert/SyAlert.vue +6 -0
  204. package/src/components/Tables/SyServerTable/SyServerTable.mdx +3 -10
  205. package/src/components/Tables/SyServerTable/SyServerTable.stories.ts +242 -0
  206. package/src/components/Tables/SyServerTable/SyServerTable.vue +29 -10
  207. package/src/components/Tables/SyTable/SyTable.mdx +3 -10
  208. package/src/components/Tables/SyTable/SyTable.stories.ts +242 -0
  209. package/src/components/Tables/SyTable/SyTable.vue +2 -0
  210. package/src/components/Tables/common/SyTablePagination.vue +13 -6
  211. package/src/components/Tables/common/tests/SyTablePagination.spec.ts +157 -0
  212. package/src/components/Tables/common/types.ts +2 -0
  213. package/src/components/index.ts +9 -0
  214. package/src/composables/useFilterable/useFilterable.ts +10 -0
  215. package/src/designTokens/tokens/amelipro/apColors.ts +1 -1
  216. package/src/designTokens/tokens/cnam/cnamSemantic.ts +3 -3
  217. package/src/stories/Components/Components.stories.ts +1 -1
  218. package/src/stories/GuideDuDev/FormValidationGuide.mdx +342 -0
  219. package/src/stories/Templates/Templates.stories.ts +1 -1
  220. package/src/utils/functions/ameliproColors/ameliproColors.ts +1 -1
  221. package/dist/components/DataList/locales.d.ts +0 -3
  222. package/src/components/DataList/locales.ts +0 -3
  223. package/src/components/PhoneField/tests/PhoneField.additional.spec.ts +0 -266
@@ -0,0 +1,309 @@
1
+ import { Meta, Title, Subtitle, Description, Primary, Controls, Stories } from '@storybook/blocks';
2
+ import * as SyTabsStories from './SyTabs.stories';
3
+ import AccessibilityIcon from '@/common/imgs/accessibility-svgrepo-com.svg';
4
+
5
+ <Meta of={SyTabsStories} />
6
+
7
+ <div className="accessibility-guide">
8
+ <Title>Guide d'Accessibilité du Composant SyTabs</Title>
9
+
10
+ <div className="intro-section">
11
+ <img
12
+ src={AccessibilityIcon}
13
+ alt="Icône d'accessibilité"
14
+ className="accessibility-icon"
15
+ />
16
+ <div className="intro-text">
17
+ Le composant SyTabs a été conçu en suivant rigoureusement les recommandations d'accessibilité du W3C,
18
+ notamment le modèle <a href="https://www.w3.org/WAI/ARIA/apg/patterns/tabs/" target="_blank" rel="noopener noreferrer">WAI-ARIA pour les onglets</a>.
19
+ Ce guide détaille comment notre implémentation respecte ces standards et garantit une expérience utilisateur inclusive.
20
+ </div>
21
+ </div>
22
+
23
+ <div className="criteria-section">
24
+ <h2>Critères d'accessibilité respectés</h2>
25
+
26
+ <div className="criteria-card">
27
+ <div className="criteria-header">
28
+ <span className="criteria-icon">🔍</span>
29
+ <h3>Structure sémantique</h3>
30
+ </div>
31
+ <ul>
32
+ <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>
33
+ <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>
34
+ <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>
35
+ <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>
36
+ </ul>
37
+ </div>
38
+
39
+ <div className="criteria-card">
40
+ <div className="criteria-header">
41
+ <span className="criteria-icon">⌨️</span>
42
+ <h3>Navigation clavier complète</h3>
43
+ </div>
44
+ <ul>
45
+ <li><strong>Touche Tab</strong> : Navigation vers la liste d'onglets et sortie de celle-ci</li>
46
+ <li><strong>Touches fléchées</strong> : Navigation entre les onglets (gauche/droite)</li>
47
+ <li><strong>Touches Home/End</strong> : Accès direct au premier/dernier onglet</li>
48
+ <li><strong>Touche Espace/Entrée</strong> : Activation de l'onglet actuellement focalisé</li>
49
+ <li><strong>Touche Escape</strong> : Sortie du contexte de navigation des onglets</li>
50
+ <li><strong>Focus visible</strong> : Contour visuel distinct pour indiquer l'onglet actuellement focalisé</li>
51
+ </ul>
52
+ </div>
53
+
54
+ <div className="criteria-card">
55
+ <div className="criteria-header">
56
+ <span className="criteria-icon">📱</span>
57
+ <h3>États et retours d'information</h3>
58
+ </div>
59
+ <ul>
60
+ <li><strong>État de sélection</strong> : <code>aria-selected="true"</code> indique l'onglet actif aux technologies d'assistance</li>
61
+ <li><strong>Visibilité des panneaux</strong> : L'attribut <code>hidden</code> sur les panneaux inactifs les rend invisibles aux lecteurs d'écran</li>
62
+ <li><strong>Indication visuelle</strong> : Styles distinctifs pour l'onglet actif (couleur, bordure inférieure)</li>
63
+ <li><strong>Association explicite</strong> : Chaque panneau de contenu est clairement associé à son onglet via <code>aria-labelledby</code></li>
64
+ </ul>
65
+ </div>
66
+
67
+ <div className="criteria-card">
68
+ <div className="criteria-header">
69
+ <span className="criteria-icon">🎨</span>
70
+ <h3>Personnalisation accessible</h3>
71
+ </div>
72
+ <ul>
73
+ <li><strong>Contraste configurable</strong> : Options de couleurs pour garantir un contraste suffisant entre les onglets actifs/inactifs</li>
74
+ <li><strong>Taille et espacement</strong> : Dimensions adaptées pour faciliter l'interaction tactile avec une hauteur minimale de 44px</li>
75
+ <li><strong>Compatibilité avec le mode contraste élevé</strong> : Utilisation de variables CSS pour s'adapter aux paramètres système</li>
76
+ <li><strong>Densité et thème</strong> : Options de personnalisation pour s'adapter aux différents contextes d'utilisation</li>
77
+ </ul>
78
+ </div>
79
+ </div>
80
+
81
+ <div className="automatic-section">
82
+ <h2>Activation automatique des onglets</h2>
83
+ <div className="section-description">
84
+ Le composant SyTabs implémente un modèle d'activation automatique, ce qui signifie que :
85
+ </div>
86
+ <ul>
87
+ <li>La sélection d'un nouvel onglet via la navigation par flèches active immédiatement cet onglet</li>
88
+ <li>Le contenu du panneau associé est affiché sans nécessiter une action supplémentaire</li>
89
+ <li>Le focus reste sur l'onglet activé pour permettre de continuer la navigation par clavier</li>
90
+ </ul>
91
+ <div className="section-description">
92
+ Cette implémentation suit les meilleures pratiques WAI-ARIA pour les interfaces à onglets :
93
+ </div>
94
+ <ul>
95
+ <li>Réduction du nombre d'actions nécessaires pour naviguer entre les contenus</li>
96
+ <li>Mise à jour dynamique de l'attribut <code>aria-selected</code> pour informer des changements</li>
97
+ <li>Gestion efficace du focus pour éviter les sauts d'interface désorientants</li>
98
+ <li>Mise à jour de l'affichage des panneaux avec l'attribut <code>hidden</code> pour les panneaux inactifs</li>
99
+ </ul>
100
+ </div>
101
+
102
+ <div className="demo-section">
103
+ <h2>Démonstration interactive</h2>
104
+ <div className="section-description">
105
+ Explorez ci-dessous un exemple de SyTabs entièrement accessible.
106
+ Essayez de naviguer en utilisant uniquement votre clavier (Tab pour accéder à la barre d'onglets, flèches gauche/droite pour naviguer entre les onglets) pour tester l'accessibilité.
107
+ </div>
108
+ <Primary />
109
+ </div>
110
+
111
+ <div className="tab-panel-section">
112
+ <h2>Relation onglet-panneau</h2>
113
+ <div className="section-description">
114
+ Le composant SyTabs établit une relation claire entre chaque onglet et son panneau de contenu associé :
115
+ </div>
116
+ <ul>
117
+ <li>Chaque onglet (<code>role="tab"</code>) est associé à un panneau de contenu via <code>aria-controls</code></li>
118
+ <li>Chaque panneau de contenu (<code>role="tabpanel"</code>) est associé à son onglet via <code>aria-labelledby</code></li>
119
+ <li>
120
+ Les identifiants uniques garantissent que ces associations sont clairement établies :
121
+ <ul>
122
+ <li>Onglets : <code>id="tab-&#123;index&#125;"</code></li>
123
+ <li>Panneaux : <code>id="panel-&#123;index&#125;"</code></li>
124
+ </ul>
125
+ </li>
126
+ </ul>
127
+ <div className="section-description">
128
+ Cette structure garantit que les utilisateurs de technologies d'assistance comprennent clairement la relation entre les onglets et leur contenu associé, améliorant ainsi la navigation et la compréhension de l'interface.
129
+ </div>
130
+ </div>
131
+
132
+ <div className="best-practices">
133
+ <h2>Bonnes pratiques d'utilisation</h2>
134
+ <ul>
135
+ <li>Utilisez des libellés clairs et concis pour chaque onglet, évitez les textes trop longs ou ambiguës</li>
136
+ <li>Limitez le nombre d'onglets pour éviter de surcharger l'interface et la navigation par clavier</li>
137
+ <li>Organisez les onglets dans un ordre logique, avec les informations les plus importantes en premier</li>
138
+ <li>Assurez-vous que la taille des onglets est suffisante pour faciliter l'interaction tactile (au moins 44px de hauteur)</li>
139
+ <li>Maintenez une distinction visuelle claire entre l'onglet actif et les onglets inactifs</li>
140
+ <li>Évitez d'utiliser des onglets imbriqués qui pourraient compliquer la navigation</li>
141
+ <li>Conservez une cohérence dans le comportement et l'apparence des onglets à travers l'application</li>
142
+ </ul>
143
+ </div>
144
+
145
+ <div className="resources-section">
146
+ <h2>Ressources supplémentaires</h2>
147
+ <ul>
148
+ <li><a href="https://www.w3.org/WAI/ARIA/apg/patterns/tabs/" target="_blank" rel="noopener noreferrer">Guide des pratiques d'auteur WAI-ARIA pour les onglets</a></li>
149
+ <li><a href="https://www.w3.org/WAI/ARIA/apg/patterns/tabs/examples/tabs-automatic/" target="_blank" rel="noopener noreferrer">Exemple d'onglets WAI-ARIA à activation automatique</a></li>
150
+ <li><a href="https://www.w3.org/TR/wai-aria-practices-1.2/#tabpanel" target="_blank" rel="noopener noreferrer">Pratiques recommandées WAI-ARIA 1.2 pour les panneaux à onglets</a></li>
151
+ <li><a href="https://www.w3.org/WAI/WCAG21/quickref/" target="_blank" rel="noopener noreferrer">Référence rapide WCAG 2.1</a></li>
152
+ <li><a href="https://www.w3.org/TR/wai-aria-1.2/#tab" target="_blank" rel="noopener noreferrer">Spécification WAI-ARIA 1.2 pour le rôle tab</a></li>
153
+ </ul>
154
+ </div>
155
+ </div>
156
+
157
+ <style>
158
+ {`
159
+ .accessibility-guide {
160
+ font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
161
+ max-width: 1200px;
162
+ margin: 0 auto;
163
+ padding: 20px;
164
+ color: #333;
165
+ }
166
+
167
+ .intro-section {
168
+ display: flex;
169
+ align-items: center;
170
+ margin-bottom: 30px;
171
+ background-color: #f8f9fa;
172
+ padding: 20px;
173
+ border-radius: 8px;
174
+ border-left: 5px solid #0077cc;
175
+ }
176
+
177
+ .accessibility-icon {
178
+ width: 60px;
179
+ height: 60px;
180
+ margin-right: 20px;
181
+ flex-shrink: 0;
182
+ }
183
+
184
+ .intro-text {
185
+ font-size: 1.1em;
186
+ line-height: 1.6;
187
+ margin: 0;
188
+ }
189
+
190
+ .criteria-section {
191
+ margin-bottom: 40px;
192
+ }
193
+
194
+ .criteria-section h2,
195
+ .demo-section h2,
196
+ .tri-state-section h2,
197
+ .parent-child-section h2,
198
+ .best-practices h2,
199
+ .resources-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
+ .demo-section {
243
+ background-color: #f8f9fa;
244
+ padding: 20px;
245
+ border-radius: 8px;
246
+ margin-bottom: 40px;
247
+ }
248
+
249
+ .tri-state-section,
250
+ .parent-child-section {
251
+ background-color: #f0f7ff;
252
+ padding: 20px;
253
+ border-radius: 8px;
254
+ margin-bottom: 30px;
255
+ }
256
+
257
+ .tri-state-section p,
258
+ .parent-child-section p {
259
+ line-height: 1.6;
260
+ }
261
+
262
+ .best-practices {
263
+ background-color: #f5f5f5;
264
+ padding: 20px;
265
+ border-radius: 8px;
266
+ margin-bottom: 30px;
267
+ }
268
+
269
+ .best-practices ul {
270
+ padding-left: 20px;
271
+ }
272
+
273
+ .best-practices li {
274
+ margin-bottom: 10px;
275
+ line-height: 1.5;
276
+ }
277
+
278
+ .resources-section {
279
+ background-color: #f8f9fa;
280
+ padding: 20px;
281
+ border-radius: 8px;
282
+ }
283
+
284
+ .resources-section ul {
285
+ padding-left: 20px;
286
+ }
287
+
288
+ .resources-section li {
289
+ margin-bottom: 10px;
290
+ }
291
+
292
+ .resources-section a {
293
+ color: #0077cc;
294
+ text-decoration: none;
295
+ }
296
+
297
+ .resources-section a:hover {
298
+ text-decoration: underline;
299
+ }
300
+
301
+ code {
302
+ background-color: #f0f0f0;
303
+ padding: 2px 5px;
304
+ border-radius: 3px;
305
+ font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, monospace;
306
+ font-size: 0.9em;
307
+ }
308
+ `}
309
+ </style>
@@ -0,0 +1,117 @@
1
+ import { Meta, Canvas, Controls, Source, Story } from '@storybook/blocks';
2
+ import * as SyTabsStories from "./SyTabs.stories";
3
+
4
+ <Meta of={SyTabsStories} />
5
+
6
+ # SyTabs
7
+
8
+ Le composant `SyTabs` est un système de navigation par onglets conforme au Design System qui respecte les règles d'accessibilité <abbr title="Référentiel Général d'Amélioration de l'Accessibilité">RGAA</abbr>. Il permet d'organiser le contenu en sections navigables facilement via une interface à onglets.
9
+
10
+ Il implémente les fonctionnalités suivantes :
11
+
12
+ - Navigation complète au clavier
13
+ - Attributs ARIA appropriés
14
+ - Gestion du focus accessible
15
+ - Structure HTML sémantique
16
+ - Design personnalisable
17
+
18
+ <Canvas of={SyTabsStories.Default} />
19
+
20
+ ## API
21
+
22
+ <Controls of={SyTabsStories.Default} />
23
+
24
+ ## Structure des données
25
+
26
+ Le composant `SyTabs` attend un tableau d'objets `TabItem` avec la structure suivante :
27
+
28
+ ```typescript
29
+ export interface TabItem {
30
+ label: string // Texte affiché dans l'onglet
31
+ value: string | number // Valeur unique utilisée pour v-model
32
+ content?: string // Contenu textuel de l'onglet (optionnel)
33
+ disabled?: boolean // État désactivé (optionnel)
34
+ }
35
+ ```
36
+
37
+ ## Accessibilité
38
+
39
+ Le composant `SyTabs` respecte les critères d'accessibilité RGAA suivants :
40
+
41
+ ### Structure sémantique
42
+
43
+ - Utilise les éléments `<nav>`, `<ul>` et `<li>` pour une structure de navigation sémantique
44
+ - Associe chaque onglet à son panneau de contenu via les attributs `aria-controls` et `aria-labelledby`
45
+ - Utilise l'attribut `aria-label="Onglets de navigation"` sur l'élément `<nav>` pour identifier la navigation
46
+
47
+ ### Rôles ARIA
48
+
49
+ - `role="tablist"` sur le conteneur de navigation
50
+ - `role="presentation"` sur les éléments de liste
51
+ - `role="tab"` sur les boutons d'onglets
52
+ - `role="tabpanel"` sur les panneaux de contenu
53
+
54
+ ### États et propriétés
55
+
56
+ - `aria-selected="true|false"` indique l'onglet actif
57
+ - Attribut `hidden` sur les panneaux non actifs
58
+ - Focus visible avec outline adapté au design system
59
+
60
+ ### Navigation au clavier
61
+
62
+ Le composant implémente toutes les interactions clavier recommandées par les [Pratiques Authoring WAI-ARIA 1.2](https://www.w3.org/WAI/ARIA/apg/patterns/tabpanel/) :
63
+
64
+ - **Flèches gauche/droite** : Navigation entre les onglets
65
+ - **Touches Home/End** : Accès au premier/dernier onglet
66
+ - **Entrée/Espace** : Activation de l'onglet
67
+ - **Échap** : Gestion du focus
68
+
69
+ ### Contraste et visibilité
70
+
71
+ - Contraste suffisant entre le texte et le fond (minimum 4.5:1)
72
+ - Indication visuelle claire de l'onglet actif (changement de couleur et bordure)
73
+ - Focus visible conforme aux exigences RGAA
74
+
75
+ ### Tests d'accessibilité
76
+
77
+ Le composant a été testé avec :
78
+ - Lecteurs d'écran (NVDA, VoiceOver)
79
+ - Navigation clavier
80
+ - Outils de vérification de contraste
81
+
82
+ <Canvas of={SyTabsStories.Default} />
83
+
84
+ ## Personnalisation
85
+
86
+ Le composant peut être personnalisé via l'objet `vuetifyOptions` qui permet de modifier l'apparence des onglets :
87
+
88
+ > **Important** : Ces options de personnalisation doivent être passées via la prop `vuetifyOptions` et non comme props directes du composant. Par exemple, utilisez `:vuetify-options="{ sheet: { dense: true } }"` plutôt que `:sheet="{ dense: true }"`.
89
+
90
+ ```javascript
91
+ {
92
+ sheet: {
93
+ theme: 'default|dark|light', // Thème de l'arrière-plan
94
+ color: '#fff', // Couleur d'arrière-plan
95
+ dense: false // Mode compact
96
+ },
97
+ tabs: {
98
+ height: '48', // Hauteur des onglets
99
+ 'show-arrows': true // Affichage des flèches de défilement
100
+ },
101
+ tab: {
102
+ 'base-color': '#0C419A', // Couleur de base des onglets
103
+ 'active-color': '#0C419A', // Couleur de l'onglet actif
104
+ 'slider-color': '#0C419A', // Couleur de l'indicateur actif
105
+ 'ripple': false // Effet de ripple
106
+ }
107
+ }
108
+ ```
109
+
110
+ <Canvas of={SyTabsStories.CustomTheme} />
111
+
112
+ ## Bonnes pratiques
113
+
114
+ - Limitez le nombre d'onglets pour éviter une surcharge cognitive
115
+ - Utilisez des libellés courts et descriptifs
116
+ - Assurez une cohérence visuelle entre les onglets et leur contenu
117
+ - Préservez l'état des onglets lors de la navigation entre pages si nécessaire