@cnamts/synapse 1.0.23 → 1.0.25
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/README.md +27 -5
- package/dist/AutocompleteFilter-D7qBuCAP.js +114 -0
- package/dist/AutocompleteFilter-Df9i5mAl.cjs +1 -0
- package/dist/DateFilter-BJD6FMev.cjs +1 -0
- package/dist/{DateFilter-Dc-gSGwk.js → DateFilter-BitMWrMU.js} +1 -1
- package/dist/{NumberFilter-vP38Wp6j.js → NumberFilter-BTLUxw0a.js} +3 -3
- package/dist/NumberFilter-DGCzCXzI.cjs +1 -0
- package/dist/{PeriodFilter-Ba1uYUnT.js → PeriodFilter-B5rUIPAC.js} +1 -1
- package/dist/PeriodFilter-DO_ecTZW.cjs +1 -0
- package/dist/SelectFilter-CGwcKWLm.cjs +1 -0
- package/dist/SelectFilter-l4QnRcuk.js +135 -0
- package/dist/TextFilter-B8nf7xoK.cjs +1 -0
- package/dist/{TextFilter-B84dpnoq.js → TextFilter-C9hj6Qrp.js} +7 -7
- package/dist/apLightTheme-CEK4iY3f.cjs +1 -0
- package/dist/apLightTheme-DnIM24Lv.js +950 -0
- package/dist/components/Amelipro/AmeliproAutoCompleteField/AmeliproAutoCompleteField.d.ts +7022 -9616
- package/dist/components/Amelipro/AmeliproCarousel/AmeliproCarousel.d.ts +2 -2
- 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 +60 -60
- 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 +7501 -10095
- package/dist/components/Amelipro/AmeliproTextArea/AmeliproTextArea.d.ts +21 -21
- package/dist/components/Amelipro/AmeliproTextField/AmeliproTextField.d.ts +41 -41
- 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 +117 -151
- package/dist/components/Customs/Selects/SyInputSelect/SyInputSelect.d.ts +5 -5
- package/dist/components/Customs/Selects/SySelect/SySelect.d.ts +12 -16
- package/dist/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.d.ts +8 -8
- package/dist/components/Customs/SyCheckbox/SyCheckbox.d.ts +31 -506
- package/dist/components/Customs/SyRadioGroup/SyRadioGroup.d.ts +28 -506
- package/dist/components/Customs/SyTabs/SyTabs.d.ts +13 -11
- package/dist/components/Customs/SyTextField/SyTextField.d.ts +69 -89
- package/dist/components/DatePicker/CalendarMode/DatePicker.d.ts +627 -791
- package/dist/components/DatePicker/ComplexDatePicker/ComplexDatePicker.d.ts +315 -412
- package/dist/components/DatePicker/DateTextInput/DateTextInput.d.ts +112 -160
- 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/useDatePickerState.d.ts +1 -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/FileList/FileList.d.ts +6 -0
- package/dist/components/FilterSideBar/FilterSideBar.d.ts +2 -0
- package/dist/components/HeaderNavigationBar/HeaderNavigationBar.d.ts +17 -17
- package/dist/components/HeaderNavigationBar/HorizontalNavbar/HorizontalNavbar.d.ts +3 -3
- 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 +86 -127
- package/dist/components/MonthPicker/MonthPickerText/MonthPickerInput.d.ts +85 -126
- package/dist/components/NirField/NirField.d.ts +202 -278
- package/dist/components/NirField/locales.d.ts +10 -10
- package/dist/components/NirField/useNirValidation.d.ts +64 -0
- package/dist/components/PasswordField/PasswordField.d.ts +8 -9
- package/dist/components/PeriodField/PeriodField.d.ts +1352 -1680
- package/dist/components/PhoneField/PhoneField.d.ts +88 -129
- package/dist/components/RangeField/RangeSlider/RangeSlider.d.ts +12 -12
- package/dist/components/SyTextArea/SyTextArea.d.ts +34 -14
- package/dist/components/SyTextArea/useDefaultValidationRules.d.ts +11 -0
- package/dist/components/Tables/SyServerTable/SyServerTable.d.ts +10 -6
- package/dist/components/Tables/SyTable/SyTable.d.ts +10 -6
- package/dist/components/Tables/common/SyTableFilter.d.ts +2 -3
- package/dist/components/Tables/common/SyTablePagination.d.ts +19 -19
- package/dist/components/Tables/common/TableHeader.d.ts +5 -0
- 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/locales.d.ts +3 -0
- package/dist/components/Tables/common/types.d.ts +21 -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 +7 -6
- package/dist/composables/date/useDatePickerAccessibility.d.ts +1 -1
- package/dist/composables/rules/useFieldValidation.d.ts +4 -4
- package/dist/composables/unifyValidation/documentationValidationProps.d.ts +230 -0
- 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 +19 -9
- package/dist/design-system-v3.d.ts +2 -0
- package/dist/design-system-v3.js +186 -187
- package/dist/design-system-v3.umd.cjs +1 -1066
- package/dist/designTokens/tokens/amelipro/apColors.d.ts +10 -10
- package/dist/designTokens/tokens/amelipro/apColors2026.d.ts +1 -2
- package/dist/designTokens/tokens/amelipro/apContextual.d.ts +44 -0
- package/dist/designTokens/tokens/amelipro/apSemantic.d.ts +1 -1
- package/dist/designTokens/tokens/baseColors.d.ts +127 -0
- package/dist/designTokens/tokens/baseContextualTokens.d.ts +50 -0
- package/dist/designTokens/tokens/cnam/cnamColors.d.ts +10 -10
- package/dist/designTokens/tokens/cnam/cnamSemantic.d.ts +1 -1
- package/dist/designTokens/tokens/pa/paColors.d.ts +1 -166
- package/dist/designTokens/tokens/pa/paSemantic.d.ts +1 -1
- package/dist/designTokens/utils/buildColorClassMap.d.ts +12 -0
- package/dist/designTokens/utils/createFlattenTheme.d.ts +1 -3
- package/dist/designTokens/utils/index.d.ts +2 -2
- package/dist/main-ByDPHpae.cjs +1067 -0
- package/dist/main-Cpx8Co6H.js +38869 -0
- package/dist/main.d.ts +0 -1
- 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/utils/functions/classToHex.d.ts +1 -1
- package/dist/utils/functions/createHexResolver.d.ts +16 -0
- package/dist/vuetifyConfig.js +522 -0
- package/dist/vuetifyConfig.umd.cjs +1 -0
- package/package.json +37 -20
- package/src/assets/amelipro/apTokens2026.scss +5 -5
- package/src/assets/overrides/_breakpoints.scss +25 -0
- package/src/assets/overrides/_btns.scss +0 -8
- package/src/assets/overrides/_forms.scss +1 -3
- package/src/assets/overrides/_icons.scss +14 -10
- package/src/assets/overrides/_otp.scss +41 -0
- package/src/assets/overrides/_tables.scss +11 -20
- package/src/assets/overrides/_tooltips.scss +17 -7
- package/src/assets/overrides/_typography.scss +35 -47
- package/src/assets/overrides/_utilities.scss +43 -47
- package/src/assets/themes.scss +1 -0
- package/src/components/Amelipro/AmeliproAccordion/AmeliproAccordionTemplate/AmeliproAccordionTemplate.vue +20 -20
- package/src/components/Amelipro/AmeliproAccordionFrieze/AmeliproAccordionFrieze.vue +12 -14
- package/src/components/Amelipro/AmeliproAccordionList/AmeliproAccordionList.vue +4 -6
- package/src/components/Amelipro/AmeliproAccordionResult/AmeliproAccordionResultTemplate/AmeliproAccordionResultTemplate.vue +5 -5
- package/src/components/Amelipro/AmeliproAccordionResultList/AmeliproAccordionResultList.vue +4 -6
- package/src/components/Amelipro/AmeliproAutoCompleteField/AmeliproAutoCompleteField.vue +4 -6
- package/src/components/Amelipro/AmeliproAutoCompleteField/__tests__/__snapshots__/AmeliproAutoCompleteField.spec.ts.snap +2 -2
- package/src/components/Amelipro/AmeliproBadge/AmeliproBadge.vue +4 -6
- package/src/components/Amelipro/AmeliproBreadcrumb/AmeliproBreadcrumb.vue +1 -3
- package/src/components/Amelipro/AmeliproBtn/AmeliproBtn.vue +4 -6
- package/src/components/Amelipro/AmeliproCallback/AmeliproCallback.vue +2 -2
- package/src/components/Amelipro/AmeliproCard/AmeliproCard.vue +31 -31
- package/src/components/Amelipro/AmeliproCarousel/AmeliproCarousel.vue +5 -7
- package/src/components/Amelipro/AmeliproCheckbox/AmeliproCheckbox.vue +13 -15
- package/src/components/Amelipro/AmeliproCheckboxGroup/AmeliproCheckboxGroup.vue +23 -23
- package/src/components/Amelipro/AmeliproChips/AmeliproChips.vue +1 -3
- package/src/components/Amelipro/AmeliproClickableTile/AmeliproClickableTile.vue +17 -12
- package/src/components/Amelipro/AmeliproClickableTile/tests/__snapshots__/AmeliproClickableTile.spec.ts.snap +2 -2
- package/src/components/Amelipro/AmeliproCopyBtn/AmeliproCopyBtn.vue +4 -6
- package/src/components/Amelipro/AmeliproCustomSelector/AmeliproCustomSelector.vue +13 -13
- package/src/components/Amelipro/AmeliproDentalChart/AmeliproDentalChart.vue +4 -2
- package/src/components/Amelipro/AmeliproDentalChart/AmeliproTooth/AmeliproTooth.vue +4 -4
- package/src/components/Amelipro/AmeliproDialog/AmeliproDialog.vue +5 -7
- package/src/components/Amelipro/AmeliproDisclosure/AmeliproDisclosure.vue +1 -3
- package/src/components/Amelipro/AmeliproErrorTemplate/AmeliproErrorTemplate.vue +2 -4
- package/src/components/Amelipro/AmeliproFilePreview/AmeliproFilePreview.vue +4 -6
- package/src/components/Amelipro/AmeliproFilters/AmeliproFilters.vue +13 -13
- package/src/components/Amelipro/AmeliproFirstLogin/AmeliproFirstLogin.vue +3 -5
- package/src/components/Amelipro/AmeliproFooter/AmeliproFooter.vue +1 -3
- package/src/components/Amelipro/AmeliproHeader/AmeliproHeader.vue +2 -4
- package/src/components/Amelipro/AmeliproHeader/AmeliproHeaderBar/AmeliproHeaderBar.vue +1 -3
- package/src/components/Amelipro/AmeliproHeader/AmeliproHeaderBar/AmeliproHeaderBrandSection/AmeliproHeaderBrandSection.vue +20 -16
- package/src/components/Amelipro/AmeliproHeader/AmeliproHeaderBar/AmeliproHeaderBrandSection/__tests__/__snapshots__/AmeliproHeaderBrandSection.spec.ts.snap +2 -2
- package/src/components/Amelipro/AmeliproIconBtn/AmeliproIconBtn.vue +2 -4
- package/src/components/Amelipro/AmeliproIllustratedDataTile/AmeliproIllustratedDataTile.vue +5 -7
- package/src/components/Amelipro/AmeliproIllustratedRadioGroup/AmeliproIllustratedRadioGroup.vue +6 -8
- package/src/components/Amelipro/AmeliproMailTile/AmeliproMailTile.vue +14 -14
- package/src/components/Amelipro/AmeliproMenu/AmeliproMenu.vue +11 -13
- package/src/components/Amelipro/AmeliproMessagingLayout/AmeliproDropdownMenu/AmeliproDropdownMenu.vue +2 -4
- package/src/components/Amelipro/AmeliproMessagingLayout/AmeliproMessagingLayout.vue +8 -8
- package/src/components/Amelipro/AmeliproMultipleFoldingCard/AmeliproMultipleFoldingCard.vue +40 -40
- package/src/components/Amelipro/AmeliproNumberedCard/AmeliproNumberedCard.vue +27 -27
- package/src/components/Amelipro/AmeliproOnboarding/AmeliproOnboarding.vue +3 -5
- package/src/components/Amelipro/AmeliproPageLayout/AmeliproPageLayout.vue +2 -4
- package/src/components/Amelipro/AmeliproPagination/AmeliproPagination.vue +2 -4
- package/src/components/Amelipro/AmeliproPagination/AmeliproPaginationBtn/AmeliproPaginationBtn.vue +3 -5
- package/src/components/Amelipro/AmeliproPatientBanner/AmeliproPatientBanner.vue +1 -3
- package/src/components/Amelipro/AmeliproPatientLogged/AmeliproPatientLogged.vue +2 -4
- package/src/components/Amelipro/AmeliproPatientLogin/AmeliproPatientLogin.vue +4 -4
- package/src/components/Amelipro/AmeliproPatientLogin/AmeliproPatientLoginForm/AmeliproPatientLoginForm.vue +1 -3
- package/src/components/Amelipro/AmeliproPostalAddressField/AmeliproPostalAddressCityRow/AmeliproPostalAddressCityRow.vue +3 -5
- package/src/components/Amelipro/AmeliproPostalAddressField/AmeliproPostalAddressField.vue +3 -5
- package/src/components/Amelipro/AmeliproRadioGroup/AmeliproRadioGroup.vue +23 -23
- package/src/components/Amelipro/AmeliproResultList/AmeliproResultList.vue +4 -6
- package/src/components/Amelipro/AmeliproSelect/AmeliproSelect.vue +12 -22
- package/src/components/Amelipro/AmeliproStateTile/AmeliproStateTile.vue +10 -12
- package/src/components/Amelipro/AmeliproStepper/AmeliproStepper.vue +17 -17
- package/src/components/Amelipro/AmeliproTable/AmeliproTable.vue +8 -10
- package/src/components/Amelipro/AmeliproTabs/AmeliproTabBtn/AmeliproTabBtn.vue +6 -8
- package/src/components/Amelipro/AmeliproTabs/AmeliproTabs.vue +4 -4
- package/src/components/Amelipro/AmeliproTextArea/AmeliproTextArea.vue +4 -6
- package/src/components/Amelipro/AmeliproTextArea/__tests__/__snapshots__/AmeliproTextArea.spec.ts.snap +2 -2
- package/src/components/Amelipro/AmeliproTextField/AmeliproTextField.vue +7 -9
- package/src/components/Amelipro/AmeliproTileBtn/AmeliproTileBtn.vue +3 -5
- package/src/components/Amelipro/AmeliproTooltips/AmeliproTooltips.vue +0 -2
- package/src/components/Amelipro/AmeliproUpload/AmeliproUpload.vue +6 -6
- package/src/components/Amelipro/ServiceMenu/ServiceMenu.vue +2 -2
- package/src/components/Amelipro/StructureMenu/StructureBtn/StructureBtn.vue +4 -4
- package/src/components/Amelipro/StructureMenu/StructureItem/StructureItem.vue +4 -6
- package/src/components/Amelipro/StructureMenu/StructureMenu.vue +2 -2
- package/src/components/Amelipro/StructureMenu/StructureTabs/StructureTabs.vue +2 -2
- package/src/components/Amelipro/UserMenu/UserMenu.vue +1 -3
- package/src/components/BackBtn/tests/BackBtn.visual.cy.ts +43 -0
- package/src/components/BackBtn/tests/__snapshots__/back-btn-custom-bg.snap.png +0 -0
- package/src/components/BackBtn/tests/__snapshots__/back-btn-dark-mode.snap.png +0 -0
- package/src/components/BackBtn/tests/__snapshots__/back-btn-default.snap.png +0 -0
- package/src/components/BackBtn/tests/__snapshots__/back-btn-no-icon.snap.png +0 -0
- package/src/components/Captcha/Captcha.vue +1 -3
- package/src/components/Captcha/accessibilite/Accessibility.mdx +86 -8
- package/src/components/Captcha/tests/__snapshots__/Captcha.spec.ts.snap +12 -12
- package/src/components/ChipList/ChipList.stories.ts +0 -15
- package/src/components/ChipList/ChipList.vue +19 -17
- package/src/components/ChipList/accessibilite/Accessibility.mdx +83 -10
- package/src/components/ChipList/tests/ChipList.a11y.spec.ts +41 -0
- package/src/components/CookiesSelection/CookiesInformation/CookiesInformation.vue +0 -2
- package/src/components/CopyBtn/CopyBtn.vue +1 -3
- package/src/components/Customs/Selects/SelectBtnField/SelectBtnField.vue +17 -17
- package/src/components/Customs/Selects/SelectBtnField/accessibilite/Accessibility.mdx +0 -9
- package/src/components/Customs/Selects/SelectBtnField/tests/SelectBtnField.spec.ts +31 -0
- package/src/components/Customs/Selects/SyAutocomplete/SyAutocomplete.stories.ts +66 -0
- package/src/components/Customs/Selects/SyAutocomplete/SyAutocomplete.vue +28 -7
- package/src/components/Customs/Selects/SyAutocomplete/tests/SyAutocomplete.a11y.spec.ts +18 -0
- package/src/components/Customs/Selects/SyAutocomplete/tests/SyAutocomplete.spec.ts +209 -0
- package/src/components/Customs/Selects/SyAutocomplete/utils/ariaManager.ts +14 -10
- package/src/components/Customs/Selects/SyInputSelect/SyInputSelect.stories.ts +4 -4
- package/src/components/Customs/Selects/SyInputSelect/SyInputSelect.vue +12 -15
- package/src/components/Customs/Selects/SyInputSelect/tests/SyInputSelect.spec.ts +10 -10
- package/src/components/Customs/Selects/SySelect/SySelect.stories.ts +1 -39
- package/src/components/Customs/Selects/SySelect/SySelect.vue +274 -71
- package/src/components/Customs/Selects/SySelect/accessibilite/Accessibility.mdx +199 -269
- package/src/components/Customs/Selects/SySelect/tests/SySelect.spec.ts +89 -0
- package/src/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.vue +6 -9
- package/src/components/Customs/SyCheckbox/SyCheckbox.mdx +5 -0
- package/src/components/Customs/SyCheckbox/SyCheckbox.stories.ts +10 -16
- package/src/components/Customs/SyCheckbox/SyCheckbox.vue +45 -11
- package/src/components/Customs/SyCheckbox/accessibilite/Accessibility.mdx +53 -3
- 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/SyPagination/SyPagination.vue +0 -2
- package/src/components/Customs/SyRadioGroup/SyRadioGroup.vue +4 -7
- package/src/components/Customs/SyTabs/SyTabs.mdx +0 -58
- package/src/components/Customs/SyTabs/SyTabs.stories.ts +32 -33
- package/src/components/Customs/SyTabs/SyTabs.vue +87 -67
- package/src/components/Customs/SyTabs/accessibilite/Accessibility.mdx +83 -23
- package/src/components/Customs/SyTabs/tests/SyTabs.a11y.spec.ts +88 -0
- package/src/components/Customs/SyTabs/tests/SyTabs.spec.ts +46 -1
- package/src/components/Customs/SyTextField/SyTextField.mdx +1 -1
- package/src/components/Customs/SyTextField/SyTextField.stories.ts +50 -68
- package/src/components/Customs/SyTextField/SyTextField.vue +156 -161
- package/src/components/Customs/SyTextField/tests/SyTextField.a11y.spec.ts +32 -0
- package/src/components/Customs/SyTextField/tests/SyTextField.spec.ts +120 -11
- package/src/components/DatePicker/CalendarMode/DatePicker.stories.ts +62 -58
- package/src/components/DatePicker/CalendarMode/DatePicker.vue +342 -237
- 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 +215 -175
- package/src/components/DatePicker/ComplexDatePicker/accessibilite/Accessibility.mdx +76 -0
- package/src/components/DatePicker/ComplexDatePicker/tests/ComplexDatePicker.spec.ts +33 -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 +71 -67
- 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/useDatePickerState.spec.ts +53 -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/useDatePickerState.ts +24 -0
- package/src/components/DatePicker/composables/useDateTextField.ts +6 -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/DatePicker/composables/useMonthButtonCustomization.ts +9 -8
- package/src/components/DatePicker/playground/DatePickerHolidayRule.vue +1 -1
- package/src/components/DiacriticPicker/accessibilite/Accessibility.mdx +76 -8
- package/src/components/DialogBox/DialogBox.vue +3 -5
- package/src/components/DialogBox/tests/DialogBox.visual.cy.ts +76 -0
- package/src/components/DialogBox/tests/__snapshots__/dialog-box-custom-texts.snap.png +0 -0
- package/src/components/DialogBox/tests/__snapshots__/dialog-box-default.snap.png +0 -0
- package/src/components/DialogBox/tests/__snapshots__/dialog-box-no-actions.snap.png +0 -0
- package/src/components/FileList/FileList.vue +9 -2
- package/src/components/FileList/UploadItem/UploadItem.vue +11 -13
- package/src/components/FileList/tests/FileList.spec.ts +47 -0
- package/src/components/FileUpload/FileUpload.vue +3 -5
- package/src/components/FileUpload/FileUploadContent.vue +3 -5
- package/src/components/FilterInline/FilterInline.vue +1 -3
- package/src/components/FilterSideBar/FilterSideBar.mdx +44 -1
- package/src/components/FilterSideBar/FilterSideBar.stories.ts +105 -1
- package/src/components/FilterSideBar/FilterSideBar.vue +7 -0
- package/src/components/FilterSideBar/tests/FilterSideBar.a11y.spec.ts +54 -1
- package/src/components/FilterSideBar/tests/FilterSideBar.spec.ts +42 -0
- package/src/components/FooterBar/FooterBar.vue +9 -13
- package/src/components/FranceConnectBtn/FranceConnectBtn.vue +1 -1
- package/src/components/HeaderBar/HeaderBar.stories.ts +14 -2
- package/src/components/HeaderBar/HeaderBar.vue +2 -3
- package/src/components/HeaderBar/HeaderBurgerMenu/HeaderBurgerMenu.vue +2 -3
- package/src/components/HeaderBar/HeaderBurgerMenu/HeaderMenuItem/HeaderMenuItem.vue +2 -3
- package/src/components/HeaderBar/HeaderBurgerMenu/HeaderMenuSection/HeaderMenuSection.vue +0 -1
- package/src/components/HeaderBar/HeaderBurgerMenu/HeaderSubMenu/HeaderSubMenu.vue +8 -9
- package/src/components/HeaderBar/HeaderBurgerMenu/menu.scss +0 -8
- package/src/components/HeaderBar/HeaderBurgerMenu/tests/HeaderBurgerMenu.visual.cy.ts +196 -0
- package/src/components/HeaderBar/HeaderBurgerMenu/tests/__snapshots__/header-burger-menu-generated-submenu-open.snap.png +0 -0
- package/src/components/HeaderBar/HeaderBurgerMenu/tests/__snapshots__/header-burger-menu-generated.snap.png +0 -0
- package/src/components/HeaderBar/HeaderLogo/HeaderLogo.vue +0 -1
- package/src/components/HeaderBar/HeaderMenuBtn/HeaderMenuBtn.vue +6 -7
- package/src/components/HeaderBar/tests/HeaderBar.visual.cy.ts +81 -0
- package/src/components/HeaderBar/tests/__snapshots__/header-bar-custom-width.snap.png +0 -0
- package/src/components/HeaderBar/tests/__snapshots__/header-bar-default.snap.png +0 -0
- package/src/components/HeaderBar/tests/__snapshots__/header-bar-no-sticky.snap.png +0 -0
- package/src/components/HeaderBar/tests/__snapshots__/header-bar-with-prepend.snap.png +0 -0
- package/src/components/HeaderBar/tests/__snapshots__/header-bar-with-side.snap.png +0 -0
- package/src/components/HeaderBar/tests/__snapshots__/header-bar-with-subtitle.snap.png +0 -0
- package/src/components/HeaderNavigationBar/HeaderNavigationBar.vue +12 -3
- package/src/components/HeaderNavigationBar/HorizontalNavbar/HorizontalNavbar.vue +15 -8
- package/src/components/HeaderToolbar/HeaderToolbar.vue +6 -7
- package/src/components/LangBtn/LangBtn.vue +2 -4
- package/src/components/Logo/accessibilite/Accessibility.mdx +73 -11
- package/src/components/Logo/tests/Logo.visual.cy.ts +57 -0
- package/src/components/Logo/tests/__snapshots__/logo-avatar.snap.png +0 -0
- package/src/components/Logo/tests/__snapshots__/logo-dark.snap.png +0 -0
- package/src/components/Logo/tests/__snapshots__/logo-default.snap.png +0 -0
- package/src/components/Logo/tests/__snapshots__/logo-no-organism.snap.png +0 -0
- package/src/components/Logo/tests/__snapshots__/logo-no-signature.snap.png +0 -0
- package/src/components/Logo/tests/__snapshots__/logo-risque-pro.snap.png +0 -0
- package/src/components/LogoBrandSection/LogoBrandSection.vue +2 -2
- package/src/components/LogoBrandSection/accessibilite/Accessibility.mdx +85 -9
- package/src/components/LunarCalendar/tests/LunarCalendar.spec.ts +3 -1
- package/src/components/LunarCalendar/useLunarCalendarValidation.ts +4 -5
- package/src/components/MonthPicker/MonthPickerVisual/VisualPickerHeader.vue +1 -1
- package/src/components/MonthPicker/tests/MonthPicker.spec.ts +2 -1
- package/src/components/MonthPicker/tests/__snapshots__/MonthPicker.spec.ts.snap +7 -7
- package/src/components/NirField/NirField.stories.ts +6 -2
- package/src/components/NirField/NirField.vue +67 -265
- package/src/components/NirField/accessibilite/Accessibility.mdx +102 -7
- package/src/components/NirField/locales.ts +1 -1
- package/src/components/NirField/tests/NirField.spec.ts +124 -0
- package/src/components/NirField/tests/useNirValidation.spec.ts +449 -0
- package/src/components/NirField/useNirValidation.ts +277 -0
- package/src/components/NotificationBar/Notification/Notification.vue +5 -7
- package/src/components/NotificationBar/NotificationBar.vue +1 -3
- package/src/components/PaginatedTable/PaginatedTable.vue +2 -3
- package/src/components/PaginatedTable/Pagination.vue +3 -5
- package/src/components/PasswordField/PasswordField.stories.ts +4 -4
- package/src/components/PasswordField/PasswordField.vue +26 -34
- 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 +8 -9
- package/src/components/PhoneField/tests/PhoneField.spec.ts +1 -0
- package/src/components/RangeField/RangeField.vue +6 -0
- package/src/components/RangeField/RangeSlider/RangeSlider.vue +0 -2
- package/src/components/RangeField/RangeSlider/Tooltip/Tooltip.vue +1 -1
- package/src/components/RangeField/tests/RangeField.visual.cy.ts +65 -0
- package/src/components/RangeField/tests/__snapshots__/range-field-custom-bg.snap.png +0 -0
- package/src/components/RangeField/tests/__snapshots__/range-field-custom-range.snap.png +0 -0
- package/src/components/RangeField/tests/__snapshots__/range-field-default.snap.png +0 -0
- package/src/components/RangeField/tests/__snapshots__/range-field-step.snap.png +0 -0
- package/src/components/RangeField/tests/__snapshots__/range-field-with-label.snap.png +0 -0
- package/src/components/RatingPicker/EmotionPicker/EmotionPicker.vue +6 -8
- package/src/components/RatingPicker/StarsPicker/StarsPicker.vue +3 -5
- package/src/components/SearchListField/SearchListField.vue +0 -2
- package/src/components/SkipLink/SkipLink.vue +2 -4
- package/src/components/SocialMediaLinks/SocialMediaLinks.vue +6 -6
- package/src/components/SubHeader/SubHeader.vue +1 -1
- package/src/components/SyAlert/SyAlert.vue +7 -9
- package/src/components/SyAlert/tests/SyAlert.visual.cy.ts +46 -0
- package/src/components/SyAlert/tests/__snapshots__/sy-alert-closable.snap.png +0 -0
- package/src/components/SyAlert/tests/__snapshots__/sy-alert-error.snap.png +0 -0
- package/src/components/SyAlert/tests/__snapshots__/sy-alert-info.snap.png +0 -0
- package/src/components/SyAlert/tests/__snapshots__/sy-alert-success.snap.png +0 -0
- package/src/components/SyAlert/tests/__snapshots__/sy-alert-variant-outlined.snap.png +0 -0
- package/src/components/SyAlert/tests/__snapshots__/sy-alert-variant-tonal.snap.png +0 -0
- package/src/components/SyAlert/tests/__snapshots__/sy-alert-warning.snap.png +0 -0
- package/src/components/SyBtnMenu/SyBtnMenu.vue +2 -4
- package/src/components/SyTextArea/SyTextArea.stories.ts +138 -2
- package/src/components/SyTextArea/SyTextArea.vue +53 -23
- package/src/components/SyTextArea/tests/SyTextArea.spec.ts +126 -3
- package/src/components/SyTextArea/useDefaultValidationRules.ts +74 -0
- package/src/components/TableToolbar/TableToolbar.vue +6 -8
- package/src/components/Tables/SyServerTable/SyServerTable.mdx +25 -0
- package/src/components/Tables/SyServerTable/SyServerTable.stories.ts +839 -1
- package/src/components/Tables/SyServerTable/SyServerTable.vue +154 -95
- package/src/components/Tables/SyServerTable/tests/SyServerTable.a11y.spec.ts +81 -0
- package/src/components/Tables/SyServerTable/tests/SyServerTable.spec.ts +390 -0
- package/src/components/Tables/SyTable/SyTable.mdx +25 -0
- package/src/components/Tables/SyTable/SyTable.stories.ts +556 -1
- package/src/components/Tables/SyTable/SyTable.vue +136 -60
- package/src/components/Tables/SyTable/tests/SyTable.a11y.spec.ts +79 -0
- package/src/components/Tables/SyTable/tests/SyTable.spec.ts +382 -0
- package/src/components/Tables/common/SyTableFilter.vue +49 -4
- package/src/components/Tables/common/SyTablePagination.vue +142 -19
- package/src/components/Tables/common/TableHeader.vue +45 -4
- 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 +11 -12
- 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/locales.ts +3 -0
- package/src/components/Tables/common/tableFilterUtils.ts +3 -0
- package/src/components/Tables/common/tableStyles.scss +60 -19
- package/src/components/Tables/common/tests/SyTablePagination.spec.ts +18 -0
- package/src/components/Tables/common/tests/TableHeader.spec.ts +39 -0
- package/src/components/Tables/common/tests/filterByRange.spec.ts +2 -1
- package/src/components/Tables/common/types.ts +15 -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 +52 -30
- package/src/components/Tables/common/useTableRowCheckboxAccessibility.ts +41 -0
- package/src/components/UploadWorkflow/UploadWorkflow.vue +1 -0
- package/src/components/UploadWorkflow/tests/UploadWorkflow.spec.ts +23 -0
- package/src/components/UploadWorkflow/tests/__snapshots__/UploadWorkflow.spec.ts.snap +66 -0
- package/src/components/UploadWorkflow/useFileList.ts +3 -0
- package/src/components/UserMenuBtn/UserMenuBtn.vue +1 -3
- 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/documentationValidationProps.ts +235 -0
- 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 +4 -7
- 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 +151 -99
- package/src/composantsVuetify/Introduction.mdx +48 -0
- package/src/composantsVuetify/VBreadcrumbs/VBreadcrumbs.mdx +28 -0
- package/src/composantsVuetify/VBreadcrumbs/v-breadcrumbs.stories.ts +108 -0
- package/src/composantsVuetify/VBtn/VBtn.mdx +72 -0
- package/src/composantsVuetify/VBtn/v-btn.stories.ts +121 -0
- package/src/composantsVuetify/VOtpInput/VOtpInput.mdx +39 -0
- package/src/composantsVuetify/VOtpInput/v-otp-input.stories.ts +56 -0
- package/src/composantsVuetify/VSkeletonLoader/VSkeletonLoader.mdx +42 -0
- package/src/composantsVuetify/VSkeletonLoader/v-skeleton-loader.stories.ts +77 -0
- package/src/composantsVuetify/VSwitch/VSwitch.mdx +47 -0
- package/src/composantsVuetify/VSwitch/v-switch.stories.ts +166 -0
- package/src/composantsVuetify/VTooltip/VTooltip.mdx +32 -0
- package/src/composantsVuetify/VTooltip/v-tooltip.stories.ts +95 -0
- package/src/designTokens/tests/buildColorClassMap.spec.ts +31 -0
- package/src/designTokens/tests/generateScssTokens.spec.ts +12 -0
- package/src/designTokens/tests/themeUtils.spec.ts +53 -0
- package/src/designTokens/tokens/amelipro/apColors.ts +8 -130
- package/src/designTokens/tokens/amelipro/apColors2026.ts +3 -15
- package/src/designTokens/tokens/amelipro/apContextual.ts +55 -47
- package/src/designTokens/tokens/amelipro/apLightTheme.ts +1 -1
- package/src/designTokens/tokens/amelipro/apSemantic.ts +1 -1
- package/src/designTokens/tokens/baseColors.ts +129 -0
- package/src/designTokens/tokens/baseContextualTokens.ts +52 -0
- package/src/designTokens/tokens/cnam/cnamColors.ts +3 -125
- package/src/designTokens/tokens/cnam/cnamContextual.ts +4 -48
- package/src/designTokens/tokens/cnam/cnamLightTheme.ts +1 -1
- package/src/designTokens/tokens/cnam/cnamSemantic.ts +3 -3
- package/src/designTokens/tokens/pa/paColors.ts +2 -166
- package/src/designTokens/tokens/pa/paContextual.ts +3 -48
- package/src/designTokens/tokens/pa/paLightTheme.ts +1 -1
- package/src/designTokens/tokens/pa/paSemantic.ts +2 -2
- package/src/designTokens/utils/buildColorClassMap.ts +34 -0
- package/src/designTokens/utils/convertSemanticsToken.ts +8 -11
- package/src/designTokens/utils/createFlattenTheme.ts +15 -7
- package/src/designTokens/utils/index.ts +2 -2
- package/src/main.ts +0 -2
- package/src/stories/Accessibilite/AuditDesignSystem.mdx +0 -11
- package/src/stories/Accessibilite/DesignSystem/Avancement.mdx +433 -0
- package/src/stories/Accessibilite/DesignSystem/a11y-status.json +692 -0
- package/src/stories/Accessibilite/KitDePreAudit/Echantillonnage.mdx +8 -1
- package/src/stories/Accessibilite/KitDePreAudit/Introduction.mdx +51 -10
- package/src/stories/Accessibilite/KitDePreAudit/Outils/Introduction.mdx +16 -9
- package/src/stories/Accessibilite/KitDePreAudit/Preaudit.mdx +48 -58
- package/src/stories/Components/Components.stories.ts +113 -9
- package/src/stories/Demarrer/Accueil.stories.ts +3 -3
- package/src/stories/Demarrer/EnrichirLeDesignSystem.mdx +4 -9
- package/src/stories/Demarrer/EnrichirLeDesignSystem.stories.ts +28 -0
- package/src/stories/Demarrer/Releases.stories.ts +48 -5
- package/src/stories/DesignTokens/ColorDisplay.vue +6 -5
- package/src/stories/DesignTokens/ColorIntegrationExample.vue +2 -4
- package/src/stories/DesignTokens/colors.stories.ts +5 -6
- package/src/stories/GuideDuDev/Amelipro.mdx +15 -0
- package/src/stories/GuideDuDev/Amelipro.stories.ts +209 -0
- package/src/stories/GuideDuDev/CreateVuetifyInstance.mdx +95 -0
- package/src/stories/GuideDuDev/Theme.mdx +36 -26
- package/src/stories/GuideDuDev/moduleDeNotification.mdx +3 -2
- package/src/stories/GuideDuDev/vuetifyOptions.mdx +3 -3
- package/src/stories/styles/accessibility-guide.css +3 -3
- package/src/utils/functions/classToHex.ts +6 -34
- package/src/utils/functions/createHexResolver.ts +45 -0
- package/src/utils/functions/tests/classToHex.spec.ts +36 -0
- package/src/utils/functions/tests/convertToHex.spec.ts +31 -0
- package/src/utils/functions/tests/createHexResolver.spec.ts +66 -0
- package/src/utils/functions/tests/isCssColor.spec.ts +48 -0
- package/dist/SelectFilter-BioGT6Nn.js +0 -136
- package/dist/designTokens/utils/convertGaps.d.ts +0 -5
- package/dist/main-aLKwdMi1.js +0 -37886
- package/dist/style.css +0 -1
- package/src/assets/apTokens.scss +0 -343
- package/src/assets/overrides/_container.scss +0 -36
- package/src/assets/tokens.scss +0 -388
- package/src/components/DatePicker/Accessibilite.mdx +0 -14
- package/src/designTokens/apColors.md +0 -66
- package/src/designTokens/cnamColors.md +0 -193
- package/src/designTokens/paColors.md +0 -66
- package/src/designTokens/tokens/json/contextual-tokens.json +0 -156
- package/src/designTokens/tokens/json/primitives.json +0 -209
- package/src/designTokens/tokens/json/semantic.json +0 -120
- package/src/designTokens/utils/convertGaps.ts +0 -11
- package/src/stories/Accessibilite/Avancement/Avancement.mdx +0 -533
- package/src/stories/Accessibilite/Avancement/Avancement.stories.ts +0 -306
|
@@ -5,7 +5,7 @@ import { fn } from '@storybook/test'
|
|
|
5
5
|
|
|
6
6
|
// Interface pour typer correctement le composant SyCheckbox avec sa méthode validateOnSubmit
|
|
7
7
|
interface SyCheckboxInstance {
|
|
8
|
-
validateOnSubmit: () => boolean
|
|
8
|
+
validateOnSubmit: () => Promise<boolean>
|
|
9
9
|
}
|
|
10
10
|
|
|
11
11
|
const meta = {
|
|
@@ -171,9 +171,6 @@ export const Indeterminate: Story = {
|
|
|
171
171
|
template: `<SyCheckbox v-model="checked" :indeterminate="indeterminate" v-bind="args" label="Case à cocher indéterminée" />`,
|
|
172
172
|
}),
|
|
173
173
|
parameters: {
|
|
174
|
-
a11y: {
|
|
175
|
-
disable: true,
|
|
176
|
-
},
|
|
177
174
|
sourceCode: [
|
|
178
175
|
{
|
|
179
176
|
name: 'Template',
|
|
@@ -207,9 +204,6 @@ Cette case à cocher est dans un état indéterminé, généralement utilisé lo
|
|
|
207
204
|
|
|
208
205
|
export const WithControlsIds: Story = {
|
|
209
206
|
parameters: {
|
|
210
|
-
a11y: {
|
|
211
|
-
disable: true,
|
|
212
|
-
},
|
|
213
207
|
sourceCode: [
|
|
214
208
|
{
|
|
215
209
|
name: 'Template',
|
|
@@ -702,11 +696,11 @@ const rules = [
|
|
|
702
696
|
},
|
|
703
697
|
]
|
|
704
698
|
|
|
705
|
-
const validateForm = () => {
|
|
699
|
+
const validateForm = async (): Promise<void> => {
|
|
706
700
|
if (!checkbox.value || !checkbox2.value) return
|
|
707
701
|
hasError.value = true
|
|
708
|
-
const isValid = checkbox.value.validateOnSubmit()
|
|
709
|
-
const isValid2 = checkbox2.value.validateOnSubmit()
|
|
702
|
+
const isValid = await checkbox.value.validateOnSubmit()
|
|
703
|
+
const isValid2 = await checkbox2.value.validateOnSubmit()
|
|
710
704
|
if (isValid && isValid2) {
|
|
711
705
|
formSubmitted.value = true
|
|
712
706
|
hasError.value = false
|
|
@@ -735,18 +729,18 @@ Cette case à cocher utilise des règles de validation personnalisées et valide
|
|
|
735
729
|
const hasError = ref(false)
|
|
736
730
|
|
|
737
731
|
// Revalider quand les valeurs changent
|
|
738
|
-
watch([checked, checked2], () => {
|
|
732
|
+
watch([checked, checked2], async () => {
|
|
739
733
|
if (hasError.value && checkbox.value && checkbox2.value) {
|
|
740
|
-
checkbox.value.validateOnSubmit()
|
|
741
|
-
checkbox2.value.validateOnSubmit()
|
|
734
|
+
await checkbox.value.validateOnSubmit()
|
|
735
|
+
await checkbox2.value.validateOnSubmit()
|
|
742
736
|
}
|
|
743
737
|
})
|
|
744
738
|
|
|
745
|
-
const validateForm = () => {
|
|
739
|
+
const validateForm = async (): Promise<void> => {
|
|
746
740
|
if (!checkbox.value || !checkbox2.value) return
|
|
747
741
|
hasError.value = true
|
|
748
|
-
const isValid = checkbox.value.validateOnSubmit()
|
|
749
|
-
const isValid2 = checkbox2.value.validateOnSubmit()
|
|
742
|
+
const isValid = await checkbox.value.validateOnSubmit()
|
|
743
|
+
const isValid2 = await checkbox2.value.validateOnSubmit()
|
|
750
744
|
if (isValid && isValid2) {
|
|
751
745
|
formSubmitted.value = true
|
|
752
746
|
hasError.value = false
|
|
@@ -36,6 +36,7 @@
|
|
|
36
36
|
falseValue?: unknown
|
|
37
37
|
controlsIds?: string[]
|
|
38
38
|
displayAsterisk?: boolean
|
|
39
|
+
decorative?: boolean
|
|
39
40
|
}>(),
|
|
40
41
|
{
|
|
41
42
|
modelValue: false,
|
|
@@ -66,11 +67,15 @@
|
|
|
66
67
|
falseValue: () => false,
|
|
67
68
|
controlsIds: () => [],
|
|
68
69
|
displayAsterisk: false,
|
|
70
|
+
decorative: false,
|
|
69
71
|
},
|
|
70
72
|
)
|
|
71
73
|
|
|
72
74
|
const emit = defineEmits(['update:modelValue', 'update:indeterminate', 'change'])
|
|
73
75
|
|
|
76
|
+
import SyIcon from '@/components/Customs/SyIcon/SyIcon.vue'
|
|
77
|
+
import { mdiCheckboxBlankOutline, mdiCheckboxMarked, mdiMinusBox } from '@mdi/js'
|
|
78
|
+
|
|
74
79
|
const checkboxRef = ref<VCheckbox | null>(null)
|
|
75
80
|
|
|
76
81
|
const internalIndeterminate = ref(props.indeterminate)
|
|
@@ -102,9 +107,6 @@
|
|
|
102
107
|
const isSubmitted = ref(false)
|
|
103
108
|
|
|
104
109
|
const validation = useValidation({
|
|
105
|
-
customRules: props.customRules,
|
|
106
|
-
warningRules: props.customWarningRules,
|
|
107
|
-
successRules: props.customSuccessRules,
|
|
108
110
|
showSuccessMessages: props.showSuccessMessages,
|
|
109
111
|
fieldIdentifier: props.label,
|
|
110
112
|
disableErrorHandling: props.disableErrorHandling,
|
|
@@ -135,7 +137,7 @@
|
|
|
135
137
|
: [],
|
|
136
138
|
)
|
|
137
139
|
|
|
138
|
-
const validateField = (value: boolean | null) => {
|
|
140
|
+
const validateField = async (value: boolean | null) => {
|
|
139
141
|
// Si en lecture seule ou si la valeur est null et non requise, pas de validation
|
|
140
142
|
if (props.readonly) {
|
|
141
143
|
validation.clearValidation()
|
|
@@ -157,7 +159,7 @@
|
|
|
157
159
|
}
|
|
158
160
|
|
|
159
161
|
// Validation standard
|
|
160
|
-
const result = validation.validateField(
|
|
162
|
+
const result = await validation.validateField(
|
|
161
163
|
value,
|
|
162
164
|
[...defaultRules.value, ...props.customRules],
|
|
163
165
|
props.customWarningRules,
|
|
@@ -175,11 +177,11 @@
|
|
|
175
177
|
validateField(model.value)
|
|
176
178
|
}
|
|
177
179
|
|
|
178
|
-
watch(model, (newValue) => {
|
|
180
|
+
watch(model, async (newValue) => {
|
|
179
181
|
if (!props.isValidateOnBlur) {
|
|
180
182
|
// Si le formulaire a été soumis et que la valeur change, on valide à nouveau
|
|
181
183
|
if (isSubmitted.value) {
|
|
182
|
-
const isValid = validateField(newValue)
|
|
184
|
+
const isValid = await validateField(newValue)
|
|
183
185
|
if (isValid) {
|
|
184
186
|
// La validation a réussi, effacer les erreurs
|
|
185
187
|
validation.clearValidation()
|
|
@@ -187,7 +189,7 @@
|
|
|
187
189
|
}
|
|
188
190
|
else {
|
|
189
191
|
// Comportement normal (hors soumission)
|
|
190
|
-
const isValid = validateField(newValue)
|
|
192
|
+
const isValid = await validateField(newValue)
|
|
191
193
|
// Si la validation réussit, s'assurer que les erreurs sont effacées
|
|
192
194
|
if (isValid && validation.hasError.value) {
|
|
193
195
|
validation.clearValidation()
|
|
@@ -206,7 +208,7 @@
|
|
|
206
208
|
|
|
207
209
|
const ariaChecked = computed(() => {
|
|
208
210
|
if (internalIndeterminate.value) return 'mixed'
|
|
209
|
-
return model.value ? 'true' :
|
|
211
|
+
return model.value ? 'true' : 'false'
|
|
210
212
|
})
|
|
211
213
|
|
|
212
214
|
const labelColor = computed(() => {
|
|
@@ -243,9 +245,17 @@
|
|
|
243
245
|
const removeAriaAttributes = () => {
|
|
244
246
|
nextTick(() => {
|
|
245
247
|
if (checkboxRef.value) {
|
|
246
|
-
const checkboxInput = checkboxRef.value.$el
|
|
248
|
+
const checkboxInput = checkboxRef.value.$el?.querySelector('input[type="checkbox"]')
|
|
247
249
|
if (checkboxInput) {
|
|
248
|
-
|
|
250
|
+
// Supprimer aria-disabled="false" car il est redondant
|
|
251
|
+
if (checkboxInput.getAttribute('aria-disabled') === 'false') {
|
|
252
|
+
checkboxInput.removeAttribute('aria-disabled')
|
|
253
|
+
}
|
|
254
|
+
// Supprimer aria-checked natif de Vuetify pour éviter les conflits
|
|
255
|
+
// Notre composant gère aria-checked au niveau du wrapper VCheckbox
|
|
256
|
+
if (checkboxInput.hasAttribute('aria-checked')) {
|
|
257
|
+
checkboxInput.removeAttribute('aria-checked')
|
|
258
|
+
}
|
|
249
259
|
}
|
|
250
260
|
}
|
|
251
261
|
})
|
|
@@ -303,7 +313,31 @@
|
|
|
303
313
|
|
|
304
314
|
<template>
|
|
305
315
|
<div>
|
|
316
|
+
<!-- Rendu purement visuel/décoratif, ignoré par les lecteurs d'écran -->
|
|
317
|
+
<div
|
|
318
|
+
v-if="props.decorative"
|
|
319
|
+
class="d-flex align-center pointer-events-none sy-checkbox-decorative"
|
|
320
|
+
aria-hidden="true"
|
|
321
|
+
>
|
|
322
|
+
<SyIcon
|
|
323
|
+
:icon="internalIndeterminate ? mdiMinusBox : (model ? mdiCheckboxMarked : mdiCheckboxBlankOutline)"
|
|
324
|
+
:color="(model || internalIndeterminate) ? props.color : '#727273'"
|
|
325
|
+
:class="{'text-disabled': props.disabled}"
|
|
326
|
+
:decorative="true"
|
|
327
|
+
class="mr-2"
|
|
328
|
+
/>
|
|
329
|
+
<slot name="label">
|
|
330
|
+
<span
|
|
331
|
+
v-if="generatedLabel"
|
|
332
|
+
:class="{'text-disabled': props.disabled}"
|
|
333
|
+
:style="{ color: labelColor }"
|
|
334
|
+
>{{ generatedLabel }}</span>
|
|
335
|
+
</slot>
|
|
336
|
+
</div>
|
|
337
|
+
|
|
338
|
+
<!-- Rendu interactif standard -->
|
|
306
339
|
<VCheckbox
|
|
340
|
+
v-else
|
|
307
341
|
:id="props.id"
|
|
308
342
|
ref="checkboxRef"
|
|
309
343
|
v-model="model"
|
|
@@ -79,6 +79,23 @@ import '@/stories/styles/shared.css';
|
|
|
79
79
|
</div>
|
|
80
80
|
</div>
|
|
81
81
|
|
|
82
|
+
<div className="aria-management-section">
|
|
83
|
+
<h2>Gestion des attributs ARIA</h2>
|
|
84
|
+
<p>
|
|
85
|
+
Pour garantir la conformité ARIA, le composant SyCheckbox gère activement les conflits potentiels
|
|
86
|
+
avec l'implémentation native de Vuetify :
|
|
87
|
+
</p>
|
|
88
|
+
<ul>
|
|
89
|
+
<li><strong>Suppression des attributs conflictuels</strong> : Les attributs ARIA natifs de Vuetify sont automatiquement supprimés de l'élément input pour éviter les doublons</li>
|
|
90
|
+
<li><strong>Gestion centralisée</strong> : L'attribut <code>aria-checked</code> est géré au niveau du composant SyCheckbox et non au niveau de l'input natif</li>
|
|
91
|
+
<li><strong>Conformité garantie</strong> : Cette approche garantit que l'attribut <code>aria-checked</code> reflète toujours l'état réel du composant (true, false ou mixed)</li>
|
|
92
|
+
</ul>
|
|
93
|
+
<p>
|
|
94
|
+
Cette gestion préventive évite les erreurs d'audit d'accessibilité qui pourraient survenir
|
|
95
|
+
lorsque plusieurs attributs ARIA contradictoires sont présents sur le même élément.
|
|
96
|
+
</p>
|
|
97
|
+
</div>
|
|
98
|
+
|
|
82
99
|
<div className="tri-state-section">
|
|
83
100
|
<h2>Fonctionnalité tri-état (indéterminé)</h2>
|
|
84
101
|
<p>
|
|
@@ -126,7 +143,19 @@ import '@/stories/styles/shared.css';
|
|
|
126
143
|
<p>
|
|
127
144
|
Cette relation est établie via la propriété <code>controlsIds</code> qui liste les identifiants des cases à cocher enfants.
|
|
128
145
|
</p>
|
|
129
|
-
</div>
|
|
146
|
+
</div>
|
|
147
|
+
|
|
148
|
+
<div className="decorative-mode-section">
|
|
149
|
+
<h2>Mode Décoratif (Imbrication)</h2>
|
|
150
|
+
<p>
|
|
151
|
+
Le composant SyCheckbox dispose d'une propriété <code>decorative</code> permettant de l'utiliser de manière purement visuelle.
|
|
152
|
+
Dans ce mode, la case à cocher n'inclut pas d'élément <code><input type="checkbox"></code> natif et est masquée aux lecteurs d'écran via <code>aria-hidden="true"</code>.
|
|
153
|
+
</p>
|
|
154
|
+
<p>
|
|
155
|
+
Ce mode est <strong>indispensable pour respecter l'accessibilité</strong> lorsque la case à cocher doit être imbriquée dans un autre composant interactif (par exemple, une option de <code>listbox</code> ou une ligne cliquable de tableau).
|
|
156
|
+
Les règles WAI-ARIA interdisent l'imbrication d'éléments interactifs. Le composant parent assume alors la responsabilité d'annoncer l'état de sélection (ex: via <code>aria-selected</code> ou <code>aria-checked</code> au niveau de la ligne).
|
|
157
|
+
</p>
|
|
158
|
+
</div>
|
|
130
159
|
|
|
131
160
|
<div className="best-practices">
|
|
132
161
|
<h2>Bonnes pratiques d'utilisation</h2>
|
|
@@ -190,8 +219,10 @@ import '@/stories/styles/shared.css';
|
|
|
190
219
|
|
|
191
220
|
.criteria-section h2,
|
|
192
221
|
.demo-section h2,
|
|
222
|
+
.aria-management-section h2,
|
|
193
223
|
.tri-state-section h2,
|
|
194
224
|
.parent-child-section h2,
|
|
225
|
+
.decorative-mode-section h2,
|
|
195
226
|
.best-practices h2,
|
|
196
227
|
.resources-section h2 {
|
|
197
228
|
border-bottom: 2px solid #eaecef;
|
|
@@ -243,8 +274,26 @@ import '@/stories/styles/shared.css';
|
|
|
243
274
|
margin-bottom: 40px;
|
|
244
275
|
}
|
|
245
276
|
|
|
277
|
+
.aria-management-section {
|
|
278
|
+
background-color: #fff9e6;
|
|
279
|
+
padding: 20px;
|
|
280
|
+
border-radius: 8px;
|
|
281
|
+
margin-bottom: 30px;
|
|
282
|
+
border-left: 5px solid #ff9800;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
.aria-management-section ul {
|
|
286
|
+
padding-left: 20px;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
.aria-management-section li {
|
|
290
|
+
margin-bottom: 8px;
|
|
291
|
+
line-height: 1.5;
|
|
292
|
+
}
|
|
293
|
+
|
|
246
294
|
.tri-state-section,
|
|
247
|
-
.parent-child-section
|
|
295
|
+
.parent-child-section,
|
|
296
|
+
.decorative-mode-section {
|
|
248
297
|
background-color: #f0f7ff;
|
|
249
298
|
padding: 20px;
|
|
250
299
|
border-radius: 8px;
|
|
@@ -252,7 +301,8 @@ import '@/stories/styles/shared.css';
|
|
|
252
301
|
}
|
|
253
302
|
|
|
254
303
|
.tri-state-section p,
|
|
255
|
-
.parent-child-section p
|
|
304
|
+
.parent-child-section p,
|
|
305
|
+
.decorative-mode-section p {
|
|
256
306
|
line-height: 1.6;
|
|
257
307
|
}
|
|
258
308
|
|
|
@@ -6,21 +6,153 @@ import { axe } from 'vitest-axe'
|
|
|
6
6
|
import { assertNoA11yViolations } from '@tests/unit/accessibility/axeUtils'
|
|
7
7
|
import SyCheckbox from '../SyCheckbox.vue'
|
|
8
8
|
|
|
9
|
-
//
|
|
9
|
+
// Scénarios d'accessibilité : cases à cocher avec différents états et configurations.
|
|
10
10
|
|
|
11
11
|
describe('SyCheckbox – accessibility (axe)', () => {
|
|
12
12
|
it('has no obvious axe violations for required checkbox with label', async () => {
|
|
13
13
|
const wrapper = mount(SyCheckbox, {
|
|
14
14
|
props: {
|
|
15
|
-
label: 'J
|
|
15
|
+
label: 'J\'accepte les conditions générales',
|
|
16
16
|
modelValue: false,
|
|
17
17
|
required: true,
|
|
18
18
|
},
|
|
19
19
|
})
|
|
20
20
|
|
|
21
|
+
// Attendre que removeAriaAttributes soit exécuté
|
|
22
|
+
await wrapper.vm.$nextTick()
|
|
23
|
+
await wrapper.vm.$nextTick()
|
|
24
|
+
|
|
21
25
|
const results = await axe(wrapper.element as HTMLElement)
|
|
22
26
|
assertNoA11yViolations(results, 'SyCheckbox – required labelled checkbox', {
|
|
23
27
|
ignoreRules: ['region'],
|
|
24
28
|
})
|
|
25
29
|
})
|
|
30
|
+
|
|
31
|
+
it('has no axe violations for indeterminate checkbox (aria-checked="mixed")', async () => {
|
|
32
|
+
const wrapper = mount(SyCheckbox, {
|
|
33
|
+
props: {
|
|
34
|
+
label: 'Sélection partielle',
|
|
35
|
+
modelValue: false,
|
|
36
|
+
indeterminate: true,
|
|
37
|
+
controlsIds: ['child-1', 'child-2', 'child-3'],
|
|
38
|
+
},
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
// Attendre que removeAriaAttributes soit exécuté
|
|
42
|
+
await wrapper.vm.$nextTick()
|
|
43
|
+
await wrapper.vm.$nextTick()
|
|
44
|
+
|
|
45
|
+
const results = await axe(wrapper.element as HTMLElement)
|
|
46
|
+
assertNoA11yViolations(results, 'SyCheckbox – indeterminate checkbox', {
|
|
47
|
+
ignoreRules: ['region'],
|
|
48
|
+
})
|
|
49
|
+
})
|
|
50
|
+
|
|
51
|
+
it('has no axe violations for checked checkbox with aria-checked="true"', async () => {
|
|
52
|
+
const wrapper = mount(SyCheckbox, {
|
|
53
|
+
props: {
|
|
54
|
+
label: 'Option activée',
|
|
55
|
+
modelValue: true,
|
|
56
|
+
required: false,
|
|
57
|
+
},
|
|
58
|
+
})
|
|
59
|
+
|
|
60
|
+
// Attendre que removeAriaAttributes soit exécuté
|
|
61
|
+
await wrapper.vm.$nextTick()
|
|
62
|
+
await wrapper.vm.$nextTick()
|
|
63
|
+
|
|
64
|
+
const results = await axe(wrapper.element as HTMLElement)
|
|
65
|
+
assertNoA11yViolations(results, 'SyCheckbox – checked checkbox', {
|
|
66
|
+
ignoreRules: ['region'],
|
|
67
|
+
})
|
|
68
|
+
})
|
|
69
|
+
|
|
70
|
+
it('has no axe violations for unchecked checkbox with aria-checked="false"', async () => {
|
|
71
|
+
const wrapper = mount(SyCheckbox, {
|
|
72
|
+
props: {
|
|
73
|
+
label: 'Option désactivée',
|
|
74
|
+
modelValue: false,
|
|
75
|
+
required: false,
|
|
76
|
+
},
|
|
77
|
+
})
|
|
78
|
+
|
|
79
|
+
// Attendre que removeAriaAttributes soit exécuté
|
|
80
|
+
await wrapper.vm.$nextTick()
|
|
81
|
+
await wrapper.vm.$nextTick()
|
|
82
|
+
|
|
83
|
+
const results = await axe(wrapper.element as HTMLElement)
|
|
84
|
+
assertNoA11yViolations(results, 'SyCheckbox – unchecked checkbox', {
|
|
85
|
+
ignoreRules: ['region'],
|
|
86
|
+
})
|
|
87
|
+
})
|
|
88
|
+
|
|
89
|
+
it('has no axe violations for disabled checkbox', async () => {
|
|
90
|
+
const wrapper = mount(SyCheckbox, {
|
|
91
|
+
props: {
|
|
92
|
+
label: 'Option désactivée',
|
|
93
|
+
modelValue: true,
|
|
94
|
+
disabled: true,
|
|
95
|
+
},
|
|
96
|
+
})
|
|
97
|
+
|
|
98
|
+
// Attendre que removeAriaAttributes soit exécuté
|
|
99
|
+
await wrapper.vm.$nextTick()
|
|
100
|
+
await wrapper.vm.$nextTick()
|
|
101
|
+
|
|
102
|
+
const results = await axe(wrapper.element as HTMLElement)
|
|
103
|
+
assertNoA11yViolations(results, 'SyCheckbox – disabled checkbox', {
|
|
104
|
+
ignoreRules: ['region'],
|
|
105
|
+
})
|
|
106
|
+
})
|
|
107
|
+
|
|
108
|
+
it('has no axe violations for checkbox with custom aria-label', async () => {
|
|
109
|
+
const wrapper = mount(SyCheckbox, {
|
|
110
|
+
props: {
|
|
111
|
+
ariaLabel: 'Case à cocher personnalisée',
|
|
112
|
+
modelValue: false,
|
|
113
|
+
},
|
|
114
|
+
})
|
|
115
|
+
|
|
116
|
+
// Attendre que removeAriaAttributes soit exécuté
|
|
117
|
+
await wrapper.vm.$nextTick()
|
|
118
|
+
await wrapper.vm.$nextTick()
|
|
119
|
+
|
|
120
|
+
const results = await axe(wrapper.element as HTMLElement)
|
|
121
|
+
assertNoA11yViolations(results, 'SyCheckbox – checkbox with aria-label', {
|
|
122
|
+
ignoreRules: ['region'],
|
|
123
|
+
})
|
|
124
|
+
})
|
|
125
|
+
|
|
126
|
+
it('has no axe violations for checkbox with aria-labelledby', async () => {
|
|
127
|
+
// Créer un conteneur pour le test
|
|
128
|
+
const container = document.createElement('div')
|
|
129
|
+
document.body.appendChild(container)
|
|
130
|
+
|
|
131
|
+
// Créer un élément avec l'ID référencé
|
|
132
|
+
const labelElement = document.createElement('div')
|
|
133
|
+
labelElement.id = 'custom-label-id'
|
|
134
|
+
labelElement.textContent = 'Libellé personnalisé'
|
|
135
|
+
container.appendChild(labelElement)
|
|
136
|
+
|
|
137
|
+
const wrapper = mount(SyCheckbox, {
|
|
138
|
+
props: {
|
|
139
|
+
ariaLabelledby: 'custom-label-id',
|
|
140
|
+
modelValue: false,
|
|
141
|
+
},
|
|
142
|
+
attachTo: container,
|
|
143
|
+
})
|
|
144
|
+
|
|
145
|
+
// Attendre que removeAriaAttributes soit exécuté
|
|
146
|
+
await wrapper.vm.$nextTick()
|
|
147
|
+
await wrapper.vm.$nextTick()
|
|
148
|
+
|
|
149
|
+
const results = await axe(container as HTMLElement)
|
|
150
|
+
assertNoA11yViolations(results, 'SyCheckbox – checkbox with aria-labelledby', {
|
|
151
|
+
ignoreRules: ['region'],
|
|
152
|
+
})
|
|
153
|
+
|
|
154
|
+
// Nettoyer
|
|
155
|
+
wrapper.unmount()
|
|
156
|
+
document.body.removeChild(container)
|
|
157
|
+
})
|
|
26
158
|
})
|
|
@@ -5,6 +5,7 @@ import SyTextField from '@/components/Customs/SyTextField/SyTextField.vue'
|
|
|
5
5
|
import SyCheckbox from '@/components/Customs/SyCheckbox/SyCheckbox.vue'
|
|
6
6
|
import SySelect from '@/components/Customs/Selects/SySelect/SySelect.vue'
|
|
7
7
|
import { VBtn } from 'vuetify/components'
|
|
8
|
+
import { fn } from '@storybook/test'
|
|
8
9
|
|
|
9
10
|
export default {
|
|
10
11
|
title: 'Composants/Formulaires/SyForm',
|
|
@@ -42,6 +43,10 @@ export default {
|
|
|
42
43
|
type Story = StoryObj<typeof SyForm>
|
|
43
44
|
|
|
44
45
|
export const Basic: Story = {
|
|
46
|
+
args: {
|
|
47
|
+
onReset: fn(),
|
|
48
|
+
onSubmit: fn(),
|
|
49
|
+
},
|
|
45
50
|
render: args => ({
|
|
46
51
|
components: { SyForm, SyTextField, VBtn },
|
|
47
52
|
setup() {
|
|
@@ -126,6 +131,11 @@ const onSubmit = (event: { isValid: boolean }) => {
|
|
|
126
131
|
}
|
|
127
132
|
|
|
128
133
|
export const CustomValidation: Story = {
|
|
134
|
+
args: {
|
|
135
|
+
validateOnSubmit: false,
|
|
136
|
+
onReset: fn(),
|
|
137
|
+
onSubmit: fn(),
|
|
138
|
+
},
|
|
129
139
|
render: args => ({
|
|
130
140
|
components: { SyForm, SyTextField, VBtn },
|
|
131
141
|
setup() {
|
|
@@ -142,7 +152,7 @@ export const CustomValidation: Story = {
|
|
|
142
152
|
|
|
143
153
|
const confirmPasswordRules = computed(() => [
|
|
144
154
|
{ type: 'custom', options: {
|
|
145
|
-
validate: value => value === password.value
|
|
155
|
+
validate: (value: string) => value === password.value,
|
|
146
156
|
message: 'Les mots de passe ne correspondent pas',
|
|
147
157
|
} },
|
|
148
158
|
{ type: 'required', options: { message: 'Veuillez confirmer le mot de passe' } },
|
|
@@ -150,7 +160,7 @@ export const CustomValidation: Story = {
|
|
|
150
160
|
|
|
151
161
|
const submitForm = async (e: { isValid: boolean }) => {
|
|
152
162
|
if (e.isValid) {
|
|
153
|
-
alert('Inscription réussie !')
|
|
163
|
+
alert('Inscription réussie ! (validate on submit = ' + args.validateOnSubmit + ')')
|
|
154
164
|
}
|
|
155
165
|
else {
|
|
156
166
|
alert('Formulaire invalide, veuillez corriger les erreurs.')
|
|
@@ -171,7 +181,7 @@ export const CustomValidation: Story = {
|
|
|
171
181
|
},
|
|
172
182
|
template: `
|
|
173
183
|
<div>
|
|
174
|
-
<SyForm ref="form" v-bind="args" @submit="submitForm" :validate-on-submit="
|
|
184
|
+
<SyForm ref="form" v-bind="args" @submit="submitForm" :validate-on-submit="args.validateOnSubmit">
|
|
175
185
|
<div class="d-flex flex-column gap-4">
|
|
176
186
|
<SyTextField v-model="username" label="Nom d'utilisateur" required class="mb-2" />
|
|
177
187
|
<SyTextField v-model="password" label="Mot de passe" type="password" :custom-rules="passwordRules" class="mb-2" />
|
|
@@ -238,7 +248,7 @@ const passwordRules = computed(() => [
|
|
|
238
248
|
|
|
239
249
|
const confirmPasswordRules = computed(() => [
|
|
240
250
|
{ type: 'custom', options: {
|
|
241
|
-
validate: value => value === password.value
|
|
251
|
+
validate: (value: string) => value === password.value,
|
|
242
252
|
message: 'Les mots de passe ne correspondent pas',
|
|
243
253
|
} },
|
|
244
254
|
{ type: 'required', options: { message: 'Veuillez confirmer le mot de passe' } },
|
|
@@ -267,6 +277,10 @@ const validateManually = () => {
|
|
|
267
277
|
}
|
|
268
278
|
|
|
269
279
|
export const MixedFields: Story = {
|
|
280
|
+
args: {
|
|
281
|
+
onReset: fn(),
|
|
282
|
+
onSubmit: fn(),
|
|
283
|
+
},
|
|
270
284
|
render: args => ({
|
|
271
285
|
components: { SyForm, SyTextField, SySelect, SyCheckbox, VBtn },
|
|
272
286
|
setup() {
|
|
@@ -372,6 +386,9 @@ export const MixedFields: Story = {
|
|
|
372
386
|
if (event.isValid) {
|
|
373
387
|
alert('Formulaire valide ! Données: ' + JSON.stringify(formData.value))
|
|
374
388
|
}
|
|
389
|
+
else {
|
|
390
|
+
alert('Formulaire invalide, veuillez corriger les erreurs.')
|
|
391
|
+
}
|
|
375
392
|
}
|
|
376
393
|
</script>
|
|
377
394
|
`,
|
|
@@ -381,6 +398,10 @@ export const MixedFields: Story = {
|
|
|
381
398
|
}
|
|
382
399
|
|
|
383
400
|
export const Reset: Story = {
|
|
401
|
+
args: {
|
|
402
|
+
onReset: fn(),
|
|
403
|
+
onSubmit: fn(),
|
|
404
|
+
},
|
|
384
405
|
render: args => ({
|
|
385
406
|
components: { SyForm, SyTextField, VBtn },
|
|
386
407
|
setup() {
|
|
@@ -408,7 +429,12 @@ export const Reset: Story = {
|
|
|
408
429
|
form.value?.clearValidation()
|
|
409
430
|
}
|
|
410
431
|
|
|
411
|
-
|
|
432
|
+
function onFormReset() {
|
|
433
|
+
alert('Formulaire réinitialisé !')
|
|
434
|
+
args.onReset?.()
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
return { name, email, emailRules, form, submitForm, clearAll, onFormReset, args }
|
|
412
438
|
},
|
|
413
439
|
template: `
|
|
414
440
|
<SyForm ref="form" v-bind="args" @submit="submitForm" @reset="onFormReset">
|
|
@@ -82,9 +82,6 @@
|
|
|
82
82
|
const isSubmitted = ref(false)
|
|
83
83
|
|
|
84
84
|
const validation = useValidation({
|
|
85
|
-
customRules: props.customRules,
|
|
86
|
-
warningRules: props.customWarningRules,
|
|
87
|
-
successRules: props.customSuccessRules,
|
|
88
85
|
showSuccessMessages: props.showSuccessMessages,
|
|
89
86
|
fieldIdentifier: props.label,
|
|
90
87
|
disableErrorHandling: props.disableErrorHandling,
|
|
@@ -108,7 +105,7 @@
|
|
|
108
105
|
: [],
|
|
109
106
|
)
|
|
110
107
|
|
|
111
|
-
const validateField = (value: PropertyKey | null) => {
|
|
108
|
+
const validateField = async (value: PropertyKey | null) => {
|
|
112
109
|
// const stringValue = value != null ? String(value) : null
|
|
113
110
|
|
|
114
111
|
if (props.readonly) {
|
|
@@ -121,7 +118,7 @@
|
|
|
121
118
|
return true
|
|
122
119
|
}
|
|
123
120
|
|
|
124
|
-
const result = validation.validateField(
|
|
121
|
+
const result = await validation.validateField(
|
|
125
122
|
value,
|
|
126
123
|
[...defaultRules.value, ...props.customRules],
|
|
127
124
|
props.customWarningRules,
|
|
@@ -130,9 +127,9 @@
|
|
|
130
127
|
return !result.hasError
|
|
131
128
|
}
|
|
132
129
|
|
|
133
|
-
const validateOnSubmit = () => {
|
|
130
|
+
const validateOnSubmit = async () => {
|
|
134
131
|
isSubmitted.value = true
|
|
135
|
-
return validateField(model.value)
|
|
132
|
+
return await validateField(model.value)
|
|
136
133
|
}
|
|
137
134
|
|
|
138
135
|
const checkErrorOnBlur = () => {
|
|
@@ -9,16 +9,6 @@ import * as SyTabsStories from "./SyTabs.stories";
|
|
|
9
9
|
<p>Le composant `SyTabs` est un système de navigation par onglets conforme au Design System qui respecte les règles d'accessibilité <abbr title="Référentiel Général d'Amélioration de l'Accessibilité">RGAA</abbr>. Il permet d'organiser le contenu en sections navigables facilement via une interface à onglets.</p>
|
|
10
10
|
</div>
|
|
11
11
|
|
|
12
|
-
Il implémente les fonctionnalités suivantes :
|
|
13
|
-
|
|
14
|
-
- Navigation complète au clavier
|
|
15
|
-
- Attributs ARIA appropriés
|
|
16
|
-
- Gestion du focus accessible
|
|
17
|
-
- Structure HTML sémantique
|
|
18
|
-
- Design personnalisable
|
|
19
|
-
|
|
20
|
-
<Canvas of={SyTabsStories.Default} />
|
|
21
|
-
|
|
22
12
|
## API
|
|
23
13
|
|
|
24
14
|
<Controls of={SyTabsStories.Default} />
|
|
@@ -36,54 +26,6 @@ export interface TabItem {
|
|
|
36
26
|
}
|
|
37
27
|
```
|
|
38
28
|
|
|
39
|
-
<div className="header">
|
|
40
|
-
<h1>Accessibilité</h1>
|
|
41
|
-
</div>
|
|
42
|
-
|
|
43
|
-
Le composant `SyTabs` respecte les critères d'accessibilité RGAA suivants :
|
|
44
|
-
|
|
45
|
-
### Structure sémantique
|
|
46
|
-
|
|
47
|
-
- Utilise les éléments `<nav>`, `<ul>` et `<li>` pour une structure de navigation sémantique
|
|
48
|
-
- Associe chaque onglet à son panneau de contenu via les attributs `aria-controls` et `aria-labelledby`
|
|
49
|
-
- Utilise l'attribut `aria-label="Onglets de navigation"` sur l'élément `<nav>` pour identifier la navigation
|
|
50
|
-
|
|
51
|
-
### Rôles ARIA
|
|
52
|
-
|
|
53
|
-
- `role="tablist"` sur le conteneur de navigation
|
|
54
|
-
- `role="presentation"` sur les éléments de liste
|
|
55
|
-
- `role="tab"` sur les boutons d'onglets
|
|
56
|
-
- `role="tabpanel"` sur les panneaux de contenu
|
|
57
|
-
|
|
58
|
-
### États et propriétés
|
|
59
|
-
|
|
60
|
-
- `aria-selected="true|false"` indique l'onglet actif
|
|
61
|
-
- Attribut `hidden` sur les panneaux non actifs
|
|
62
|
-
- Focus visible avec outline adapté au design system
|
|
63
|
-
|
|
64
|
-
### Navigation au clavier
|
|
65
|
-
|
|
66
|
-
Le composant implémente toutes les interactions clavier recommandées par les [Pratiques Authoring WAI-ARIA 1.2](https://www.w3.org/WAI/ARIA/apg/patterns/tabpanel/) :
|
|
67
|
-
|
|
68
|
-
- **Flèches gauche/droite** : Navigation entre les onglets
|
|
69
|
-
- **Touches Home/End** : Accès au premier/dernier onglet
|
|
70
|
-
- **Entrée/Espace** : Activation de l'onglet
|
|
71
|
-
- **Échap** : Gestion du focus
|
|
72
|
-
|
|
73
|
-
### Contraste et visibilité
|
|
74
|
-
|
|
75
|
-
- Contraste suffisant entre le texte et le fond (minimum 4.5:1)
|
|
76
|
-
- Indication visuelle claire de l'onglet actif (changement de couleur et bordure)
|
|
77
|
-
- Focus visible conforme aux exigences RGAA
|
|
78
|
-
|
|
79
|
-
### Tests d'accessibilité
|
|
80
|
-
|
|
81
|
-
Le composant a été testé avec :
|
|
82
|
-
- Lecteurs d'écran (NVDA, VoiceOver)
|
|
83
|
-
- Navigation clavier
|
|
84
|
-
- Outils de vérification de contraste
|
|
85
|
-
|
|
86
|
-
<Canvas of={SyTabsStories.Default} />
|
|
87
29
|
|
|
88
30
|
## Personnalisation
|
|
89
31
|
|