@cnamts/synapse 1.0.24 → 1.0.25
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +27 -5
- package/dist/{AutocompleteFilter-BWLR3U7W.js → AutocompleteFilter-D7qBuCAP.js} +1 -1
- package/dist/{AutocompleteFilter-D9jzRzAL.cjs → AutocompleteFilter-Df9i5mAl.cjs} +1 -1
- package/dist/{DateFilter-DTUl8hb1.cjs → DateFilter-BJD6FMev.cjs} +1 -1
- package/dist/{DateFilter-BpwFexzi.js → DateFilter-BitMWrMU.js} +1 -1
- package/dist/{NumberFilter-Bz_NTdX9.js → NumberFilter-BTLUxw0a.js} +1 -1
- package/dist/{NumberFilter-MAEojdk0.cjs → NumberFilter-DGCzCXzI.cjs} +1 -1
- package/dist/{PeriodFilter-DX_wy9g-.js → PeriodFilter-B5rUIPAC.js} +1 -1
- package/dist/{PeriodFilter-CC4WgIhl.cjs → PeriodFilter-DO_ecTZW.cjs} +1 -1
- package/dist/{SelectFilter-BR3fvl-a.cjs → SelectFilter-CGwcKWLm.cjs} +1 -1
- package/dist/{SelectFilter-xqiPtPgX.js → SelectFilter-l4QnRcuk.js} +2 -2
- package/dist/{TextFilter-CCfYFl5F.cjs → TextFilter-B8nf7xoK.cjs} +1 -1
- package/dist/{TextFilter-BBl3JFqK.js → TextFilter-C9hj6Qrp.js} +1 -1
- package/dist/apLightTheme-CEK4iY3f.cjs +1 -0
- package/dist/{apLightTheme-D1P4jcD0.js → apLightTheme-DnIM24Lv.js} +441 -722
- package/dist/components/Customs/Selects/SyAutocomplete/SyAutocomplete.d.ts +10 -6
- package/dist/components/Customs/SyCheckbox/SyCheckbox.d.ts +3 -0
- package/dist/components/Customs/SyTabs/SyTabs.d.ts +13 -11
- package/dist/components/Customs/SyTextField/SyTextField.d.ts +4 -4
- package/dist/components/DatePicker/CalendarMode/DatePicker.d.ts +4 -24
- package/dist/components/DatePicker/ComplexDatePicker/ComplexDatePicker.d.ts +2 -12
- package/dist/components/DatePicker/DateTextInput/DateTextInput.d.ts +1 -6
- package/dist/components/DatePicker/composables/useDatePickerState.d.ts +1 -0
- 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 +13 -13
- package/dist/components/HeaderNavigationBar/HorizontalNavbar/HorizontalNavbar.d.ts +3 -3
- package/dist/components/MonthPicker/MonthPicker.d.ts +1 -6
- package/dist/components/MonthPicker/MonthPickerText/MonthPickerInput.d.ts +1 -6
- package/dist/components/NirField/NirField.d.ts +4 -16
- package/dist/components/PeriodField/PeriodField.d.ts +8 -48
- package/dist/components/PhoneField/PhoneField.d.ts +1 -6
- package/dist/components/Tables/SyServerTable/SyServerTable.d.ts +1 -0
- package/dist/components/Tables/SyTable/SyTable.d.ts +1 -0
- package/dist/components/Tables/common/SyTablePagination.d.ts +2 -0
- package/dist/components/Tables/common/TableHeader.d.ts +5 -0
- package/dist/components/Tables/common/locales.d.ts +3 -0
- package/dist/components/Tables/common/types.d.ts +2 -0
- package/dist/components/UploadWorkflow/UploadWorkflow.d.ts +1 -0
- package/dist/composables/unifyValidation/documentationValidationProps.d.ts +230 -0
- package/dist/composables/validation/useValidation.d.ts +5 -1
- package/dist/design-system-v3.js +2 -2
- package/dist/design-system-v3.umd.cjs +1 -1
- 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/synapse.css +1 -1
- package/dist/utils/functions/classToHex.d.ts +1 -1
- package/dist/utils/functions/createHexResolver.d.ts +16 -0
- package/dist/vuetifyConfig.js +113 -152
- package/dist/vuetifyConfig.umd.cjs +1 -1
- package/package.json +29 -18
- package/src/assets/amelipro/apTokens2026.scss +5 -5
- package/src/assets/overrides/_breakpoints.scss +25 -0
- package/src/assets/overrides/_btns.scss +0 -2
- package/src/assets/overrides/_forms.scss +1 -3
- package/src/assets/overrides/_icons.scss +7 -11
- 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 -37
- 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/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 +1 -1
- 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/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/ChipList/ChipList.vue +14 -16
- 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/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 +7 -3
- package/src/components/Customs/Selects/SyAutocomplete/tests/SyAutocomplete.a11y.spec.ts +18 -0
- package/src/components/Customs/Selects/SyAutocomplete/tests/SyAutocomplete.spec.ts +66 -0
- package/src/components/Customs/Selects/SyInputSelect/SyInputSelect.vue +4 -6
- package/src/components/Customs/Selects/SySelect/SySelect.stories.ts +1 -39
- package/src/components/Customs/Selects/SySelect/SySelect.vue +263 -63
- package/src/components/Customs/Selects/SySelect/accessibilite/Accessibility.mdx +199 -269
- package/src/components/Customs/Selects/SySelect/tests/SySelect.spec.ts +35 -0
- package/src/components/Customs/SyCheckbox/SyCheckbox.mdx +5 -0
- package/src/components/Customs/SyCheckbox/SyCheckbox.vue +29 -0
- package/src/components/Customs/SyCheckbox/accessibilite/Accessibility.mdx +18 -3
- package/src/components/Customs/SyPagination/SyPagination.vue +0 -2
- 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.stories.ts +21 -41
- package/src/components/Customs/SyTextField/SyTextField.vue +4 -6
- package/src/components/DatePicker/CalendarMode/DatePicker.vue +12 -14
- package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.vue +20 -16
- package/src/components/DatePicker/ComplexDatePicker/tests/ComplexDatePicker.spec.ts +23 -0
- package/src/components/DatePicker/DateTextInput/DateTextInput.vue +8 -10
- package/src/components/DatePicker/composables/tests/useDatePickerState.spec.ts +53 -0
- package/src/components/DatePicker/composables/useDatePickerState.ts +24 -0
- package/src/components/DatePicker/composables/useDateTextField.ts +0 -1
- package/src/components/DatePicker/composables/useMonthButtonCustomization.ts +9 -8
- package/src/components/DatePicker/playground/DatePickerHolidayRule.vue +1 -1
- 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.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/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/MonthPicker/MonthPickerVisual/VisualPickerHeader.vue +1 -1
- package/src/components/NirField/NirField.stories.ts +2 -2
- package/src/components/NirField/NirField.vue +3 -5
- package/src/components/NirField/accessibilite/Accessibility.mdx +100 -5
- package/src/components/NirField/tests/NirField.spec.ts +118 -0
- package/src/components/NirField/tests/useNirValidation.spec.ts +449 -0
- package/src/components/NirField/useNirValidation.ts +38 -32
- 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.vue +8 -10
- package/src/components/PhoneField/PhoneField.vue +3 -3
- 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/TableToolbar/TableToolbar.vue +6 -8
- package/src/components/Tables/SyServerTable/SyServerTable.stories.ts +166 -0
- package/src/components/Tables/SyServerTable/SyServerTable.vue +9 -7
- package/src/components/Tables/SyServerTable/tests/SyServerTable.a11y.spec.ts +23 -0
- package/src/components/Tables/SyServerTable/tests/SyServerTable.spec.ts +268 -0
- package/src/components/Tables/SyTable/SyTable.stories.ts +104 -0
- package/src/components/Tables/SyTable/SyTable.vue +9 -7
- package/src/components/Tables/SyTable/tests/SyTable.a11y.spec.ts +22 -0
- package/src/components/Tables/SyTable/tests/SyTable.spec.ts +274 -0
- package/src/components/Tables/common/SyTableFilter.vue +27 -2
- package/src/components/Tables/common/SyTablePagination.vue +142 -19
- package/src/components/Tables/common/TableHeader.vue +40 -3
- package/src/components/Tables/common/filters/SelectFilter.vue +1 -1
- package/src/components/Tables/common/locales.ts +3 -0
- package/src/components/Tables/common/tableStyles.scss +16 -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/types.ts +2 -0
- package/src/components/Tables/common/useTableHeaders.ts +49 -27
- 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/unifyValidation/documentationValidationProps.ts +235 -0
- package/src/composables/validation/useValidation.ts +17 -1
- package/src/composantsVuetify/VBreadcrumbs/VBreadcrumbs.mdx +28 -0
- package/src/composantsVuetify/VBreadcrumbs/v-breadcrumbs.stories.ts +108 -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/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 +1 -1
- 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/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 +40 -1
- 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/CreateVuetifyInstance.mdx +95 -0
- package/src/stories/GuideDuDev/Theme.mdx +36 -26
- package/src/stories/GuideDuDev/moduleDeNotification.mdx +3 -2
- 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/apLightTheme-CFSRrjv2.cjs +0 -1
- package/dist/designTokens/utils/convertGaps.d.ts +0 -5
- package/dist/main-BtTqyn4z.js +0 -38648
- package/dist/main-C1e3eoxd.cjs +0 -1067
- package/src/assets/apTokens.scss +0 -343
- package/src/assets/overrides/_container.scss +0 -36
- package/src/assets/tokens.scss +0 -388
- 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
|
@@ -9,16 +9,6 @@ import * as SyTabsStories from "./SyTabs.stories";
|
|
|
9
9
|
<p>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.</p>
|
|
10
10
|
</div>
|
|
11
11
|
|
|
12
|
-
Il implémente les fonctionnalités suivantes :
|
|
13
|
-
|
|
14
|
-
- Navigation complète au clavier
|
|
15
|
-
- Attributs ARIA appropriés
|
|
16
|
-
- Gestion du focus accessible
|
|
17
|
-
- Structure HTML sémantique
|
|
18
|
-
- Design personnalisable
|
|
19
|
-
|
|
20
|
-
<Canvas of={SyTabsStories.Default} />
|
|
21
|
-
|
|
22
12
|
## API
|
|
23
13
|
|
|
24
14
|
<Controls of={SyTabsStories.Default} />
|
|
@@ -36,54 +26,6 @@ export interface TabItem {
|
|
|
36
26
|
}
|
|
37
27
|
```
|
|
38
28
|
|
|
39
|
-
<div className="header">
|
|
40
|
-
<h1>Accessibilité</h1>
|
|
41
|
-
</div>
|
|
42
|
-
|
|
43
|
-
Le composant `SyTabs` respecte les critères d'accessibilité RGAA suivants :
|
|
44
|
-
|
|
45
|
-
### Structure sémantique
|
|
46
|
-
|
|
47
|
-
- Utilise les éléments `<nav>`, `<ul>` et `<li>` pour une structure de navigation sémantique
|
|
48
|
-
- Associe chaque onglet à son panneau de contenu via les attributs `aria-controls` et `aria-labelledby`
|
|
49
|
-
- Utilise l'attribut `aria-label="Onglets de navigation"` sur l'élément `<nav>` pour identifier la navigation
|
|
50
|
-
|
|
51
|
-
### Rôles ARIA
|
|
52
|
-
|
|
53
|
-
- `role="tablist"` sur le conteneur de navigation
|
|
54
|
-
- `role="presentation"` sur les éléments de liste
|
|
55
|
-
- `role="tab"` sur les boutons d'onglets
|
|
56
|
-
- `role="tabpanel"` sur les panneaux de contenu
|
|
57
|
-
|
|
58
|
-
### États et propriétés
|
|
59
|
-
|
|
60
|
-
- `aria-selected="true|false"` indique l'onglet actif
|
|
61
|
-
- Attribut `hidden` sur les panneaux non actifs
|
|
62
|
-
- Focus visible avec outline adapté au design system
|
|
63
|
-
|
|
64
|
-
### Navigation au clavier
|
|
65
|
-
|
|
66
|
-
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/) :
|
|
67
|
-
|
|
68
|
-
- **Flèches gauche/droite** : Navigation entre les onglets
|
|
69
|
-
- **Touches Home/End** : Accès au premier/dernier onglet
|
|
70
|
-
- **Entrée/Espace** : Activation de l'onglet
|
|
71
|
-
- **Échap** : Gestion du focus
|
|
72
|
-
|
|
73
|
-
### Contraste et visibilité
|
|
74
|
-
|
|
75
|
-
- Contraste suffisant entre le texte et le fond (minimum 4.5:1)
|
|
76
|
-
- Indication visuelle claire de l'onglet actif (changement de couleur et bordure)
|
|
77
|
-
- Focus visible conforme aux exigences RGAA
|
|
78
|
-
|
|
79
|
-
### Tests d'accessibilité
|
|
80
|
-
|
|
81
|
-
Le composant a été testé avec :
|
|
82
|
-
- Lecteurs d'écran (NVDA, VoiceOver)
|
|
83
|
-
- Navigation clavier
|
|
84
|
-
- Outils de vérification de contraste
|
|
85
|
-
|
|
86
|
-
<Canvas of={SyTabsStories.Default} />
|
|
87
29
|
|
|
88
30
|
## Personnalisation
|
|
89
31
|
|
|
@@ -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;
|