@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
|
@@ -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;
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
// @vitest-environment jsdom
|
|
2
|
+
|
|
3
|
+
import { describe, it } from 'vitest'
|
|
4
|
+
import { mount } from '@vue/test-utils'
|
|
5
|
+
import { axe } from 'vitest-axe'
|
|
6
|
+
import { assertNoA11yViolations } from '@tests/unit/accessibility/axeUtils'
|
|
7
|
+
import SyTabs from '../SyTabs.vue'
|
|
8
|
+
|
|
9
|
+
// Mock RouterLink component since SyTabs uses it
|
|
10
|
+
const RouterLink = {
|
|
11
|
+
name: 'RouterLink',
|
|
12
|
+
props: ['to'],
|
|
13
|
+
template: '<a :href="to"><slot /></a>',
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
const testItems = [
|
|
17
|
+
{ label: 'Tab 1', value: 'tab1', content: 'Contenu du Tab 1' },
|
|
18
|
+
{ label: 'Tab 2', value: 'tab2', content: 'Contenu du Tab 2' },
|
|
19
|
+
{ label: 'Tab 3', value: 'tab3', content: 'Contenu du Tab 3', disabled: true },
|
|
20
|
+
]
|
|
21
|
+
|
|
22
|
+
describe('SyTabs – accessibility (axe)', () => {
|
|
23
|
+
it('has no obvious axe violations in default state', async () => {
|
|
24
|
+
const wrapper = mount(SyTabs, {
|
|
25
|
+
props: {
|
|
26
|
+
items: testItems,
|
|
27
|
+
},
|
|
28
|
+
global: {
|
|
29
|
+
components: { RouterLink },
|
|
30
|
+
mocks: {
|
|
31
|
+
$router: {},
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
})
|
|
35
|
+
|
|
36
|
+
const results = await axe(wrapper.element as HTMLElement)
|
|
37
|
+
assertNoA11yViolations(results, 'SyTabs – default state', {
|
|
38
|
+
ignoreRules: ['region'],
|
|
39
|
+
})
|
|
40
|
+
})
|
|
41
|
+
|
|
42
|
+
it('has no obvious axe violations after switching tabs', async () => {
|
|
43
|
+
const wrapper = mount(SyTabs, {
|
|
44
|
+
props: {
|
|
45
|
+
items: testItems,
|
|
46
|
+
},
|
|
47
|
+
global: {
|
|
48
|
+
components: { RouterLink },
|
|
49
|
+
mocks: {
|
|
50
|
+
$router: {},
|
|
51
|
+
},
|
|
52
|
+
},
|
|
53
|
+
})
|
|
54
|
+
|
|
55
|
+
const tabs = wrapper.findAll('[role="tab"]')
|
|
56
|
+
if (tabs.length > 1) {
|
|
57
|
+
await tabs[1]?.trigger('click')
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const results = await axe(wrapper.element as HTMLElement)
|
|
61
|
+
assertNoA11yViolations(results, 'SyTabs – after switching tabs', {
|
|
62
|
+
ignoreRules: ['region'],
|
|
63
|
+
})
|
|
64
|
+
})
|
|
65
|
+
|
|
66
|
+
it('has no obvious axe violations in navigation mode', async () => {
|
|
67
|
+
const wrapper = mount(SyTabs, {
|
|
68
|
+
props: {
|
|
69
|
+
items: [
|
|
70
|
+
{ label: 'Nav 1', value: 'nav1', to: '/path-1' },
|
|
71
|
+
{ label: 'Nav 2', value: 'nav2', href: 'https://example.com' },
|
|
72
|
+
{ label: 'Nav 3', value: 'nav3', to: '/path-3', disabled: true },
|
|
73
|
+
],
|
|
74
|
+
},
|
|
75
|
+
global: {
|
|
76
|
+
components: { RouterLink },
|
|
77
|
+
mocks: {
|
|
78
|
+
$router: {},
|
|
79
|
+
},
|
|
80
|
+
},
|
|
81
|
+
})
|
|
82
|
+
|
|
83
|
+
const results = await axe(wrapper.element as HTMLElement)
|
|
84
|
+
assertNoA11yViolations(results, 'SyTabs – navigation mode', {
|
|
85
|
+
ignoreRules: ['region'],
|
|
86
|
+
})
|
|
87
|
+
})
|
|
88
|
+
})
|
|
@@ -162,6 +162,51 @@ describe('SyTabs', () => {
|
|
|
162
162
|
})
|
|
163
163
|
})
|
|
164
164
|
|
|
165
|
+
// Tests du mode Navigation
|
|
166
|
+
describe('Mode Navigation', () => {
|
|
167
|
+
const navItems = [
|
|
168
|
+
{ label: 'Nav 1', value: 'nav1', to: '/path-1' },
|
|
169
|
+
{ label: 'Nav 2', value: 'nav2', href: 'https://example.com' },
|
|
170
|
+
{ label: 'Nav 3', value: 'nav3', to: '/path-3', disabled: true },
|
|
171
|
+
]
|
|
172
|
+
|
|
173
|
+
it('doit utiliser la sémantique de navigation', () => {
|
|
174
|
+
const wrapper = createWrapper({
|
|
175
|
+
props: {
|
|
176
|
+
...defaultMountOptions.props,
|
|
177
|
+
items: navItems,
|
|
178
|
+
},
|
|
179
|
+
})
|
|
180
|
+
|
|
181
|
+
// Vérifier les attributs du conteneur
|
|
182
|
+
const nav = wrapper.find('nav[role="navigation"]')
|
|
183
|
+
expect(nav.exists()).toBe(true)
|
|
184
|
+
expect(nav.attributes('aria-label')).toBeDefined()
|
|
185
|
+
|
|
186
|
+
// Vérifier les attributs des liens
|
|
187
|
+
const buttons = wrapper.findAll('.sy-tabs__button')
|
|
188
|
+
expect(buttons[0]!.attributes('role')).toBeUndefined()
|
|
189
|
+
expect(buttons[0]!.attributes('aria-current')).toBe('page')
|
|
190
|
+
expect(buttons[0]!.attributes('aria-selected')).toBeUndefined()
|
|
191
|
+
expect(buttons[0]!.attributes('aria-controls')).toBeUndefined()
|
|
192
|
+
|
|
193
|
+
expect(buttons[1]!.attributes('aria-current')).toBeUndefined()
|
|
194
|
+
})
|
|
195
|
+
|
|
196
|
+
it('ne doit pas générer les rôles tabpanel pour les panneaux', () => {
|
|
197
|
+
const wrapper = createWrapper({
|
|
198
|
+
props: {
|
|
199
|
+
...defaultMountOptions.props,
|
|
200
|
+
items: navItems,
|
|
201
|
+
},
|
|
202
|
+
})
|
|
203
|
+
|
|
204
|
+
const panel = wrapper.find('.sy-tabs-panel')
|
|
205
|
+
expect(panel.attributes('role')).toBeUndefined()
|
|
206
|
+
expect(panel.attributes('aria-labelledby')).toBeUndefined()
|
|
207
|
+
})
|
|
208
|
+
})
|
|
209
|
+
|
|
165
210
|
// Tests d'accessibilité et navigation clavier
|
|
166
211
|
describe('Accessibilité et navigation clavier', () => {
|
|
167
212
|
it('doit contenir les attributs ARIA appropriés', () => {
|
|
@@ -434,7 +479,7 @@ describe('SyTabs', () => {
|
|
|
434
479
|
expect(tabList.exists()).toBe(true)
|
|
435
480
|
|
|
436
481
|
// Vérifier que tous les items sont rendus
|
|
437
|
-
const tabItems = wrapper.findAll('.sy-
|
|
482
|
+
const tabItems = wrapper.findAll('.sy-tabs__button')
|
|
438
483
|
expect(tabItems.length).toBe(testItems.length)
|
|
439
484
|
})
|
|
440
485
|
})
|
|
@@ -4,6 +4,8 @@ import { VIcon } from 'vuetify/components'
|
|
|
4
4
|
import { ref, watch } from 'vue'
|
|
5
5
|
import { mdiAccountBox } from '@mdi/js'
|
|
6
6
|
import { VBtn } from 'vuetify/components'
|
|
7
|
+
import { getValidationDocumentation } from '@/composables/unifyValidation/documentationValidationProps'
|
|
8
|
+
import { fn } from '@storybook/test'
|
|
7
9
|
|
|
8
10
|
const meta = {
|
|
9
11
|
title: 'Composants/Formulaires/SyTextField',
|
|
@@ -15,7 +17,6 @@ const meta = {
|
|
|
15
17
|
],
|
|
16
18
|
parameters: {
|
|
17
19
|
layout: 'fullscreen',
|
|
18
|
-
controls: { exclude: ['modelValue', 'appendInnerIconColor', 'errorMessages', 'warningMessages', 'successMessages'] },
|
|
19
20
|
docs: {
|
|
20
21
|
description: {
|
|
21
22
|
component: `SyTextField`,
|
|
@@ -23,6 +24,7 @@ const meta = {
|
|
|
23
24
|
},
|
|
24
25
|
},
|
|
25
26
|
argTypes: {
|
|
27
|
+
...getValidationDocumentation('string'),
|
|
26
28
|
'modelValue': { control: 'text' },
|
|
27
29
|
'label': {
|
|
28
30
|
description: 'Texte affiché comme label du champ',
|
|
@@ -62,27 +64,6 @@ const meta = {
|
|
|
62
64
|
options: ['default', 'comfortable', 'compact'],
|
|
63
65
|
description: 'Densité du champ',
|
|
64
66
|
},
|
|
65
|
-
'customRules': {
|
|
66
|
-
description: 'Règles de validation personnalisées',
|
|
67
|
-
control: 'object',
|
|
68
|
-
},
|
|
69
|
-
'customWarningRules': {
|
|
70
|
-
description: 'Règles d\'avertissement personnalisées',
|
|
71
|
-
control: 'object',
|
|
72
|
-
},
|
|
73
|
-
'showSuccessMessages': {
|
|
74
|
-
description: 'Afficher les messages de succès',
|
|
75
|
-
control: 'boolean',
|
|
76
|
-
},
|
|
77
|
-
'isValidateOnBlur': {
|
|
78
|
-
description: 'Vérifie la validité lors de la perte de focus',
|
|
79
|
-
control: 'boolean',
|
|
80
|
-
default: true,
|
|
81
|
-
},
|
|
82
|
-
'disableErrorHandling': {
|
|
83
|
-
control: 'boolean',
|
|
84
|
-
description: 'Désactive complètement la validation des règles et l\'affichage des erreurs',
|
|
85
|
-
},
|
|
86
67
|
'isActive': {
|
|
87
68
|
description: 'Force l\'état actif du champ (label flottant et styles visuels)',
|
|
88
69
|
control: 'boolean',
|
|
@@ -107,31 +88,16 @@ const meta = {
|
|
|
107
88
|
options: ['top', 'bottom', 'start', 'end'],
|
|
108
89
|
default: 'top',
|
|
109
90
|
},
|
|
110
|
-
'required': {
|
|
111
|
-
description: 'Indique si le champ est obligatoire',
|
|
112
|
-
control: 'boolean',
|
|
113
|
-
default: false,
|
|
114
|
-
},
|
|
115
91
|
'displayAsterisk': {
|
|
116
92
|
description: 'Affiche un astérisque à côté du label',
|
|
117
93
|
control: 'boolean',
|
|
118
94
|
default: false,
|
|
119
95
|
},
|
|
120
|
-
'disabled': {
|
|
121
|
-
description: 'Désactive le champ',
|
|
122
|
-
control: 'boolean',
|
|
123
|
-
default: false,
|
|
124
|
-
},
|
|
125
96
|
'disableClickButton': {
|
|
126
97
|
description: 'Désactive le click sur les icônes append et prepend',
|
|
127
98
|
control: 'boolean',
|
|
128
99
|
default: true,
|
|
129
100
|
},
|
|
130
|
-
'readonly': {
|
|
131
|
-
description: 'Rend le champ en lecture seule',
|
|
132
|
-
control: 'boolean',
|
|
133
|
-
default: false,
|
|
134
|
-
},
|
|
135
101
|
'baseColor': {
|
|
136
102
|
description: 'Couleur de base du champ (par défaut hérite de color)',
|
|
137
103
|
control: 'text',
|
|
@@ -193,10 +159,6 @@ const meta = {
|
|
|
193
159
|
description: 'Affiche un indicateur de chargement',
|
|
194
160
|
control: 'boolean',
|
|
195
161
|
},
|
|
196
|
-
'maxErrors': {
|
|
197
|
-
description: 'Nombre maximum de messages d\'erreur à afficher',
|
|
198
|
-
control: { type: 'text' },
|
|
199
|
-
},
|
|
200
162
|
'maxWidth': {
|
|
201
163
|
description: 'Largeur maximale du champ',
|
|
202
164
|
control: { type: 'text' },
|
|
@@ -323,6 +285,24 @@ const meta = {
|
|
|
323
285
|
category: 'slots',
|
|
324
286
|
},
|
|
325
287
|
},
|
|
288
|
+
'showDivider': {
|
|
289
|
+
description: 'Affiche une ligne de séparation entre le champ et les icônes prepend-inner et append-inner',
|
|
290
|
+
control: 'boolean',
|
|
291
|
+
table: {
|
|
292
|
+
type: { summary: 'boolean' },
|
|
293
|
+
defaultValue: { summary: 'false' },
|
|
294
|
+
category: 'props',
|
|
295
|
+
},
|
|
296
|
+
},
|
|
297
|
+
},
|
|
298
|
+
args: {
|
|
299
|
+
'onUpdate:modelValue': fn(),
|
|
300
|
+
'onKeydown': fn(),
|
|
301
|
+
'onClear': fn(),
|
|
302
|
+
'onPrependIconClick': fn(),
|
|
303
|
+
'onAppendIconClick': fn(),
|
|
304
|
+
'onFocus': fn(),
|
|
305
|
+
'onBlur': fn(),
|
|
326
306
|
},
|
|
327
307
|
} as Meta<typeof SyTextField>
|
|
328
308
|
|
|
@@ -44,7 +44,6 @@
|
|
|
44
44
|
direction?: 'horizontal' | 'vertical'
|
|
45
45
|
isDirty?: boolean
|
|
46
46
|
disabled?: boolean
|
|
47
|
-
isOnError?: boolean
|
|
48
47
|
isFlat?: boolean
|
|
49
48
|
isFocused?: boolean
|
|
50
49
|
areDetailsHidden?: boolean | 'auto'
|
|
@@ -101,7 +100,6 @@
|
|
|
101
100
|
density: 'default',
|
|
102
101
|
direction: 'horizontal',
|
|
103
102
|
isDirty: false,
|
|
104
|
-
isOnError: false,
|
|
105
103
|
isFlat: false,
|
|
106
104
|
isFocused: false,
|
|
107
105
|
areDetailsHidden: false,
|
|
@@ -636,7 +634,7 @@
|
|
|
636
634
|
:maxlength="props.maxlength"
|
|
637
635
|
:max-errors="props.maxErrors"
|
|
638
636
|
:max-width="props.maxWidth"
|
|
639
|
-
:messages="hasError ? errors : (hasWarning ? warnings : (hasSuccess && props.showSuccessMessages ? successes :
|
|
637
|
+
:messages="hasError ? errors : (hasWarning ? warnings : (hasSuccess && props.showSuccessMessages ? successes : messages))"
|
|
640
638
|
:min-width="props.minWidth"
|
|
641
639
|
:name="props.name"
|
|
642
640
|
:persistent-clear="props.displayPersistentClear"
|
|
@@ -925,13 +923,13 @@
|
|
|
925
923
|
}
|
|
926
924
|
|
|
927
925
|
:deep(.v-field--focused .v-field__outline) {
|
|
928
|
-
color: rgb(var(--v-theme-
|
|
926
|
+
color: rgb(var(--v-theme-borderAccentPrimary)) !important;
|
|
929
927
|
opacity: 1 !important;
|
|
930
928
|
}
|
|
931
929
|
|
|
932
930
|
:deep(.v-input__prepend .v-icon:focus-visible),
|
|
933
931
|
:deep(.v-input__append .v-icon:focus-visible) {
|
|
934
|
-
outline: 2px solid rgb(var(--v-theme-
|
|
932
|
+
outline: 2px solid rgb(var(--v-theme-borderAccentPrimary));
|
|
935
933
|
outline-offset: 2px;
|
|
936
934
|
opacity: 1;
|
|
937
935
|
}
|
|
@@ -939,7 +937,7 @@
|
|
|
939
937
|
|
|
940
938
|
.help-text-below {
|
|
941
939
|
color: rgba(var(--v-theme-on-surface), var(--v-medium-emphasis-opacity));
|
|
942
|
-
font-size:
|
|
940
|
+
font-size: var(--v-fontSize-liensEtLibelles);
|
|
943
941
|
line-height: 1.2;
|
|
944
942
|
}
|
|
945
943
|
|
|
@@ -1170,8 +1170,6 @@
|
|
|
1170
1170
|
</template>
|
|
1171
1171
|
|
|
1172
1172
|
<style lang="scss" scoped>
|
|
1173
|
-
@use '@/assets/tokens';
|
|
1174
|
-
|
|
1175
1173
|
.date-picker-title {
|
|
1176
1174
|
display: block;
|
|
1177
1175
|
text-transform: lowercase;
|
|
@@ -1185,7 +1183,7 @@
|
|
|
1185
1183
|
/* Style pour les jours fériés */
|
|
1186
1184
|
:deep(.holiday-day) {
|
|
1187
1185
|
background-color: rgb(255 193 7 / 10%);
|
|
1188
|
-
border: 2px dotted
|
|
1186
|
+
border: 2px dotted rgb(var(--v-theme-grey-darken60));
|
|
1189
1187
|
border-radius: 50%;
|
|
1190
1188
|
}
|
|
1191
1189
|
|
|
@@ -1216,13 +1214,13 @@
|
|
|
1216
1214
|
.v-messages__message--success {
|
|
1217
1215
|
:deep(.v-input__control),
|
|
1218
1216
|
:deep(.v-messages__message) {
|
|
1219
|
-
color:
|
|
1217
|
+
color: rgb(var(--v-theme-textSuccess)) !important;
|
|
1220
1218
|
|
|
1221
1219
|
--v-medium-emphasis-opacity: 1;
|
|
1222
1220
|
}
|
|
1223
1221
|
|
|
1224
1222
|
.v-field--active & {
|
|
1225
|
-
color:
|
|
1223
|
+
color: rgb(var(--v-theme-borderSuccess)) !important;
|
|
1226
1224
|
}
|
|
1227
1225
|
}
|
|
1228
1226
|
|
|
@@ -1240,38 +1238,38 @@
|
|
|
1240
1238
|
|
|
1241
1239
|
.v-messages__message--error {
|
|
1242
1240
|
:deep(.v-input__control) {
|
|
1243
|
-
color:
|
|
1241
|
+
color: rgb(var(--v-theme-textError)) !important;
|
|
1244
1242
|
|
|
1245
1243
|
--v-medium-emphasis-opacity: 1;
|
|
1246
1244
|
}
|
|
1247
1245
|
|
|
1248
1246
|
:deep(.v-messages__message) {
|
|
1249
|
-
color:
|
|
1247
|
+
color: rgb(var(--v-theme-textError)) !important;
|
|
1250
1248
|
}
|
|
1251
1249
|
|
|
1252
1250
|
.v-field--active & {
|
|
1253
|
-
color:
|
|
1251
|
+
color: rgb(var(--v-theme-borderError)) !important;
|
|
1254
1252
|
}
|
|
1255
1253
|
}
|
|
1256
1254
|
|
|
1257
1255
|
.v-messages__message--warning {
|
|
1258
1256
|
:deep(.v-input__control) {
|
|
1259
|
-
color:
|
|
1257
|
+
color: rgb(var(--v-theme-textWarning)) !important;
|
|
1260
1258
|
|
|
1261
1259
|
--v-medium-emphasis-opacity: 1;
|
|
1262
1260
|
}
|
|
1263
1261
|
|
|
1264
1262
|
:deep(.v-messages__message) {
|
|
1265
|
-
color:
|
|
1263
|
+
color: rgb(var(--v-theme-textWarning)) !important;
|
|
1266
1264
|
}
|
|
1267
1265
|
|
|
1268
1266
|
.v-field--active & {
|
|
1269
|
-
color:
|
|
1267
|
+
color: rgb(var(--v-theme-textWarning)) !important;
|
|
1270
1268
|
}
|
|
1271
1269
|
}
|
|
1272
1270
|
|
|
1273
1271
|
:deep(.v-btn__content) {
|
|
1274
|
-
font-size:
|
|
1272
|
+
font-size: var(--v-fontSize-corpsDeTexte) + 3;
|
|
1275
1273
|
font-weight: bold;
|
|
1276
1274
|
}
|
|
1277
1275
|
|
|
@@ -1307,7 +1305,7 @@
|
|
|
1307
1305
|
}
|
|
1308
1306
|
|
|
1309
1307
|
:deep(.v-date-picker-month__day .v-btn:hover) {
|
|
1310
|
-
background-color:
|
|
1308
|
+
background-color: rgb(var(--v-theme-backgroundMain));
|
|
1311
1309
|
}
|
|
1312
1310
|
|
|
1313
1311
|
:deep(.v-date-picker-month__day--selected, .v-date-picker-month__day--adjacent) {
|
|
@@ -1315,7 +1313,7 @@
|
|
|
1315
1313
|
}
|
|
1316
1314
|
|
|
1317
1315
|
:deep(.v-date-picker-month__day--selected .v-btn:hover) {
|
|
1318
|
-
background-color:
|
|
1316
|
+
background-color: rgb(var(--v-theme-backgroundAccentContrasted)) !important;
|
|
1319
1317
|
}
|
|
1320
1318
|
|
|
1321
1319
|
.fade-enter-active,
|