@portnet/ui 6.0.1 → 6.0.3
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/CHANGELOG.md +737 -0
- package/dist/esm/index.js +90 -3
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/v2/__tests__/AppMain.test.js +130 -0
- package/dist/esm/v2/__tests__/AppMain.test.js.map +1 -0
- package/dist/esm/v2/__tests__/ChartFigure.test.js +180 -0
- package/dist/esm/v2/__tests__/ChartFigure.test.js.map +1 -0
- package/dist/esm/v2/__tests__/DataGridRowActionsPropagation.test.js +150 -0
- package/dist/esm/v2/__tests__/DataGridRowActionsPropagation.test.js.map +1 -0
- package/dist/esm/v2/__tests__/DrawerTactileTargets.test.js +93 -0
- package/dist/esm/v2/__tests__/DrawerTactileTargets.test.js.map +1 -0
- package/dist/esm/v2/__tests__/FieldError.test.js +71 -39
- package/dist/esm/v2/__tests__/FieldError.test.js.map +1 -1
- package/dist/esm/v2/__tests__/FieldNaming.test.js +160 -0
- package/dist/esm/v2/__tests__/FieldNaming.test.js.map +1 -0
- package/dist/esm/v2/__tests__/FieldWidth.test.js +146 -0
- package/dist/esm/v2/__tests__/FieldWidth.test.js.map +1 -0
- package/dist/esm/v2/__tests__/FileCard.test.js +18 -18
- package/dist/esm/v2/__tests__/FileCard.test.js.map +1 -1
- package/dist/esm/v2/__tests__/FormikCheckbox.test.js +173 -0
- package/dist/esm/v2/__tests__/FormikCheckbox.test.js.map +1 -0
- package/dist/esm/v2/__tests__/FormikDateTimePicker.test.js +236 -0
- package/dist/esm/v2/__tests__/FormikDateTimePicker.test.js.map +1 -0
- package/dist/esm/v2/__tests__/FormikDisplayWidth.test.js +101 -0
- package/dist/esm/v2/__tests__/FormikDisplayWidth.test.js.map +1 -0
- package/dist/esm/v2/__tests__/FormikRadioGroup.test.js +299 -0
- package/dist/esm/v2/__tests__/FormikRadioGroup.test.js.map +1 -0
- package/dist/esm/v2/__tests__/MobileRowCard.test.js +44 -43
- package/dist/esm/v2/__tests__/MobileRowCard.test.js.map +1 -1
- package/dist/esm/v2/__tests__/PreviewDrawer.test.js +165 -0
- package/dist/esm/v2/__tests__/PreviewDrawer.test.js.map +1 -0
- package/dist/esm/v2/__tests__/ReferentielFieldContainer.test.js +156 -0
- package/dist/esm/v2/__tests__/ReferentielFieldContainer.test.js.map +1 -0
- package/dist/esm/v2/__tests__/SectionErrorBoundary.test.js +37 -52
- package/dist/esm/v2/__tests__/SectionErrorBoundary.test.js.map +1 -1
- package/dist/esm/v2/__tests__/apiError.test.js +50 -69
- package/dist/esm/v2/__tests__/apiError.test.js.map +1 -1
- package/dist/esm/v2/__tests__/banned-patterns.test.js +41 -122
- package/dist/esm/v2/__tests__/banned-patterns.test.js.map +1 -1
- package/dist/esm/v2/__tests__/chart-palette.test.js +204 -0
- package/dist/esm/v2/__tests__/chart-palette.test.js.map +1 -0
- package/dist/esm/v2/__tests__/contrast-palette.test.js +42 -74
- package/dist/esm/v2/__tests__/contrast-palette.test.js.map +1 -1
- package/dist/esm/v2/__tests__/cssVariables.test.js +44 -51
- package/dist/esm/v2/__tests__/cssVariables.test.js.map +1 -1
- package/dist/esm/v2/__tests__/fileValidation.test.js +134 -0
- package/dist/esm/v2/__tests__/fileValidation.test.js.map +1 -0
- package/dist/esm/v2/__tests__/filterCriteria.test.js +321 -0
- package/dist/esm/v2/__tests__/filterCriteria.test.js.map +1 -0
- package/dist/esm/v2/__tests__/fmtDate.test.js +68 -0
- package/dist/esm/v2/__tests__/fmtDate.test.js.map +1 -0
- package/dist/esm/v2/__tests__/gap-leakage-refonte.test.js +218 -0
- package/dist/esm/v2/__tests__/gap-leakage-refonte.test.js.map +1 -0
- package/dist/esm/v2/__tests__/labels-merge.test.js +17 -22
- package/dist/esm/v2/__tests__/labels-merge.test.js.map +1 -1
- package/dist/esm/v2/__tests__/locale-fallback.test.js +35 -40
- package/dist/esm/v2/__tests__/locale-fallback.test.js.map +1 -1
- package/dist/esm/v2/__tests__/reviveSavedCriteria.test.js +143 -0
- package/dist/esm/v2/__tests__/reviveSavedCriteria.test.js.map +1 -0
- package/dist/esm/v2/__tests__/rowActions.test.js +182 -0
- package/dist/esm/v2/__tests__/rowActions.test.js.map +1 -0
- package/dist/esm/v2/__tests__/useFocusOnRouteChange.test.js +155 -0
- package/dist/esm/v2/__tests__/useFocusOnRouteChange.test.js.map +1 -0
- package/dist/esm/v2/__tests__/useFocusTrap.test.js +266 -402
- package/dist/esm/v2/__tests__/useFocusTrap.test.js.map +1 -1
- package/dist/esm/v2/__tests__/usePrefersReducedMotion.test.js +120 -0
- package/dist/esm/v2/__tests__/usePrefersReducedMotion.test.js.map +1 -0
- package/dist/esm/v2/components/Accordion.js +48 -70
- package/dist/esm/v2/components/Accordion.js.map +1 -1
- package/dist/esm/v2/components/ActionStrip.js +31 -43
- package/dist/esm/v2/components/ActionStrip.js.map +1 -1
- package/dist/esm/v2/components/Banner.js +25 -22
- package/dist/esm/v2/components/Banner.js.map +1 -1
- package/dist/esm/v2/components/Busy.js +14 -19
- package/dist/esm/v2/components/Busy.js.map +1 -1
- package/dist/esm/v2/components/Button.js +34 -45
- package/dist/esm/v2/components/Button.js.map +1 -1
- package/dist/esm/v2/components/CategoryTag.js +44 -27
- package/dist/esm/v2/components/CategoryTag.js.map +1 -1
- package/dist/esm/v2/components/Checkbox.js +32 -38
- package/dist/esm/v2/components/Checkbox.js.map +1 -1
- package/dist/esm/v2/components/Chip.js +23 -36
- package/dist/esm/v2/components/Chip.js.map +1 -1
- package/dist/esm/v2/components/Combobox.js +112 -136
- package/dist/esm/v2/components/Combobox.js.map +1 -1
- package/dist/esm/v2/components/CommandPalette.js +113 -198
- package/dist/esm/v2/components/CommandPalette.js.map +1 -1
- package/dist/esm/v2/components/ConfirmDialog.js +36 -45
- package/dist/esm/v2/components/ConfirmDialog.js.map +1 -1
- package/dist/esm/v2/components/DatePicker.js +78 -81
- package/dist/esm/v2/components/DatePicker.js.map +1 -1
- package/dist/esm/v2/components/DateRangePicker.js +63 -74
- package/dist/esm/v2/components/DateRangePicker.js.map +1 -1
- package/dist/esm/v2/components/DateTimePicker.js +118 -90
- package/dist/esm/v2/components/DateTimePicker.js.map +1 -1
- package/dist/esm/v2/components/Drawer.js +71 -65
- package/dist/esm/v2/components/Drawer.js.map +1 -1
- package/dist/esm/v2/components/Dropzone.js +130 -177
- package/dist/esm/v2/components/Dropzone.js.map +1 -1
- package/dist/esm/v2/components/EmptyState.js +9 -9
- package/dist/esm/v2/components/EmptyState.js.map +1 -1
- package/dist/esm/v2/components/FavoriteToggle.js +24 -33
- package/dist/esm/v2/components/FavoriteToggle.js.map +1 -1
- package/dist/esm/v2/components/Field.js +210 -52
- package/dist/esm/v2/components/Field.js.map +1 -1
- package/dist/esm/v2/components/FieldError.js +9 -13
- package/dist/esm/v2/components/FieldError.js.map +1 -1
- package/dist/esm/v2/components/FieldHelp.js +28 -49
- package/dist/esm/v2/components/FieldHelp.js.map +1 -1
- package/dist/esm/v2/components/FileCard.js +14 -19
- package/dist/esm/v2/components/FileCard.js.map +1 -1
- package/dist/esm/v2/components/FilterTab.js +22 -31
- package/dist/esm/v2/components/FilterTab.js.map +1 -1
- package/dist/esm/v2/components/ForbiddenPage.js +28 -8
- package/dist/esm/v2/components/ForbiddenPage.js.map +1 -1
- package/dist/esm/v2/components/FormGrid.js +48 -54
- package/dist/esm/v2/components/FormGrid.js.map +1 -1
- package/dist/esm/v2/components/FormikDisplay.js +98 -24
- package/dist/esm/v2/components/FormikDisplay.js.map +1 -1
- package/dist/esm/v2/components/Input.js +75 -34
- package/dist/esm/v2/components/Input.js.map +1 -1
- package/dist/esm/v2/components/KPICard.js +42 -51
- package/dist/esm/v2/components/KPICard.js.map +1 -1
- package/dist/esm/v2/components/KPIStrip.js +9 -15
- package/dist/esm/v2/components/KPIStrip.js.map +1 -1
- package/dist/esm/v2/components/KV.js +16 -23
- package/dist/esm/v2/components/KV.js.map +1 -1
- package/dist/esm/v2/components/KVGrid.js +15 -23
- package/dist/esm/v2/components/KVGrid.js.map +1 -1
- package/dist/esm/v2/components/Layout.js +81 -117
- package/dist/esm/v2/components/Layout.js.map +1 -1
- package/dist/esm/v2/components/MobileRowCard.js +64 -75
- package/dist/esm/v2/components/MobileRowCard.js.map +1 -1
- package/dist/esm/v2/components/Modal.js +44 -53
- package/dist/esm/v2/components/Modal.js.map +1 -1
- package/dist/esm/v2/components/NetworkErrorPage.js +28 -11
- package/dist/esm/v2/components/NetworkErrorPage.js.map +1 -1
- package/dist/esm/v2/components/NotFoundPage.js +28 -9
- package/dist/esm/v2/components/NotFoundPage.js.map +1 -1
- package/dist/esm/v2/components/NumberInput.js +77 -107
- package/dist/esm/v2/components/NumberInput.js.map +1 -1
- package/dist/esm/v2/components/OverflowMenu.js +24 -42
- package/dist/esm/v2/components/OverflowMenu.js.map +1 -1
- package/dist/esm/v2/components/PdfViewer.js +24 -33
- package/dist/esm/v2/components/PdfViewer.js.map +1 -1
- package/dist/esm/v2/components/ProgressBar.js +28 -36
- package/dist/esm/v2/components/ProgressBar.js.map +1 -1
- package/dist/esm/v2/components/Radio.js +49 -57
- package/dist/esm/v2/components/Radio.js.map +1 -1
- package/dist/esm/v2/components/SectionErrorBoundary.js +84 -130
- package/dist/esm/v2/components/SectionErrorBoundary.js.map +1 -1
- package/dist/esm/v2/components/SectionHeader.js +24 -31
- package/dist/esm/v2/components/SectionHeader.js.map +1 -1
- package/dist/esm/v2/components/Segmented.js +59 -84
- package/dist/esm/v2/components/Segmented.js.map +1 -1
- package/dist/esm/v2/components/Select.js +100 -138
- package/dist/esm/v2/components/Select.js.map +1 -1
- package/dist/esm/v2/components/ServerErrorPage.js +27 -10
- package/dist/esm/v2/components/ServerErrorPage.js.map +1 -1
- package/dist/esm/v2/components/Skeleton.js +81 -96
- package/dist/esm/v2/components/Skeleton.js.map +1 -1
- package/dist/esm/v2/components/SkipLink.js +6 -7
- package/dist/esm/v2/components/SkipLink.js.map +1 -1
- package/dist/esm/v2/components/Spinner.js +13 -22
- package/dist/esm/v2/components/Spinner.js.map +1 -1
- package/dist/esm/v2/components/Status.js +14 -25
- package/dist/esm/v2/components/Status.js.map +1 -1
- package/dist/esm/v2/components/Stepper.js +68 -71
- package/dist/esm/v2/components/Stepper.js.map +1 -1
- package/dist/esm/v2/components/Surface.js +25 -44
- package/dist/esm/v2/components/Surface.js.map +1 -1
- package/dist/esm/v2/components/Switch.js +21 -29
- package/dist/esm/v2/components/Switch.js.map +1 -1
- package/dist/esm/v2/components/TabPanel.js +84 -0
- package/dist/esm/v2/components/TabPanel.js.map +1 -0
- package/dist/esm/v2/components/Tabs.js +43 -19
- package/dist/esm/v2/components/Tabs.js.map +1 -1
- package/dist/esm/v2/components/TelInput.js +75 -108
- package/dist/esm/v2/components/TelInput.js.map +1 -1
- package/dist/esm/v2/components/Textarea.js +21 -30
- package/dist/esm/v2/components/Textarea.js.map +1 -1
- package/dist/esm/v2/components/TimePicker.js +59 -69
- package/dist/esm/v2/components/TimePicker.js.map +1 -1
- package/dist/esm/v2/components/Toast.js +109 -163
- package/dist/esm/v2/components/Toast.js.map +1 -1
- package/dist/esm/v2/components/Tooltip.js +18 -31
- package/dist/esm/v2/components/Tooltip.js.map +1 -1
- package/dist/esm/v2/components/_ErrorPageBody.js +6 -5
- package/dist/esm/v2/components/_ErrorPageBody.js.map +1 -1
- package/dist/esm/v2/components/_pickerShared.js +2 -2
- package/dist/esm/v2/components/_pickerShared.js.map +1 -1
- package/dist/esm/v2/components/index.js +64 -0
- package/dist/esm/v2/components/index.js.map +1 -1
- package/dist/esm/v2/hooks/index.js +62 -0
- package/dist/esm/v2/hooks/index.js.map +1 -1
- package/dist/esm/v2/hooks/useAppliedFilters.js +112 -0
- package/dist/esm/v2/hooks/useAppliedFilters.js.map +1 -0
- package/dist/esm/v2/hooks/useDebouncedCallback.js +82 -0
- package/dist/esm/v2/hooks/useDebouncedCallback.js.map +1 -0
- package/dist/esm/v2/hooks/useDelayedFlag.js +5 -19
- package/dist/esm/v2/hooks/useDelayedFlag.js.map +1 -1
- package/dist/esm/v2/hooks/useDensity.js +13 -17
- package/dist/esm/v2/hooks/useDensity.js.map +1 -1
- package/dist/esm/v2/hooks/useFocusFirstError.js +25 -33
- package/dist/esm/v2/hooks/useFocusFirstError.js.map +1 -1
- package/dist/esm/v2/hooks/useFocusOnRouteChange.js +81 -0
- package/dist/esm/v2/hooks/useFocusOnRouteChange.js.map +1 -0
- package/dist/esm/v2/hooks/useFocusTrap.js +19 -23
- package/dist/esm/v2/hooks/useFocusTrap.js.map +1 -1
- package/dist/esm/v2/hooks/useFormAutoSave.js +38 -53
- package/dist/esm/v2/hooks/useFormAutoSave.js.map +1 -1
- package/dist/esm/v2/hooks/useFormCompletionProgress.js +32 -51
- package/dist/esm/v2/hooks/useFormCompletionProgress.js.map +1 -1
- package/dist/esm/v2/hooks/useKeyboardShortcuts.js +125 -0
- package/dist/esm/v2/hooks/useKeyboardShortcuts.js.map +1 -0
- package/dist/esm/v2/hooks/usePrefersReducedMotion.js +99 -0
- package/dist/esm/v2/hooks/usePrefersReducedMotion.js.map +1 -0
- package/dist/esm/v2/hooks/useResolvedDensity.js +2 -10
- package/dist/esm/v2/hooks/useResolvedDensity.js.map +1 -1
- package/dist/esm/v2/hooks/useSortedRows.js +3 -5
- package/dist/esm/v2/hooks/useSortedRows.js.map +1 -1
- package/dist/esm/v2/hooks/useTabLoading.js +6 -21
- package/dist/esm/v2/hooks/useTabLoading.js.map +1 -1
- package/dist/esm/v2/index.js +14 -4
- package/dist/esm/v2/index.js.map +1 -1
- package/dist/esm/v2/modalContext.js +2 -2
- package/dist/esm/v2/modalContext.js.map +1 -1
- package/dist/esm/v2/models/favorite.js.map +1 -1
- package/dist/esm/v2/models/personalization.js.map +1 -1
- package/dist/esm/v2/models/referentiel.js.map +1 -1
- package/dist/esm/v2/models/savedFilter.js.map +1 -1
- package/dist/esm/v2/patterns/ActionBar.js +115 -159
- package/dist/esm/v2/patterns/ActionBar.js.map +1 -1
- package/dist/esm/v2/patterns/AppMain.js +108 -0
- package/dist/esm/v2/patterns/AppMain.js.map +1 -0
- package/dist/esm/v2/patterns/BulkActionBar.js +31 -34
- package/dist/esm/v2/patterns/BulkActionBar.js.map +1 -1
- package/dist/esm/v2/patterns/ChartFigure.js +151 -0
- package/dist/esm/v2/patterns/ChartFigure.js.map +1 -0
- package/dist/esm/v2/patterns/CollapsibleDataGrid.js +111 -152
- package/dist/esm/v2/patterns/CollapsibleDataGrid.js.map +1 -1
- package/dist/esm/v2/patterns/ColumnsToggle.js +43 -77
- package/dist/esm/v2/patterns/ColumnsToggle.js.map +1 -1
- package/dist/esm/v2/patterns/DataGrid.js +221 -255
- package/dist/esm/v2/patterns/DataGrid.js.map +1 -1
- package/dist/esm/v2/patterns/DataGridSettingsMenu.js +76 -94
- package/dist/esm/v2/patterns/DataGridSettingsMenu.js.map +1 -1
- package/dist/esm/v2/patterns/DataGridToolbar.js +85 -89
- package/dist/esm/v2/patterns/DataGridToolbar.js.map +1 -1
- package/dist/esm/v2/patterns/DataGridVirtualized.js +141 -182
- package/dist/esm/v2/patterns/DataGridVirtualized.js.map +1 -1
- package/dist/esm/v2/patterns/DeleteResourceConfirmDialog.js +26 -30
- package/dist/esm/v2/patterns/DeleteResourceConfirmDialog.js.map +1 -1
- package/dist/esm/v2/patterns/DetailSplit.js +108 -0
- package/dist/esm/v2/patterns/DetailSplit.js.map +1 -0
- package/dist/esm/v2/patterns/FavoriteColumn.js +26 -75
- package/dist/esm/v2/patterns/FavoriteColumn.js.map +1 -1
- package/dist/esm/v2/patterns/FavoritesFilter.js +30 -39
- package/dist/esm/v2/patterns/FavoritesFilter.js.map +1 -1
- package/dist/esm/v2/patterns/FilterTabBar.js +112 -0
- package/dist/esm/v2/patterns/FilterTabBar.js.map +1 -0
- package/dist/esm/v2/patterns/FormErrorSummary.js +12 -13
- package/dist/esm/v2/patterns/FormErrorSummary.js.map +1 -1
- package/dist/esm/v2/patterns/FormPageShell.js +43 -41
- package/dist/esm/v2/patterns/FormPageShell.js.map +1 -1
- package/dist/esm/v2/patterns/FormSection.js +30 -38
- package/dist/esm/v2/patterns/FormSection.js.map +1 -1
- package/dist/esm/v2/patterns/FormikCheckbox.js +130 -0
- package/dist/esm/v2/patterns/FormikCheckbox.js.map +1 -0
- package/dist/esm/v2/patterns/FormikCheckboxGroup.js +56 -60
- package/dist/esm/v2/patterns/FormikCheckboxGroup.js.map +1 -1
- package/dist/esm/v2/patterns/FormikCombobox.js +51 -66
- package/dist/esm/v2/patterns/FormikCombobox.js.map +1 -1
- package/dist/esm/v2/patterns/FormikDatePicker.js +51 -99
- package/dist/esm/v2/patterns/FormikDatePicker.js.map +1 -1
- package/dist/esm/v2/patterns/FormikDateTimePicker.js +136 -0
- package/dist/esm/v2/patterns/FormikDateTimePicker.js.map +1 -0
- package/dist/esm/v2/patterns/FormikErrorFocus.js +22 -23
- package/dist/esm/v2/patterns/FormikErrorFocus.js.map +1 -1
- package/dist/esm/v2/patterns/FormikErrorSummary.js +89 -0
- package/dist/esm/v2/patterns/FormikErrorSummary.js.map +1 -0
- package/dist/esm/v2/patterns/FormikFile.js +94 -78
- package/dist/esm/v2/patterns/FormikFile.js.map +1 -1
- package/dist/esm/v2/patterns/FormikInput.js +40 -50
- package/dist/esm/v2/patterns/FormikInput.js.map +1 -1
- package/dist/esm/v2/patterns/FormikRadioGroup.js +129 -0
- package/dist/esm/v2/patterns/FormikRadioGroup.js.map +1 -0
- package/dist/esm/v2/patterns/FormikReferentielField.js +49 -59
- package/dist/esm/v2/patterns/FormikReferentielField.js.map +1 -1
- package/dist/esm/v2/patterns/FormikSelect.js +64 -84
- package/dist/esm/v2/patterns/FormikSelect.js.map +1 -1
- package/dist/esm/v2/patterns/FormikTextarea.js +30 -43
- package/dist/esm/v2/patterns/FormikTextarea.js.map +1 -1
- package/dist/esm/v2/patterns/KeyboardShortcutsHelp.js +64 -65
- package/dist/esm/v2/patterns/KeyboardShortcutsHelp.js.map +1 -1
- package/dist/esm/v2/patterns/NetworkErrorBanner.js +6 -7
- package/dist/esm/v2/patterns/NetworkErrorBanner.js.map +1 -1
- package/dist/esm/v2/patterns/PageContent.js +10 -14
- package/dist/esm/v2/patterns/PageContent.js.map +1 -1
- package/dist/esm/v2/patterns/PreviewDrawer.js +153 -0
- package/dist/esm/v2/patterns/PreviewDrawer.js.map +1 -0
- package/dist/esm/v2/patterns/ReferentielField.js +327 -312
- package/dist/esm/v2/patterns/ReferentielField.js.map +1 -1
- package/dist/esm/v2/patterns/RowFavoriteToggle.js +127 -0
- package/dist/esm/v2/patterns/RowFavoriteToggle.js.map +1 -0
- package/dist/esm/v2/patterns/SaveFilterDialog.js +38 -66
- package/dist/esm/v2/patterns/SaveFilterDialog.js.map +1 -1
- package/dist/esm/v2/patterns/SavedFiltersMenu.js +62 -81
- package/dist/esm/v2/patterns/SavedFiltersMenu.js.map +1 -1
- package/dist/esm/v2/patterns/SkeletonPageShell.js +106 -129
- package/dist/esm/v2/patterns/SkeletonPageShell.js.map +1 -1
- package/dist/esm/v2/patterns/SortableHeader.js +22 -45
- package/dist/esm/v2/patterns/SortableHeader.js.map +1 -1
- package/dist/esm/v2/patterns/Tour.js +94 -120
- package/dist/esm/v2/patterns/Tour.js.map +1 -1
- package/dist/esm/v2/patterns/_dataGridShared.js +107 -128
- package/dist/esm/v2/patterns/_dataGridShared.js.map +1 -1
- package/dist/esm/v2/patterns/_pickerSerialisation.js +72 -0
- package/dist/esm/v2/patterns/_pickerSerialisation.js.map +1 -0
- package/dist/esm/v2/patterns/_sort.js +17 -33
- package/dist/esm/v2/patterns/_sort.js.map +1 -1
- package/dist/esm/v2/patterns/_useColumnReorder.js +122 -160
- package/dist/esm/v2/patterns/_useColumnReorder.js.map +1 -1
- package/dist/esm/v2/patterns/_useColumnResize.js +78 -96
- package/dist/esm/v2/patterns/_useColumnResize.js.map +1 -1
- package/dist/esm/v2/patterns/filterCriteria.js +102 -0
- package/dist/esm/v2/patterns/filterCriteria.js.map +1 -0
- package/dist/esm/v2/patterns/index.js +235 -0
- package/dist/esm/v2/patterns/index.js.map +1 -1
- package/dist/esm/v2/patterns/rowActions.js +223 -0
- package/dist/esm/v2/patterns/rowActions.js.map +1 -0
- package/dist/esm/v2/personalization/PersonalizationProvider.js +50 -47
- package/dist/esm/v2/personalization/PersonalizationProvider.js.map +1 -1
- package/dist/esm/v2/personalization/adapters/_storageKey.js +5 -5
- package/dist/esm/v2/personalization/adapters/_storageKey.js.map +1 -1
- package/dist/esm/v2/personalization/adapters/createLocalStorageAdapter.js +22 -23
- package/dist/esm/v2/personalization/adapters/createLocalStorageAdapter.js.map +1 -1
- package/dist/esm/v2/personalization/adapters/createMemoryAdapter.js +13 -13
- package/dist/esm/v2/personalization/adapters/createMemoryAdapter.js.map +1 -1
- package/dist/esm/v2/personalization/capabilities/favorites.js +36 -60
- package/dist/esm/v2/personalization/capabilities/favorites.js.map +1 -1
- package/dist/esm/v2/personalization/capabilities/favoritesView.js +22 -34
- package/dist/esm/v2/personalization/capabilities/favoritesView.js.map +1 -1
- package/dist/esm/v2/personalization/capabilities/gridPreferences.js +203 -0
- package/dist/esm/v2/personalization/capabilities/gridPreferences.js.map +1 -0
- package/dist/esm/v2/personalization/capabilities/index.js +5 -0
- package/dist/esm/v2/personalization/capabilities/index.js.map +1 -1
- package/dist/esm/v2/personalization/capabilities/reviveSavedCriteria.js +119 -0
- package/dist/esm/v2/personalization/capabilities/reviveSavedCriteria.js.map +1 -0
- package/dist/esm/v2/personalization/capabilities/savedFilters.js +90 -98
- package/dist/esm/v2/personalization/capabilities/savedFilters.js.map +1 -1
- package/dist/esm/v2/personalization/createPersonalizationStore.js +78 -181
- package/dist/esm/v2/personalization/createPersonalizationStore.js.map +1 -1
- package/dist/esm/v2/personalization/index.js +35 -0
- package/dist/esm/v2/personalization/index.js.map +1 -1
- package/dist/esm/v2/personalization/personalizationContext.js +9 -9
- package/dist/esm/v2/personalization/personalizationContext.js.map +1 -1
- package/dist/esm/v2/personalization/schema.js +8 -9
- package/dist/esm/v2/personalization/schema.js.map +1 -1
- package/dist/esm/v2/referentiel/ReferentielProvider.js +27 -42
- package/dist/esm/v2/referentiel/ReferentielProvider.js.map +1 -1
- package/dist/esm/v2/referentiel/types.js +2 -0
- package/dist/esm/v2/referentiel/types.js.map +1 -0
- package/dist/esm/v2/referentiel/useReferentielClient.js +10 -11
- package/dist/esm/v2/referentiel/useReferentielClient.js.map +1 -1
- package/dist/esm/v2/referentiel/useReferentielOptions.js +60 -117
- package/dist/esm/v2/referentiel/useReferentielOptions.js.map +1 -1
- package/dist/esm/v2/referentiel/useReferentielSearch.js +37 -91
- package/dist/esm/v2/referentiel/useReferentielSearch.js.map +1 -1
- package/dist/esm/v2/theme/_brand.js +8 -24
- package/dist/esm/v2/theme/_brand.js.map +1 -1
- package/dist/esm/v2/theme/_brandSecondary.js +8 -24
- package/dist/esm/v2/theme/_brandSecondary.js.map +1 -1
- package/dist/esm/v2/theme/createPortnetTheme.js +51 -61
- package/dist/esm/v2/theme/createPortnetTheme.js.map +1 -1
- package/dist/esm/v2/theme/cssVariables.js +62 -69
- package/dist/esm/v2/theme/cssVariables.js.map +1 -1
- package/dist/esm/v2/theme/index.js +5 -5
- package/dist/esm/v2/theme/index.js.map +1 -1
- package/dist/esm/v2/tokens/breakpoints.js +14 -14
- package/dist/esm/v2/tokens/breakpoints.js.map +1 -1
- package/dist/esm/v2/tokens/chart.js +261 -0
- package/dist/esm/v2/tokens/chart.js.map +1 -0
- package/dist/esm/v2/tokens/colors.js +22 -22
- package/dist/esm/v2/tokens/colors.js.map +1 -1
- package/dist/esm/v2/tokens/density.js +62 -7
- package/dist/esm/v2/tokens/density.js.map +1 -1
- package/dist/esm/v2/tokens/index.js +49 -34
- package/dist/esm/v2/tokens/index.js.map +1 -1
- package/dist/esm/v2/tokens/motion.js +12 -20
- package/dist/esm/v2/tokens/motion.js.map +1 -1
- package/dist/esm/v2/tokens/radius.js +1 -1
- package/dist/esm/v2/tokens/radius.js.map +1 -1
- package/dist/esm/v2/tokens/shadows.js +6 -6
- package/dist/esm/v2/tokens/shadows.js.map +1 -1
- package/dist/esm/v2/tokens/spacing.js +2 -2
- package/dist/esm/v2/tokens/spacing.js.map +1 -1
- package/dist/esm/v2/tokens/state.js +1 -1
- package/dist/esm/v2/tokens/state.js.map +1 -1
- package/dist/esm/v2/tokens/statusPalette.js +17 -21
- package/dist/esm/v2/tokens/statusPalette.js.map +1 -1
- package/dist/esm/v2/tokens/tokens.json +6 -1
- package/dist/esm/v2/tokens/typography.js +13 -13
- package/dist/esm/v2/tokens/typography.js.map +1 -1
- package/dist/esm/v2/tokens/zIndex.js +1 -1
- package/dist/esm/v2/tokens/zIndex.js.map +1 -1
- package/dist/esm/v2/types/datagrid.js.map +1 -1
- package/dist/esm/v2/utils/apiError.js +16 -37
- package/dist/esm/v2/utils/apiError.js.map +1 -1
- package/dist/esm/v2/utils/contrast.js +31 -32
- package/dist/esm/v2/utils/contrast.js.map +1 -1
- package/dist/esm/v2/utils/cx.js +5 -25
- package/dist/esm/v2/utils/cx.js.map +1 -1
- package/dist/esm/v2/utils/fileDownload.js +23 -26
- package/dist/esm/v2/utils/fileDownload.js.map +1 -1
- package/dist/esm/v2/utils/fileValidation.js +209 -0
- package/dist/esm/v2/utils/fileValidation.js.map +1 -0
- package/dist/esm/v2/utils/fmtDate.js +111 -0
- package/dist/esm/v2/utils/fmtDate.js.map +1 -0
- package/dist/esm/v2/utils/fmtMoney.js +8 -10
- package/dist/esm/v2/utils/fmtMoney.js.map +1 -1
- package/dist/esm/v2/utils/formikErrors.js +78 -0
- package/dist/esm/v2/utils/formikErrors.js.map +1 -0
- package/dist/esm/v2/utils/index.js +35 -2
- package/dist/esm/v2/utils/index.js.map +1 -1
- package/dist/esm/v2/utils/mergeLabels.js +7 -12
- package/dist/esm/v2/utils/mergeLabels.js.map +1 -1
- package/dist/esm/v2/utils/networkStatus.js +12 -12
- package/dist/esm/v2/utils/networkStatus.js.map +1 -1
- package/dist/index.d.ts +9 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +122 -47
- package/dist/index.js.map +1 -1
- package/dist/v2/__tests__/AppMain.test.js +133 -0
- package/dist/v2/__tests__/AppMain.test.js.map +1 -0
- package/dist/v2/__tests__/ChartFigure.test.js +183 -0
- package/dist/v2/__tests__/ChartFigure.test.js.map +1 -0
- package/dist/v2/__tests__/DataGridRowActionsPropagation.test.js +153 -0
- package/dist/v2/__tests__/DataGridRowActionsPropagation.test.js.map +1 -0
- package/dist/v2/__tests__/DrawerTactileTargets.test.js +94 -0
- package/dist/v2/__tests__/DrawerTactileTargets.test.js.map +1 -0
- package/dist/v2/__tests__/FieldError.test.js +98 -69
- package/dist/v2/__tests__/FieldError.test.js.map +1 -1
- package/dist/v2/__tests__/FieldNaming.test.js +161 -0
- package/dist/v2/__tests__/FieldNaming.test.js.map +1 -0
- package/dist/v2/__tests__/FieldWidth.test.js +148 -0
- package/dist/v2/__tests__/FieldWidth.test.js.map +1 -0
- package/dist/v2/__tests__/FileCard.test.js +45 -48
- package/dist/v2/__tests__/FileCard.test.js.map +1 -1
- package/dist/v2/__tests__/FormikCheckbox.test.js +175 -0
- package/dist/v2/__tests__/FormikCheckbox.test.js.map +1 -0
- package/dist/v2/__tests__/FormikDateTimePicker.test.js +237 -0
- package/dist/v2/__tests__/FormikDateTimePicker.test.js.map +1 -0
- package/dist/v2/__tests__/FormikDisplayWidth.test.js +102 -0
- package/dist/v2/__tests__/FormikDisplayWidth.test.js.map +1 -0
- package/dist/v2/__tests__/FormikRadioGroup.test.js +300 -0
- package/dist/v2/__tests__/FormikRadioGroup.test.js.map +1 -0
- package/dist/v2/__tests__/MobileRowCard.test.js +100 -102
- package/dist/v2/__tests__/MobileRowCard.test.js.map +1 -1
- package/dist/v2/__tests__/PreviewDrawer.test.js +169 -0
- package/dist/v2/__tests__/PreviewDrawer.test.js.map +1 -0
- package/dist/v2/__tests__/ReferentielFieldContainer.test.js +159 -0
- package/dist/v2/__tests__/ReferentielFieldContainer.test.js.map +1 -0
- package/dist/v2/__tests__/SectionErrorBoundary.test.js +53 -68
- package/dist/v2/__tests__/SectionErrorBoundary.test.js.map +1 -1
- package/dist/v2/__tests__/apiError.test.js +50 -69
- package/dist/v2/__tests__/apiError.test.js.map +1 -1
- package/dist/v2/__tests__/banned-patterns.test.js +42 -123
- package/dist/v2/__tests__/banned-patterns.test.js.map +1 -1
- package/dist/v2/__tests__/chart-palette.test.js +205 -0
- package/dist/v2/__tests__/chart-palette.test.js.map +1 -0
- package/dist/v2/__tests__/contrast-palette.test.js +42 -74
- package/dist/v2/__tests__/contrast-palette.test.js.map +1 -1
- package/dist/v2/__tests__/cssVariables.test.js +44 -51
- package/dist/v2/__tests__/cssVariables.test.js.map +1 -1
- package/dist/v2/__tests__/fileValidation.test.js +136 -0
- package/dist/v2/__tests__/fileValidation.test.js.map +1 -0
- package/dist/v2/__tests__/filterCriteria.test.js +324 -0
- package/dist/v2/__tests__/filterCriteria.test.js.map +1 -0
- package/dist/v2/__tests__/fmtDate.test.js +69 -0
- package/dist/v2/__tests__/fmtDate.test.js.map +1 -0
- package/dist/v2/__tests__/gap-leakage-refonte.test.js +221 -0
- package/dist/v2/__tests__/gap-leakage-refonte.test.js.map +1 -0
- package/dist/v2/__tests__/labels-merge.test.js +38 -46
- package/dist/v2/__tests__/labels-merge.test.js.map +1 -1
- package/dist/v2/__tests__/locale-fallback.test.js +47 -52
- package/dist/v2/__tests__/locale-fallback.test.js.map +1 -1
- package/dist/v2/__tests__/reviveSavedCriteria.test.js +144 -0
- package/dist/v2/__tests__/reviveSavedCriteria.test.js.map +1 -0
- package/dist/v2/__tests__/rowActions.test.js +186 -0
- package/dist/v2/__tests__/rowActions.test.js.map +1 -0
- package/dist/v2/__tests__/useFocusOnRouteChange.test.js +156 -0
- package/dist/v2/__tests__/useFocusOnRouteChange.test.js.map +1 -0
- package/dist/v2/__tests__/useFocusTrap.test.js +270 -407
- package/dist/v2/__tests__/useFocusTrap.test.js.map +1 -1
- package/dist/v2/__tests__/usePrefersReducedMotion.test.js +123 -0
- package/dist/v2/__tests__/usePrefersReducedMotion.test.js.map +1 -0
- package/dist/v2/components/Accordion.js +60 -82
- package/dist/v2/components/Accordion.js.map +1 -1
- package/dist/v2/components/ActionStrip.js +40 -52
- package/dist/v2/components/ActionStrip.js.map +1 -1
- package/dist/v2/components/Banner.js +42 -41
- package/dist/v2/components/Banner.js.map +1 -1
- package/dist/v2/components/Busy.js +22 -27
- package/dist/v2/components/Busy.js.map +1 -1
- package/dist/v2/components/Button.js +39 -50
- package/dist/v2/components/Button.js.map +1 -1
- package/dist/v2/components/CategoryTag.d.ts.map +1 -1
- package/dist/v2/components/CategoryTag.js +49 -32
- package/dist/v2/components/CategoryTag.js.map +1 -1
- package/dist/v2/components/Checkbox.js +39 -45
- package/dist/v2/components/Checkbox.js.map +1 -1
- package/dist/v2/components/Chip.js +29 -42
- package/dist/v2/components/Chip.js.map +1 -1
- package/dist/v2/components/Combobox.js +122 -144
- package/dist/v2/components/Combobox.js.map +1 -1
- package/dist/v2/components/CommandPalette.js +138 -225
- package/dist/v2/components/CommandPalette.js.map +1 -1
- package/dist/v2/components/ConfirmDialog.js +46 -56
- package/dist/v2/components/ConfirmDialog.js.map +1 -1
- package/dist/v2/components/DatePicker.js +81 -86
- package/dist/v2/components/DatePicker.js.map +1 -1
- package/dist/v2/components/DateRangePicker.js +77 -87
- package/dist/v2/components/DateRangePicker.js.map +1 -1
- package/dist/v2/components/DateTimePicker.d.ts.map +1 -1
- package/dist/v2/components/DateTimePicker.js +121 -95
- package/dist/v2/components/DateTimePicker.js.map +1 -1
- package/dist/v2/components/Drawer.d.ts.map +1 -1
- package/dist/v2/components/Drawer.js +93 -88
- package/dist/v2/components/Drawer.js.map +1 -1
- package/dist/v2/components/Dropzone.js +150 -196
- package/dist/v2/components/Dropzone.js.map +1 -1
- package/dist/v2/components/EmptyState.js +18 -20
- package/dist/v2/components/EmptyState.js.map +1 -1
- package/dist/v2/components/FavoriteToggle.js +28 -39
- package/dist/v2/components/FavoriteToggle.js.map +1 -1
- package/dist/v2/components/Field.d.ts +121 -5
- package/dist/v2/components/Field.d.ts.map +1 -1
- package/dist/v2/components/Field.js +221 -62
- package/dist/v2/components/Field.js.map +1 -1
- package/dist/v2/components/FieldError.js +18 -21
- package/dist/v2/components/FieldError.js.map +1 -1
- package/dist/v2/components/FieldHelp.js +40 -60
- package/dist/v2/components/FieldHelp.js.map +1 -1
- package/dist/v2/components/FileCard.js +27 -31
- package/dist/v2/components/FileCard.js.map +1 -1
- package/dist/v2/components/FilterTab.js +30 -38
- package/dist/v2/components/FilterTab.js.map +1 -1
- package/dist/v2/components/ForbiddenPage.d.ts +25 -1
- package/dist/v2/components/ForbiddenPage.d.ts.map +1 -1
- package/dist/v2/components/ForbiddenPage.js +37 -17
- package/dist/v2/components/ForbiddenPage.js.map +1 -1
- package/dist/v2/components/FormGrid.js +53 -59
- package/dist/v2/components/FormGrid.js.map +1 -1
- package/dist/v2/components/FormikDisplay.d.ts +50 -1
- package/dist/v2/components/FormikDisplay.d.ts.map +1 -1
- package/dist/v2/components/FormikDisplay.js +108 -33
- package/dist/v2/components/FormikDisplay.js.map +1 -1
- package/dist/v2/components/Input.d.ts +40 -0
- package/dist/v2/components/Input.d.ts.map +1 -1
- package/dist/v2/components/Input.js +81 -41
- package/dist/v2/components/Input.js.map +1 -1
- package/dist/v2/components/KPICard.js +57 -67
- package/dist/v2/components/KPICard.js.map +1 -1
- package/dist/v2/components/KPIStrip.js +16 -22
- package/dist/v2/components/KPIStrip.js.map +1 -1
- package/dist/v2/components/KV.js +25 -31
- package/dist/v2/components/KV.js.map +1 -1
- package/dist/v2/components/KVGrid.js +19 -26
- package/dist/v2/components/KVGrid.js.map +1 -1
- package/dist/v2/components/Layout.js +91 -120
- package/dist/v2/components/Layout.js.map +1 -1
- package/dist/v2/components/MobileRowCard.js +79 -91
- package/dist/v2/components/MobileRowCard.js.map +1 -1
- package/dist/v2/components/Modal.js +61 -69
- package/dist/v2/components/Modal.js.map +1 -1
- package/dist/v2/components/NetworkErrorPage.d.ts +19 -1
- package/dist/v2/components/NetworkErrorPage.d.ts.map +1 -1
- package/dist/v2/components/NetworkErrorPage.js +38 -21
- package/dist/v2/components/NetworkErrorPage.js.map +1 -1
- package/dist/v2/components/NotFoundPage.d.ts +17 -1
- package/dist/v2/components/NotFoundPage.d.ts.map +1 -1
- package/dist/v2/components/NotFoundPage.js +37 -18
- package/dist/v2/components/NotFoundPage.js.map +1 -1
- package/dist/v2/components/NumberInput.js +88 -118
- package/dist/v2/components/NumberInput.js.map +1 -1
- package/dist/v2/components/OverflowMenu.js +38 -56
- package/dist/v2/components/OverflowMenu.js.map +1 -1
- package/dist/v2/components/PdfViewer.js +34 -45
- package/dist/v2/components/PdfViewer.js.map +1 -1
- package/dist/v2/components/ProgressBar.js +42 -49
- package/dist/v2/components/ProgressBar.js.map +1 -1
- package/dist/v2/components/Radio.js +59 -67
- package/dist/v2/components/Radio.js.map +1 -1
- package/dist/v2/components/SectionErrorBoundary.js +90 -135
- package/dist/v2/components/SectionErrorBoundary.js.map +1 -1
- package/dist/v2/components/SectionHeader.js +34 -41
- package/dist/v2/components/SectionHeader.js.map +1 -1
- package/dist/v2/components/Segmented.js +69 -93
- package/dist/v2/components/Segmented.js.map +1 -1
- package/dist/v2/components/Select.d.ts +26 -2
- package/dist/v2/components/Select.d.ts.map +1 -1
- package/dist/v2/components/Select.js +120 -155
- package/dist/v2/components/Select.js.map +1 -1
- package/dist/v2/components/ServerErrorPage.d.ts +27 -1
- package/dist/v2/components/ServerErrorPage.d.ts.map +1 -1
- package/dist/v2/components/ServerErrorPage.js +37 -20
- package/dist/v2/components/ServerErrorPage.js.map +1 -1
- package/dist/v2/components/Skeleton.js +86 -100
- package/dist/v2/components/Skeleton.js.map +1 -1
- package/dist/v2/components/SkipLink.js +9 -12
- package/dist/v2/components/SkipLink.js.map +1 -1
- package/dist/v2/components/Spinner.js +16 -25
- package/dist/v2/components/Spinner.js.map +1 -1
- package/dist/v2/components/Status.js +18 -29
- package/dist/v2/components/Status.js.map +1 -1
- package/dist/v2/components/Stepper.js +80 -82
- package/dist/v2/components/Stepper.js.map +1 -1
- package/dist/v2/components/Surface.js +34 -49
- package/dist/v2/components/Surface.js.map +1 -1
- package/dist/v2/components/Switch.js +29 -37
- package/dist/v2/components/Switch.js.map +1 -1
- package/dist/v2/components/TabPanel.d.ts +17 -0
- package/dist/v2/components/TabPanel.d.ts.map +1 -0
- package/dist/v2/components/TabPanel.js +90 -0
- package/dist/v2/components/TabPanel.js.map +1 -0
- package/dist/v2/components/Tabs.d.ts +25 -0
- package/dist/v2/components/Tabs.d.ts.map +1 -1
- package/dist/v2/components/Tabs.js +53 -29
- package/dist/v2/components/Tabs.js.map +1 -1
- package/dist/v2/components/TelInput.js +80 -115
- package/dist/v2/components/TelInput.js.map +1 -1
- package/dist/v2/components/Textarea.js +26 -35
- package/dist/v2/components/Textarea.js.map +1 -1
- package/dist/v2/components/TimePicker.js +62 -74
- package/dist/v2/components/TimePicker.js.map +1 -1
- package/dist/v2/components/Toast.js +119 -174
- package/dist/v2/components/Toast.js.map +1 -1
- package/dist/v2/components/Tooltip.js +23 -38
- package/dist/v2/components/Tooltip.js.map +1 -1
- package/dist/v2/components/_ErrorPageBody.js +15 -16
- package/dist/v2/components/_ErrorPageBody.js.map +1 -1
- package/dist/v2/components/_pickerShared.js +5 -5
- package/dist/v2/components/_pickerShared.js.map +1 -1
- package/dist/v2/components/index.d.ts +67 -1
- package/dist/v2/components/index.d.ts.map +1 -1
- package/dist/v2/components/index.js +153 -136
- package/dist/v2/components/index.js.map +1 -1
- package/dist/v2/hooks/index.d.ts +65 -0
- package/dist/v2/hooks/index.d.ts.map +1 -1
- package/dist/v2/hooks/index.js +63 -24
- package/dist/v2/hooks/index.js.map +1 -1
- package/dist/v2/hooks/useAppliedFilters.d.ts +102 -0
- package/dist/v2/hooks/useAppliedFilters.d.ts.map +1 -0
- package/dist/v2/hooks/useAppliedFilters.js +117 -0
- package/dist/v2/hooks/useAppliedFilters.js.map +1 -0
- package/dist/v2/hooks/useDebouncedCallback.d.ts +64 -0
- package/dist/v2/hooks/useDebouncedCallback.d.ts.map +1 -0
- package/dist/v2/hooks/useDebouncedCallback.js +87 -0
- package/dist/v2/hooks/useDebouncedCallback.js.map +1 -0
- package/dist/v2/hooks/useDelayedFlag.js +6 -20
- package/dist/v2/hooks/useDelayedFlag.js.map +1 -1
- package/dist/v2/hooks/useDensity.d.ts.map +1 -1
- package/dist/v2/hooks/useDensity.js +14 -18
- package/dist/v2/hooks/useDensity.js.map +1 -1
- package/dist/v2/hooks/useFocusFirstError.js +26 -34
- package/dist/v2/hooks/useFocusFirstError.js.map +1 -1
- package/dist/v2/hooks/useFocusOnRouteChange.d.ts +65 -0
- package/dist/v2/hooks/useFocusOnRouteChange.d.ts.map +1 -0
- package/dist/v2/hooks/useFocusOnRouteChange.js +88 -0
- package/dist/v2/hooks/useFocusOnRouteChange.js.map +1 -0
- package/dist/v2/hooks/useFocusTrap.js +20 -24
- package/dist/v2/hooks/useFocusTrap.js.map +1 -1
- package/dist/v2/hooks/useFormAutoSave.d.ts +4 -4
- package/dist/v2/hooks/useFormAutoSave.d.ts.map +1 -1
- package/dist/v2/hooks/useFormAutoSave.js +39 -54
- package/dist/v2/hooks/useFormAutoSave.js.map +1 -1
- package/dist/v2/hooks/useFormCompletionProgress.d.ts +1 -1
- package/dist/v2/hooks/useFormCompletionProgress.d.ts.map +1 -1
- package/dist/v2/hooks/useFormCompletionProgress.js +33 -52
- package/dist/v2/hooks/useFormCompletionProgress.js.map +1 -1
- package/dist/v2/hooks/useKeyboardShortcuts.d.ts +25 -0
- package/dist/v2/hooks/useKeyboardShortcuts.d.ts.map +1 -0
- package/dist/v2/hooks/useKeyboardShortcuts.js +132 -0
- package/dist/v2/hooks/useKeyboardShortcuts.js.map +1 -0
- package/dist/v2/hooks/usePrefersReducedMotion.d.ts +56 -0
- package/dist/v2/hooks/usePrefersReducedMotion.d.ts.map +1 -0
- package/dist/v2/hooks/usePrefersReducedMotion.js +105 -0
- package/dist/v2/hooks/usePrefersReducedMotion.js.map +1 -0
- package/dist/v2/hooks/useResolvedDensity.js +5 -13
- package/dist/v2/hooks/useResolvedDensity.js.map +1 -1
- package/dist/v2/hooks/useSortedRows.js +4 -6
- package/dist/v2/hooks/useSortedRows.js.map +1 -1
- package/dist/v2/hooks/useTabLoading.js +7 -22
- package/dist/v2/hooks/useTabLoading.js.map +1 -1
- package/dist/v2/index.d.ts.map +1 -1
- package/dist/v2/index.js +143 -145
- package/dist/v2/index.js.map +1 -1
- package/dist/v2/modalContext.js +2 -2
- package/dist/v2/modalContext.js.map +1 -1
- package/dist/v2/models/favorite.d.ts +8 -9
- package/dist/v2/models/favorite.d.ts.map +1 -1
- package/dist/v2/models/favorite.js.map +1 -1
- package/dist/v2/models/index.js +4 -4
- package/dist/v2/models/index.js.map +1 -1
- package/dist/v2/models/personalization.d.ts +44 -48
- package/dist/v2/models/personalization.d.ts.map +1 -1
- package/dist/v2/models/personalization.js.map +1 -1
- package/dist/v2/models/referentiel.d.ts +32 -50
- package/dist/v2/models/referentiel.d.ts.map +1 -1
- package/dist/v2/models/referentiel.js.map +1 -1
- package/dist/v2/models/savedFilter.d.ts +8 -17
- package/dist/v2/models/savedFilter.d.ts.map +1 -1
- package/dist/v2/models/savedFilter.js.map +1 -1
- package/dist/v2/patterns/ActionBar.js +152 -187
- package/dist/v2/patterns/ActionBar.js.map +1 -1
- package/dist/v2/patterns/AppMain.d.ts +109 -0
- package/dist/v2/patterns/AppMain.d.ts.map +1 -0
- package/dist/v2/patterns/AppMain.js +115 -0
- package/dist/v2/patterns/AppMain.js.map +1 -0
- package/dist/v2/patterns/BulkActionBar.js +40 -42
- package/dist/v2/patterns/BulkActionBar.js.map +1 -1
- package/dist/v2/patterns/ChartFigure.d.ts +124 -0
- package/dist/v2/patterns/ChartFigure.d.ts.map +1 -0
- package/dist/v2/patterns/ChartFigure.js +159 -0
- package/dist/v2/patterns/ChartFigure.js.map +1 -0
- package/dist/v2/patterns/CollapsibleDataGrid.js +138 -174
- package/dist/v2/patterns/CollapsibleDataGrid.js.map +1 -1
- package/dist/v2/patterns/ColumnsToggle.js +60 -94
- package/dist/v2/patterns/ColumnsToggle.js.map +1 -1
- package/dist/v2/patterns/DataGrid.d.ts.map +1 -1
- package/dist/v2/patterns/DataGrid.js +262 -297
- package/dist/v2/patterns/DataGrid.js.map +1 -1
- package/dist/v2/patterns/DataGridSettingsMenu.d.ts +12 -0
- package/dist/v2/patterns/DataGridSettingsMenu.d.ts.map +1 -1
- package/dist/v2/patterns/DataGridSettingsMenu.js +104 -121
- package/dist/v2/patterns/DataGridSettingsMenu.js.map +1 -1
- package/dist/v2/patterns/DataGridToolbar.js +103 -106
- package/dist/v2/patterns/DataGridToolbar.js.map +1 -1
- package/dist/v2/patterns/DataGridVirtualized.js +179 -217
- package/dist/v2/patterns/DataGridVirtualized.js.map +1 -1
- package/dist/v2/patterns/DeleteResourceConfirmDialog.js +32 -35
- package/dist/v2/patterns/DeleteResourceConfirmDialog.js.map +1 -1
- package/dist/v2/patterns/DetailSplit.d.ts +87 -0
- package/dist/v2/patterns/DetailSplit.d.ts.map +1 -0
- package/dist/v2/patterns/DetailSplit.js +116 -0
- package/dist/v2/patterns/DetailSplit.js.map +1 -0
- package/dist/v2/patterns/FavoriteColumn.d.ts +9 -9
- package/dist/v2/patterns/FavoriteColumn.d.ts.map +1 -1
- package/dist/v2/patterns/FavoriteColumn.js +32 -80
- package/dist/v2/patterns/FavoriteColumn.js.map +1 -1
- package/dist/v2/patterns/FavoritesFilter.js +36 -44
- package/dist/v2/patterns/FavoritesFilter.js.map +1 -1
- package/dist/v2/patterns/FilterTabBar.d.ts +28 -0
- package/dist/v2/patterns/FilterTabBar.d.ts.map +1 -0
- package/dist/v2/patterns/FilterTabBar.js +120 -0
- package/dist/v2/patterns/FilterTabBar.js.map +1 -0
- package/dist/v2/patterns/FormErrorSummary.js +20 -23
- package/dist/v2/patterns/FormErrorSummary.js.map +1 -1
- package/dist/v2/patterns/FormPageShell.js +53 -50
- package/dist/v2/patterns/FormPageShell.js.map +1 -1
- package/dist/v2/patterns/FormSection.d.ts +8 -3
- package/dist/v2/patterns/FormSection.d.ts.map +1 -1
- package/dist/v2/patterns/FormSection.js +44 -51
- package/dist/v2/patterns/FormSection.js.map +1 -1
- package/dist/v2/patterns/FormikCheckbox.d.ts +77 -0
- package/dist/v2/patterns/FormikCheckbox.d.ts.map +1 -0
- package/dist/v2/patterns/FormikCheckbox.js +138 -0
- package/dist/v2/patterns/FormikCheckbox.js.map +1 -0
- package/dist/v2/patterns/FormikCheckboxGroup.d.ts +17 -1
- package/dist/v2/patterns/FormikCheckboxGroup.d.ts.map +1 -1
- package/dist/v2/patterns/FormikCheckboxGroup.js +62 -65
- package/dist/v2/patterns/FormikCheckboxGroup.js.map +1 -1
- package/dist/v2/patterns/FormikCombobox.d.ts +7 -1
- package/dist/v2/patterns/FormikCombobox.d.ts.map +1 -1
- package/dist/v2/patterns/FormikCombobox.js +55 -69
- package/dist/v2/patterns/FormikCombobox.js.map +1 -1
- package/dist/v2/patterns/FormikDatePicker.d.ts +13 -1
- package/dist/v2/patterns/FormikDatePicker.d.ts.map +1 -1
- package/dist/v2/patterns/FormikDatePicker.js +59 -106
- package/dist/v2/patterns/FormikDatePicker.js.map +1 -1
- package/dist/v2/patterns/FormikDateTimePicker.d.ts +111 -0
- package/dist/v2/patterns/FormikDateTimePicker.d.ts.map +1 -0
- package/dist/v2/patterns/FormikDateTimePicker.js +144 -0
- package/dist/v2/patterns/FormikDateTimePicker.js.map +1 -0
- package/dist/v2/patterns/FormikErrorFocus.js +25 -26
- package/dist/v2/patterns/FormikErrorFocus.js.map +1 -1
- package/dist/v2/patterns/FormikErrorSummary.d.ts +74 -0
- package/dist/v2/patterns/FormikErrorSummary.d.ts.map +1 -0
- package/dist/v2/patterns/FormikErrorSummary.js +97 -0
- package/dist/v2/patterns/FormikErrorSummary.js.map +1 -0
- package/dist/v2/patterns/FormikFile.d.ts +14 -1
- package/dist/v2/patterns/FormikFile.d.ts.map +1 -1
- package/dist/v2/patterns/FormikFile.js +99 -83
- package/dist/v2/patterns/FormikFile.js.map +1 -1
- package/dist/v2/patterns/FormikInput.d.ts +11 -1
- package/dist/v2/patterns/FormikInput.d.ts.map +1 -1
- package/dist/v2/patterns/FormikInput.js +45 -55
- package/dist/v2/patterns/FormikInput.js.map +1 -1
- package/dist/v2/patterns/FormikRadioGroup.d.ts +80 -0
- package/dist/v2/patterns/FormikRadioGroup.d.ts.map +1 -0
- package/dist/v2/patterns/FormikRadioGroup.js +137 -0
- package/dist/v2/patterns/FormikRadioGroup.js.map +1 -0
- package/dist/v2/patterns/FormikReferentielField.d.ts +12 -1
- package/dist/v2/patterns/FormikReferentielField.d.ts.map +1 -1
- package/dist/v2/patterns/FormikReferentielField.js +54 -64
- package/dist/v2/patterns/FormikReferentielField.js.map +1 -1
- package/dist/v2/patterns/FormikSelect.d.ts +9 -1
- package/dist/v2/patterns/FormikSelect.d.ts.map +1 -1
- package/dist/v2/patterns/FormikSelect.js +70 -89
- package/dist/v2/patterns/FormikSelect.js.map +1 -1
- package/dist/v2/patterns/FormikTextarea.d.ts +9 -1
- package/dist/v2/patterns/FormikTextarea.d.ts.map +1 -1
- package/dist/v2/patterns/FormikTextarea.js +35 -48
- package/dist/v2/patterns/FormikTextarea.js.map +1 -1
- package/dist/v2/patterns/KeyboardShortcutsHelp.d.ts +14 -1
- package/dist/v2/patterns/KeyboardShortcutsHelp.d.ts.map +1 -1
- package/dist/v2/patterns/KeyboardShortcutsHelp.js +71 -74
- package/dist/v2/patterns/KeyboardShortcutsHelp.js.map +1 -1
- package/dist/v2/patterns/NetworkErrorBanner.js +13 -16
- package/dist/v2/patterns/NetworkErrorBanner.js.map +1 -1
- package/dist/v2/patterns/PageContent.js +17 -20
- package/dist/v2/patterns/PageContent.js.map +1 -1
- package/dist/v2/patterns/PreviewDrawer.d.ts +49 -0
- package/dist/v2/patterns/PreviewDrawer.d.ts.map +1 -0
- package/dist/v2/patterns/PreviewDrawer.js +159 -0
- package/dist/v2/patterns/PreviewDrawer.js.map +1 -0
- package/dist/v2/patterns/ReferentielField.d.ts +86 -2
- package/dist/v2/patterns/ReferentielField.d.ts.map +1 -1
- package/dist/v2/patterns/ReferentielField.js +347 -327
- package/dist/v2/patterns/ReferentielField.js.map +1 -1
- package/dist/v2/patterns/RowFavoriteToggle.d.ts +98 -0
- package/dist/v2/patterns/RowFavoriteToggle.d.ts.map +1 -0
- package/dist/v2/patterns/RowFavoriteToggle.js +135 -0
- package/dist/v2/patterns/RowFavoriteToggle.js.map +1 -0
- package/dist/v2/patterns/SaveFilterDialog.js +50 -77
- package/dist/v2/patterns/SaveFilterDialog.js.map +1 -1
- package/dist/v2/patterns/SavedFiltersMenu.js +89 -107
- package/dist/v2/patterns/SavedFiltersMenu.js.map +1 -1
- package/dist/v2/patterns/SkeletonPageShell.js +122 -143
- package/dist/v2/patterns/SkeletonPageShell.js.map +1 -1
- package/dist/v2/patterns/SortableHeader.js +35 -57
- package/dist/v2/patterns/SortableHeader.js.map +1 -1
- package/dist/v2/patterns/Tour.js +121 -142
- package/dist/v2/patterns/Tour.js.map +1 -1
- package/dist/v2/patterns/_dataGridShared.d.ts.map +1 -1
- package/dist/v2/patterns/_dataGridShared.js +131 -147
- package/dist/v2/patterns/_dataGridShared.js.map +1 -1
- package/dist/v2/patterns/_pickerSerialisation.d.ts +44 -0
- package/dist/v2/patterns/_pickerSerialisation.d.ts.map +1 -0
- package/dist/v2/patterns/_pickerSerialisation.js +80 -0
- package/dist/v2/patterns/_pickerSerialisation.js.map +1 -0
- package/dist/v2/patterns/_sort.js +17 -33
- package/dist/v2/patterns/_sort.js.map +1 -1
- package/dist/v2/patterns/_useColumnReorder.js +124 -163
- package/dist/v2/patterns/_useColumnReorder.js.map +1 -1
- package/dist/v2/patterns/_useColumnResize.js +80 -99
- package/dist/v2/patterns/_useColumnResize.js.map +1 -1
- package/dist/v2/patterns/filterCriteria.d.ts +78 -0
- package/dist/v2/patterns/filterCriteria.d.ts.map +1 -0
- package/dist/v2/patterns/filterCriteria.js +110 -0
- package/dist/v2/patterns/filterCriteria.js.map +1 -0
- package/dist/v2/patterns/index.d.ts +247 -0
- package/dist/v2/patterns/index.d.ts.map +1 -1
- package/dist/v2/patterns/index.js +182 -70
- package/dist/v2/patterns/index.js.map +1 -1
- package/dist/v2/patterns/rowActions.d.ts +150 -0
- package/dist/v2/patterns/rowActions.d.ts.map +1 -0
- package/dist/v2/patterns/rowActions.js +232 -0
- package/dist/v2/patterns/rowActions.js.map +1 -0
- package/dist/v2/personalization/PersonalizationProvider.d.ts.map +1 -1
- package/dist/v2/personalization/PersonalizationProvider.js +57 -53
- package/dist/v2/personalization/PersonalizationProvider.js.map +1 -1
- package/dist/v2/personalization/adapters/_storageKey.js +5 -5
- package/dist/v2/personalization/adapters/_storageKey.js.map +1 -1
- package/dist/v2/personalization/adapters/createLocalStorageAdapter.js +25 -24
- package/dist/v2/personalization/adapters/createLocalStorageAdapter.js.map +1 -1
- package/dist/v2/personalization/adapters/createMemoryAdapter.js +14 -14
- package/dist/v2/personalization/adapters/createMemoryAdapter.js.map +1 -1
- package/dist/v2/personalization/adapters/index.js +5 -5
- package/dist/v2/personalization/adapters/index.js.map +1 -1
- package/dist/v2/personalization/capabilities/favorites.js +39 -62
- package/dist/v2/personalization/capabilities/favorites.js.map +1 -1
- package/dist/v2/personalization/capabilities/favoritesView.js +25 -37
- package/dist/v2/personalization/capabilities/favoritesView.js.map +1 -1
- package/dist/v2/personalization/capabilities/gridPreferences.d.ts +100 -0
- package/dist/v2/personalization/capabilities/gridPreferences.d.ts.map +1 -0
- package/dist/v2/personalization/capabilities/gridPreferences.js +210 -0
- package/dist/v2/personalization/capabilities/gridPreferences.js.map +1 -0
- package/dist/v2/personalization/capabilities/index.d.ts +6 -0
- package/dist/v2/personalization/capabilities/index.d.ts.map +1 -1
- package/dist/v2/personalization/capabilities/index.js +23 -10
- package/dist/v2/personalization/capabilities/index.js.map +1 -1
- package/dist/v2/personalization/capabilities/reviveSavedCriteria.d.ts +88 -0
- package/dist/v2/personalization/capabilities/reviveSavedCriteria.d.ts.map +1 -0
- package/dist/v2/personalization/capabilities/reviveSavedCriteria.js +126 -0
- package/dist/v2/personalization/capabilities/reviveSavedCriteria.js.map +1 -0
- package/dist/v2/personalization/capabilities/savedFilters.js +93 -100
- package/dist/v2/personalization/capabilities/savedFilters.js.map +1 -1
- package/dist/v2/personalization/createPersonalizationStore.d.ts.map +1 -1
- package/dist/v2/personalization/createPersonalizationStore.js +81 -182
- package/dist/v2/personalization/createPersonalizationStore.js.map +1 -1
- package/dist/v2/personalization/index.d.ts +34 -0
- package/dist/v2/personalization/index.d.ts.map +1 -1
- package/dist/v2/personalization/index.js +41 -21
- package/dist/v2/personalization/index.js.map +1 -1
- package/dist/v2/personalization/personalizationContext.js +10 -12
- package/dist/v2/personalization/personalizationContext.js.map +1 -1
- package/dist/v2/personalization/schema.js +8 -9
- package/dist/v2/personalization/schema.js.map +1 -1
- package/dist/v2/referentiel/ReferentielProvider.js +31 -45
- package/dist/v2/referentiel/ReferentielProvider.js.map +1 -1
- package/dist/v2/referentiel/index.js +11 -13
- package/dist/v2/referentiel/index.js.map +1 -1
- package/dist/v2/referentiel/types.d.ts +105 -0
- package/dist/v2/referentiel/types.d.ts.map +1 -0
- package/dist/v2/referentiel/types.js +6 -0
- package/dist/v2/referentiel/types.js.map +1 -0
- package/dist/v2/referentiel/useReferentielClient.js +13 -16
- package/dist/v2/referentiel/useReferentielClient.js.map +1 -1
- package/dist/v2/referentiel/useReferentielOptions.d.ts +7 -17
- package/dist/v2/referentiel/useReferentielOptions.d.ts.map +1 -1
- package/dist/v2/referentiel/useReferentielOptions.js +63 -120
- package/dist/v2/referentiel/useReferentielOptions.js.map +1 -1
- package/dist/v2/referentiel/useReferentielSearch.d.ts +7 -48
- package/dist/v2/referentiel/useReferentielSearch.d.ts.map +1 -1
- package/dist/v2/referentiel/useReferentielSearch.js +40 -95
- package/dist/v2/referentiel/useReferentielSearch.js.map +1 -1
- package/dist/v2/theme/_brand.js +12 -26
- package/dist/v2/theme/_brand.js.map +1 -1
- package/dist/v2/theme/_brandSecondary.js +12 -26
- package/dist/v2/theme/_brandSecondary.js.map +1 -1
- package/dist/v2/theme/createPortnetTheme.js +41 -49
- package/dist/v2/theme/createPortnetTheme.js.map +1 -1
- package/dist/v2/theme/cssVariables.d.ts +3 -3
- package/dist/v2/theme/cssVariables.d.ts.map +1 -1
- package/dist/v2/theme/cssVariables.js +65 -70
- package/dist/v2/theme/cssVariables.js.map +1 -1
- package/dist/v2/theme/index.js +10 -10
- package/dist/v2/theme/index.js.map +1 -1
- package/dist/v2/tokens/breakpoints.js +16 -16
- package/dist/v2/tokens/breakpoints.js.map +1 -1
- package/dist/v2/tokens/chart.d.ts +103 -0
- package/dist/v2/tokens/chart.d.ts.map +1 -0
- package/dist/v2/tokens/chart.js +270 -0
- package/dist/v2/tokens/chart.js.map +1 -0
- package/dist/v2/tokens/colors.js +24 -24
- package/dist/v2/tokens/colors.js.map +1 -1
- package/dist/v2/tokens/density.d.ts +104 -0
- package/dist/v2/tokens/density.d.ts.map +1 -1
- package/dist/v2/tokens/density.js +67 -12
- package/dist/v2/tokens/density.js.map +1 -1
- package/dist/v2/tokens/index.d.ts +50 -1
- package/dist/v2/tokens/index.d.ts.map +1 -1
- package/dist/v2/tokens/index.js +116 -68
- package/dist/v2/tokens/index.js.map +1 -1
- package/dist/v2/tokens/motion.js +16 -22
- package/dist/v2/tokens/motion.js.map +1 -1
- package/dist/v2/tokens/radius.js +3 -3
- package/dist/v2/tokens/radius.js.map +1 -1
- package/dist/v2/tokens/shadows.js +8 -8
- package/dist/v2/tokens/shadows.js.map +1 -1
- package/dist/v2/tokens/spacing.js +4 -4
- package/dist/v2/tokens/spacing.js.map +1 -1
- package/dist/v2/tokens/state.js +3 -3
- package/dist/v2/tokens/state.js.map +1 -1
- package/dist/v2/tokens/statusPalette.js +21 -23
- package/dist/v2/tokens/statusPalette.js.map +1 -1
- package/dist/v2/tokens/tokens.json +6 -1
- package/dist/v2/tokens/typography.js +15 -15
- package/dist/v2/tokens/typography.js.map +1 -1
- package/dist/v2/tokens/zIndex.js +3 -3
- package/dist/v2/tokens/zIndex.js.map +1 -1
- package/dist/v2/types/datagrid.d.ts +9 -1
- package/dist/v2/types/datagrid.d.ts.map +1 -1
- package/dist/v2/types/datagrid.js.map +1 -1
- package/dist/v2/types/index.js +2 -2
- package/dist/v2/types/index.js.map +1 -1
- package/dist/v2/utils/apiError.js +16 -37
- package/dist/v2/utils/apiError.js.map +1 -1
- package/dist/v2/utils/contrast.js +31 -32
- package/dist/v2/utils/contrast.js.map +1 -1
- package/dist/v2/utils/cx.js +7 -27
- package/dist/v2/utils/cx.js.map +1 -1
- package/dist/v2/utils/fileDownload.js +25 -28
- package/dist/v2/utils/fileDownload.js.map +1 -1
- package/dist/v2/utils/fileValidation.d.ts +116 -0
- package/dist/v2/utils/fileValidation.d.ts.map +1 -0
- package/dist/v2/utils/fileValidation.js +220 -0
- package/dist/v2/utils/fileValidation.js.map +1 -0
- package/dist/v2/utils/fmtDate.d.ts +103 -0
- package/dist/v2/utils/fmtDate.d.ts.map +1 -0
- package/dist/v2/utils/fmtDate.js +119 -0
- package/dist/v2/utils/fmtDate.js.map +1 -0
- package/dist/v2/utils/fmtMoney.d.ts +3 -3
- package/dist/v2/utils/fmtMoney.d.ts.map +1 -1
- package/dist/v2/utils/fmtMoney.js +9 -11
- package/dist/v2/utils/fmtMoney.js.map +1 -1
- package/dist/v2/utils/formikErrors.d.ts +67 -0
- package/dist/v2/utils/formikErrors.d.ts.map +1 -0
- package/dist/v2/utils/formikErrors.js +85 -0
- package/dist/v2/utils/formikErrors.js.map +1 -0
- package/dist/v2/utils/index.d.ts +5 -0
- package/dist/v2/utils/index.d.ts.map +1 -1
- package/dist/v2/utils/index.js +67 -18
- package/dist/v2/utils/index.js.map +1 -1
- package/dist/v2/utils/mergeLabels.js +9 -14
- package/dist/v2/utils/mergeLabels.js.map +1 -1
- package/dist/v2/utils/networkStatus.js +14 -14
- package/dist/v2/utils/networkStatus.js.map +1 -1
- package/package.json +26 -9
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DrawerTactileTargets.test.js","names":["require","_react","_Drawer","_interopRequireDefault","_tokens","_jsxRuntime","e","__esModule","default","TACTILE_MIN","layout","tactileMin","TACTILE_FLOOR","minWidth","minHeight","describe","it","render","jsx","open","onClose","undefined","title","children","expect","screen","getByRole","name","toHaveStyle","onPrev","onNext","hasPrev","hasNext","previous","toBeDisabled"],"sources":["../../../src/lib/v2/__tests__/DrawerTactileTargets.test.tsx"],"sourcesContent":["import \"@testing-library/jest-dom\";\r\nimport { render, screen } from \"@testing-library/react\";\r\n\r\nimport Drawer from \"../components/Drawer\";\r\nimport { layout } from \"../tokens\";\r\n\r\n/**\r\n * R-7.4 / WCAG 2.5.5 — the drawer header's icon-only buttons.\r\n *\r\n * `tokens/density` states the rule this file guards, in its own words: \"Icon-\r\n * only buttons MUST set min-width/min-height to `tactileMin`\", because the\r\n * VISUAL height of a button may drop below 44px in the tighter density tiers\r\n * while the hit area may not. The drawer header's three buttons — prev, next,\r\n * close — were `IconButton size=\"small\"` with only a colour rule: about 34px,\r\n * ten short of the floor this library imposes on its hosts.\r\n *\r\n * The gap stayed invisible while item navigation was rarely wired, since a\r\n * filter panel renders the close button alone. A module that equips its\r\n * preview drawers with onPrev/onNext exposes three per drawer — which is what\r\n * surfaced it.\r\n *\r\n * ── WHY `toHaveStyle` AND NOT `element.style` ────────────────────────\r\n *\r\n * The first version of this file asserted on `element.style.minWidth` and\r\n * failed on all three cases with an empty string — correctly. `sx` compiles to\r\n * an EMOTION CLASS, never to an inline style attribute, so the inline bag is\r\n * empty by construction. `toHaveStyle` resolves the declaration through\r\n * `getComputedStyle`, which jsdom does cascade from the injected stylesheet.\r\n *\r\n * What this verifies is therefore the DECLARED floor, not a rendered box:\r\n * jsdom performs no layout, so no assertion here could prove the button\r\n * measures 44px on screen. The declaration is what the rule asks for, and it\r\n * is what a refactor of this header would silently drop.\r\n */\r\n\r\nconst TACTILE_MIN = `${layout.tactileMin}px`;\r\nconst TACTILE_FLOOR = { minWidth: TACTILE_MIN, minHeight: TACTILE_MIN };\r\n\r\ndescribe(\"Drawer — cibles tactiles de l'en-tête (R-7.4)\", () => {\r\n it(\"plancher de 44px sur le bouton de fermeture\", () => {\r\n render(\r\n <Drawer open onClose={() => undefined} title=\"Filtres avancés\">\r\n contenu\r\n </Drawer>\r\n );\r\n\r\n expect(screen.getByRole(\"button\", { name: /Fermer/i })).toHaveStyle(\r\n TACTILE_FLOOR\r\n );\r\n });\r\n\r\n /* Les deux flèches ne sont rendues que si un gestionnaire est fourni\r\n (navigation opt-in, D-A10.2) — c'est ce qui a longtemps masqué l'écart. */\r\n it(\"plancher de 44px sur les deux flèches de navigation\", () => {\r\n render(\r\n <Drawer\r\n open\r\n onClose={() => undefined}\r\n title=\"Dossier 2026-IM-00042\"\r\n onPrev={() => undefined}\r\n onNext={() => undefined}\r\n hasPrev\r\n hasNext\r\n >\r\n contenu\r\n </Drawer>\r\n );\r\n\r\n expect(screen.getByRole(\"button\", { name: /Précédent/i })).toHaveStyle(\r\n TACTILE_FLOOR\r\n );\r\n expect(screen.getByRole(\"button\", { name: /Suivant/i })).toHaveStyle(\r\n TACTILE_FLOOR\r\n );\r\n });\r\n\r\n /* Le plancher vaut aussi pour un bouton DÉSACTIVÉ : il reste une cible que\r\n l'utilisateur va viser, et le rendre plus petit que les autres ferait\r\n sauter la rangée d'un tiroir à l'autre. */\r\n it(\"plancher maintenu quand la navigation est désactivée\", () => {\r\n render(\r\n <Drawer\r\n open\r\n onClose={() => undefined}\r\n title=\"Dossier unique\"\r\n onPrev={() => undefined}\r\n onNext={() => undefined}\r\n >\r\n contenu\r\n </Drawer>\r\n );\r\n\r\n const previous = screen.getByRole(\"button\", { name: /Précédent/i });\r\n expect(previous).toBeDisabled();\r\n expect(previous).toHaveStyle(TACTILE_FLOOR);\r\n });\r\n});\r\n"],"mappings":";;AAAAA,OAAA;AACA,IAAAC,MAAA,GAAAD,OAAA;AAEA,IAAAE,OAAA,GAAAC,sBAAA,CAAAH,OAAA;AACA,IAAAI,OAAA,GAAAJ,OAAA;AAAmC,IAAAK,WAAA,GAAAL,OAAA;AAAA,SAAAG,uBAAAG,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAEnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAEA,MAAMG,WAAW,GAAG,GAAGC,cAAM,CAACC,UAAU,IAAI;AAC5C,MAAMC,aAAa,GAAG;EAAEC,QAAQ,EAAEJ,WAAW;EAAEK,SAAS,EAAEL;AAAY,CAAC;AAEvEM,QAAQ,CAAC,+CAA+C,EAAE,MAAM;EAC9DC,EAAE,CAAC,6CAA6C,EAAE,MAAM;IACtD,IAAAC,aAAM,eACJ,IAAAZ,WAAA,CAAAa,GAAA,EAAChB,OAAA,CAAAM,OAAM;MAACW,IAAI;MAACC,OAAO,EAAEA,CAAA,KAAMC,SAAU;MAACC,KAAK,EAAC,oBAAiB;MAAAC,QAAA,EAAC;IAE/D,CAAQ,CACV,CAAC;IAEDC,MAAM,CAACC,aAAM,CAACC,SAAS,CAAC,QAAQ,EAAE;MAAEC,IAAI,EAAE;IAAU,CAAC,CAAC,CAAC,CAACC,WAAW,CACjEhB,aACF,CAAC;EACH,CAAC,CAAC;;EAEF;AACF;EACEI,EAAE,CAAC,qDAAqD,EAAE,MAAM;IAC9D,IAAAC,aAAM,eACJ,IAAAZ,WAAA,CAAAa,GAAA,EAAChB,OAAA,CAAAM,OAAM;MACLW,IAAI;MACJC,OAAO,EAAEA,CAAA,KAAMC,SAAU;MACzBC,KAAK,EAAC,uBAAuB;MAC7BO,MAAM,EAAEA,CAAA,KAAMR,SAAU;MACxBS,MAAM,EAAEA,CAAA,KAAMT,SAAU;MACxBU,OAAO;MACPC,OAAO;MAAAT,QAAA,EACR;IAED,CAAQ,CACV,CAAC;IAEDC,MAAM,CAACC,aAAM,CAACC,SAAS,CAAC,QAAQ,EAAE;MAAEC,IAAI,EAAE;IAAa,CAAC,CAAC,CAAC,CAACC,WAAW,CACpEhB,aACF,CAAC;IACDY,MAAM,CAACC,aAAM,CAACC,SAAS,CAAC,QAAQ,EAAE;MAAEC,IAAI,EAAE;IAAW,CAAC,CAAC,CAAC,CAACC,WAAW,CAClEhB,aACF,CAAC;EACH,CAAC,CAAC;;EAEF;AACF;AACA;EACEI,EAAE,CAAC,sDAAsD,EAAE,MAAM;IAC/D,IAAAC,aAAM,eACJ,IAAAZ,WAAA,CAAAa,GAAA,EAAChB,OAAA,CAAAM,OAAM;MACLW,IAAI;MACJC,OAAO,EAAEA,CAAA,KAAMC,SAAU;MACzBC,KAAK,EAAC,gBAAgB;MACtBO,MAAM,EAAEA,CAAA,KAAMR,SAAU;MACxBS,MAAM,EAAEA,CAAA,KAAMT,SAAU;MAAAE,QAAA,EACzB;IAED,CAAQ,CACV,CAAC;IAED,MAAMU,QAAQ,GAAGR,aAAM,CAACC,SAAS,CAAC,QAAQ,EAAE;MAAEC,IAAI,EAAE;IAAa,CAAC,CAAC;IACnEH,MAAM,CAACS,QAAQ,CAAC,CAACC,YAAY,CAAC,CAAC;IAC/BV,MAAM,CAACS,QAAQ,CAAC,CAACL,WAAW,CAAChB,aAAa,CAAC;EAC7C,CAAC,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
|
|
@@ -1,15 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
|
|
4
3
|
require("@testing-library/jest-dom");
|
|
5
|
-
var
|
|
6
|
-
var _react2 = require("@testing-library/react");
|
|
4
|
+
var _react = require("@testing-library/react");
|
|
7
5
|
var _FieldError = _interopRequireDefault(require("../components/FieldError"));
|
|
8
6
|
var _Field = _interopRequireDefault(require("../components/Field"));
|
|
9
7
|
var _jsxRuntime = require("react/jsx-runtime");
|
|
10
|
-
function _interopRequireDefault(
|
|
11
|
-
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
12
|
-
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
8
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
13
9
|
/**
|
|
14
10
|
* FieldError — contract tests, including its integration into Field.
|
|
15
11
|
*
|
|
@@ -34,131 +30,164 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
|
|
|
34
30
|
* resolves neither CSS variables nor flexbox, so asserting them here would pass
|
|
35
31
|
* while the message rendered black and centred. Those live in
|
|
36
32
|
* FieldError.stories.tsx.
|
|
37
|
-
*/
|
|
38
|
-
|
|
39
|
-
|
|
33
|
+
*/
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Fixture : un champ minimal qui CONSOMME les props que `Field` diffuse.
|
|
37
|
+
*
|
|
38
|
+
* `Field` clone son enfant avec `error` et `fullWidth` — délibérément, parce
|
|
39
|
+
* que plusieurs entrées v2 (`NumberInput`, le `renderInput` de `Combobox`) ne
|
|
40
|
+
* sont pas de purs enfants MUI et lisent ces props directement. Un `<input />`
|
|
41
|
+
* NU les laisse donc filer jusqu'au DOM, et React émet deux avertissements à
|
|
42
|
+
* chaque rendu : « Received `true` for a non-boolean attribute `error` » et
|
|
43
|
+
* « React does not recognize the `fullWidth` prop on a DOM element ».
|
|
44
|
+
*
|
|
45
|
+
* Ce n'est PAS un défaut de `Field` : en production l'enfant est un `Input` ou
|
|
46
|
+
* un `Select` du socle, qui consomme ces props. Mais c'était six
|
|
47
|
+
* avertissements dans la sortie de la suite, au milieu desquels un vrai
|
|
48
|
+
* avertissement passe inaperçu — et un audit du socle a effectivement pris ce
|
|
49
|
+
* bruit pour une fuite de props en production avant de lire le composant.
|
|
50
|
+
*
|
|
51
|
+
* La fixture reste volontairement minimale : pas d'`Input` du socle ici, ce
|
|
52
|
+
* fichier teste le CÂBLAGE de `Field` et non l'intégration d'un composant. Elle
|
|
53
|
+
* ne fait qu'absorber les deux props destinées à un contrôle riche.
|
|
54
|
+
*/function BareInput({
|
|
55
|
+
error: _error,
|
|
56
|
+
fullWidth: _fullWidth,
|
|
57
|
+
...rest
|
|
58
|
+
}) {
|
|
59
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsx)("input", {
|
|
60
|
+
...rest
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
describe("FieldError — standalone", () => {
|
|
64
|
+
test("announces itself as an alert carrying the message", () => {
|
|
65
|
+
(0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_FieldError.default, {
|
|
40
66
|
children: "Ajoutez au moins un article avant de soumettre."
|
|
41
67
|
}));
|
|
42
|
-
expect(
|
|
68
|
+
expect(_react.screen.getByRole("alert")).toHaveTextContent("Ajoutez au moins un article avant de soumettre.");
|
|
43
69
|
});
|
|
44
|
-
test("forwards id so a host can wire its own aria-describedby",
|
|
45
|
-
(0,
|
|
70
|
+
test("forwards id so a host can wire its own aria-describedby", () => {
|
|
71
|
+
(0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_FieldError.default, {
|
|
46
72
|
id: "articles-error",
|
|
47
73
|
children: "Ajoutez au moins un article."
|
|
48
74
|
}));
|
|
49
|
-
expect(
|
|
75
|
+
expect(_react.screen.getByRole("alert")).toHaveAttribute("id", "articles-error");
|
|
50
76
|
});
|
|
51
|
-
test("omits id when none is supplied",
|
|
77
|
+
test("omits id when none is supplied", () => {
|
|
52
78
|
/* The list-level case usually has nothing to bind to. Emitting an empty or
|
|
53
79
|
* generated id would create a describedby target nobody references. */
|
|
54
|
-
(0,
|
|
80
|
+
(0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_FieldError.default, {
|
|
55
81
|
children: "Ajoutez au moins un article."
|
|
56
82
|
}));
|
|
57
|
-
expect(
|
|
83
|
+
expect(_react.screen.getByRole("alert")).not.toHaveAttribute("id");
|
|
58
84
|
});
|
|
59
|
-
test("the icon is hidden from assistive tech",
|
|
85
|
+
test("the icon is hidden from assistive tech", () => {
|
|
60
86
|
/* R-Ar.2 — the message IS the announcement; an announced glyph would double
|
|
61
87
|
* it. No semantic query reaches a role-less, name-less element, hence the
|
|
62
88
|
* testid the component exposes for exactly this assertion. */
|
|
63
|
-
(0,
|
|
89
|
+
(0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_FieldError.default, {
|
|
64
90
|
children: "Message"
|
|
65
91
|
}));
|
|
66
|
-
expect(
|
|
92
|
+
expect(_react.screen.getByTestId("fielderror-icon")).toHaveAttribute("aria-hidden", "true");
|
|
67
93
|
});
|
|
68
94
|
});
|
|
69
|
-
describe("FieldError — inside Field (the wiring that has no visual tell)",
|
|
70
|
-
test("the error becomes the control's accessible description",
|
|
71
|
-
(0,
|
|
95
|
+
describe("FieldError — inside Field (the wiring that has no visual tell)", () => {
|
|
96
|
+
test("the error becomes the control's accessible description", () => {
|
|
97
|
+
(0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_Field.default, {
|
|
72
98
|
label: "Num\xE9ro de titre",
|
|
73
99
|
error: "Le num\xE9ro est invalide. Format : AAAA-IM-NNNNN.",
|
|
74
|
-
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(
|
|
100
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(BareInput, {})
|
|
75
101
|
}));
|
|
76
|
-
expect(
|
|
102
|
+
expect(_react.screen.getByRole("textbox")).toHaveAccessibleDescription("Le numéro est invalide. Format : AAAA-IM-NNNNN.");
|
|
77
103
|
});
|
|
78
|
-
test("the control is marked invalid",
|
|
79
|
-
(0,
|
|
104
|
+
test("the control is marked invalid", () => {
|
|
105
|
+
(0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_Field.default, {
|
|
80
106
|
label: "Num\xE9ro",
|
|
81
107
|
error: "Invalide.",
|
|
82
|
-
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(
|
|
108
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(BareInput, {})
|
|
83
109
|
}));
|
|
84
110
|
// jest-dom's toBeInvalid reads aria-invalid — R-I.3.
|
|
85
|
-
expect(
|
|
111
|
+
expect(_react.screen.getByRole("textbox")).toBeInvalid();
|
|
86
112
|
});
|
|
87
|
-
test("a host-supplied aria-describedby is PRESERVED, not replaced",
|
|
113
|
+
test("a host-supplied aria-describedby is PRESERVED, not replaced", () => {
|
|
88
114
|
/* The merge is the fragile part. Overwriting instead of merging silently
|
|
89
115
|
* drops a consumer's external help text, and again nothing visual changes.
|
|
90
116
|
* Asserted with two order-independent regexes rather than one exact string,
|
|
91
117
|
* so the test does not encode which fragment Field puts first. */
|
|
92
|
-
(0,
|
|
118
|
+
(0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
|
|
93
119
|
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
|
|
94
120
|
id: "host-help",
|
|
95
121
|
children: "Format attendu : AAAA-IM-NNNNN."
|
|
96
|
-
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Field
|
|
122
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Field.default, {
|
|
97
123
|
label: "Num\xE9ro",
|
|
98
124
|
error: "Le num\xE9ro est incomplet.",
|
|
99
|
-
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(
|
|
125
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(BareInput, {
|
|
100
126
|
"aria-describedby": "host-help"
|
|
101
127
|
})
|
|
102
128
|
})]
|
|
103
129
|
}));
|
|
104
|
-
|
|
130
|
+
const input = _react.screen.getByRole("textbox");
|
|
105
131
|
expect(input).toHaveAccessibleDescription(/Format attendu/);
|
|
106
132
|
expect(input).toHaveAccessibleDescription(/incomplet/);
|
|
107
133
|
});
|
|
108
|
-
test("the hint is suppressed while an error is shown",
|
|
134
|
+
test("the hint is suppressed while an error is shown", () => {
|
|
109
135
|
/* Two competing descriptions under one field is worse than one. The hint
|
|
110
136
|
* returns once the error clears — verified by the rerender below. */
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
expect(
|
|
120
|
-
|
|
137
|
+
const {
|
|
138
|
+
rerender
|
|
139
|
+
} = (0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_Field.default, {
|
|
140
|
+
label: "Num\xE9ro",
|
|
141
|
+
hint: "Format : AAAA-IM-NNNNN",
|
|
142
|
+
error: "Le num\xE9ro est incomplet.",
|
|
143
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(BareInput, {})
|
|
144
|
+
}));
|
|
145
|
+
expect(_react.screen.getByRole("alert")).toHaveTextContent("Le numéro est incomplet.");
|
|
146
|
+
expect(_react.screen.queryByText("Format : AAAA-IM-NNNNN")).not.toBeInTheDocument();
|
|
147
|
+
rerender(/*#__PURE__*/(0, _jsxRuntime.jsx)(_Field.default, {
|
|
121
148
|
label: "Num\xE9ro",
|
|
122
149
|
hint: "Format : AAAA-IM-NNNNN",
|
|
123
|
-
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(
|
|
150
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(BareInput, {})
|
|
124
151
|
}));
|
|
125
|
-
expect(
|
|
152
|
+
expect(_react.screen.getByText("Format : AAAA-IM-NNNNN")).toBeInTheDocument();
|
|
126
153
|
});
|
|
127
154
|
});
|
|
128
|
-
describe("FieldError — live-region mounting contract",
|
|
129
|
-
test("no alert exists until an error appears",
|
|
155
|
+
describe("FieldError — live-region mounting contract", () => {
|
|
156
|
+
test("no alert exists until an error appears", () => {
|
|
130
157
|
/* THE contract. `role=\"alert\"` announces on INSERTION: an element mounted
|
|
131
158
|
* permanently with empty content announces nothing when it later fills, so
|
|
132
159
|
* a well-meaning refactor that always renders the container — to \"avoid
|
|
133
160
|
* layout shift\", say — silently kills the announcement while every pixel
|
|
134
161
|
* and every screenshot stays identical. */
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
162
|
+
const {
|
|
163
|
+
rerender
|
|
164
|
+
} = (0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_Field.default, {
|
|
165
|
+
label: "Num\xE9ro",
|
|
166
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(BareInput, {})
|
|
167
|
+
}));
|
|
168
|
+
expect(_react.screen.queryByRole("alert")).not.toBeInTheDocument();
|
|
169
|
+
rerender(/*#__PURE__*/(0, _jsxRuntime.jsx)(_Field.default, {
|
|
142
170
|
label: "Num\xE9ro",
|
|
143
171
|
error: "Le num\xE9ro est incomplet.",
|
|
144
|
-
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(
|
|
172
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(BareInput, {})
|
|
145
173
|
}));
|
|
146
|
-
expect(
|
|
174
|
+
expect(_react.screen.getByRole("alert")).toBeInTheDocument();
|
|
147
175
|
});
|
|
148
|
-
test("the alert unmounts when the error clears",
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
176
|
+
test("the alert unmounts when the error clears", () => {
|
|
177
|
+
const {
|
|
178
|
+
rerender
|
|
179
|
+
} = (0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_Field.default, {
|
|
180
|
+
label: "Num\xE9ro",
|
|
181
|
+
error: "Le num\xE9ro est incomplet.",
|
|
182
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(BareInput, {})
|
|
183
|
+
}));
|
|
184
|
+
expect(_react.screen.getByRole("alert")).toBeInTheDocument();
|
|
185
|
+
rerender(/*#__PURE__*/(0, _jsxRuntime.jsx)(_Field.default, {
|
|
157
186
|
label: "Num\xE9ro",
|
|
158
|
-
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(
|
|
187
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(BareInput, {})
|
|
159
188
|
}));
|
|
160
|
-
expect(
|
|
161
|
-
expect(
|
|
189
|
+
expect(_react.screen.queryByRole("alert")).not.toBeInTheDocument();
|
|
190
|
+
expect(_react.screen.getByRole("textbox")).not.toBeInvalid();
|
|
162
191
|
});
|
|
163
192
|
});
|
|
164
193
|
//# sourceMappingURL=FieldError.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FieldError.test.js","names":["require","React","_interopRequireWildcard","_react2","_FieldError","_interopRequireDefault","_Field","_jsxRuntime","obj","__esModule","_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","_typeof","cache","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","prototype","hasOwnProperty","call","desc","set","describe","test","render","jsx","children","expect","screen","getByRole","toHaveTextContent","id","toHaveAttribute","not","getByTestId","label","error","toHaveAccessibleDescription","toBeInvalid","jsxs","Fragment","input","_render","hint","rerender","queryByText","toBeInTheDocument","getByText","_render2","queryByRole","_render3"],"sources":["../../../src/lib/v2/__tests__/FieldError.test.tsx"],"sourcesContent":["import \"@testing-library/jest-dom\";\r\nimport * as React from \"react\";\r\nimport { render, screen } from \"@testing-library/react\";\r\nimport FieldError from \"../components/FieldError\";\r\nimport Field from \"../components/Field\";\r\n\r\n/**\r\n * FieldError — contract tests, including its integration into Field.\r\n *\r\n * WHY THIS FILE EXISTS\r\n * --------------------\r\n * §10.3 R-G.6 MUST. But the real reason is narrower and worth stating: the\r\n * contract this component carries is INVISIBLE. `Field` supplies an id, and that\r\n * id must reach the control's `aria-describedby` so a screen reader announces\r\n * the error when focus lands on the input. Break that wiring and NOTHING\r\n * changes: same pixels, same screenshot, same visual review — only a blind user\r\n * silently stops being told why their submit failed. There is no way to catch\r\n * that except by asserting it.\r\n *\r\n * The assertions below use `toHaveAccessibleDescription`, not id comparisons, on\r\n * purpose. It resolves aria-describedby to the text a screen reader would\r\n * actually announce, so the test states the USER-FACING outcome and stays true\r\n * if the id-generation scheme ever changes.\r\n *\r\n * NOT COVERED — deliberately\r\n * R-4.1's visual half (\"sous le champ, en rouge, avec icône\") and the\r\n * first-line icon alignment on a wrapping message are layout and colour. jsdom\r\n * resolves neither CSS variables nor flexbox, so asserting them here would pass\r\n * while the message rendered black and centred. Those live in\r\n * FieldError.stories.tsx.\r\n */\r\ndescribe(\"FieldError — standalone\", () => {\r\n test(\"announces itself as an alert carrying the message\", () => {\r\n render(<FieldError>Ajoutez au moins un article avant de soumettre.</FieldError>);\r\n expect(screen.getByRole(\"alert\")).toHaveTextContent(\r\n \"Ajoutez au moins un article avant de soumettre.\"\r\n );\r\n });\r\n\r\n test(\"forwards id so a host can wire its own aria-describedby\", () => {\r\n render(<FieldError id=\"articles-error\">Ajoutez au moins un article.</FieldError>);\r\n expect(screen.getByRole(\"alert\")).toHaveAttribute(\"id\", \"articles-error\");\r\n });\r\n\r\n test(\"omits id when none is supplied\", () => {\r\n /* The list-level case usually has nothing to bind to. Emitting an empty or\r\n * generated id would create a describedby target nobody references. */\r\n render(<FieldError>Ajoutez au moins un article.</FieldError>);\r\n expect(screen.getByRole(\"alert\")).not.toHaveAttribute(\"id\");\r\n });\r\n\r\n test(\"the icon is hidden from assistive tech\", () => {\r\n /* R-Ar.2 — the message IS the announcement; an announced glyph would double\r\n * it. No semantic query reaches a role-less, name-less element, hence the\r\n * testid the component exposes for exactly this assertion. */\r\n render(<FieldError>Message</FieldError>);\r\n expect(screen.getByTestId(\"fielderror-icon\")).toHaveAttribute(\"aria-hidden\", \"true\");\r\n });\r\n});\r\n\r\ndescribe(\"FieldError — inside Field (the wiring that has no visual tell)\", () => {\r\n test(\"the error becomes the control's accessible description\", () => {\r\n render(\r\n <Field label=\"Numéro de titre\" error=\"Le numéro est invalide. Format : AAAA-IM-NNNNN.\">\r\n <input />\r\n </Field>\r\n );\r\n\r\n expect(screen.getByRole(\"textbox\")).toHaveAccessibleDescription(\r\n \"Le numéro est invalide. Format : AAAA-IM-NNNNN.\"\r\n );\r\n });\r\n\r\n test(\"the control is marked invalid\", () => {\r\n render(\r\n <Field label=\"Numéro\" error=\"Invalide.\">\r\n <input />\r\n </Field>\r\n );\r\n // jest-dom's toBeInvalid reads aria-invalid — R-I.3.\r\n expect(screen.getByRole(\"textbox\")).toBeInvalid();\r\n });\r\n\r\n test(\"a host-supplied aria-describedby is PRESERVED, not replaced\", () => {\r\n /* The merge is the fragile part. Overwriting instead of merging silently\r\n * drops a consumer's external help text, and again nothing visual changes.\r\n * Asserted with two order-independent regexes rather than one exact string,\r\n * so the test does not encode which fragment Field puts first. */\r\n render(\r\n <>\r\n <span id=\"host-help\">Format attendu : AAAA-IM-NNNNN.</span>\r\n <Field label=\"Numéro\" error=\"Le numéro est incomplet.\">\r\n <input aria-describedby=\"host-help\" />\r\n </Field>\r\n </>\r\n );\r\n\r\n const input = screen.getByRole(\"textbox\");\r\n expect(input).toHaveAccessibleDescription(/Format attendu/);\r\n expect(input).toHaveAccessibleDescription(/incomplet/);\r\n });\r\n\r\n test(\"the hint is suppressed while an error is shown\", () => {\r\n /* Two competing descriptions under one field is worse than one. The hint\r\n * returns once the error clears — verified by the rerender below. */\r\n const { rerender } = render(\r\n <Field label=\"Numéro\" hint=\"Format : AAAA-IM-NNNNN\" error=\"Le numéro est incomplet.\">\r\n <input />\r\n </Field>\r\n );\r\n\r\n expect(screen.getByRole(\"alert\")).toHaveTextContent(\"Le numéro est incomplet.\");\r\n expect(screen.queryByText(\"Format : AAAA-IM-NNNNN\")).not.toBeInTheDocument();\r\n\r\n rerender(\r\n <Field label=\"Numéro\" hint=\"Format : AAAA-IM-NNNNN\">\r\n <input />\r\n </Field>\r\n );\r\n expect(screen.getByText(\"Format : AAAA-IM-NNNNN\")).toBeInTheDocument();\r\n });\r\n});\r\n\r\ndescribe(\"FieldError — live-region mounting contract\", () => {\r\n test(\"no alert exists until an error appears\", () => {\r\n /* THE contract. `role=\\\"alert\\\"` announces on INSERTION: an element mounted\r\n * permanently with empty content announces nothing when it later fills, so\r\n * a well-meaning refactor that always renders the container — to \\\"avoid\r\n * layout shift\\\", say — silently kills the announcement while every pixel\r\n * and every screenshot stays identical. */\r\n const { rerender } = render(\r\n <Field label=\"Numéro\">\r\n <input />\r\n </Field>\r\n );\r\n expect(screen.queryByRole(\"alert\")).not.toBeInTheDocument();\r\n\r\n rerender(\r\n <Field label=\"Numéro\" error=\"Le numéro est incomplet.\">\r\n <input />\r\n </Field>\r\n );\r\n expect(screen.getByRole(\"alert\")).toBeInTheDocument();\r\n });\r\n\r\n test(\"the alert unmounts when the error clears\", () => {\r\n const { rerender } = render(\r\n <Field label=\"Numéro\" error=\"Le numéro est incomplet.\">\r\n <input />\r\n </Field>\r\n );\r\n expect(screen.getByRole(\"alert\")).toBeInTheDocument();\r\n\r\n rerender(\r\n <Field label=\"Numéro\">\r\n <input />\r\n </Field>\r\n );\r\n expect(screen.queryByRole(\"alert\")).not.toBeInTheDocument();\r\n expect(screen.getByRole(\"textbox\")).not.toBeInvalid();\r\n });\r\n});\r\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"FieldError.test.js","names":["require","_react","_FieldError","_interopRequireDefault","_Field","_jsxRuntime","e","__esModule","default","BareInput","error","_error","fullWidth","_fullWidth","rest","jsx","describe","test","render","children","expect","screen","getByRole","toHaveTextContent","id","toHaveAttribute","not","getByTestId","label","toHaveAccessibleDescription","toBeInvalid","jsxs","Fragment","input","rerender","hint","queryByText","toBeInTheDocument","getByText","queryByRole"],"sources":["../../../src/lib/v2/__tests__/FieldError.test.tsx"],"sourcesContent":["import \"@testing-library/jest-dom\";\r\nimport { render, screen } from \"@testing-library/react\";\r\nimport type { InputHTMLAttributes } from \"react\";\r\nimport FieldError from \"../components/FieldError\";\r\nimport Field from \"../components/Field\";\r\n\r\n/**\r\n * FieldError — contract tests, including its integration into Field.\r\n *\r\n * WHY THIS FILE EXISTS\r\n * --------------------\r\n * §10.3 R-G.6 MUST. But the real reason is narrower and worth stating: the\r\n * contract this component carries is INVISIBLE. `Field` supplies an id, and that\r\n * id must reach the control's `aria-describedby` so a screen reader announces\r\n * the error when focus lands on the input. Break that wiring and NOTHING\r\n * changes: same pixels, same screenshot, same visual review — only a blind user\r\n * silently stops being told why their submit failed. There is no way to catch\r\n * that except by asserting it.\r\n *\r\n * The assertions below use `toHaveAccessibleDescription`, not id comparisons, on\r\n * purpose. It resolves aria-describedby to the text a screen reader would\r\n * actually announce, so the test states the USER-FACING outcome and stays true\r\n * if the id-generation scheme ever changes.\r\n *\r\n * NOT COVERED — deliberately\r\n * R-4.1's visual half (\"sous le champ, en rouge, avec icône\") and the\r\n * first-line icon alignment on a wrapping message are layout and colour. jsdom\r\n * resolves neither CSS variables nor flexbox, so asserting them here would pass\r\n * while the message rendered black and centred. Those live in\r\n * FieldError.stories.tsx.\r\n */\r\n\r\n/**\r\n * Fixture : un champ minimal qui CONSOMME les props que `Field` diffuse.\r\n *\r\n * `Field` clone son enfant avec `error` et `fullWidth` — délibérément, parce\r\n * que plusieurs entrées v2 (`NumberInput`, le `renderInput` de `Combobox`) ne\r\n * sont pas de purs enfants MUI et lisent ces props directement. Un `<input />`\r\n * NU les laisse donc filer jusqu'au DOM, et React émet deux avertissements à\r\n * chaque rendu : « Received `true` for a non-boolean attribute `error` » et\r\n * « React does not recognize the `fullWidth` prop on a DOM element ».\r\n *\r\n * Ce n'est PAS un défaut de `Field` : en production l'enfant est un `Input` ou\r\n * un `Select` du socle, qui consomme ces props. Mais c'était six\r\n * avertissements dans la sortie de la suite, au milieu desquels un vrai\r\n * avertissement passe inaperçu — et un audit du socle a effectivement pris ce\r\n * bruit pour une fuite de props en production avant de lire le composant.\r\n *\r\n * La fixture reste volontairement minimale : pas d'`Input` du socle ici, ce\r\n * fichier teste le CÂBLAGE de `Field` et non l'intégration d'un composant. Elle\r\n * ne fait qu'absorber les deux props destinées à un contrôle riche.\r\n */\r\nfunction BareInput({\r\n error: _error,\r\n fullWidth: _fullWidth,\r\n ...rest\r\n}: InputHTMLAttributes<HTMLInputElement> & {\r\n error?: boolean | undefined;\r\n fullWidth?: boolean | undefined;\r\n}) {\r\n return <input {...rest} />;\r\n}\r\n\r\ndescribe(\"FieldError — standalone\", () => {\r\n test(\"announces itself as an alert carrying the message\", () => {\r\n render(<FieldError>Ajoutez au moins un article avant de soumettre.</FieldError>);\r\n expect(screen.getByRole(\"alert\")).toHaveTextContent(\r\n \"Ajoutez au moins un article avant de soumettre.\"\r\n );\r\n });\r\n\r\n test(\"forwards id so a host can wire its own aria-describedby\", () => {\r\n render(<FieldError id=\"articles-error\">Ajoutez au moins un article.</FieldError>);\r\n expect(screen.getByRole(\"alert\")).toHaveAttribute(\"id\", \"articles-error\");\r\n });\r\n\r\n test(\"omits id when none is supplied\", () => {\r\n /* The list-level case usually has nothing to bind to. Emitting an empty or\r\n * generated id would create a describedby target nobody references. */\r\n render(<FieldError>Ajoutez au moins un article.</FieldError>);\r\n expect(screen.getByRole(\"alert\")).not.toHaveAttribute(\"id\");\r\n });\r\n\r\n test(\"the icon is hidden from assistive tech\", () => {\r\n /* R-Ar.2 — the message IS the announcement; an announced glyph would double\r\n * it. No semantic query reaches a role-less, name-less element, hence the\r\n * testid the component exposes for exactly this assertion. */\r\n render(<FieldError>Message</FieldError>);\r\n expect(screen.getByTestId(\"fielderror-icon\")).toHaveAttribute(\"aria-hidden\", \"true\");\r\n });\r\n});\r\n\r\ndescribe(\"FieldError — inside Field (the wiring that has no visual tell)\", () => {\r\n test(\"the error becomes the control's accessible description\", () => {\r\n render(\r\n <Field label=\"Numéro de titre\" error=\"Le numéro est invalide. Format : AAAA-IM-NNNNN.\">\r\n <BareInput />\r\n </Field>\r\n );\r\n\r\n expect(screen.getByRole(\"textbox\")).toHaveAccessibleDescription(\r\n \"Le numéro est invalide. Format : AAAA-IM-NNNNN.\"\r\n );\r\n });\r\n\r\n test(\"the control is marked invalid\", () => {\r\n render(\r\n <Field label=\"Numéro\" error=\"Invalide.\">\r\n <BareInput />\r\n </Field>\r\n );\r\n // jest-dom's toBeInvalid reads aria-invalid — R-I.3.\r\n expect(screen.getByRole(\"textbox\")).toBeInvalid();\r\n });\r\n\r\n test(\"a host-supplied aria-describedby is PRESERVED, not replaced\", () => {\r\n /* The merge is the fragile part. Overwriting instead of merging silently\r\n * drops a consumer's external help text, and again nothing visual changes.\r\n * Asserted with two order-independent regexes rather than one exact string,\r\n * so the test does not encode which fragment Field puts first. */\r\n render(\r\n <>\r\n <span id=\"host-help\">Format attendu : AAAA-IM-NNNNN.</span>\r\n <Field label=\"Numéro\" error=\"Le numéro est incomplet.\">\r\n <BareInput aria-describedby=\"host-help\" />\r\n </Field>\r\n </>\r\n );\r\n\r\n const input = screen.getByRole(\"textbox\");\r\n expect(input).toHaveAccessibleDescription(/Format attendu/);\r\n expect(input).toHaveAccessibleDescription(/incomplet/);\r\n });\r\n\r\n test(\"the hint is suppressed while an error is shown\", () => {\r\n /* Two competing descriptions under one field is worse than one. The hint\r\n * returns once the error clears — verified by the rerender below. */\r\n const { rerender } = render(\r\n <Field label=\"Numéro\" hint=\"Format : AAAA-IM-NNNNN\" error=\"Le numéro est incomplet.\">\r\n <BareInput />\r\n </Field>\r\n );\r\n\r\n expect(screen.getByRole(\"alert\")).toHaveTextContent(\"Le numéro est incomplet.\");\r\n expect(screen.queryByText(\"Format : AAAA-IM-NNNNN\")).not.toBeInTheDocument();\r\n\r\n rerender(\r\n <Field label=\"Numéro\" hint=\"Format : AAAA-IM-NNNNN\">\r\n <BareInput />\r\n </Field>\r\n );\r\n expect(screen.getByText(\"Format : AAAA-IM-NNNNN\")).toBeInTheDocument();\r\n });\r\n});\r\n\r\ndescribe(\"FieldError — live-region mounting contract\", () => {\r\n test(\"no alert exists until an error appears\", () => {\r\n /* THE contract. `role=\\\"alert\\\"` announces on INSERTION: an element mounted\r\n * permanently with empty content announces nothing when it later fills, so\r\n * a well-meaning refactor that always renders the container — to \\\"avoid\r\n * layout shift\\\", say — silently kills the announcement while every pixel\r\n * and every screenshot stays identical. */\r\n const { rerender } = render(\r\n <Field label=\"Numéro\">\r\n <BareInput />\r\n </Field>\r\n );\r\n expect(screen.queryByRole(\"alert\")).not.toBeInTheDocument();\r\n\r\n rerender(\r\n <Field label=\"Numéro\" error=\"Le numéro est incomplet.\">\r\n <BareInput />\r\n </Field>\r\n );\r\n expect(screen.getByRole(\"alert\")).toBeInTheDocument();\r\n });\r\n\r\n test(\"the alert unmounts when the error clears\", () => {\r\n const { rerender } = render(\r\n <Field label=\"Numéro\" error=\"Le numéro est incomplet.\">\r\n <BareInput />\r\n </Field>\r\n );\r\n expect(screen.getByRole(\"alert\")).toBeInTheDocument();\r\n\r\n rerender(\r\n <Field label=\"Numéro\">\r\n <BareInput />\r\n </Field>\r\n );\r\n expect(screen.queryByRole(\"alert\")).not.toBeInTheDocument();\r\n expect(screen.getByRole(\"textbox\")).not.toBeInvalid();\r\n });\r\n});\r\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
require("@testing-library/jest-dom");
|
|
4
|
+
var _react = require("@testing-library/react");
|
|
5
|
+
var _Field = _interopRequireDefault(require("../components/Field"));
|
|
6
|
+
var _Select = _interopRequireDefault(require("../components/Select"));
|
|
7
|
+
var _FieldHelp = _interopRequireDefault(require("../components/FieldHelp"));
|
|
8
|
+
var _jsxRuntime = require("react/jsx-runtime");
|
|
9
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
10
|
+
/**
|
|
11
|
+
* R-I.1 — the accessible NAME of a wrapped control.
|
|
12
|
+
*
|
|
13
|
+
* ── WHY THIS FILE EXISTS ─────────────────────────────────────────────
|
|
14
|
+
*
|
|
15
|
+
* `Field` associated its label through `htmlFor` / `id` only. That pair names
|
|
16
|
+
* LABELABLE elements — input, select, textarea, button, meter, output,
|
|
17
|
+
* progress — and nothing else. `Select` renders its visible surface as a
|
|
18
|
+
* `div[role="combobox"]`, so the pair resolved to NOTHING: the control had no
|
|
19
|
+
* accessible name at all, and a screen reader announced "combobox, collapsed"
|
|
20
|
+
* without ever saying which field it was.
|
|
21
|
+
*
|
|
22
|
+
* Nothing on screen showed it. The label was there, in the right place, in the
|
|
23
|
+
* right colour. Every filter drawer and every form of every module carried the
|
|
24
|
+
* defect, and it took an axe-core run in a consuming module
|
|
25
|
+
* (`autorisation-admis-pour-conforme-fe`, Area 10) to surface it as
|
|
26
|
+
* `aria-input-field-name`.
|
|
27
|
+
*
|
|
28
|
+
* The assertions below use `toHaveAccessibleName`, not attribute comparisons,
|
|
29
|
+
* on purpose: it resolves the whole name computation — `aria-labelledby`, then
|
|
30
|
+
* `aria-label`, then the `label[for]` pair — to the string a screen reader
|
|
31
|
+
* would announce. A test asserting `aria-labelledby="pui-xyz-l"` would pass
|
|
32
|
+
* even if that id pointed at an empty element.
|
|
33
|
+
*
|
|
34
|
+
* ── NOT COVERED, AND IT IS A REAL LIMITATION ────────────────────
|
|
35
|
+
*
|
|
36
|
+
* A consumer-supplied `aria-labelledby` on a NON-group child is not merged
|
|
37
|
+
* into the name. `aria-describedby` is (R-I.3), which makes the asymmetry
|
|
38
|
+
* surprising enough to state: the describedby merge happens in `Field`, while
|
|
39
|
+
* naming goes through MUI's `labelId`, and MUI does not concatenate the two.
|
|
40
|
+
* An earlier version of this file asserted the merge and failed with
|
|
41
|
+
* `Received: "Ville"` — the Field label alone.
|
|
42
|
+
*
|
|
43
|
+
* Nothing is silently lost: the field IS named, by its own label, which is the
|
|
44
|
+
* name a user should hear. A host needing an additional name should put it in
|
|
45
|
+
* `label` rather than reaching around the wrapper. Widening this would mean
|
|
46
|
+
* interpolating a token LIST into `labelId`, a prop documented as "the ID of an
|
|
47
|
+
* element" — clever, undocumented, and the kind of thing that breaks on a MUI
|
|
48
|
+
* minor.
|
|
49
|
+
*/
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Fixture : un champ minimal qui CONSOMME les props diffusées par `Field`.
|
|
53
|
+
*
|
|
54
|
+
* Même raison que dans `FieldError.test.tsx` : un `<input />` nu laisse filer
|
|
55
|
+
* `error` et `fullWidth` jusqu'au DOM et produit deux avertissements React par
|
|
56
|
+
* rendu, au milieu desquels un VRAI avertissement passerait inaperçu.
|
|
57
|
+
*/function BareInput({
|
|
58
|
+
error: _error,
|
|
59
|
+
fullWidth: _fullWidth,
|
|
60
|
+
...rest
|
|
61
|
+
}) {
|
|
62
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsx)("input", {
|
|
63
|
+
...rest
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
const noop = () => undefined;
|
|
67
|
+
const OPTIONS = [{
|
|
68
|
+
value: "1",
|
|
69
|
+
label: "Casablanca"
|
|
70
|
+
}, {
|
|
71
|
+
value: "2",
|
|
72
|
+
label: "Rabat"
|
|
73
|
+
}];
|
|
74
|
+
describe("Field — nom accessible du contrôle", () => {
|
|
75
|
+
/* The case that already worked: a native, labelable child. Asserted so the
|
|
76
|
+
* fix cannot regress it — adding `aria-labelledby` everywhere had to leave
|
|
77
|
+
* this one announcing exactly the same string. */
|
|
78
|
+
it("nomme un contrôle natif (déjà couvert par htmlFor)", () => {
|
|
79
|
+
(0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_Field.default, {
|
|
80
|
+
label: "R\xE9f\xE9rence de la demande",
|
|
81
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(BareInput, {})
|
|
82
|
+
}));
|
|
83
|
+
expect(_react.screen.getByRole("textbox")).toHaveAccessibleName("Référence de la demande");
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
/* THE DEFECT. A div-based control cannot be named by htmlFor/id. */
|
|
87
|
+
it("nomme un Select, dont la surface est un div[role=combobox]", () => {
|
|
88
|
+
(0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_Field.default, {
|
|
89
|
+
label: "Ville de l'unit\xE9",
|
|
90
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Select.default, {
|
|
91
|
+
value: "",
|
|
92
|
+
onChange: noop,
|
|
93
|
+
options: OPTIONS
|
|
94
|
+
})
|
|
95
|
+
}));
|
|
96
|
+
expect(_react.screen.getByRole("combobox")).toHaveAccessibleName("Ville de l'unité");
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
/* The required asterisk is `aria-hidden`, so it must not leak into the name:
|
|
100
|
+
* "Ville de l'unité *" is not what a user should hear. */
|
|
101
|
+
it("n'inclut pas l'astérisque des champs requis", () => {
|
|
102
|
+
(0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_Field.default, {
|
|
103
|
+
label: "Ville de l'unit\xE9",
|
|
104
|
+
required: true,
|
|
105
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Select.default, {
|
|
106
|
+
value: "",
|
|
107
|
+
onChange: noop,
|
|
108
|
+
options: OPTIONS
|
|
109
|
+
})
|
|
110
|
+
}));
|
|
111
|
+
expect(_react.screen.getByRole("combobox")).toHaveAccessibleName("Ville de l'unité");
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* The reason `labelId` sits on a span around the TEXT and not on the label
|
|
116
|
+
* element: `aria-labelledby` resolves to its target's text content, and a
|
|
117
|
+
* help button inside the label carries its own accessible name. Anchoring on
|
|
118
|
+
* the whole label would announce "Ville de l'unité Aide sur ce champ".
|
|
119
|
+
*
|
|
120
|
+
* This also fixes the `htmlFor` path, which had the same flaw.
|
|
121
|
+
*/
|
|
122
|
+
it("n'inclut pas le nom du bouton d'aide du libellé", () => {
|
|
123
|
+
(0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_Field.default, {
|
|
124
|
+
label: "Ville de l'unit\xE9",
|
|
125
|
+
helpAdornment: /*#__PURE__*/(0, _jsxRuntime.jsx)(_FieldHelp.default, {
|
|
126
|
+
ariaLabel: "Aide sur ce champ",
|
|
127
|
+
children: "Texte d'aide."
|
|
128
|
+
}),
|
|
129
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Select.default, {
|
|
130
|
+
value: "",
|
|
131
|
+
onChange: noop,
|
|
132
|
+
options: OPTIONS
|
|
133
|
+
})
|
|
134
|
+
}));
|
|
135
|
+
expect(_react.screen.getByRole("combobox")).toHaveAccessibleName("Ville de l'unité");
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
/* Group mode keeps working: the label is a plain span there, and the group is
|
|
139
|
+
* named by `aria-labelledby` — which DOES reach its target, because it is the
|
|
140
|
+
* child's own root that carries `role="group"`. */
|
|
141
|
+
it("nomme un groupe ARIA", () => {
|
|
142
|
+
(0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_Field.default, {
|
|
143
|
+
label: "Type de contr\xF4le",
|
|
144
|
+
group: true,
|
|
145
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
|
|
146
|
+
role: "group",
|
|
147
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("input", {
|
|
148
|
+
type: "radio",
|
|
149
|
+
name: "t",
|
|
150
|
+
"aria-label": "Documentaire"
|
|
151
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsx)("input", {
|
|
152
|
+
type: "radio",
|
|
153
|
+
name: "t",
|
|
154
|
+
"aria-label": "Physique"
|
|
155
|
+
})]
|
|
156
|
+
})
|
|
157
|
+
}));
|
|
158
|
+
expect(_react.screen.getByRole("group")).toHaveAccessibleName("Type de contrôle");
|
|
159
|
+
});
|
|
160
|
+
});
|
|
161
|
+
//# sourceMappingURL=FieldNaming.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FieldNaming.test.js","names":["require","_react","_Field","_interopRequireDefault","_Select","_FieldHelp","_jsxRuntime","e","__esModule","default","BareInput","error","_error","fullWidth","_fullWidth","rest","jsx","noop","undefined","OPTIONS","value","label","describe","it","render","children","expect","screen","getByRole","toHaveAccessibleName","onChange","options","required","helpAdornment","ariaLabel","group","jsxs","role","type","name"],"sources":["../../../src/lib/v2/__tests__/FieldNaming.test.tsx"],"sourcesContent":["import \"@testing-library/jest-dom\";\r\nimport { render, screen } from \"@testing-library/react\";\r\nimport type { InputHTMLAttributes } from \"react\";\r\n\r\nimport Field from \"../components/Field\";\r\nimport Select from \"../components/Select\";\r\nimport FieldHelp from \"../components/FieldHelp\";\r\n\r\n/**\r\n * R-I.1 — the accessible NAME of a wrapped control.\r\n *\r\n * ── WHY THIS FILE EXISTS ─────────────────────────────────────────────\r\n *\r\n * `Field` associated its label through `htmlFor` / `id` only. That pair names\r\n * LABELABLE elements — input, select, textarea, button, meter, output,\r\n * progress — and nothing else. `Select` renders its visible surface as a\r\n * `div[role=\"combobox\"]`, so the pair resolved to NOTHING: the control had no\r\n * accessible name at all, and a screen reader announced \"combobox, collapsed\"\r\n * without ever saying which field it was.\r\n *\r\n * Nothing on screen showed it. The label was there, in the right place, in the\r\n * right colour. Every filter drawer and every form of every module carried the\r\n * defect, and it took an axe-core run in a consuming module\r\n * (`autorisation-admis-pour-conforme-fe`, Area 10) to surface it as\r\n * `aria-input-field-name`.\r\n *\r\n * The assertions below use `toHaveAccessibleName`, not attribute comparisons,\r\n * on purpose: it resolves the whole name computation — `aria-labelledby`, then\r\n * `aria-label`, then the `label[for]` pair — to the string a screen reader\r\n * would announce. A test asserting `aria-labelledby=\"pui-xyz-l\"` would pass\r\n * even if that id pointed at an empty element.\r\n *\r\n * ── NOT COVERED, AND IT IS A REAL LIMITATION ────────────────────\r\n *\r\n * A consumer-supplied `aria-labelledby` on a NON-group child is not merged\r\n * into the name. `aria-describedby` is (R-I.3), which makes the asymmetry\r\n * surprising enough to state: the describedby merge happens in `Field`, while\r\n * naming goes through MUI's `labelId`, and MUI does not concatenate the two.\r\n * An earlier version of this file asserted the merge and failed with\r\n * `Received: \"Ville\"` — the Field label alone.\r\n *\r\n * Nothing is silently lost: the field IS named, by its own label, which is the\r\n * name a user should hear. A host needing an additional name should put it in\r\n * `label` rather than reaching around the wrapper. Widening this would mean\r\n * interpolating a token LIST into `labelId`, a prop documented as \"the ID of an\r\n * element\" — clever, undocumented, and the kind of thing that breaks on a MUI\r\n * minor.\r\n */\r\n\r\n/**\r\n * Fixture : un champ minimal qui CONSOMME les props diffusées par `Field`.\r\n *\r\n * Même raison que dans `FieldError.test.tsx` : un `<input />` nu laisse filer\r\n * `error` et `fullWidth` jusqu'au DOM et produit deux avertissements React par\r\n * rendu, au milieu desquels un VRAI avertissement passerait inaperçu.\r\n */\r\nfunction BareInput({\r\n error: _error,\r\n fullWidth: _fullWidth,\r\n ...rest\r\n}: InputHTMLAttributes<HTMLInputElement> & {\r\n error?: boolean | undefined;\r\n fullWidth?: boolean | undefined;\r\n}) {\r\n return <input {...rest} />;\r\n}\r\n\r\nconst noop = () => undefined;\r\n\r\nconst OPTIONS = [\r\n { value: \"1\", label: \"Casablanca\" },\r\n { value: \"2\", label: \"Rabat\" },\r\n];\r\n\r\ndescribe(\"Field — nom accessible du contrôle\", () => {\r\n /* The case that already worked: a native, labelable child. Asserted so the\r\n * fix cannot regress it — adding `aria-labelledby` everywhere had to leave\r\n * this one announcing exactly the same string. */\r\n it(\"nomme un contrôle natif (déjà couvert par htmlFor)\", () => {\r\n render(\r\n <Field label=\"Référence de la demande\">\r\n <BareInput />\r\n </Field>\r\n );\r\n\r\n expect(screen.getByRole(\"textbox\")).toHaveAccessibleName(\r\n \"Référence de la demande\"\r\n );\r\n });\r\n\r\n /* THE DEFECT. A div-based control cannot be named by htmlFor/id. */\r\n it(\"nomme un Select, dont la surface est un div[role=combobox]\", () => {\r\n render(\r\n <Field label=\"Ville de l'unité\">\r\n <Select value=\"\" onChange={noop} options={OPTIONS} />\r\n </Field>\r\n );\r\n\r\n expect(screen.getByRole(\"combobox\")).toHaveAccessibleName(\r\n \"Ville de l'unité\"\r\n );\r\n });\r\n\r\n /* The required asterisk is `aria-hidden`, so it must not leak into the name:\r\n * \"Ville de l'unité *\" is not what a user should hear. */\r\n it(\"n'inclut pas l'astérisque des champs requis\", () => {\r\n render(\r\n <Field label=\"Ville de l'unité\" required>\r\n <Select value=\"\" onChange={noop} options={OPTIONS} />\r\n </Field>\r\n );\r\n\r\n expect(screen.getByRole(\"combobox\")).toHaveAccessibleName(\r\n \"Ville de l'unité\"\r\n );\r\n });\r\n\r\n /**\r\n * The reason `labelId` sits on a span around the TEXT and not on the label\r\n * element: `aria-labelledby` resolves to its target's text content, and a\r\n * help button inside the label carries its own accessible name. Anchoring on\r\n * the whole label would announce \"Ville de l'unité Aide sur ce champ\".\r\n *\r\n * This also fixes the `htmlFor` path, which had the same flaw.\r\n */\r\n it(\"n'inclut pas le nom du bouton d'aide du libellé\", () => {\r\n render(\r\n <Field\r\n label=\"Ville de l'unité\"\r\n helpAdornment={<FieldHelp ariaLabel=\"Aide sur ce champ\">Texte d'aide.</FieldHelp>}\r\n >\r\n <Select value=\"\" onChange={noop} options={OPTIONS} />\r\n </Field>\r\n );\r\n\r\n expect(screen.getByRole(\"combobox\")).toHaveAccessibleName(\r\n \"Ville de l'unité\"\r\n );\r\n });\r\n\r\n /* Group mode keeps working: the label is a plain span there, and the group is\r\n * named by `aria-labelledby` — which DOES reach its target, because it is the\r\n * child's own root that carries `role=\"group\"`. */\r\n it(\"nomme un groupe ARIA\", () => {\r\n render(\r\n <Field label=\"Type de contrôle\" group>\r\n <div role=\"group\">\r\n <input type=\"radio\" name=\"t\" aria-label=\"Documentaire\" />\r\n <input type=\"radio\" name=\"t\" aria-label=\"Physique\" />\r\n </div>\r\n </Field>\r\n );\r\n\r\n expect(screen.getByRole(\"group\")).toHaveAccessibleName(\"Type de contrôle\");\r\n });\r\n});\r\n"],"mappings":"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","ignoreList":[]}
|