@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
|
@@ -11,15 +11,15 @@
|
|
|
11
11
|
mdiAlertCircle,
|
|
12
12
|
mdiCalendar,
|
|
13
13
|
} from '@mdi/js'
|
|
14
|
-
import { computed, onMounted, ref, watch, nextTick, useAttrs, type ComponentPublicInstance } from 'vue'
|
|
14
|
+
import { computed, onMounted, ref, watch, nextTick, useAttrs, type ComponentPublicInstance, toRef } from 'vue'
|
|
15
15
|
import type { IconType, VariantStyle, ColorType } from '@/types/vuetifyTypes'
|
|
16
|
-
import { useValidation, type ValidationRule } from '@/composables/validation/useValidation'
|
|
17
|
-
import { useValidatable } from '@/composables/validation/useValidatable'
|
|
18
16
|
import SyIcon from '@/components/Customs/SyIcon/SyIcon.vue'
|
|
17
|
+
import type { ValidationRule } from '@/composables/validation/useValidation'
|
|
18
|
+
import { useValidation, validationPropsDefaults, type FieldValidationProps } from '@/composables/unifyValidation/useValidation'
|
|
19
19
|
|
|
20
20
|
const props = withDefaults(
|
|
21
21
|
defineProps<{
|
|
22
|
-
modelValue?: string | number | null
|
|
22
|
+
modelValue?: string | number | null | undefined
|
|
23
23
|
prependIcon?: IconType
|
|
24
24
|
appendIcon?: IconType
|
|
25
25
|
prependInnerIcon?: IconType
|
|
@@ -32,10 +32,6 @@
|
|
|
32
32
|
isClearable?: boolean
|
|
33
33
|
showDivider?: boolean
|
|
34
34
|
label?: string
|
|
35
|
-
required?: boolean
|
|
36
|
-
errorMessages?: string[] | null
|
|
37
|
-
warningMessages?: string[] | null
|
|
38
|
-
successMessages?: string[] | null
|
|
39
35
|
readonly?: boolean
|
|
40
36
|
isActive?: boolean
|
|
41
37
|
baseColor?: string
|
|
@@ -56,7 +52,6 @@
|
|
|
56
52
|
hint?: string
|
|
57
53
|
id?: string
|
|
58
54
|
loading?: string | boolean
|
|
59
|
-
maxErrors?: string | number
|
|
60
55
|
maxWidth?: string | number
|
|
61
56
|
messages?: string | string[]
|
|
62
57
|
minWidth?: string | number
|
|
@@ -70,9 +65,6 @@
|
|
|
70
65
|
isReversed?: boolean
|
|
71
66
|
role?: string
|
|
72
67
|
rounded?: string | number | boolean
|
|
73
|
-
hasError?: boolean
|
|
74
|
-
hasWarning?: boolean
|
|
75
|
-
hasSuccess?: boolean
|
|
76
68
|
isOnSingleLine?: boolean
|
|
77
69
|
suffix?: string
|
|
78
70
|
theme?: string
|
|
@@ -81,18 +73,12 @@
|
|
|
81
73
|
width?: string | number
|
|
82
74
|
displayAsterisk?: boolean
|
|
83
75
|
noIcon?: boolean
|
|
84
|
-
customRules?: ValidationRule[]
|
|
85
|
-
customWarningRules?: ValidationRule[]
|
|
86
|
-
customSuccessRules?: ValidationRule[]
|
|
87
|
-
showSuccessMessages?: boolean
|
|
88
|
-
isValidateOnBlur?: boolean
|
|
89
|
-
disableErrorHandling?: boolean
|
|
90
76
|
disableClickButton?: boolean
|
|
91
77
|
autocomplete?: string
|
|
92
78
|
helpText?: string
|
|
93
79
|
maxlength?: string | number
|
|
94
80
|
title?: string | false
|
|
95
|
-
}>(),
|
|
81
|
+
} & FieldValidationProps>(),
|
|
96
82
|
{
|
|
97
83
|
modelValue: undefined,
|
|
98
84
|
prependIcon: undefined,
|
|
@@ -105,10 +91,6 @@
|
|
|
105
91
|
variantStyle: 'outlined',
|
|
106
92
|
color: 'primary',
|
|
107
93
|
label: '',
|
|
108
|
-
errorMessages: null,
|
|
109
|
-
warningMessages: null,
|
|
110
|
-
successMessages: null,
|
|
111
|
-
readonly: false,
|
|
112
94
|
isClearable: false,
|
|
113
95
|
isActive: false,
|
|
114
96
|
baseColor: undefined,
|
|
@@ -119,7 +101,6 @@
|
|
|
119
101
|
density: 'default',
|
|
120
102
|
direction: 'horizontal',
|
|
121
103
|
isDirty: false,
|
|
122
|
-
disabled: false,
|
|
123
104
|
isOnError: false,
|
|
124
105
|
isFlat: false,
|
|
125
106
|
isFocused: false,
|
|
@@ -128,13 +109,10 @@
|
|
|
128
109
|
hint: undefined,
|
|
129
110
|
id: undefined,
|
|
130
111
|
loading: false,
|
|
131
|
-
maxErrors: undefined,
|
|
132
112
|
maxWidth: undefined,
|
|
133
113
|
messages: undefined,
|
|
134
114
|
minWidth: undefined,
|
|
135
115
|
name: undefined,
|
|
136
|
-
hasError: false,
|
|
137
|
-
hasWarning: false,
|
|
138
116
|
displayPersistentClear: false,
|
|
139
117
|
displayPersistentCounter: false,
|
|
140
118
|
displayPersistentHint: false,
|
|
@@ -152,17 +130,12 @@
|
|
|
152
130
|
width: undefined,
|
|
153
131
|
displayAsterisk: false,
|
|
154
132
|
noIcon: false,
|
|
155
|
-
customRules: () => [],
|
|
156
|
-
customWarningRules: () => [],
|
|
157
|
-
customSuccessRules: () => [],
|
|
158
|
-
showSuccessMessages: true,
|
|
159
|
-
isValidateOnBlur: true,
|
|
160
|
-
disableErrorHandling: false,
|
|
161
133
|
disableClickButton: true,
|
|
162
134
|
autocomplete: 'off',
|
|
163
135
|
helpText: '',
|
|
164
136
|
maxlength: undefined,
|
|
165
137
|
title: undefined,
|
|
138
|
+
...validationPropsDefaults,
|
|
166
139
|
},
|
|
167
140
|
)
|
|
168
141
|
|
|
@@ -182,8 +155,35 @@
|
|
|
182
155
|
'clear',
|
|
183
156
|
'prepend-icon-click',
|
|
184
157
|
'append-icon-click',
|
|
158
|
+
'focus',
|
|
159
|
+
'blur',
|
|
185
160
|
])
|
|
186
161
|
|
|
162
|
+
const NUMBER_ALLOWED_CHARACTERS_PATTERN = /[^0-9eE+.-]/g
|
|
163
|
+
const NUMBER_ALLOWED_SINGLE_CHARACTER_PATTERN = /^[0-9eE+.-]$/
|
|
164
|
+
const TEL_ALLOWED_CHARACTERS_PATTERN = /[^0-9+().\-\s]/g
|
|
165
|
+
const TEL_ALLOWED_SINGLE_CHARACTER_PATTERN = /^[0-9+().\-\s]$/
|
|
166
|
+
|
|
167
|
+
const sanitizeNumberValue = (value: string | number | null | undefined) => {
|
|
168
|
+
if (props.type !== 'number' || typeof value !== 'string') {
|
|
169
|
+
return value
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
return value.replace(NUMBER_ALLOWED_CHARACTERS_PATTERN, '')
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
const sanitizeTelValue = (value: string | number | null | undefined) => {
|
|
176
|
+
if (props.type !== 'tel' || typeof value !== 'string') {
|
|
177
|
+
return value
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
return value.replace(TEL_ALLOWED_CHARACTERS_PATTERN, '')
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
const sanitizeTypedValue = (value: string | number | null | undefined) => {
|
|
184
|
+
return sanitizeTelValue(sanitizeNumberValue(value))
|
|
185
|
+
}
|
|
186
|
+
|
|
187
187
|
const lastEmittedModelValue = ref(props.modelValue)
|
|
188
188
|
|
|
189
189
|
const model = computed({
|
|
@@ -191,12 +191,51 @@
|
|
|
191
191
|
return props.modelValue
|
|
192
192
|
},
|
|
193
193
|
set(value) {
|
|
194
|
-
|
|
195
|
-
|
|
194
|
+
const sanitizedValue = sanitizeTypedValue(value)
|
|
195
|
+
emit('update:modelValue', sanitizedValue)
|
|
196
|
+
lastEmittedModelValue.value = sanitizedValue
|
|
196
197
|
},
|
|
197
198
|
})
|
|
198
199
|
|
|
199
200
|
const attrs = useAttrs()
|
|
201
|
+
const focused = ref(false)
|
|
202
|
+
// Construction des règles de validation
|
|
203
|
+
const defaultRules = computed<ValidationRule[]>(() => props.required
|
|
204
|
+
? [{
|
|
205
|
+
type: 'required',
|
|
206
|
+
options: {
|
|
207
|
+
message: `Le champ ${props.label || 'ce champ'} est requis.`,
|
|
208
|
+
fieldIdentifier: props.label,
|
|
209
|
+
},
|
|
210
|
+
}]
|
|
211
|
+
: [],
|
|
212
|
+
)
|
|
213
|
+
const { validate, errors, warnings, successes, hasError, hasWarning, hasSuccess } = useValidation({
|
|
214
|
+
modelValue: model,
|
|
215
|
+
readonly: toRef(props, 'readonly'),
|
|
216
|
+
disabled: toRef(props, 'disabled'),
|
|
217
|
+
required: toRef(props, 'required'),
|
|
218
|
+
isValidateOnBlur: toRef(props, 'isValidateOnBlur'),
|
|
219
|
+
showSuccessMessages: toRef(props, 'showSuccessMessages'),
|
|
220
|
+
disableErrorHandling: toRef(props, 'disableErrorHandling'),
|
|
221
|
+
useVuetifyValidation: toRef(props, 'useVuetifyValidation'),
|
|
222
|
+
label: toRef(props, 'label'),
|
|
223
|
+
rules: toRef(props, 'rules'),
|
|
224
|
+
customRules: computed(() => {
|
|
225
|
+
const customRules = props.customRules ? props.customRules : []
|
|
226
|
+
return [...defaultRules.value, ...customRules]
|
|
227
|
+
}),
|
|
228
|
+
customWarningRules: toRef(props, 'customWarningRules'),
|
|
229
|
+
customSuccessRules: toRef(props, 'customSuccessRules'),
|
|
230
|
+
errorMessages: toRef(props, 'errorMessages'),
|
|
231
|
+
warningMessages: toRef(props, 'warningMessages'),
|
|
232
|
+
successMessages: toRef(props, 'successMessages'),
|
|
233
|
+
hasErrorProp: toRef(props, 'hasError'),
|
|
234
|
+
hasWarningProp: toRef(props, 'hasWarning'),
|
|
235
|
+
hasSuccessProp: toRef(props, 'hasSuccess'),
|
|
236
|
+
maxErrors: toRef(props, 'maxErrors'),
|
|
237
|
+
focused: focused,
|
|
238
|
+
})
|
|
200
239
|
|
|
201
240
|
const forwardedAttrs = computed(() => {
|
|
202
241
|
const filteredAttrs = Object.fromEntries(
|
|
@@ -215,8 +254,6 @@
|
|
|
215
254
|
return filteredAttrs
|
|
216
255
|
})
|
|
217
256
|
|
|
218
|
-
const isBlurred = ref(false)
|
|
219
|
-
|
|
220
257
|
const showClear = computed(() => {
|
|
221
258
|
if (!props.isClearable) return false
|
|
222
259
|
if (props.disabled) return false
|
|
@@ -227,102 +264,12 @@
|
|
|
227
264
|
model.value = ''
|
|
228
265
|
}
|
|
229
266
|
|
|
230
|
-
// Initialisation du composable de validation
|
|
231
|
-
const validation = useValidation({
|
|
232
|
-
customRules: props.customRules,
|
|
233
|
-
warningRules: props.customWarningRules,
|
|
234
|
-
successRules: props.customSuccessRules,
|
|
235
|
-
showSuccessMessages: props.showSuccessMessages,
|
|
236
|
-
fieldIdentifier: props.label,
|
|
237
|
-
disableErrorHandling: props.disableErrorHandling,
|
|
238
|
-
})
|
|
239
|
-
|
|
240
|
-
// Synchronisation des messages externes
|
|
241
|
-
watch(() => props.errorMessages, (newVal) => {
|
|
242
|
-
validation.errors.value = newVal || []
|
|
243
|
-
}, { immediate: true })
|
|
244
|
-
|
|
245
|
-
watch(() => props.warningMessages, (newVal) => {
|
|
246
|
-
validation.warnings.value = newVal || []
|
|
247
|
-
}, { immediate: true })
|
|
248
|
-
|
|
249
|
-
watch(() => props.successMessages, (newVal) => {
|
|
250
|
-
validation.successes.value = newVal || []
|
|
251
|
-
}, { immediate: true })
|
|
252
|
-
|
|
253
|
-
// Construction des règles de validation
|
|
254
|
-
const defaultRules = computed<ValidationRule[]>(() => props.required
|
|
255
|
-
? [{
|
|
256
|
-
type: 'required',
|
|
257
|
-
options: {
|
|
258
|
-
message: `Le champ ${props.label || 'ce champ'} est requis.`,
|
|
259
|
-
fieldIdentifier: props.label,
|
|
260
|
-
},
|
|
261
|
-
}]
|
|
262
|
-
: [],
|
|
263
|
-
)
|
|
264
|
-
|
|
265
|
-
// Check if customRules contains a 'required' rule
|
|
266
|
-
const hasCustomRequiredRule = () => {
|
|
267
|
-
return props.customRules.some(rule => rule.type === 'required')
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
const validateField = (value: string | number | null) => {
|
|
271
|
-
if (props.readonly) {
|
|
272
|
-
validation.clearValidation()
|
|
273
|
-
return true
|
|
274
|
-
}
|
|
275
|
-
|
|
276
|
-
// Don't short-circuit if a custom required rule exists
|
|
277
|
-
if (!value && !props.required && !hasCustomRequiredRule()) {
|
|
278
|
-
validation.clearValidation()
|
|
279
|
-
return true
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
const result = validation.validateField(
|
|
283
|
-
value,
|
|
284
|
-
[...defaultRules.value, ...props.customRules],
|
|
285
|
-
props.customWarningRules,
|
|
286
|
-
)
|
|
287
|
-
|
|
288
|
-
return !result.hasError
|
|
289
|
-
}
|
|
290
|
-
|
|
291
|
-
const validateOnSubmit = () => {
|
|
292
|
-
isBlurred.value = true
|
|
293
|
-
return validateField(model.value ?? null)
|
|
294
|
-
}
|
|
295
|
-
|
|
296
|
-
const checkErrorOnBlur = () => {
|
|
297
|
-
isBlurred.value = true
|
|
298
|
-
validateField(model.value ?? null)
|
|
299
|
-
if (model.value !== lastEmittedModelValue.value) {
|
|
300
|
-
emit('update:modelValue', model.value)
|
|
301
|
-
lastEmittedModelValue.value = model.value
|
|
302
|
-
}
|
|
303
|
-
}
|
|
304
|
-
|
|
305
267
|
watch(model, (newValue) => {
|
|
306
|
-
if (!props.isValidateOnBlur) {
|
|
307
|
-
validateField(newValue ?? null)
|
|
308
|
-
}
|
|
309
268
|
if (props.isClearable && newValue === '') {
|
|
310
269
|
emit('clear')
|
|
311
270
|
}
|
|
312
271
|
})
|
|
313
272
|
|
|
314
|
-
const hasError = computed(() =>
|
|
315
|
-
validation.hasError.value
|
|
316
|
-
|| (props.errorMessages?.length ?? 0) > 0
|
|
317
|
-
|| props.hasError,
|
|
318
|
-
)
|
|
319
|
-
const hasWarning = computed(() => validation.hasWarning.value || props.hasWarning)
|
|
320
|
-
const hasSuccess = computed(() => ((validation.hasSuccess.value && !hasError.value && !hasWarning.value) || props.hasSuccess) && props.showSuccessMessages)
|
|
321
|
-
|
|
322
|
-
const errors = computed(() => [...validation.errors.value, ...(props.errorMessages || [])])
|
|
323
|
-
const warnings = computed(() => validation.warnings.value)
|
|
324
|
-
const successes = computed(() => validation.successes.value)
|
|
325
|
-
|
|
326
273
|
const iconColor = computed(() => {
|
|
327
274
|
if (hasError.value) return 'error'
|
|
328
275
|
if (hasWarning.value) return 'warning'
|
|
@@ -338,6 +285,66 @@
|
|
|
338
285
|
emit('append-icon-click')
|
|
339
286
|
}
|
|
340
287
|
|
|
288
|
+
const handleInput = (event: Event) => {
|
|
289
|
+
if (props.type === 'number' || props.type === 'tel') {
|
|
290
|
+
const target = event.target as HTMLInputElement | null
|
|
291
|
+
|
|
292
|
+
if (target) {
|
|
293
|
+
const sanitizedValue = sanitizeTypedValue(target.value)
|
|
294
|
+
if (typeof sanitizedValue === 'string' && target.value !== sanitizedValue) {
|
|
295
|
+
target.value = sanitizedValue
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
emit('input', event)
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
const handleBeforeInput = (event: InputEvent) => {
|
|
304
|
+
if (props.type !== 'number' && props.type !== 'tel') {
|
|
305
|
+
return
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
if (!event.data) {
|
|
309
|
+
return
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
const allowedPattern = props.type === 'number'
|
|
313
|
+
? NUMBER_ALLOWED_SINGLE_CHARACTER_PATTERN
|
|
314
|
+
: TEL_ALLOWED_SINGLE_CHARACTER_PATTERN
|
|
315
|
+
|
|
316
|
+
if (!allowedPattern.test(event.data)) {
|
|
317
|
+
event.preventDefault()
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
const handleKeydown = (event: KeyboardEvent) => {
|
|
322
|
+
if ((props.type === 'number' || props.type === 'tel') && !event.ctrlKey && !event.metaKey && !event.altKey) {
|
|
323
|
+
const allowedNonCharacterKeys = [
|
|
324
|
+
'Backspace',
|
|
325
|
+
'Delete',
|
|
326
|
+
'Tab',
|
|
327
|
+
'Escape',
|
|
328
|
+
'Enter',
|
|
329
|
+
'ArrowLeft',
|
|
330
|
+
'ArrowRight',
|
|
331
|
+
'ArrowUp',
|
|
332
|
+
'ArrowDown',
|
|
333
|
+
'Home',
|
|
334
|
+
'End',
|
|
335
|
+
]
|
|
336
|
+
const allowedPattern = props.type === 'number'
|
|
337
|
+
? NUMBER_ALLOWED_SINGLE_CHARACTER_PATTERN
|
|
338
|
+
: TEL_ALLOWED_SINGLE_CHARACTER_PATTERN
|
|
339
|
+
|
|
340
|
+
if (!allowedNonCharacterKeys.includes(event.key) && event.key.length === 1 && !allowedPattern.test(event.key)) {
|
|
341
|
+
event.preventDefault()
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
emit('keydown', event)
|
|
346
|
+
}
|
|
347
|
+
|
|
341
348
|
const validationIcon = computed(() => {
|
|
342
349
|
if (hasError.value) return ICONS['error']
|
|
343
350
|
if (hasWarning.value) return ICONS['warning']
|
|
@@ -402,9 +409,6 @@
|
|
|
402
409
|
|
|
403
410
|
const syTextFieldRef = ref<ComponentPublicInstance | null>(null)
|
|
404
411
|
|
|
405
|
-
// Intégration avec le système de validation du formulaire
|
|
406
|
-
useValidatable(validateOnSubmit, validation.clearValidation)
|
|
407
|
-
|
|
408
412
|
onMounted(() => {
|
|
409
413
|
nextTick(() => {
|
|
410
414
|
const removeSvgRole = () => {
|
|
@@ -596,9 +600,7 @@
|
|
|
596
600
|
})
|
|
597
601
|
|
|
598
602
|
defineExpose({
|
|
599
|
-
|
|
600
|
-
validateOnSubmit,
|
|
601
|
-
checkErrorOnBlur,
|
|
603
|
+
validateOnSubmit: validate,
|
|
602
604
|
})
|
|
603
605
|
</script>
|
|
604
606
|
|
|
@@ -652,6 +654,7 @@
|
|
|
652
654
|
:theme="props.theme"
|
|
653
655
|
:tile="props.isTiled"
|
|
654
656
|
:type="props.type"
|
|
657
|
+
:inputmode="props.type === 'number' ? 'decimal' : (props.type === 'tel' ? 'tel' : undefined)"
|
|
655
658
|
:variant="props.variantStyle"
|
|
656
659
|
:width="props.width"
|
|
657
660
|
v-bind="forwardedAttrs"
|
|
@@ -661,13 +664,15 @@
|
|
|
661
664
|
'success-field': hasSuccess,
|
|
662
665
|
'basic-field': !hasError && !hasWarning && !hasSuccess
|
|
663
666
|
}"
|
|
664
|
-
@
|
|
665
|
-
@
|
|
666
|
-
@
|
|
667
|
+
@focus="focused = true; emit('focus')"
|
|
668
|
+
@blur="focused = false; emit('blur')"
|
|
669
|
+
@beforeinput="handleBeforeInput"
|
|
670
|
+
@input="handleInput"
|
|
671
|
+
@keydown="handleKeydown"
|
|
667
672
|
>
|
|
668
673
|
<!-- Prepend -->
|
|
669
674
|
<template
|
|
670
|
-
v-if="props.prependIcon || props.prependTooltip"
|
|
675
|
+
v-if="props.prependIcon || props.prependTooltip || $slots['prepend']"
|
|
671
676
|
#prepend
|
|
672
677
|
>
|
|
673
678
|
<slot name="prepend">
|
|
@@ -706,7 +711,7 @@
|
|
|
706
711
|
|
|
707
712
|
<!-- Append -->
|
|
708
713
|
<template
|
|
709
|
-
v-if="props.appendIcon || props.appendTooltip"
|
|
714
|
+
v-if="props.appendIcon || props.appendTooltip || $slots['append']"
|
|
710
715
|
#append
|
|
711
716
|
>
|
|
712
717
|
<slot name="append">
|
|
@@ -743,6 +748,14 @@
|
|
|
743
748
|
</slot>
|
|
744
749
|
</template>
|
|
745
750
|
|
|
751
|
+
<!-- Default slot passthrough: renders inside v-field__input (flex-wrap container) -->
|
|
752
|
+
<template
|
|
753
|
+
v-if="$slots.default"
|
|
754
|
+
#default
|
|
755
|
+
>
|
|
756
|
+
<slot />
|
|
757
|
+
</template>
|
|
758
|
+
|
|
746
759
|
<!-- Prepend inner -->
|
|
747
760
|
<template #prepend-inner>
|
|
748
761
|
<slot name="prepend-inner">
|
|
@@ -795,6 +808,16 @@
|
|
|
795
808
|
<template #details>
|
|
796
809
|
<slot name="details" />
|
|
797
810
|
</template>
|
|
811
|
+
|
|
812
|
+
<template #loader="{ color: loaderColor, isActive: loaderActive }">
|
|
813
|
+
<VProgressLinear
|
|
814
|
+
v-if="loaderActive"
|
|
815
|
+
indeterminate
|
|
816
|
+
rounded
|
|
817
|
+
:color="loaderColor"
|
|
818
|
+
:aria-label="props.label ? `Chargement de ${props.label}` : 'Chargement en cours'"
|
|
819
|
+
/>
|
|
820
|
+
</template>
|
|
798
821
|
</VTextField>
|
|
799
822
|
|
|
800
823
|
<div
|
|
@@ -808,14 +831,6 @@
|
|
|
808
831
|
</template>
|
|
809
832
|
|
|
810
833
|
<style lang="scss" scoped>
|
|
811
|
-
@use '@/assets/tokens';
|
|
812
|
-
|
|
813
|
-
// :deep(.v-field__input input::placeholder),
|
|
814
|
-
// :deep(input.v-field__input::placeholder),
|
|
815
|
-
// :deep(textarea.v-field__input::placeholder) {
|
|
816
|
-
// opacity: 0;
|
|
817
|
-
// }
|
|
818
|
-
|
|
819
834
|
.sy-textfield-container {
|
|
820
835
|
display: flex;
|
|
821
836
|
flex-direction: column;
|
|
@@ -830,14 +845,14 @@
|
|
|
830
845
|
}
|
|
831
846
|
|
|
832
847
|
:deep(.v-icon__svg) {
|
|
833
|
-
fill:
|
|
848
|
+
fill: rgb(var(--v-theme-textWarning)) !important;
|
|
834
849
|
}
|
|
835
850
|
|
|
836
851
|
:deep(.v-field) {
|
|
837
|
-
color:
|
|
852
|
+
color: rgb(var(--v-theme-borderWarning)) !important;
|
|
838
853
|
|
|
839
854
|
.v-field__outline {
|
|
840
|
-
color:
|
|
855
|
+
color: rgb(var(--v-theme-borderWarning)) !important;
|
|
841
856
|
}
|
|
842
857
|
}
|
|
843
858
|
|
|
@@ -845,7 +860,7 @@
|
|
|
845
860
|
opacity: 1 !important;
|
|
846
861
|
|
|
847
862
|
.v-messages__message {
|
|
848
|
-
color:
|
|
863
|
+
color: rgb(var(--v-theme-borderWarning)) !important;
|
|
849
864
|
}
|
|
850
865
|
}
|
|
851
866
|
}
|
|
@@ -858,10 +873,10 @@
|
|
|
858
873
|
}
|
|
859
874
|
|
|
860
875
|
:deep(.v-field) {
|
|
861
|
-
color:
|
|
876
|
+
color: rgb(var(--v-theme-borderError)) !important;
|
|
862
877
|
|
|
863
878
|
.v-field__outline {
|
|
864
|
-
color:
|
|
879
|
+
color: rgb(var(--v-theme-borderError)) !important;
|
|
865
880
|
}
|
|
866
881
|
}
|
|
867
882
|
|
|
@@ -869,7 +884,7 @@
|
|
|
869
884
|
opacity: 1 !important;
|
|
870
885
|
|
|
871
886
|
.v-messages__message {
|
|
872
|
-
color:
|
|
887
|
+
color: rgb(var(--v-theme-borderError)) !important;
|
|
873
888
|
}
|
|
874
889
|
}
|
|
875
890
|
}
|
|
@@ -882,16 +897,16 @@
|
|
|
882
897
|
}
|
|
883
898
|
|
|
884
899
|
:deep(.v-icon__svg) {
|
|
885
|
-
fill:
|
|
900
|
+
fill: rgb(var(--v-theme-textSuccess)) !important;
|
|
886
901
|
}
|
|
887
902
|
|
|
888
903
|
:deep(.v-field) {
|
|
889
|
-
color:
|
|
904
|
+
color: rgb(var(--v-theme-borderSuccess)) !important;
|
|
890
905
|
|
|
891
906
|
--v-medium-emphasis-opacity: 1;
|
|
892
907
|
|
|
893
908
|
.v-field__outline {
|
|
894
|
-
color:
|
|
909
|
+
color: rgb(var(--v-theme-borderSuccess)) !important;
|
|
895
910
|
}
|
|
896
911
|
}
|
|
897
912
|
|
|
@@ -899,7 +914,7 @@
|
|
|
899
914
|
opacity: 1 !important;
|
|
900
915
|
|
|
901
916
|
.v-messages__message {
|
|
902
|
-
color:
|
|
917
|
+
color: rgb(var(--v-theme-borderSuccess)) !important;
|
|
903
918
|
}
|
|
904
919
|
}
|
|
905
920
|
}
|
|
@@ -910,13 +925,13 @@
|
|
|
910
925
|
}
|
|
911
926
|
|
|
912
927
|
:deep(.v-field--focused .v-field__outline) {
|
|
913
|
-
color:
|
|
928
|
+
color: rgb(var(--v-theme-accentPrimary)) !important;
|
|
914
929
|
opacity: 1 !important;
|
|
915
930
|
}
|
|
916
931
|
|
|
917
932
|
:deep(.v-input__prepend .v-icon:focus-visible),
|
|
918
933
|
:deep(.v-input__append .v-icon:focus-visible) {
|
|
919
|
-
outline: 2px solid
|
|
934
|
+
outline: 2px solid rgb(var(--v-theme-accentPrimary));
|
|
920
935
|
outline-offset: 2px;
|
|
921
936
|
opacity: 1;
|
|
922
937
|
}
|
|
@@ -1,15 +1,73 @@
|
|
|
1
|
-
import { Meta,
|
|
1
|
+
import { Meta, Primary } from '@storybook/blocks';
|
|
2
2
|
import * as Stories from '../SyTextField.stories.ts';
|
|
3
|
-
import '@/
|
|
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
13
|
<Meta of={Stories} />
|
|
6
14
|
|
|
7
|
-
<
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
<div class="mt-
|
|
13
|
-
<p>Rapport d’audit manuel : <a href="/audits/SyTextField.xlsx" style={{ color:'#0C41BD' }}>Voir le rapport</a></p>
|
|
15
|
+
<AccessibilityGuideLayout
|
|
16
|
+
componentName="SyTextField"
|
|
17
|
+
iconSrc={AccessibilityIcon}
|
|
18
|
+
apgHref="https://www.w3.org/WAI/ARIA/apg/patterns/textinput/"
|
|
19
|
+
>
|
|
20
|
+
<div class="mt-8">
|
|
21
|
+
<p>Rapport d’audit manuel : <a href="/audits/SyTextField.xlsx" style={{ color:'#0C41BD' }}>Voir le rapport</a></p>
|
|
14
22
|
<p style={{ color: 'grey', fontSize: '14px', marginTop: '0px' }}>Correctifs associés (<a href="https://github.com/assurance-maladie-digital/design-system-v3/issues/935" target="_blank" style={{color:'#0C41BD'}}>issue #935</a>), (<a href="https://github.com/assurance-maladie-digital/design-system/issues/4028" target="_blank" style={{color:'#0C41BD'}}>issue #4028</a>)</p>
|
|
15
23
|
</div>
|
|
24
|
+
|
|
25
|
+
<CriteriaSection>
|
|
26
|
+
<CriteriaCard icon="🔍" title="Structure sémantique et attributs">
|
|
27
|
+
<ul>
|
|
28
|
+
<li><strong>Élément input natif</strong> : Utilisation de <code><input></code> via VTextField pour une sémantique correcte.</li>
|
|
29
|
+
<li><strong>Labels explicites</strong> : Gestion automatique du <code>aria-label</code> combinant label, préfixe et suffixe. L'attribut <code>aria-required</code> est ajouté si le champ est requis.</li>
|
|
30
|
+
<li><strong>Association avec les messages</strong> : Implémentation dynamique de <code>aria-describedby</code> pour lier le champ à ses messages d'erreur, d'avertissement ou de succès.</li>
|
|
31
|
+
<li><strong>Icônes décoratives</strong> : Les icônes de validation (erreur, avertissement, succès) sont masquées aux lecteurs d'écran (<code>role="presentation"</code>) pour éviter la redondance avec les messages textuels.</li>
|
|
32
|
+
</ul>
|
|
33
|
+
</CriteriaCard>
|
|
34
|
+
|
|
35
|
+
<CriteriaCard icon="⌨️" title="Navigation et interaction clavier">
|
|
36
|
+
<ul>
|
|
37
|
+
<li><strong>Focus natif</strong> : Le champ est naturellement focusable via <kbd>Tab</kbd>.</li>
|
|
38
|
+
<li><strong>Boutons accessibles</strong> : Les icônes interactives (prepend/append) sont des boutons focusables avec des labels descriptifs et gèrent les événements <kbd>Entrée</kbd> et <kbd>Espace</kbd>.</li>
|
|
39
|
+
<li><strong>Bouton de vidage</strong> : Le bouton "clear" possède un <code>aria-label</code> descriptif ("Vider [label]") et est accessible au clavier.</li>
|
|
40
|
+
<li><strong>Indicateur de focus</strong> : Styles de focus visibles sur le champ et les icônes interactives.</li>
|
|
41
|
+
</ul>
|
|
42
|
+
</CriteriaCard>
|
|
43
|
+
|
|
44
|
+
<CriteriaCard icon="🎨" title="Styles et états visuels">
|
|
45
|
+
<ul>
|
|
46
|
+
<li><strong>Contrastes garantis</strong> : Couleurs distinctes pour les états erreur (rouge), avertissement (orange) et succès (vert) respectant les critères WCAG.</li>
|
|
47
|
+
<li><strong>États cohérents</strong> : Changements visuels clairs entre les états normal, erreur, avertissement et succès.</li>
|
|
48
|
+
<li><strong>Astérisque optionnel</strong> : Possibilité d'afficher un astérisque visuel pour les champs requis via la prop <code>display-asterisk</code>.</li>
|
|
49
|
+
</ul>
|
|
50
|
+
</CriteriaCard>
|
|
51
|
+
</CriteriaSection>
|
|
52
|
+
|
|
53
|
+
<DemoSection componentName="SyTextField">
|
|
54
|
+
<Primary />
|
|
55
|
+
</DemoSection>
|
|
56
|
+
|
|
57
|
+
<BestPracticesSection>
|
|
58
|
+
<ul>
|
|
59
|
+
<li><strong>Labels descriptifs</strong> : Utilisez toujours un <code>label</code> clair et concis. Évitez les placeholders comme seuls indicateurs de champ.</li>
|
|
60
|
+
<li><strong>Messages d'erreur utiles</strong> : Fournissez des messages d'erreur spécifiques qui aident l'utilisateur à corriger sa saisie.</li>
|
|
61
|
+
<li><strong>Validation appropriée</strong> : Utilisez la validation au blur (<code>isValidateOnBlur</code>) pour ne pas surcharger l'utilisateur pendant la saisie.</li>
|
|
62
|
+
<li><strong>Évitez les changements de contexte automatiques</strong> : Ne soumettez pas automatiquement le formulaire ou ne changez pas de page lors de la saisie.</li>
|
|
63
|
+
<li><strong>Préfixes et suffixes accessibles</strong> : Le composant ajoute automatiquement des spans screen-reader-only pour le contenu textuel des préfixes/suffixes.</li>
|
|
64
|
+
</ul>
|
|
65
|
+
</BestPracticesSection>
|
|
66
|
+
|
|
67
|
+
<ResourcesSection>
|
|
68
|
+
<ul>
|
|
69
|
+
<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>
|
|
70
|
+
<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>
|
|
71
|
+
</ul>
|
|
72
|
+
</ResourcesSection>
|
|
73
|
+
</AccessibilityGuideLayout>
|