@cnamts/synapse 1.0.24 → 1.0.26
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-BPR-a55G.js} +1 -1
- package/dist/{DateFilter-BpwFexzi.js → DateFilter-CknrJWs2.js} +2 -2
- package/dist/{NumberFilter-Bz_NTdX9.js → NumberFilter-DJ-yNlzv.js} +1 -1
- package/dist/{PeriodFilter-DX_wy9g-.js → PeriodFilter-CiB5Oa9Z.js} +1 -1
- package/dist/{SelectFilter-xqiPtPgX.js → SelectFilter-EiafX97M.js} +2 -2
- package/dist/{TextFilter-BBl3JFqK.js → TextFilter-BzOmpdxj.js} +1 -1
- package/dist/{apLightTheme-D1P4jcD0.js → apLightTheme-DS0Uy44H.js} +446 -723
- package/dist/components/Customs/Selects/SyAutocomplete/SyAutocomplete.d.ts +14 -8
- package/dist/components/Customs/Selects/SySelect/SySelect.d.ts +60 -289
- package/dist/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.d.ts +1 -0
- package/dist/components/Customs/SyCheckbox/SyCheckbox.d.ts +4 -0
- package/dist/components/Customs/SyRadioGroup/SyRadioGroup.d.ts +1 -0
- package/dist/components/Customs/SyTabs/SyTabs.d.ts +13 -11
- package/dist/components/Customs/SyTextField/SyTextField.d.ts +0 -2
- package/dist/components/DatePicker/CalendarMode/DatePicker.d.ts +54 -73
- package/dist/components/DatePicker/ComplexDatePicker/ComplexDatePicker.d.ts +31 -40
- package/dist/components/DatePicker/DateTextInput/DateTextInput.d.ts +9 -14
- package/dist/components/DatePicker/composables/useDatePickerState.d.ts +4 -3
- package/dist/components/DatePicker/composables/useDateTextField.d.ts +2 -2
- package/dist/components/DatePicker/composables/useInputBlurHandler.d.ts +2 -2
- package/dist/components/DatePicker/types.d.ts +1 -2
- package/dist/components/FileList/FileList.d.ts +6 -0
- package/dist/components/FilterSideBar/FilterSideBar.d.ts +2 -0
- package/dist/components/HeaderNavigationBar/HeaderNavigationBar.d.ts +13 -13
- package/dist/components/HeaderNavigationBar/HorizontalNavbar/HorizontalNavbar.d.ts +3 -3
- package/dist/components/LunarCalendar/useLunarCalendarValidation.d.ts +1 -0
- package/dist/components/MonthPicker/MonthPicker.d.ts +2 -7
- package/dist/components/MonthPicker/MonthPickerText/MonthPickerInput.d.ts +2 -7
- package/dist/components/NirField/NirField.d.ts +12 -20
- package/dist/components/NirField/useNirValidation.d.ts +6 -2
- package/dist/components/PeriodField/PeriodField.d.ts +110 -150
- package/dist/components/PhoneField/PhoneField.d.ts +12 -7
- package/dist/components/RangeField/RangeSlider/RangeSlider.d.ts +0 -3
- package/dist/components/RatingPicker/EmotionPicker/EmotionPicker.d.ts +3 -1
- package/dist/components/RatingPicker/NumberPicker/NumberPicker.d.ts +4 -3
- package/dist/components/RatingPicker/RatingPicker.d.ts +18 -5
- package/dist/components/RatingPicker/StarsPicker/StarsPicker.d.ts +3 -1
- package/dist/components/RatingPicker/tests/RatingPicker.a11y.spect.d.ts +1 -0
- package/dist/components/RatingPicker/useRatingFocus.d.ts +18 -0
- package/dist/components/Tables/SyServerTable/SyServerTable.d.ts +5 -4
- package/dist/components/Tables/SyTable/SyTable.d.ts +5 -4
- package/dist/components/Tables/common/SyTablePagination.d.ts +154 -364
- package/dist/components/Tables/common/TableHeader.d.ts +6 -1
- package/dist/components/Tables/common/filters/DateFilter.d.ts +4 -4
- 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/date/useDateInitializationDayjs.d.ts +3 -1
- package/dist/composables/unifyValidation/documentationValidationProps.d.ts +230 -0
- package/dist/composables/unifyValidation/useCustomValidation.d.ts +3 -1
- package/dist/composables/unifyValidation/useValidation.d.ts +12 -6
- package/dist/composables/unifyValidation/useVuetifyValidation.d.ts +1 -1
- package/dist/composables/validation/useValidation.d.ts +6 -1
- package/dist/design-system-v3.js +2 -2
- 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/apLightTheme.d.ts +2 -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/cnamLightTheme.d.ts +2 -0
- 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-BtTqyn4z.js → main-BsJ9ec3i.js} +16021 -15715
- 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/package.json +35 -23
- 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 +5 -22
- package/src/assets/overrides/_otp.scss +40 -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/Accordion/Accordion.vue +2 -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 +2 -3
- package/src/components/CookiesSelection/CookiesSelection.vue +2 -1
- package/src/components/CopyBtn/CopyBtn.vue +10 -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 +8 -4
- 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 +414 -135
- package/src/components/Customs/Selects/SySelect/SySelect.vue +502 -257
- package/src/components/Customs/Selects/SySelect/accessibilite/Accessibility.mdx +199 -269
- package/src/components/Customs/Selects/SySelect/tests/SySelect.spec.ts +278 -4
- package/src/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.vue +3 -3
- package/src/components/Customs/SyCheckbox/SyCheckbox.mdx +5 -0
- package/src/components/Customs/SyCheckbox/SyCheckbox.vue +52 -2
- package/src/components/Customs/SyCheckbox/accessibilite/Accessibility.mdx +18 -3
- package/src/components/Customs/SyPagination/SyPagination.vue +0 -2
- package/src/components/Customs/SyRadioGroup/SyRadioGroup.vue +23 -5
- package/src/components/Customs/SyTabs/SyTabs.mdx +0 -58
- package/src/components/Customs/SyTabs/SyTabs.stories.ts +34 -35
- package/src/components/Customs/SyTabs/SyTabs.vue +87 -67
- package/src/components/Customs/SyTabs/accessibilite/Accessibility.mdx +83 -23
- package/src/components/Customs/SyTabs/config.ts +3 -3
- 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 +34 -9
- package/src/components/DatePicker/CalendarMode/DatePicker.stories.ts +1 -1
- package/src/components/DatePicker/CalendarMode/DatePicker.vue +29 -28
- package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.stories.ts +1 -1
- package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.vue +28 -23
- package/src/components/DatePicker/ComplexDatePicker/tests/ComplexDatePicker.spec.ts +24 -1
- package/src/components/DatePicker/DatePickerValidationExample/DatePickerValidation.stories.ts +1 -1
- package/src/components/DatePicker/DateTextInput/DateTextInput.vue +65 -33
- package/src/components/DatePicker/DateTextInput/NoCalendar.stories.ts +1 -1
- package/src/components/DatePicker/composables/tests/useDatePickerState.spec.ts +53 -0
- package/src/components/DatePicker/composables/useDatePickerState.ts +56 -13
- package/src/components/DatePicker/composables/useDateRangeInput.ts +2 -1
- package/src/components/DatePicker/composables/useDateSelection.ts +2 -1
- package/src/components/DatePicker/composables/useDateTextField.ts +2 -3
- package/src/components/DatePicker/composables/useInputBlurHandler.ts +2 -2
- package/src/components/DatePicker/composables/useMonthButtonCustomization.ts +9 -8
- package/src/components/DatePicker/playground/DatePickerHolidayRule.vue +1 -1
- package/src/components/DatePicker/types.ts +1 -2
- package/src/components/DialogBox/DialogBox.stories.ts +8 -8
- package/src/components/DialogBox/DialogBox.vue +3 -5
- package/src/components/DialogBox/accessibilite/Accessibility.mdx +86 -22
- 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 +9 -1
- 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 +4 -5
- 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 +7 -9
- package/src/components/NotificationBar/NotificationBar.vue +1 -3
- package/src/components/PaginatedTable/PaginatedTable.vue +3 -4
- package/src/components/PaginatedTable/Pagination.vue +4 -6
- package/src/components/PasswordField/PasswordField.vue +15 -13
- package/src/components/PhoneField/PhoneField.vue +7 -5
- package/src/components/RangeField/RangeSlider/RangeSlider.vue +11 -20
- 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 +38 -56
- package/src/components/RatingPicker/EmotionPicker/tests/__snapshots__/EmotionPicker.spec.ts.snap +5 -0
- package/src/components/RatingPicker/NumberPicker/NumberPicker.vue +48 -53
- package/src/components/RatingPicker/NumberPicker/tests/NumberPicker.spec.ts +2 -1
- package/src/components/RatingPicker/NumberPicker/tests/__snapshots__/NumberPicker.spec.ts.snap +40 -13
- package/src/components/RatingPicker/RatingPicker.stories.ts +65 -88
- package/src/components/RatingPicker/RatingPicker.vue +71 -15
- package/src/components/RatingPicker/StarsPicker/StarsPicker.vue +31 -42
- package/src/components/RatingPicker/StarsPicker/tests/StarsPicker.spec.ts +1 -1
- package/src/components/RatingPicker/StarsPicker/tests/__snapshots__/StarsPicker.spec.ts.snap +5 -0
- package/src/components/RatingPicker/accessibilite/Accessibility.mdx +137 -9
- package/src/components/RatingPicker/tests/RatingPicker.a11y.spect.ts +123 -0
- package/src/components/RatingPicker/tests/RatingPicker.spec.ts +3 -2
- package/src/components/RatingPicker/tests/__snapshots__/RatingPicker.spec.ts.snap +40 -11
- package/src/components/RatingPicker/useRatingFocus.ts +97 -0
- package/src/components/SearchListField/SearchListField.vue +0 -2
- package/src/components/SkipLink/SkipLink.vue +2 -4
- package/src/components/SocialMediaLinks/SocialMediaLinks.vue +6 -6
- package/src/components/SubHeader/SubHeader.vue +1 -1
- package/src/components/SyAlert/SyAlert.vue +7 -9
- package/src/components/SyAlert/tests/SyAlert.visual.cy.ts +46 -0
- package/src/components/SyAlert/tests/__snapshots__/sy-alert-closable.snap.png +0 -0
- package/src/components/SyAlert/tests/__snapshots__/sy-alert-error.snap.png +0 -0
- package/src/components/SyAlert/tests/__snapshots__/sy-alert-info.snap.png +0 -0
- package/src/components/SyAlert/tests/__snapshots__/sy-alert-success.snap.png +0 -0
- package/src/components/SyAlert/tests/__snapshots__/sy-alert-variant-outlined.snap.png +0 -0
- package/src/components/SyAlert/tests/__snapshots__/sy-alert-variant-tonal.snap.png +0 -0
- package/src/components/SyAlert/tests/__snapshots__/sy-alert-warning.snap.png +0 -0
- package/src/components/SyBtnMenu/SyBtnMenu.vue +2 -4
- package/src/components/SyTextArea/SyTextArea.vue +32 -1
- 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 +10 -8
- 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 +10 -8
- 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 +31 -6
- package/src/components/Tables/common/SyTablePagination.vue +143 -19
- package/src/components/Tables/common/TableHeader.vue +41 -4
- package/src/components/Tables/common/filters/DateFilter.vue +2 -2
- 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/date/tests/useDateFormatDayjs.spec.ts +81 -0
- package/src/composables/date/tests/{useDateInitialization.spec.ts → useDateInitializationDayjs.spec.ts} +39 -3
- package/src/composables/date/useDateInitializationDayjs.ts +4 -1
- package/src/composables/unifyValidation/documentationValidationProps.ts +235 -0
- package/src/composables/unifyValidation/tests/useCustomValidation.spec.ts +2 -1
- package/src/composables/unifyValidation/tests/useValidation.spec.ts +22 -0
- package/src/composables/unifyValidation/useCustomValidation.ts +16 -4
- package/src/composables/unifyValidation/useValidation.ts +46 -15
- package/src/composables/unifyValidation/useVuetifyValidation.ts +2 -2
- package/src/composables/useFormFieldErrorHandling.ts +4 -1
- package/src/composables/validation/tests/useValidation.spec.ts +2 -2
- package/src/composables/validation/useValidation.ts +32 -4
- package/src/composantsVuetify/VBreadcrumbs/VBreadcrumbs.mdx +28 -0
- package/src/composantsVuetify/VBreadcrumbs/v-breadcrumbs.stories.ts +108 -0
- package/src/composantsVuetify/VCard/VCard.mdx +59 -0
- package/src/composantsVuetify/VCard/v-card.stories.ts +279 -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 +4 -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 +4 -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/Aculturation/SensibilisationAccessibilite.mdx +61 -91
- package/src/stories/Accessibilite/AuditDesignSystem.mdx +5 -19
- package/src/stories/Accessibilite/AuditEtContreAudit/Exemptions-derogations.mdx +1 -1
- package/src/stories/Accessibilite/AuditEtContreAudit/Introduction.mdx +11 -8
- package/src/stories/Accessibilite/AuditEtContreAudit/RGAA.mdx +6 -7
- package/src/stories/Accessibilite/DesignSystem/Avancement.mdx +433 -0
- package/src/stories/Accessibilite/DesignSystem/a11y-status.json +692 -0
- package/src/stories/Accessibilite/Introduction.mdx +30 -30
- package/src/stories/Accessibilite/KitDePreAudit/Echantillonnage.mdx +176 -79
- package/src/stories/Accessibilite/KitDePreAudit/Introduction.mdx +67 -19
- package/src/stories/Accessibilite/KitDePreAudit/Outils/Introduction.mdx +78 -50
- package/src/stories/Accessibilite/KitDePreAudit/Outils/LecteursDEcran.mdx +23 -49
- package/src/stories/Accessibilite/KitDePreAudit/Outils/Tanaguru/FauxPositifs.stories.ts +6 -0
- package/src/stories/Accessibilite/KitDePreAudit/Outils/Tanaguru/Utilisation.mdx +7 -19
- package/src/stories/Accessibilite/KitDePreAudit/Preaudit.mdx +55 -67
- package/src/stories/Components/Components.stories.ts +92 -4
- 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/AutocompleteFilter-D9jzRzAL.cjs +0 -1
- package/dist/DateFilter-DTUl8hb1.cjs +0 -1
- package/dist/NumberFilter-MAEojdk0.cjs +0 -1
- package/dist/PeriodFilter-CC4WgIhl.cjs +0 -1
- package/dist/SelectFilter-BR3fvl-a.cjs +0 -1
- package/dist/TextFilter-CCfYFl5F.cjs +0 -1
- package/dist/apLightTheme-CFSRrjv2.cjs +0 -1
- package/dist/composables/date/useDateFormat.d.ts +0 -26
- package/dist/composables/date/useDateInitialization.d.ts +0 -18
- package/dist/design-system-v3.umd.cjs +0 -1
- package/dist/designTokens/utils/convertGaps.d.ts +0 -5
- package/dist/main-C1e3eoxd.cjs +0 -1067
- package/dist/tooth-11-D3sLWv2n.cjs +0 -1
- package/dist/tooth-12-CXrLuH03.cjs +0 -1
- package/dist/tooth-13-BSfo5fpT.cjs +0 -1
- package/dist/tooth-14-DMzulx0h.cjs +0 -1
- package/dist/tooth-15-BKRFVi-9.cjs +0 -1
- package/dist/tooth-16-CpuxAbuM.cjs +0 -1
- package/dist/tooth-17-BPoahUdg.cjs +0 -1
- package/dist/tooth-18-DhHJz8sy.cjs +0 -1
- package/dist/tooth-21-Dgd5hn_X.cjs +0 -1
- package/dist/tooth-22-C2Tn19sB.cjs +0 -1
- package/dist/tooth-23-C9uaaSGb.cjs +0 -1
- package/dist/tooth-24-BrK9UGpf.cjs +0 -1
- package/dist/tooth-25-CE_EfGNp.cjs +0 -1
- package/dist/tooth-26-Ctv4i9Fy.cjs +0 -1
- package/dist/tooth-27-C5J7JkWM.cjs +0 -1
- package/dist/tooth-28-Z9oWqjo0.cjs +0 -1
- package/dist/tooth-31-BrYqmkTi.cjs +0 -1
- package/dist/tooth-32-BNNR0oCZ.cjs +0 -1
- package/dist/tooth-33-DuxvqO2J.cjs +0 -1
- package/dist/tooth-34-BCSCXMB6.cjs +0 -1
- package/dist/tooth-35-BLUXkX88.cjs +0 -1
- package/dist/tooth-36-IrKHYqlA.cjs +0 -1
- package/dist/tooth-37-BYqpdMwo.cjs +0 -1
- package/dist/tooth-38-B_eNXXdu.cjs +0 -1
- package/dist/tooth-41-Ddva4Ot8.cjs +0 -1
- package/dist/tooth-42-szcDqlM0.cjs +0 -1
- package/dist/tooth-43-B3ka6rQm.cjs +0 -1
- package/dist/tooth-44-CazyQucj.cjs +0 -1
- package/dist/tooth-45-B4HQtc8n.cjs +0 -1
- package/dist/tooth-46-BPM40gbG.cjs +0 -1
- package/dist/tooth-47-Dvr20dlh.cjs +0 -1
- package/dist/tooth-48-Bd8ljGsF.cjs +0 -1
- package/dist/tooth-51-OBpwCOF3.cjs +0 -1
- package/dist/tooth-52-aKxyHcmq.cjs +0 -1
- package/dist/tooth-53-vCwJjTOc.cjs +0 -1
- package/dist/tooth-54-DsWu2iFy.cjs +0 -1
- package/dist/tooth-55-BxC1X2Dn.cjs +0 -1
- package/dist/tooth-61-BbLvxMQi.cjs +0 -1
- package/dist/tooth-62-CmTkWczP.cjs +0 -1
- package/dist/tooth-63-DI7l_2qI.cjs +0 -1
- package/dist/tooth-64-B21sOsJh.cjs +0 -1
- package/dist/tooth-65-D2ZC2VEr.cjs +0 -1
- package/dist/tooth-71-D473PPO5.cjs +0 -1
- package/dist/tooth-72-Drh1wnNu.cjs +0 -1
- package/dist/tooth-73-DzlwYI23.cjs +0 -1
- package/dist/tooth-74-8aGvcZPg.cjs +0 -1
- package/dist/tooth-75-BFK7At_r.cjs +0 -1
- package/dist/tooth-81-BZmR-I0M.cjs +0 -1
- package/dist/tooth-82-euVfUUZV.cjs +0 -1
- package/dist/tooth-83-KV010j64.cjs +0 -1
- package/dist/tooth-84-BBg1RjhZ.cjs +0 -1
- package/dist/tooth-85-Cr-kc1wM.cjs +0 -1
- package/dist/vuetifyConfig.umd.cjs +0 -1
- package/src/assets/apTokens.scss +0 -343
- package/src/assets/overrides/_container.scss +0 -36
- package/src/assets/tokens.scss +0 -388
- package/src/composables/date/tests/useDateFormat.spec.ts +0 -67
- package/src/composables/date/useDateFormat.ts +0 -110
- package/src/composables/date/useDateInitialization.ts +0 -92
- 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
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { mount } from '@vue/test-utils'
|
|
2
|
-
import { describe, expect, it } from 'vitest'
|
|
2
|
+
import { describe, expect, it, vi } from 'vitest'
|
|
3
3
|
import { VList } from 'vuetify/components'
|
|
4
|
+
import { nextTick } from 'vue'
|
|
4
5
|
import SySelect from '../SySelect.vue'
|
|
5
6
|
|
|
6
7
|
type ItemType = {
|
|
@@ -129,7 +130,7 @@ describe('SySelect.vue', () => {
|
|
|
129
130
|
it('renders error messages when provided', () => {
|
|
130
131
|
const errorMessages = ['Error 1']
|
|
131
132
|
const wrapper = mount(SySelect, {
|
|
132
|
-
props: { errorMessages,
|
|
133
|
+
props: { errorMessages, hideDetails: false },
|
|
133
134
|
attachTo: document.body,
|
|
134
135
|
})
|
|
135
136
|
const message = wrapper.find('.v-messages__message')
|
|
@@ -139,6 +140,99 @@ describe('SySelect.vue', () => {
|
|
|
139
140
|
wrapper.unmount()
|
|
140
141
|
})
|
|
141
142
|
|
|
143
|
+
describe('hideDetails', () => {
|
|
144
|
+
it('masque les messages de validation quand hideDetails est true', async () => {
|
|
145
|
+
const wrapper = mount(SySelect, {
|
|
146
|
+
props: {
|
|
147
|
+
errorMessages: ['Erreur de test'],
|
|
148
|
+
hideDetails: true,
|
|
149
|
+
},
|
|
150
|
+
attachTo: document.body,
|
|
151
|
+
})
|
|
152
|
+
|
|
153
|
+
expect(wrapper.find('.v-messages__message').exists()).toBe(false)
|
|
154
|
+
|
|
155
|
+
wrapper.unmount()
|
|
156
|
+
})
|
|
157
|
+
|
|
158
|
+
it('affiche les messages de validation quand hideDetails est false', async () => {
|
|
159
|
+
const wrapper = mount(SySelect, {
|
|
160
|
+
props: {
|
|
161
|
+
errorMessages: ['Erreur de test'],
|
|
162
|
+
hideDetails: false,
|
|
163
|
+
},
|
|
164
|
+
attachTo: document.body,
|
|
165
|
+
})
|
|
166
|
+
|
|
167
|
+
const message = wrapper.find('.v-messages__message')
|
|
168
|
+
expect(message.exists()).toBe(true)
|
|
169
|
+
expect(message.text()).toContain('Erreur de test')
|
|
170
|
+
|
|
171
|
+
wrapper.unmount()
|
|
172
|
+
})
|
|
173
|
+
|
|
174
|
+
it('affiche la zone de messages par défaut (hideDetails vaut false par défaut)', () => {
|
|
175
|
+
const wrapper = mount(SySelect, {
|
|
176
|
+
attachTo: document.body,
|
|
177
|
+
})
|
|
178
|
+
|
|
179
|
+
expect(wrapper.find('.v-messages').exists()).toBe(true)
|
|
180
|
+
|
|
181
|
+
wrapper.unmount()
|
|
182
|
+
})
|
|
183
|
+
|
|
184
|
+
it('n\'affiche pas le helpText en dessous du champ quand hideDetails est true et qu\'il y a des erreurs', () => {
|
|
185
|
+
const wrapper = mount(SySelect, {
|
|
186
|
+
props: {
|
|
187
|
+
helpText: 'Texte d\'aide',
|
|
188
|
+
errorMessages: ['Erreur de test'],
|
|
189
|
+
hideDetails: true,
|
|
190
|
+
},
|
|
191
|
+
attachTo: document.body,
|
|
192
|
+
})
|
|
193
|
+
|
|
194
|
+
expect(wrapper.find('.help-text-below').exists()).toBe(false)
|
|
195
|
+
|
|
196
|
+
wrapper.unmount()
|
|
197
|
+
})
|
|
198
|
+
|
|
199
|
+
it('affiche le helpText en dessous du champ quand hideDetails est false et qu\'il y a des erreurs', () => {
|
|
200
|
+
const wrapper = mount(SySelect, {
|
|
201
|
+
props: {
|
|
202
|
+
helpText: 'Texte d\'aide',
|
|
203
|
+
errorMessages: ['Erreur de test'],
|
|
204
|
+
hideDetails: false,
|
|
205
|
+
},
|
|
206
|
+
attachTo: document.body,
|
|
207
|
+
})
|
|
208
|
+
|
|
209
|
+
expect(wrapper.find('.help-text-below').exists()).toBe(true)
|
|
210
|
+
expect(wrapper.find('.help-text-below').text()).toContain('Texte d\'aide')
|
|
211
|
+
|
|
212
|
+
wrapper.unmount()
|
|
213
|
+
})
|
|
214
|
+
})
|
|
215
|
+
|
|
216
|
+
it('keeps the label active when a validation error is displayed', async () => {
|
|
217
|
+
const wrapper = mount(SySelect, {
|
|
218
|
+
props: {
|
|
219
|
+
items: [{ text: 'Option 1', value: '1' }],
|
|
220
|
+
label: 'Option',
|
|
221
|
+
required: true,
|
|
222
|
+
},
|
|
223
|
+
attachTo: document.body,
|
|
224
|
+
})
|
|
225
|
+
|
|
226
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- exposed method is not part of the inferred public instance type
|
|
227
|
+
const isValid = await (wrapper.vm as any).validateOnSubmit()
|
|
228
|
+
await nextTick()
|
|
229
|
+
|
|
230
|
+
expect(isValid).toBe(false)
|
|
231
|
+
expect(wrapper.find('.v-field').classes()).toContain('v-field--active')
|
|
232
|
+
|
|
233
|
+
wrapper.unmount()
|
|
234
|
+
})
|
|
235
|
+
|
|
142
236
|
it('does not render error messages when not provided', () => {
|
|
143
237
|
const wrapper = mount(SySelect, {
|
|
144
238
|
attachTo: document.body,
|
|
@@ -487,26 +581,206 @@ describe('SySelect.vue', () => {
|
|
|
487
581
|
wrapper.unmount()
|
|
488
582
|
})
|
|
489
583
|
|
|
490
|
-
it('n\'affiche pas d\'erreur
|
|
584
|
+
it('n\'affiche pas d\'erreur à l\'ouverture du menu mais seulement à la fermeture', async () => {
|
|
491
585
|
const wrapper = mount(SySelect, {
|
|
492
586
|
props: {
|
|
493
587
|
required: true,
|
|
494
588
|
label: 'Test Label',
|
|
495
589
|
modelValue: undefined,
|
|
496
|
-
|
|
590
|
+
items: [
|
|
591
|
+
{ text: 'Option 1', value: '1' },
|
|
592
|
+
{ text: 'Option 2', value: '2' },
|
|
593
|
+
],
|
|
497
594
|
},
|
|
498
595
|
attachTo: document.body,
|
|
499
596
|
})
|
|
500
597
|
|
|
598
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- This is a generic type
|
|
599
|
+
const instance = wrapper.vm as any
|
|
600
|
+
|
|
601
|
+
// Au départ, pas d'erreur
|
|
602
|
+
expect(instance.hasError).toBe(false)
|
|
603
|
+
|
|
604
|
+
// Ouverture du menu - l'erreur ne doit pas s'afficher
|
|
501
605
|
await wrapper.find('.v-field').trigger('click')
|
|
502
606
|
await wrapper.vm.$nextTick()
|
|
607
|
+
expect(instance.hasError).toBe(false)
|
|
608
|
+
expect(instance.isOpen).toBe(true)
|
|
609
|
+
|
|
610
|
+
// Fermeture du menu sans sélection - l'erreur doit s'afficher
|
|
503
611
|
await wrapper.find('.v-field').trigger('click')
|
|
504
612
|
await wrapper.vm.$nextTick()
|
|
613
|
+
expect(instance.hasError).toBe(true)
|
|
614
|
+
expect(instance.isOpen).toBe(false)
|
|
615
|
+
|
|
616
|
+
wrapper.unmount()
|
|
617
|
+
})
|
|
618
|
+
|
|
619
|
+
describe('disableErrorHandling', () => {
|
|
620
|
+
it('n\'affiche pas d\'erreur pour un champ requis sans valeur quand disableErrorHandling est true', async () => {
|
|
621
|
+
const wrapper = mount(SySelect, {
|
|
622
|
+
props: {
|
|
623
|
+
required: true,
|
|
624
|
+
label: 'Test Label',
|
|
625
|
+
modelValue: undefined,
|
|
626
|
+
disableErrorHandling: true,
|
|
627
|
+
},
|
|
628
|
+
attachTo: document.body,
|
|
629
|
+
})
|
|
630
|
+
|
|
631
|
+
await wrapper.find('.v-field').trigger('click')
|
|
632
|
+
await wrapper.vm.$nextTick()
|
|
633
|
+
await wrapper.find('.v-field').trigger('click')
|
|
634
|
+
await wrapper.vm.$nextTick()
|
|
635
|
+
|
|
636
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- This is a generic type
|
|
637
|
+
const instance = wrapper.vm as any
|
|
638
|
+
expect(instance.hasError).toBe(false)
|
|
639
|
+
|
|
640
|
+
wrapper.unmount()
|
|
641
|
+
})
|
|
642
|
+
|
|
643
|
+
it('ignore les errorMessages quand disableErrorHandling est true', () => {
|
|
644
|
+
const wrapper = mount(SySelect, {
|
|
645
|
+
props: {
|
|
646
|
+
errorMessages: ['Erreur forcée'],
|
|
647
|
+
disableErrorHandling: true,
|
|
648
|
+
},
|
|
649
|
+
attachTo: document.body,
|
|
650
|
+
})
|
|
651
|
+
|
|
652
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- This is a generic type
|
|
653
|
+
const instance = wrapper.vm as any
|
|
654
|
+
expect(instance.hasError).toBe(false)
|
|
655
|
+
expect(wrapper.find('.v-messages__message').exists()).toBe(false)
|
|
656
|
+
|
|
657
|
+
wrapper.unmount()
|
|
658
|
+
})
|
|
659
|
+
|
|
660
|
+
it('n\'évalue pas les customRules quand disableErrorHandling est true', async () => {
|
|
661
|
+
const wrapper = mount(SySelect, {
|
|
662
|
+
props: {
|
|
663
|
+
modelValue: '1',
|
|
664
|
+
disableErrorHandling: true,
|
|
665
|
+
isValidateOnBlur: false,
|
|
666
|
+
customRules: [{
|
|
667
|
+
type: 'custom',
|
|
668
|
+
options: {
|
|
669
|
+
validate: () => false,
|
|
670
|
+
message: 'Toujours invalide',
|
|
671
|
+
},
|
|
672
|
+
}],
|
|
673
|
+
},
|
|
674
|
+
attachTo: document.body,
|
|
675
|
+
})
|
|
676
|
+
|
|
677
|
+
await wrapper.vm.$nextTick()
|
|
678
|
+
|
|
679
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- This is a generic type
|
|
680
|
+
const instance = wrapper.vm as any
|
|
681
|
+
expect(instance.hasError).toBe(false)
|
|
682
|
+
expect(wrapper.find('.v-messages__message').exists()).toBe(false)
|
|
683
|
+
|
|
684
|
+
wrapper.unmount()
|
|
685
|
+
})
|
|
686
|
+
|
|
687
|
+
it('affiche les erreurs normalement quand disableErrorHandling est false', async () => {
|
|
688
|
+
const wrapper = mount(SySelect, {
|
|
689
|
+
props: {
|
|
690
|
+
errorMessages: ['Erreur visible'],
|
|
691
|
+
disableErrorHandling: false,
|
|
692
|
+
},
|
|
693
|
+
attachTo: document.body,
|
|
694
|
+
})
|
|
695
|
+
|
|
696
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- This is a generic type
|
|
697
|
+
const instance = wrapper.vm as any
|
|
698
|
+
expect(instance.hasError).toBe(true)
|
|
699
|
+
expect(wrapper.find('.v-messages__message').text()).toContain('Erreur visible')
|
|
700
|
+
|
|
701
|
+
wrapper.unmount()
|
|
702
|
+
})
|
|
703
|
+
})
|
|
704
|
+
|
|
705
|
+
it('valide immédiatement quand isValidateOnBlur est false', async () => {
|
|
706
|
+
const wrapper = mount(SySelect, {
|
|
707
|
+
props: {
|
|
708
|
+
items: [
|
|
709
|
+
{ text: 'Option 1', value: '1' },
|
|
710
|
+
{ text: 'Option 2', value: '2' },
|
|
711
|
+
],
|
|
712
|
+
label: 'Test Label',
|
|
713
|
+
modelValue: undefined,
|
|
714
|
+
isValidateOnBlur: false,
|
|
715
|
+
customRules: [{
|
|
716
|
+
type: 'custom',
|
|
717
|
+
options: {
|
|
718
|
+
validate: (value: unknown) => value === '2',
|
|
719
|
+
message: 'Test error message',
|
|
720
|
+
},
|
|
721
|
+
}],
|
|
722
|
+
},
|
|
723
|
+
attachTo: document.body,
|
|
724
|
+
})
|
|
505
725
|
|
|
506
726
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- This is a generic type
|
|
507
727
|
const instance = wrapper.vm as any
|
|
508
728
|
expect(instance.hasError).toBe(false)
|
|
509
729
|
|
|
730
|
+
// Sélection de Option 1 via interaction utilisateur
|
|
731
|
+
await wrapper.find('.v-field').trigger('click')
|
|
732
|
+
await wrapper.vm.$nextTick()
|
|
733
|
+
await wrapper.findComponent(VList).findAll('.v-list-item').at(0)!.trigger('click')
|
|
734
|
+
await wrapper.setProps({ modelValue: '1' })
|
|
735
|
+
|
|
736
|
+
await vi.waitUntil(() => instance.hasError === true)
|
|
737
|
+
expect(wrapper.find('.v-messages').text()).toContain('Test error message')
|
|
738
|
+
|
|
739
|
+
// Sélection de Option 2 via interaction utilisateur
|
|
740
|
+
await wrapper.find('.v-field').trigger('click')
|
|
741
|
+
await wrapper.vm.$nextTick()
|
|
742
|
+
await wrapper.findComponent(VList).findAll('.v-list-item').at(1)!.trigger('click')
|
|
743
|
+
await wrapper.setProps({ modelValue: '2' })
|
|
744
|
+
|
|
745
|
+
await vi.waitUntil(() => instance.hasError === false)
|
|
746
|
+
expect(wrapper.find('.v-messages').text()).not.toContain('Test error message')
|
|
747
|
+
|
|
748
|
+
wrapper.unmount()
|
|
749
|
+
})
|
|
750
|
+
|
|
751
|
+
it('masque le message de succes mais conserve l\'etat de succes quand showSuccessMessages est false', async () => {
|
|
752
|
+
const wrapper = mount(SySelect, {
|
|
753
|
+
props: {
|
|
754
|
+
items: [
|
|
755
|
+
{ text: 'Option 1', value: '1' },
|
|
756
|
+
{ text: 'Option 2', value: '2' },
|
|
757
|
+
],
|
|
758
|
+
label: 'Test Label',
|
|
759
|
+
modelValue: undefined,
|
|
760
|
+
isValidateOnBlur: false,
|
|
761
|
+
showSuccessMessages: false,
|
|
762
|
+
customSuccessRules: [{
|
|
763
|
+
type: 'custom',
|
|
764
|
+
options: {
|
|
765
|
+
validate: (value: unknown) => value === '2',
|
|
766
|
+
successMessage: 'Test success message',
|
|
767
|
+
},
|
|
768
|
+
}],
|
|
769
|
+
},
|
|
770
|
+
attachTo: document.body,
|
|
771
|
+
})
|
|
772
|
+
|
|
773
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- This is a generic type
|
|
774
|
+
const instance = wrapper.vm as any
|
|
775
|
+
expect(instance.hasSuccess).toBe(false)
|
|
776
|
+
|
|
777
|
+
await wrapper.setProps({ modelValue: '2' })
|
|
778
|
+
|
|
779
|
+
await vi.waitUntil(() => instance.hasSuccess === true)
|
|
780
|
+
expect(wrapper.find('.success-field').exists()).toBe(true)
|
|
781
|
+
expect(wrapper.findAll('.v-messages__message')).toHaveLength(0)
|
|
782
|
+
expect(wrapper.text()).not.toContain('Test success message')
|
|
783
|
+
|
|
510
784
|
wrapper.unmount()
|
|
511
785
|
})
|
|
512
786
|
})
|
|
@@ -175,7 +175,7 @@
|
|
|
175
175
|
|
|
176
176
|
const errors = computed(() => validation.errors.value)
|
|
177
177
|
const warnings = computed(() => validation.warnings.value)
|
|
178
|
-
const
|
|
178
|
+
const displaySuccesses = computed(() => validation.displaySuccesses.value)
|
|
179
179
|
|
|
180
180
|
const labelId = computed(() => (props.id ? `${props.id}-label` : undefined))
|
|
181
181
|
const computedAriaLabelledby = computed(() => {
|
|
@@ -267,8 +267,8 @@
|
|
|
267
267
|
>
|
|
268
268
|
<VMessages
|
|
269
269
|
ref="messagesRef"
|
|
270
|
-
:active="hasError || hasWarning || (hasSuccess &&
|
|
271
|
-
:messages="hasError ? errors : (hasWarning ? warnings : (hasSuccess
|
|
270
|
+
:active="hasError || hasWarning || (hasSuccess && displaySuccesses.length > 0)"
|
|
271
|
+
:messages="hasError ? errors : (hasWarning ? warnings : (hasSuccess ? displaySuccesses : []))"
|
|
272
272
|
/>
|
|
273
273
|
</div>
|
|
274
274
|
|
|
@@ -51,4 +51,9 @@ La propriété `controlsIds` permet d'établir une relation entre une case à co
|
|
|
51
51
|
|
|
52
52
|
<Canvas of={SyCheckboxStories.WithControlsIds} />
|
|
53
53
|
|
|
54
|
+
## Mode Décoratif
|
|
55
|
+
|
|
56
|
+
La propriété `decorative` permet d'afficher la case à cocher uniquement de manière visuelle, sans rendre l'élément interactif natif (`<input type="checkbox">`) dans le DOM.
|
|
57
|
+
Ce mode est essentiel lorsque la case à cocher est imbriquée à l'intérieur d'un autre élément interactif (comme une ligne d'un tableau cliquable ou une option de liste déroulante). Il permet de respecter les règles d'accessibilité (qui interdisent l'imbrication de contrôles interactifs) tout en offrant le rendu visuel attendu. Le composant parent devient alors responsable de l'annonce de l'état (ex: via `aria-selected`).
|
|
58
|
+
|
|
54
59
|
<a href="/?path=/docs/guide-du-dev-guide-de-validation-des-formulaires--docs" className="action-link">Pour plus d'informations sur la validation, consultez le guide de validation des formulaires.</a>
|
|
@@ -36,6 +36,7 @@
|
|
|
36
36
|
falseValue?: unknown
|
|
37
37
|
controlsIds?: string[]
|
|
38
38
|
displayAsterisk?: boolean
|
|
39
|
+
decorative?: boolean
|
|
39
40
|
}>(),
|
|
40
41
|
{
|
|
41
42
|
modelValue: false,
|
|
@@ -66,11 +67,15 @@
|
|
|
66
67
|
falseValue: () => false,
|
|
67
68
|
controlsIds: () => [],
|
|
68
69
|
displayAsterisk: false,
|
|
70
|
+
decorative: false,
|
|
69
71
|
},
|
|
70
72
|
)
|
|
71
73
|
|
|
72
74
|
const emit = defineEmits(['update:modelValue', 'update:indeterminate', 'change'])
|
|
73
75
|
|
|
76
|
+
import SyIcon from '@/components/Customs/SyIcon/SyIcon.vue'
|
|
77
|
+
import { mdiCheckboxBlankOutline, mdiCheckboxMarked, mdiMinusBox } from '@mdi/js'
|
|
78
|
+
|
|
74
79
|
const checkboxRef = ref<VCheckbox | null>(null)
|
|
75
80
|
|
|
76
81
|
const internalIndeterminate = ref(props.indeterminate)
|
|
@@ -199,7 +204,7 @@
|
|
|
199
204
|
|
|
200
205
|
const errors = computed(() => validation.errors.value)
|
|
201
206
|
const warnings = computed(() => validation.warnings.value)
|
|
202
|
-
const
|
|
207
|
+
const displaySuccesses = computed(() => validation.displaySuccesses.value)
|
|
203
208
|
|
|
204
209
|
const ariaChecked = computed(() => {
|
|
205
210
|
if (internalIndeterminate.value) return 'mixed'
|
|
@@ -308,7 +313,31 @@
|
|
|
308
313
|
|
|
309
314
|
<template>
|
|
310
315
|
<div>
|
|
316
|
+
<!-- Rendu purement visuel/décoratif, ignoré par les lecteurs d'écran -->
|
|
317
|
+
<div
|
|
318
|
+
v-if="props.decorative"
|
|
319
|
+
class="d-flex align-center pointer-events-none sy-checkbox-decorative"
|
|
320
|
+
aria-hidden="true"
|
|
321
|
+
>
|
|
322
|
+
<SyIcon
|
|
323
|
+
:icon="internalIndeterminate ? mdiMinusBox : (model ? mdiCheckboxMarked : mdiCheckboxBlankOutline)"
|
|
324
|
+
:color="(model || internalIndeterminate) ? props.color : '#727273'"
|
|
325
|
+
:class="{'text-disabled': props.disabled}"
|
|
326
|
+
:decorative="true"
|
|
327
|
+
class="mr-2"
|
|
328
|
+
/>
|
|
329
|
+
<slot name="label">
|
|
330
|
+
<span
|
|
331
|
+
v-if="generatedLabel"
|
|
332
|
+
:class="{'text-disabled': props.disabled}"
|
|
333
|
+
:style="{ color: labelColor }"
|
|
334
|
+
>{{ generatedLabel }}</span>
|
|
335
|
+
</slot>
|
|
336
|
+
</div>
|
|
337
|
+
|
|
338
|
+
<!-- Rendu interactif standard -->
|
|
311
339
|
<VCheckbox
|
|
340
|
+
v-else
|
|
312
341
|
:id="props.id"
|
|
313
342
|
ref="checkboxRef"
|
|
314
343
|
v-model="model"
|
|
@@ -318,6 +347,11 @@
|
|
|
318
347
|
:aria-labelledby="props.ariaLabelledby"
|
|
319
348
|
:title="props.title"
|
|
320
349
|
:color="props.color"
|
|
350
|
+
:class="{
|
|
351
|
+
'success-field': hasSuccess && !hasError && !hasWarning,
|
|
352
|
+
'warning-field': hasWarning && !hasError,
|
|
353
|
+
'error-field': hasError,
|
|
354
|
+
}"
|
|
321
355
|
:style="{ color: labelColor }"
|
|
322
356
|
:disabled="props.disabled"
|
|
323
357
|
:readonly="props.readonly"
|
|
@@ -325,7 +359,7 @@
|
|
|
325
359
|
:density="props.density"
|
|
326
360
|
:error="hasError"
|
|
327
361
|
:error-messages="errors"
|
|
328
|
-
:messages="hasError ? errors : (hasWarning ? warnings : (hasSuccess
|
|
362
|
+
:messages="hasError ? errors : (hasWarning ? warnings : (hasSuccess ? displaySuccesses : []))"
|
|
329
363
|
:indeterminate="internalIndeterminate"
|
|
330
364
|
:true-value="props.trueValue"
|
|
331
365
|
:false-value="props.falseValue"
|
|
@@ -358,6 +392,22 @@
|
|
|
358
392
|
</template>
|
|
359
393
|
|
|
360
394
|
<style scoped>
|
|
395
|
+
.success-field :deep(.v-messages__message) {
|
|
396
|
+
color: rgb(var(--v-theme-success)) !important;
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
.success-field :deep(.v-selection-control__input) {
|
|
400
|
+
color: rgb(var(--v-theme-success));
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
.warning-field :deep(.v-messages__message) {
|
|
404
|
+
color: rgb(var(--v-theme-borderWarning)) !important;
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
.warning-field :deep(.v-selection-control__input) {
|
|
408
|
+
color: rgb(var(--v-theme-borderWarning));
|
|
409
|
+
}
|
|
410
|
+
|
|
361
411
|
:deep(.v-input--dirty .v-selection-control__input) {
|
|
362
412
|
color: v-bind('props.color');
|
|
363
413
|
}
|
|
@@ -143,7 +143,19 @@ import '@/stories/styles/shared.css';
|
|
|
143
143
|
<p>
|
|
144
144
|
Cette relation est établie via la propriété <code>controlsIds</code> qui liste les identifiants des cases à cocher enfants.
|
|
145
145
|
</p>
|
|
146
|
-
</div>
|
|
146
|
+
</div>
|
|
147
|
+
|
|
148
|
+
<div className="decorative-mode-section">
|
|
149
|
+
<h2>Mode Décoratif (Imbrication)</h2>
|
|
150
|
+
<p>
|
|
151
|
+
Le composant SyCheckbox dispose d'une propriété <code>decorative</code> permettant de l'utiliser de manière purement visuelle.
|
|
152
|
+
Dans ce mode, la case à cocher n'inclut pas d'élément <code><input type="checkbox"></code> natif et est masquée aux lecteurs d'écran via <code>aria-hidden="true"</code>.
|
|
153
|
+
</p>
|
|
154
|
+
<p>
|
|
155
|
+
Ce mode est <strong>indispensable pour respecter l'accessibilité</strong> lorsque la case à cocher doit être imbriquée dans un autre composant interactif (par exemple, une option de <code>listbox</code> ou une ligne cliquable de tableau).
|
|
156
|
+
Les règles WAI-ARIA interdisent l'imbrication d'éléments interactifs. Le composant parent assume alors la responsabilité d'annoncer l'état de sélection (ex: via <code>aria-selected</code> ou <code>aria-checked</code> au niveau de la ligne).
|
|
157
|
+
</p>
|
|
158
|
+
</div>
|
|
147
159
|
|
|
148
160
|
<div className="best-practices">
|
|
149
161
|
<h2>Bonnes pratiques d'utilisation</h2>
|
|
@@ -210,6 +222,7 @@ import '@/stories/styles/shared.css';
|
|
|
210
222
|
.aria-management-section h2,
|
|
211
223
|
.tri-state-section h2,
|
|
212
224
|
.parent-child-section h2,
|
|
225
|
+
.decorative-mode-section h2,
|
|
213
226
|
.best-practices h2,
|
|
214
227
|
.resources-section h2 {
|
|
215
228
|
border-bottom: 2px solid #eaecef;
|
|
@@ -279,7 +292,8 @@ import '@/stories/styles/shared.css';
|
|
|
279
292
|
}
|
|
280
293
|
|
|
281
294
|
.tri-state-section,
|
|
282
|
-
.parent-child-section
|
|
295
|
+
.parent-child-section,
|
|
296
|
+
.decorative-mode-section {
|
|
283
297
|
background-color: #f0f7ff;
|
|
284
298
|
padding: 20px;
|
|
285
299
|
border-radius: 8px;
|
|
@@ -287,7 +301,8 @@ import '@/stories/styles/shared.css';
|
|
|
287
301
|
}
|
|
288
302
|
|
|
289
303
|
.tri-state-section p,
|
|
290
|
-
.parent-child-section p
|
|
304
|
+
.parent-child-section p,
|
|
305
|
+
.decorative-mode-section p {
|
|
291
306
|
line-height: 1.6;
|
|
292
307
|
}
|
|
293
308
|
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import { computed, nextTick, onMounted, onUpdated, ref, watch } from 'vue'
|
|
4
4
|
import type { VRadioGroup } from 'vuetify/components'
|
|
5
|
+
import { VMessages } from 'vuetify/components'
|
|
5
6
|
import { useValidation, type ValidationRule } from '@/composables/validation/useValidation'
|
|
6
7
|
import { useValidatable } from '@/composables/validation/useValidatable'
|
|
7
8
|
import { locales } from './locales'
|
|
@@ -148,7 +149,7 @@
|
|
|
148
149
|
|
|
149
150
|
const errors = computed(() => validation.errors.value)
|
|
150
151
|
const warnings = computed(() => validation.warnings.value)
|
|
151
|
-
const
|
|
152
|
+
const displaySuccesses = computed(() => validation.displaySuccesses.value)
|
|
152
153
|
|
|
153
154
|
const getAriaChecked = (value: PropertyKey) => {
|
|
154
155
|
return model.value === value ? 'true' : 'false'
|
|
@@ -224,10 +225,6 @@
|
|
|
224
225
|
:error="hasError"
|
|
225
226
|
:error-messages="hasError ? errors : undefined"
|
|
226
227
|
:aria-describedby="messageId"
|
|
227
|
-
:messages="hasError ? errors :
|
|
228
|
-
hasWarning ? warnings :
|
|
229
|
-
(hasSuccess && props.showSuccessMessages ? successes : [])
|
|
230
|
-
"
|
|
231
228
|
>
|
|
232
229
|
<v-radio
|
|
233
230
|
v-for="opt in props.options"
|
|
@@ -258,14 +255,35 @@
|
|
|
258
255
|
{{ locales.labelledbyMessage }} <span v-if="props.label">{{ props.label + (props.displayAsterisk ? '*' : '')
|
|
259
256
|
}}</span>.
|
|
260
257
|
</span>
|
|
258
|
+
<template
|
|
259
|
+
v-if="!hasError && (hasWarning || hasSuccess)"
|
|
260
|
+
#details
|
|
261
|
+
>
|
|
262
|
+
<div class="v-input__details sy-radio-group__messages">
|
|
263
|
+
<VMessages
|
|
264
|
+
:active="hasWarning || (hasSuccess && displaySuccesses.length > 0)"
|
|
265
|
+
:messages="hasWarning ? warnings : displaySuccesses"
|
|
266
|
+
/>
|
|
267
|
+
</div>
|
|
268
|
+
</template>
|
|
261
269
|
</v-radio-group>
|
|
262
270
|
</template>
|
|
263
271
|
|
|
264
272
|
<style scoped>
|
|
273
|
+
:deep(.v-input__details) {
|
|
274
|
+
display: block !important;
|
|
275
|
+
padding-inline: 0 !important;
|
|
276
|
+
margin-top: -10px !important;
|
|
277
|
+
}
|
|
278
|
+
|
|
265
279
|
:deep(.v-selection-control--error .v-selection-control__input) {
|
|
266
280
|
color: rgb(var(--v-theme-error));
|
|
267
281
|
}
|
|
268
282
|
|
|
283
|
+
.sy-radio-group__messages {
|
|
284
|
+
align-items: flex-start;
|
|
285
|
+
}
|
|
286
|
+
|
|
269
287
|
.sb-show-main.sb-main-centered #storybook-root {
|
|
270
288
|
margin: none !important;
|
|
271
289
|
}
|
|
@@ -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
|
|