@cnamts/synapse 1.0.21 → 1.0.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{DateFilter-uN8OURoP.js → DateFilter-B5n-ZkLi.js} +29 -24
- package/dist/{NumberFilter-sm1dQNQi.js → NumberFilter-CtiZ9uj8.js} +1 -1
- package/dist/{PeriodFilter-Cklsxnh9.js → PeriodFilter-DzqiMb-b.js} +1 -1
- package/dist/{SelectFilter-CWefj27Z.js → SelectFilter-BOYlF7rX.js} +1 -1
- package/dist/{TextFilter-Ddyj885L.js → TextFilter-BOFRNfcX.js} +1 -1
- package/dist/components/Amelipro/AmeliproAutoCompleteField/AmeliproAutoCompleteField.d.ts +7399 -5967
- package/dist/components/Amelipro/AmeliproBtn/AmeliproBtn.d.ts +1 -1
- package/dist/components/Amelipro/AmeliproCallback/AmeliproCallback.d.ts +1 -1
- package/dist/components/Amelipro/AmeliproCarousel/AmeliproCarousel.d.ts +10 -14
- package/dist/components/Amelipro/AmeliproCarousel/AmeliproCarouselItem/AmeliproCarouselItem.d.ts +1 -1
- package/dist/components/Amelipro/AmeliproCheckbox/AmeliproCheckbox.d.ts +1 -1
- package/dist/components/Amelipro/AmeliproClickableTile/AmeliproClickableTile.d.ts +1 -1
- package/dist/components/Amelipro/AmeliproCustomSelector/AmeliproCustomSelector.d.ts +1 -1
- package/dist/components/Amelipro/AmeliproErrorTemplate/AmeliproErrorTemplate.d.ts +1 -1
- package/dist/components/Amelipro/AmeliproFirstLogin/AmeliproFirstLogin.d.ts +1 -1
- package/dist/components/Amelipro/AmeliproFooter/AmeliproFooter.d.ts +8 -8
- package/dist/components/Amelipro/AmeliproHeader/AmeliproHeader.d.ts +3 -3
- package/dist/components/Amelipro/AmeliproHeader/AmeliproHeaderBar/AmeliproHeaderBar.d.ts +1 -1
- package/dist/components/Amelipro/AmeliproHeader/AmeliproHeaderBar/AmeliproHeaderBrandSection/AmeliproHeaderBrandSection.d.ts +1 -1
- package/dist/components/Amelipro/AmeliproIcon/AmeliproIcon.d.ts +1 -1
- package/dist/components/Amelipro/AmeliproIconBtn/AmeliproIconBtn.d.ts +16 -20
- package/dist/components/Amelipro/AmeliproMenu/AmeliproMenu.d.ts +1 -1
- package/dist/components/Amelipro/AmeliproPagination/AmeliproPaginationBtn/AmeliproPaginationBtn.d.ts +1 -1
- package/dist/components/Amelipro/AmeliproPatientBanner/AmeliproPatientBanner.d.ts +1 -1
- package/dist/components/Amelipro/AmeliproPostalAddressField/AmeliproPostalAddressCityRow/AmeliproPostalAddressCityRow.d.ts +1610 -1354
- package/dist/components/Amelipro/AmeliproPostalAddressField/AmeliproPostalAddressField.d.ts +2411 -2027
- package/dist/components/Amelipro/AmeliproSelect/AmeliproSelect.d.ts +8889 -7327
- package/dist/components/Amelipro/AmeliproStateTile/AmeliproStateTile.d.ts +1 -1
- package/dist/components/Amelipro/AmeliproStepper/AmeliproStepper.d.ts +2 -6
- package/dist/components/Amelipro/AmeliproTabs/AmeliproTabs.d.ts +8888 -7334
- package/dist/components/Amelipro/AmeliproTextArea/AmeliproTextArea.d.ts +951 -839
- package/dist/components/Amelipro/AmeliproTextField/AmeliproTextField.d.ts +1613 -1357
- package/dist/components/Amelipro/AmeliproTileBtn/AmeliproTileBtn.d.ts +223 -203
- package/dist/components/Amelipro/AmeliproTransmission/AmeliproTransmission.d.ts +3 -3
- package/dist/components/Amelipro/StructureMenu/StructureTabs/StructureTabs.d.ts +3 -7
- package/dist/components/CollapsibleList/CollapsibleList.d.ts +4 -1
- package/dist/components/CookieBanner/CookieBanner.d.ts +303 -273
- package/dist/components/CookiesSelection/CookiesInformation/CookiesInformation.d.ts +1297 -1156
- package/dist/components/CookiesSelection/CookiesSelection.d.ts +404 -377
- package/dist/components/Customs/Selects/SelectBtnField/SelectBtnField.d.ts +1 -1
- package/dist/components/Customs/Selects/SyAutocomplete/SyAutocomplete.d.ts +1088 -847
- package/dist/components/Customs/Selects/SyInputSelect/SyInputSelect.d.ts +1 -1
- package/dist/components/Customs/Selects/SySelect/SySelect.d.ts +515 -321
- package/dist/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.d.ts +41 -39
- package/dist/components/Customs/SyCheckbox/SyCheckbox.d.ts +921 -801
- package/dist/components/Customs/SyForm/SyForm.d.ts +356 -348
- package/dist/components/Customs/SyPagination/SyPagination.d.ts +11 -1
- package/dist/components/Customs/SyRadioGroup/SyRadioGroup.d.ts +907 -795
- package/dist/components/Customs/SyTextField/SyTextField.d.ts +1629 -1365
- package/dist/components/DataList/DataList.d.ts +1 -1
- package/dist/components/DatePicker/CalendarMode/DatePicker.d.ts +3868 -3123
- package/dist/components/DatePicker/ComplexDatePicker/ComplexDatePicker.d.ts +1946 -1562
- package/dist/components/DatePicker/DateTextInput/DateTextInput.d.ts +833 -687
- package/dist/components/DialogBox/DialogBox.d.ts +482 -416
- package/dist/components/DownloadBtn/config.d.ts +1 -1
- package/dist/components/ErrorPage/ErrorPage.d.ts +4 -0
- package/dist/components/FileList/UploadItem/locales.d.ts +4 -0
- package/dist/components/FileUpload/FileUpload.d.ts +4 -4
- package/dist/components/FileUpload/locales.d.ts +1 -0
- package/dist/components/FilterSideBar/FilterSideBar.d.ts +418 -366
- package/dist/components/FooterBar/FooterBar.d.ts +13 -1
- package/dist/components/FooterBar/locales.d.ts +1 -0
- package/dist/components/FooterBar/types.d.ts +1 -0
- package/dist/components/HeaderBar/HeaderBar.d.ts +1 -0
- package/dist/components/HeaderBar/HeaderLogo/HeaderLogo.d.ts +1 -0
- package/dist/components/HeaderNavigationBar/HeaderNavigationBar.d.ts +3 -6
- package/dist/components/HeaderToolbar/HeaderToolbar.d.ts +1031 -643
- package/dist/components/LangBtn/LangBtn.d.ts +277 -239
- package/dist/components/LogoBrandSection/LogoBrandSection.d.ts +4 -0
- package/dist/components/MaintenancePage/MaintenancePage.d.ts +16 -1
- package/dist/components/NirField/NirField.d.ts +1659 -1371
- package/dist/components/NotFoundPage/NotFoundPage.d.ts +9 -3
- package/dist/components/PageContainer/PageContainer.d.ts +3 -1
- package/dist/components/PasswordField/PasswordField.d.ts +1 -1
- package/dist/components/PeriodField/PeriodField.d.ts +7712 -6216
- package/dist/components/PhoneField/PhoneField.d.ts +831 -687
- package/dist/components/RangeField/RangeSlider/RangeSlider.d.ts +4 -12
- package/dist/components/StatusPage/StatusPage.d.ts +12 -1
- package/dist/components/SubHeader/SubHeader.d.ts +2 -0
- package/dist/components/SyAlert/SyAlert.d.ts +74 -70
- package/dist/components/SyBtnMenu/SyBtnMenu.d.ts +10 -1
- package/dist/components/SyHeading/SyHeading.d.ts +20 -0
- package/dist/components/SyTextArea/SyTextArea.d.ts +476 -420
- package/dist/components/Tables/SyServerTable/SyServerTable.d.ts +759 -468
- package/dist/components/Tables/SyTable/SyTable.d.ts +761 -470
- package/dist/components/Tables/common/SyTableFilter.d.ts +1 -1
- package/dist/components/Tables/common/SyTablePagination.d.ts +269 -170
- package/dist/components/Tables/common/filters/DateFilter.d.ts +10 -1
- package/dist/components/Tables/common/filters/NumberFilter.d.ts +1 -1
- package/dist/components/Tables/common/filters/PeriodFilter.d.ts +1 -1
- package/dist/components/Tables/common/filters/SelectFilter.d.ts +1 -1
- package/dist/components/Tables/common/filters/TextFilter.d.ts +1 -1
- package/dist/components/Tables/common/organizeColumns/OrganizeColumns.d.ts +166 -138
- package/dist/components/Tables/common/types.d.ts +2 -0
- package/dist/components/UploadWorkflow/UploadWorkflow.d.ts +24 -1211
- package/dist/components/UserMenuBtn/UserMenuBtn.d.ts +1 -0
- package/dist/components/index.d.ts +1 -0
- package/dist/components/types.d.ts +2 -0
- package/dist/design-system-v3.js +70 -69
- package/dist/design-system-v3.umd.cjs +265 -265
- package/dist/designTokens/tokens/amelipro/apLightTheme.d.ts +26 -14
- package/dist/designTokens/tokens/amelipro/apSemantic.d.ts +19 -13
- package/dist/designTokens/tokens/cnam/cnamLightTheme.d.ts +28 -15
- package/dist/designTokens/tokens/cnam/cnamSemantic.d.ts +20 -13
- package/dist/designTokens/tokens/pa/paLightTheme.d.ts +26 -15
- package/dist/designTokens/tokens/pa/paSemantic.d.ts +19 -13
- package/dist/main-CEl4J8_T.js +37241 -0
- package/dist/style.css +1 -1
- package/dist/vuetifyConfig.d.ts +14 -14
- package/package.json +13 -7
- package/src/assets/amelipro/img/logo-amelipro.svg +9 -0
- package/src/assets/apTokens.scss +53 -17
- package/src/assets/overrides/_icons.scss +12 -2
- package/src/assets/overrides/_tooltips.scss +5 -6
- package/src/assets/overrides/_typography.scss +17 -2
- package/src/assets/overrides/_utilities.scss +49 -3
- package/src/assets/tokens.scss +53 -17
- package/src/components/Accordion/accessibilite/Accessibility.mdx +5 -4
- package/src/components/Amelipro/AmeliproAccordion/AmeliproAccordionTemplate/AmeliproAccordionTemplate.vue +2 -2
- package/src/components/Amelipro/AmeliproAccordion/AmeliproAccordionTemplate/__tests__/__snapshots__/AmeliproAccordionTemplate.spec.ts.snap +0 -2
- package/src/components/Amelipro/AmeliproAccordionFrieze/AmeliproAccordionFrieze.vue +2 -2
- package/src/components/Amelipro/AmeliproAccordionFrieze/__tests__/__snapshots__/AmeliproAccordionFrieze.spec.ts.snap +14 -56
- package/src/components/Amelipro/AmeliproAccordionList/AmeliproAccordionList.vue +1 -1
- package/src/components/Amelipro/AmeliproAccordionList/__tests__/__snapshots__/AmeliproAccordionList.spec.ts.snap +15 -23
- package/src/components/Amelipro/AmeliproAccordionResultList/AmeliproAccordionResultList.vue +1 -1
- package/src/components/Amelipro/AmeliproAccordionResultList/__tests__/__snapshots__/AmeliproAccordionResultList.spec.ts.snap +15 -3
- package/src/components/Amelipro/AmeliproCarousel/__tests__/__snapshots__/AmeliproCarousel.spec.ts.snap +0 -2
- package/src/components/Amelipro/AmeliproClickableTile/tests/__snapshots__/AmeliproClickableTile.spec.ts.snap +0 -98
- package/src/components/Amelipro/AmeliproContentLayout/AmeliproContentLayout.mdx +1 -1
- package/src/components/Amelipro/AmeliproContentLayout/AmeliproContentLayout.stories.ts +5 -16
- package/src/components/Amelipro/AmeliproCopyBtn/AmeliproCopyBtn.mdx +3 -1
- package/src/components/Amelipro/AmeliproCopyBtn/AmeliproCopyBtn.stories.ts +7 -0
- package/src/components/Amelipro/AmeliproDentalChart/AmeliproTooth/AmeliproTooth.vue +0 -1
- package/src/components/Amelipro/AmeliproDentalChart/AmeliproTooth/tests/__snapshots__/AmeliproTooth.spec.ts.snap +0 -1
- package/src/components/Amelipro/AmeliproDentalChart/tests/__snapshots__/AmeliproDentalChart.spec.ts.snap +0 -52
- package/src/components/Amelipro/AmeliproDialog/__tests__/__snapshots__/AmeliproDialog.spec.ts.snap +6 -0
- package/src/components/Amelipro/AmeliproErrorTemplate/AmeliproErrorTemplate.mdx +3 -1
- package/src/components/Amelipro/AmeliproErrorTemplate/AmeliproErrorTemplate.stories.ts +19 -0
- package/src/components/Amelipro/AmeliproErrorTemplate/AmeliproErrorTemplate.vue +2 -2
- package/src/components/Amelipro/AmeliproFirstLogin/AmeliproFirstLogin.vue +3 -4
- package/src/components/Amelipro/AmeliproFirstLogin/__tests__/__snapshots__/AmeliproFirstLogin.spec.ts.snap +2 -13
- package/src/components/Amelipro/AmeliproFooter/AmeliproFooter.mdx +3 -1
- package/src/components/Amelipro/AmeliproFooter/AmeliproFooter.stories.ts +7 -0
- package/src/components/Amelipro/AmeliproMenu/__tests__/__snapshots__/AmeliproMenu.spec.ts.snap +8 -0
- package/src/components/Amelipro/AmeliproPatientLogged/__tests__/__snapshots__/AmeliproPatientLogged.spec.ts.snap +9 -2
- package/src/components/Amelipro/AmeliproPostalAddressField/AmeliproPostalAddressCityRow/__tests__/__snapshots__/AmeliproPostalAddressCityRow.spec.ts.snap +28 -10
- package/src/components/Amelipro/AmeliproPostalAddressField/__tests__/__snapshots__/AmeliproPostalAddressField.spec.ts.snap +44 -8
- package/src/components/Amelipro/AmeliproResultList/AmeliproResultList.vue +1 -1
- package/src/components/Amelipro/AmeliproResultList/__tests__/__snapshots__/AmeliproResultList.spec.ts.snap +15 -3
- package/src/components/Amelipro/AmeliproTable/AmeliproTable.vue +1 -1
- package/src/components/Amelipro/AmeliproTable/__tests__/__snapshots__/AmeliproTable.spec.ts.snap +0 -1
- package/src/components/Amelipro/AmeliproTooltips/__tests__/__snapshots__/AmeliproTooltips.spec.ts.snap +6 -0
- package/src/components/Amelipro/AmeliproUpload/__tests__/__snapshots__/AmeliproUpload.spec.ts.snap +2 -4
- package/src/components/Amelipro/StructureMenu/StructureList/__tests__/__snapshots__/StructureList.spec.ts.snap +0 -2
- package/src/components/Amelipro/UserMenu/__tests__/__snapshots__/UserMenu.spec.ts.snap +8 -0
- package/src/components/BackBtn/BackBtn.vue +1 -1
- package/src/components/Captcha/tests/__snapshots__/Captcha.spec.ts.snap +36 -18
- package/src/components/ChipList/ChipList.vue +4 -2
- package/src/components/CollapsibleList/CollapsibleList.stories.ts +8 -3
- package/src/components/CollapsibleList/CollapsibleList.vue +14 -6
- package/src/components/CollapsibleList/accessibilite/Accessibility.mdx +19 -6
- package/src/components/CollapsibleList/tests/CollapsibleList.a11y.spec.ts +1 -0
- package/src/components/CollapsibleList/tests/CollapsibleList.spec.ts +2 -0
- package/src/components/CookieBanner/CookieBanner.stories.ts +10 -0
- package/src/components/CookieBanner/CookieBanner.vue +15 -5
- package/src/components/CookieBanner/accessibilite/Accessibility.mdx +9 -0
- package/src/components/CookieBanner/tests/CookieBanner.spec.ts +10 -2
- package/src/components/CookieBanner/tests/__snapshots__/CookieBanner.spec.ts.snap +21 -15
- package/src/components/CookiesSelection/CookiesInformation/CookiesInformation.vue +17 -8
- package/src/components/CookiesSelection/CookiesInformation/tests/CookiesInformation.a11y.spec.ts +1 -0
- package/src/components/CookiesSelection/CookiesInformation/tests/CookiesInformation.spec.ts +5 -0
- package/src/components/CookiesSelection/CookiesSelection.vue +7 -2
- package/src/components/CookiesSelection/tests/CookiesSelection.a11y.spec.ts +1 -0
- package/src/components/CookiesSelection/tests/CookiesSelection.spec.ts +5 -0
- package/src/components/CookiesSelection/tests/__snapshots__/CookiesSelection.spec.ts.snap +21 -15
- package/src/components/CopyBtn/CopyBtn.vue +6 -4
- package/src/components/CopyBtn/accessibilite/Accessibility.mdx +82 -11
- package/src/components/CopyBtn/tests/__snapshots__/CopyBtn.spec.ts.snap +5 -1
- package/src/components/Customs/Selects/SyInputSelect/SyInputSelect.stories.ts +4 -10
- package/src/components/Customs/Selects/SySelect/SySelect.mdx +0 -1
- package/src/components/Customs/Selects/SySelect/SySelect.stories.ts +10 -10
- package/src/components/Customs/Selects/SySelect/SySelect.vue +17 -0
- package/src/components/Customs/Selects/SySelect/composables/useSySelectKeyboard.ts +1 -1
- package/src/components/Customs/Selects/SySelect/tests/SySelect.a11y.spec.ts +1 -3
- package/src/components/Customs/Selects/SySelect/tests/SySelect.spec.ts +72 -0
- package/src/components/Customs/SyCheckbox/SyCheckbox.vue +1 -1
- package/src/components/Customs/SyIcon/SyIcon.a11y.spec.ts +31 -2
- package/src/components/Customs/SyIcon/SyIcon.vue +9 -5
- package/src/components/Customs/SyPagination/SyPagination.stories.ts +14 -2
- package/src/components/Customs/SyPagination/SyPagination.vue +20 -5
- package/src/components/Customs/SyPagination/accessibilite/Accessibility.mdx +79 -8
- package/src/components/Customs/SyPagination/tests/SyPagination.a11y.spec.ts +53 -0
- package/src/components/Customs/SyPagination/tests/SyPagination.spec.ts +12 -0
- package/src/components/Customs/SyTextField/SyTextField.stories.ts +4 -0
- package/src/components/Customs/SyTextField/SyTextField.vue +39 -5
- package/src/components/DatePicker/CalendarMode/DatePicker.stories.ts +28 -3
- package/src/components/DatePicker/CalendarMode/DatePicker.vue +20 -8
- package/src/components/DatePicker/CalendarMode/tests/DatePicker.spec.ts +9 -3
- package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.stories.ts +1 -1
- package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.vue +70 -47
- package/src/components/DatePicker/ComplexDatePicker/tests/ComplexDatePicker.a11y.spec.ts +34 -0
- package/src/components/DatePicker/DateTextInput/tests/DateTextInput.a11y.spec.ts +27 -0
- package/src/components/DatePicker/docExamples/BidirectionalComplexValidation.vue +23 -9
- package/src/components/DatePicker/docExamples/DatePickerBidirectionalValidation.vue +21 -8
- package/src/components/DatePicker/docExamples/DatePickerValidationExamples.vue +50 -22
- package/src/components/DatePicker/playground/ComplexDatePickerPlayground.vue +48 -10
- package/src/components/DatePicker/playground/DatePickerHolidayRule.vue +16 -3
- package/src/components/DialogBox/DialogBox.stories.ts +13 -0
- package/src/components/DialogBox/DialogBox.vue +12 -5
- package/src/components/DialogBox/accessibilite/Accessibility.mdx +27 -7
- package/src/components/DialogBox/tests/DialogBox.a11y.spec.ts +1 -0
- package/src/components/DialogBox/tests/DialogBox.spec.ts +40 -6
- package/src/components/DownloadBtn/accessibilite/Accessibility.mdx +73 -11
- package/src/components/DownloadBtn/config.ts +1 -1
- package/src/components/ErrorPage/ErrorPage.stories.ts +82 -47
- package/src/components/ErrorPage/ErrorPage.vue +6 -0
- package/src/components/ErrorPage/accessibilite/Accessibility.mdx +15 -0
- package/src/components/ErrorPage/tests/__snapshots__/ErrorPage.spec.ts.snap +2 -0
- package/src/components/ExternalLinks/tests/__snapshots__/ExternalLinks.spec.ts.snap +13 -2
- package/src/components/FileList/FileList.stories.ts +4 -0
- package/src/components/FileList/UploadItem/UploadItem.vue +8 -3
- package/src/components/FileList/UploadItem/locales.ts +10 -0
- package/src/components/FileList/accessibilite/Accessibility.mdx +55 -7
- package/src/components/FileUpload/FileUpload.vue +60 -37
- package/src/components/FileUpload/FileUploadContent.vue +1 -1
- package/src/components/FileUpload/accessibilite/Accessibility.mdx +48 -5
- package/src/components/FileUpload/locales.ts +1 -0
- package/src/components/FileUpload/tests/FileUpload.spec.ts +14 -14
- package/src/components/FilterInline/FilterInline.stories.ts +0 -15
- package/src/components/FilterInline/FilterInline.vue +1 -0
- package/src/components/FilterInline/accessibilite/Accessibility.mdx +70 -7
- package/src/components/FilterInline/tests/__snapshots__/FilterInline.spec.ts.snap +3 -3
- package/src/components/FilterSideBar/FilterSideBar.stories.ts +0 -3
- package/src/components/FilterSideBar/FilterSideBar.vue +2 -1
- package/src/components/FilterSideBar/accessibilite/Accessibility.mdx +70 -9
- package/src/components/FooterBar/FooterBar.stories.ts +298 -34
- package/src/components/FooterBar/FooterBar.vue +67 -9
- package/src/components/FooterBar/config.ts +2 -2
- package/src/components/FooterBar/locales.ts +1 -0
- package/src/components/FooterBar/tests/FooterBarConfig.spec.ts +1 -1
- package/src/components/FooterBar/tests/__snapshots__/FooterBar.spec.ts.snap +6 -25
- package/src/components/FooterBar/types.d.ts +1 -0
- package/src/components/HeaderBar/HeaderBar.stories.ts +23 -1
- package/src/components/HeaderBar/HeaderBar.vue +4 -0
- package/src/components/HeaderBar/HeaderLogo/HeaderLogo.vue +7 -2
- package/src/components/HeaderBar/HeaderLogo/tests/HeaderLogo.spec.ts +5 -0
- package/src/components/HeaderBar/accessibilite/Accessibility.mdx +24 -5
- package/src/components/HeaderBar/tests/HeaderBar.a11y.spec.ts +1 -0
- package/src/components/HeaderBar/tests/HeaderBar.spec.ts +3 -0
- package/src/components/HeaderNavigationBar/HeaderNavigationBar.stories.ts +4 -0
- package/src/components/HeaderNavigationBar/HeaderNavigationBar.vue +2 -0
- package/src/components/HeaderNavigationBar/tests/HeaderNavigationBar.spec.ts +3 -0
- package/src/components/LogoBrandSection/LogoBrandSection.stories.ts +22 -0
- package/src/components/LogoBrandSection/LogoBrandSection.vue +13 -5
- package/src/components/LogoBrandSection/tests/LogoBrandSection.a11y.spec.ts +2 -0
- package/src/components/LogoBrandSection/tests/LogoBrandSection.spec.ts +44 -0
- package/src/components/LogoBrandSection/tests/__snapshots__/LogoBrandSection.spec.ts.snap +2 -0
- package/src/components/MaintenancePage/MaintenancePage.vue +33 -6
- package/src/components/MaintenancePage/accessibilite/Accessibility.mdx +3 -1
- package/src/components/MaintenancePage/tests/MaintenancePage.a11y.spec.ts +3 -2
- package/src/components/MaintenancePage/tests/MaintenancePage.spec.ts +18 -0
- package/src/components/MaintenancePage/tests/__snapshots__/MaintenancePage.spec.ts.snap +2 -0
- package/src/components/NotFoundPage/NotFoundPage.stories.ts +1 -1
- package/src/components/NotFoundPage/NotFoundPage.vue +16 -5
- package/src/components/NotFoundPage/accessibilite/Accessibility.mdx +2 -0
- package/src/components/NotFoundPage/tests/NotFoundPage.a11y.spec.ts +49 -0
- package/src/components/NotFoundPage/tests/NotFoundPage.spec.ts +25 -2
- package/src/components/NotFoundPage/tests/__snapshots__/NotFoundPage.spec.ts.snap +2 -0
- package/src/components/PageContainer/PageContainer.stories.ts +47 -0
- package/src/components/PageContainer/PageContainer.vue +4 -2
- package/src/components/PageContainer/accessibilite/Accessibility.mdx +31 -17
- package/src/components/PaginatedTable/PaginatedTable.mdx +3 -3
- package/src/components/PaginatedTable/PaginatedTable.stories.ts +9 -1
- package/src/components/PeriodField/PeriodField.vue +4 -0
- package/src/components/PeriodField/tests/PeriodField.a11y.spec.ts +10 -1
- package/src/components/PhoneField/PhoneField.stories.ts +73 -35
- package/src/components/PhoneField/PhoneField.vue +152 -83
- package/src/components/PhoneField/accessibilite/Accessibility.mdx +306 -9
- package/src/components/PhoneField/indicatifs.ts +2 -2
- package/src/components/PhoneField/tests/PhoneField.a11y.spec.ts +47 -0
- package/src/components/PhoneField/tests/PhoneField.spec.ts +82 -5
- package/src/components/SearchListField/SearchListField.vue +1 -1
- package/src/components/SearchListField/accessibilite/Accessibility.mdx +69 -9
- package/src/components/SearchListField/tests/SearchListField.a11y.spec.ts +37 -0
- package/src/components/SocialMediaLinks/SocialMediaLinks.vue +1 -1
- package/src/components/StatusPage/StatusPage.mdx +10 -1
- package/src/components/StatusPage/StatusPage.stories.ts +43 -0
- package/src/components/StatusPage/StatusPage.vue +26 -4
- package/src/components/StatusPage/accessibilite/Accessibility.mdx +24 -5
- package/src/components/StatusPage/tests/StatusPage.a11y.spec.ts +1 -0
- package/src/components/StatusPage/tests/StatusPage.spec.ts +3 -0
- package/src/components/StatusPage/tests/__snapshots__/StatusPage.spec.ts.snap +2 -0
- package/src/components/SubHeader/SubHeader.stories.ts +16 -0
- package/src/components/SubHeader/SubHeader.vue +6 -3
- package/src/components/SubHeader/accessibilite/Accessibility.mdx +27 -6
- package/src/components/SyAlert/SyAlert.vue +21 -20
- package/src/components/SyBtnMenu/SyBtnMenu.vue +33 -17
- package/src/components/SyBtnMenu/tests/SyBtnMenu.a11y.spec.ts +38 -0
- package/src/components/SyBtnMenu/tests/SyBtnMenu.spec.ts +41 -0
- package/src/components/SyHeading/SyHeading.vue +18 -0
- package/src/components/TableToolbar/tests/__snapshots__/TableToolbar.spec.ts.snap +96 -30
- package/src/components/Tables/SyServerTable/SyServerTable.vue +2 -0
- package/src/components/Tables/SyTable/SyTable.vue +2 -0
- package/src/components/Tables/common/SyTablePagination.vue +16 -10
- package/src/components/Tables/common/filters/DateFilter.vue +5 -0
- package/src/components/Tables/common/tests/SyTablePagination.spec.ts +40 -24
- package/src/components/Tables/common/types.ts +3 -0
- package/src/components/UploadWorkflow/UploadWorkflow.stories.ts +11 -11
- package/src/components/UploadWorkflow/UploadWorkflow.vue +30 -13
- package/src/components/UploadWorkflow/accessibilite/Accessibility.mdx +56 -5
- package/src/components/UploadWorkflow/accessibilite/UploadWorkflow.a11y.spec.ts +110 -0
- package/src/components/UploadWorkflow/tests/UploadWorkflow.spec.ts +7 -25
- package/src/components/UploadWorkflow/tests/__snapshots__/UploadWorkflow.spec.ts.snap +144 -121
- package/src/components/UserMenuBtn/UserMenuBtn.stories.ts +53 -31
- package/src/components/UserMenuBtn/UserMenuBtn.vue +4 -1
- package/src/components/UserMenuBtn/accessibilite/Accessibility.mdx +72 -8
- package/src/components/index.ts +1 -0
- package/src/components/types.ts +4 -0
- package/src/composables/date/tests/useDateInitialization.spec.ts +22 -1
- package/src/composables/date/useDateInitializationDayjs.ts +4 -7
- package/src/composables/date/useDatePickerAccessibility.ts +2 -3
- package/src/composables/useFilterable/useFilterable.spec.ts +52 -2
- package/src/composables/useFilterable/useFilterable.ts +7 -1
- package/src/designTokens/tokens/amelipro/apLightTheme.ts +27 -15
- package/src/designTokens/tokens/amelipro/apSemantic.ts +21 -15
- package/src/designTokens/tokens/cnam/cnamLightTheme.ts +28 -15
- package/src/designTokens/tokens/cnam/cnamSemantic.ts +21 -14
- package/src/designTokens/tokens/pa/paLightTheme.ts +27 -16
- package/src/designTokens/tokens/pa/paSemantic.ts +19 -13
- package/src/directives/rgaaSvgFix.ts +2 -7
- package/src/stories/Accessibilite/{Audit → AuditEtContreAudit}/Exemptions-derogations.mdx +1 -1
- package/src/stories/Accessibilite/AuditEtContreAudit/Introduction.mdx +188 -0
- package/src/stories/Accessibilite/{Audit → AuditEtContreAudit}/RGAA.mdx +1 -1
- package/src/stories/Accessibilite/Introduction.mdx +22 -3
- package/src/stories/Accessibilite/KitDePreAudit/Introduction.mdx +21 -22
- package/src/stories/DeprecationNotice/DeprecationNotice.ts +41 -0
- package/src/stories/DesignTokens/ColorDisplay.vue +12 -5
- package/src/stories/DesignTokens/Colors.mdx +8 -59
- package/src/stories/DesignTokens/colors.stories.ts +1862 -1071
- package/src/stories/EcoConception/EcoGuideComponent.vue +10 -4
- package/dist/main-CWniLr0s.js +0 -36919
|
@@ -34,10 +34,12 @@
|
|
|
34
34
|
size?: string
|
|
35
35
|
}>()
|
|
36
36
|
|
|
37
|
+
const resolvedDecorative = computed(() => props.decorative ?? true)
|
|
38
|
+
|
|
37
39
|
// Configuration pour la directive rgaaSvgFix
|
|
38
40
|
const rgaaSvgFixConfig = computed(() => {
|
|
39
41
|
return {
|
|
40
|
-
isDecorative:
|
|
42
|
+
isDecorative: resolvedDecorative.value,
|
|
41
43
|
role: props.role,
|
|
42
44
|
autoDetectButton: props.autoDetectButton,
|
|
43
45
|
}
|
|
@@ -45,16 +47,16 @@
|
|
|
45
47
|
|
|
46
48
|
// Vérification à l'initialisation du composant
|
|
47
49
|
onMounted(() => {
|
|
48
|
-
checkAccessibility(props.icon,
|
|
50
|
+
checkAccessibility(props.icon, resolvedDecorative.value, props.label)
|
|
49
51
|
})
|
|
50
52
|
|
|
51
53
|
// Vérification à chaque changement des props concernées
|
|
52
54
|
watch(
|
|
53
55
|
[() => props.decorative, () => props.label, () => props.icon],
|
|
54
|
-
([
|
|
56
|
+
([, label, icon]) => {
|
|
55
57
|
checkAccessibility(
|
|
56
58
|
icon as string,
|
|
57
|
-
|
|
59
|
+
resolvedDecorative.value,
|
|
58
60
|
label as string | undefined,
|
|
59
61
|
)
|
|
60
62
|
},
|
|
@@ -66,7 +68,9 @@
|
|
|
66
68
|
v-rgaa-svg-fix="rgaaSvgFixConfig"
|
|
67
69
|
:color="props.color"
|
|
68
70
|
:size="props.size"
|
|
69
|
-
:
|
|
71
|
+
:role="props.role"
|
|
72
|
+
:aria-label="resolvedDecorative ? undefined : props.label"
|
|
73
|
+
:aria-hidden="resolvedDecorative ? 'true' : undefined"
|
|
70
74
|
>
|
|
71
75
|
{{ icon }}
|
|
72
76
|
</v-icon>
|
|
@@ -41,6 +41,10 @@ const meta: Meta<typeof SyPagination> = {
|
|
|
41
41
|
'append': {
|
|
42
42
|
description: 'Slot pour ajouter du contenu après la pagination',
|
|
43
43
|
},
|
|
44
|
+
'headingLevel': {
|
|
45
|
+
control: { type: 'select' },
|
|
46
|
+
options: [1, 2, 3, 4, 5, 6],
|
|
47
|
+
},
|
|
44
48
|
},
|
|
45
49
|
} as Meta<typeof SyPagination>
|
|
46
50
|
|
|
@@ -57,6 +61,7 @@ export const Default: Story = {
|
|
|
57
61
|
},
|
|
58
62
|
},
|
|
59
63
|
args: {
|
|
64
|
+
'headingLevel': 2,
|
|
60
65
|
'modelValue': 1,
|
|
61
66
|
'pages': 5,
|
|
62
67
|
'visible': 5,
|
|
@@ -74,6 +79,7 @@ export const Default: Story = {
|
|
|
74
79
|
<SyPagination
|
|
75
80
|
v-model="currentPage"
|
|
76
81
|
:pages="args.pages"
|
|
82
|
+
:headingLevel="args.headingLevel"
|
|
77
83
|
:visible="args.visible"
|
|
78
84
|
:label="args.label"
|
|
79
85
|
@update:model-value="args['onUpdate:modelValue']"
|
|
@@ -92,6 +98,7 @@ export const ManyPages: Story = {
|
|
|
92
98
|
},
|
|
93
99
|
},
|
|
94
100
|
args: {
|
|
101
|
+
'headingLevel': 2,
|
|
95
102
|
'modelValue': 5,
|
|
96
103
|
'pages': 20,
|
|
97
104
|
'visible': 5,
|
|
@@ -111,6 +118,7 @@ export const ManyPages: Story = {
|
|
|
111
118
|
:pages="args.pages"
|
|
112
119
|
:visible="args.visible"
|
|
113
120
|
:label="args.label"
|
|
121
|
+
:headingLevel="args.headingLevel"
|
|
114
122
|
@update:model-value="args['onUpdate:modelValue']"
|
|
115
123
|
/>
|
|
116
124
|
</div>
|
|
@@ -127,6 +135,7 @@ export const CustomButtons: Story = {
|
|
|
127
135
|
},
|
|
128
136
|
},
|
|
129
137
|
args: {
|
|
138
|
+
'headingLevel': 2,
|
|
130
139
|
'modelValue': 5,
|
|
131
140
|
'pages': 20,
|
|
132
141
|
'visible': 5,
|
|
@@ -145,6 +154,7 @@ export const CustomButtons: Story = {
|
|
|
145
154
|
v-model="currentPage"
|
|
146
155
|
:pages="args.pages"
|
|
147
156
|
:visible="args.visible"
|
|
157
|
+
:headingLevel="args.headingLevel"
|
|
148
158
|
:label="args.label"
|
|
149
159
|
@update:model-value="args['onUpdate:modelValue']"
|
|
150
160
|
>
|
|
@@ -175,6 +185,7 @@ export const Slots: Story = {
|
|
|
175
185
|
},
|
|
176
186
|
},
|
|
177
187
|
args: {
|
|
188
|
+
'headingLevel': 2,
|
|
178
189
|
'modelValue': 3,
|
|
179
190
|
'pages': 10,
|
|
180
191
|
'visible': 5,
|
|
@@ -186,11 +197,11 @@ export const Slots: Story = {
|
|
|
186
197
|
const currentPage = ref(args.modelValue)
|
|
187
198
|
const itemsPerPage = 10
|
|
188
199
|
const totalItems = 100
|
|
189
|
-
|
|
200
|
+
const headingLevel = 2
|
|
190
201
|
const startItem = computed(() => (currentPage.value - 1) * itemsPerPage + 1)
|
|
191
202
|
const endItem = computed(() => Math.min(currentPage.value * itemsPerPage, totalItems))
|
|
192
203
|
|
|
193
|
-
return { args, currentPage, totalItems, startItem, endItem }
|
|
204
|
+
return { args, currentPage, totalItems, startItem, endItem, headingLevel }
|
|
194
205
|
},
|
|
195
206
|
template: `
|
|
196
207
|
<div>
|
|
@@ -199,6 +210,7 @@ export const Slots: Story = {
|
|
|
199
210
|
:pages="args.pages"
|
|
200
211
|
:visible="args.visible"
|
|
201
212
|
:label="args.label"
|
|
213
|
+
:headingLevel="args.headingLevel"
|
|
202
214
|
@update:model-value="args['onUpdate:modelValue']"
|
|
203
215
|
>
|
|
204
216
|
<template #prepend>
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
<script setup lang="ts">
|
|
2
2
|
import { computed, ref } from 'vue'
|
|
3
|
+
import SyHeading from '@/components/SyHeading/SyHeading.vue'
|
|
3
4
|
|
|
4
5
|
// Props definition
|
|
5
|
-
const props = defineProps<{
|
|
6
|
+
const props = withDefaults(defineProps<{
|
|
6
7
|
/**
|
|
7
8
|
* Current page number
|
|
8
9
|
*/
|
|
@@ -23,7 +24,18 @@
|
|
|
23
24
|
* ID of the element controlled by this pagination
|
|
24
25
|
*/
|
|
25
26
|
ariaControls?: string
|
|
26
|
-
|
|
27
|
+
/**
|
|
28
|
+
* Heading level for the pagination label (for accessibility)
|
|
29
|
+
*/
|
|
30
|
+
headingLevel?: 1 | 2 | 3 | 4 | 5 | 6
|
|
31
|
+
|
|
32
|
+
}>(), {
|
|
33
|
+
pages: undefined,
|
|
34
|
+
visible: undefined,
|
|
35
|
+
label: undefined,
|
|
36
|
+
ariaControls: undefined,
|
|
37
|
+
headingLevel: 2,
|
|
38
|
+
})
|
|
27
39
|
|
|
28
40
|
// Default values for optional props
|
|
29
41
|
const visiblePages = computed(() => props.visible || 5)
|
|
@@ -187,12 +199,13 @@
|
|
|
187
199
|
:aria-labelledby="uniqueId"
|
|
188
200
|
:aria-controls="ariaControls"
|
|
189
201
|
>
|
|
190
|
-
<
|
|
202
|
+
<SyHeading
|
|
191
203
|
:id="uniqueId"
|
|
192
204
|
class="d-sr-only"
|
|
205
|
+
:level="headingLevel"
|
|
193
206
|
>
|
|
194
207
|
{{ `${label}` }}
|
|
195
|
-
</
|
|
208
|
+
</SyHeading>
|
|
196
209
|
<ul class="list">
|
|
197
210
|
<!-- First page button (optional) -->
|
|
198
211
|
<li v-if="$slots['first-page']">
|
|
@@ -390,7 +403,9 @@
|
|
|
390
403
|
}
|
|
391
404
|
|
|
392
405
|
&.disabled {
|
|
393
|
-
color: rgb(0 0 0 / 60%);
|
|
406
|
+
color: rgb(0 0 0 / 60%);
|
|
407
|
+
|
|
408
|
+
/* Increased from 40% to 60% for better contrast */
|
|
394
409
|
border-color: rgb(0 0 0 / 20%);
|
|
395
410
|
pointer-events: none;
|
|
396
411
|
}
|
|
@@ -1,10 +1,81 @@
|
|
|
1
|
-
import { Meta,
|
|
2
|
-
import * as
|
|
3
|
-
import '@/
|
|
1
|
+
import { Meta, Primary } from '@storybook/blocks';
|
|
2
|
+
import * as SyPaginationStories from '../SyPagination.stories';
|
|
3
|
+
import AccessibilityIcon from '@/common/imgs/accessibility-svgrepo-com.svg';
|
|
4
|
+
import {
|
|
5
|
+
AccessibilityGuideLayout,
|
|
6
|
+
CriteriaSection,
|
|
7
|
+
CriteriaCard,
|
|
8
|
+
DemoSection,
|
|
9
|
+
BestPracticesSection,
|
|
10
|
+
ResourcesSection,
|
|
11
|
+
} from '@/stories/accessibility/AccessibilityGuideLayout.mdx';
|
|
4
12
|
|
|
5
|
-
<Meta of={
|
|
13
|
+
<Meta of={SyPaginationStories} />
|
|
6
14
|
|
|
7
|
-
<
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
15
|
+
<AccessibilityGuideLayout
|
|
16
|
+
componentName="SyPagination"
|
|
17
|
+
iconSrc={AccessibilityIcon}
|
|
18
|
+
>
|
|
19
|
+
<CriteriaSection>
|
|
20
|
+
<CriteriaCard icon="🧩" title="Niveau de titre configurable via la prop headingLevel">
|
|
21
|
+
<ul>
|
|
22
|
+
<li>Le niveau du titre (h1 à h6) est défini grâce à la propriété <strong>headingLevel</strong> déclarée dans le composant. Si aucune valeur n’est fournie, le composant applique par défaut un titre de niveau h2, défini dans l’implémentation du composant.</li>
|
|
23
|
+
<code><SyPagination
|
|
24
|
+
:heading-level="2" /> </code>
|
|
25
|
+
|
|
26
|
+
<li><strong>Accessibilité</strong> : Permet que la hiérarchie entre les titres soit pertinente (critère 9.1.1 RGAA) </li>
|
|
27
|
+
</ul>
|
|
28
|
+
</CriteriaCard>
|
|
29
|
+
<CriteriaCard icon="🔍" title="Structure sémantique">
|
|
30
|
+
<ul>
|
|
31
|
+
<li><strong>Zone de navigation</strong> : utilisation de <code><nav></code> et <code><ul></code> pour structurer la pagination.</li>
|
|
32
|
+
<li><strong>Nom accessible</strong> : titre <code><h2></code> caché (classe <code>d-sr-only</code>) relié au <code>nav</code> via <code>aria-labelledby</code>; libellé personnalisable avec la prop <code>label</code> (par défaut « Pagination »).</li>
|
|
33
|
+
<li><strong>Association au contenu</strong> : prise en charge de <code>aria-controls</code> pour relier la pagination à la zone paginée.</li>
|
|
34
|
+
<li><strong>Page active</strong> : l’attribut <code>aria-current="page"</code> est appliqué au lien de la page courante.</li>
|
|
35
|
+
</ul>
|
|
36
|
+
</CriteriaCard>
|
|
37
|
+
|
|
38
|
+
<CriteriaCard icon="⌨️" title="Navigation clavier">
|
|
39
|
+
<ul>
|
|
40
|
+
<li><strong>Tabulation</strong> : l’ordre de tab suit la séquence logique (Précédent → numéros → Suivant).</li>
|
|
41
|
+
<li><strong>Activation</strong> : les liens de pagination se déclenchent à l’Entrée (ou Espace selon le navigateur).</li>
|
|
42
|
+
<li><strong>Focus visible</strong> : le focus natif reste apparent sur les liens (<code><a></code>).</li>
|
|
43
|
+
</ul>
|
|
44
|
+
</CriteriaCard>
|
|
45
|
+
|
|
46
|
+
<CriteriaCard icon="📱" title="États et retours d’information">
|
|
47
|
+
<ul>
|
|
48
|
+
<li><strong>Boutons indisponibles</strong> : <code>aria-disabled="true"</code> est ajouté sur « Précédent » / « Suivant » / premières/dernières pages lorsque non actionnables.</li>
|
|
49
|
+
<li><strong>Ellipses non interactives</strong> : les séparateurs « … » sont rendus non cliquables pour éviter la confusion.</li>
|
|
50
|
+
</ul>
|
|
51
|
+
</CriteriaCard>
|
|
52
|
+
|
|
53
|
+
<CriteriaCard icon="🎨" title="Personnalisation accessible">
|
|
54
|
+
<ul>
|
|
55
|
+
<li>Slots pour <code>first-page</code>, <code>previous</code>, <code>next</code>, <code>last-page</code> et <code>page-number</code> afin d’adapter les libellés ou ajouter des icônes.</li>
|
|
56
|
+
<li>Possibilité d’ajouter du contexte via <code>prepend</code> / <code>append</code> (ex. compteur « Éléments 21-40 sur 200 »).</li>
|
|
57
|
+
</ul>
|
|
58
|
+
</CriteriaCard>
|
|
59
|
+
</CriteriaSection>
|
|
60
|
+
|
|
61
|
+
<DemoSection componentName="SyPagination">
|
|
62
|
+
<Primary />
|
|
63
|
+
</DemoSection>
|
|
64
|
+
|
|
65
|
+
<BestPracticesSection>
|
|
66
|
+
<ul>
|
|
67
|
+
<li>Renseigner un <strong>label</strong> explicite (ex. « Pagination des résultats de recherche ») pour nommer la navigation.</li>
|
|
68
|
+
<li>Relier la pagination à la zone de contenu avec <code>aria-controls</code> et un <code>id</code> stable sur le conteneur paginé.</li>
|
|
69
|
+
<li>Conserver des libellés textuels même si des icônes sont utilisées dans les slots (ou ajouter du texte masqué).</li>
|
|
70
|
+
<li>S’assurer d’un <strong>contraste suffisant</strong> et d’une taille de cible d’au moins 44px pour les liens.</li>
|
|
71
|
+
<li>Limiter le nombre de pages affichées en choisissant un <code>visible</code> adapté et en gardant des libellés courts.</li>
|
|
72
|
+
</ul>
|
|
73
|
+
</BestPracticesSection>
|
|
74
|
+
|
|
75
|
+
<ResourcesSection>
|
|
76
|
+
<ul>
|
|
77
|
+
<li><a href="https://www.w3.org/TR/wai-aria-1.2/#navigation" target="_blank" rel="noopener noreferrer">Rôle ARIA « navigation »</a></li>
|
|
78
|
+
<li><a href="https://www.w3.org/WAI/WCAG21/quickref/#navigation-mechanisms-headings-and-labels" target="_blank" rel="noopener noreferrer">WCAG 2.4 - Mécanismes de navigation</a></li>
|
|
79
|
+
</ul>
|
|
80
|
+
</ResourcesSection>
|
|
81
|
+
</AccessibilityGuideLayout>
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
// @vitest-environment jsdom
|
|
2
|
+
|
|
3
|
+
import { afterEach, beforeEach, 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 SyPagination from '../SyPagination.vue'
|
|
8
|
+
|
|
9
|
+
describe('SyPagination – accessibility (axe)', () => {
|
|
10
|
+
beforeEach(() => {
|
|
11
|
+
const content = document.createElement('div')
|
|
12
|
+
content.id = 'paginated-content'
|
|
13
|
+
document.body.appendChild(content)
|
|
14
|
+
})
|
|
15
|
+
|
|
16
|
+
afterEach(() => {
|
|
17
|
+
document.body.innerHTML = ''
|
|
18
|
+
})
|
|
19
|
+
|
|
20
|
+
const baseProps = {
|
|
21
|
+
modelValue: 1,
|
|
22
|
+
pages: 5,
|
|
23
|
+
visible: 5,
|
|
24
|
+
ariaControls: 'paginated-content',
|
|
25
|
+
label: 'Pagination des résultats',
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
it('has no obvious axe violations on default pagination', async () => {
|
|
29
|
+
const wrapper = mount(SyPagination, {
|
|
30
|
+
props: baseProps,
|
|
31
|
+
attachTo: document.body,
|
|
32
|
+
})
|
|
33
|
+
const results = await axe(document.body)
|
|
34
|
+
assertNoA11yViolations(results, 'SyPagination – default')
|
|
35
|
+
wrapper.unmount()
|
|
36
|
+
})
|
|
37
|
+
|
|
38
|
+
it('has no obvious axe violations with ellipses and disabled controls', async () => {
|
|
39
|
+
const wrapper = mount(SyPagination, {
|
|
40
|
+
props: {
|
|
41
|
+
modelValue: 1,
|
|
42
|
+
pages: 10,
|
|
43
|
+
visible: 3,
|
|
44
|
+
ariaControls: 'paginated-content',
|
|
45
|
+
label: 'Pagination ellipses',
|
|
46
|
+
},
|
|
47
|
+
attachTo: document.body,
|
|
48
|
+
})
|
|
49
|
+
const results = await axe(document.body)
|
|
50
|
+
assertNoA11yViolations(results, 'SyPagination – ellipsis variant')
|
|
51
|
+
wrapper.unmount()
|
|
52
|
+
})
|
|
53
|
+
})
|
|
@@ -6,6 +6,7 @@ describe('SyPagination', () => {
|
|
|
6
6
|
it('renders correctly with default props', () => {
|
|
7
7
|
const wrapper = mount(SyPagination, {
|
|
8
8
|
props: {
|
|
9
|
+
headingLevel: 2,
|
|
9
10
|
modelValue: 1,
|
|
10
11
|
pages: 10,
|
|
11
12
|
},
|
|
@@ -20,6 +21,7 @@ describe('SyPagination', () => {
|
|
|
20
21
|
it('does not render pagination if pages is 1', () => {
|
|
21
22
|
const wrapper = mount(SyPagination, {
|
|
22
23
|
props: {
|
|
24
|
+
headingLevel: 2,
|
|
23
25
|
modelValue: 1,
|
|
24
26
|
pages: 1,
|
|
25
27
|
},
|
|
@@ -31,6 +33,7 @@ describe('SyPagination', () => {
|
|
|
31
33
|
it('emits update:modelValue when page is changed', async () => {
|
|
32
34
|
const wrapper = mount(SyPagination, {
|
|
33
35
|
props: {
|
|
36
|
+
headingLevel: 2,
|
|
34
37
|
modelValue: 1,
|
|
35
38
|
pages: 10,
|
|
36
39
|
},
|
|
@@ -58,6 +61,7 @@ describe('SyPagination', () => {
|
|
|
58
61
|
it('disables previous button on first page', () => {
|
|
59
62
|
const wrapper = mount(SyPagination, {
|
|
60
63
|
props: {
|
|
64
|
+
headingLevel: 2,
|
|
61
65
|
modelValue: 1,
|
|
62
66
|
pages: 10,
|
|
63
67
|
},
|
|
@@ -70,6 +74,7 @@ describe('SyPagination', () => {
|
|
|
70
74
|
it('disables next button on last page', () => {
|
|
71
75
|
const wrapper = mount(SyPagination, {
|
|
72
76
|
props: {
|
|
77
|
+
headingLevel: 2,
|
|
73
78
|
modelValue: 10,
|
|
74
79
|
pages: 10,
|
|
75
80
|
},
|
|
@@ -82,6 +87,7 @@ describe('SyPagination', () => {
|
|
|
82
87
|
it('shows correct aria-current attribute', () => {
|
|
83
88
|
const wrapper = mount(SyPagination, {
|
|
84
89
|
props: {
|
|
90
|
+
headingLevel: 2,
|
|
85
91
|
modelValue: 3,
|
|
86
92
|
pages: 10,
|
|
87
93
|
},
|
|
@@ -94,6 +100,7 @@ describe('SyPagination', () => {
|
|
|
94
100
|
it('respects visible prop for number of visible pages', () => {
|
|
95
101
|
const wrapper = mount(SyPagination, {
|
|
96
102
|
props: {
|
|
103
|
+
headingLevel: 2,
|
|
97
104
|
modelValue: 5,
|
|
98
105
|
pages: 10,
|
|
99
106
|
visible: 3,
|
|
@@ -113,6 +120,7 @@ describe('SyPagination', () => {
|
|
|
113
120
|
it('uses custom label when provided', () => {
|
|
114
121
|
const wrapper = mount(SyPagination, {
|
|
115
122
|
props: {
|
|
123
|
+
headingLevel: 2,
|
|
116
124
|
modelValue: 1,
|
|
117
125
|
pages: 10,
|
|
118
126
|
label: 'Test Pagination',
|
|
@@ -125,6 +133,7 @@ describe('SyPagination', () => {
|
|
|
125
133
|
it('sets aria-controls when provided', () => {
|
|
126
134
|
const wrapper = mount(SyPagination, {
|
|
127
135
|
props: {
|
|
136
|
+
headingLevel: 2,
|
|
128
137
|
modelValue: 1,
|
|
129
138
|
pages: 10,
|
|
130
139
|
ariaControls: 'test-content',
|
|
@@ -137,6 +146,7 @@ describe('SyPagination', () => {
|
|
|
137
146
|
it('uses d-sr-only class for screen reader text', () => {
|
|
138
147
|
const wrapper = mount(SyPagination, {
|
|
139
148
|
props: {
|
|
149
|
+
headingLevel: 2,
|
|
140
150
|
modelValue: 1,
|
|
141
151
|
pages: 10,
|
|
142
152
|
},
|
|
@@ -149,6 +159,7 @@ describe('SyPagination', () => {
|
|
|
149
159
|
it('shows start ellipsis when current page is far from first page', () => {
|
|
150
160
|
const wrapper = mount(SyPagination, {
|
|
151
161
|
props: {
|
|
162
|
+
headingLevel: 2,
|
|
152
163
|
modelValue: 8, // Current page far from first page
|
|
153
164
|
pages: 10,
|
|
154
165
|
visible: 3, // Small visible count to ensure ellipsis appears
|
|
@@ -163,6 +174,7 @@ describe('SyPagination', () => {
|
|
|
163
174
|
it('shows both ellipses when current page is in the middle of a large range', () => {
|
|
164
175
|
const wrapper = mount(SyPagination, {
|
|
165
176
|
props: {
|
|
177
|
+
headingLevel: 2,
|
|
166
178
|
modelValue: 10, // Middle page
|
|
167
179
|
pages: 20,
|
|
168
180
|
visible: 3, // Small visible count to ensure ellipsis appears
|
|
@@ -185,6 +185,10 @@ const meta = {
|
|
|
185
185
|
description: 'Texte d\'aide affiché sous le champ',
|
|
186
186
|
control: 'text',
|
|
187
187
|
},
|
|
188
|
+
'maxlength': {
|
|
189
|
+
description: 'Nombre maximal de caractères autorisés dans le champ',
|
|
190
|
+
control: { type: 'text' },
|
|
191
|
+
},
|
|
188
192
|
'loading': {
|
|
189
193
|
description: 'Affiche un indicateur de chargement',
|
|
190
194
|
control: 'boolean',
|
|
@@ -90,6 +90,8 @@
|
|
|
90
90
|
disableClickButton?: boolean
|
|
91
91
|
autocomplete?: string
|
|
92
92
|
helpText?: string
|
|
93
|
+
maxlength?: string | number
|
|
94
|
+
title?: string | false
|
|
93
95
|
}>(),
|
|
94
96
|
{
|
|
95
97
|
modelValue: undefined,
|
|
@@ -159,6 +161,8 @@
|
|
|
159
161
|
disableClickButton: true,
|
|
160
162
|
autocomplete: 'off',
|
|
161
163
|
helpText: '',
|
|
164
|
+
maxlength: undefined,
|
|
165
|
+
title: undefined,
|
|
162
166
|
},
|
|
163
167
|
)
|
|
164
168
|
|
|
@@ -173,6 +177,8 @@
|
|
|
173
177
|
|
|
174
178
|
const emit = defineEmits([
|
|
175
179
|
'update:modelValue',
|
|
180
|
+
'input',
|
|
181
|
+
'keydown',
|
|
176
182
|
'clear',
|
|
177
183
|
'prepend-icon-click',
|
|
178
184
|
'append-icon-click',
|
|
@@ -197,6 +203,11 @@
|
|
|
197
203
|
Object.entries(attrs).filter(([key]) => key !== 'display-asterisk'),
|
|
198
204
|
) as Record<string, unknown>
|
|
199
205
|
|
|
206
|
+
// aria-controls coming from menu activators is invalid on the input itself; drop it
|
|
207
|
+
if ('aria-controls' in filteredAttrs) {
|
|
208
|
+
delete filteredAttrs['aria-controls']
|
|
209
|
+
}
|
|
210
|
+
|
|
200
211
|
if (!('validate-on' in filteredAttrs) && 'rules' in filteredAttrs && props.isValidateOnBlur) {
|
|
201
212
|
filteredAttrs['validate-on'] = 'blur lazy'
|
|
202
213
|
}
|
|
@@ -300,7 +311,11 @@
|
|
|
300
311
|
}
|
|
301
312
|
})
|
|
302
313
|
|
|
303
|
-
const hasError = computed(() =>
|
|
314
|
+
const hasError = computed(() =>
|
|
315
|
+
validation.hasError.value
|
|
316
|
+
|| (props.errorMessages?.length ?? 0) > 0
|
|
317
|
+
|| props.hasError,
|
|
318
|
+
)
|
|
304
319
|
const hasWarning = computed(() => validation.hasWarning.value || props.hasWarning)
|
|
305
320
|
const hasSuccess = computed(() => ((validation.hasSuccess.value && !hasError.value && !hasWarning.value) || props.hasSuccess) && props.showSuccessMessages)
|
|
306
321
|
|
|
@@ -355,7 +370,13 @@
|
|
|
355
370
|
return props.helpText && hasMessages.value && !props.areDetailsHidden
|
|
356
371
|
})
|
|
357
372
|
|
|
358
|
-
//
|
|
373
|
+
// Use title prop if provided, otherwise fall back to accessible label
|
|
374
|
+
const titleValue = computed(() => {
|
|
375
|
+
// If title is explicitly false, don't show any title
|
|
376
|
+
if (props.title === false) return undefined
|
|
377
|
+
// Otherwise use title if provided, or accessibleLabel as fallback
|
|
378
|
+
return props.title || accessibleLabel.value
|
|
379
|
+
})
|
|
359
380
|
const accessibleLabel = computed(() => {
|
|
360
381
|
let label = labelWithAsterisk.value
|
|
361
382
|
|
|
@@ -449,7 +470,12 @@
|
|
|
449
470
|
const describedbyIds = existingIds.join(' ').trim()
|
|
450
471
|
|
|
451
472
|
// Associate input with messages via aria-describedby (preserve existing IDs)
|
|
452
|
-
|
|
473
|
+
if (describedbyIds) {
|
|
474
|
+
inputElement.setAttribute('aria-describedby', describedbyIds)
|
|
475
|
+
}
|
|
476
|
+
else {
|
|
477
|
+
inputElement.removeAttribute('aria-describedby')
|
|
478
|
+
}
|
|
453
479
|
|
|
454
480
|
// Remove problematic ARIA attributes from details container (parent)
|
|
455
481
|
if (detailsContainer) {
|
|
@@ -517,7 +543,12 @@
|
|
|
517
543
|
const describedbyIds = existingIds.join(' ').trim()
|
|
518
544
|
|
|
519
545
|
// Associate input with messages via aria-describedby (preserve existing IDs)
|
|
520
|
-
|
|
546
|
+
if (describedbyIds) {
|
|
547
|
+
inputElement.setAttribute('aria-describedby', describedbyIds)
|
|
548
|
+
}
|
|
549
|
+
else {
|
|
550
|
+
inputElement.removeAttribute('aria-describedby')
|
|
551
|
+
}
|
|
521
552
|
|
|
522
553
|
// Remove problematic ARIA attributes from details container (parent)
|
|
523
554
|
if (detailsContainer) {
|
|
@@ -579,7 +610,7 @@
|
|
|
579
610
|
v-model="model"
|
|
580
611
|
:autocomplete="props.autocomplete"
|
|
581
612
|
:active="props.isActive"
|
|
582
|
-
:title="
|
|
613
|
+
:title="titleValue"
|
|
583
614
|
:aria-label="accessibleLabel"
|
|
584
615
|
:aria-required="props.required ? 'true' : undefined"
|
|
585
616
|
:base-color="props.baseColor"
|
|
@@ -600,6 +631,7 @@
|
|
|
600
631
|
:hint="showHelpTextAsMessage ? props.helpText : props.hint"
|
|
601
632
|
:label="labelWithAsterisk"
|
|
602
633
|
:loading="props.loading"
|
|
634
|
+
:maxlength="props.maxlength"
|
|
603
635
|
:max-errors="props.maxErrors"
|
|
604
636
|
:max-width="props.maxWidth"
|
|
605
637
|
:messages="hasError ? errors : (hasWarning ? warnings : (hasSuccess && props.showSuccessMessages ? successes : []))"
|
|
@@ -630,6 +662,8 @@
|
|
|
630
662
|
'basic-field': !hasError && !hasWarning && !hasSuccess
|
|
631
663
|
}"
|
|
632
664
|
@blur="checkErrorOnBlur"
|
|
665
|
+
@input="(e: Event) => emit('input', e)"
|
|
666
|
+
@keydown="(e: KeyboardEvent) => emit('keydown', e)"
|
|
633
667
|
>
|
|
634
668
|
<!-- Prepend -->
|
|
635
669
|
<template
|
|
@@ -38,6 +38,10 @@ const meta = {
|
|
|
38
38
|
},
|
|
39
39
|
},
|
|
40
40
|
argTypes: {
|
|
41
|
+
'headingLevel': {
|
|
42
|
+
control: { type: 'select' },
|
|
43
|
+
options: [1, 2, 3, 4, 5, 6],
|
|
44
|
+
},
|
|
41
45
|
'onUpdate:modelValue': {
|
|
42
46
|
description: 'Émis lorsque la valeur du champ est mise à jour',
|
|
43
47
|
table: {
|
|
@@ -345,6 +349,7 @@ export const Default: Story = {
|
|
|
345
349
|
],
|
|
346
350
|
},
|
|
347
351
|
args: {
|
|
352
|
+
'headingLevel': 3,
|
|
348
353
|
'placeholder': 'Sélectionner une date',
|
|
349
354
|
'format': 'DD/MM/YYYY',
|
|
350
355
|
'isBirthDate': false,
|
|
@@ -417,6 +422,7 @@ export const Required: Story = {
|
|
|
417
422
|
],
|
|
418
423
|
},
|
|
419
424
|
args: {
|
|
425
|
+
'headingLevel': 3,
|
|
420
426
|
'placeholder': 'Sélectionner une date',
|
|
421
427
|
'format': 'DD/MM/YYYY',
|
|
422
428
|
'isBirthDate': false,
|
|
@@ -489,6 +495,7 @@ export const DateRange: Story = {
|
|
|
489
495
|
],
|
|
490
496
|
},
|
|
491
497
|
args: {
|
|
498
|
+
'headingLevel': 3,
|
|
492
499
|
'placeholder': 'Sélectionner une période',
|
|
493
500
|
'label': 'Sélectionner une période',
|
|
494
501
|
'format': 'DD/MM/YYYY',
|
|
@@ -575,6 +582,7 @@ export const WithCustomPeriod: Story = {
|
|
|
575
582
|
],
|
|
576
583
|
},
|
|
577
584
|
args: {
|
|
585
|
+
'headingLevel': 3,
|
|
578
586
|
'placeholder': 'Sélectionner une date',
|
|
579
587
|
'format': 'DD/MM/YYYY',
|
|
580
588
|
'isBirthDate': false,
|
|
@@ -671,6 +679,7 @@ export const WithAppendIcon: Story = {
|
|
|
671
679
|
],
|
|
672
680
|
},
|
|
673
681
|
args: {
|
|
682
|
+
'headingLevel': 3,
|
|
674
683
|
'placeholder': 'Sélectionner une date',
|
|
675
684
|
'format': 'DD/MM/YYYY',
|
|
676
685
|
'dateFormatReturn': '',
|
|
@@ -738,6 +747,7 @@ export const WithoutIcon: Story = {
|
|
|
738
747
|
],
|
|
739
748
|
},
|
|
740
749
|
args: {
|
|
750
|
+
'headingLevel': 3,
|
|
741
751
|
'placeholder': 'Sélectionner une date',
|
|
742
752
|
'format': 'DD/MM/YYYY',
|
|
743
753
|
'dateFormatReturn': '',
|
|
@@ -805,6 +815,7 @@ export const BirthDate: Story = {
|
|
|
805
815
|
],
|
|
806
816
|
},
|
|
807
817
|
args: {
|
|
818
|
+
'headingLevel': 3,
|
|
808
819
|
'placeholder': 'Date de naissance',
|
|
809
820
|
'format': 'DD/MM/YYYY',
|
|
810
821
|
'dateFormatReturn': '',
|
|
@@ -873,6 +884,7 @@ export const WithError: Story = {
|
|
|
873
884
|
],
|
|
874
885
|
},
|
|
875
886
|
args: {
|
|
887
|
+
'headingLevel': 3,
|
|
876
888
|
'placeholder': 'Sélectionner une date',
|
|
877
889
|
'format': 'DD/MM/YYYY',
|
|
878
890
|
'dateFormatReturn': '',
|
|
@@ -948,6 +960,7 @@ export const WithWarning: Story = {
|
|
|
948
960
|
],
|
|
949
961
|
},
|
|
950
962
|
args: {
|
|
963
|
+
'headingLevel': 3,
|
|
951
964
|
'placeholder': 'Date avec avertissement',
|
|
952
965
|
'format': 'DD/MM/YYYY',
|
|
953
966
|
'dateFormatReturn': '',
|
|
@@ -1026,6 +1039,7 @@ export const WithSuccess: Story = {
|
|
|
1026
1039
|
],
|
|
1027
1040
|
},
|
|
1028
1041
|
args: {
|
|
1042
|
+
'headingLevel': 3,
|
|
1029
1043
|
'placeholder': 'Date valide',
|
|
1030
1044
|
'format': 'DD/MM/YYYY',
|
|
1031
1045
|
'dateFormatReturn': '',
|
|
@@ -1222,6 +1236,7 @@ export const WithDateFormatReturn: Story = {
|
|
|
1222
1236
|
],
|
|
1223
1237
|
},
|
|
1224
1238
|
args: {
|
|
1239
|
+
'headingLevel': 3,
|
|
1225
1240
|
'placeholder': 'Sélectionner une date',
|
|
1226
1241
|
'format': 'DD/MM/YYYY',
|
|
1227
1242
|
'dateFormatReturn': '',
|
|
@@ -1333,6 +1348,7 @@ export const WithDayjsFormat: Story = {
|
|
|
1333
1348
|
],
|
|
1334
1349
|
},
|
|
1335
1350
|
args: {
|
|
1351
|
+
headingLevel: 3,
|
|
1336
1352
|
placeholder: 'Sélectionner une date',
|
|
1337
1353
|
format: 'DD/MM/YYYY',
|
|
1338
1354
|
isBirthDate: false,
|
|
@@ -1465,6 +1481,7 @@ export const UTC: Story = {
|
|
|
1465
1481
|
],
|
|
1466
1482
|
},
|
|
1467
1483
|
args: {
|
|
1484
|
+
'headingLevel': 3,
|
|
1468
1485
|
'placeholder': 'Sélectionner une date',
|
|
1469
1486
|
'format': 'DD/MM/YYYY',
|
|
1470
1487
|
'dateFormatReturn': '',
|
|
@@ -1496,12 +1513,20 @@ export const UTC: Story = {
|
|
|
1496
1513
|
|
|
1497
1514
|
const dateString = computed({
|
|
1498
1515
|
get() {
|
|
1499
|
-
return dayjs.utc(utcIso.value).
|
|
1516
|
+
return dayjs.utc(utcIso.value).format(DISPLAY_FORMAT.value)
|
|
1500
1517
|
},
|
|
1501
1518
|
set(v: string) {
|
|
1502
|
-
const parsed = dayjs.
|
|
1519
|
+
const parsed = dayjs.utc(v, DISPLAY_FORMAT.value, true)
|
|
1503
1520
|
if (!parsed.isValid() || parsed.format(DISPLAY_FORMAT.value) !== v) return
|
|
1504
|
-
utcIso.value =
|
|
1521
|
+
utcIso.value = dayjs.utc()
|
|
1522
|
+
.year(parsed.year())
|
|
1523
|
+
.month(parsed.month())
|
|
1524
|
+
.date(parsed.date())
|
|
1525
|
+
.hour(0)
|
|
1526
|
+
.minute(0)
|
|
1527
|
+
.second(0)
|
|
1528
|
+
.millisecond(0)
|
|
1529
|
+
.toISOString()
|
|
1505
1530
|
args['onUpdate:modelValue']?.(v)
|
|
1506
1531
|
},
|
|
1507
1532
|
})
|