@cnamts/synapse 1.0.21 → 1.0.23
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-Dc-gSGwk.js} +29 -24
- package/dist/{NumberFilter-sm1dQNQi.js → NumberFilter-vP38Wp6j.js} +1 -1
- package/dist/{PeriodFilter-Cklsxnh9.js → PeriodFilter-Ba1uYUnT.js} +1 -1
- package/dist/{SelectFilter-CWefj27Z.js → SelectFilter-BioGT6Nn.js} +1 -1
- package/dist/{TextFilter-Ddyj885L.js → TextFilter-B84dpnoq.js} +1 -1
- package/dist/components/Accordion/Accordion.d.ts +13 -2
- package/dist/components/Accordion/composables/useAccordionState.d.ts +2 -1
- package/dist/components/Amelipro/AmeliproAutoCompleteField/AmeliproAutoCompleteField.d.ts +7405 -5973
- 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/AmeliproClickableTile/AmeliproClickableTile.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 +2413 -2029
- package/dist/components/Amelipro/AmeliproSelect/AmeliproSelect.d.ts +8885 -7323
- 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 +8884 -7330
- package/dist/components/Amelipro/AmeliproTextArea/AmeliproTextArea.d.ts +950 -838
- package/dist/components/Amelipro/AmeliproTextField/AmeliproTextField.d.ts +1614 -1358
- 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 +1108 -846
- package/dist/components/Customs/Selects/SyAutocomplete/locales.d.ts +5 -0
- package/dist/components/Customs/Selects/SySelect/SySelect.d.ts +514 -320
- package/dist/components/Customs/Selects/SySelect/locales.d.ts +1 -0
- package/dist/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.d.ts +40 -38
- package/dist/components/Customs/SyCheckbox/SyCheckbox.d.ts +920 -800
- 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 +906 -794
- package/dist/components/Customs/SyTextField/SyTextField.d.ts +1634 -1367
- package/dist/components/DataList/DataList.d.ts +1 -1
- package/dist/components/DatePicker/CalendarMode/DatePicker.d.ts +3869 -3120
- package/dist/components/DatePicker/ComplexDatePicker/ComplexDatePicker.d.ts +1947 -1561
- package/dist/components/DatePicker/DateTextInput/DateTextInput.d.ts +831 -684
- 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 +6 -0
- package/dist/components/FileList/UploadItem/UploadItem.d.ts +6 -0
- package/dist/components/FileList/UploadItem/locales.d.ts +1 -0
- package/dist/components/FileUpload/FileUpload.d.ts +4 -4
- package/dist/components/FileUpload/FileUploadContent.d.ts +2 -0
- package/dist/components/FileUpload/locales.d.ts +1 -0
- package/dist/components/FileUpload/validateFiles.d.ts +2 -1
- 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 +2 -0
- package/dist/components/HeaderBar/HeaderLogo/HeaderLogo.d.ts +2 -0
- package/dist/components/HeaderNavigationBar/HeaderNavigationBar.d.ts +4 -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/MonthPicker/MonthPicker.d.ts +1939 -0
- package/dist/components/MonthPicker/MonthPickerText/MonthPickerInput.d.ts +1899 -0
- package/dist/components/MonthPicker/MonthPickerText/useTextField.d.ts +21 -0
- package/dist/components/MonthPicker/MonthPickerVisual/MonthPickerVisual.d.ts +21 -0
- package/dist/components/MonthPicker/MonthPickerVisual/MonthPickerVisualProps.d.ts +12 -0
- package/dist/components/MonthPicker/MonthPickerVisual/MonthSelector.d.ts +11 -0
- package/dist/components/MonthPicker/MonthPickerVisual/VisualPickerFooter.d.ts +6 -0
- package/dist/components/MonthPicker/MonthPickerVisual/VisualPickerHeader.d.ts +14 -0
- package/dist/components/MonthPicker/MonthPickerVisual/YearSelector.d.ts +14 -0
- package/dist/components/MonthPicker/MonthPickerVisual/useMonthGrid.d.ts +9 -0
- package/dist/components/MonthPicker/MonthPickerVisual/useYearGrid.d.ts +8 -0
- package/dist/components/MonthPicker/MonthPickerVisual/utils.d.ts +8 -0
- package/dist/components/MonthPicker/locales.d.ts +12 -0
- package/dist/components/MonthPicker/useMonthPickerValidation.d.ts +25 -0
- package/dist/components/NirField/NirField.d.ts +1669 -1379
- package/dist/components/NotFoundPage/NotFoundPage.d.ts +9 -3
- package/dist/components/NotificationBar/Notification/Notification.d.ts +3 -0
- package/dist/components/PageContainer/PageContainer.d.ts +3 -1
- package/dist/components/PeriodField/PeriodField.d.ts +7696 -6192
- package/dist/components/PhoneField/PhoneField.d.ts +829 -684
- 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 +9 -0
- package/dist/components/SyHeading/SyHeading.a11y.test.d.ts +1 -0
- package/dist/components/SyHeading/SyHeading.d.ts +22 -0
- package/dist/components/SyHeading/SyHeading.test.d.ts +1 -0
- package/dist/components/SyTextArea/SyTextArea.d.ts +475 -419
- 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 +263 -164
- 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 +2 -0
- package/dist/components/types.d.ts +2 -0
- package/dist/design-system-v3.js +111 -107
- package/dist/design-system-v3.umd.cjs +158 -158
- 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/cnamContextual.d.ts +5 -0
- 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-aLKwdMi1.js +37886 -0
- package/dist/main.d.ts +1 -0
- package/dist/style.css +1 -1
- package/dist/vuetifyConfig.d.ts +14 -14
- package/package.json +21 -9
- package/src/assets/amelipro/img/logo-amelipro.svg +9 -0
- package/src/assets/apTokens.scss +53 -17
- package/src/assets/overrides/_btns.scss +8 -0
- package/src/assets/overrides/_forms.scss +9 -0
- package/src/assets/overrides/_icons.scss +43 -4
- package/src/assets/overrides/_tables.scss +19 -0
- 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/Accordion.mdx +23 -9
- package/src/components/Accordion/Accordion.stories.ts +153 -3
- package/src/components/Accordion/Accordion.vue +7 -6
- package/src/components/Accordion/accessibilite/Accessibility.mdx +5 -4
- package/src/components/Accordion/composables/__tests__/useAccordionState.spec.ts +40 -12
- package/src/components/Accordion/composables/useAccordionState.ts +3 -4
- package/src/components/Accordion/tests/accordion.spec.ts +131 -19
- 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/AmeliproPagination/AmeliproPagination.mdx +3 -1
- package/src/components/Amelipro/AmeliproPagination/AmeliproPagination.stories.ts +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/BackBtn/accessibilite/Accessibility.mdx +62 -10
- package/src/components/BackToTopBtn/BackToTopBtn.stories.ts +9 -3
- package/src/components/BackToTopBtn/accessibilite/Accessibility.mdx +86 -6
- package/src/components/Captcha/tests/Captcha.spec.ts +0 -29
- package/src/components/Captcha/tests/__snapshots__/Captcha.spec.ts.snap +18 -108
- 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/SelectBtnField/accessibilite/Accessibility.mdx +133 -10
- package/src/components/Customs/Selects/SyAutocomplete/SyAutocomplete.stories.ts +379 -93
- package/src/components/Customs/Selects/SyAutocomplete/SyAutocomplete.vue +144 -83
- package/src/components/Customs/Selects/SyAutocomplete/accessibilite/Accessibilite.stories.ts +40 -1
- package/src/components/Customs/Selects/SyAutocomplete/accessibilite/Accessibility.mdx +7 -1
- package/src/components/Customs/Selects/SyAutocomplete/locales.ts +5 -0
- package/src/components/Customs/Selects/SyAutocomplete/tests/SyAutocomplete.a11y.spec.ts +96 -0
- package/src/components/Customs/Selects/SyAutocomplete/tests/SyAutocomplete.spec.ts +234 -9
- package/src/components/Customs/Selects/SyAutocomplete/utils/ariaManager.ts +13 -3
- package/src/components/Customs/Selects/SyAutocomplete/utils/useSelectionLogic.ts +9 -10
- 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 +63 -3
- package/src/components/Customs/Selects/SySelect/composables/useSySelectKeyboard.ts +1 -1
- package/src/components/Customs/Selects/SySelect/locales.ts +1 -0
- 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/SyIcon/tests/SyIcon.a11y.spec.ts +20 -0
- package/src/components/Customs/SyIconButton/SyIconButton.mdx +46 -0
- package/src/components/Customs/SyIconButton/SyIconButton.stories.ts +184 -0
- package/src/components/Customs/SyIconButton/SyIconButton.vue +38 -0
- package/src/components/Customs/SyIconButton/accessibilite/Accessibility.mdx +64 -0
- package/src/components/Customs/SyIconButton/tests/SyIconButton.a11y.spec.ts +87 -0
- package/src/components/Customs/SyIconButton/tests/SyIconButton.spec.ts +152 -0
- package/src/components/Customs/SyIconButton/tests/__snapshots__/SyIconButton.spec.ts.snap +61 -0
- package/src/components/Customs/SyPagination/SyPagination.stories.ts +14 -2
- package/src/components/Customs/SyPagination/SyPagination.vue +25 -10
- 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 +59 -7
- package/src/components/Customs/SyTextField/accessibilite/Accessibility.mdx +67 -9
- package/src/components/Customs/SyTextField/tests/SyTextField.a11y.spec.ts +15 -0
- package/src/components/Customs/SyTextField/tests/SyTextField.spec.ts +36 -0
- package/src/components/DataList/accessibilite/Accessibility.mdx +79 -11
- package/src/components/DataListGroup/accessibilite/Accessibility.mdx +80 -11
- 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/DownloadBtn/tests/DownloadBtn.a11y.spec.ts +25 -0
- package/src/components/ErrorPage/ErrorPage.stories.ts +176 -47
- package/src/components/ErrorPage/ErrorPage.vue +21 -0
- package/src/components/ErrorPage/accessibilite/Accessibility.mdx +15 -0
- package/src/components/ErrorPage/tests/ErrorPage.a11y.spec.ts +17 -0
- package/src/components/ErrorPage/tests/ErrorPage.spec.ts +21 -1
- package/src/components/ErrorPage/tests/__snapshots__/ErrorPage.spec.ts.snap +1 -0
- package/src/components/ExternalLinks/tests/ExternalLinks.a11y.spec.ts +23 -0
- package/src/components/ExternalLinks/tests/__snapshots__/ExternalLinks.spec.ts.snap +13 -2
- package/src/components/FileList/FileList.stories.ts +55 -1
- package/src/components/FileList/UploadItem/UploadItem.vue +17 -5
- package/src/components/FileList/UploadItem/locales.ts +3 -2
- package/src/components/FileList/accessibilite/Accessibility.mdx +58 -7
- package/src/components/FileUpload/FileUpload.vue +62 -38
- package/src/components/FileUpload/FileUploadContent.vue +3 -2
- 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 +61 -14
- package/src/components/FileUpload/validateFiles.ts +5 -2
- 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/FranceConnectBtn/accessibilite/Accessibility.mdx +62 -9
- package/src/components/HeaderBar/HeaderBar.stories.ts +23 -1
- package/src/components/HeaderBar/HeaderBar.vue +5 -0
- package/src/components/HeaderBar/HeaderLogo/HeaderLogo.vue +8 -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 +3 -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/LunarCalendar/accessibilite/Accessibility.mdx +74 -8
- package/src/components/LunarCalendar/tests/LunarCalendar.a11y.spec.ts +163 -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 -1
- package/src/components/MaintenancePage/tests/__snapshots__/MaintenancePage.spec.ts.snap +1 -0
- package/src/components/MonthPicker/MonthPicker.mdx +35 -0
- package/src/components/MonthPicker/MonthPicker.stories.ts +527 -0
- package/src/components/MonthPicker/MonthPicker.vue +79 -0
- package/src/components/MonthPicker/MonthPickerText/MonthPickerInput.vue +89 -0
- package/src/components/MonthPicker/MonthPickerText/useTextField.ts +27 -0
- package/src/components/MonthPicker/MonthPickerVisual/MonthPickerVisual.vue +154 -0
- package/src/components/MonthPicker/MonthPickerVisual/MonthPickerVisualProps.ts +13 -0
- package/src/components/MonthPicker/MonthPickerVisual/MonthSelector.vue +137 -0
- package/src/components/MonthPicker/MonthPickerVisual/VisualPickerFooter.vue +60 -0
- package/src/components/MonthPicker/MonthPickerVisual/VisualPickerHeader.vue +149 -0
- package/src/components/MonthPicker/MonthPickerVisual/YearSelector.vue +143 -0
- package/src/components/MonthPicker/MonthPickerVisual/useMonthGrid.ts +45 -0
- package/src/components/MonthPicker/MonthPickerVisual/useYearGrid.ts +45 -0
- package/src/components/MonthPicker/MonthPickerVisual/utils.ts +17 -0
- package/src/components/MonthPicker/accessibilite/Accessibility.mdx +59 -0
- package/src/components/MonthPicker/locales.ts +12 -0
- package/src/components/MonthPicker/tests/MonthPicker.a11y.spec.ts +71 -0
- package/src/components/MonthPicker/tests/MonthPicker.spec.ts +1248 -0
- package/src/components/MonthPicker/tests/__snapshots__/MonthPicker.spec.ts.snap +2545 -0
- package/src/components/MonthPicker/useMonthPickerValidation.ts +30 -0
- package/src/components/NirField/NirField.mdx +1 -2
- package/src/components/NirField/NirField.stories.ts +66 -6
- 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 +24 -2
- package/src/components/NotFoundPage/tests/__snapshots__/NotFoundPage.spec.ts.snap +24 -14
- package/src/components/NotificationBar/Notification/Notification.vue +3 -1
- package/src/components/NotificationBar/NotificationBar.stories.ts +154 -0
- package/src/components/NotificationBar/tests/NotificationBar.a11y.spec.ts +26 -0
- package/src/components/NotificationBar/tests/NotificationBar.spec.ts +60 -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/RangeField/accessibilite/Accessibility.mdx +79 -11
- 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/SkipLink/tests/SkipLink.a11y.spec.ts +23 -0
- package/src/components/SocialMediaLinks/SocialMediaLinks.vue +1 -1
- package/src/components/StatusPage/StatusPage.mdx +10 -1
- package/src/components/StatusPage/StatusPage.stories.ts +161 -0
- package/src/components/StatusPage/StatusPage.vue +29 -5
- package/src/components/StatusPage/accessibilite/Accessibility.mdx +24 -5
- package/src/components/StatusPage/tests/StatusPage.a11y.spec.ts +23 -0
- package/src/components/StatusPage/tests/StatusPage.spec.ts +25 -0
- package/src/components/StatusPage/tests/__snapshots__/StatusPage.spec.ts.snap +24 -14
- 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/SubHeader/tests/SubHeader.a11y.spec.ts +20 -0
- package/src/components/SyAlert/SyAlert.vue +22 -20
- package/src/components/SyAlert/accessibilite/Accessibility.mdx +79 -9
- package/src/components/SyAlert/tests/SyAlert.a11y.spec.ts +23 -0
- 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.a11y.test.ts +149 -0
- package/src/components/SyHeading/SyHeading.test.ts +115 -0
- package/src/components/SyHeading/SyHeading.vue +20 -0
- package/src/components/SyTextArea/accessibilite/Accessibility.mdx +80 -8
- package/src/components/SyTextArea/tests/SyTextArea.a11y.spec.ts +151 -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/ToolbarContainer/tests/ToolbarContainer.a11y.spec.ts +126 -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 +146 -123
- 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 +2 -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/composables/useFormFieldErrorHandling.ts +11 -2
- package/src/designTokens/tokens/amelipro/apLightTheme.ts +27 -15
- package/src/designTokens/tokens/amelipro/apSemantic.ts +21 -15
- package/src/designTokens/tokens/cnam/cnamContextual.ts +6 -1
- 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/main.ts +2 -0
- 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
|
@@ -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: '### ### ###' },
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
// @vitest-environment jsdom
|
|
2
|
+
|
|
3
|
+
import { describe, it } from 'vitest'
|
|
4
|
+
import { mount } from '@vue/test-utils'
|
|
5
|
+
import { axe } from 'vitest-axe'
|
|
6
|
+
import { assertNoA11yViolations } from '@tests/unit/accessibility/axeUtils'
|
|
7
|
+
import PhoneField from '../PhoneField.vue'
|
|
8
|
+
|
|
9
|
+
// Scénario d'accessibilité : champ de téléphone requis, avec et sans indicatif pays.
|
|
10
|
+
|
|
11
|
+
describe('PhoneField – accessibility (axe)', () => {
|
|
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
|
+
})
|
|
28
|
+
|
|
29
|
+
it('has no obvious axe violations with country code selector', async () => {
|
|
30
|
+
const wrapper = mount(PhoneField, {
|
|
31
|
+
props: {
|
|
32
|
+
modelValue: '',
|
|
33
|
+
required: true,
|
|
34
|
+
withCountryCode: true,
|
|
35
|
+
countryCodeRequired: true,
|
|
36
|
+
},
|
|
37
|
+
attachTo: document.body,
|
|
38
|
+
})
|
|
39
|
+
|
|
40
|
+
const results = await axe(wrapper.element as HTMLElement)
|
|
41
|
+
assertNoA11yViolations(results, 'PhoneField – with country code', {
|
|
42
|
+
ignoreRules: ['region', 'aria-allowed-attr'],
|
|
43
|
+
})
|
|
44
|
+
|
|
45
|
+
wrapper.unmount()
|
|
46
|
+
})
|
|
47
|
+
})
|
|
@@ -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,83 @@
|
|
|
1
|
-
import { Meta,
|
|
2
|
-
import * as
|
|
3
|
-
import '@/
|
|
1
|
+
import { Meta, Primary } from '@storybook/blocks';
|
|
2
|
+
import * as RangeFieldStories from '../RangeField.stories.ts';
|
|
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={RangeFieldStories}/>
|
|
6
14
|
|
|
7
|
-
<
|
|
8
|
-
|
|
9
|
-
|
|
15
|
+
<AccessibilityGuideLayout
|
|
16
|
+
componentName="RangeField"
|
|
17
|
+
iconSrc={AccessibilityIcon}
|
|
18
|
+
apgHref="https://www.w3.org/WAI/ARIA/apg/patterns/slider/"
|
|
19
|
+
>
|
|
20
|
+
<div class="mt-8">
|
|
21
|
+
<p>Rapport d'audit manuel : <a href="/audits/RangeField.xlsx" style={{ color:'#0C41BD' }}>Voir le rapport</a></p>
|
|
22
|
+
<p style={{ color: 'grey', fontSize: '14px', marginTop: '0px' }}>Correctifs associés (<a href="https://github.com/assurance-maladie-digital/design-system-v3/issues/908" target="_blank" style={{color:'#0C41BD'}}>issue #908</a>)</p>
|
|
23
|
+
</div>
|
|
10
24
|
|
|
25
|
+
<CriteriaSection>
|
|
26
|
+
<CriteriaCard icon="🔍" title="Structure sémantique et regroupement">
|
|
27
|
+
<ul>
|
|
28
|
+
<li><strong>Fieldset/Legend</strong> : Utilisation de <code><fieldset></code> et <code><legend></code> lorsque <code>fieldsetLabel</code> est fourni pour regrouper sémantiquement les champs</li>
|
|
29
|
+
<li><strong>Double entrée</strong> : Composant hybride avec slider visuel et champs textuels pour une accessibilité maximale</li>
|
|
30
|
+
<li><strong>Labels explicites</strong> : Champs texte avec labels personnalisables via <code>textFieldMinLabel</code> et <code>textFieldMaxLabel</code></li>
|
|
31
|
+
</ul>
|
|
32
|
+
</CriteriaCard>
|
|
11
33
|
|
|
12
|
-
<
|
|
13
|
-
<
|
|
14
|
-
|
|
15
|
-
|
|
34
|
+
<CriteriaCard icon="⌨️" title="Navigation et interaction clavier">
|
|
35
|
+
<ul>
|
|
36
|
+
<li><strong>Input numérique</strong> : Champs texte avec <code>inputmode="numeric"</code> pour optimiser le clavier mobile</li>
|
|
37
|
+
<li><strong>Validation synchrone</strong> : Mise à jour bidirectionnelle entre slider et champs texte pour une cohérence immédiate</li>
|
|
38
|
+
<li><strong>Contraintes logiques</strong> : Validation automatique pour garantir min ≤ max avec corrections appropriées</li>
|
|
39
|
+
</ul>
|
|
40
|
+
</CriteriaCard>
|
|
41
|
+
|
|
42
|
+
<CriteriaCard icon="🎨" title="Masque saisie et formatage">
|
|
43
|
+
<ul>
|
|
44
|
+
<li><strong>vMaska</strong> : Masque de saisie personnalisé pour gérer nombres négatifs et décimaux</li>
|
|
45
|
+
<li><strong>Pattern flexible</strong> : Support des formats comme "-123.45" avec tokens adaptés</li>
|
|
46
|
+
<li><strong>Clamp automatique</strong> : Correction des valeurs hors limites avec <code>clamp()</code></li>
|
|
47
|
+
</ul>
|
|
48
|
+
</CriteriaCard>
|
|
49
|
+
|
|
50
|
+
<CriteriaCard icon="📱" title="Responsive et adaptabilité">
|
|
51
|
+
<ul>
|
|
52
|
+
<li><strong>Layout adaptatif</strong> : Orientation des champs qui passe de horizontal à vertical sur mobile</li>
|
|
53
|
+
<li><strong>Display Vuetify</strong> : Utilisation de <code>useDisplay()</code> pour détecter les tailles d'écran</li>
|
|
54
|
+
<li><strong>Options personnalisables</strong> : Composant entièrement configurable via <code>useCustomizableOptions</code></li>
|
|
55
|
+
</ul>
|
|
56
|
+
</CriteriaCard>
|
|
57
|
+
</CriteriaSection>
|
|
58
|
+
|
|
59
|
+
<DemoSection componentName="RangeField">
|
|
60
|
+
<Primary />
|
|
61
|
+
</DemoSection>
|
|
62
|
+
|
|
63
|
+
<BestPracticesSection>
|
|
64
|
+
<ul>
|
|
65
|
+
<li><strong>Labels descriptifs</strong> : Utilisez des labels clairs pour les champs min/max ("Prix minimum", "Âge maximum")</li>
|
|
66
|
+
<li><strong>Fieldset cohérent</strong> : Regroupez les champs avec un <code>fieldsetLabel</code> pertinent ("Fourchette de prix", "Plage d'âge")</li>
|
|
67
|
+
<li><strong>Valeurs par défaut</strong> : Initialisez toujours <code>modelValue</code> avec une plage valide [min, max]</li>
|
|
68
|
+
<li><strong>Step approprié</strong> : Choisissez un <code>step</code> logique (1 pour les entiers, 0.1 pour les décimales)</li>
|
|
69
|
+
<li><strong>Validation côté serveur</strong> : Complétez la validation client avec des vérifications serveur pour la sécurité</li>
|
|
70
|
+
<li><strong>Feedback utilisateur</strong> : Ajoutez des messages d'aide ou d'erreur pour guider l'utilisateur</li>
|
|
71
|
+
</ul>
|
|
72
|
+
</BestPracticesSection>
|
|
73
|
+
|
|
74
|
+
<ResourcesSection>
|
|
75
|
+
<ul>
|
|
76
|
+
<li><a href="https://www.w3.org/WAI/ARIA/apg/patterns/slider/" target="_blank" rel="noopener noreferrer">Guide des pratiques WAI-ARIA : Sliders</a></li>
|
|
77
|
+
<li><a href="https://www.w3.org/WAI/WCAG21/quickref/" target="_blank" rel="noopener noreferrer">Référence rapide WCAG 2.1</a></li>
|
|
78
|
+
<li><a href="https://accessibilite.numerique.gouv.fr/methode/criteres-et-tests/#11.9" target="_blank" rel="noopener noreferrer">RGAA Critère 11.9 : Champs de saisie numérique</a></li>
|
|
79
|
+
<li><a href="https://developer.mozilla.org/fr/docs/Web/HTML/Element/Input/number" target="_blank" rel="noopener noreferrer">MDN : Champs input number et inputmode</a></li>
|
|
80
|
+
</ul>
|
|
81
|
+
</ResourcesSection>
|
|
82
|
+
|
|
83
|
+
</AccessibilityGuideLayout>
|