@cnamts/synapse 1.0.20 → 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-XURUmpMl.js → DateFilter-B5n-ZkLi.js} +29 -24
- package/dist/{NumberFilter-BZc0O8wV.js → NumberFilter-CtiZ9uj8.js} +1 -1
- package/dist/{PeriodFilter-ZNdXcl3p.js → PeriodFilter-DzqiMb-b.js} +1 -1
- package/dist/{SelectFilter-DshYU5OK.js → SelectFilter-BOYlF7rX.js} +1 -1
- package/dist/{TextFilter-D_c5dRPl.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 +162 -0
- package/dist/components/Customs/SyCheckBoxGroup/locales.d.ts +3 -0
- package/dist/components/Customs/SyCheckBoxGroup/types.d.ts +10 -0
- package/dist/components/Customs/SyCheckbox/SyCheckbox.d.ts +1668 -5
- 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 +1609 -4
- 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/DeclarationAccessibilityPage/DeclarationAccessibilityPage.d.ts +60 -0
- 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 +5 -12
- package/dist/components/ErrorPage/locales.d.ts +18 -3
- package/dist/components/FileList/UploadItem/locales.d.ts +4 -0
- package/dist/components/FileUpload/FileUpload.d.ts +6 -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/MaintenancePage/locales.d.ts +18 -2
- package/dist/components/NirField/NirField.d.ts +1659 -1371
- package/dist/components/NotFoundPage/NotFoundPage.d.ts +9 -3
- package/dist/components/NotFoundPage/locales.d.ts +20 -4
- 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 +50 -0
- 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 +35 -1212
- package/dist/components/UserMenuBtn/UserMenuBtn.d.ts +1 -0
- package/dist/components/index.d.ts +4 -0
- package/dist/components/types.d.ts +2 -0
- package/dist/design-system-v3.js +131 -127
- package/dist/design-system-v3.umd.cjs +274 -274
- 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/utils/theme/index.d.ts +6 -0
- package/dist/vuetifyConfig.d.ts +14 -14
- package/package.json +16 -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/ContextualMenu/ContextualMenu.stories.ts +0 -3
- package/src/components/ContextualMenu/accessibilite/Accessibility.mdx +67 -11
- package/src/components/CookieBanner/CookieBanner.stories.ts +21 -20
- package/src/components/CookieBanner/CookieBanner.vue +35 -10
- package/src/components/CookieBanner/accessibilite/Accessibility.mdx +76 -11
- package/src/components/CookieBanner/tests/CookieBanner.spec.ts +56 -4
- 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/SyCheckBoxGroup/SyCheckBoxGroup.mdx +32 -0
- package/src/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.stories.ts +856 -0
- package/src/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.vue +334 -0
- package/src/components/Customs/SyCheckBoxGroup/accessibilite/Accessibility.mdx +243 -0
- package/src/components/Customs/SyCheckBoxGroup/locales.ts +3 -0
- package/src/components/Customs/SyCheckBoxGroup/tests/SyCheckBoxGroup.a11y.spec.ts +30 -0
- package/src/components/Customs/SyCheckBoxGroup/tests/SyCheckBoxGroup.spec.ts +152 -0
- package/src/components/Customs/SyCheckBoxGroup/types.ts +10 -0
- package/src/components/Customs/SyCheckbox/SyCheckbox.vue +17 -28
- package/src/components/Customs/SyCheckbox/accessibilite/Accessibility.mdx +1 -1
- package/src/components/Customs/SyForm/SyForm.a11y.spec.ts +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 +38 -12
- package/src/components/Customs/SyPagination/tests/SyPagination.spec.ts +12 -0
- package/src/components/Customs/SyRadioGroup/SyRadioGroup.vue +16 -43
- 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 +55 -19
- package/src/components/DatePicker/CalendarMode/tests/DatePicker.spec.ts +9 -3
- package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.stories.ts +44 -3
- package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.vue +70 -47
- package/src/components/DatePicker/ComplexDatePicker/tests/ComplexDatePicker.a11y.spec.ts +9 -1
- package/src/components/DatePicker/DateTextInput/DateTextInput.vue +48 -21
- package/src/components/DatePicker/DateTextInput/NoCalendar.stories.ts +98 -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/DeclarationAccessibilityPage/DeclarationAccessibilityPage.mdx +83 -0
- package/src/components/DeclarationAccessibilityPage/DeclarationAccessibilityPage.stories.ts +502 -0
- package/src/components/DeclarationAccessibilityPage/DeclarationAccessibilityPage.vue +428 -0
- package/src/components/DeclarationAccessibilityPage/accessibilite/Accessibility.mdx +75 -0
- package/src/components/DeclarationAccessibilityPage/tests/DeclarationAccessibilityPage.a11y.spec.ts +53 -0
- package/src/components/DeclarationAccessibilityPage/tests/DeclarationAccessibilityPage.spec.ts +59 -0
- package/src/components/DiacriticPicker/DiacriticPicker.vue +20 -1
- 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.mdx +6 -16
- package/src/components/ErrorPage/ErrorPage.stories.ts +90 -126
- package/src/components/ErrorPage/ErrorPage.vue +44 -125
- package/src/components/ErrorPage/accessibilite/Accessibility.mdx +83 -6
- package/src/components/ErrorPage/assets/error-ap.svg +1774 -0
- package/src/components/ErrorPage/locales.ts +21 -3
- package/src/components/ErrorPage/tests/ErrorPage.a11y.spec.ts +5 -13
- package/src/components/ErrorPage/tests/ErrorPage.spec.ts +2 -41
- package/src/components/ErrorPage/tests/__snapshots__/ErrorPage.spec.ts.snap +10 -266
- 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 +65 -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 +316 -48
- package/src/components/FooterBar/FooterBar.vue +67 -9
- package/src/components/FooterBar/config.ts +2 -2
- package/src/components/FooterBar/defaultSocialMediaLinks.ts +6 -4
- 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.mdx +1 -1
- package/src/components/MaintenancePage/MaintenancePage.vue +42 -7
- package/src/components/MaintenancePage/accessibilite/Accessibility.mdx +63 -6
- package/src/components/MaintenancePage/assets/maintenance-ap.svg +1718 -0
- package/src/components/MaintenancePage/locales.ts +24 -3
- package/src/components/MaintenancePage/tests/MaintenancePage.a11y.spec.ts +76 -3
- package/src/components/MaintenancePage/tests/MaintenancePage.spec.ts +60 -2
- package/src/components/MaintenancePage/tests/__snapshots__/MaintenancePage.spec.ts.snap +5 -2
- package/src/components/NotFoundPage/NotFoundPage.mdx +1 -1
- package/src/components/NotFoundPage/NotFoundPage.stories.ts +4 -4
- package/src/components/NotFoundPage/NotFoundPage.vue +30 -14
- package/src/components/NotFoundPage/accessibilite/Accessibility.mdx +80 -6
- package/src/components/NotFoundPage/assets/not-found-ap.svg +2061 -0
- package/src/components/NotFoundPage/locales.ts +24 -4
- package/src/components/NotFoundPage/tests/NotFoundPage.a11y.spec.ts +217 -4
- package/src/components/NotFoundPage/tests/NotFoundPage.spec.ts +123 -12
- package/src/components/NotFoundPage/tests/__snapshots__/NotFoundPage.spec.ts.snap +4 -2
- package/src/components/NotificationBar/NotificationBar.mdx +2 -2
- package/src/components/NotificationBar/accessibilite/Accessibility.mdx +68 -8
- package/src/components/PageContainer/PageContainer.stories.ts +47 -0
- package/src/components/PageContainer/PageContainer.vue +4 -2
- package/src/components/PageContainer/accessibilite/Accessibility.mdx +67 -0
- package/src/components/PageContainer/tests/PageContainer.a11y.spec.ts +14 -7
- 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 +115 -69
- 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 +22 -9
- 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/DefaultSocialMediaLinks.ts +6 -4
- package/src/components/SocialMediaLinks/SocialMediaLinks.mdx +7 -5
- package/src/components/SocialMediaLinks/SocialMediaLinks.stories.ts +17 -13
- package/src/components/SocialMediaLinks/SocialMediaLinks.vue +10 -2
- package/src/components/SocialMediaLinks/accessibilite/Accessibility.mdx +63 -11
- package/src/components/SocialMediaLinks/tests/DefaultSocialMediaLinks.spec.ts +5 -5
- package/src/components/SocialMediaLinks/tests/SocialMediaLinks.a11y.spec.ts +59 -0
- package/src/components/SocialMediaLinks/tests/SocialMediaLinks.spec.ts +9 -7
- package/src/components/StatusPage/StatusPage.mdx +31 -0
- package/src/components/StatusPage/StatusPage.stories.ts +236 -0
- package/src/components/StatusPage/StatusPage.vue +167 -0
- package/src/components/StatusPage/accessibilite/Accessibility.mdx +100 -0
- package/src/components/StatusPage/tests/StatusPage.a11y.spec.ts +30 -0
- package/src/components/StatusPage/tests/StatusPage.spec.ts +53 -0
- package/src/components/StatusPage/tests/__snapshots__/StatusPage.spec.ts.snap +272 -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/TableToolbar.stories.ts +6 -6
- package/src/components/TableToolbar/TableToolbar.vue +1 -1
- package/src/components/TableToolbar/tests/__snapshots__/TableToolbar.spec.ts.snap +96 -35
- 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.mdx +11 -1
- package/src/components/UploadWorkflow/UploadWorkflow.stories.ts +118 -14
- package/src/components/UploadWorkflow/UploadWorkflow.vue +59 -31
- 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 +37 -7
- package/src/components/UploadWorkflow/tests/__snapshots__/UploadWorkflow.spec.ts.snap +139 -112
- package/src/components/UploadWorkflow/useFileList.ts +7 -0
- 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 +4 -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/rules/tests/useFieldValidation.spec.ts +39 -3
- package/src/composables/rules/useFieldValidation.ts +24 -9
- 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/Accessibilite/KitDePreAudit/Preaudit.mdx +7 -0
- 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/src/utils/theme/index.ts +19 -0
- package/src/utils/theme/tests/useThemeLocales.spec.ts +245 -0
- package/dist/components/MaintenancePage/index.d.ts +0 -2
- package/dist/main-CuI6xaPq.js +0 -36396
- package/src/components/Customs/SyTabs/tests/SyTabs.a11y.spec.ts +0 -51
- package/src/components/DataListItem/tests/DataListItem.a11y.spec.ts +0 -31
- package/src/components/DatePicker/CalendarMode/tests/DatePicker.a11y.spec.ts +0 -27
- package/src/components/DownloadBtn/tests/DownloadBtn.a11y.spec.ts +0 -26
- package/src/components/ExternalLinks/tests/ExternalLinks.a11y.spec.ts +0 -39
- package/src/components/HeaderNavigationBar/tests/HeaderNavigationBar.a11y.spec.ts +0 -45
- package/src/components/HeaderToolbar/tests/HeaderToolbar.a11y.spec.ts +0 -25
- package/src/components/LunarCalendar/tests/LunarCalendar.a11y.spec.ts +0 -31
- package/src/components/MaintenancePage/index.ts +0 -3
- package/src/components/PageContainer/Accessibilite/Accessibility.mdx +0 -53
- package/src/components/PageContainer/Accessibilite/AccessibilityGuide.mdx +0 -0
- package/src/components/PaginatedTable/tests/PaginatedTable.a11y.spec.ts +0 -43
- /package/src/components/NotFoundPage/assets/{not-found.svg → not-found-cnam.svg} +0 -0
|
@@ -1,15 +1,312 @@
|
|
|
1
|
-
import { Meta,
|
|
2
|
-
import * as
|
|
1
|
+
import { Meta, Primary } from '@storybook/blocks';
|
|
2
|
+
import * as PhoneFieldStories from '../PhoneField.stories.ts';
|
|
3
|
+
import AccessibilityIcon from '@/common/imgs/accessibility-svgrepo-com.svg';
|
|
3
4
|
import '@/stories/styles/shared.css';
|
|
4
5
|
|
|
5
|
-
<Meta of={
|
|
6
|
+
<Meta of={PhoneFieldStories} name="Accessibility" />
|
|
6
7
|
|
|
7
|
-
<div className="
|
|
8
|
-
|
|
9
|
-
</
|
|
8
|
+
<div className="accessibility-guide">
|
|
9
|
+
<div className="header">
|
|
10
|
+
<h1>Guide d'Accessibilité du Composant PhoneField</h1>
|
|
11
|
+
</div>
|
|
12
|
+
|
|
13
|
+
<div className="intro-section">
|
|
14
|
+
<img
|
|
15
|
+
src={AccessibilityIcon}
|
|
16
|
+
alt="Icône d'accessibilité"
|
|
17
|
+
className="accessibility-icon"
|
|
18
|
+
/>
|
|
19
|
+
<p className="intro-text">
|
|
20
|
+
Le composant PhoneField a été conçu en suivant rigoureusement les recommandations d'accessibilité du W3C,
|
|
21
|
+
notamment le modèle <a href="https://www.w3.org/WAI/tutorials/forms/" target="_blank" rel="noopener noreferrer">WAI-ARIA pour les champs de formulaire</a>.
|
|
22
|
+
Ce guide détaille comment notre implémentation respecte ces standards et garantit une expérience utilisateur inclusive.
|
|
23
|
+
</p>
|
|
24
|
+
</div>
|
|
25
|
+
|
|
26
|
+
<div className="criteria-section">
|
|
27
|
+
<h2>Critères d'accessibilité respectés</h2>
|
|
28
|
+
|
|
29
|
+
<div className="criteria-card">
|
|
30
|
+
<div className="criteria-header">
|
|
31
|
+
<span className="criteria-icon">🔍</span>
|
|
32
|
+
<h3>Structure sémantique</h3>
|
|
33
|
+
</div>
|
|
34
|
+
<ul>
|
|
35
|
+
<li><strong>Regroupement</strong> : Lorsque l'indicatif pays est affiché, les deux champs (indicatif et numéro) sont regroupés dans un <code>fieldset</code> avec une <code>legend</code> associée.</li>
|
|
36
|
+
<li><strong>Étiquetage explicite</strong> : Chaque champ dispose d'un label associé via la prop <code>label</code>.</li>
|
|
37
|
+
<li>
|
|
38
|
+
<strong>Attributs autocomplete</strong> : Les attributs <code>autocomplete</code> sont configurables via <code>autocompleteCountryCode</code> et <code>autocompletePhone</code>.
|
|
39
|
+
Choisissez la valeur adaptée à votre scénario (<a href="https://www.w3.org/WAI/WCAG21/quickref/#identify-input-purpose" target="_blank" rel="noopener noreferrer">WCAG 1.3.5</a>) :
|
|
40
|
+
<table className="autocomplete-table">
|
|
41
|
+
<thead>
|
|
42
|
+
<tr>
|
|
43
|
+
<th>Scénario</th>
|
|
44
|
+
<th>Prop</th>
|
|
45
|
+
<th>Valeur recommandée</th>
|
|
46
|
+
<th>Source</th>
|
|
47
|
+
</tr>
|
|
48
|
+
</thead>
|
|
49
|
+
<tbody>
|
|
50
|
+
<tr>
|
|
51
|
+
<td><strong>Code pays</strong> (ex : +33) — champ séparé</td>
|
|
52
|
+
<td><code>autocompleteCountryCode</code></td>
|
|
53
|
+
<td><code>tel-country-code</code></td>
|
|
54
|
+
<td><a href="https://html.spec.whatwg.org/#autofill-field-tel-country-code" target="_blank" rel="noopener noreferrer">WHATWG</a></td>
|
|
55
|
+
</tr>
|
|
56
|
+
<tr>
|
|
57
|
+
<td><strong>Numéro sans indicatif</strong> (ex : 06 12 34 56 78) — avec <code>withCountryCode</code></td>
|
|
58
|
+
<td><code>autocompletePhone</code></td>
|
|
59
|
+
<td><code>tel-national</code></td>
|
|
60
|
+
<td><a href="https://html.spec.whatwg.org/#autofill-field-tel-national" target="_blank" rel="noopener noreferrer">WHATWG</a></td>
|
|
61
|
+
</tr>
|
|
62
|
+
<tr>
|
|
63
|
+
<td><strong>Numéro complet</strong> (indicatif intégré) — sans <code>withCountryCode</code></td>
|
|
64
|
+
<td><code>autocompletePhone</code></td>
|
|
65
|
+
<td><code>tel</code></td>
|
|
66
|
+
<td><a href="https://html.spec.whatwg.org/#autofill-field-tel" target="_blank" rel="noopener noreferrer">WHATWG</a></td>
|
|
67
|
+
</tr>
|
|
68
|
+
<tr>
|
|
69
|
+
<td><strong>Extension / poste</strong></td>
|
|
70
|
+
<td><code>autocompletePhone</code></td>
|
|
71
|
+
<td><code>tel-extension</code></td>
|
|
72
|
+
<td><a href="https://html.spec.whatwg.org/#autofill-field-tel-extension" target="_blank" rel="noopener noreferrer">WHATWG</a></td>
|
|
73
|
+
</tr>
|
|
74
|
+
</tbody>
|
|
75
|
+
</table>
|
|
76
|
+
</li>
|
|
77
|
+
</ul>
|
|
78
|
+
</div>
|
|
79
|
+
|
|
80
|
+
<div className="criteria-card">
|
|
81
|
+
<div className="criteria-header">
|
|
82
|
+
<span className="criteria-icon">⌨️</span>
|
|
83
|
+
<h3>Navigation clavier complète</h3>
|
|
84
|
+
</div>
|
|
85
|
+
<ul>
|
|
86
|
+
<li><strong>Touche Tab</strong> : Navigation séquentielle entre le sélecteur d'indicatif et le champ numéro.</li>
|
|
87
|
+
<li><strong>Sélecteur d'indicatif</strong> : Navigation clavier complète dans la liste déroulante des pays.</li>
|
|
88
|
+
<li><strong>Focus visible</strong> : Indication claire de l'élément actuellement focalisé sur chaque champ.</li>
|
|
89
|
+
</ul>
|
|
90
|
+
</div>
|
|
91
|
+
|
|
92
|
+
<div className="criteria-card">
|
|
93
|
+
<div className="criteria-header">
|
|
94
|
+
<span className="criteria-icon">📱</span>
|
|
95
|
+
<h3>États et retours d'information</h3>
|
|
96
|
+
</div>
|
|
97
|
+
<ul>
|
|
98
|
+
<li><strong>État requis</strong> : Support du mode <code>required</code> et affichage d'un message d'erreur en cas de soumission invalide.</li>
|
|
99
|
+
<li><strong>État d'erreur</strong> : Un message d'erreur et une icône rouge sont affichés sous le champ lorsque la valeur saisie est invalide.</li>
|
|
100
|
+
<li><strong>État de succès</strong> : Un message de confirmation et une icône verte indiquent que la valeur saisie est valide.</li>
|
|
101
|
+
<li><strong>États disabled / readonly</strong> : Les états sont communiqués visuellement et empêchent l'interaction selon le cas.</li>
|
|
102
|
+
<li><strong>Texte d'aide</strong> : La prop <code>helpText</code> permet d'afficher une aide à la saisie sous le champ.</li>
|
|
103
|
+
<li><strong>Retour textuel</strong> : Les messages de validation sont affichés dans la zone dédiée aux détails.</li>
|
|
104
|
+
</ul>
|
|
105
|
+
</div>
|
|
106
|
+
|
|
107
|
+
<div className="criteria-card">
|
|
108
|
+
<div className="criteria-header">
|
|
109
|
+
<span className="criteria-icon">🎨</span>
|
|
110
|
+
<h3>Personnalisation accessible</h3>
|
|
111
|
+
</div>
|
|
112
|
+
<ul>
|
|
113
|
+
<li><strong>Format d'affichage</strong> : La prop <code>displayFormat</code> permet d'adapter l'affichage des indicatifs (code, pays, abréviation) sans casser l'accessibilité.</li>
|
|
114
|
+
<li><strong>Astérisque visuel</strong> : La prop <code>displayAsterisk</code> permet d'afficher un indicateur visuel de champ requis.</li>
|
|
115
|
+
<li><strong>Couleur de fond</strong> : La prop <code>bgColor</code> permet d'adapter l'apparence tout en conservant les états d'erreur (prioritaires).</li>
|
|
116
|
+
</ul>
|
|
117
|
+
</div>
|
|
118
|
+
</div>
|
|
10
119
|
|
|
120
|
+
<div className="demo-section">
|
|
121
|
+
<h2>Démonstration interactive</h2>
|
|
122
|
+
<p>
|
|
123
|
+
Explorez ci-dessous un exemple de PhoneField. Essayez de naviguer en utilisant uniquement votre clavier (Tab pour naviguer, saisie directe dans les champs)
|
|
124
|
+
pour tester l'accessibilité.
|
|
125
|
+
</p>
|
|
126
|
+
<Primary />
|
|
127
|
+
</div>
|
|
128
|
+
|
|
129
|
+
<div className="best-practices">
|
|
130
|
+
<h2>Bonnes pratiques d'utilisation</h2>
|
|
131
|
+
<ul>
|
|
132
|
+
<li>Utilisez un libellé explicite pour chaque champ téléphone afin d'informer clairement l'utilisateur du format attendu.</li>
|
|
133
|
+
<li>Les attributs <code>autocomplete</code> sont préconfigurés par défaut (<code>autocompleteCountryCode</code> : <code>"tel-country-code"</code>, <code>autocompletePhone</code> : <code>"tel-national"</code>) et couvrent la majorité des cas d'usage. Adaptez-les si nécessaire (ex. <code>"tel"</code> pour un numéro complet avec indicatif intégré).</li>
|
|
134
|
+
<li>Pour un champ requis, expliquez clairement la contrainte via la prop <code>helpText</code>.</li>
|
|
135
|
+
<li>Évitez de baser le sens uniquement sur la couleur (toujours fournir un message textuel).</li>
|
|
136
|
+
<li>Assurez-vous que les zones cliquables restent confortables sur mobile.</li>
|
|
137
|
+
</ul>
|
|
138
|
+
</div>
|
|
11
139
|
|
|
12
|
-
<div
|
|
13
|
-
<
|
|
14
|
-
<
|
|
140
|
+
<div className="resources-section">
|
|
141
|
+
<h2>Ressources supplémentaires</h2>
|
|
142
|
+
<ul>
|
|
143
|
+
<li><a href="https://www.w3.org/WAI/WCAG21/Techniques/html/H44" target="_blank" rel="noopener noreferrer">WCAG – Utilisation des labels pour les contrôles de formulaire (H44)</a></li>
|
|
144
|
+
<li><a href="https://www.w3.org/WAI/WCAG21/quickref/" target="_blank" rel="noopener noreferrer">Référence rapide WCAG 2.1</a></li>
|
|
145
|
+
<li><a href="https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#autofill" target="_blank" rel="noopener noreferrer">Spécification HTML – Attribut autocomplete</a></li>
|
|
146
|
+
</ul>
|
|
15
147
|
</div>
|
|
148
|
+
</div>
|
|
149
|
+
|
|
150
|
+
<style>
|
|
151
|
+
{`
|
|
152
|
+
.accessibility-guide {
|
|
153
|
+
font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
|
|
154
|
+
max-width: 1200px;
|
|
155
|
+
margin: 0 auto;
|
|
156
|
+
padding: 20px;
|
|
157
|
+
color: #333;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
.intro-section {
|
|
161
|
+
display: flex;
|
|
162
|
+
align-items: center;
|
|
163
|
+
margin-bottom: 30px;
|
|
164
|
+
background-color: #f8f9fa;
|
|
165
|
+
padding: 20px;
|
|
166
|
+
border-radius: 8px;
|
|
167
|
+
border-left: 5px solid #0077cc;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
.accessibility-icon {
|
|
171
|
+
width: 60px;
|
|
172
|
+
height: 60px;
|
|
173
|
+
margin-right: 20px;
|
|
174
|
+
flex-shrink: 0;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
.intro-text {
|
|
178
|
+
font-size: 1.1em;
|
|
179
|
+
line-height: 1.6;
|
|
180
|
+
margin: 0;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
.criteria-section {
|
|
184
|
+
margin-bottom: 40px;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
.criteria-section h2,
|
|
188
|
+
.demo-section h2,
|
|
189
|
+
.best-practices h2,
|
|
190
|
+
.resources-section h2 {
|
|
191
|
+
border-bottom: 2px solid #eaecef;
|
|
192
|
+
padding-bottom: 10px;
|
|
193
|
+
margin-top: 30px;
|
|
194
|
+
margin-bottom: 20px;
|
|
195
|
+
color: #0077cc;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
.criteria-card {
|
|
199
|
+
background-color: #fff;
|
|
200
|
+
border-radius: 8px;
|
|
201
|
+
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
|
|
202
|
+
padding: 20px;
|
|
203
|
+
margin-bottom: 20px;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
.criteria-header {
|
|
207
|
+
display: flex;
|
|
208
|
+
align-items: center;
|
|
209
|
+
margin-bottom: 15px;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
.criteria-icon {
|
|
213
|
+
font-size: 1.8em;
|
|
214
|
+
margin-right: 15px;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
.criteria-header h3 {
|
|
218
|
+
margin: 0;
|
|
219
|
+
font-size: 1.3em;
|
|
220
|
+
color: #0077cc;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
.criteria-card ul {
|
|
224
|
+
margin: 0;
|
|
225
|
+
padding-left: 20px;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
.criteria-card li {
|
|
229
|
+
margin-bottom: 8px;
|
|
230
|
+
line-height: 1.5;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
.demo-section {
|
|
234
|
+
background-color: #f8f9fa;
|
|
235
|
+
padding: 20px;
|
|
236
|
+
border-radius: 8px;
|
|
237
|
+
margin-bottom: 40px;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
.best-practices {
|
|
241
|
+
background-color: #f5f5f5;
|
|
242
|
+
padding: 20px;
|
|
243
|
+
border-radius: 8px;
|
|
244
|
+
margin-bottom: 30px;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
.best-practices ul {
|
|
248
|
+
padding-left: 20px;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
.best-practices li {
|
|
252
|
+
margin-bottom: 10px;
|
|
253
|
+
line-height: 1.5;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
.resources-section {
|
|
257
|
+
background-color: #f8f9fa;
|
|
258
|
+
padding: 20px;
|
|
259
|
+
border-radius: 8px;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
.resources-section ul {
|
|
263
|
+
padding-left: 20px;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
.resources-section li {
|
|
267
|
+
margin-bottom: 10px;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
.resources-section a {
|
|
271
|
+
color: #0077cc;
|
|
272
|
+
text-decoration: none;
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
.resources-section a:hover {
|
|
276
|
+
text-decoration: underline;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
.autocomplete-table {
|
|
280
|
+
width: 100%;
|
|
281
|
+
border-collapse: collapse;
|
|
282
|
+
margin-top: 12px;
|
|
283
|
+
font-size: 0.9em;
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
.autocomplete-table th,
|
|
287
|
+
.autocomplete-table td {
|
|
288
|
+
border: 1px solid #ddd;
|
|
289
|
+
padding: 8px 12px;
|
|
290
|
+
text-align: left;
|
|
291
|
+
vertical-align: top;
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
.autocomplete-table th {
|
|
295
|
+
background-color: #f0f4f8;
|
|
296
|
+
color: #0077cc;
|
|
297
|
+
font-weight: 600;
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
.autocomplete-table tr:nth-child(even) td {
|
|
301
|
+
background-color: #f9f9f9;
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
code {
|
|
305
|
+
background-color: #f0f0f0;
|
|
306
|
+
padding: 2px 5px;
|
|
307
|
+
border-radius: 3px;
|
|
308
|
+
font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, monospace;
|
|
309
|
+
font-size: 0.9em;
|
|
310
|
+
}
|
|
311
|
+
`}
|
|
312
|
+
</style>
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
export const indicatifs = [
|
|
2
2
|
{ code: '+1', country: 'USA/Canada', countryFr: 'États-Unis/Canada', abbreviation: 'US/CA', phoneLength: 10, mask: '### ### ####' },
|
|
3
3
|
{ code: '+7', country: 'Russia/Kazakhstan', countryFr: 'Russie/Kazakhstan', abbreviation: 'RU/KZ', phoneLength: 10, mask: '### ### ## ##' },
|
|
4
|
-
{ code: '+20', country: 'Egypt', countryFr: 'Égypte', abbreviation: 'EG', phoneLength: 9, mask: '### ###
|
|
5
|
-
{ code: '+27', country: 'South Africa', countryFr: 'Afrique du Sud', abbreviation: 'ZA', phoneLength: 9, mask: '
|
|
4
|
+
{ code: '+20', country: 'Egypt', countryFr: 'Égypte', abbreviation: 'EG', phoneLength: 9, mask: '### ### ###' },
|
|
5
|
+
{ code: '+27', country: 'South Africa', countryFr: 'Afrique du Sud', abbreviation: 'ZA', phoneLength: 9, mask: '## ### ####' },
|
|
6
6
|
{ code: '+30', country: 'Greece', countryFr: 'Grèce', abbreviation: 'GR', phoneLength: 10, mask: '### ### ####' },
|
|
7
7
|
{ code: '+31', country: 'Netherlands', countryFr: 'Pays-Bas', abbreviation: 'NL', phoneLength: 9, mask: '## ### ####' },
|
|
8
8
|
{ code: '+32', country: 'Belgium', countryFr: 'Belgique', abbreviation: 'BE', phoneLength: 9, mask: '### ### ###' },
|
|
@@ -5,28 +5,41 @@ import { mount } from '@vue/test-utils'
|
|
|
5
5
|
import { axe } from 'vitest-axe'
|
|
6
6
|
import { assertNoA11yViolations } from '@tests/unit/accessibility/axeUtils'
|
|
7
7
|
import PhoneField from '../PhoneField.vue'
|
|
8
|
-
import { indicatifs } from '../indicatifs'
|
|
9
8
|
|
|
10
|
-
// Scénario d
|
|
9
|
+
// Scénario d'accessibilité : champ de téléphone requis, avec et sans indicatif pays.
|
|
11
10
|
|
|
12
11
|
describe('PhoneField – accessibility (axe)', () => {
|
|
13
|
-
it('has no obvious axe violations
|
|
14
|
-
const
|
|
12
|
+
it('has no obvious axe violations for a required phone field', async () => {
|
|
13
|
+
const wrapper = mount(PhoneField, {
|
|
14
|
+
props: {
|
|
15
|
+
modelValue: '',
|
|
16
|
+
required: true,
|
|
17
|
+
},
|
|
18
|
+
attachTo: document.body,
|
|
19
|
+
})
|
|
20
|
+
|
|
21
|
+
const results = await axe(wrapper.element as HTMLElement)
|
|
22
|
+
assertNoA11yViolations(results, 'PhoneField – required field', {
|
|
23
|
+
ignoreRules: ['region'],
|
|
24
|
+
})
|
|
25
|
+
|
|
26
|
+
wrapper.unmount()
|
|
27
|
+
})
|
|
15
28
|
|
|
29
|
+
it('has no obvious axe violations with country code selector', async () => {
|
|
16
30
|
const wrapper = mount(PhoneField, {
|
|
17
31
|
props: {
|
|
32
|
+
modelValue: '',
|
|
33
|
+
required: true,
|
|
18
34
|
withCountryCode: true,
|
|
19
35
|
countryCodeRequired: true,
|
|
20
|
-
required: true,
|
|
21
|
-
modelValue: '0612345678',
|
|
22
|
-
dialCodeModel: defaultDialCode,
|
|
23
36
|
},
|
|
24
37
|
attachTo: document.body,
|
|
25
38
|
})
|
|
26
39
|
|
|
27
40
|
const results = await axe(wrapper.element as HTMLElement)
|
|
28
|
-
assertNoA11yViolations(results, 'PhoneField – country code
|
|
29
|
-
ignoreRules: ['region'],
|
|
41
|
+
assertNoA11yViolations(results, 'PhoneField – with country code', {
|
|
42
|
+
ignoreRules: ['region', 'aria-allowed-attr'],
|
|
30
43
|
})
|
|
31
44
|
|
|
32
45
|
wrapper.unmount()
|
|
@@ -18,6 +18,8 @@ describe('PhoneField', () => {
|
|
|
18
18
|
const input = wrapper.find('input')
|
|
19
19
|
await input.setValue('1234567890')
|
|
20
20
|
expect(wrapper.emitted('update:modelValue')).toBeTruthy()
|
|
21
|
+
// change est émis au blur, pas à chaque frappe
|
|
22
|
+
await input.trigger('blur')
|
|
21
23
|
expect(wrapper.emitted('change')).toBeTruthy()
|
|
22
24
|
})
|
|
23
25
|
|
|
@@ -53,6 +55,69 @@ describe('PhoneField', () => {
|
|
|
53
55
|
expect((wrapper.vm as any).errors.length).toBeGreaterThan(0)
|
|
54
56
|
})
|
|
55
57
|
|
|
58
|
+
it('keeps a consistent success message before and after blur when withCountryCode is true', async () => {
|
|
59
|
+
const wrapper = mount(PhoneField, {
|
|
60
|
+
props: {
|
|
61
|
+
withCountryCode: true,
|
|
62
|
+
isValidatedOnBlur: false,
|
|
63
|
+
modelValue: '',
|
|
64
|
+
},
|
|
65
|
+
})
|
|
66
|
+
|
|
67
|
+
const textField = wrapper.findComponent({ name: 'SyTextField' })
|
|
68
|
+
const input = textField.find('input')
|
|
69
|
+
await input.setValue('0123456789')
|
|
70
|
+
await wrapper.vm.$nextTick()
|
|
71
|
+
|
|
72
|
+
const messageBeforeBlur = textField.find('.v-messages__message')
|
|
73
|
+
expect(messageBeforeBlur.exists()).toBe(true)
|
|
74
|
+
expect(messageBeforeBlur.text()).toBe('Le champ Numéro de téléphone sans indicatif est valide.')
|
|
75
|
+
expect(messageBeforeBlur.text()).not.toBe('Le champ Numéro de téléphone est valide.')
|
|
76
|
+
|
|
77
|
+
await input.trigger('blur')
|
|
78
|
+
await wrapper.vm.$nextTick()
|
|
79
|
+
|
|
80
|
+
const messageAfterBlur = textField.find('.v-messages__message')
|
|
81
|
+
expect(messageAfterBlur.exists()).toBe(true)
|
|
82
|
+
expect(messageAfterBlur.text()).toBe('Le champ Numéro de téléphone sans indicatif est valide.')
|
|
83
|
+
})
|
|
84
|
+
|
|
85
|
+
it('trims input to the expected phoneLength', async () => {
|
|
86
|
+
const wrapper = mount(PhoneField, {
|
|
87
|
+
props: {
|
|
88
|
+
withCountryCode: true,
|
|
89
|
+
modelValue: '',
|
|
90
|
+
},
|
|
91
|
+
})
|
|
92
|
+
|
|
93
|
+
wrapper.vm.dialCode = { code: '+27', abbreviation: 'ZA', country: 'South Africa', phoneLength: 9, mask: '### ### ###' }
|
|
94
|
+
await wrapper.vm.$nextTick()
|
|
95
|
+
|
|
96
|
+
const textField = wrapper.findComponent({ name: 'SyTextField' })
|
|
97
|
+
const input = textField.find('input')
|
|
98
|
+
await input.setValue('01234567890')
|
|
99
|
+
await wrapper.vm.$nextTick()
|
|
100
|
+
|
|
101
|
+
const lastModelValueEmission = wrapper.emitted('update:modelValue')?.at(-1)?.[0]
|
|
102
|
+
expect(typeof lastModelValueEmission).toBe('string')
|
|
103
|
+
expect(String(lastModelValueEmission).replace(/\D/g, '').length).toBe(9)
|
|
104
|
+
})
|
|
105
|
+
|
|
106
|
+
it('keeps counter max aligned with dial code phoneLength (+27 => 9)', async () => {
|
|
107
|
+
const wrapper = mount(PhoneField, {
|
|
108
|
+
props: {
|
|
109
|
+
withCountryCode: true,
|
|
110
|
+
modelValue: '',
|
|
111
|
+
},
|
|
112
|
+
})
|
|
113
|
+
|
|
114
|
+
wrapper.vm.dialCode = { code: '+27', abbreviation: 'ZA', country: 'South Africa', phoneLength: 9, mask: '### ### ###' }
|
|
115
|
+
await wrapper.vm.$nextTick()
|
|
116
|
+
|
|
117
|
+
const textField = wrapper.findComponent({ name: 'SyTextField' })
|
|
118
|
+
expect(textField.props('counter')).toBe(9)
|
|
119
|
+
})
|
|
120
|
+
|
|
56
121
|
it('applies default phone mask correctly', async () => {
|
|
57
122
|
const wrapper = mount(PhoneField, {
|
|
58
123
|
props: { modelValue: '0619123456' },
|
|
@@ -76,6 +141,10 @@ describe('PhoneField', () => {
|
|
|
76
141
|
},
|
|
77
142
|
})
|
|
78
143
|
|
|
144
|
+
// Vider le code pays manuellement (France est sélectionnée par défaut)
|
|
145
|
+
wrapper.vm.dialCode = ''
|
|
146
|
+
await wrapper.vm.$nextTick()
|
|
147
|
+
|
|
79
148
|
const result = await wrapper.vm.validateOnSubmit()
|
|
80
149
|
|
|
81
150
|
expect(result).toBe(false)
|
|
@@ -91,7 +160,8 @@ describe('PhoneField', () => {
|
|
|
91
160
|
})
|
|
92
161
|
wrapper.vm.dialCode = { code: '+1', phoneLength: 10, mask: '###-###-####' }
|
|
93
162
|
await wrapper.vm.$nextTick()
|
|
94
|
-
|
|
163
|
+
// dialCode is normalized against the canonical indicatifs list by code
|
|
164
|
+
expect(wrapper.vm.phoneMask).toBe('### ### ####')
|
|
95
165
|
expect(wrapper.vm.counter).toBe(10)
|
|
96
166
|
})
|
|
97
167
|
|
|
@@ -221,13 +291,14 @@ describe('PhoneField', () => {
|
|
|
221
291
|
},
|
|
222
292
|
})
|
|
223
293
|
|
|
224
|
-
const dialCodeValue = { code: '+
|
|
294
|
+
const dialCodeValue = { code: '+34', abbreviation: 'ES', country: 'Spain', phoneLength: 9, mask: '### ### ###' }
|
|
225
295
|
wrapper.vm.dialCode = dialCodeValue
|
|
226
296
|
await wrapper.vm.$nextTick()
|
|
227
297
|
|
|
228
298
|
expect(wrapper.emitted('update:selectedDialCode')).toBeTruthy()
|
|
229
299
|
const emittedEvents = wrapper.emitted('update:selectedDialCode')
|
|
230
|
-
|
|
300
|
+
const lastEmitted = emittedEvents && emittedEvents[emittedEvents.length - 1]?.[0]
|
|
301
|
+
expect(lastEmitted).toHaveProperty('code', dialCodeValue.code)
|
|
231
302
|
})
|
|
232
303
|
|
|
233
304
|
it('validates phone number on submit', async () => {
|
|
@@ -287,7 +358,8 @@ describe('PhoneField', () => {
|
|
|
287
358
|
wrapper.vm.dialCode = { code: '+44', abbreviation: 'UK', country: 'United Kingdom', phoneLength: 11, mask: '### ### #####' }
|
|
288
359
|
await wrapper.vm.$nextTick()
|
|
289
360
|
|
|
290
|
-
|
|
361
|
+
// dialCode is normalized against the canonical indicatifs list by code
|
|
362
|
+
expect(wrapper.vm.counter).toBe(10)
|
|
291
363
|
})
|
|
292
364
|
|
|
293
365
|
it('handles disabled state correctly', async () => {
|
|
@@ -350,7 +422,8 @@ describe('PhoneField', () => {
|
|
|
350
422
|
},
|
|
351
423
|
})
|
|
352
424
|
|
|
353
|
-
|
|
425
|
+
// France est sélectionnée par défaut quand withCountryCode=true
|
|
426
|
+
expect(wrapper.vm.dialCode).toMatchObject({ code: '+33' })
|
|
354
427
|
|
|
355
428
|
await wrapper.setProps({
|
|
356
429
|
dialCodeModel: { code: '+1', country: 'USA', abbreviation: 'US', phoneLength: 10, mask: '###-###-####' },
|
|
@@ -778,6 +851,10 @@ describe('PhoneField', () => {
|
|
|
778
851
|
},
|
|
779
852
|
})
|
|
780
853
|
|
|
854
|
+
// Vider le code pays manuellement (France est sélectionnée par défaut)
|
|
855
|
+
wrapper.vm.dialCode = ''
|
|
856
|
+
await wrapper.vm.$nextTick()
|
|
857
|
+
|
|
781
858
|
// Sans code pays, la validation échoue
|
|
782
859
|
const isValidWithoutCountry = await wrapper.vm.validateOnSubmit()
|
|
783
860
|
expect(isValidWithoutCountry).toBe(false)
|
|
@@ -1,15 +1,75 @@
|
|
|
1
|
-
import { Meta, Story } from '@storybook/
|
|
2
|
-
import * as Stories from '../SearchListField.stories
|
|
1
|
+
import { Meta, Story } from '@storybook/blocks';
|
|
2
|
+
import * as Stories from '../SearchListField.stories';
|
|
3
|
+
import AccessibilityIcon from '@/common/imgs/accessibility-svgrepo-com.svg';
|
|
3
4
|
import '@/stories/styles/shared.css';
|
|
5
|
+
import {
|
|
6
|
+
AccessibilityGuideLayout,
|
|
7
|
+
CriteriaSection,
|
|
8
|
+
CriteriaCard,
|
|
9
|
+
DemoSection,
|
|
10
|
+
BestPracticesSection,
|
|
11
|
+
ResourcesSection,
|
|
12
|
+
AuditSection,
|
|
13
|
+
} from '@/stories/accessibility/AccessibilityGuideLayout.mdx';
|
|
4
14
|
|
|
5
15
|
<Meta of={Stories} />
|
|
6
16
|
|
|
7
|
-
<
|
|
8
|
-
|
|
9
|
-
|
|
17
|
+
<AccessibilityGuideLayout
|
|
18
|
+
componentName="SearchListField"
|
|
19
|
+
iconSrc={AccessibilityIcon}
|
|
20
|
+
>
|
|
21
|
+
<AuditSection>
|
|
22
|
+
<div>Rapport d’audit manuel : <a href="/audits/SearchListField.xlsx" style={{ color:'#0C41BD' }}>Voir le rapport</a></div>
|
|
23
|
+
<div style={{ color: 'grey', fontSize: '14px', marginTop: '0px' }}>
|
|
24
|
+
Correctifs associés (<a href="https://github.com/assurance-maladie-digital/design-system-v3/issues/1499" target="_blank" style={{color:'#0C41BD'}}>issue #1499</a>)
|
|
25
|
+
</div>
|
|
26
|
+
</AuditSection>
|
|
10
27
|
|
|
28
|
+
<CriteriaSection>
|
|
29
|
+
<CriteriaCard icon="🏷️" title="Structure et rôles">
|
|
30
|
+
<ul>
|
|
31
|
+
<li>Le champ de recherche reste un champ texte natif (<code>SyTextField</code> sous-jacent) avec label obligatoire.</li>
|
|
32
|
+
<li>La liste est encapsulée dans un <code>fieldset</code> + <code>legend</code> (listLabel) et les résultats sont des <code>li</code> avec checkbox.</li>
|
|
33
|
+
<li>Les icônes de recherche sont décoratives (pas d’annonce superflue).</li>
|
|
34
|
+
</ul>
|
|
35
|
+
</CriteriaCard>
|
|
11
36
|
|
|
12
|
-
<
|
|
13
|
-
<
|
|
14
|
-
|
|
15
|
-
|
|
37
|
+
<CriteriaCard icon="⌨️" title="Navigation clavier">
|
|
38
|
+
<ul>
|
|
39
|
+
<li>Tabulation : focus successif sur le champ puis chaque option ; activation par Espace/Entrée sur la checkbox.</li>
|
|
40
|
+
<li>Focus visible sur le champ et les cases à cocher ; suppression via la case déjà cochée.</li>
|
|
41
|
+
<li>Annonces SR : nombre de résultats via le <code>role="status"</code> conditionnel.</li>
|
|
42
|
+
</ul>
|
|
43
|
+
</CriteriaCard>
|
|
44
|
+
|
|
45
|
+
<CriteriaCard icon="🎨" title="Contraste et lisibilité">
|
|
46
|
+
<ul>
|
|
47
|
+
<li>Label et texte des options utilisent les couleurs du thème avec contrastes conformes.</li>
|
|
48
|
+
<li>État sélectionné signalé par classe <code>suggestion-item--selected</code> (fond/contour) + checkbox cochée.</li>
|
|
49
|
+
<li>Placeholder/texte d’aide : éviter les messages uniquement par couleur.</li>
|
|
50
|
+
</ul>
|
|
51
|
+
</CriteriaCard>
|
|
52
|
+
</CriteriaSection>
|
|
53
|
+
|
|
54
|
+
<DemoSection componentName="SearchListField">
|
|
55
|
+
<Story of={Stories.Default} />
|
|
56
|
+
<Story of={Stories.WithReturnObject} />
|
|
57
|
+
</DemoSection>
|
|
58
|
+
|
|
59
|
+
<BestPracticesSection>
|
|
60
|
+
<ul>
|
|
61
|
+
<li>Fournir un <code>label</code> et un <code>listLabel</code> explicites (champ + legend).</li>
|
|
62
|
+
<li>Utiliser des libellés uniques par option ; éviter les doublons qui compliquent l’annonce.</li>
|
|
63
|
+
<li>Garder le menu ouvert pour la sélection multiple ; ne pas masquer le focus.</li>
|
|
64
|
+
<li>Si l’ensemble d’options est long, guider la saisie avec un libellé contextualisé (“Rechercher une profession…”).</li>
|
|
65
|
+
<li>En retour objet (<code>returnObject</code>), vérifier que chaque item a un <code>label</code> et une <code>value</code> stables.</li>
|
|
66
|
+
</ul>
|
|
67
|
+
</BestPracticesSection>
|
|
68
|
+
|
|
69
|
+
<ResourcesSection>
|
|
70
|
+
<ul>
|
|
71
|
+
<li><a href="https://www.w3.org/WAI/ARIA/apg/patterns/combobox/" target="_blank" rel="noopener noreferrer">WAI-ARIA APG – Combobox</a> (pour les champs de recherche avec liste)</li>
|
|
72
|
+
<li><a href="https://www.numerique.gouv.fr/publications/rgaa-accessibilite/" target="_blank" rel="noopener noreferrer">RGAA – critères 7.1 (ARIA) et 10.8 (éléments masqués)</a></li>
|
|
73
|
+
</ul>
|
|
74
|
+
</ResourcesSection>
|
|
75
|
+
</AccessibilityGuideLayout>
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
// @vitest-environment jsdom
|
|
2
|
+
|
|
3
|
+
import { describe, it } from 'vitest'
|
|
4
|
+
import { mount } from '@vue/test-utils'
|
|
5
|
+
import { defineComponent } from 'vue'
|
|
6
|
+
import { axe } from 'vitest-axe'
|
|
7
|
+
import { assertNoA11yViolations } from '@tests/unit/accessibility/axeUtils'
|
|
8
|
+
import SearchListField from '../SearchListField.vue'
|
|
9
|
+
|
|
10
|
+
describe('SearchListField – accessibility (axe)', () => {
|
|
11
|
+
it('has no obvious axe violations on default list', async () => {
|
|
12
|
+
const wrapper = mount(defineComponent({
|
|
13
|
+
components: { SearchListField },
|
|
14
|
+
setup() {
|
|
15
|
+
const props = {
|
|
16
|
+
label: 'Rechercher une profession',
|
|
17
|
+
listLabel: 'Résultats',
|
|
18
|
+
items: [
|
|
19
|
+
{ label: 'Infirmier', value: 'infirmier' },
|
|
20
|
+
{ label: 'Pharmacien', value: 'pharmacien' },
|
|
21
|
+
],
|
|
22
|
+
modelValue: [],
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
return { props }
|
|
26
|
+
},
|
|
27
|
+
template: `
|
|
28
|
+
<main>
|
|
29
|
+
<SearchListField v-bind="props" />
|
|
30
|
+
</main>
|
|
31
|
+
`,
|
|
32
|
+
}))
|
|
33
|
+
|
|
34
|
+
const results = await axe(wrapper.element as HTMLElement)
|
|
35
|
+
assertNoA11yViolations(results, 'SearchListField – default list')
|
|
36
|
+
})
|
|
37
|
+
})
|