@cnamts/synapse 1.0.22 → 1.0.24
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/AutocompleteFilter-BWLR3U7W.js +114 -0
- package/dist/AutocompleteFilter-D9jzRzAL.cjs +1 -0
- package/dist/{DateFilter-B5n-ZkLi.js → DateFilter-BpwFexzi.js} +1 -1
- package/dist/DateFilter-DTUl8hb1.cjs +1 -0
- package/dist/{NumberFilter-CtiZ9uj8.js → NumberFilter-Bz_NTdX9.js} +3 -3
- package/dist/NumberFilter-MAEojdk0.cjs +1 -0
- package/dist/PeriodFilter-CC4WgIhl.cjs +1 -0
- package/dist/{PeriodFilter-DzqiMb-b.js → PeriodFilter-DX_wy9g-.js} +1 -1
- package/dist/SelectFilter-BR3fvl-a.cjs +1 -0
- package/dist/SelectFilter-xqiPtPgX.js +135 -0
- package/dist/{TextFilter-BOFRNfcX.js → TextFilter-BBl3JFqK.js} +7 -7
- package/dist/TextFilter-CCfYFl5F.cjs +1 -0
- package/dist/apLightTheme-CFSRrjv2.cjs +1 -0
- package/dist/apLightTheme-D1P4jcD0.js +1231 -0
- 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 +7022 -9616
- package/dist/components/Amelipro/AmeliproCarousel/AmeliproCarousel.d.ts +2 -2
- package/dist/components/Amelipro/AmeliproCheckbox/AmeliproCheckbox.d.ts +1 -1
- package/dist/components/Amelipro/AmeliproCustomSelector/AmeliproCustomSelector.d.ts +1 -1
- package/dist/components/Amelipro/AmeliproIconBtn/AmeliproIconBtn.d.ts +2 -2
- package/dist/components/Amelipro/AmeliproPostalAddressField/AmeliproPostalAddressCityRow/AmeliproPostalAddressCityRow.d.ts +40 -40
- package/dist/components/Amelipro/AmeliproPostalAddressField/AmeliproPostalAddressField.d.ts +61 -61
- package/dist/components/Amelipro/AmeliproSelect/AmeliproSelect.d.ts +7168 -9762
- package/dist/components/Amelipro/AmeliproStepper/AmeliproStepper.d.ts +2 -2
- package/dist/components/Amelipro/AmeliproTabs/AmeliproTabs.d.ts +7506 -10100
- package/dist/components/Amelipro/AmeliproTextArea/AmeliproTextArea.d.ts +22 -22
- package/dist/components/Amelipro/AmeliproTextField/AmeliproTextField.d.ts +42 -42
- package/dist/components/Amelipro/StructureMenu/StructureTabs/StructureTabs.d.ts +2 -2
- package/dist/components/CookiesSelection/CookiesInformation/CookiesInformation.d.ts +20 -498
- package/dist/components/Customs/Selects/SyAutocomplete/SyAutocomplete.d.ts +130 -147
- package/dist/components/Customs/Selects/SyAutocomplete/locales.d.ts +5 -0
- package/dist/components/Customs/Selects/SyInputSelect/SyInputSelect.d.ts +6 -6
- package/dist/components/Customs/Selects/SySelect/SySelect.d.ts +13 -17
- package/dist/components/Customs/Selects/SySelect/locales.d.ts +1 -0
- package/dist/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.d.ts +9 -9
- package/dist/components/Customs/SyCheckbox/SyCheckbox.d.ts +29 -507
- package/dist/components/Customs/SyRadioGroup/SyRadioGroup.d.ts +29 -507
- package/dist/components/Customs/SyTextField/SyTextField.d.ts +64 -81
- package/dist/components/DatePicker/CalendarMode/DatePicker.d.ts +640 -780
- package/dist/components/DatePicker/ComplexDatePicker/ComplexDatePicker.d.ts +322 -407
- package/dist/components/DatePicker/DateTextInput/DateTextInput.d.ts +114 -156
- package/dist/components/DatePicker/composables/index.d.ts +1 -0
- package/dist/components/DatePicker/composables/useDatePickerFocusTrap.d.ts +11 -0
- package/dist/components/DatePicker/composables/useDateTextField.d.ts +4 -4
- package/dist/components/DatePicker/composables/useDateValidation.d.ts +3 -3
- package/dist/components/DatePicker/composables/useInputBlurHandler.d.ts +2 -2
- package/dist/components/DatePicker/composables/useManualDateValidation.d.ts +2 -2
- package/dist/components/ErrorPage/ErrorPage.d.ts +3 -1
- package/dist/components/FileList/UploadItem/UploadItem.d.ts +6 -0
- package/dist/components/FileList/UploadItem/locales.d.ts +1 -4
- package/dist/components/FileUpload/FileUploadContent.d.ts +2 -0
- package/dist/components/FileUpload/validateFiles.d.ts +2 -1
- package/dist/components/HeaderBar/HeaderBar.d.ts +2 -1
- package/dist/components/HeaderBar/HeaderLogo/HeaderLogo.d.ts +2 -1
- package/dist/components/HeaderNavigationBar/HeaderNavigationBar.d.ts +6 -5
- package/dist/components/HeaderToolbar/HeaderToolbar.d.ts +20 -28
- package/dist/components/LunarCalendar/useLunarCalendarValidation.d.ts +3 -3
- package/dist/components/MonthPicker/MonthPicker.d.ts +1903 -0
- package/dist/components/MonthPicker/MonthPickerText/MonthPickerInput.d.ts +1863 -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 +209 -271
- package/dist/components/NirField/locales.d.ts +10 -10
- package/dist/components/NirField/useNirValidation.d.ts +64 -0
- package/dist/components/NotificationBar/Notification/Notification.d.ts +3 -0
- package/dist/components/PasswordField/PasswordField.d.ts +9 -10
- package/dist/components/PeriodField/PeriodField.d.ts +1379 -1659
- package/dist/components/PhoneField/PhoneField.d.ts +90 -125
- package/dist/components/RangeField/RangeSlider/RangeSlider.d.ts +12 -12
- package/dist/components/SyBtnMenu/SyBtnMenu.d.ts +1 -1
- package/dist/components/SyHeading/SyHeading.a11y.test.d.ts +1 -0
- package/dist/components/SyHeading/SyHeading.d.ts +4 -2
- package/dist/components/SyHeading/SyHeading.test.d.ts +1 -0
- package/dist/components/SyTextArea/SyTextArea.d.ts +35 -15
- package/dist/components/SyTextArea/useDefaultValidationRules.d.ts +11 -0
- package/dist/components/Tables/SyServerTable/SyServerTable.d.ts +11 -8
- package/dist/components/Tables/SyTable/SyTable.d.ts +11 -8
- package/dist/components/Tables/common/SyTableFilter.d.ts +2 -3
- package/dist/components/Tables/common/SyTablePagination.d.ts +21 -23
- package/dist/components/Tables/common/filters/AutocompleteFilter.d.ts +120 -0
- package/dist/components/Tables/common/filters/locales.d.ts +0 -1
- package/dist/components/Tables/common/types.d.ts +19 -3
- package/dist/components/Tables/common/useClickableTableRow.d.ts +17 -0
- package/dist/components/Tables/common/usePagination.d.ts +3 -1
- package/dist/components/Tables/common/usePinnedColumns.d.ts +31 -0
- package/dist/components/Tables/common/useTableHeaders.d.ts +2 -0
- package/dist/components/Tables/common/useTableRowCheckboxAccessibility.d.ts +5 -0
- package/dist/components/UploadWorkflow/UploadWorkflow.d.ts +6 -6
- package/dist/components/index.d.ts +1 -0
- package/dist/composables/date/useDatePickerAccessibility.d.ts +1 -1
- package/dist/composables/rules/useFieldValidation.d.ts +4 -4
- package/dist/composables/unifyValidation/useCustomValidation.d.ts +8 -0
- package/dist/composables/unifyValidation/useValidation.d.ts +102 -0
- package/dist/composables/unifyValidation/useVuetifyValidation.d.ts +18 -0
- package/dist/composables/useFormFieldErrorHandling.d.ts +2 -2
- package/dist/composables/validation/useFormValidation.d.ts +11 -2
- package/dist/composables/validation/useValidation.d.ts +15 -9
- package/dist/design-system-v3.d.ts +2 -0
- package/dist/design-system-v3.js +196 -194
- package/dist/design-system-v3.umd.cjs +1 -1066
- package/dist/designTokens/tokens/cnam/cnamContextual.d.ts +5 -0
- package/dist/{main-CEl4J8_T.js → main-BtTqyn4z.js} +16983 -15576
- package/dist/main-C1e3eoxd.cjs +1067 -0
- package/dist/synapse.css +1 -0
- package/dist/tooth-11-D3sLWv2n.cjs +1 -0
- package/dist/tooth-12-CXrLuH03.cjs +1 -0
- package/dist/tooth-13-BSfo5fpT.cjs +1 -0
- package/dist/tooth-14-DMzulx0h.cjs +1 -0
- package/dist/tooth-15-BKRFVi-9.cjs +1 -0
- package/dist/tooth-16-CpuxAbuM.cjs +1 -0
- package/dist/tooth-17-BPoahUdg.cjs +1 -0
- package/dist/tooth-18-DhHJz8sy.cjs +1 -0
- package/dist/tooth-21-Dgd5hn_X.cjs +1 -0
- package/dist/tooth-22-C2Tn19sB.cjs +1 -0
- package/dist/tooth-23-C9uaaSGb.cjs +1 -0
- package/dist/tooth-24-BrK9UGpf.cjs +1 -0
- package/dist/tooth-25-CE_EfGNp.cjs +1 -0
- package/dist/tooth-26-Ctv4i9Fy.cjs +1 -0
- package/dist/tooth-27-C5J7JkWM.cjs +1 -0
- package/dist/tooth-28-Z9oWqjo0.cjs +1 -0
- package/dist/tooth-31-BrYqmkTi.cjs +1 -0
- package/dist/tooth-32-BNNR0oCZ.cjs +1 -0
- package/dist/tooth-33-DuxvqO2J.cjs +1 -0
- package/dist/tooth-34-BCSCXMB6.cjs +1 -0
- package/dist/tooth-35-BLUXkX88.cjs +1 -0
- package/dist/tooth-36-IrKHYqlA.cjs +1 -0
- package/dist/tooth-37-BYqpdMwo.cjs +1 -0
- package/dist/tooth-38-B_eNXXdu.cjs +1 -0
- package/dist/tooth-41-Ddva4Ot8.cjs +1 -0
- package/dist/tooth-42-szcDqlM0.cjs +1 -0
- package/dist/tooth-43-B3ka6rQm.cjs +1 -0
- package/dist/tooth-44-CazyQucj.cjs +1 -0
- package/dist/tooth-45-B4HQtc8n.cjs +1 -0
- package/dist/tooth-46-BPM40gbG.cjs +1 -0
- package/dist/tooth-47-Dvr20dlh.cjs +1 -0
- package/dist/tooth-48-Bd8ljGsF.cjs +1 -0
- package/dist/tooth-51-OBpwCOF3.cjs +1 -0
- package/dist/tooth-52-aKxyHcmq.cjs +1 -0
- package/dist/tooth-53-vCwJjTOc.cjs +1 -0
- package/dist/tooth-54-DsWu2iFy.cjs +1 -0
- package/dist/tooth-55-BxC1X2Dn.cjs +1 -0
- package/dist/tooth-61-BbLvxMQi.cjs +1 -0
- package/dist/tooth-62-CmTkWczP.cjs +1 -0
- package/dist/tooth-63-DI7l_2qI.cjs +1 -0
- package/dist/tooth-64-B21sOsJh.cjs +1 -0
- package/dist/tooth-65-D2ZC2VEr.cjs +1 -0
- package/dist/tooth-71-D473PPO5.cjs +1 -0
- package/dist/tooth-72-Drh1wnNu.cjs +1 -0
- package/dist/tooth-73-DzlwYI23.cjs +1 -0
- package/dist/tooth-74-8aGvcZPg.cjs +1 -0
- package/dist/tooth-75-BFK7At_r.cjs +1 -0
- package/dist/tooth-81-BZmR-I0M.cjs +1 -0
- package/dist/tooth-82-euVfUUZV.cjs +1 -0
- package/dist/tooth-83-KV010j64.cjs +1 -0
- package/dist/tooth-84-BBg1RjhZ.cjs +1 -0
- package/dist/tooth-85-Cr-kc1wM.cjs +1 -0
- package/dist/vuetifyConfig.js +561 -0
- package/dist/vuetifyConfig.umd.cjs +1 -0
- package/package.json +18 -6
- package/src/assets/apTokens.scss +2 -2
- package/src/assets/overrides/_btns.scss +2 -0
- package/src/assets/overrides/_forms.scss +9 -0
- package/src/assets/overrides/_icons.scss +41 -4
- package/src/assets/overrides/_tables.scss +19 -0
- package/src/assets/overrides/_typography.scss +0 -10
- 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/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/AmeliproAutoCompleteField/__tests__/__snapshots__/AmeliproAutoCompleteField.spec.ts.snap +2 -2
- package/src/components/Amelipro/AmeliproHeader/AmeliproHeaderBar/AmeliproHeaderBrandSection/__tests__/__snapshots__/AmeliproHeaderBrandSection.spec.ts.snap +1 -1
- package/src/components/Amelipro/AmeliproPagination/AmeliproPagination.mdx +3 -1
- package/src/components/Amelipro/AmeliproPagination/AmeliproPagination.stories.ts +8 -0
- package/src/components/Amelipro/AmeliproTextArea/__tests__/__snapshots__/AmeliproTextArea.spec.ts.snap +2 -2
- 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/accessibilite/Accessibility.mdx +86 -8
- package/src/components/Captcha/tests/Captcha.spec.ts +0 -29
- package/src/components/Captcha/tests/__snapshots__/Captcha.spec.ts.snap +14 -122
- package/src/components/ChipList/ChipList.stories.ts +0 -15
- package/src/components/ChipList/ChipList.vue +5 -1
- package/src/components/ChipList/accessibilite/Accessibility.mdx +83 -10
- package/src/components/ChipList/tests/ChipList.a11y.spec.ts +41 -0
- package/src/components/Customs/Selects/SelectBtnField/accessibilite/Accessibility.mdx +124 -10
- package/src/components/Customs/Selects/SyAutocomplete/SyAutocomplete.stories.ts +379 -93
- package/src/components/Customs/Selects/SyAutocomplete/SyAutocomplete.vue +162 -84
- 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 +377 -9
- package/src/components/Customs/Selects/SyAutocomplete/utils/ariaManager.ts +27 -13
- package/src/components/Customs/Selects/SyAutocomplete/utils/useSelectionLogic.ts +9 -10
- package/src/components/Customs/Selects/SyInputSelect/SyInputSelect.stories.ts +4 -4
- package/src/components/Customs/Selects/SyInputSelect/SyInputSelect.vue +8 -9
- package/src/components/Customs/Selects/SyInputSelect/tests/SyInputSelect.spec.ts +10 -10
- package/src/components/Customs/Selects/SySelect/SySelect.vue +60 -14
- package/src/components/Customs/Selects/SySelect/locales.ts +1 -0
- package/src/components/Customs/Selects/SySelect/tests/SySelect.spec.ts +54 -0
- package/src/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.vue +6 -9
- package/src/components/Customs/SyCheckbox/SyCheckbox.stories.ts +10 -16
- package/src/components/Customs/SyCheckbox/SyCheckbox.vue +16 -11
- package/src/components/Customs/SyCheckbox/accessibilite/Accessibility.mdx +35 -0
- package/src/components/Customs/SyCheckbox/tests/SyCheckbox.a11y.spec.ts +134 -2
- package/src/components/Customs/SyForm/SyForm.stories.ts +31 -5
- package/src/components/Customs/SyIcon/SyIcon.vue +1 -1
- 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.vue +5 -5
- package/src/components/Customs/SyRadioGroup/SyRadioGroup.vue +4 -7
- package/src/components/Customs/SyTextField/SyTextField.mdx +1 -1
- package/src/components/Customs/SyTextField/SyTextField.stories.ts +29 -27
- package/src/components/Customs/SyTextField/SyTextField.vue +174 -159
- package/src/components/Customs/SyTextField/accessibilite/Accessibility.mdx +67 -9
- package/src/components/Customs/SyTextField/tests/SyTextField.a11y.spec.ts +47 -0
- package/src/components/Customs/SyTextField/tests/SyTextField.spec.ts +155 -10
- 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 +62 -58
- package/src/components/DatePicker/CalendarMode/DatePicker.vue +330 -223
- package/src/components/DatePicker/CalendarMode/accessibilite/Accessibility.mdx +82 -0
- package/src/components/DatePicker/CalendarMode/tests/DatePicker.a11y.spec.ts +141 -0
- package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.stories.ts +2 -56
- package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.vue +195 -159
- package/src/components/DatePicker/ComplexDatePicker/accessibilite/Accessibility.mdx +76 -0
- package/src/components/DatePicker/ComplexDatePicker/tests/ComplexDatePicker.spec.ts +10 -10
- package/src/components/DatePicker/DatePickerValidationExample/CalendarMode.stories.ts +8 -8
- package/src/components/DatePicker/DatePickerValidationExample/ComplexDatePicker.stories.ts +106 -8
- package/src/components/DatePicker/DatePickerValidationExample/DateTextInput.stories.ts +12 -11
- package/src/components/DatePicker/DatePickerValidationExample/MultiMode.stories.ts +12 -12
- package/src/components/DatePicker/DateTextInput/DateRange.stories.ts +0 -12
- package/src/components/DatePicker/DateTextInput/DateTextInput.vue +63 -57
- package/src/components/DatePicker/DateTextInput/NoCalendar.stories.ts +3 -0
- package/src/components/DatePicker/DateTextInput/accessibilite/Accessibility.mdx +66 -0
- package/src/components/DatePicker/DateTextInput/tests/DateTextInput.spec.ts +52 -1
- package/src/components/DatePicker/composables/index.ts +1 -0
- package/src/components/DatePicker/composables/tests/useCalendarKeyboardNavigation.spec.ts +109 -65
- package/src/components/DatePicker/composables/tests/useDatePickerFocusTrap.spec.ts +138 -0
- package/src/components/DatePicker/composables/tests/useDateValidation.spec.ts +74 -18
- package/src/components/DatePicker/composables/tests/useInputBlurHandler.spec.ts +39 -0
- package/src/components/DatePicker/composables/tests/useManualDateValidation.spec.ts +91 -0
- package/src/components/DatePicker/composables/useCalendarKeyboardNavigation.ts +442 -36
- package/src/components/DatePicker/composables/useDatePickerFocusTrap.ts +92 -0
- package/src/components/DatePicker/composables/useDateTextField.ts +7 -6
- package/src/components/DatePicker/composables/useDateValidation.ts +36 -35
- package/src/components/DatePicker/composables/useInputBlurHandler.ts +3 -3
- package/src/components/DatePicker/composables/useManualDateValidation.ts +6 -2
- package/src/components/DiacriticPicker/accessibilite/Accessibility.mdx +76 -8
- package/src/components/DownloadBtn/tests/DownloadBtn.a11y.spec.ts +25 -0
- package/src/components/ErrorPage/ErrorPage.stories.ts +113 -19
- package/src/components/ErrorPage/ErrorPage.vue +17 -2
- 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 +0 -1
- package/src/components/ExternalLinks/tests/ExternalLinks.a11y.spec.ts +23 -0
- package/src/components/FileList/FileList.stories.ts +51 -1
- package/src/components/FileList/UploadItem/UploadItem.vue +13 -6
- package/src/components/FileList/UploadItem/locales.ts +3 -12
- package/src/components/FileList/accessibilite/Accessibility.mdx +3 -0
- package/src/components/FileUpload/FileUpload.vue +2 -1
- package/src/components/FileUpload/FileUploadContent.vue +2 -1
- package/src/components/FileUpload/tests/FileUpload.spec.ts +47 -0
- package/src/components/FileUpload/validateFiles.ts +5 -2
- package/src/components/FranceConnectBtn/accessibilite/Accessibility.mdx +62 -9
- package/src/components/HeaderBar/HeaderBar.stories.ts +14 -2
- package/src/components/HeaderBar/HeaderBar.vue +2 -1
- package/src/components/HeaderBar/HeaderLogo/HeaderLogo.vue +2 -1
- package/src/components/HeaderNavigationBar/HeaderNavigationBar.vue +2 -1
- package/src/components/Logo/accessibilite/Accessibility.mdx +73 -11
- package/src/components/LogoBrandSection/accessibilite/Accessibility.mdx +85 -9
- package/src/components/LunarCalendar/accessibilite/Accessibility.mdx +74 -8
- package/src/components/LunarCalendar/tests/LunarCalendar.a11y.spec.ts +163 -0
- package/src/components/LunarCalendar/tests/LunarCalendar.spec.ts +3 -1
- package/src/components/LunarCalendar/useLunarCalendarValidation.ts +4 -5
- package/src/components/MaintenancePage/MaintenancePage.vue +1 -1
- package/src/components/MaintenancePage/tests/MaintenancePage.spec.ts +4 -5
- package/src/components/MaintenancePage/tests/__snapshots__/MaintenancePage.spec.ts.snap +0 -1
- 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 +1249 -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 +70 -6
- package/src/components/NirField/NirField.vue +64 -260
- package/src/components/NirField/accessibilite/Accessibility.mdx +2 -2
- package/src/components/NirField/locales.ts +1 -1
- package/src/components/NirField/tests/NirField.spec.ts +6 -0
- package/src/components/NirField/useNirValidation.ts +271 -0
- package/src/components/NotFoundPage/tests/NotFoundPage.spec.ts +2 -3
- package/src/components/NotFoundPage/tests/__snapshots__/NotFoundPage.spec.ts.snap +22 -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/PasswordField/PasswordField.stories.ts +4 -4
- package/src/components/PasswordField/PasswordField.vue +18 -24
- package/src/components/PasswordField/tests/PasswordField.spec.ts +6 -3
- package/src/components/PeriodField/PeriodField.stories.ts +4 -4
- package/src/components/PeriodField/PeriodField.vue +57 -57
- package/src/components/PeriodField/__tests__/PeriodField.async.spec.ts +32 -0
- package/src/components/PeriodField/accessibilite/Accessibility.mdx +68 -8
- package/src/components/PeriodField/tests/PeriodField.spec.ts +28 -2
- package/src/components/PhoneField/PhoneField.vue +5 -6
- package/src/components/PhoneField/tests/PhoneField.spec.ts +1 -0
- package/src/components/RangeField/RangeField.vue +6 -0
- package/src/components/RangeField/accessibilite/Accessibility.mdx +79 -11
- package/src/components/SkipLink/tests/SkipLink.a11y.spec.ts +23 -0
- package/src/components/StatusPage/StatusPage.stories.ts +118 -0
- package/src/components/StatusPage/StatusPage.vue +5 -3
- package/src/components/StatusPage/tests/StatusPage.a11y.spec.ts +22 -0
- package/src/components/StatusPage/tests/StatusPage.spec.ts +22 -0
- package/src/components/StatusPage/tests/__snapshots__/StatusPage.spec.ts.snap +22 -14
- package/src/components/SubHeader/tests/SubHeader.a11y.spec.ts +20 -0
- package/src/components/SyAlert/SyAlert.vue +1 -0
- package/src/components/SyAlert/accessibilite/Accessibility.mdx +79 -9
- package/src/components/SyAlert/tests/SyAlert.a11y.spec.ts +23 -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 +5 -3
- package/src/components/SyTextArea/SyTextArea.stories.ts +138 -2
- package/src/components/SyTextArea/SyTextArea.vue +53 -23
- package/src/components/SyTextArea/accessibilite/Accessibility.mdx +80 -8
- package/src/components/SyTextArea/tests/SyTextArea.a11y.spec.ts +151 -0
- package/src/components/SyTextArea/tests/SyTextArea.spec.ts +126 -3
- package/src/components/SyTextArea/useDefaultValidationRules.ts +74 -0
- package/src/components/Tables/SyServerTable/SyServerTable.mdx +25 -0
- package/src/components/Tables/SyServerTable/SyServerTable.stories.ts +673 -1
- package/src/components/Tables/SyServerTable/SyServerTable.vue +148 -91
- package/src/components/Tables/SyServerTable/tests/SyServerTable.a11y.spec.ts +58 -0
- package/src/components/Tables/SyServerTable/tests/SyServerTable.spec.ts +122 -0
- package/src/components/Tables/SyTable/SyTable.mdx +25 -0
- package/src/components/Tables/SyTable/SyTable.stories.ts +452 -1
- package/src/components/Tables/SyTable/SyTable.vue +130 -56
- package/src/components/Tables/SyTable/tests/SyTable.a11y.spec.ts +57 -0
- package/src/components/Tables/SyTable/tests/SyTable.spec.ts +108 -0
- package/src/components/Tables/common/SyTableFilter.vue +22 -2
- package/src/components/Tables/common/TableHeader.vue +5 -1
- package/src/components/Tables/common/filters/AutocompleteFilter.vue +160 -0
- package/src/components/Tables/common/filters/NumberFilter.vue +1 -1
- package/src/components/Tables/common/filters/SelectFilter.vue +10 -11
- package/src/components/Tables/common/filters/TextFilter.vue +1 -1
- package/src/components/Tables/common/filters/getFilterComponent.ts +8 -1
- package/src/components/Tables/common/filters/locales.ts +0 -1
- package/src/components/Tables/common/filters/tests/AutocompleteFilter.a11y.spec.ts +110 -0
- package/src/components/Tables/common/filters/tests/AutocompleteFilter.spec.ts +203 -0
- package/src/components/Tables/common/filters/tests/SelectFilter.a11y.spec.ts +104 -0
- package/src/components/Tables/common/filters/tests/SelectFilter.spec.ts +152 -16
- package/src/components/Tables/common/tableFilterUtils.ts +3 -0
- package/src/components/Tables/common/tableStyles.scss +48 -4
- package/src/components/Tables/common/tests/filterByRange.spec.ts +2 -1
- package/src/components/Tables/common/types.ts +13 -4
- package/src/components/Tables/common/useClickableTableRow.ts +103 -0
- package/src/components/Tables/common/usePagination.ts +13 -0
- package/src/components/Tables/common/usePinnedColumns.ts +237 -0
- package/src/components/Tables/common/useTableHeaders.ts +3 -3
- package/src/components/Tables/common/useTableRowCheckboxAccessibility.ts +41 -0
- package/src/components/ToolbarContainer/tests/ToolbarContainer.a11y.spec.ts +126 -0
- package/src/components/UploadWorkflow/tests/__snapshots__/UploadWorkflow.spec.ts.snap +2 -2
- package/src/components/index.ts +1 -0
- package/src/composables/date/tests/useDatePickerAccessibility.spec.ts +2 -6
- package/src/composables/date/useDatePickerAccessibility.ts +42 -207
- package/src/composables/rules/tests/useFieldValidation.spec.ts +120 -120
- package/src/composables/rules/useFieldValidation.ts +34 -17
- package/src/composables/unifyValidation/tests/useCustomValidation.spec.ts +601 -0
- package/src/composables/unifyValidation/tests/useValidation.spec.ts +2048 -0
- package/src/composables/unifyValidation/tests/useVuetifyValidation.spec.ts +184 -0
- package/src/composables/unifyValidation/useCustomValidation.ts +95 -0
- package/src/composables/unifyValidation/useValidation.ts +190 -0
- package/src/composables/unifyValidation/useVuetifyValidation.ts +54 -0
- package/src/composables/useFormFieldErrorHandling.ts +15 -9
- package/src/composables/validation/tests/useFormValidation.spec.ts +14 -0
- package/src/composables/validation/tests/useValidation.spec.ts +116 -21
- package/src/composables/validation/useFormValidation.ts +20 -13
- package/src/composables/validation/useValidatable.ts +8 -1
- package/src/composables/validation/useValidation.ts +135 -99
- package/src/composantsVuetify/Introduction.mdx +48 -0
- package/src/composantsVuetify/VBtn/VBtn.mdx +72 -0
- package/src/composantsVuetify/VBtn/v-btn.stories.ts +121 -0
- package/src/composantsVuetify/VTooltip/VTooltip.mdx +32 -0
- package/src/composantsVuetify/VTooltip/v-tooltip.stories.ts +95 -0
- package/src/designTokens/tokens/cnam/cnamContextual.ts +6 -1
- package/src/designTokens/tokens/cnam/cnamSemantic.ts +2 -2
- package/src/stories/Components/Components.stories.ts +74 -9
- package/src/stories/Demarrer/Accueil.stories.ts +3 -3
- package/src/stories/GuideDuDev/Amelipro.mdx +15 -0
- package/src/stories/GuideDuDev/Amelipro.stories.ts +209 -0
- package/src/stories/GuideDuDev/vuetifyOptions.mdx +3 -3
- package/dist/SelectFilter-BOYlF7rX.js +0 -136
- package/dist/style.css +0 -1
- package/src/components/DatePicker/Accessibilite.mdx +0 -14
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest'
|
|
2
|
+
import { mount } from '@vue/test-utils'
|
|
3
|
+
import { axe } from 'vitest-axe'
|
|
4
|
+
import { assertNoA11yViolations } from '@tests/unit/accessibility/axeUtils'
|
|
5
|
+
import SyHeading from './SyHeading.vue'
|
|
6
|
+
|
|
7
|
+
describe('SyHeading - Accessibility', () => {
|
|
8
|
+
it('should not have any accessibility violations with default props', async () => {
|
|
9
|
+
const wrapper = mount(SyHeading, {
|
|
10
|
+
slots: {
|
|
11
|
+
default: 'Default heading',
|
|
12
|
+
},
|
|
13
|
+
})
|
|
14
|
+
|
|
15
|
+
const results = await axe(wrapper.element, {
|
|
16
|
+
rules: {
|
|
17
|
+
region: { enabled: false },
|
|
18
|
+
},
|
|
19
|
+
})
|
|
20
|
+
assertNoA11yViolations(results, 'SyHeading - default props')
|
|
21
|
+
})
|
|
22
|
+
|
|
23
|
+
it('should not have accessibility violations with all heading levels', async () => {
|
|
24
|
+
const levels = [1, 2, 3, 4, 5, 6] as const
|
|
25
|
+
|
|
26
|
+
for (const level of levels) {
|
|
27
|
+
const wrapper = mount(SyHeading, {
|
|
28
|
+
props: {
|
|
29
|
+
level,
|
|
30
|
+
},
|
|
31
|
+
slots: {
|
|
32
|
+
default: `Heading level ${level}`,
|
|
33
|
+
},
|
|
34
|
+
})
|
|
35
|
+
|
|
36
|
+
const results = await axe(wrapper.element, {
|
|
37
|
+
rules: {
|
|
38
|
+
region: { enabled: false },
|
|
39
|
+
},
|
|
40
|
+
})
|
|
41
|
+
assertNoA11yViolations(results, `SyHeading - level ${level}`)
|
|
42
|
+
}
|
|
43
|
+
})
|
|
44
|
+
|
|
45
|
+
it('should not have accessibility violations with complex content', async () => {
|
|
46
|
+
const wrapper = mount(SyHeading, {
|
|
47
|
+
props: {
|
|
48
|
+
level: 3,
|
|
49
|
+
},
|
|
50
|
+
slots: {
|
|
51
|
+
default: '<span>Heading with <em>emphasis</em> and <strong>strong text</strong></span>',
|
|
52
|
+
},
|
|
53
|
+
})
|
|
54
|
+
|
|
55
|
+
const results = await axe(wrapper.element, {
|
|
56
|
+
rules: {
|
|
57
|
+
region: { enabled: false },
|
|
58
|
+
},
|
|
59
|
+
})
|
|
60
|
+
assertNoA11yViolations(results, 'SyHeading - complex content')
|
|
61
|
+
})
|
|
62
|
+
|
|
63
|
+
it('should not have accessibility violations with very long content', async () => {
|
|
64
|
+
const longContent = 'This is a very long heading text that might wrap across multiple lines and should still be accessible to screen readers and other assistive technologies without any issues.'
|
|
65
|
+
|
|
66
|
+
const wrapper = mount(SyHeading, {
|
|
67
|
+
props: {
|
|
68
|
+
level: 2,
|
|
69
|
+
},
|
|
70
|
+
slots: {
|
|
71
|
+
default: longContent,
|
|
72
|
+
},
|
|
73
|
+
})
|
|
74
|
+
|
|
75
|
+
const results = await axe(wrapper.element, {
|
|
76
|
+
rules: {
|
|
77
|
+
region: { enabled: false },
|
|
78
|
+
},
|
|
79
|
+
})
|
|
80
|
+
assertNoA11yViolations(results, 'SyHeading - long content')
|
|
81
|
+
})
|
|
82
|
+
|
|
83
|
+
it('should not have accessibility violations with special characters', async () => {
|
|
84
|
+
const wrapper = mount(SyHeading, {
|
|
85
|
+
props: {
|
|
86
|
+
level: 1,
|
|
87
|
+
},
|
|
88
|
+
slots: {
|
|
89
|
+
default: 'Heading with special chars: éàüßñ & symbols @#$%',
|
|
90
|
+
},
|
|
91
|
+
})
|
|
92
|
+
|
|
93
|
+
const results = await axe(wrapper.element, {
|
|
94
|
+
rules: {
|
|
95
|
+
region: { enabled: false },
|
|
96
|
+
},
|
|
97
|
+
})
|
|
98
|
+
assertNoA11yViolations(results, 'SyHeading - special characters')
|
|
99
|
+
})
|
|
100
|
+
|
|
101
|
+
it('should use semantic heading elements correctly', async () => {
|
|
102
|
+
const levels = [1, 2, 3, 4, 5, 6] as const
|
|
103
|
+
|
|
104
|
+
for (const level of levels) {
|
|
105
|
+
const wrapper = mount(SyHeading, {
|
|
106
|
+
props: {
|
|
107
|
+
level,
|
|
108
|
+
},
|
|
109
|
+
slots: {
|
|
110
|
+
default: `Semantic heading level ${level}`,
|
|
111
|
+
},
|
|
112
|
+
})
|
|
113
|
+
|
|
114
|
+
// Verify the correct semantic heading element is used
|
|
115
|
+
expect(wrapper.find(`h${level}`).exists()).toBe(true)
|
|
116
|
+
|
|
117
|
+
// Verify no accessibility violations
|
|
118
|
+
const results = await axe(wrapper.element, {
|
|
119
|
+
rules: {
|
|
120
|
+
region: { enabled: false },
|
|
121
|
+
},
|
|
122
|
+
})
|
|
123
|
+
assertNoA11yViolations(results, `SyHeading - semantic level ${level}`)
|
|
124
|
+
}
|
|
125
|
+
})
|
|
126
|
+
|
|
127
|
+
it('should maintain heading hierarchy for screen readers', async () => {
|
|
128
|
+
const wrapper = mount(SyHeading, {
|
|
129
|
+
props: {
|
|
130
|
+
level: 2,
|
|
131
|
+
},
|
|
132
|
+
slots: {
|
|
133
|
+
default: 'Important section heading',
|
|
134
|
+
},
|
|
135
|
+
})
|
|
136
|
+
|
|
137
|
+
// Verify the heading is properly structured for screen readers
|
|
138
|
+
const heading = wrapper.find('h2')
|
|
139
|
+
expect(heading.exists()).toBe(true)
|
|
140
|
+
expect(heading.text()).toBe('Important section heading')
|
|
141
|
+
|
|
142
|
+
const results = await axe(wrapper.element, {
|
|
143
|
+
rules: {
|
|
144
|
+
region: { enabled: false },
|
|
145
|
+
},
|
|
146
|
+
})
|
|
147
|
+
assertNoA11yViolations(results, 'SyHeading - hierarchy')
|
|
148
|
+
})
|
|
149
|
+
})
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest'
|
|
2
|
+
import { mount } from '@vue/test-utils'
|
|
3
|
+
import { axe } from 'vitest-axe'
|
|
4
|
+
import { assertNoA11yViolations } from '@tests/unit/accessibility/axeUtils'
|
|
5
|
+
import SyHeading from './SyHeading.vue'
|
|
6
|
+
|
|
7
|
+
describe('SyHeading', () => {
|
|
8
|
+
it('renders default heading level 2', () => {
|
|
9
|
+
const wrapper = mount(SyHeading, {
|
|
10
|
+
slots: {
|
|
11
|
+
default: 'Test heading',
|
|
12
|
+
},
|
|
13
|
+
})
|
|
14
|
+
|
|
15
|
+
expect(wrapper.find('h2').exists()).toBe(true)
|
|
16
|
+
expect(wrapper.text()).toBe('Test heading')
|
|
17
|
+
expect(wrapper.classes()).toContain('sy-heading')
|
|
18
|
+
})
|
|
19
|
+
|
|
20
|
+
it('renders custom heading levels', () => {
|
|
21
|
+
const levels = [1, 2, 3, 4, 5, 6] as const
|
|
22
|
+
|
|
23
|
+
levels.forEach((level) => {
|
|
24
|
+
const wrapper = mount(SyHeading, {
|
|
25
|
+
props: {
|
|
26
|
+
level,
|
|
27
|
+
},
|
|
28
|
+
slots: {
|
|
29
|
+
default: `Heading level ${level}`,
|
|
30
|
+
},
|
|
31
|
+
})
|
|
32
|
+
|
|
33
|
+
expect(wrapper.find(`h${level}`).exists()).toBe(true)
|
|
34
|
+
expect(wrapper.text()).toBe(`Heading level ${level}`)
|
|
35
|
+
})
|
|
36
|
+
})
|
|
37
|
+
|
|
38
|
+
it('applies correct CSS class', () => {
|
|
39
|
+
const wrapper = mount(SyHeading, {
|
|
40
|
+
slots: {
|
|
41
|
+
default: 'Test heading',
|
|
42
|
+
},
|
|
43
|
+
})
|
|
44
|
+
|
|
45
|
+
expect(wrapper.classes()).toContain('sy-heading')
|
|
46
|
+
})
|
|
47
|
+
|
|
48
|
+
it('renders complex content', () => {
|
|
49
|
+
const wrapper = mount(SyHeading, {
|
|
50
|
+
slots: {
|
|
51
|
+
default: '<span>Complex <strong>content</strong></span>',
|
|
52
|
+
},
|
|
53
|
+
})
|
|
54
|
+
|
|
55
|
+
expect(wrapper.text()).toBe('Complex content')
|
|
56
|
+
})
|
|
57
|
+
|
|
58
|
+
it('should not have any accessibility violations', async () => {
|
|
59
|
+
const wrapper = mount(SyHeading, {
|
|
60
|
+
props: {
|
|
61
|
+
level: 1,
|
|
62
|
+
},
|
|
63
|
+
slots: {
|
|
64
|
+
default: 'Main heading',
|
|
65
|
+
},
|
|
66
|
+
})
|
|
67
|
+
|
|
68
|
+
const results = await axe(wrapper.element, {
|
|
69
|
+
rules: {
|
|
70
|
+
region: { enabled: false },
|
|
71
|
+
},
|
|
72
|
+
})
|
|
73
|
+
assertNoA11yViolations(results, 'SyHeading - main heading')
|
|
74
|
+
})
|
|
75
|
+
|
|
76
|
+
it('should not have accessibility violations for all heading levels', async () => {
|
|
77
|
+
const levels = [1, 2, 3, 4, 5, 6] as const
|
|
78
|
+
|
|
79
|
+
for (const level of levels) {
|
|
80
|
+
const wrapper = mount(SyHeading, {
|
|
81
|
+
props: {
|
|
82
|
+
level,
|
|
83
|
+
},
|
|
84
|
+
slots: {
|
|
85
|
+
default: `Heading level ${level}`,
|
|
86
|
+
},
|
|
87
|
+
})
|
|
88
|
+
|
|
89
|
+
const results = await axe(wrapper.element, {
|
|
90
|
+
rules: {
|
|
91
|
+
region: { enabled: false },
|
|
92
|
+
},
|
|
93
|
+
})
|
|
94
|
+
assertNoA11yViolations(results, `SyHeading - level ${level}`)
|
|
95
|
+
}
|
|
96
|
+
})
|
|
97
|
+
|
|
98
|
+
it('should not have accessibility violations with complex content', async () => {
|
|
99
|
+
const wrapper = mount(SyHeading, {
|
|
100
|
+
props: {
|
|
101
|
+
level: 2,
|
|
102
|
+
},
|
|
103
|
+
slots: {
|
|
104
|
+
default: '<span>Heading with <em>emphasis</em> and <strong>strong text</strong></span>',
|
|
105
|
+
},
|
|
106
|
+
})
|
|
107
|
+
|
|
108
|
+
const results = await axe(wrapper.element, {
|
|
109
|
+
rules: {
|
|
110
|
+
region: { enabled: false },
|
|
111
|
+
},
|
|
112
|
+
})
|
|
113
|
+
assertNoA11yViolations(results, 'SyHeading - complex content')
|
|
114
|
+
})
|
|
115
|
+
})
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
<script setup lang="ts">
|
|
2
2
|
import { computed } from 'vue'
|
|
3
3
|
|
|
4
|
-
const props = defineProps<{
|
|
5
|
-
level
|
|
6
|
-
}>()
|
|
4
|
+
const props = withDefaults(defineProps<{
|
|
5
|
+
level?: 1 | 2 | 3 | 4 | 5 | 6
|
|
6
|
+
}>(), {
|
|
7
|
+
level: 2,
|
|
8
|
+
})
|
|
7
9
|
|
|
8
10
|
const tag = computed(() => `h${props.level}`)
|
|
9
11
|
</script>
|
|
@@ -9,11 +9,11 @@ const meta = {
|
|
|
9
9
|
parameters: {
|
|
10
10
|
docs: {
|
|
11
11
|
controls: {
|
|
12
|
-
exclude: ['
|
|
12
|
+
exclude: ['validateOn', 'update:modelValue', 'onUpdate:modelValue'],
|
|
13
13
|
},
|
|
14
14
|
},
|
|
15
15
|
controls: {
|
|
16
|
-
exclude: ['
|
|
16
|
+
exclude: ['validateOn', 'onUpdate:modelValue'],
|
|
17
17
|
},
|
|
18
18
|
},
|
|
19
19
|
argTypes: {
|
|
@@ -89,6 +89,142 @@ const meta = {
|
|
|
89
89
|
table: {
|
|
90
90
|
type: { summary: 'boolean' },
|
|
91
91
|
defaultValue: { summary: 'false' },
|
|
92
|
+
category: 'validation',
|
|
93
|
+
},
|
|
94
|
+
},
|
|
95
|
+
rules: {
|
|
96
|
+
control: { type: 'object' },
|
|
97
|
+
description: 'Règles de validation Vuetify (mode useVuetifyValidation=true)',
|
|
98
|
+
table: {
|
|
99
|
+
type: { summary: 'Array<(value: string) => boolean | string>' },
|
|
100
|
+
defaultValue: { summary: '[]' },
|
|
101
|
+
category: 'validation',
|
|
102
|
+
},
|
|
103
|
+
},
|
|
104
|
+
useVuetifyValidation: {
|
|
105
|
+
control: { type: 'boolean' },
|
|
106
|
+
description: 'Active la validation Vuetify (sinon validation unifiée customRules)',
|
|
107
|
+
table: {
|
|
108
|
+
type: { summary: 'boolean' },
|
|
109
|
+
defaultValue: { summary: 'false' },
|
|
110
|
+
category: 'validation',
|
|
111
|
+
},
|
|
112
|
+
},
|
|
113
|
+
isValidateOnBlur: {
|
|
114
|
+
control: { type: 'boolean' },
|
|
115
|
+
description: 'Déclenche la validation au blur (sinon à la saisie)',
|
|
116
|
+
table: {
|
|
117
|
+
type: { summary: 'boolean' },
|
|
118
|
+
defaultValue: { summary: 'true' },
|
|
119
|
+
category: 'validation',
|
|
120
|
+
},
|
|
121
|
+
},
|
|
122
|
+
disableErrorHandling: {
|
|
123
|
+
control: { type: 'boolean' },
|
|
124
|
+
description: 'Désactive la gestion des messages d\'erreur/alerte/succès',
|
|
125
|
+
table: {
|
|
126
|
+
type: { summary: 'boolean' },
|
|
127
|
+
defaultValue: { summary: 'false' },
|
|
128
|
+
category: 'validation',
|
|
129
|
+
},
|
|
130
|
+
},
|
|
131
|
+
showSuccessMessages: {
|
|
132
|
+
control: { type: 'boolean' },
|
|
133
|
+
description: 'Affiche les messages de succès',
|
|
134
|
+
table: {
|
|
135
|
+
type: { summary: 'boolean' },
|
|
136
|
+
defaultValue: { summary: 'true' },
|
|
137
|
+
category: 'validation',
|
|
138
|
+
},
|
|
139
|
+
},
|
|
140
|
+
customRules: {
|
|
141
|
+
control: { type: 'object' },
|
|
142
|
+
description: 'Règles d\'erreur pour le mode validation unifiée',
|
|
143
|
+
table: {
|
|
144
|
+
type: { summary: 'ValidationRule[]' },
|
|
145
|
+
defaultValue: { summary: '[]' },
|
|
146
|
+
category: 'validation',
|
|
147
|
+
},
|
|
148
|
+
},
|
|
149
|
+
customWarningRules: {
|
|
150
|
+
control: { type: 'object' },
|
|
151
|
+
description: 'Règles d\'alerte pour le mode validation unifiée',
|
|
152
|
+
table: {
|
|
153
|
+
type: { summary: 'ValidationRule[]' },
|
|
154
|
+
defaultValue: { summary: '[]' },
|
|
155
|
+
category: 'validation',
|
|
156
|
+
},
|
|
157
|
+
},
|
|
158
|
+
customSuccessRules: {
|
|
159
|
+
control: { type: 'object' },
|
|
160
|
+
description: 'Règles de succès pour le mode validation unifiée',
|
|
161
|
+
table: {
|
|
162
|
+
type: { summary: 'ValidationRule[]' },
|
|
163
|
+
defaultValue: { summary: '[]' },
|
|
164
|
+
category: 'validation',
|
|
165
|
+
},
|
|
166
|
+
},
|
|
167
|
+
errorMessages: {
|
|
168
|
+
control: { type: 'object' },
|
|
169
|
+
description: 'Messages d\'erreur externes ajoutés au résultat de validation',
|
|
170
|
+
table: {
|
|
171
|
+
type: { summary: 'string[] | null' },
|
|
172
|
+
defaultValue: { summary: 'null' },
|
|
173
|
+
category: 'validation',
|
|
174
|
+
},
|
|
175
|
+
},
|
|
176
|
+
warningMessages: {
|
|
177
|
+
control: { type: 'object' },
|
|
178
|
+
description: 'Messages d\'alerte externes ajoutés au résultat de validation',
|
|
179
|
+
table: {
|
|
180
|
+
type: { summary: 'string[] | null' },
|
|
181
|
+
defaultValue: { summary: 'null' },
|
|
182
|
+
category: 'validation',
|
|
183
|
+
},
|
|
184
|
+
},
|
|
185
|
+
successMessages: {
|
|
186
|
+
control: { type: 'object' },
|
|
187
|
+
description: 'Messages de succès externes ajoutés au résultat de validation',
|
|
188
|
+
table: {
|
|
189
|
+
type: { summary: 'string[] | null' },
|
|
190
|
+
defaultValue: { summary: 'null' },
|
|
191
|
+
category: 'validation',
|
|
192
|
+
},
|
|
193
|
+
},
|
|
194
|
+
hasError: {
|
|
195
|
+
control: { type: 'boolean' },
|
|
196
|
+
description: 'Force l\'état erreur',
|
|
197
|
+
table: {
|
|
198
|
+
type: { summary: 'boolean' },
|
|
199
|
+
defaultValue: { summary: 'false' },
|
|
200
|
+
category: 'validation',
|
|
201
|
+
},
|
|
202
|
+
},
|
|
203
|
+
hasWarning: {
|
|
204
|
+
control: { type: 'boolean' },
|
|
205
|
+
description: 'Force l\'état alerte',
|
|
206
|
+
table: {
|
|
207
|
+
type: { summary: 'boolean' },
|
|
208
|
+
defaultValue: { summary: 'false' },
|
|
209
|
+
category: 'validation',
|
|
210
|
+
},
|
|
211
|
+
},
|
|
212
|
+
hasSuccess: {
|
|
213
|
+
control: { type: 'boolean' },
|
|
214
|
+
description: 'Force l\'état succès',
|
|
215
|
+
table: {
|
|
216
|
+
type: { summary: 'boolean' },
|
|
217
|
+
defaultValue: { summary: 'false' },
|
|
218
|
+
category: 'validation',
|
|
219
|
+
},
|
|
220
|
+
},
|
|
221
|
+
maxErrors: {
|
|
222
|
+
control: { type: 'number' },
|
|
223
|
+
description: 'Nombre maximum de messages d\'erreur affichés',
|
|
224
|
+
table: {
|
|
225
|
+
type: { summary: 'number' },
|
|
226
|
+
defaultValue: { summary: '1' },
|
|
227
|
+
category: 'validation',
|
|
92
228
|
},
|
|
93
229
|
},
|
|
94
230
|
},
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
<script setup lang="ts">
|
|
2
2
|
import { computed, ref, toRef, watch } from 'vue'
|
|
3
3
|
import type { VTextarea } from 'vuetify/components'
|
|
4
|
-
import { locales } from './locales'
|
|
5
4
|
import useTextActions from './useTextActions'
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
import { useDefaultValidationRules, type TextareaRule as Rule } from './useDefaultValidationRules'
|
|
6
|
+
import { useValidation, validationPropsDefaults, type FieldValidationProps } from '@/composables/unifyValidation/useValidation'
|
|
7
|
+
import type { ValidationRule as SyValidationRule } from '@/composables/validation/useValidation'
|
|
8
8
|
|
|
9
9
|
const props = withDefaults(defineProps<{
|
|
10
10
|
modelValue?: string
|
|
@@ -20,12 +20,11 @@
|
|
|
20
20
|
color?: string
|
|
21
21
|
label: string
|
|
22
22
|
bgColor?: string
|
|
23
|
-
}>(), {
|
|
23
|
+
} & FieldValidationProps>(), {
|
|
24
24
|
modelValue: '',
|
|
25
25
|
trim: false,
|
|
26
26
|
replaceTabs: undefined,
|
|
27
27
|
rules: () => [],
|
|
28
|
-
required: false,
|
|
29
28
|
maxLines: undefined,
|
|
30
29
|
autoWrap: undefined,
|
|
31
30
|
normalize: false,
|
|
@@ -33,6 +32,7 @@
|
|
|
33
32
|
variant: 'outlined',
|
|
34
33
|
color: 'primary',
|
|
35
34
|
bgColor: 'white',
|
|
35
|
+
...validationPropsDefaults,
|
|
36
36
|
})
|
|
37
37
|
|
|
38
38
|
const emits = defineEmits<{
|
|
@@ -41,6 +41,7 @@
|
|
|
41
41
|
|
|
42
42
|
const textAreaRef = ref<VTextarea | null>(null)
|
|
43
43
|
const hasInteracted = ref(false)
|
|
44
|
+
const focused = ref(false)
|
|
44
45
|
|
|
45
46
|
const internalValue = ref(props.modelValue)
|
|
46
47
|
watch(
|
|
@@ -87,25 +88,48 @@
|
|
|
87
88
|
internalValue.value = value
|
|
88
89
|
}
|
|
89
90
|
|
|
90
|
-
const
|
|
91
|
-
|
|
91
|
+
const { vuetifyRules: defaultVuetifyRules, customRules: defaultCustomRules } = useDefaultValidationRules({
|
|
92
|
+
required: toRef(props, 'required'),
|
|
93
|
+
maxLines: toRef(props, 'maxLines'),
|
|
94
|
+
hasInteracted,
|
|
95
|
+
})
|
|
92
96
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
return true
|
|
98
|
-
})
|
|
97
|
+
const mergedCustomRules = computed<SyValidationRule[]>(() => [
|
|
98
|
+
...defaultCustomRules.value,
|
|
99
|
+
...(props.customRules || []),
|
|
100
|
+
])
|
|
99
101
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
102
|
+
const mergedVuetifyRules = computed<Rule[]>(() => [
|
|
103
|
+
...(props.rules || []),
|
|
104
|
+
...defaultVuetifyRules.value,
|
|
105
|
+
])
|
|
106
|
+
|
|
107
|
+
const { validate, errors, warnings, successes, hasError, hasWarning, hasSuccess } = useValidation({
|
|
108
|
+
modelValue: internalValue,
|
|
109
|
+
readonly: toRef(props, 'readonly'),
|
|
110
|
+
disabled: toRef(props, 'disabled'),
|
|
111
|
+
required: toRef(props, 'required'),
|
|
112
|
+
isValidateOnBlur: toRef(props, 'isValidateOnBlur'),
|
|
113
|
+
showSuccessMessages: toRef(props, 'showSuccessMessages'),
|
|
114
|
+
disableErrorHandling: toRef(props, 'disableErrorHandling'),
|
|
115
|
+
useVuetifyValidation: toRef(props, 'useVuetifyValidation'),
|
|
116
|
+
label: toRef(props, 'label'),
|
|
117
|
+
rules: mergedVuetifyRules,
|
|
118
|
+
customRules: mergedCustomRules,
|
|
119
|
+
customWarningRules: toRef(props, 'customWarningRules'),
|
|
120
|
+
customSuccessRules: toRef(props, 'customSuccessRules'),
|
|
121
|
+
errorMessages: toRef(props, 'errorMessages'),
|
|
122
|
+
warningMessages: toRef(props, 'warningMessages'),
|
|
123
|
+
successMessages: toRef(props, 'successMessages'),
|
|
124
|
+
hasErrorProp: toRef(props, 'hasError'),
|
|
125
|
+
hasWarningProp: toRef(props, 'hasWarning'),
|
|
126
|
+
hasSuccessProp: toRef(props, 'hasSuccess'),
|
|
127
|
+
maxErrors: toRef(props, 'maxErrors'),
|
|
128
|
+
focused,
|
|
129
|
+
})
|
|
107
130
|
|
|
108
|
-
|
|
131
|
+
defineExpose({
|
|
132
|
+
validateOnSubmit: validate,
|
|
109
133
|
})
|
|
110
134
|
|
|
111
135
|
</script>
|
|
@@ -117,13 +141,19 @@
|
|
|
117
141
|
:variant="variant"
|
|
118
142
|
:color="color"
|
|
119
143
|
:bg-color="props.bgColor"
|
|
144
|
+
:error="hasError"
|
|
145
|
+
:error-messages="errors"
|
|
146
|
+
:messages="hasError ? errors : (hasWarning ? warnings : (hasSuccess && props.showSuccessMessages ? successes : []))"
|
|
147
|
+
:max-errors="props.maxErrors"
|
|
148
|
+
:disabled="props.disabled"
|
|
149
|
+
:readonly="props.readonly"
|
|
120
150
|
:validate-on="validateOn"
|
|
121
|
-
:rules="
|
|
151
|
+
:rules="props.useVuetifyValidation ? mergedVuetifyRules : undefined"
|
|
122
152
|
:label="label"
|
|
123
153
|
:aria-label="label"
|
|
124
154
|
:required="required"
|
|
125
155
|
:aria-required="required ? 'true' : undefined"
|
|
126
156
|
@update:model-value="execValueChange"
|
|
127
|
-
@update:focused="(e: boolean) => !e
|
|
157
|
+
@update:focused="(e: boolean) => { focused = e; if (!e) execBlurChange() }"
|
|
128
158
|
/>
|
|
129
159
|
</template>
|
|
@@ -1,10 +1,82 @@
|
|
|
1
|
-
import { Meta,
|
|
2
|
-
import * as
|
|
3
|
-
import '@/
|
|
1
|
+
import { Meta, Primary } from '@storybook/blocks';
|
|
2
|
+
import * as Stories from '../SyTextArea.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={Stories} />
|
|
6
14
|
|
|
7
|
-
<
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
15
|
+
<AccessibilityGuideLayout
|
|
16
|
+
componentName="SyTextArea"
|
|
17
|
+
iconSrc={AccessibilityIcon}
|
|
18
|
+
apgHref="https://www.w3.org/WAI/ARIA/apg/patterns/textinput/"
|
|
19
|
+
>
|
|
20
|
+
|
|
21
|
+
<CriteriaSection>
|
|
22
|
+
<CriteriaCard icon="🔍" title="Structure sémantique et attributs">
|
|
23
|
+
<ul>
|
|
24
|
+
<li><strong>Élément textarea natif</strong> : Utilisation de <code><textarea></code> via VTextarea pour une sémantique correcte adaptée aux textes multilignes.</li>
|
|
25
|
+
<li><strong>Labels explicites</strong> : Gestion automatique du <code>aria-label</code> basé sur la prop <code>label</code>. L'attribut <code>aria-required</code> est ajouté si le champ est requis.</li>
|
|
26
|
+
<li><strong>Association avec les messages</strong> : Implémentation native de <code>aria-describedby</code> par Vuetify pour lier le champ à ses messages d'erreur.</li>
|
|
27
|
+
<li><strong>Validation accessible</strong> : Les messages d'erreur sont automatiquement associés au textarea via les attributs ARIA.</li>
|
|
28
|
+
</ul>
|
|
29
|
+
</CriteriaCard>
|
|
30
|
+
|
|
31
|
+
<CriteriaCard icon="⌨️" title="Navigation et interaction clavier">
|
|
32
|
+
<ul>
|
|
33
|
+
<li><strong>Focus natif</strong> : Le textarea est naturellement focusable via <kbd>Tab</kbd> et permet la navigation dans le contenu avec les flèches.</li>
|
|
34
|
+
<li><strong>Saisie multiligne</strong> : Support natif des sauts de ligne avec <kbd>Entrée</kbd> et navigation entre les lignes avec les flèches directionnelles.</li>
|
|
35
|
+
<li><strong>Défilement automatique</strong> : Le composant gère automatiquement le défilement lorsque le contenu dépasse la hauteur visible.</li>
|
|
36
|
+
<li><strong>Indicateur de focus</strong> : Styles de focus visibles conformes aux standards d'accessibilité.</li>
|
|
37
|
+
</ul>
|
|
38
|
+
</CriteriaCard>
|
|
39
|
+
|
|
40
|
+
<CriteriaCard icon="🎨" title="Styles et états visuels">
|
|
41
|
+
<ul>
|
|
42
|
+
<li><strong>Contrastes garantis</strong> : Couleurs distinctes pour les états erreur et validation respectant les critères WCAG.</li>
|
|
43
|
+
<li><strong>États cohérents</strong> : Changements visuels clairs entre les états normal, erreur et focus.</li>
|
|
44
|
+
<li><strong>Zone de saisie claire</strong> : Délimitation visuelle évidente de la zone de saisie multiligne.</li>
|
|
45
|
+
<li><strong>Styles personnalisables</strong> : Support des variantes (outlined, filled) et couleurs personnalisées tout en maintenant l'accessibilité.</li>
|
|
46
|
+
</ul>
|
|
47
|
+
</CriteriaCard>
|
|
48
|
+
|
|
49
|
+
<CriteriaCard icon="📝" title="Validation et contraintes">
|
|
50
|
+
<ul>
|
|
51
|
+
<li><strong>Champ requis</strong> : Validation automatique avec message "Ce champ est requis" lorsque <code>required</code> est true.</li>
|
|
52
|
+
<li><strong>Limite de lignes</strong> : Validation du nombre maximum de lignes avec message d'erreur spécifique via la prop <code>maxLines</code>.</li>
|
|
53
|
+
<li><strong>Règles personnalisées</strong> : Support des règles de validation personnalisées avec messages d'erreur accessibles.</li>
|
|
54
|
+
<li><strong>Validation au blur</strong> : Déclenchement de la validation lors de la perte de focus pour une expérience utilisateur optimale.</li>
|
|
55
|
+
</ul>
|
|
56
|
+
</CriteriaCard>
|
|
57
|
+
</CriteriaSection>
|
|
58
|
+
|
|
59
|
+
<DemoSection componentName="SyTextArea">
|
|
60
|
+
<Primary />
|
|
61
|
+
</DemoSection>
|
|
62
|
+
|
|
63
|
+
<BestPracticesSection>
|
|
64
|
+
<ul>
|
|
65
|
+
<li><strong>Labels descriptifs</strong> : Utilisez toujours un <code>label</code> clair qui indique la nature du contenu attendu (ex: "Description", "Commentaires").</li>
|
|
66
|
+
<li><strong>Limites appropriées</strong> : Définissez une <code>maxLines</code> raisonnable pour guider l'utilisateur sans trop contraindre la saisie.</li>
|
|
67
|
+
<li><strong>Messages d'erreur utiles</strong> : Complétez les règles de validation avec des messages spécifiques qui aident à corriger la saisie.</li>
|
|
68
|
+
<li><strong>Évitez les placeholders comme seuls indicateurs</strong> : Le placeholder disparaît lors de la saisie, il doit compléter le label mais pas le remplacer.</li>
|
|
69
|
+
<li><strong>Traitement du texte</strong> : Utilisez les options de traitement (<code>trim</code>, <code>normalize</code>, <code>replaceTabs</code>) pour améliorer la qualité des données saisies.</li>
|
|
70
|
+
<li><strong>Saisie confortable</strong> : Assurez-vous que la hauteur du textarea est suffisante pour une saisie confortable du contenu attendu.</li>
|
|
71
|
+
</ul>
|
|
72
|
+
</BestPracticesSection>
|
|
73
|
+
|
|
74
|
+
<ResourcesSection>
|
|
75
|
+
<ul>
|
|
76
|
+
<li><a href="https://www.w3.org/WAI/ARIA/apg/patterns/textinput/" target="_blank" rel="noopener noreferrer">Guide des pratiques WAI-ARIA : Champs de texte</a></li>
|
|
77
|
+
<li><a href="https://accessibilite.numerique.gouv.fr/methode/criteres-et-tests/#11.9" target="_blank" rel="noopener noreferrer">RGAA : Champs de formulaire</a></li>
|
|
78
|
+
<li><a href="https://www.w3.org/WAI/WCAG21/Techniques/html/H91.html" target="_blank" rel="noopener noreferrer">WCAG Technique H91 : Utiliser les éléments HTML sémantiques</a></li>
|
|
79
|
+
<li><a href="https://developer.mozilla.org/fr/docs/Web/HTML/Element/textarea" target="_blank" rel="noopener noreferrer">MDN : Élément textarea</a></li>
|
|
80
|
+
</ul>
|
|
81
|
+
</ResourcesSection>
|
|
82
|
+
</AccessibilityGuideLayout>
|