@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.
- package/dist/{DateFilter-BlOpwEVq.js → DateFilter-CHDLz2EO.js} +1 -1
- package/dist/{NumberFilter-BPUXE4wY.js → NumberFilter-DXNQ4Uls.js} +1 -1
- package/dist/{PeriodFilter-B2yx329_.js → PeriodFilter-C8Qf3Jcn.js} +1 -1
- package/dist/{SelectFilter-CedKn1oV.js → SelectFilter-B2Ejs4Cb.js} +1 -1
- package/dist/{TextFilter-DkhJjRtR.js → TextFilter-CfR5_A1S.js} +1 -1
- package/dist/components/Amelipro/AmeliproAccordionGroup/AmeliproAccordionGroup.d.ts +116 -0
- package/dist/components/Amelipro/AmeliproAccordionGroup/types.d.ts +4 -0
- package/dist/components/Amelipro/AmeliproAccordionList/AmeliproAccordionList.d.ts +220 -0
- package/dist/components/Amelipro/AmeliproAccordionResult/AmeliproAccordionResult.d.ts +68 -0
- package/dist/components/Amelipro/AmeliproAccordionResult/AmeliproAccordionResultTemplate/AmeliproAccordionResultTemplate.d.ts +70 -0
- package/dist/components/Amelipro/AmeliproAccordionResultList/AmeliproAccordionResultList.d.ts +204 -0
- package/dist/components/Amelipro/AmeliproAutoCompleteField/AmeliproAutoCompleteField.d.ts +26 -26
- package/dist/components/Amelipro/AmeliproBadge/AmeliproBadge.d.ts +59 -0
- package/dist/components/Amelipro/AmeliproBtn/AmeliproBtn.d.ts +3 -3
- package/dist/components/Amelipro/AmeliproCaptcha/AmeliproCaptcha.d.ts +1 -1
- package/dist/components/Amelipro/AmeliproCarousel/AmeliproCarousel.d.ts +214 -0
- package/dist/components/Amelipro/AmeliproCarousel/AmeliproCarouselItem/AmeliproCarouselItem.d.ts +70 -0
- package/dist/components/Amelipro/AmeliproCarousel/types.d.ts +7 -0
- package/dist/components/Amelipro/AmeliproClickableTile/AmeliproClickableTile.d.ts +125 -0
- package/dist/components/Amelipro/AmeliproIconBtn/AmeliproIconBtn.d.ts +1 -1
- package/dist/components/Amelipro/AmeliproIllustratedDataTile/AmeliproIllustratedDataTile.d.ts +2 -2
- package/dist/components/Amelipro/AmeliproResultList/AmeliproResultList.d.ts +164 -0
- package/dist/components/Amelipro/AmeliproSelect/AmeliproSelect.d.ts +27 -27
- package/dist/components/Amelipro/AmeliproStateTile/AmeliproStateTile.d.ts +1 -1
- package/dist/components/Amelipro/AmeliproTable/AmeliproTable.d.ts +1 -1
- package/dist/components/Amelipro/AmeliproTabs/AmeliproTabs.d.ts +32 -32
- package/dist/components/Amelipro/AmeliproTextArea/AmeliproTextArea.d.ts +6 -6
- package/dist/components/Amelipro/AmeliproTextField/AmeliproTextField.d.ts +7 -7
- package/dist/components/Amelipro/AmeliproTileBtn/AmeliproTileBtn.d.ts +1 -1
- package/dist/components/Amelipro/AmeliproTooltips/AmeliproTooltips.d.ts +2 -2
- package/dist/components/ChipList/ChipList.d.ts +4 -0
- package/dist/components/ChipList/locales.d.ts +4 -2
- package/dist/components/CookiesSelection/CookiesInformation/CookiesInformation.d.ts +8 -8
- package/dist/components/Customs/Selects/SySelect/SySelect.d.ts +445 -8
- package/dist/components/Customs/SyCheckbox/SyCheckbox.d.ts +2 -0
- package/dist/components/Customs/SyTabs/SyTabs.d.ts +71 -0
- package/dist/components/Customs/SyTabs/config.d.ts +17 -0
- package/dist/components/Customs/SyTabs/types.d.ts +11 -0
- package/dist/components/Customs/SyTextField/SyTextField.d.ts +9 -9
- package/dist/components/DataList/DataList.d.ts +1 -1
- package/dist/components/DatePicker/CalendarMode/DatePicker.d.ts +4811 -240
- package/dist/components/DatePicker/ComplexDatePicker/ComplexDatePicker.d.ts +52 -33
- package/dist/components/DatePicker/DateTextInput/DateTextInput.d.ts +23 -10
- package/dist/components/DatePicker/composables/useDateInputEditing.d.ts +1 -0
- package/dist/components/DatePicker/composables/useTodayButton.d.ts +1 -0
- package/dist/components/DialogBox/DialogBox.d.ts +219 -0
- package/dist/components/HeaderLoading/HeaderLoading.d.ts +27 -0
- package/dist/components/HeaderNavigationBar/HeaderNavigationBar.d.ts +110 -3
- package/dist/components/HeaderNavigationBar/HorizontalNavbar/HorizontalNavbar.d.ts +19 -1
- package/dist/components/LangBtn/LangBtn.d.ts +2 -2
- package/dist/components/NirField/NirField.d.ts +18 -18
- package/dist/components/PeriodField/PeriodField.d.ts +10766 -1620
- package/dist/components/PhoneField/PhoneField.d.ts +1866 -2
- package/dist/components/PhoneField/indicatifs.d.ts +1 -0
- package/dist/components/PhoneField/locales.d.ts +1 -0
- package/dist/components/RangeField/RangeField.d.ts +1 -1
- package/dist/components/RangeField/RangeSlider/RangeSlider.d.ts +1 -1
- package/dist/components/SubHeader/SubHeader.d.ts +8 -0
- package/dist/components/SubHeader/locales.d.ts +1 -0
- package/dist/components/SyTextArea/SyTextArea.d.ts +6 -6
- package/dist/components/Tables/SyServerTable/SyServerTable.d.ts +5 -4
- package/dist/components/Tables/SyTable/SyTable.d.ts +5 -4
- package/dist/components/Tables/common/SyTablePagination.d.ts +448 -7
- package/dist/components/Tables/common/organizeColumns/OrganizeColumns.d.ts +2 -2
- package/dist/components/Tables/common/types.d.ts +2 -0
- package/dist/components/index.d.ts +9 -0
- package/dist/design-system-v3.js +173 -164
- package/dist/design-system-v3.umd.cjs +288 -261
- package/dist/{main-BXPFSAB4.js → main-C66C1BkG.js} +12984 -11291
- package/dist/style.css +1 -1
- package/package.json +1 -1
- package/src/assets/amelipro/icons.ts +38 -11
- package/src/components/Amelipro/AmeliproAccordionGroup/AmeliproAccordionGroup.mdx +20 -0
- package/src/components/Amelipro/AmeliproAccordionGroup/AmeliproAccordionGroup.stories.ts +135 -0
- package/src/components/Amelipro/AmeliproAccordionGroup/AmeliproAccordionGroup.vue +107 -0
- package/src/components/Amelipro/AmeliproAccordionGroup/__tests__/AmeliproAccordionGroup.spec.ts +37 -0
- package/src/components/Amelipro/AmeliproAccordionGroup/__tests__/__snapshots__/AmeliproAccordionGroup.spec.ts.snap +513 -0
- package/src/components/Amelipro/AmeliproAccordionGroup/types.d.ts +4 -0
- package/src/components/Amelipro/AmeliproAccordionList/AmeliproAccordionList.mdx +16 -0
- package/src/components/Amelipro/AmeliproAccordionList/AmeliproAccordionList.stories.ts +300 -0
- package/src/components/Amelipro/AmeliproAccordionList/AmeliproAccordionList.vue +288 -0
- package/src/components/Amelipro/AmeliproAccordionList/__tests__/AmeliproAccordionList.spec.ts +38 -0
- package/src/components/Amelipro/AmeliproAccordionList/__tests__/__snapshots__/AmeliproAccordionList.spec.ts.snap +1712 -0
- package/src/components/Amelipro/AmeliproAccordionResult/AmeliproAccordionResult.mdx +19 -0
- package/src/components/Amelipro/AmeliproAccordionResult/AmeliproAccordionResult.stories.ts +68 -0
- package/src/components/Amelipro/AmeliproAccordionResult/AmeliproAccordionResult.vue +66 -0
- package/src/components/Amelipro/AmeliproAccordionResult/AmeliproAccordionResultTemplate/AmeliproAccordionResultTemplate.vue +145 -0
- package/src/components/Amelipro/AmeliproAccordionResult/AmeliproAccordionResultTemplate/__tests__/AmeliproAccordionResultTemplate.spec.ts +24 -0
- package/src/components/Amelipro/AmeliproAccordionResult/AmeliproAccordionResultTemplate/__tests__/__snapshots__/AmeliproAccordionResultTemplate.spec.ts.snap +127 -0
- package/src/components/Amelipro/AmeliproAccordionResult/__tests__/AmeliproAccordionResult.spec.ts +24 -0
- package/src/components/Amelipro/AmeliproAccordionResult/__tests__/__snapshots__/AmeliproAccordionResult.spec.ts.snap +123 -0
- package/src/components/Amelipro/AmeliproAccordionResultList/AmeliproAccordionResultList.mdx +20 -0
- package/src/components/Amelipro/AmeliproAccordionResultList/AmeliproAccordionResultList.stories.ts +273 -0
- package/src/components/Amelipro/AmeliproAccordionResultList/AmeliproAccordionResultList.vue +275 -0
- package/src/components/Amelipro/AmeliproAccordionResultList/__tests__/AmeliproAccordionResultList.spec.ts +38 -0
- package/src/components/Amelipro/AmeliproAccordionResultList/__tests__/__snapshots__/AmeliproAccordionResultList.spec.ts.snap +1593 -0
- package/src/components/Amelipro/AmeliproBadge/AmeliproBadge.mdx +15 -0
- package/src/components/Amelipro/AmeliproBadge/AmeliproBadge.stories.ts +54 -0
- package/src/components/Amelipro/AmeliproBadge/AmeliproBadge.vue +76 -0
- package/src/components/Amelipro/AmeliproBadge/__tests__/AmeliproBadge.spec.ts +20 -0
- package/src/components/Amelipro/AmeliproBadge/__tests__/__snapshots__/AmeliproBadge.spec.ts.snap +19 -0
- package/src/components/Amelipro/AmeliproCarousel/AmeliproCarousel.mdx +15 -0
- package/src/components/Amelipro/AmeliproCarousel/AmeliproCarousel.stories.ts +191 -0
- package/src/components/Amelipro/AmeliproCarousel/AmeliproCarousel.vue +263 -0
- package/src/components/Amelipro/AmeliproCarousel/AmeliproCarouselItem/AmeliproCarouselItem.vue +93 -0
- package/src/components/Amelipro/AmeliproCarousel/AmeliproCarouselItem/__tests__/AmeliproCarouselItem.spec.ts +24 -0
- package/src/components/Amelipro/AmeliproCarousel/AmeliproCarouselItem/__tests__/__snapshots__/AmeliproCarouselItem.spec.ts.snap +43 -0
- package/src/components/Amelipro/AmeliproCarousel/__tests__/AmeliproCarousel.spec.ts +40 -0
- package/src/components/Amelipro/AmeliproCarousel/__tests__/__snapshots__/AmeliproCarousel.spec.ts.snap +342 -0
- package/src/components/Amelipro/AmeliproCarousel/types.d.ts +8 -0
- package/src/components/Amelipro/AmeliproClickableTile/AmeliproClickableTile.mdx +18 -0
- package/src/components/Amelipro/AmeliproClickableTile/AmeliproClickableTile.stories.ts +67 -0
- package/src/components/Amelipro/AmeliproClickableTile/AmeliproClickableTile.vue +233 -0
- package/src/components/Amelipro/AmeliproClickableTile/tests/AmeliproClickableTile.spec.ts +21 -0
- package/src/components/Amelipro/AmeliproClickableTile/tests/__snapshots__/AmeliproClickableTile.spec.ts.snap +140 -0
- package/src/components/Amelipro/AmeliproHeader/AmeliproHeader.vue +7 -1
- package/src/components/Amelipro/AmeliproHeader/tests/__snapshots__/AmeliproHeader.spec.ts.snap +5 -4
- package/src/components/Amelipro/AmeliproIcon/iconList.ts +6 -0
- package/src/components/Amelipro/AmeliproPageLayout/tests/__snapshots__/AmeliproPageLayout.spec.ts.snap +5 -4
- package/src/components/Amelipro/AmeliproResultList/AmeliproResultList.mdx +15 -0
- package/src/components/Amelipro/AmeliproResultList/AmeliproResultList.stories.ts +264 -0
- package/src/components/Amelipro/AmeliproResultList/AmeliproResultList.vue +231 -0
- package/src/components/Amelipro/AmeliproResultList/__tests__/AmeliproResultList.spec.ts +37 -0
- package/src/components/Amelipro/AmeliproResultList/__tests__/__snapshots__/AmeliproResultList.spec.ts.snap +434 -0
- package/src/components/Amelipro/AmeliproTable/AmeliproTable.vue +6 -5
- package/src/components/Amelipro/AmeliproTable/__tests__/__snapshots__/AmeliproTable.spec.ts.snap +23 -26
- package/src/components/Amelipro/AmeliproTileBtn/AmeliproTileBtn.stories.ts +2 -2
- package/src/components/ChipList/Accessibilite.stories.ts +4 -0
- package/src/components/ChipList/ChipList.vue +185 -42
- package/src/components/ChipList/locales.ts +4 -2
- package/src/components/ChipList/tests/chipList.spec.ts +7 -4
- package/src/components/Customs/Selects/SelectOverview.mdx +18 -15
- package/src/components/Customs/Selects/SyBtnSelect/SyBtnSelect.stories.ts +10 -10
- package/src/components/Customs/Selects/SySelect/SySelect.stories.ts +13 -5
- package/src/components/Customs/Selects/SySelect/SySelect.vue +108 -37
- package/src/components/Customs/SyCheckbox/SyCheckbox.mdx +3 -1
- package/src/components/Customs/SyCheckbox/SyCheckbox.stories.ts +165 -0
- package/src/components/Customs/SyCheckbox/SyCheckbox.vue +28 -9
- package/src/components/Customs/SyTabs/Accessibilite.mdx +309 -0
- package/src/components/Customs/SyTabs/SyTabs.mdx +117 -0
- package/src/components/Customs/SyTabs/SyTabs.stories.ts +354 -0
- package/src/components/Customs/SyTabs/SyTabs.vue +350 -0
- package/src/components/Customs/SyTabs/config.ts +17 -0
- package/src/components/Customs/SyTabs/tests/SyTabs.spec.ts +425 -0
- package/src/components/Customs/SyTabs/types.ts +12 -0
- package/src/components/Customs/SyTextField/SyTextField.mdx +3 -0
- package/src/components/Customs/SyTextField/SyTextField.stories.ts +142 -1
- package/src/components/Customs/SyTextField/SyTextField.vue +19 -16
- package/src/components/DataList/DataList.vue +47 -49
- package/src/components/DataListGroup/DataListGroup.vue +1 -1
- package/src/components/DataListItem/DataListItem.vue +67 -63
- package/src/components/DataListItem/tests/DataListItem.spec.ts +2 -2
- package/src/components/DatePicker/CalendarMode/DatePicker.stories.ts +3 -3
- package/src/components/DatePicker/CalendarMode/DatePicker.vue +49 -13
- package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.vue +412 -649
- package/src/components/DatePicker/DatePickerValidationExample/CalendarMode.stories.ts +215 -0
- package/src/components/DatePicker/DatePickerValidationExample/ComplexDatePicker.stories.ts +218 -0
- package/src/components/DatePicker/DatePickerValidationExample/DatePickerValidation.mdx +2 -0
- package/src/components/DatePicker/DatePickerValidationExample/DatePickerValidation.stories.ts +1 -1
- package/src/components/DatePicker/DatePickerValidationExample/DateTextInput.stories.ts +218 -0
- package/src/components/DatePicker/DatePickerValidationExample/MultiMode.stories.ts +281 -0
- package/src/components/DatePicker/DateTextInput/DateTextInput.events.spec.ts +17 -4
- package/src/components/DatePicker/DateTextInput/DateTextInput.range.spec.ts +111 -18
- package/src/components/DatePicker/DateTextInput/DateTextInput.spec.ts +238 -6
- package/src/components/DatePicker/DateTextInput/DateTextInput.vue +716 -757
- package/src/components/DatePicker/composables/tests/useDateInputEditing.spec.ts +4 -4
- package/src/components/DatePicker/composables/tests/useDisplayedDateString.spec.ts +17 -10
- package/src/components/DatePicker/composables/useDateInputEditing.ts +52 -22
- package/src/components/DatePicker/composables/useDisplayedDateString.ts +18 -4
- package/src/components/DatePicker/composables/useTodayButton.ts +13 -1
- package/src/components/DatePicker/utils/dateFormattingUtils.ts +79 -14
- package/src/components/DialogBox/DialogBox.stories.ts +12 -0
- package/src/components/DialogBox/DialogBox.vue +16 -11
- package/src/components/DialogBox/tests/DialogBox.spec.ts +22 -0
- package/src/components/HeaderLoading/Accessibilite.mdx +429 -8
- package/src/components/HeaderLoading/Accessibilite.stories.ts +4 -0
- package/src/components/HeaderLoading/HeaderLoading.vue +59 -0
- package/src/components/HeaderNavigationBar/HeaderNavigationBar.mdx +17 -2
- package/src/components/HeaderNavigationBar/HeaderNavigationBar.stories.ts +91 -2
- package/src/components/HeaderNavigationBar/HeaderNavigationBar.vue +37 -1
- package/src/components/HeaderNavigationBar/HorizontalNavbar/HorizontalNavbar.vue +276 -21
- package/src/components/HeaderNavigationBar/tests/HeaderNavigationBar.spec.ts +2 -2
- package/src/components/NirField/NirField.mdx +3 -0
- package/src/components/NirField/NirField.vue +10 -1
- package/src/components/NirField/tests/NirField.spec.ts +81 -0
- package/src/components/PasswordField/PasswordField.mdx +3 -0
- package/src/components/PeriodField/PeriodField.mdx +2 -0
- package/src/components/PeriodField/PeriodField.stories.ts +195 -0
- package/src/components/PhoneField/Accessibilite.stories.ts +4 -0
- package/src/components/PhoneField/PhoneField.mdx +3 -1
- package/src/components/PhoneField/PhoneField.stories.ts +285 -1
- package/src/components/PhoneField/PhoneField.vue +228 -95
- package/src/components/PhoneField/indicatifs.ts +102 -102
- package/src/components/PhoneField/locales.ts +1 -0
- package/src/components/PhoneField/tests/PhoneField.spec.ts +429 -2
- package/src/components/SkipLink/SkipLink.vue +3 -31
- package/src/components/SkipLink/tests/skipLink.spec.ts +0 -21
- package/src/components/SubHeader/Accessibilite.stories.ts +8 -0
- package/src/components/SubHeader/SubHeader.mdx +1 -0
- package/src/components/SubHeader/SubHeader.stories.ts +179 -60
- package/src/components/SubHeader/SubHeader.vue +45 -15
- package/src/components/SubHeader/locales.ts +1 -0
- package/src/components/SyAlert/SyAlert.vue +6 -0
- package/src/components/Tables/SyServerTable/SyServerTable.mdx +3 -10
- package/src/components/Tables/SyServerTable/SyServerTable.stories.ts +242 -0
- package/src/components/Tables/SyServerTable/SyServerTable.vue +29 -10
- package/src/components/Tables/SyTable/SyTable.mdx +3 -10
- package/src/components/Tables/SyTable/SyTable.stories.ts +242 -0
- package/src/components/Tables/SyTable/SyTable.vue +2 -0
- package/src/components/Tables/common/SyTablePagination.vue +13 -6
- package/src/components/Tables/common/tests/SyTablePagination.spec.ts +157 -0
- package/src/components/Tables/common/types.ts +2 -0
- package/src/components/index.ts +9 -0
- package/src/composables/useFilterable/useFilterable.ts +10 -0
- package/src/designTokens/tokens/amelipro/apColors.ts +1 -1
- package/src/designTokens/tokens/cnam/cnamSemantic.ts +3 -3
- package/src/stories/Components/Components.stories.ts +1 -1
- package/src/stories/GuideDuDev/FormValidationGuide.mdx +342 -0
- package/src/stories/Templates/Templates.stories.ts +1 -1
- package/src/utils/functions/ameliproColors/ameliproColors.ts +1 -1
- package/dist/components/DataList/locales.d.ts +0 -3
- package/src/components/DataList/locales.ts +0 -3
- 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><nav></code> et <code><ul></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-{index}"</code></li>
|
|
123
|
+
<li>Panneaux : <code>id="panel-{index}"</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
|