@cnamts/synapse 1.0.22 → 1.0.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{DateFilter-B5n-ZkLi.js → DateFilter-Dc-gSGwk.js} +1 -1
- package/dist/{NumberFilter-CtiZ9uj8.js → NumberFilter-vP38Wp6j.js} +1 -1
- package/dist/{PeriodFilter-DzqiMb-b.js → PeriodFilter-Ba1uYUnT.js} +1 -1
- package/dist/{SelectFilter-BOYlF7rX.js → SelectFilter-BioGT6Nn.js} +1 -1
- package/dist/{TextFilter-BOFRNfcX.js → TextFilter-B84dpnoq.js} +1 -1
- package/dist/components/Accordion/Accordion.d.ts +13 -2
- package/dist/components/Accordion/composables/useAccordionState.d.ts +2 -1
- package/dist/components/Amelipro/AmeliproAutoCompleteField/AmeliproAutoCompleteField.d.ts +7 -7
- package/dist/components/Amelipro/AmeliproCheckbox/AmeliproCheckbox.d.ts +1 -1
- package/dist/components/Amelipro/AmeliproCustomSelector/AmeliproCustomSelector.d.ts +1 -1
- package/dist/components/Amelipro/AmeliproPostalAddressField/AmeliproPostalAddressField.d.ts +1 -1
- package/dist/components/Amelipro/AmeliproSelect/AmeliproSelect.d.ts +7 -7
- package/dist/components/Amelipro/AmeliproTabs/AmeliproTabs.d.ts +16 -16
- package/dist/components/Amelipro/AmeliproTextArea/AmeliproTextArea.d.ts +1 -1
- package/dist/components/Amelipro/AmeliproTextField/AmeliproTextField.d.ts +1 -1
- package/dist/components/Customs/Selects/SyAutocomplete/SyAutocomplete.d.ts +22 -1
- package/dist/components/Customs/Selects/SyAutocomplete/locales.d.ts +5 -0
- package/dist/components/Customs/Selects/SyInputSelect/SyInputSelect.d.ts +1 -1
- package/dist/components/Customs/Selects/SySelect/SySelect.d.ts +1 -1
- package/dist/components/Customs/Selects/SySelect/locales.d.ts +1 -0
- package/dist/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.d.ts +1 -1
- package/dist/components/Customs/SyCheckbox/SyCheckbox.d.ts +1 -1
- package/dist/components/Customs/SyRadioGroup/SyRadioGroup.d.ts +1 -1
- package/dist/components/Customs/SyTextField/SyTextField.d.ts +5 -2
- package/dist/components/DatePicker/CalendarMode/DatePicker.d.ts +13 -9
- package/dist/components/DatePicker/ComplexDatePicker/ComplexDatePicker.d.ts +7 -5
- package/dist/components/DatePicker/DateTextInput/DateTextInput.d.ts +2 -1
- package/dist/components/ErrorPage/ErrorPage.d.ts +3 -1
- package/dist/components/FileList/UploadItem/UploadItem.d.ts +6 -0
- package/dist/components/FileList/UploadItem/locales.d.ts +1 -4
- package/dist/components/FileUpload/FileUploadContent.d.ts +2 -0
- package/dist/components/FileUpload/validateFiles.d.ts +2 -1
- package/dist/components/HeaderBar/HeaderBar.d.ts +2 -1
- package/dist/components/HeaderBar/HeaderLogo/HeaderLogo.d.ts +2 -1
- package/dist/components/HeaderNavigationBar/HeaderNavigationBar.d.ts +2 -1
- package/dist/components/MonthPicker/MonthPicker.d.ts +1939 -0
- package/dist/components/MonthPicker/MonthPickerText/MonthPickerInput.d.ts +1899 -0
- package/dist/components/MonthPicker/MonthPickerText/useTextField.d.ts +21 -0
- package/dist/components/MonthPicker/MonthPickerVisual/MonthPickerVisual.d.ts +21 -0
- package/dist/components/MonthPicker/MonthPickerVisual/MonthPickerVisualProps.d.ts +12 -0
- package/dist/components/MonthPicker/MonthPickerVisual/MonthSelector.d.ts +11 -0
- package/dist/components/MonthPicker/MonthPickerVisual/VisualPickerFooter.d.ts +6 -0
- package/dist/components/MonthPicker/MonthPickerVisual/VisualPickerHeader.d.ts +14 -0
- package/dist/components/MonthPicker/MonthPickerVisual/YearSelector.d.ts +14 -0
- package/dist/components/MonthPicker/MonthPickerVisual/useMonthGrid.d.ts +9 -0
- package/dist/components/MonthPicker/MonthPickerVisual/useYearGrid.d.ts +8 -0
- package/dist/components/MonthPicker/MonthPickerVisual/utils.d.ts +8 -0
- package/dist/components/MonthPicker/locales.d.ts +12 -0
- package/dist/components/MonthPicker/useMonthPickerValidation.d.ts +25 -0
- package/dist/components/NirField/NirField.d.ts +3 -1
- package/dist/components/NotificationBar/Notification/Notification.d.ts +3 -0
- package/dist/components/PasswordField/PasswordField.d.ts +1 -1
- package/dist/components/PeriodField/PeriodField.d.ts +29 -21
- package/dist/components/PhoneField/PhoneField.d.ts +2 -1
- package/dist/components/SyBtnMenu/SyBtnMenu.d.ts +1 -1
- package/dist/components/SyHeading/SyHeading.a11y.test.d.ts +1 -0
- package/dist/components/SyHeading/SyHeading.d.ts +4 -2
- package/dist/components/SyHeading/SyHeading.test.d.ts +1 -0
- package/dist/components/SyTextArea/SyTextArea.d.ts +1 -1
- package/dist/components/Tables/SyServerTable/SyServerTable.d.ts +4 -4
- package/dist/components/Tables/SyTable/SyTable.d.ts +4 -4
- package/dist/components/Tables/common/SyTablePagination.d.ts +6 -6
- package/dist/components/index.d.ts +1 -0
- package/dist/design-system-v3.js +102 -99
- package/dist/design-system-v3.umd.cjs +126 -126
- package/dist/designTokens/tokens/cnam/cnamContextual.d.ts +5 -0
- package/dist/{main-CEl4J8_T.js → main-aLKwdMi1.js} +11167 -10522
- package/dist/main.d.ts +1 -0
- package/dist/style.css +1 -1
- package/package.json +10 -4
- package/src/assets/apTokens.scss +2 -2
- package/src/assets/overrides/_btns.scss +8 -0
- package/src/assets/overrides/_forms.scss +9 -0
- package/src/assets/overrides/_icons.scss +38 -9
- package/src/assets/overrides/_tables.scss +19 -0
- package/src/components/Accordion/Accordion.mdx +23 -9
- package/src/components/Accordion/Accordion.stories.ts +153 -3
- package/src/components/Accordion/Accordion.vue +7 -6
- package/src/components/Accordion/composables/__tests__/useAccordionState.spec.ts +40 -12
- package/src/components/Accordion/composables/useAccordionState.ts +3 -4
- package/src/components/Accordion/tests/accordion.spec.ts +131 -19
- package/src/components/Amelipro/AmeliproPagination/AmeliproPagination.mdx +3 -1
- package/src/components/Amelipro/AmeliproPagination/AmeliproPagination.stories.ts +8 -0
- package/src/components/BackBtn/accessibilite/Accessibility.mdx +62 -10
- package/src/components/BackToTopBtn/BackToTopBtn.stories.ts +9 -3
- package/src/components/BackToTopBtn/accessibilite/Accessibility.mdx +86 -6
- package/src/components/Captcha/tests/Captcha.spec.ts +0 -29
- package/src/components/Captcha/tests/__snapshots__/Captcha.spec.ts.snap +2 -110
- package/src/components/Customs/Selects/SelectBtnField/accessibilite/Accessibility.mdx +133 -10
- package/src/components/Customs/Selects/SyAutocomplete/SyAutocomplete.stories.ts +379 -93
- package/src/components/Customs/Selects/SyAutocomplete/SyAutocomplete.vue +144 -83
- package/src/components/Customs/Selects/SyAutocomplete/accessibilite/Accessibilite.stories.ts +40 -1
- package/src/components/Customs/Selects/SyAutocomplete/accessibilite/Accessibility.mdx +7 -1
- package/src/components/Customs/Selects/SyAutocomplete/locales.ts +5 -0
- package/src/components/Customs/Selects/SyAutocomplete/tests/SyAutocomplete.a11y.spec.ts +96 -0
- package/src/components/Customs/Selects/SyAutocomplete/tests/SyAutocomplete.spec.ts +234 -9
- package/src/components/Customs/Selects/SyAutocomplete/utils/ariaManager.ts +13 -3
- package/src/components/Customs/Selects/SyAutocomplete/utils/useSelectionLogic.ts +9 -10
- package/src/components/Customs/Selects/SySelect/SySelect.vue +46 -3
- package/src/components/Customs/Selects/SySelect/locales.ts +1 -0
- package/src/components/Customs/SyIcon/SyIcon.vue +1 -1
- package/src/components/Customs/SyIcon/tests/SyIcon.a11y.spec.ts +20 -0
- package/src/components/Customs/SyIconButton/SyIconButton.mdx +46 -0
- package/src/components/Customs/SyIconButton/SyIconButton.stories.ts +184 -0
- package/src/components/Customs/SyIconButton/SyIconButton.vue +38 -0
- package/src/components/Customs/SyIconButton/accessibilite/Accessibility.mdx +64 -0
- package/src/components/Customs/SyIconButton/tests/SyIconButton.a11y.spec.ts +87 -0
- package/src/components/Customs/SyIconButton/tests/SyIconButton.spec.ts +152 -0
- package/src/components/Customs/SyIconButton/tests/__snapshots__/SyIconButton.spec.ts.snap +61 -0
- package/src/components/Customs/SyPagination/SyPagination.vue +5 -5
- package/src/components/Customs/SyTextField/SyTextField.vue +20 -2
- package/src/components/Customs/SyTextField/accessibilite/Accessibility.mdx +67 -9
- package/src/components/Customs/SyTextField/tests/SyTextField.a11y.spec.ts +15 -0
- package/src/components/Customs/SyTextField/tests/SyTextField.spec.ts +36 -0
- package/src/components/DataList/accessibilite/Accessibility.mdx +79 -11
- package/src/components/DataListGroup/accessibilite/Accessibility.mdx +80 -11
- package/src/components/DownloadBtn/tests/DownloadBtn.a11y.spec.ts +25 -0
- package/src/components/ErrorPage/ErrorPage.stories.ts +113 -19
- package/src/components/ErrorPage/ErrorPage.vue +17 -2
- package/src/components/ErrorPage/tests/ErrorPage.a11y.spec.ts +17 -0
- package/src/components/ErrorPage/tests/ErrorPage.spec.ts +21 -1
- package/src/components/ErrorPage/tests/__snapshots__/ErrorPage.spec.ts.snap +0 -1
- package/src/components/ExternalLinks/tests/ExternalLinks.a11y.spec.ts +23 -0
- package/src/components/FileList/FileList.stories.ts +51 -1
- package/src/components/FileList/UploadItem/UploadItem.vue +13 -6
- package/src/components/FileList/UploadItem/locales.ts +3 -12
- package/src/components/FileList/accessibilite/Accessibility.mdx +3 -0
- package/src/components/FileUpload/FileUpload.vue +2 -1
- package/src/components/FileUpload/FileUploadContent.vue +2 -1
- package/src/components/FileUpload/tests/FileUpload.spec.ts +47 -0
- package/src/components/FileUpload/validateFiles.ts +5 -2
- package/src/components/FranceConnectBtn/accessibilite/Accessibility.mdx +62 -9
- package/src/components/HeaderBar/HeaderBar.vue +2 -1
- package/src/components/HeaderBar/HeaderLogo/HeaderLogo.vue +2 -1
- package/src/components/HeaderNavigationBar/HeaderNavigationBar.vue +2 -1
- package/src/components/LunarCalendar/accessibilite/Accessibility.mdx +74 -8
- package/src/components/LunarCalendar/tests/LunarCalendar.a11y.spec.ts +163 -0
- package/src/components/MaintenancePage/MaintenancePage.vue +1 -1
- package/src/components/MaintenancePage/tests/MaintenancePage.spec.ts +4 -5
- package/src/components/MaintenancePage/tests/__snapshots__/MaintenancePage.spec.ts.snap +0 -1
- package/src/components/MonthPicker/MonthPicker.mdx +35 -0
- package/src/components/MonthPicker/MonthPicker.stories.ts +527 -0
- package/src/components/MonthPicker/MonthPicker.vue +79 -0
- package/src/components/MonthPicker/MonthPickerText/MonthPickerInput.vue +89 -0
- package/src/components/MonthPicker/MonthPickerText/useTextField.ts +27 -0
- package/src/components/MonthPicker/MonthPickerVisual/MonthPickerVisual.vue +154 -0
- package/src/components/MonthPicker/MonthPickerVisual/MonthPickerVisualProps.ts +13 -0
- package/src/components/MonthPicker/MonthPickerVisual/MonthSelector.vue +137 -0
- package/src/components/MonthPicker/MonthPickerVisual/VisualPickerFooter.vue +60 -0
- package/src/components/MonthPicker/MonthPickerVisual/VisualPickerHeader.vue +149 -0
- package/src/components/MonthPicker/MonthPickerVisual/YearSelector.vue +143 -0
- package/src/components/MonthPicker/MonthPickerVisual/useMonthGrid.ts +45 -0
- package/src/components/MonthPicker/MonthPickerVisual/useYearGrid.ts +45 -0
- package/src/components/MonthPicker/MonthPickerVisual/utils.ts +17 -0
- package/src/components/MonthPicker/accessibilite/Accessibility.mdx +59 -0
- package/src/components/MonthPicker/locales.ts +12 -0
- package/src/components/MonthPicker/tests/MonthPicker.a11y.spec.ts +71 -0
- package/src/components/MonthPicker/tests/MonthPicker.spec.ts +1248 -0
- package/src/components/MonthPicker/tests/__snapshots__/MonthPicker.spec.ts.snap +2545 -0
- package/src/components/MonthPicker/useMonthPickerValidation.ts +30 -0
- package/src/components/NirField/NirField.mdx +1 -2
- package/src/components/NirField/NirField.stories.ts +66 -6
- package/src/components/NotFoundPage/tests/NotFoundPage.spec.ts +2 -3
- package/src/components/NotFoundPage/tests/__snapshots__/NotFoundPage.spec.ts.snap +22 -14
- package/src/components/NotificationBar/Notification/Notification.vue +3 -1
- package/src/components/NotificationBar/NotificationBar.stories.ts +154 -0
- package/src/components/NotificationBar/tests/NotificationBar.a11y.spec.ts +26 -0
- package/src/components/NotificationBar/tests/NotificationBar.spec.ts +60 -0
- package/src/components/RangeField/accessibilite/Accessibility.mdx +79 -11
- package/src/components/SkipLink/tests/SkipLink.a11y.spec.ts +23 -0
- package/src/components/StatusPage/StatusPage.stories.ts +118 -0
- package/src/components/StatusPage/StatusPage.vue +5 -3
- package/src/components/StatusPage/tests/StatusPage.a11y.spec.ts +22 -0
- package/src/components/StatusPage/tests/StatusPage.spec.ts +22 -0
- package/src/components/StatusPage/tests/__snapshots__/StatusPage.spec.ts.snap +22 -14
- package/src/components/SubHeader/tests/SubHeader.a11y.spec.ts +20 -0
- package/src/components/SyAlert/SyAlert.vue +1 -0
- package/src/components/SyAlert/accessibilite/Accessibility.mdx +79 -9
- package/src/components/SyAlert/tests/SyAlert.a11y.spec.ts +23 -0
- package/src/components/SyHeading/SyHeading.a11y.test.ts +149 -0
- package/src/components/SyHeading/SyHeading.test.ts +115 -0
- package/src/components/SyHeading/SyHeading.vue +5 -3
- package/src/components/SyTextArea/accessibilite/Accessibility.mdx +80 -8
- package/src/components/SyTextArea/tests/SyTextArea.a11y.spec.ts +151 -0
- package/src/components/ToolbarContainer/tests/ToolbarContainer.a11y.spec.ts +126 -0
- package/src/components/UploadWorkflow/tests/__snapshots__/UploadWorkflow.spec.ts.snap +2 -2
- package/src/components/index.ts +1 -0
- package/src/composables/useFormFieldErrorHandling.ts +11 -2
- package/src/designTokens/tokens/cnam/cnamContextual.ts +6 -1
- package/src/main.ts +2 -0
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { ref, type Ref } from 'vue'
|
|
2
|
+
|
|
3
|
+
export function useMonthGrid(
|
|
4
|
+
monthSelector: Ref<HTMLElement | null>,
|
|
5
|
+
initialMonth: number = 0,
|
|
6
|
+
) {
|
|
7
|
+
const monthsPerRow = 2
|
|
8
|
+
/**
|
|
9
|
+
* Actual focused month, used for keyboard navigation. 1-based index (1 = January, 12 = December)
|
|
10
|
+
*/
|
|
11
|
+
const activeMonth = ref(initialMonth)
|
|
12
|
+
|
|
13
|
+
function selectNextMonth() {
|
|
14
|
+
selectMonth((activeMonth.value % 12) + 1)
|
|
15
|
+
}
|
|
16
|
+
function selectPreviousMonth() {
|
|
17
|
+
selectMonth((activeMonth.value - 2 + 12) % 12 + 1)
|
|
18
|
+
}
|
|
19
|
+
function selectNextRow() {
|
|
20
|
+
selectMonth(((activeMonth.value - 1 + monthsPerRow) % 12) + 1)
|
|
21
|
+
}
|
|
22
|
+
function selectPreviousRow() {
|
|
23
|
+
selectMonth(((activeMonth.value - 1 - monthsPerRow + 12) % 12) + 1)
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function selectMonth(month: number) {
|
|
27
|
+
activeMonth.value = month
|
|
28
|
+
focusActiveMonth()
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function focusActiveMonth() {
|
|
32
|
+
monthSelector.value!
|
|
33
|
+
.querySelector<HTMLElement>(`.month-${activeMonth.value}`)!
|
|
34
|
+
.focus()
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
return {
|
|
38
|
+
activeMonth,
|
|
39
|
+
selectMonth,
|
|
40
|
+
selectNextMonth,
|
|
41
|
+
selectPreviousMonth,
|
|
42
|
+
selectNextRow,
|
|
43
|
+
selectPreviousRow,
|
|
44
|
+
}
|
|
45
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { ref, type Ref } from 'vue'
|
|
2
|
+
|
|
3
|
+
export function useYearGrid(
|
|
4
|
+
yearSelector: Ref<HTMLElement | null>,
|
|
5
|
+
minYear: Ref<number>,
|
|
6
|
+
maxYear: Ref<number>,
|
|
7
|
+
initialYear?: number,
|
|
8
|
+
) {
|
|
9
|
+
const yearsPerRow = 3
|
|
10
|
+
/**
|
|
11
|
+
* Actual focused year, used for keyboard navigation. It can be outside of the min-max range to allow navigating to the first/last year by pressing up/down when the first/last year is focused.
|
|
12
|
+
*/
|
|
13
|
+
const activeYear = ref(initialYear || (new Date()).getFullYear())
|
|
14
|
+
function selectNextYear() {
|
|
15
|
+
selectYear(activeYear.value! + 1)
|
|
16
|
+
}
|
|
17
|
+
function selectPreviousYear() {
|
|
18
|
+
selectYear(activeYear.value! - 1)
|
|
19
|
+
}
|
|
20
|
+
function selectNextRow() {
|
|
21
|
+
selectYear(activeYear.value! + yearsPerRow)
|
|
22
|
+
}
|
|
23
|
+
function selectPreviousRow() {
|
|
24
|
+
selectYear(activeYear.value! - yearsPerRow)
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function selectYear(year: number) {
|
|
28
|
+
activeYear.value = Math.min(Math.max(year, minYear.value), maxYear.value)
|
|
29
|
+
focusActiveYear()
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function focusActiveYear() {
|
|
33
|
+
yearSelector.value!
|
|
34
|
+
.querySelector<HTMLElement>(`.year-${activeYear.value}`)!
|
|
35
|
+
.focus()
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
return {
|
|
39
|
+
activeYear,
|
|
40
|
+
selectNextYear,
|
|
41
|
+
selectPreviousYear,
|
|
42
|
+
selectNextRow,
|
|
43
|
+
selectPreviousRow,
|
|
44
|
+
}
|
|
45
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Formats a Date object into a string in the format "Month Year" (e.g., "January 2024") using the user's locale.
|
|
3
|
+
*/
|
|
4
|
+
export function dateToString(date: Date): string {
|
|
5
|
+
return new Intl.DateTimeFormat(navigator.language, { month: 'long', year: 'numeric' }).format(date)
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Parses a string in the format "month/year" and returns a tuple of [month, year].
|
|
10
|
+
*/
|
|
11
|
+
export function parseMonthYearString(value: string | undefined): [number | undefined, number | undefined] {
|
|
12
|
+
if (!value) return [undefined, undefined]
|
|
13
|
+
const [monthStr, yearStr] = value.split('/')
|
|
14
|
+
const month = monthStr ? parseInt(monthStr, 10) : undefined
|
|
15
|
+
const year = yearStr ? parseInt(yearStr, 10) : undefined
|
|
16
|
+
return [month, year]
|
|
17
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { Meta, Story, Primary } from '@storybook/addon-docs';
|
|
2
|
+
import * as Stories from '../MonthPicker.stories.ts';
|
|
3
|
+
import AccessibilityIcon from '@/common/imgs/accessibility-svgrepo-com.svg';
|
|
4
|
+
import {
|
|
5
|
+
AccessibilityGuideLayout,
|
|
6
|
+
CriteriaSection,
|
|
7
|
+
CriteriaCard,
|
|
8
|
+
DemoSection,
|
|
9
|
+
BestPracticesSection,
|
|
10
|
+
ResourcesSection,
|
|
11
|
+
} from '@/stories/accessibility/AccessibilityGuideLayout.mdx';
|
|
12
|
+
|
|
13
|
+
<Meta of={Stories} />
|
|
14
|
+
|
|
15
|
+
<AccessibilityGuideLayout
|
|
16
|
+
componentName="MonthPicker"
|
|
17
|
+
iconSrc={AccessibilityIcon}
|
|
18
|
+
apgHref="https://www.w3.org/WAI/ARIA/apg/patterns/datepicker/examples/datepicker-month/"
|
|
19
|
+
>
|
|
20
|
+
<CriteriaSection>
|
|
21
|
+
<CriteriaCard icon="🔤" title="Labels accessibles">
|
|
22
|
+
<ul>
|
|
23
|
+
<li><strong>Selection du mois</strong> : les boutons de selection de mois sont affichés sous forme de abrégé, une alternative complète est fournie pour les lecteurs d'écran.</li>
|
|
24
|
+
<li><strong>Bouton d'ouverture du picker</strong> : Le bouton toggle d'ouverture du picker affiché sous forme d'icône possède un label accessible décrivant son action.</li>
|
|
25
|
+
</ul>
|
|
26
|
+
</CriteriaCard>
|
|
27
|
+
<CriteriaCard icon="🔍" title="Structure sémantique">
|
|
28
|
+
<ul>
|
|
29
|
+
<li><strong>Rôles ARIA appropriés</strong> : Utilisation de rôles <code>role="grid"</code> pour les grilles de sélection des mois et années.</li>
|
|
30
|
+
<li><strong>Relations entre éléments</strong> : Connexion entre le bouton d'ouverture et la grille de mois via <code>aria-expanded</code>, <code>aria-controls</code> et <code>aria-haspopup</code>.</li>
|
|
31
|
+
|
|
32
|
+
</ul>
|
|
33
|
+
</CriteriaCard>
|
|
34
|
+
<CriteriaCard icon="⌨️" title="Navigation clavier complète">
|
|
35
|
+
<ul>
|
|
36
|
+
<li><strong>Touches Espace et Entrée</strong> : Pour ouvrir/fermer le picker et sélectionner un mois, une année.</li>
|
|
37
|
+
<li><strong>Touches fléchées</strong> : Navigation entre les mois (↑, ↓, ←, →)</li>
|
|
38
|
+
</ul>
|
|
39
|
+
</CriteriaCard>
|
|
40
|
+
|
|
41
|
+
<DemoSection componentName="MonthPicker">
|
|
42
|
+
<Primary />
|
|
43
|
+
</DemoSection>
|
|
44
|
+
|
|
45
|
+
<BestPracticesSection>
|
|
46
|
+
<ul>
|
|
47
|
+
<li><strong>Labels clairs</strong> : Utiliser des labels explicites pour le champ afin de faciliter la compréhension de sa fonction.</li>
|
|
48
|
+
<li><strong>Gestion des erreurs</strong> : Fournir des messages d'erreur explicites en cas de sélection invalide.</li>
|
|
49
|
+
</ul>
|
|
50
|
+
</BestPracticesSection>
|
|
51
|
+
|
|
52
|
+
<ResourcesSection>
|
|
53
|
+
<ul>
|
|
54
|
+
<li><a href="https://www.w3.org/WAI/ARIA/apg/patterns/dialog-modal/examples/datepicker-dialog/" target="_blank" rel="noopener noreferrer">Guide de conception de datepicker</a></li>
|
|
55
|
+
<li><a href="https://material.angular.dev/components/datepicker/overview" target="_blank" rel="noopener noreferrer">Exemple de datepicker</a></li>
|
|
56
|
+
</ul>
|
|
57
|
+
</ResourcesSection>
|
|
58
|
+
</CriteriaSection>
|
|
59
|
+
</AccessibilityGuideLayout>
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export const localesKey = Symbol('month-picker-locales')
|
|
2
|
+
export const locales = {
|
|
3
|
+
btnLabel: 'Ouvrir le sélecteur de mois',
|
|
4
|
+
headerSelectYear: 'Sélectionner une année',
|
|
5
|
+
headerSelectMonth: 'Sélectionner un mois',
|
|
6
|
+
yearSelectorLabel: 'Sélectionner une année',
|
|
7
|
+
monthSelectorLabel: 'Sélectionner un mois',
|
|
8
|
+
yearBtnLabelSelected: (selectedYear: string) => `Sélectionner une année, l'année sélectionnée est ${selectedYear}`,
|
|
9
|
+
yearBtnLabelUnselected: (selectedYear: string) => `Sélectionner une année, nous sommes actuellement en ${selectedYear}`,
|
|
10
|
+
monthBtnLabelSelected: (selectedMonth: string) => `Sélectionner un mois, le mois sélectionné est ${selectedMonth}`,
|
|
11
|
+
monthBtnLabelUnselected: (selectedMonth: string) => `Sélectionner un mois, nous sommes actuellement en ${selectedMonth}`,
|
|
12
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
// @vitest-environment jsdom
|
|
2
|
+
|
|
3
|
+
import { describe, it } from 'vitest'
|
|
4
|
+
import { mount } from '@vue/test-utils'
|
|
5
|
+
import { axe } from 'vitest-axe'
|
|
6
|
+
import { assertNoA11yViolations } from '@tests/unit/accessibility/axeUtils'
|
|
7
|
+
import MonthPicker from '../MonthPicker.vue'
|
|
8
|
+
|
|
9
|
+
describe('MonthPicker – accessibility (axe)', () => {
|
|
10
|
+
it('has no obvious axe violations modal closed', async () => {
|
|
11
|
+
const wrapper = mount(MonthPicker, {
|
|
12
|
+
props: {
|
|
13
|
+
label: 'Select month and year',
|
|
14
|
+
modelValue: undefined,
|
|
15
|
+
},
|
|
16
|
+
attachTo: document.body,
|
|
17
|
+
})
|
|
18
|
+
|
|
19
|
+
const results = await axe(wrapper.element as HTMLElement)
|
|
20
|
+
assertNoA11yViolations(results, 'MonthPicker – closed')
|
|
21
|
+
|
|
22
|
+
wrapper.unmount()
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
it('has no obvious axe violations modal open', async () => {
|
|
26
|
+
const wrapper = mount(MonthPicker, {
|
|
27
|
+
props: {
|
|
28
|
+
label: 'Select month and year',
|
|
29
|
+
modelValue: '03/2023',
|
|
30
|
+
},
|
|
31
|
+
attachTo: document.body,
|
|
32
|
+
})
|
|
33
|
+
|
|
34
|
+
// Wait for the VMenu to resolve the differents ref used to find the activator element
|
|
35
|
+
await wrapper.vm.$nextTick()
|
|
36
|
+
await wrapper.vm.$nextTick()
|
|
37
|
+
|
|
38
|
+
const toggleBtn = wrapper.find('.month-picker-input__toggle-btn')
|
|
39
|
+
await toggleBtn.trigger('click')
|
|
40
|
+
|
|
41
|
+
const results = await axe(wrapper.element as HTMLElement)
|
|
42
|
+
assertNoA11yViolations(results, 'MonthPicker – open')
|
|
43
|
+
|
|
44
|
+
wrapper.unmount()
|
|
45
|
+
})
|
|
46
|
+
|
|
47
|
+
it('has no obvious axe violations on the year modal view', async () => {
|
|
48
|
+
const wrapper = mount(MonthPicker, {
|
|
49
|
+
props: {
|
|
50
|
+
label: 'Select month and year',
|
|
51
|
+
modelValue: '03/2023',
|
|
52
|
+
},
|
|
53
|
+
attachTo: document.body,
|
|
54
|
+
})
|
|
55
|
+
|
|
56
|
+
// Wait for the VMenu to resolve the differents ref used to find the activator element
|
|
57
|
+
await wrapper.vm.$nextTick()
|
|
58
|
+
await wrapper.vm.$nextTick()
|
|
59
|
+
|
|
60
|
+
const toggleBtn = wrapper.find('.month-picker-input__toggle-btn')
|
|
61
|
+
await toggleBtn.trigger('click')
|
|
62
|
+
|
|
63
|
+
const headerBtn = wrapper.findComponent({ name: 'VisualPickerHeader' }).find('.visual-picker-header__date')
|
|
64
|
+
await headerBtn.trigger('click')
|
|
65
|
+
|
|
66
|
+
const results = await axe(wrapper.element as HTMLElement)
|
|
67
|
+
assertNoA11yViolations(results, 'MonthPicker – year view')
|
|
68
|
+
|
|
69
|
+
wrapper.unmount()
|
|
70
|
+
})
|
|
71
|
+
})
|