@cnamts/synapse 1.0.23 → 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-Dc-gSGwk.js → DateFilter-BpwFexzi.js} +1 -1
- package/dist/DateFilter-DTUl8hb1.cjs +1 -0
- package/dist/{NumberFilter-vP38Wp6j.js → NumberFilter-Bz_NTdX9.js} +3 -3
- package/dist/NumberFilter-MAEojdk0.cjs +1 -0
- package/dist/PeriodFilter-CC4WgIhl.cjs +1 -0
- package/dist/{PeriodFilter-Ba1uYUnT.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-B84dpnoq.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/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 +108 -146
- 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 +28 -506
- package/dist/components/Customs/SyRadioGroup/SyRadioGroup.d.ts +28 -506
- package/dist/components/Customs/SyTextField/SyTextField.d.ts +65 -85
- package/dist/components/DatePicker/CalendarMode/DatePicker.d.ts +627 -771
- package/dist/components/DatePicker/ComplexDatePicker/ComplexDatePicker.d.ts +315 -402
- package/dist/components/DatePicker/DateTextInput/DateTextInput.d.ts +112 -155
- 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/HeaderNavigationBar/HeaderNavigationBar.d.ts +4 -4
- 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 -122
- package/dist/components/MonthPicker/MonthPickerText/MonthPickerInput.d.ts +85 -121
- package/dist/components/NirField/NirField.d.ts +206 -270
- 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 -1640
- package/dist/components/PhoneField/PhoneField.d.ts +88 -124
- 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 +9 -6
- package/dist/components/Tables/SyTable/SyTable.d.ts +9 -6
- package/dist/components/Tables/common/SyTableFilter.d.ts +2 -3
- package/dist/components/Tables/common/SyTablePagination.d.ts +17 -19
- 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/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 +186 -187
- package/dist/design-system-v3.umd.cjs +1 -1066
- package/dist/{main-aLKwdMi1.js → main-BtTqyn4z.js} +16434 -15672
- package/dist/main-C1e3eoxd.cjs +1067 -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/vuetifyConfig.js +561 -0
- package/dist/vuetifyConfig.umd.cjs +1 -0
- package/package.json +10 -4
- package/src/assets/overrides/_btns.scss +0 -6
- package/src/assets/overrides/_icons.scss +9 -1
- package/src/assets/overrides/_typography.scss +0 -10
- 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/AmeliproTextArea/__tests__/__snapshots__/AmeliproTextArea.spec.ts.snap +2 -2
- 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 +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 +0 -9
- package/src/components/Customs/Selects/SyAutocomplete/SyAutocomplete.vue +22 -5
- package/src/components/Customs/Selects/SyAutocomplete/tests/SyAutocomplete.spec.ts +143 -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 +8 -9
- package/src/components/Customs/Selects/SyInputSelect/tests/SyInputSelect.spec.ts +10 -10
- package/src/components/Customs/Selects/SySelect/SySelect.vue +14 -11
- 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/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 +154 -157
- 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 +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/HeaderBar/HeaderBar.stories.ts +14 -2
- package/src/components/Logo/accessibilite/Accessibility.mdx +73 -11
- 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/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 +4 -0
- 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/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/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/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/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 +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 +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/cnamSemantic.ts +2 -2
- package/src/main.ts +0 -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-BioGT6Nn.js +0 -136
- package/dist/style.css +0 -1
- package/src/components/DatePicker/Accessibilite.mdx +0 -14
|
@@ -29,7 +29,7 @@ export const useDateValidation = (options: {
|
|
|
29
29
|
// Fonctions de validation
|
|
30
30
|
clearValidation: () => void
|
|
31
31
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Règles personnalisées
|
|
32
|
-
validateField: (value: any, rules?: any[], warningRules?: any[]) => ValidationResult
|
|
32
|
+
validateField: (value: any, rules?: any[], warningRules?: any[]) => ValidationResult | Promise<ValidationResult>
|
|
33
33
|
|
|
34
34
|
// Références aux messages
|
|
35
35
|
errors: Ref<string[]>
|
|
@@ -60,7 +60,7 @@ export const useDateValidation = (options: {
|
|
|
60
60
|
* @param forceValidation - Force la validation même si isUpdatingFromInternal est vrai
|
|
61
61
|
* @returns Résultat de la validation
|
|
62
62
|
*/
|
|
63
|
-
const validateDates = (forceValidation = false): ValidationResult => {
|
|
63
|
+
const validateDates = (forceValidation = false): ValidationResult | Promise<ValidationResult> => {
|
|
64
64
|
const currentCustomRules = unref(customRules)
|
|
65
65
|
const currentCustomWarningRules = unref(customWarningRules)
|
|
66
66
|
|
|
@@ -152,64 +152,65 @@ export const useDateValidation = (options: {
|
|
|
152
152
|
? selectedDates.value.filter(Boolean) // Filtrer les valeurs null
|
|
153
153
|
: [selectedDates.value]
|
|
154
154
|
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
// Valider chaque date
|
|
158
|
-
if (shouldDisplayErrors) {
|
|
159
|
-
datesToValidate.forEach((date) => {
|
|
160
|
-
if (!date) return // Ignorer les dates null
|
|
161
|
-
|
|
162
|
-
const result = validateField(
|
|
163
|
-
date,
|
|
164
|
-
currentCustomRules,
|
|
165
|
-
currentCustomWarningRules,
|
|
166
|
-
)
|
|
167
|
-
if (result.hasError) {
|
|
168
|
-
isValid = false
|
|
169
|
-
}
|
|
170
|
-
})
|
|
155
|
+
const finalizeValidation = (isValid: boolean): ValidationResult => {
|
|
156
|
+
let finalIsValid = isValid
|
|
171
157
|
|
|
172
158
|
// Vérifier la validité de la plage de dates si en mode plage
|
|
173
159
|
if (displayRange && Array.isArray(selectedDates.value) && selectedDates.value.length >= 2) {
|
|
174
|
-
// Récupérer les dates de début et de fin
|
|
175
160
|
const startDate = selectedDates.value[0]
|
|
176
161
|
const endDate = selectedDates.value[selectedDates.value.length - 1]
|
|
177
162
|
|
|
178
|
-
// Vérifier si les deux dates sont présentes et si la plage est valide
|
|
179
163
|
if (startDate && endDate && startDate.getTime() > endDate.getTime()) {
|
|
180
|
-
// La date de fin est antérieure à la date de début
|
|
181
164
|
const rangeError = DATE_PICKER_MESSAGES.ERROR_END_BEFORE_START
|
|
182
165
|
if (!errors.value.includes(rangeError)) {
|
|
183
166
|
errors.value.push(rangeError)
|
|
184
|
-
|
|
167
|
+
finalIsValid = false
|
|
185
168
|
}
|
|
186
169
|
}
|
|
187
|
-
// Utiliser également la validation du composable useDateRangeValidation
|
|
188
170
|
else if (!currentRangeIsValid.value) {
|
|
189
171
|
const rangeError = getRangeValidationError.value
|
|
190
172
|
if (rangeError && !errors.value.includes(rangeError)) {
|
|
191
173
|
errors.value.push(rangeError)
|
|
192
|
-
|
|
174
|
+
finalIsValid = false
|
|
193
175
|
}
|
|
194
176
|
}
|
|
195
177
|
}
|
|
196
178
|
|
|
197
|
-
// Dédoublonner les messages (au cas où plusieurs dates auraient les mêmes messages)
|
|
198
179
|
errors.value = [...new Set(errors.value)]
|
|
199
180
|
warnings.value = [...new Set(warnings.value)]
|
|
200
181
|
successes.value = [...new Set(successes.value)]
|
|
182
|
+
|
|
183
|
+
return {
|
|
184
|
+
hasError: !finalIsValid,
|
|
185
|
+
hasWarning: warnings.value.length > 0,
|
|
186
|
+
hasSuccess: successes.value.length > 0 && finalIsValid && warnings.value.length === 0,
|
|
187
|
+
state: {
|
|
188
|
+
errors: errors.value,
|
|
189
|
+
warnings: warnings.value,
|
|
190
|
+
successes: successes.value,
|
|
191
|
+
},
|
|
192
|
+
}
|
|
201
193
|
}
|
|
202
194
|
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
hasWarning: warnings.value.length > 0,
|
|
206
|
-
hasSuccess: successes.value.length > 0 && isValid && warnings.value.length === 0,
|
|
207
|
-
state: {
|
|
208
|
-
errors: errors.value,
|
|
209
|
-
warnings: warnings.value,
|
|
210
|
-
successes: successes.value,
|
|
211
|
-
},
|
|
195
|
+
if (!shouldDisplayErrors) {
|
|
196
|
+
return finalizeValidation(true)
|
|
212
197
|
}
|
|
198
|
+
|
|
199
|
+
const validationResults = datesToValidate
|
|
200
|
+
.filter(Boolean)
|
|
201
|
+
.map(date => validateField(date, currentCustomRules, currentCustomWarningRules))
|
|
202
|
+
|
|
203
|
+
if (validationResults.some(result => result instanceof Promise)) {
|
|
204
|
+
return Promise
|
|
205
|
+
.all(validationResults.map(result => Promise.resolve(result)))
|
|
206
|
+
.then((resolvedResults) => {
|
|
207
|
+
const hasError = resolvedResults.some(result => result.hasError)
|
|
208
|
+
return finalizeValidation(!hasError)
|
|
209
|
+
})
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
const hasError = (validationResults as ValidationResult[]).some(result => result.hasError)
|
|
213
|
+
return finalizeValidation(!hasError)
|
|
213
214
|
}
|
|
214
215
|
|
|
215
216
|
/**
|
|
@@ -217,7 +218,7 @@ export const useDateValidation = (options: {
|
|
|
217
218
|
*
|
|
218
219
|
* @returns Résultat de la validation
|
|
219
220
|
*/
|
|
220
|
-
const validateOnSubmit = (): ValidationResult => {
|
|
221
|
+
const validateOnSubmit = (): ValidationResult | Promise<ValidationResult> => {
|
|
221
222
|
return validateDates(true)
|
|
222
223
|
}
|
|
223
224
|
|
|
@@ -28,7 +28,7 @@ export const useInputBlurHandler = (options: {
|
|
|
28
28
|
parseDate: (dateStr: string, format: string) => Date | null
|
|
29
29
|
formatDate: (date: Date, format: string) => string
|
|
30
30
|
updateModel: (value: DateValue) => void
|
|
31
|
-
validateManualInput: (value: string) => boolean
|
|
31
|
+
validateManualInput: (value: string) => boolean | Promise<boolean>
|
|
32
32
|
|
|
33
33
|
// Émetteurs d'événements
|
|
34
34
|
emitBlur: () => void
|
|
@@ -54,7 +54,7 @@ export const useInputBlurHandler = (options: {
|
|
|
54
54
|
/**
|
|
55
55
|
* Gère la perte de focus du champ de saisie de date
|
|
56
56
|
*/
|
|
57
|
-
const handleInputBlur = () => {
|
|
57
|
+
const handleInputBlur = async () => {
|
|
58
58
|
// Émettre l'événement blur
|
|
59
59
|
emitBlur()
|
|
60
60
|
|
|
@@ -155,7 +155,7 @@ export const useInputBlurHandler = (options: {
|
|
|
155
155
|
// Note: La vérification du type string a déjà été faite plus haut
|
|
156
156
|
// et on retourne si ce n'est pas une chaîne, donc ici displayFormattedDate.value est forcément une chaîne
|
|
157
157
|
if (displayFormattedDate.value) {
|
|
158
|
-
validateManualInput(displayFormattedDate.value || '')
|
|
158
|
+
await Promise.resolve(validateManualInput(displayFormattedDate.value || ''))
|
|
159
159
|
}
|
|
160
160
|
}
|
|
161
161
|
|
|
@@ -31,7 +31,7 @@ export const useManualDateValidation = (options: {
|
|
|
31
31
|
validateDateFormat: (dateStr: string) => { isValid: boolean, message: string }
|
|
32
32
|
isDateComplete: (value: string) => boolean
|
|
33
33
|
parseDate: (dateStr: string, format: string) => Date | null
|
|
34
|
-
validateField: (value: unknown, rules?: CustomRule[], warningRules?: CustomRule[]) => ValidationResult
|
|
34
|
+
validateField: (value: unknown, rules?: CustomRule[], warningRules?: CustomRule[]) => ValidationResult | Promise<ValidationResult>
|
|
35
35
|
}) => {
|
|
36
36
|
const {
|
|
37
37
|
format,
|
|
@@ -57,7 +57,7 @@ export const useManualDateValidation = (options: {
|
|
|
57
57
|
* @param value - Chaîne de date à valider
|
|
58
58
|
* @returns Booléen indiquant si la saisie est valide
|
|
59
59
|
*/
|
|
60
|
-
const validateManualInput = (value: string): boolean => {
|
|
60
|
+
const validateManualInput = (value: string): boolean | Promise<boolean> => {
|
|
61
61
|
// Réinitialiser la validation
|
|
62
62
|
clearValidation()
|
|
63
63
|
|
|
@@ -129,6 +129,10 @@ export const useManualDateValidation = (options: {
|
|
|
129
129
|
safeWarningRules,
|
|
130
130
|
)
|
|
131
131
|
|
|
132
|
+
if (result instanceof Promise) {
|
|
133
|
+
return result.then(resolvedResult => !resolvedResult.hasError)
|
|
134
|
+
}
|
|
135
|
+
|
|
132
136
|
return !result.hasError
|
|
133
137
|
}
|
|
134
138
|
|
|
@@ -1,10 +1,78 @@
|
|
|
1
|
-
import { Meta, Story } from '@storybook/
|
|
2
|
-
import * as
|
|
3
|
-
import '@/
|
|
1
|
+
import { Meta, Story } from '@storybook/blocks';
|
|
2
|
+
import * as DiacriticPickerStories from '../DiacriticPicker.stories';
|
|
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
|
+
AuditSection,
|
|
12
|
+
} from '@/stories/accessibility/AccessibilityGuideLayout.mdx';
|
|
4
13
|
|
|
5
|
-
<Meta of={
|
|
14
|
+
<Meta of={DiacriticPickerStories} />
|
|
6
15
|
|
|
7
|
-
<
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
16
|
+
<AccessibilityGuideLayout
|
|
17
|
+
componentName="DiacriticPicker"
|
|
18
|
+
iconSrc={AccessibilityIcon}
|
|
19
|
+
apgHref="https://www.w3.org/WAI/ARIA/apg/patterns/dialogmodal/"
|
|
20
|
+
>
|
|
21
|
+
<CriteriaSection>
|
|
22
|
+
<CriteriaCard icon="🔍" title="Structure sémantique et rôles ARIA">
|
|
23
|
+
<ul>
|
|
24
|
+
<li><strong>Bouton déclencheur</strong> : Utilise <code>aria-controls</code> et <code>aria-haspopup="dialog"</code> pour indiquer la relation avec le dialogue.</li>
|
|
25
|
+
<li><strong>État du dialogue</strong> : <code>aria-expanded</code> reflète l'état d'ouverture/fermeture du dialogue.</li>
|
|
26
|
+
<li><strong>Rôle du dialogue</strong> : <code>role="dialog"</code> et <code>aria-modal="true"</code> sur le VDialog.</li>
|
|
27
|
+
<li><strong>Labellisation</strong> : <code>aria-labelledby</code> lie le dialogue au bouton déclencheur.</li>
|
|
28
|
+
<li><strong>Groupes de caractères</strong> : Utilisation de <code>role="group"</code> avec <code>aria-label</code> pour organiser les caractères minuscules et majuscules.</li>
|
|
29
|
+
</ul>
|
|
30
|
+
</CriteriaCard>
|
|
31
|
+
|
|
32
|
+
<CriteriaCard icon="⌨️" title="Navigation clavier et focus">
|
|
33
|
+
<ul>
|
|
34
|
+
<li><strong>Gestion du focus</strong> : Le focus retourne automatiquement au champ après insertion d'un caractère.</li>
|
|
35
|
+
<li><strong>Position du curseur</strong> : Maintien et restauration précise de la position du curseur après insertion.</li>
|
|
36
|
+
<li><strong>Focus trap</strong> : <code>retain-focus="false"</code> sur le VDialog.</li>
|
|
37
|
+
</ul>
|
|
38
|
+
</CriteriaCard>
|
|
39
|
+
|
|
40
|
+
<CriteriaCard icon="🎨" title="Styles et contrastes">
|
|
41
|
+
<ul>
|
|
42
|
+
<li><strong>Dialogue</strong> : Fond <code>grey-lighten-2</code> sur le VCard.</li>
|
|
43
|
+
<li><strong>Boutons du dialogue</strong> : Taille "small" avec classe <code>ma-1</code>.</li>
|
|
44
|
+
</ul>
|
|
45
|
+
</CriteriaCard>
|
|
46
|
+
|
|
47
|
+
<CriteriaCard icon="🔧" title="Accessibilité du champ associé">
|
|
48
|
+
<ul>
|
|
49
|
+
<li><strong>Labellisation automatique</strong> : Ajout de <code>aria-label</code> si le champ n'a ni <code>aria-label</code> ni <code>aria-labelledby</code>.</li>
|
|
50
|
+
<li><strong>Détection du champ</strong> : Recherche automatique des inputs/textarea dans le slot via <code>getNativeInput()</code>.</li>
|
|
51
|
+
<li><strong>Wrapper</strong> : Conteneur avec <code>role="textbox"</code> et <code>tabindex="0"</code>.</li>
|
|
52
|
+
</ul>
|
|
53
|
+
</CriteriaCard>
|
|
54
|
+
</CriteriaSection>
|
|
55
|
+
|
|
56
|
+
<DemoSection componentName="DiacriticPicker">
|
|
57
|
+
<Story of={DiacriticPickerStories.Default} />
|
|
58
|
+
</DemoSection>
|
|
59
|
+
|
|
60
|
+
<BestPracticesSection>
|
|
61
|
+
<ul>
|
|
62
|
+
<li>Fournissez un <code>inputAriaLabel</code> descriptif si le champ n'a pas de label visible.</li>
|
|
63
|
+
<li>Personnalisez <code>btnTitle</code> pour refléter les caractères utilisés.</li>
|
|
64
|
+
<li>Adaptez la liste des <code>diacritics</code> selon les besoins linguistiques.</li>
|
|
65
|
+
<li>Vérifiez que les caractères affichés dans <code>btnTitle</code> sont inclus dans la liste <code>diacritics</code>.</li>
|
|
66
|
+
</ul>
|
|
67
|
+
</BestPracticesSection>
|
|
68
|
+
|
|
69
|
+
<ResourcesSection>
|
|
70
|
+
<ul>
|
|
71
|
+
<li><a href="https://www.w3.org/WAI/ARIA/apg/patterns/dialogmodal/" target="_blank" rel="noopener noreferrer">Guide des pratiques WAI-ARIA : Dialogues modaux</a></li>
|
|
72
|
+
<li><a href="https://www.w3.org/WAI/WCAG21/Understanding/keyboard-operation.html" target="_blank" rel="noopener noreferrer">WCAG : Opération au clavier</a></li>
|
|
73
|
+
<li><a href="https://accessibilite.numerique.gouv.fr/methode/criteres-et-tests/#7.1" target="_blank" rel="noopener noreferrer">RGAA : Consultation par navigation clavier</a></li>
|
|
74
|
+
<li><a href="https://accessibilite.numerique.gouv.fr/methode/criteres-et-tests/#11.9" target="_blank" rel="noopener noreferrer">RGAA : Structuration de l'information</a></li>
|
|
75
|
+
<li><a href="https://www.w3.org/WAI/ARIA/apg/patterns/button/" target="_blank" rel="noopener noreferrer">Guide des pratiques WAI-ARIA : Boutons</a></li>
|
|
76
|
+
</ul>
|
|
77
|
+
</ResourcesSection>
|
|
78
|
+
</AccessibilityGuideLayout>
|
|
@@ -8,6 +8,8 @@ import SubHeader from '../SubHeader/SubHeader.vue'
|
|
|
8
8
|
import UserMenuBtn from '../UserMenuBtn/UserMenuBtn.vue'
|
|
9
9
|
import HeaderBar from './HeaderBar.vue'
|
|
10
10
|
import SyIcon from '../Customs/SyIcon/SyIcon.vue'
|
|
11
|
+
import { useTheme } from 'vuetify'
|
|
12
|
+
import { addons } from '@storybook/manager-api'
|
|
11
13
|
|
|
12
14
|
const meta = {
|
|
13
15
|
title: 'Composants/Structure/HeaderBar',
|
|
@@ -805,12 +807,22 @@ export const AppendSlot: Story = {
|
|
|
805
807
|
return {
|
|
806
808
|
components: { HeaderBar },
|
|
807
809
|
setup() {
|
|
808
|
-
|
|
810
|
+
const theme = useTheme()
|
|
811
|
+
const channel = addons.getChannel()
|
|
812
|
+
channel.on('storybook-theme-change', (theme) => {
|
|
813
|
+
theme.name.value = theme
|
|
814
|
+
})
|
|
815
|
+
return { args, HeaderBar, theme }
|
|
809
816
|
},
|
|
810
817
|
template: `
|
|
811
818
|
<HeaderBar v-bind="args">
|
|
812
819
|
<template #append>
|
|
813
|
-
<div style="max-width: 1712px; margin: 0 auto; height:
|
|
820
|
+
<div v-if="['ap', 'ap2026'].includes(theme.name.value)" style="max-width: 1712px; margin: 0 auto; min-height: 48px; background-color: #0084B2; display: flex; align-items: center; justify-content: center;" class="text-white">
|
|
821
|
+
<div>
|
|
822
|
+
TITRE DU SERVICE
|
|
823
|
+
</div>
|
|
824
|
+
</div>
|
|
825
|
+
<div v-else style="max-width: 1712px; margin: 0 auto; height: 26px; background-color: #0c419a;" class="pl-md-14 pl-4 text-white">
|
|
814
826
|
<div>
|
|
815
827
|
contenu
|
|
816
828
|
</div>
|
|
@@ -1,17 +1,79 @@
|
|
|
1
|
-
import { Meta, Story } from '@storybook/
|
|
2
|
-
import * as
|
|
3
|
-
import '@/
|
|
1
|
+
import { Meta, Story } from '@storybook/blocks';
|
|
2
|
+
import * as LogoStories from '../Logo.stories';
|
|
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
|
+
AuditSection,
|
|
12
|
+
} from '@/stories/accessibility/AccessibilityGuideLayout.mdx';
|
|
4
13
|
|
|
5
|
-
<Meta of={
|
|
14
|
+
<Meta of={LogoStories} />
|
|
6
15
|
|
|
7
|
-
<
|
|
8
|
-
|
|
9
|
-
|
|
16
|
+
<AccessibilityGuideLayout
|
|
17
|
+
componentName="Logo"
|
|
18
|
+
iconSrc={AccessibilityIcon}
|
|
19
|
+
>
|
|
20
|
+
<AuditSection>
|
|
21
|
+
<div>Rapport d'audit manuel : <a href="/audits/Logo.xlsx" style={{ color: '#0C41BD' }}>Voir le rapport</a></div>
|
|
22
|
+
<div style={{ color: 'grey', fontSize: '14px', marginTop: '0px' }}>
|
|
23
|
+
Aucune correction nécessaire.
|
|
24
|
+
</div>
|
|
25
|
+
</AuditSection>
|
|
26
|
+
|
|
27
|
+
<CriteriaSection>
|
|
28
|
+
<CriteriaCard icon="🏷️" title="Structure sémantique et rôles">
|
|
29
|
+
<ul>
|
|
30
|
+
<li><strong>Rôle image</strong> : Utilise <code>role="img"</code> sur l'élément SVG.</li>
|
|
31
|
+
<li><strong>Focus</strong> : <code>focusable="false"</code> pour éviter le focus sur le SVG.</li>
|
|
32
|
+
<li><strong>Labellisation</strong> : <code>aria-label</code> avec label calculé automatiquement ou personnalisé.</li>
|
|
33
|
+
<li><strong>Avatar</strong> : <code>aria-hidden="true"</code> quand <code>avatar=true</code>.</li>
|
|
34
|
+
<li><strong>Éléments décoratifs</strong> : <code>aria-hidden="true"</code> et <code>role="presentation"</code> sur les groupes de texte.</li>
|
|
35
|
+
</ul>
|
|
36
|
+
</CriteriaCard>
|
|
10
37
|
|
|
38
|
+
<CriteriaCard icon="📝" title="Gestion du label">
|
|
39
|
+
<ul>
|
|
40
|
+
<li><strong>Label personnalisé</strong> : Prop <code>ariaLabel</code> prioritaire sur le calcul automatique.</li>
|
|
41
|
+
<li><strong>Label avatar</strong> : Chaîne vide pour les avatars (illustration décorative).</li>
|
|
42
|
+
<li><strong>Label calculé</strong> : Construction dynamique avec organism, assurance maladie, signature selon les props.</li>
|
|
43
|
+
<li><strong>Risque pro</strong> : Label spécifique quand <code>risquePro=true</code>.</li>
|
|
44
|
+
</ul>
|
|
45
|
+
</CriteriaCard>
|
|
11
46
|
|
|
12
|
-
<
|
|
13
|
-
<
|
|
14
|
-
|
|
15
|
-
|
|
47
|
+
<CriteriaCard icon="🎨" title="Styles et adaptation">
|
|
48
|
+
<ul>
|
|
49
|
+
<li><strong>Couleur</strong> : Adaptation automatique avec <code>dark</code> (blanc/sombre).</li>
|
|
50
|
+
<li><strong>Dimensions</strong> : Mapping selon taille et mode avatar.</li>
|
|
51
|
+
<li><strong>ViewBox</strong> : Ajustement dynamique selon les éléments affichés.</li>
|
|
52
|
+
</ul>
|
|
53
|
+
</CriteriaCard>
|
|
54
|
+
</CriteriaSection>
|
|
16
55
|
|
|
56
|
+
<DemoSection componentName="Logo">
|
|
57
|
+
<Story of={LogoStories.Default} />
|
|
58
|
+
</DemoSection>
|
|
17
59
|
|
|
60
|
+
<BestPracticesSection>
|
|
61
|
+
<ul>
|
|
62
|
+
<li>Utilisez <code>avatar=true</code> pour les logos décoratifs sans signification sémantique.</li>
|
|
63
|
+
<li>Fournissez un <code>ariaLabel</code> personnalisé pour les contextes spécifiques.</li>
|
|
64
|
+
<li>Adaptez la taille avec <code>size</code> selon le contexte d'utilisation.</li>
|
|
65
|
+
<li>Utilisez <code>dark=true</code> sur les fonds sombres pour maintenir le contraste.</li>
|
|
66
|
+
<li>Cachez la signature (<code>hideSignature</code>) dans les espaces contraints.</li>
|
|
67
|
+
<li>Cachez l'organisme (<code>hideOrganism</code>) si le contexte est déjà clair.</li>
|
|
68
|
+
</ul>
|
|
69
|
+
</BestPracticesSection>
|
|
70
|
+
|
|
71
|
+
<ResourcesSection>
|
|
72
|
+
<ul>
|
|
73
|
+
<li><a href="https://www.w3.org/WAI/WCAG21/Understanding/non-text-content.html" target="_blank" rel="noopener noreferrer">WCAG : Contenu non textuel</a></li>
|
|
74
|
+
<li><a href="https://www.w3.org/WAI/ARIA/apg/patterns/img/" target="_blank" rel="noopener noreferrer">Guide des pratiques WAI-ARIA : Images</a></li>
|
|
75
|
+
<li><a href="https://accessibilite.numerique.gouv.fr/methode/criteres-et-tests/#1.2" target="_blank" rel="noopener noreferrer">RGAA : Images décoratives</a></li>
|
|
76
|
+
<li><a href="https://accessibilite.numerique.gouv.fr/methode/criteres-et-tests/#1.3" target="_blank" rel="noopener noreferrer">RGAA : Images porteuses d'informations</a></li>
|
|
77
|
+
</ul>
|
|
78
|
+
</ResourcesSection>
|
|
79
|
+
</AccessibilityGuideLayout>
|
|
@@ -1,12 +1,88 @@
|
|
|
1
|
-
import { Meta, Story } from '@storybook/
|
|
2
|
-
import * as
|
|
3
|
-
import '@/
|
|
1
|
+
import { Meta, Story } from '@storybook/blocks';
|
|
2
|
+
import * as LogoBrandSectionStories from '../LogoBrandSection.stories';
|
|
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
|
+
AuditSection,
|
|
12
|
+
} from '@/stories/accessibility/AccessibilityGuideLayout.mdx';
|
|
4
13
|
|
|
5
|
-
<Meta of={
|
|
14
|
+
<Meta of={LogoBrandSectionStories} />
|
|
6
15
|
|
|
7
|
-
<
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
16
|
+
<AccessibilityGuideLayout
|
|
17
|
+
componentName="LogoBrandSection"
|
|
18
|
+
iconSrc={AccessibilityIcon}
|
|
19
|
+
>
|
|
20
|
+
<AuditSection>
|
|
21
|
+
<div>Rapport d'audit manuel : <a href="/audits/LogoBrandSection.xlsx" style={{ color: '#0C41BD' }}>Voir le rapport</a></div>
|
|
22
|
+
<div style={{ color: 'grey', fontSize: '14px', marginTop: '0px' }}>
|
|
23
|
+
Aucune correction nécessaire.
|
|
24
|
+
</div>
|
|
25
|
+
</AuditSection>
|
|
26
|
+
|
|
27
|
+
<CriteriaSection>
|
|
28
|
+
<CriteriaCard icon="🔗" title="Liens et navigation">
|
|
29
|
+
<ul>
|
|
30
|
+
<li><strong>Composant dynamique</strong> : Détecte automatiquement <code>router-link</code>, <code><a></code> ou <code><div></code> selon <code>homeLink</code>.</li>
|
|
31
|
+
<li><strong>Label du lien principal</strong> : <code>ariaLabel</code> concaténé avec " Retour vers accueil du site".</li>
|
|
32
|
+
<li><strong>Label du logo secondaire</strong> : Calculé avec <code>homeLinkPrefix</code> et <code>alt</code> du logo.</li>
|
|
33
|
+
<li><strong>Lien secondaire</strong> : Uniquement pour les thèmes <code>ameli-pro</code> et <code>ameli</code>.</li>
|
|
34
|
+
</ul>
|
|
35
|
+
</CriteriaCard>
|
|
11
36
|
|
|
12
|
-
<
|
|
37
|
+
<CriteriaCard icon="📝" title="Structure sémantique et titres">
|
|
38
|
+
<ul>
|
|
39
|
+
<li><strong>Titre principal</strong> : Utilise <code>SyHeading</code> avec <code>headingLevelTitle</code> (1-6).</li>
|
|
40
|
+
<li><strong>Sous-titre</strong> : Utilise <code>SyHeading</code> avec <code>headingLevelSubtitle</code> (1-4).</li>
|
|
41
|
+
<li><strong>Contenu conditionnel</strong> : Affichage du sous-titre uniquement si titre présent et non-mobile.</li>
|
|
42
|
+
<li><strong>Texte structuré</strong> : Support des titres avec <code>text</code> et <code>highlight</code>.</li>
|
|
43
|
+
</ul>
|
|
44
|
+
</CriteriaCard>
|
|
45
|
+
|
|
46
|
+
<CriteriaCard icon="🎨" title="Éléments décoratifs et styles">
|
|
47
|
+
<ul>
|
|
48
|
+
<li><strong>Séparateur SVG</strong> : <code>focusable="false"</code> et <code>aria-hidden="true"</code>.</li>
|
|
49
|
+
<li><strong>Couleur du séparateur</strong> : Adaptée selon le thème (secondaire, primaire, #cd545b).</li>
|
|
50
|
+
<li><strong>Dimensions adaptatives</strong> : Responsive selon <code>mobileVersion</code> et présence logo secondaire.</li>
|
|
51
|
+
<li><strong>Logo principal</strong> : Props transmises au composant Logo (avatar, taille, signature).</li>
|
|
52
|
+
</ul>
|
|
53
|
+
</CriteriaCard>
|
|
54
|
+
|
|
55
|
+
<CriteriaCard icon="🖼️" title="Images et logos secondaires">
|
|
56
|
+
<ul>
|
|
57
|
+
<li><strong>Logo secondaire</strong> : Balise <code><img></code> avec attribut <code>alt</code> descriptif.</li>
|
|
58
|
+
<li><strong>Mapping des thèmes</strong> : Association automatique du logo selon <code>secondaryLogoMapping</code>.</li>
|
|
59
|
+
<li><strong>Avatar conditionnel</strong> : Mode avatar si <code>reduceLogo</code> et logo secondaire présent.</li>
|
|
60
|
+
</ul>
|
|
61
|
+
</CriteriaCard>
|
|
62
|
+
</CriteriaSection>
|
|
63
|
+
|
|
64
|
+
<DemoSection componentName="LogoBrandSection">
|
|
65
|
+
<Story of={LogoBrandSectionStories.Default} />
|
|
66
|
+
</DemoSection>
|
|
67
|
+
|
|
68
|
+
<BestPracticesSection>
|
|
69
|
+
<ul>
|
|
70
|
+
<li>Fournissez toujours un <code>homeLink.ariaLabel</code> descriptif pour le lien vers l'accueil.</li>
|
|
71
|
+
<li>Choisissez des niveaux de titres cohérents avec la hiérarchie de votre page.</li>
|
|
72
|
+
<li>Utilisez <code>mobileVersion</code> pour adapter l'affichage sur petits écrans.</li>
|
|
73
|
+
<li>Activez <code>reduceLogo</code> dans les espaces contraints ou avec logo secondaire.</li>
|
|
74
|
+
<li>Vérifiez que les <code>serviceTitle</code> et <code>serviceSubTitle</code> sont pertinents pour le contexte.</li>
|
|
75
|
+
<li>Testez les différents thèmes pour vous assurer que les contrastes sont maintenus.</li>
|
|
76
|
+
</ul>
|
|
77
|
+
</BestPracticesSection>
|
|
78
|
+
|
|
79
|
+
<ResourcesSection>
|
|
80
|
+
<ul>
|
|
81
|
+
<li><a href="https://www.w3.org/WAI/WCAG21/Understanding/non-text-content.html" target="_blank" rel="noopener noreferrer">WCAG : Contenu non textuel</a></li>
|
|
82
|
+
<li><a href="https://www.w3.org/WAI/WCAG21/Understanding/headings-and-labels.html" target="_blank" rel="noopener noreferrer">WCAG : Titres et étiquettes</a></li>
|
|
83
|
+
<li><a href="https://www.w3.org/WAI/ARIA/apg/patterns/link/" target="_blank" rel="noopener noreferrer">Guide des pratiques WAI-ARIA : Liens</a></li>
|
|
84
|
+
<li><a href="https://accessibilite.numerique.gouv.fr/methode/criteres-et-tests/#9.1" target="_blank" rel="noopener noreferrer">RGAA : Structuration de l'information</a></li>
|
|
85
|
+
<li><a href="https://accessibilite.numerique.gouv.fr/methode/criteres-et-tests/#12.6" target="_blank" rel="noopener noreferrer">RGAA : Liens</a></li>
|
|
86
|
+
</ul>
|
|
87
|
+
</ResourcesSection>
|
|
88
|
+
</AccessibilityGuideLayout>
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { describe, expect, it } from 'vitest'
|
|
2
2
|
import LunarCalendar from '../LunarCalendar.vue'
|
|
3
|
-
import { mount } from '@vue/test-utils'
|
|
3
|
+
import { flushPromises, mount } from '@vue/test-utils'
|
|
4
4
|
|
|
5
5
|
describe('LunarCalendar', () => {
|
|
6
6
|
it('renders correctly', () => {
|
|
@@ -56,6 +56,7 @@ describe('LunarCalendar', () => {
|
|
|
56
56
|
const input = wrapper.find('input')
|
|
57
57
|
await input.setValue('10/19/1995')
|
|
58
58
|
await input.trigger('blur')
|
|
59
|
+
await flushPromises()
|
|
59
60
|
|
|
60
61
|
expect(wrapper.html()).toContain('L\'année doit être supérieure ou égale à 1996.')
|
|
61
62
|
})
|
|
@@ -72,6 +73,7 @@ describe('LunarCalendar', () => {
|
|
|
72
73
|
const input = wrapper.find('input')
|
|
73
74
|
await input.setValue('10/19/1995')
|
|
74
75
|
await input.trigger('blur')
|
|
76
|
+
await flushPromises()
|
|
75
77
|
|
|
76
78
|
expect(wrapper.html()).toContain('L\'année doit être inférieure ou égale à 1994.')
|
|
77
79
|
})
|
|
@@ -20,13 +20,12 @@ export function useLunarCalendarValidation(
|
|
|
20
20
|
)
|
|
21
21
|
|
|
22
22
|
const validation = useValidation({
|
|
23
|
-
customRules: rules.value,
|
|
24
23
|
showSuccessMessages: successMessage !== undefined,
|
|
25
24
|
fieldIdentifier: toValue(label),
|
|
26
25
|
})
|
|
27
26
|
|
|
28
|
-
function validateOnSubmit() {
|
|
29
|
-
const result = validation.validateField(
|
|
27
|
+
async function validateOnSubmit() {
|
|
28
|
+
const result = await validation.validateField(
|
|
30
29
|
modelValue.value,
|
|
31
30
|
rules.value,
|
|
32
31
|
)
|
|
@@ -36,8 +35,8 @@ export function useLunarCalendarValidation(
|
|
|
36
35
|
|
|
37
36
|
useValidatable(validateOnSubmit, validation.clearValidation)
|
|
38
37
|
|
|
39
|
-
function validate() {
|
|
40
|
-
return validation.validateField(
|
|
38
|
+
async function validate() {
|
|
39
|
+
return await validation.validateField(
|
|
41
40
|
modelValue.value,
|
|
42
41
|
rules.value,
|
|
43
42
|
)
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { mount } from '@vue/test-utils'
|
|
1
|
+
import { flushPromises, mount } from '@vue/test-utils'
|
|
2
2
|
import { describe, afterEach, expect, it, vi } from 'vitest'
|
|
3
3
|
import MonthPicker from '../MonthPicker.vue'
|
|
4
4
|
import { nextTick } from 'vue'
|
|
@@ -1238,6 +1238,7 @@ describe('mounthpicker', () => {
|
|
|
1238
1238
|
|
|
1239
1239
|
const yearButton = wrapper.findComponent({ name: 'YearSelector' }).find('.year-2025')
|
|
1240
1240
|
await yearButton.trigger('click')
|
|
1241
|
+
await flushPromises()
|
|
1241
1242
|
|
|
1242
1243
|
expect(wrapper.find('.v-field--error').exists()).toBe(true)
|
|
1243
1244
|
expect(wrapper.find('.v-input__details').text()).toBe('The year must be 2026 or later.')
|
|
@@ -2169,7 +2169,7 @@ exports[`mounthpicker > should open the menu when clicking on the input 1`] = `
|
|
|
2169
2169
|
<div class="visual-picker-header">
|
|
2170
2170
|
<div
|
|
2171
2171
|
class="visual-picker-header__title"
|
|
2172
|
-
id="v-
|
|
2172
|
+
id="v-4-title"
|
|
2173
2173
|
>
|
|
2174
2174
|
Sélectionner un mois
|
|
2175
2175
|
</div>
|
|
@@ -2439,20 +2439,20 @@ exports[`mounthpicker > should render mounthpicker 1`] = `
|
|
|
2439
2439
|
v-field-label
|
|
2440
2440
|
v-label
|
|
2441
2441
|
"
|
|
2442
|
-
id="input-v-
|
|
2442
|
+
id="input-v-2-label"
|
|
2443
2443
|
>
|
|
2444
2444
|
<!---->
|
|
2445
2445
|
Début du projet
|
|
2446
2446
|
</label>
|
|
2447
2447
|
<!---->
|
|
2448
2448
|
<input
|
|
2449
|
-
aria-describedby="input-v-
|
|
2449
|
+
aria-describedby="input-v-2-messages"
|
|
2450
2450
|
aria-label="Début du projet"
|
|
2451
|
-
aria-labelledby="input-v-
|
|
2451
|
+
aria-labelledby="input-v-2-label"
|
|
2452
2452
|
autocomplete="off"
|
|
2453
2453
|
class="v-field__input"
|
|
2454
2454
|
direction="horizontal"
|
|
2455
|
-
id="input-v-
|
|
2455
|
+
id="input-v-2"
|
|
2456
2456
|
size="1"
|
|
2457
2457
|
title="Début du projet"
|
|
2458
2458
|
type="text"
|
|
@@ -2477,7 +2477,7 @@ exports[`mounthpicker > should render mounthpicker 1`] = `
|
|
|
2477
2477
|
v-field-label--floating
|
|
2478
2478
|
v-label
|
|
2479
2479
|
"
|
|
2480
|
-
for="input-v-
|
|
2480
|
+
for="input-v-2"
|
|
2481
2481
|
>
|
|
2482
2482
|
<!---->
|
|
2483
2483
|
Début du projet
|
|
@@ -2521,7 +2521,7 @@ exports[`mounthpicker > should render mounthpicker 1`] = `
|
|
|
2521
2521
|
<div
|
|
2522
2522
|
aria-live="polite"
|
|
2523
2523
|
class="v-input__details"
|
|
2524
|
-
id="input-v-
|
|
2524
|
+
id="input-v-2-messages"
|
|
2525
2525
|
role="alert"
|
|
2526
2526
|
>
|
|
2527
2527
|
<transition-group-stub
|
|
@@ -1332,6 +1332,10 @@ export const WithCustomLocale: Story = {
|
|
|
1332
1332
|
required: true,
|
|
1333
1333
|
showSuccessMessages: true,
|
|
1334
1334
|
customLocale: {
|
|
1335
|
+
numberLabel: 'Numéro de sécurité sociale',
|
|
1336
|
+
keyLabel: 'Clé',
|
|
1337
|
+
numberHint: '',
|
|
1338
|
+
keyHint: '',
|
|
1335
1339
|
errorRequiredNumber: 'Veuillez renseigner votre numéro de sécurité sociale (13 caractères).',
|
|
1336
1340
|
errorInvalidNumber: 'Format NIR non reconnu, merci de vérifier.',
|
|
1337
1341
|
errorRequiredKey: 'La clé (2 chiffres) est requise.',
|