@cnamts/synapse 1.0.23 → 1.0.25
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +27 -5
- package/dist/AutocompleteFilter-D7qBuCAP.js +114 -0
- package/dist/AutocompleteFilter-Df9i5mAl.cjs +1 -0
- package/dist/DateFilter-BJD6FMev.cjs +1 -0
- package/dist/{DateFilter-Dc-gSGwk.js → DateFilter-BitMWrMU.js} +1 -1
- package/dist/{NumberFilter-vP38Wp6j.js → NumberFilter-BTLUxw0a.js} +3 -3
- package/dist/NumberFilter-DGCzCXzI.cjs +1 -0
- package/dist/{PeriodFilter-Ba1uYUnT.js → PeriodFilter-B5rUIPAC.js} +1 -1
- package/dist/PeriodFilter-DO_ecTZW.cjs +1 -0
- package/dist/SelectFilter-CGwcKWLm.cjs +1 -0
- package/dist/SelectFilter-l4QnRcuk.js +135 -0
- package/dist/TextFilter-B8nf7xoK.cjs +1 -0
- package/dist/{TextFilter-B84dpnoq.js → TextFilter-C9hj6Qrp.js} +7 -7
- package/dist/apLightTheme-CEK4iY3f.cjs +1 -0
- package/dist/apLightTheme-DnIM24Lv.js +950 -0
- package/dist/components/Amelipro/AmeliproAutoCompleteField/AmeliproAutoCompleteField.d.ts +7022 -9616
- package/dist/components/Amelipro/AmeliproCarousel/AmeliproCarousel.d.ts +2 -2
- package/dist/components/Amelipro/AmeliproIconBtn/AmeliproIconBtn.d.ts +2 -2
- package/dist/components/Amelipro/AmeliproPostalAddressField/AmeliproPostalAddressCityRow/AmeliproPostalAddressCityRow.d.ts +40 -40
- package/dist/components/Amelipro/AmeliproPostalAddressField/AmeliproPostalAddressField.d.ts +60 -60
- package/dist/components/Amelipro/AmeliproSelect/AmeliproSelect.d.ts +7168 -9762
- package/dist/components/Amelipro/AmeliproStepper/AmeliproStepper.d.ts +2 -2
- package/dist/components/Amelipro/AmeliproTabs/AmeliproTabs.d.ts +7501 -10095
- package/dist/components/Amelipro/AmeliproTextArea/AmeliproTextArea.d.ts +21 -21
- package/dist/components/Amelipro/AmeliproTextField/AmeliproTextField.d.ts +41 -41
- package/dist/components/Amelipro/StructureMenu/StructureTabs/StructureTabs.d.ts +2 -2
- package/dist/components/CookiesSelection/CookiesInformation/CookiesInformation.d.ts +20 -498
- package/dist/components/Customs/Selects/SyAutocomplete/SyAutocomplete.d.ts +117 -151
- package/dist/components/Customs/Selects/SyInputSelect/SyInputSelect.d.ts +5 -5
- package/dist/components/Customs/Selects/SySelect/SySelect.d.ts +12 -16
- package/dist/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.d.ts +8 -8
- package/dist/components/Customs/SyCheckbox/SyCheckbox.d.ts +31 -506
- package/dist/components/Customs/SyRadioGroup/SyRadioGroup.d.ts +28 -506
- package/dist/components/Customs/SyTabs/SyTabs.d.ts +13 -11
- package/dist/components/Customs/SyTextField/SyTextField.d.ts +69 -89
- package/dist/components/DatePicker/CalendarMode/DatePicker.d.ts +627 -791
- package/dist/components/DatePicker/ComplexDatePicker/ComplexDatePicker.d.ts +315 -412
- package/dist/components/DatePicker/DateTextInput/DateTextInput.d.ts +112 -160
- package/dist/components/DatePicker/composables/index.d.ts +1 -0
- package/dist/components/DatePicker/composables/useDatePickerFocusTrap.d.ts +11 -0
- package/dist/components/DatePicker/composables/useDatePickerState.d.ts +1 -0
- package/dist/components/DatePicker/composables/useDateTextField.d.ts +4 -4
- package/dist/components/DatePicker/composables/useDateValidation.d.ts +3 -3
- package/dist/components/DatePicker/composables/useInputBlurHandler.d.ts +2 -2
- package/dist/components/DatePicker/composables/useManualDateValidation.d.ts +2 -2
- package/dist/components/FileList/FileList.d.ts +6 -0
- package/dist/components/FilterSideBar/FilterSideBar.d.ts +2 -0
- package/dist/components/HeaderNavigationBar/HeaderNavigationBar.d.ts +17 -17
- package/dist/components/HeaderNavigationBar/HorizontalNavbar/HorizontalNavbar.d.ts +3 -3
- package/dist/components/HeaderToolbar/HeaderToolbar.d.ts +20 -28
- package/dist/components/LunarCalendar/useLunarCalendarValidation.d.ts +3 -3
- package/dist/components/MonthPicker/MonthPicker.d.ts +86 -127
- package/dist/components/MonthPicker/MonthPickerText/MonthPickerInput.d.ts +85 -126
- package/dist/components/NirField/NirField.d.ts +202 -278
- package/dist/components/NirField/locales.d.ts +10 -10
- package/dist/components/NirField/useNirValidation.d.ts +64 -0
- package/dist/components/PasswordField/PasswordField.d.ts +8 -9
- package/dist/components/PeriodField/PeriodField.d.ts +1352 -1680
- package/dist/components/PhoneField/PhoneField.d.ts +88 -129
- package/dist/components/RangeField/RangeSlider/RangeSlider.d.ts +12 -12
- package/dist/components/SyTextArea/SyTextArea.d.ts +34 -14
- package/dist/components/SyTextArea/useDefaultValidationRules.d.ts +11 -0
- package/dist/components/Tables/SyServerTable/SyServerTable.d.ts +10 -6
- package/dist/components/Tables/SyTable/SyTable.d.ts +10 -6
- package/dist/components/Tables/common/SyTableFilter.d.ts +2 -3
- package/dist/components/Tables/common/SyTablePagination.d.ts +19 -19
- package/dist/components/Tables/common/TableHeader.d.ts +5 -0
- package/dist/components/Tables/common/filters/AutocompleteFilter.d.ts +120 -0
- package/dist/components/Tables/common/filters/locales.d.ts +0 -1
- package/dist/components/Tables/common/locales.d.ts +3 -0
- package/dist/components/Tables/common/types.d.ts +21 -3
- package/dist/components/Tables/common/useClickableTableRow.d.ts +17 -0
- package/dist/components/Tables/common/usePagination.d.ts +3 -1
- package/dist/components/Tables/common/usePinnedColumns.d.ts +31 -0
- package/dist/components/Tables/common/useTableHeaders.d.ts +2 -0
- package/dist/components/Tables/common/useTableRowCheckboxAccessibility.d.ts +5 -0
- package/dist/components/UploadWorkflow/UploadWorkflow.d.ts +7 -6
- package/dist/composables/date/useDatePickerAccessibility.d.ts +1 -1
- package/dist/composables/rules/useFieldValidation.d.ts +4 -4
- package/dist/composables/unifyValidation/documentationValidationProps.d.ts +230 -0
- package/dist/composables/unifyValidation/useCustomValidation.d.ts +8 -0
- package/dist/composables/unifyValidation/useValidation.d.ts +102 -0
- package/dist/composables/unifyValidation/useVuetifyValidation.d.ts +18 -0
- package/dist/composables/useFormFieldErrorHandling.d.ts +2 -2
- package/dist/composables/validation/useFormValidation.d.ts +11 -2
- package/dist/composables/validation/useValidation.d.ts +19 -9
- package/dist/design-system-v3.d.ts +2 -0
- package/dist/design-system-v3.js +186 -187
- package/dist/design-system-v3.umd.cjs +1 -1066
- package/dist/designTokens/tokens/amelipro/apColors.d.ts +10 -10
- package/dist/designTokens/tokens/amelipro/apColors2026.d.ts +1 -2
- package/dist/designTokens/tokens/amelipro/apContextual.d.ts +44 -0
- package/dist/designTokens/tokens/amelipro/apSemantic.d.ts +1 -1
- package/dist/designTokens/tokens/baseColors.d.ts +127 -0
- package/dist/designTokens/tokens/baseContextualTokens.d.ts +50 -0
- package/dist/designTokens/tokens/cnam/cnamColors.d.ts +10 -10
- package/dist/designTokens/tokens/cnam/cnamSemantic.d.ts +1 -1
- package/dist/designTokens/tokens/pa/paColors.d.ts +1 -166
- package/dist/designTokens/tokens/pa/paSemantic.d.ts +1 -1
- package/dist/designTokens/utils/buildColorClassMap.d.ts +12 -0
- package/dist/designTokens/utils/createFlattenTheme.d.ts +1 -3
- package/dist/designTokens/utils/index.d.ts +2 -2
- package/dist/main-ByDPHpae.cjs +1067 -0
- package/dist/main-Cpx8Co6H.js +38869 -0
- package/dist/main.d.ts +0 -1
- package/dist/synapse.css +1 -0
- package/dist/tooth-11-D3sLWv2n.cjs +1 -0
- package/dist/tooth-12-CXrLuH03.cjs +1 -0
- package/dist/tooth-13-BSfo5fpT.cjs +1 -0
- package/dist/tooth-14-DMzulx0h.cjs +1 -0
- package/dist/tooth-15-BKRFVi-9.cjs +1 -0
- package/dist/tooth-16-CpuxAbuM.cjs +1 -0
- package/dist/tooth-17-BPoahUdg.cjs +1 -0
- package/dist/tooth-18-DhHJz8sy.cjs +1 -0
- package/dist/tooth-21-Dgd5hn_X.cjs +1 -0
- package/dist/tooth-22-C2Tn19sB.cjs +1 -0
- package/dist/tooth-23-C9uaaSGb.cjs +1 -0
- package/dist/tooth-24-BrK9UGpf.cjs +1 -0
- package/dist/tooth-25-CE_EfGNp.cjs +1 -0
- package/dist/tooth-26-Ctv4i9Fy.cjs +1 -0
- package/dist/tooth-27-C5J7JkWM.cjs +1 -0
- package/dist/tooth-28-Z9oWqjo0.cjs +1 -0
- package/dist/tooth-31-BrYqmkTi.cjs +1 -0
- package/dist/tooth-32-BNNR0oCZ.cjs +1 -0
- package/dist/tooth-33-DuxvqO2J.cjs +1 -0
- package/dist/tooth-34-BCSCXMB6.cjs +1 -0
- package/dist/tooth-35-BLUXkX88.cjs +1 -0
- package/dist/tooth-36-IrKHYqlA.cjs +1 -0
- package/dist/tooth-37-BYqpdMwo.cjs +1 -0
- package/dist/tooth-38-B_eNXXdu.cjs +1 -0
- package/dist/tooth-41-Ddva4Ot8.cjs +1 -0
- package/dist/tooth-42-szcDqlM0.cjs +1 -0
- package/dist/tooth-43-B3ka6rQm.cjs +1 -0
- package/dist/tooth-44-CazyQucj.cjs +1 -0
- package/dist/tooth-45-B4HQtc8n.cjs +1 -0
- package/dist/tooth-46-BPM40gbG.cjs +1 -0
- package/dist/tooth-47-Dvr20dlh.cjs +1 -0
- package/dist/tooth-48-Bd8ljGsF.cjs +1 -0
- package/dist/tooth-51-OBpwCOF3.cjs +1 -0
- package/dist/tooth-52-aKxyHcmq.cjs +1 -0
- package/dist/tooth-53-vCwJjTOc.cjs +1 -0
- package/dist/tooth-54-DsWu2iFy.cjs +1 -0
- package/dist/tooth-55-BxC1X2Dn.cjs +1 -0
- package/dist/tooth-61-BbLvxMQi.cjs +1 -0
- package/dist/tooth-62-CmTkWczP.cjs +1 -0
- package/dist/tooth-63-DI7l_2qI.cjs +1 -0
- package/dist/tooth-64-B21sOsJh.cjs +1 -0
- package/dist/tooth-65-D2ZC2VEr.cjs +1 -0
- package/dist/tooth-71-D473PPO5.cjs +1 -0
- package/dist/tooth-72-Drh1wnNu.cjs +1 -0
- package/dist/tooth-73-DzlwYI23.cjs +1 -0
- package/dist/tooth-74-8aGvcZPg.cjs +1 -0
- package/dist/tooth-75-BFK7At_r.cjs +1 -0
- package/dist/tooth-81-BZmR-I0M.cjs +1 -0
- package/dist/tooth-82-euVfUUZV.cjs +1 -0
- package/dist/tooth-83-KV010j64.cjs +1 -0
- package/dist/tooth-84-BBg1RjhZ.cjs +1 -0
- package/dist/tooth-85-Cr-kc1wM.cjs +1 -0
- package/dist/utils/functions/classToHex.d.ts +1 -1
- package/dist/utils/functions/createHexResolver.d.ts +16 -0
- package/dist/vuetifyConfig.js +522 -0
- package/dist/vuetifyConfig.umd.cjs +1 -0
- package/package.json +37 -20
- package/src/assets/amelipro/apTokens2026.scss +5 -5
- package/src/assets/overrides/_breakpoints.scss +25 -0
- package/src/assets/overrides/_btns.scss +0 -8
- package/src/assets/overrides/_forms.scss +1 -3
- package/src/assets/overrides/_icons.scss +14 -10
- package/src/assets/overrides/_otp.scss +41 -0
- package/src/assets/overrides/_tables.scss +11 -20
- package/src/assets/overrides/_tooltips.scss +17 -7
- package/src/assets/overrides/_typography.scss +35 -47
- package/src/assets/overrides/_utilities.scss +43 -47
- package/src/assets/themes.scss +1 -0
- package/src/components/Amelipro/AmeliproAccordion/AmeliproAccordionTemplate/AmeliproAccordionTemplate.vue +20 -20
- package/src/components/Amelipro/AmeliproAccordionFrieze/AmeliproAccordionFrieze.vue +12 -14
- package/src/components/Amelipro/AmeliproAccordionList/AmeliproAccordionList.vue +4 -6
- package/src/components/Amelipro/AmeliproAccordionResult/AmeliproAccordionResultTemplate/AmeliproAccordionResultTemplate.vue +5 -5
- package/src/components/Amelipro/AmeliproAccordionResultList/AmeliproAccordionResultList.vue +4 -6
- package/src/components/Amelipro/AmeliproAutoCompleteField/AmeliproAutoCompleteField.vue +4 -6
- package/src/components/Amelipro/AmeliproAutoCompleteField/__tests__/__snapshots__/AmeliproAutoCompleteField.spec.ts.snap +2 -2
- package/src/components/Amelipro/AmeliproBadge/AmeliproBadge.vue +4 -6
- package/src/components/Amelipro/AmeliproBreadcrumb/AmeliproBreadcrumb.vue +1 -3
- package/src/components/Amelipro/AmeliproBtn/AmeliproBtn.vue +4 -6
- package/src/components/Amelipro/AmeliproCallback/AmeliproCallback.vue +2 -2
- package/src/components/Amelipro/AmeliproCard/AmeliproCard.vue +31 -31
- package/src/components/Amelipro/AmeliproCarousel/AmeliproCarousel.vue +5 -7
- package/src/components/Amelipro/AmeliproCheckbox/AmeliproCheckbox.vue +13 -15
- package/src/components/Amelipro/AmeliproCheckboxGroup/AmeliproCheckboxGroup.vue +23 -23
- package/src/components/Amelipro/AmeliproChips/AmeliproChips.vue +1 -3
- package/src/components/Amelipro/AmeliproClickableTile/AmeliproClickableTile.vue +17 -12
- package/src/components/Amelipro/AmeliproClickableTile/tests/__snapshots__/AmeliproClickableTile.spec.ts.snap +2 -2
- package/src/components/Amelipro/AmeliproCopyBtn/AmeliproCopyBtn.vue +4 -6
- package/src/components/Amelipro/AmeliproCustomSelector/AmeliproCustomSelector.vue +13 -13
- package/src/components/Amelipro/AmeliproDentalChart/AmeliproDentalChart.vue +4 -2
- package/src/components/Amelipro/AmeliproDentalChart/AmeliproTooth/AmeliproTooth.vue +4 -4
- package/src/components/Amelipro/AmeliproDialog/AmeliproDialog.vue +5 -7
- package/src/components/Amelipro/AmeliproDisclosure/AmeliproDisclosure.vue +1 -3
- package/src/components/Amelipro/AmeliproErrorTemplate/AmeliproErrorTemplate.vue +2 -4
- package/src/components/Amelipro/AmeliproFilePreview/AmeliproFilePreview.vue +4 -6
- package/src/components/Amelipro/AmeliproFilters/AmeliproFilters.vue +13 -13
- package/src/components/Amelipro/AmeliproFirstLogin/AmeliproFirstLogin.vue +3 -5
- package/src/components/Amelipro/AmeliproFooter/AmeliproFooter.vue +1 -3
- package/src/components/Amelipro/AmeliproHeader/AmeliproHeader.vue +2 -4
- package/src/components/Amelipro/AmeliproHeader/AmeliproHeaderBar/AmeliproHeaderBar.vue +1 -3
- package/src/components/Amelipro/AmeliproHeader/AmeliproHeaderBar/AmeliproHeaderBrandSection/AmeliproHeaderBrandSection.vue +20 -16
- package/src/components/Amelipro/AmeliproHeader/AmeliproHeaderBar/AmeliproHeaderBrandSection/__tests__/__snapshots__/AmeliproHeaderBrandSection.spec.ts.snap +2 -2
- package/src/components/Amelipro/AmeliproIconBtn/AmeliproIconBtn.vue +2 -4
- package/src/components/Amelipro/AmeliproIllustratedDataTile/AmeliproIllustratedDataTile.vue +5 -7
- package/src/components/Amelipro/AmeliproIllustratedRadioGroup/AmeliproIllustratedRadioGroup.vue +6 -8
- package/src/components/Amelipro/AmeliproMailTile/AmeliproMailTile.vue +14 -14
- package/src/components/Amelipro/AmeliproMenu/AmeliproMenu.vue +11 -13
- package/src/components/Amelipro/AmeliproMessagingLayout/AmeliproDropdownMenu/AmeliproDropdownMenu.vue +2 -4
- package/src/components/Amelipro/AmeliproMessagingLayout/AmeliproMessagingLayout.vue +8 -8
- package/src/components/Amelipro/AmeliproMultipleFoldingCard/AmeliproMultipleFoldingCard.vue +40 -40
- package/src/components/Amelipro/AmeliproNumberedCard/AmeliproNumberedCard.vue +27 -27
- package/src/components/Amelipro/AmeliproOnboarding/AmeliproOnboarding.vue +3 -5
- package/src/components/Amelipro/AmeliproPageLayout/AmeliproPageLayout.vue +2 -4
- package/src/components/Amelipro/AmeliproPagination/AmeliproPagination.vue +2 -4
- package/src/components/Amelipro/AmeliproPagination/AmeliproPaginationBtn/AmeliproPaginationBtn.vue +3 -5
- package/src/components/Amelipro/AmeliproPatientBanner/AmeliproPatientBanner.vue +1 -3
- package/src/components/Amelipro/AmeliproPatientLogged/AmeliproPatientLogged.vue +2 -4
- package/src/components/Amelipro/AmeliproPatientLogin/AmeliproPatientLogin.vue +4 -4
- package/src/components/Amelipro/AmeliproPatientLogin/AmeliproPatientLoginForm/AmeliproPatientLoginForm.vue +1 -3
- package/src/components/Amelipro/AmeliproPostalAddressField/AmeliproPostalAddressCityRow/AmeliproPostalAddressCityRow.vue +3 -5
- package/src/components/Amelipro/AmeliproPostalAddressField/AmeliproPostalAddressField.vue +3 -5
- package/src/components/Amelipro/AmeliproRadioGroup/AmeliproRadioGroup.vue +23 -23
- package/src/components/Amelipro/AmeliproResultList/AmeliproResultList.vue +4 -6
- package/src/components/Amelipro/AmeliproSelect/AmeliproSelect.vue +12 -22
- package/src/components/Amelipro/AmeliproStateTile/AmeliproStateTile.vue +10 -12
- package/src/components/Amelipro/AmeliproStepper/AmeliproStepper.vue +17 -17
- package/src/components/Amelipro/AmeliproTable/AmeliproTable.vue +8 -10
- package/src/components/Amelipro/AmeliproTabs/AmeliproTabBtn/AmeliproTabBtn.vue +6 -8
- package/src/components/Amelipro/AmeliproTabs/AmeliproTabs.vue +4 -4
- package/src/components/Amelipro/AmeliproTextArea/AmeliproTextArea.vue +4 -6
- package/src/components/Amelipro/AmeliproTextArea/__tests__/__snapshots__/AmeliproTextArea.spec.ts.snap +2 -2
- package/src/components/Amelipro/AmeliproTextField/AmeliproTextField.vue +7 -9
- package/src/components/Amelipro/AmeliproTileBtn/AmeliproTileBtn.vue +3 -5
- package/src/components/Amelipro/AmeliproTooltips/AmeliproTooltips.vue +0 -2
- package/src/components/Amelipro/AmeliproUpload/AmeliproUpload.vue +6 -6
- package/src/components/Amelipro/ServiceMenu/ServiceMenu.vue +2 -2
- package/src/components/Amelipro/StructureMenu/StructureBtn/StructureBtn.vue +4 -4
- package/src/components/Amelipro/StructureMenu/StructureItem/StructureItem.vue +4 -6
- package/src/components/Amelipro/StructureMenu/StructureMenu.vue +2 -2
- package/src/components/Amelipro/StructureMenu/StructureTabs/StructureTabs.vue +2 -2
- package/src/components/Amelipro/UserMenu/UserMenu.vue +1 -3
- package/src/components/BackBtn/tests/BackBtn.visual.cy.ts +43 -0
- package/src/components/BackBtn/tests/__snapshots__/back-btn-custom-bg.snap.png +0 -0
- package/src/components/BackBtn/tests/__snapshots__/back-btn-dark-mode.snap.png +0 -0
- package/src/components/BackBtn/tests/__snapshots__/back-btn-default.snap.png +0 -0
- package/src/components/BackBtn/tests/__snapshots__/back-btn-no-icon.snap.png +0 -0
- package/src/components/Captcha/Captcha.vue +1 -3
- package/src/components/Captcha/accessibilite/Accessibility.mdx +86 -8
- package/src/components/Captcha/tests/__snapshots__/Captcha.spec.ts.snap +12 -12
- package/src/components/ChipList/ChipList.stories.ts +0 -15
- package/src/components/ChipList/ChipList.vue +19 -17
- package/src/components/ChipList/accessibilite/Accessibility.mdx +83 -10
- package/src/components/ChipList/tests/ChipList.a11y.spec.ts +41 -0
- package/src/components/CookiesSelection/CookiesInformation/CookiesInformation.vue +0 -2
- package/src/components/CopyBtn/CopyBtn.vue +1 -3
- package/src/components/Customs/Selects/SelectBtnField/SelectBtnField.vue +17 -17
- package/src/components/Customs/Selects/SelectBtnField/accessibilite/Accessibility.mdx +0 -9
- package/src/components/Customs/Selects/SelectBtnField/tests/SelectBtnField.spec.ts +31 -0
- package/src/components/Customs/Selects/SyAutocomplete/SyAutocomplete.stories.ts +66 -0
- package/src/components/Customs/Selects/SyAutocomplete/SyAutocomplete.vue +28 -7
- package/src/components/Customs/Selects/SyAutocomplete/tests/SyAutocomplete.a11y.spec.ts +18 -0
- package/src/components/Customs/Selects/SyAutocomplete/tests/SyAutocomplete.spec.ts +209 -0
- package/src/components/Customs/Selects/SyAutocomplete/utils/ariaManager.ts +14 -10
- package/src/components/Customs/Selects/SyInputSelect/SyInputSelect.stories.ts +4 -4
- package/src/components/Customs/Selects/SyInputSelect/SyInputSelect.vue +12 -15
- package/src/components/Customs/Selects/SyInputSelect/tests/SyInputSelect.spec.ts +10 -10
- package/src/components/Customs/Selects/SySelect/SySelect.stories.ts +1 -39
- package/src/components/Customs/Selects/SySelect/SySelect.vue +274 -71
- package/src/components/Customs/Selects/SySelect/accessibilite/Accessibility.mdx +199 -269
- package/src/components/Customs/Selects/SySelect/tests/SySelect.spec.ts +89 -0
- package/src/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.vue +6 -9
- package/src/components/Customs/SyCheckbox/SyCheckbox.mdx +5 -0
- package/src/components/Customs/SyCheckbox/SyCheckbox.stories.ts +10 -16
- package/src/components/Customs/SyCheckbox/SyCheckbox.vue +45 -11
- package/src/components/Customs/SyCheckbox/accessibilite/Accessibility.mdx +53 -3
- package/src/components/Customs/SyCheckbox/tests/SyCheckbox.a11y.spec.ts +134 -2
- package/src/components/Customs/SyForm/SyForm.stories.ts +31 -5
- package/src/components/Customs/SyPagination/SyPagination.vue +0 -2
- package/src/components/Customs/SyRadioGroup/SyRadioGroup.vue +4 -7
- package/src/components/Customs/SyTabs/SyTabs.mdx +0 -58
- package/src/components/Customs/SyTabs/SyTabs.stories.ts +32 -33
- package/src/components/Customs/SyTabs/SyTabs.vue +87 -67
- package/src/components/Customs/SyTabs/accessibilite/Accessibility.mdx +83 -23
- package/src/components/Customs/SyTabs/tests/SyTabs.a11y.spec.ts +88 -0
- package/src/components/Customs/SyTabs/tests/SyTabs.spec.ts +46 -1
- package/src/components/Customs/SyTextField/SyTextField.mdx +1 -1
- package/src/components/Customs/SyTextField/SyTextField.stories.ts +50 -68
- package/src/components/Customs/SyTextField/SyTextField.vue +156 -161
- package/src/components/Customs/SyTextField/tests/SyTextField.a11y.spec.ts +32 -0
- package/src/components/Customs/SyTextField/tests/SyTextField.spec.ts +120 -11
- package/src/components/DatePicker/CalendarMode/DatePicker.stories.ts +62 -58
- package/src/components/DatePicker/CalendarMode/DatePicker.vue +342 -237
- package/src/components/DatePicker/CalendarMode/accessibilite/Accessibility.mdx +82 -0
- package/src/components/DatePicker/CalendarMode/tests/DatePicker.a11y.spec.ts +141 -0
- package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.stories.ts +2 -56
- package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.vue +215 -175
- package/src/components/DatePicker/ComplexDatePicker/accessibilite/Accessibility.mdx +76 -0
- package/src/components/DatePicker/ComplexDatePicker/tests/ComplexDatePicker.spec.ts +33 -10
- package/src/components/DatePicker/DatePickerValidationExample/CalendarMode.stories.ts +8 -8
- package/src/components/DatePicker/DatePickerValidationExample/ComplexDatePicker.stories.ts +106 -8
- package/src/components/DatePicker/DatePickerValidationExample/DateTextInput.stories.ts +12 -11
- package/src/components/DatePicker/DatePickerValidationExample/MultiMode.stories.ts +12 -12
- package/src/components/DatePicker/DateTextInput/DateRange.stories.ts +0 -12
- package/src/components/DatePicker/DateTextInput/DateTextInput.vue +71 -67
- package/src/components/DatePicker/DateTextInput/NoCalendar.stories.ts +3 -0
- package/src/components/DatePicker/DateTextInput/accessibilite/Accessibility.mdx +66 -0
- package/src/components/DatePicker/DateTextInput/tests/DateTextInput.spec.ts +52 -1
- package/src/components/DatePicker/composables/index.ts +1 -0
- package/src/components/DatePicker/composables/tests/useCalendarKeyboardNavigation.spec.ts +109 -65
- package/src/components/DatePicker/composables/tests/useDatePickerFocusTrap.spec.ts +138 -0
- package/src/components/DatePicker/composables/tests/useDatePickerState.spec.ts +53 -0
- package/src/components/DatePicker/composables/tests/useDateValidation.spec.ts +74 -18
- package/src/components/DatePicker/composables/tests/useInputBlurHandler.spec.ts +39 -0
- package/src/components/DatePicker/composables/tests/useManualDateValidation.spec.ts +91 -0
- package/src/components/DatePicker/composables/useCalendarKeyboardNavigation.ts +442 -36
- package/src/components/DatePicker/composables/useDatePickerFocusTrap.ts +92 -0
- package/src/components/DatePicker/composables/useDatePickerState.ts +24 -0
- package/src/components/DatePicker/composables/useDateTextField.ts +6 -6
- package/src/components/DatePicker/composables/useDateValidation.ts +36 -35
- package/src/components/DatePicker/composables/useInputBlurHandler.ts +3 -3
- package/src/components/DatePicker/composables/useManualDateValidation.ts +6 -2
- package/src/components/DatePicker/composables/useMonthButtonCustomization.ts +9 -8
- package/src/components/DatePicker/playground/DatePickerHolidayRule.vue +1 -1
- package/src/components/DiacriticPicker/accessibilite/Accessibility.mdx +76 -8
- package/src/components/DialogBox/DialogBox.vue +3 -5
- package/src/components/DialogBox/tests/DialogBox.visual.cy.ts +76 -0
- package/src/components/DialogBox/tests/__snapshots__/dialog-box-custom-texts.snap.png +0 -0
- package/src/components/DialogBox/tests/__snapshots__/dialog-box-default.snap.png +0 -0
- package/src/components/DialogBox/tests/__snapshots__/dialog-box-no-actions.snap.png +0 -0
- package/src/components/FileList/FileList.vue +9 -2
- package/src/components/FileList/UploadItem/UploadItem.vue +11 -13
- package/src/components/FileList/tests/FileList.spec.ts +47 -0
- package/src/components/FileUpload/FileUpload.vue +3 -5
- package/src/components/FileUpload/FileUploadContent.vue +3 -5
- package/src/components/FilterInline/FilterInline.vue +1 -3
- package/src/components/FilterSideBar/FilterSideBar.mdx +44 -1
- package/src/components/FilterSideBar/FilterSideBar.stories.ts +105 -1
- package/src/components/FilterSideBar/FilterSideBar.vue +7 -0
- package/src/components/FilterSideBar/tests/FilterSideBar.a11y.spec.ts +54 -1
- package/src/components/FilterSideBar/tests/FilterSideBar.spec.ts +42 -0
- package/src/components/FooterBar/FooterBar.vue +9 -13
- package/src/components/FranceConnectBtn/FranceConnectBtn.vue +1 -1
- package/src/components/HeaderBar/HeaderBar.stories.ts +14 -2
- package/src/components/HeaderBar/HeaderBar.vue +2 -3
- package/src/components/HeaderBar/HeaderBurgerMenu/HeaderBurgerMenu.vue +2 -3
- package/src/components/HeaderBar/HeaderBurgerMenu/HeaderMenuItem/HeaderMenuItem.vue +2 -3
- package/src/components/HeaderBar/HeaderBurgerMenu/HeaderMenuSection/HeaderMenuSection.vue +0 -1
- package/src/components/HeaderBar/HeaderBurgerMenu/HeaderSubMenu/HeaderSubMenu.vue +8 -9
- package/src/components/HeaderBar/HeaderBurgerMenu/menu.scss +0 -8
- package/src/components/HeaderBar/HeaderBurgerMenu/tests/HeaderBurgerMenu.visual.cy.ts +196 -0
- package/src/components/HeaderBar/HeaderBurgerMenu/tests/__snapshots__/header-burger-menu-generated-submenu-open.snap.png +0 -0
- package/src/components/HeaderBar/HeaderBurgerMenu/tests/__snapshots__/header-burger-menu-generated.snap.png +0 -0
- package/src/components/HeaderBar/HeaderLogo/HeaderLogo.vue +0 -1
- package/src/components/HeaderBar/HeaderMenuBtn/HeaderMenuBtn.vue +6 -7
- package/src/components/HeaderBar/tests/HeaderBar.visual.cy.ts +81 -0
- package/src/components/HeaderBar/tests/__snapshots__/header-bar-custom-width.snap.png +0 -0
- package/src/components/HeaderBar/tests/__snapshots__/header-bar-default.snap.png +0 -0
- package/src/components/HeaderBar/tests/__snapshots__/header-bar-no-sticky.snap.png +0 -0
- package/src/components/HeaderBar/tests/__snapshots__/header-bar-with-prepend.snap.png +0 -0
- package/src/components/HeaderBar/tests/__snapshots__/header-bar-with-side.snap.png +0 -0
- package/src/components/HeaderBar/tests/__snapshots__/header-bar-with-subtitle.snap.png +0 -0
- package/src/components/HeaderNavigationBar/HeaderNavigationBar.vue +12 -3
- package/src/components/HeaderNavigationBar/HorizontalNavbar/HorizontalNavbar.vue +15 -8
- package/src/components/HeaderToolbar/HeaderToolbar.vue +6 -7
- package/src/components/LangBtn/LangBtn.vue +2 -4
- package/src/components/Logo/accessibilite/Accessibility.mdx +73 -11
- package/src/components/Logo/tests/Logo.visual.cy.ts +57 -0
- package/src/components/Logo/tests/__snapshots__/logo-avatar.snap.png +0 -0
- package/src/components/Logo/tests/__snapshots__/logo-dark.snap.png +0 -0
- package/src/components/Logo/tests/__snapshots__/logo-default.snap.png +0 -0
- package/src/components/Logo/tests/__snapshots__/logo-no-organism.snap.png +0 -0
- package/src/components/Logo/tests/__snapshots__/logo-no-signature.snap.png +0 -0
- package/src/components/Logo/tests/__snapshots__/logo-risque-pro.snap.png +0 -0
- package/src/components/LogoBrandSection/LogoBrandSection.vue +2 -2
- package/src/components/LogoBrandSection/accessibilite/Accessibility.mdx +85 -9
- package/src/components/LunarCalendar/tests/LunarCalendar.spec.ts +3 -1
- package/src/components/LunarCalendar/useLunarCalendarValidation.ts +4 -5
- package/src/components/MonthPicker/MonthPickerVisual/VisualPickerHeader.vue +1 -1
- package/src/components/MonthPicker/tests/MonthPicker.spec.ts +2 -1
- package/src/components/MonthPicker/tests/__snapshots__/MonthPicker.spec.ts.snap +7 -7
- package/src/components/NirField/NirField.stories.ts +6 -2
- package/src/components/NirField/NirField.vue +67 -265
- package/src/components/NirField/accessibilite/Accessibility.mdx +102 -7
- package/src/components/NirField/locales.ts +1 -1
- package/src/components/NirField/tests/NirField.spec.ts +124 -0
- package/src/components/NirField/tests/useNirValidation.spec.ts +449 -0
- package/src/components/NirField/useNirValidation.ts +277 -0
- package/src/components/NotificationBar/Notification/Notification.vue +5 -7
- package/src/components/NotificationBar/NotificationBar.vue +1 -3
- package/src/components/PaginatedTable/PaginatedTable.vue +2 -3
- package/src/components/PaginatedTable/Pagination.vue +3 -5
- package/src/components/PasswordField/PasswordField.stories.ts +4 -4
- package/src/components/PasswordField/PasswordField.vue +26 -34
- package/src/components/PasswordField/tests/PasswordField.spec.ts +6 -3
- package/src/components/PeriodField/PeriodField.stories.ts +4 -4
- package/src/components/PeriodField/PeriodField.vue +57 -57
- package/src/components/PeriodField/__tests__/PeriodField.async.spec.ts +32 -0
- package/src/components/PeriodField/accessibilite/Accessibility.mdx +68 -8
- package/src/components/PeriodField/tests/PeriodField.spec.ts +28 -2
- package/src/components/PhoneField/PhoneField.vue +8 -9
- package/src/components/PhoneField/tests/PhoneField.spec.ts +1 -0
- package/src/components/RangeField/RangeField.vue +6 -0
- package/src/components/RangeField/RangeSlider/RangeSlider.vue +0 -2
- package/src/components/RangeField/RangeSlider/Tooltip/Tooltip.vue +1 -1
- package/src/components/RangeField/tests/RangeField.visual.cy.ts +65 -0
- package/src/components/RangeField/tests/__snapshots__/range-field-custom-bg.snap.png +0 -0
- package/src/components/RangeField/tests/__snapshots__/range-field-custom-range.snap.png +0 -0
- package/src/components/RangeField/tests/__snapshots__/range-field-default.snap.png +0 -0
- package/src/components/RangeField/tests/__snapshots__/range-field-step.snap.png +0 -0
- package/src/components/RangeField/tests/__snapshots__/range-field-with-label.snap.png +0 -0
- package/src/components/RatingPicker/EmotionPicker/EmotionPicker.vue +6 -8
- package/src/components/RatingPicker/StarsPicker/StarsPicker.vue +3 -5
- package/src/components/SearchListField/SearchListField.vue +0 -2
- package/src/components/SkipLink/SkipLink.vue +2 -4
- package/src/components/SocialMediaLinks/SocialMediaLinks.vue +6 -6
- package/src/components/SubHeader/SubHeader.vue +1 -1
- package/src/components/SyAlert/SyAlert.vue +7 -9
- package/src/components/SyAlert/tests/SyAlert.visual.cy.ts +46 -0
- package/src/components/SyAlert/tests/__snapshots__/sy-alert-closable.snap.png +0 -0
- package/src/components/SyAlert/tests/__snapshots__/sy-alert-error.snap.png +0 -0
- package/src/components/SyAlert/tests/__snapshots__/sy-alert-info.snap.png +0 -0
- package/src/components/SyAlert/tests/__snapshots__/sy-alert-success.snap.png +0 -0
- package/src/components/SyAlert/tests/__snapshots__/sy-alert-variant-outlined.snap.png +0 -0
- package/src/components/SyAlert/tests/__snapshots__/sy-alert-variant-tonal.snap.png +0 -0
- package/src/components/SyAlert/tests/__snapshots__/sy-alert-warning.snap.png +0 -0
- package/src/components/SyBtnMenu/SyBtnMenu.vue +2 -4
- package/src/components/SyTextArea/SyTextArea.stories.ts +138 -2
- package/src/components/SyTextArea/SyTextArea.vue +53 -23
- package/src/components/SyTextArea/tests/SyTextArea.spec.ts +126 -3
- package/src/components/SyTextArea/useDefaultValidationRules.ts +74 -0
- package/src/components/TableToolbar/TableToolbar.vue +6 -8
- package/src/components/Tables/SyServerTable/SyServerTable.mdx +25 -0
- package/src/components/Tables/SyServerTable/SyServerTable.stories.ts +839 -1
- package/src/components/Tables/SyServerTable/SyServerTable.vue +154 -95
- package/src/components/Tables/SyServerTable/tests/SyServerTable.a11y.spec.ts +81 -0
- package/src/components/Tables/SyServerTable/tests/SyServerTable.spec.ts +390 -0
- package/src/components/Tables/SyTable/SyTable.mdx +25 -0
- package/src/components/Tables/SyTable/SyTable.stories.ts +556 -1
- package/src/components/Tables/SyTable/SyTable.vue +136 -60
- package/src/components/Tables/SyTable/tests/SyTable.a11y.spec.ts +79 -0
- package/src/components/Tables/SyTable/tests/SyTable.spec.ts +382 -0
- package/src/components/Tables/common/SyTableFilter.vue +49 -4
- package/src/components/Tables/common/SyTablePagination.vue +142 -19
- package/src/components/Tables/common/TableHeader.vue +45 -4
- package/src/components/Tables/common/filters/AutocompleteFilter.vue +160 -0
- package/src/components/Tables/common/filters/NumberFilter.vue +1 -1
- package/src/components/Tables/common/filters/SelectFilter.vue +11 -12
- package/src/components/Tables/common/filters/TextFilter.vue +1 -1
- package/src/components/Tables/common/filters/getFilterComponent.ts +8 -1
- package/src/components/Tables/common/filters/locales.ts +0 -1
- package/src/components/Tables/common/filters/tests/AutocompleteFilter.a11y.spec.ts +110 -0
- package/src/components/Tables/common/filters/tests/AutocompleteFilter.spec.ts +203 -0
- package/src/components/Tables/common/filters/tests/SelectFilter.a11y.spec.ts +104 -0
- package/src/components/Tables/common/filters/tests/SelectFilter.spec.ts +152 -16
- package/src/components/Tables/common/locales.ts +3 -0
- package/src/components/Tables/common/tableFilterUtils.ts +3 -0
- package/src/components/Tables/common/tableStyles.scss +60 -19
- package/src/components/Tables/common/tests/SyTablePagination.spec.ts +18 -0
- package/src/components/Tables/common/tests/TableHeader.spec.ts +39 -0
- package/src/components/Tables/common/tests/filterByRange.spec.ts +2 -1
- package/src/components/Tables/common/types.ts +15 -4
- package/src/components/Tables/common/useClickableTableRow.ts +103 -0
- package/src/components/Tables/common/usePagination.ts +13 -0
- package/src/components/Tables/common/usePinnedColumns.ts +237 -0
- package/src/components/Tables/common/useTableHeaders.ts +52 -30
- package/src/components/Tables/common/useTableRowCheckboxAccessibility.ts +41 -0
- package/src/components/UploadWorkflow/UploadWorkflow.vue +1 -0
- package/src/components/UploadWorkflow/tests/UploadWorkflow.spec.ts +23 -0
- package/src/components/UploadWorkflow/tests/__snapshots__/UploadWorkflow.spec.ts.snap +66 -0
- package/src/components/UploadWorkflow/useFileList.ts +3 -0
- package/src/components/UserMenuBtn/UserMenuBtn.vue +1 -3
- package/src/composables/date/tests/useDatePickerAccessibility.spec.ts +2 -6
- package/src/composables/date/useDatePickerAccessibility.ts +42 -207
- package/src/composables/rules/tests/useFieldValidation.spec.ts +120 -120
- package/src/composables/rules/useFieldValidation.ts +34 -17
- package/src/composables/unifyValidation/documentationValidationProps.ts +235 -0
- package/src/composables/unifyValidation/tests/useCustomValidation.spec.ts +601 -0
- package/src/composables/unifyValidation/tests/useValidation.spec.ts +2048 -0
- package/src/composables/unifyValidation/tests/useVuetifyValidation.spec.ts +184 -0
- package/src/composables/unifyValidation/useCustomValidation.ts +95 -0
- package/src/composables/unifyValidation/useValidation.ts +190 -0
- package/src/composables/unifyValidation/useVuetifyValidation.ts +54 -0
- package/src/composables/useFormFieldErrorHandling.ts +4 -7
- package/src/composables/validation/tests/useFormValidation.spec.ts +14 -0
- package/src/composables/validation/tests/useValidation.spec.ts +116 -21
- package/src/composables/validation/useFormValidation.ts +20 -13
- package/src/composables/validation/useValidatable.ts +8 -1
- package/src/composables/validation/useValidation.ts +151 -99
- package/src/composantsVuetify/Introduction.mdx +48 -0
- package/src/composantsVuetify/VBreadcrumbs/VBreadcrumbs.mdx +28 -0
- package/src/composantsVuetify/VBreadcrumbs/v-breadcrumbs.stories.ts +108 -0
- package/src/composantsVuetify/VBtn/VBtn.mdx +72 -0
- package/src/composantsVuetify/VBtn/v-btn.stories.ts +121 -0
- package/src/composantsVuetify/VOtpInput/VOtpInput.mdx +39 -0
- package/src/composantsVuetify/VOtpInput/v-otp-input.stories.ts +56 -0
- package/src/composantsVuetify/VSkeletonLoader/VSkeletonLoader.mdx +42 -0
- package/src/composantsVuetify/VSkeletonLoader/v-skeleton-loader.stories.ts +77 -0
- package/src/composantsVuetify/VSwitch/VSwitch.mdx +47 -0
- package/src/composantsVuetify/VSwitch/v-switch.stories.ts +166 -0
- package/src/composantsVuetify/VTooltip/VTooltip.mdx +32 -0
- package/src/composantsVuetify/VTooltip/v-tooltip.stories.ts +95 -0
- package/src/designTokens/tests/buildColorClassMap.spec.ts +31 -0
- package/src/designTokens/tests/generateScssTokens.spec.ts +12 -0
- package/src/designTokens/tests/themeUtils.spec.ts +53 -0
- package/src/designTokens/tokens/amelipro/apColors.ts +8 -130
- package/src/designTokens/tokens/amelipro/apColors2026.ts +3 -15
- package/src/designTokens/tokens/amelipro/apContextual.ts +55 -47
- package/src/designTokens/tokens/amelipro/apLightTheme.ts +1 -1
- package/src/designTokens/tokens/amelipro/apSemantic.ts +1 -1
- package/src/designTokens/tokens/baseColors.ts +129 -0
- package/src/designTokens/tokens/baseContextualTokens.ts +52 -0
- package/src/designTokens/tokens/cnam/cnamColors.ts +3 -125
- package/src/designTokens/tokens/cnam/cnamContextual.ts +4 -48
- package/src/designTokens/tokens/cnam/cnamLightTheme.ts +1 -1
- package/src/designTokens/tokens/cnam/cnamSemantic.ts +3 -3
- package/src/designTokens/tokens/pa/paColors.ts +2 -166
- package/src/designTokens/tokens/pa/paContextual.ts +3 -48
- package/src/designTokens/tokens/pa/paLightTheme.ts +1 -1
- package/src/designTokens/tokens/pa/paSemantic.ts +2 -2
- package/src/designTokens/utils/buildColorClassMap.ts +34 -0
- package/src/designTokens/utils/convertSemanticsToken.ts +8 -11
- package/src/designTokens/utils/createFlattenTheme.ts +15 -7
- package/src/designTokens/utils/index.ts +2 -2
- package/src/main.ts +0 -2
- package/src/stories/Accessibilite/AuditDesignSystem.mdx +0 -11
- package/src/stories/Accessibilite/DesignSystem/Avancement.mdx +433 -0
- package/src/stories/Accessibilite/DesignSystem/a11y-status.json +692 -0
- package/src/stories/Accessibilite/KitDePreAudit/Echantillonnage.mdx +8 -1
- package/src/stories/Accessibilite/KitDePreAudit/Introduction.mdx +51 -10
- package/src/stories/Accessibilite/KitDePreAudit/Outils/Introduction.mdx +16 -9
- package/src/stories/Accessibilite/KitDePreAudit/Preaudit.mdx +48 -58
- package/src/stories/Components/Components.stories.ts +113 -9
- package/src/stories/Demarrer/Accueil.stories.ts +3 -3
- package/src/stories/Demarrer/EnrichirLeDesignSystem.mdx +4 -9
- package/src/stories/Demarrer/EnrichirLeDesignSystem.stories.ts +28 -0
- package/src/stories/Demarrer/Releases.stories.ts +48 -5
- package/src/stories/DesignTokens/ColorDisplay.vue +6 -5
- package/src/stories/DesignTokens/ColorIntegrationExample.vue +2 -4
- package/src/stories/DesignTokens/colors.stories.ts +5 -6
- package/src/stories/GuideDuDev/Amelipro.mdx +15 -0
- package/src/stories/GuideDuDev/Amelipro.stories.ts +209 -0
- package/src/stories/GuideDuDev/CreateVuetifyInstance.mdx +95 -0
- package/src/stories/GuideDuDev/Theme.mdx +36 -26
- package/src/stories/GuideDuDev/moduleDeNotification.mdx +3 -2
- package/src/stories/GuideDuDev/vuetifyOptions.mdx +3 -3
- package/src/stories/styles/accessibility-guide.css +3 -3
- package/src/utils/functions/classToHex.ts +6 -34
- package/src/utils/functions/createHexResolver.ts +45 -0
- package/src/utils/functions/tests/classToHex.spec.ts +36 -0
- package/src/utils/functions/tests/convertToHex.spec.ts +31 -0
- package/src/utils/functions/tests/createHexResolver.spec.ts +66 -0
- package/src/utils/functions/tests/isCssColor.spec.ts +48 -0
- package/dist/SelectFilter-BioGT6Nn.js +0 -136
- package/dist/designTokens/utils/convertGaps.d.ts +0 -5
- package/dist/main-aLKwdMi1.js +0 -37886
- package/dist/style.css +0 -1
- package/src/assets/apTokens.scss +0 -343
- package/src/assets/overrides/_container.scss +0 -36
- package/src/assets/tokens.scss +0 -388
- package/src/components/DatePicker/Accessibilite.mdx +0 -14
- package/src/designTokens/apColors.md +0 -66
- package/src/designTokens/cnamColors.md +0 -193
- package/src/designTokens/paColors.md +0 -66
- package/src/designTokens/tokens/json/contextual-tokens.json +0 -156
- package/src/designTokens/tokens/json/primitives.json +0 -209
- package/src/designTokens/tokens/json/semantic.json +0 -120
- package/src/designTokens/utils/convertGaps.ts +0 -11
- package/src/stories/Accessibilite/Avancement/Avancement.mdx +0 -533
- 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',
|
|
@@ -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',
|
|
@@ -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: '#' },
|
|
480
|
+
{ label: 'Profil', value: 'profile', href: '#profile' },
|
|
481
|
+
{ label: 'Paramètres', value: 'settings', href: '#settings' },
|
|
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?:
|
|
16
|
-
/**
|
|
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:
|
|
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
|
|
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
|
|
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
|
-
|
|
127
|
-
if (
|
|
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
|
|
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
|
-
|
|
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
|
|
196
|
-
if (!
|
|
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
|
-
<
|
|
323
|
-
|
|
324
|
-
|
|
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
|
-
<
|
|
332
|
-
v-for="(item, index) in
|
|
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-
|
|
349
|
-
:aria-
|
|
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 ?
|
|
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-
|
|
386
|
-
:aria-
|
|
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 ?
|
|
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-
|
|
430
|
-
:aria-
|
|
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-
|
|
460
|
-
:aria-
|
|
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-
|
|
490
|
-
:aria-
|
|
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 ?
|
|
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
|
-
</
|
|
517
|
-
</
|
|
518
|
-
</
|
|
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
|
|
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
|
-
<
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
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
|
|
36
|
-
<li><strong>État
|
|
37
|
-
<li><strong>Relations
|
|
38
|
-
<li><strong>
|
|
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><nav role="navigation"></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><div></code> ou <code><nav></code>) sans balises de liste (<code><ul></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'
|
|
64
|
-
<li><strong
|
|
65
|
-
<li><strong>
|
|
66
|
-
<li><strong>
|
|
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><nav role="navigation"></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
|
|
120
|
+
<h2>Activation automatique (Mode Onglets)</h2>
|
|
86
121
|
<div className="section-description">
|
|
87
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
.
|
|
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;
|