@portnet/ui 6.0.2 → 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 +652 -0
- package/dist/esm/index.js +72 -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 -38
- 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 +11 -11
- package/dist/esm/v2/__tests__/FieldWidth.test.js.map +1 -1
- package/dist/esm/v2/__tests__/FileCard.test.js +18 -17
- package/dist/esm/v2/__tests__/FileCard.test.js.map +1 -1
- package/dist/esm/v2/__tests__/FormikCheckbox.test.js +87 -179
- package/dist/esm/v2/__tests__/FormikCheckbox.test.js.map +1 -1
- package/dist/esm/v2/__tests__/FormikDateTimePicker.test.js +32 -44
- package/dist/esm/v2/__tests__/FormikDateTimePicker.test.js.map +1 -1
- 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 +118 -199
- package/dist/esm/v2/__tests__/FormikRadioGroup.test.js.map +1 -1
- package/dist/esm/v2/__tests__/MobileRowCard.test.js +44 -42
- 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 -21
- 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 +81 -86
- 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 +155 -59
- 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 +37 -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 +2 -3
- 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 +15 -17
- 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 +29 -39
- package/dist/esm/v2/patterns/FormikCheckbox.js.map +1 -1
- 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 -69
- package/dist/esm/v2/patterns/FormikCombobox.js.map +1 -1
- package/dist/esm/v2/patterns/FormikDatePicker.js +44 -58
- package/dist/esm/v2/patterns/FormikDatePicker.js.map +1 -1
- package/dist/esm/v2/patterns/FormikDateTimePicker.js +44 -58
- package/dist/esm/v2/patterns/FormikDateTimePicker.js.map +1 -1
- 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 -53
- package/dist/esm/v2/patterns/FormikInput.js.map +1 -1
- package/dist/esm/v2/patterns/FormikRadioGroup.js +39 -51
- package/dist/esm/v2/patterns/FormikRadioGroup.js.map +1 -1
- 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 -87
- package/dist/esm/v2/patterns/FormikSelect.js.map +1 -1
- package/dist/esm/v2/patterns/FormikTextarea.js +30 -46
- package/dist/esm/v2/patterns/FormikTextarea.js.map +1 -1
- package/dist/esm/v2/patterns/KeyboardShortcutsHelp.js +53 -71
- 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 +27 -22
- package/dist/esm/v2/patterns/RowFavoriteToggle.js.map +1 -1
- 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 +6 -8
- package/dist/esm/v2/patterns/_pickerSerialisation.js.map +1 -1
- 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 +152 -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 +28 -34
- package/dist/esm/v2/personalization/capabilities/gridPreferences.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 +17 -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 +7 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +110 -49
- 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 +82 -49
- 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 +23 -25
- package/dist/v2/__tests__/FieldWidth.test.js.map +1 -1
- package/dist/v2/__tests__/FileCard.test.js +29 -28
- package/dist/v2/__tests__/FileCard.test.js.map +1 -1
- package/dist/v2/__tests__/FormikCheckbox.test.js +90 -183
- package/dist/v2/__tests__/FormikCheckbox.test.js.map +1 -1
- package/dist/v2/__tests__/FormikDateTimePicker.test.js +38 -48
- package/dist/v2/__tests__/FormikDateTimePicker.test.js.map +1 -1
- 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 +123 -204
- package/dist/v2/__tests__/FormikRadioGroup.test.js.map +1 -1
- package/dist/v2/__tests__/MobileRowCard.test.js +63 -61
- 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 +23 -27
- 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.js +84 -91
- 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 +62 -4
- package/dist/v2/components/Field.d.ts.map +1 -1
- package/dist/v2/components/Field.js +169 -70
- 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 +40 -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.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.js +22 -23
- 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.js +36 -45
- package/dist/v2/patterns/FormikCheckbox.js.map +1 -1
- 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.js +55 -72
- package/dist/v2/patterns/FormikCombobox.js.map +1 -1
- package/dist/v2/patterns/FormikDatePicker.js +50 -64
- package/dist/v2/patterns/FormikDatePicker.js.map +1 -1
- package/dist/v2/patterns/FormikDateTimePicker.js +50 -64
- package/dist/v2/patterns/FormikDateTimePicker.js.map +1 -1
- 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.js +45 -58
- package/dist/v2/patterns/FormikInput.js.map +1 -1
- package/dist/v2/patterns/FormikRadioGroup.js +45 -56
- package/dist/v2/patterns/FormikRadioGroup.js.map +1 -1
- 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.js +70 -92
- package/dist/v2/patterns/FormikSelect.js.map +1 -1
- package/dist/v2/patterns/FormikTextarea.js +35 -51
- package/dist/v2/patterns/FormikTextarea.js.map +1 -1
- package/dist/v2/patterns/KeyboardShortcutsHelp.js +60 -80
- 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 +6 -0
- package/dist/v2/patterns/RowFavoriteToggle.d.ts.map +1 -1
- package/dist/v2/patterns/RowFavoriteToggle.js +38 -30
- package/dist/v2/patterns/RowFavoriteToggle.js.map +1 -1
- 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.js +9 -10
- package/dist/v2/patterns/_pickerSerialisation.js.map +1 -1
- 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 +160 -0
- package/dist/v2/patterns/index.d.ts.map +1 -1
- package/dist/v2/patterns/index.js +157 -79
- 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.js +31 -36
- package/dist/v2/personalization/capabilities/gridPreferences.js.map +1 -1
- package/dist/v2/personalization/capabilities/index.js +12 -12
- 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 +16 -0
- package/dist/v2/personalization/index.d.ts.map +1 -1
- package/dist/v2/personalization/index.js +30 -23
- 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,150 @@
|
|
|
1
|
+
import "@testing-library/jest-dom";
|
|
2
|
+
import { fireEvent, render, screen } from "@testing-library/react";
|
|
3
|
+
import userEvent from "@testing-library/user-event";
|
|
4
|
+
import DataGrid from "../patterns/DataGrid";
|
|
5
|
+
import { buildRowActions } from "../patterns/rowActions";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* DataGrid — la cellule d'actions contient ses propres événements.
|
|
9
|
+
*
|
|
10
|
+
* CE QUE CE FICHIER PROTÈGE, ET POURQUOI IL EXISTE
|
|
11
|
+
* ------------------------------------------------
|
|
12
|
+
* §Row Interaction fait du clic de ligne l'ouverture du drawer d'aperçu, et
|
|
13
|
+
* des actions de ligne l'affordance COMPLÉMENTAIRE. Les deux cohabitent donc
|
|
14
|
+
* sur toute grille de listing de la plateforme — et la cellule d'actions est
|
|
15
|
+
* un descendant de la ligne cliquable.
|
|
16
|
+
*
|
|
17
|
+
* Sans containment, activer une action déclenche AUSSI le clic de ligne :
|
|
18
|
+
* l'utilisateur obtient son action et, par-dessus, un drawer qui s'ouvre. Ce
|
|
19
|
+
* n'est pas rattrapable au niveau de l'action — `buildRowActions` décrit une
|
|
20
|
+
* action comme `onClick: (row) => void` et n'expose délibérément pas
|
|
21
|
+
* l'événement DOM, parce qu'un descripteur métier n'a pas à connaître la
|
|
22
|
+
* propagation. La cellule est le seul endroit qui tient l'invariant pour
|
|
23
|
+
* TOUTES les formes : le kebab, la rangée d'icônes, et n'importe quel
|
|
24
|
+
* renderer `rowActions` écrit par un hôte.
|
|
25
|
+
*
|
|
26
|
+
* Relevé par l'audit Area 3 d'`addm-fe`, dont les deux listings avaient écrit
|
|
27
|
+
* leur rangée d'icônes à la main précisément pour appeler `stopPropagation()`
|
|
28
|
+
* bouton par bouton — ce qui faisait passer l'adoption de `buildRowActions`
|
|
29
|
+
* pour une régression.
|
|
30
|
+
*
|
|
31
|
+
* Le test couvre les DEUX formes (`iconsUpTo` et le kebab) et les deux
|
|
32
|
+
* chemins (souris et clavier), parce que la ligne écoute `onClick` ET
|
|
33
|
+
* `onKeyDown`.
|
|
34
|
+
*
|
|
35
|
+
* POURQUOI `fireEvent` POUR LA SOURIS ET `userEvent` POUR LE CLAVIER
|
|
36
|
+
* -----------------------------------------------------------------
|
|
37
|
+
* `ROW_ACTIONS_OVERLAY_SX` porte `pointerEvents: "none"` et ne passe à `auto`
|
|
38
|
+
* que sous `tr:hover`, `tr:focus-within` ou `@media (pointer: coarse)`. jsdom
|
|
39
|
+
* ne résout ni les pseudo-classes d'état ni les media queries — même limite
|
|
40
|
+
* que celle documentée dans `FieldWidth.test.tsx` — donc l'overlay y reste
|
|
41
|
+
* inerte et `user-event` REFUSE de simuler un pointeur dessus. Son refus est
|
|
42
|
+
* correct : il modèle un utilisateur, et un utilisateur ne peut pas cliquer un
|
|
43
|
+
* élément à `pointer-events: none`. Ce que jsdom ne peut pas modéliser, c'est
|
|
44
|
+
* le survol qui précède ce clic dans un vrai navigateur.
|
|
45
|
+
*
|
|
46
|
+
* Neutraliser la garde (`pointerEventsCheck: Never`) serait prétendre simuler
|
|
47
|
+
* un utilisateur tout en désactivant la vérification qui rend la simulation
|
|
48
|
+
* crédible. `fireEvent.click` ne prétend rien : il émet un `MouseEvent` qui
|
|
49
|
+
* BULLE, ce qui est exactement et uniquement ce que ces deux tests examinent.
|
|
50
|
+
* Le chemin clavier, lui, ne passe pas par le hit-testing du pointeur, donc
|
|
51
|
+
* `userEvent` y reste l'outil juste — et c'est le chemin où la ligne écoute
|
|
52
|
+
* `onKeyDown`.
|
|
53
|
+
*
|
|
54
|
+
* Ce que ce fichier ne prouve donc PAS : que l'overlay est atteignable à la
|
|
55
|
+
* souris. Ça se vérifie dans la story, au survol.
|
|
56
|
+
*/
|
|
57
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
58
|
+
const LIGNES = [{
|
|
59
|
+
id: 1,
|
|
60
|
+
reference: "2025-IM-0042"
|
|
61
|
+
}];
|
|
62
|
+
const COLONNES = [{
|
|
63
|
+
key: "reference",
|
|
64
|
+
header: "Référence"
|
|
65
|
+
}];
|
|
66
|
+
function renderGrille(options) {
|
|
67
|
+
const descripteurs = [{
|
|
68
|
+
id: "consulter",
|
|
69
|
+
label: "Consulter la ligne",
|
|
70
|
+
onClick: () => options.onAction()
|
|
71
|
+
}];
|
|
72
|
+
return render(/*#__PURE__*/_jsx(DataGrid, {
|
|
73
|
+
rows: LIGNES,
|
|
74
|
+
columns: COLONNES,
|
|
75
|
+
ariaLabel: "Lignes de test",
|
|
76
|
+
onRowClick: options.onRowClick,
|
|
77
|
+
rowActions: buildRowActions(descripteurs, "Actions sur la ligne", options.iconsUpTo !== undefined ? {
|
|
78
|
+
iconsUpTo: options.iconsUpTo
|
|
79
|
+
} : undefined)
|
|
80
|
+
}));
|
|
81
|
+
}
|
|
82
|
+
describe("DataGrid — une action de ligne ne déclenche pas le clic de ligne", () => {
|
|
83
|
+
test("rangée d'icônes, à la souris", () => {
|
|
84
|
+
const onRowClick = jest.fn();
|
|
85
|
+
const onAction = jest.fn();
|
|
86
|
+
renderGrille({
|
|
87
|
+
onRowClick,
|
|
88
|
+
onAction,
|
|
89
|
+
iconsUpTo: 3
|
|
90
|
+
});
|
|
91
|
+
fireEvent.click(screen.getByRole("button", {
|
|
92
|
+
name: "Consulter la ligne"
|
|
93
|
+
}));
|
|
94
|
+
expect(onAction).toHaveBeenCalledTimes(1);
|
|
95
|
+
/* L'assertion qui compte : l'action a eu lieu, la ligne n'a pas été
|
|
96
|
+
* ouverte. Avant le containment, les deux se déclenchaient. */
|
|
97
|
+
expect(onRowClick).not.toHaveBeenCalled();
|
|
98
|
+
});
|
|
99
|
+
test("rangée d'icônes, au clavier", async () => {
|
|
100
|
+
const onRowClick = jest.fn();
|
|
101
|
+
const onAction = jest.fn();
|
|
102
|
+
renderGrille({
|
|
103
|
+
onRowClick,
|
|
104
|
+
onAction,
|
|
105
|
+
iconsUpTo: 3
|
|
106
|
+
});
|
|
107
|
+
const bouton = screen.getByRole("button", {
|
|
108
|
+
name: "Consulter la ligne"
|
|
109
|
+
});
|
|
110
|
+
bouton.focus();
|
|
111
|
+
await userEvent.keyboard("{Enter}");
|
|
112
|
+
|
|
113
|
+
/* La ligne porte AUSSI un `onKeyDown` (Enter / Espace → onRowClick), donc
|
|
114
|
+
* le clavier est un second chemin de fuite, distinct de la souris. */
|
|
115
|
+
expect(onAction).toHaveBeenCalledTimes(1);
|
|
116
|
+
expect(onRowClick).not.toHaveBeenCalled();
|
|
117
|
+
});
|
|
118
|
+
test("kebab : ouvrir le menu n'ouvre pas la ligne", () => {
|
|
119
|
+
const onRowClick = jest.fn();
|
|
120
|
+
const onAction = jest.fn();
|
|
121
|
+
/* Sans `iconsUpTo`, le renderer rend `OverflowMenu` — son déclencheur est
|
|
122
|
+
* dans la même position que les boutons d'icône. */
|
|
123
|
+
renderGrille({
|
|
124
|
+
onRowClick,
|
|
125
|
+
onAction
|
|
126
|
+
});
|
|
127
|
+
fireEvent.click(screen.getByRole("button", {
|
|
128
|
+
name: "Actions sur la ligne"
|
|
129
|
+
}));
|
|
130
|
+
expect(onRowClick).not.toHaveBeenCalled();
|
|
131
|
+
});
|
|
132
|
+
test("le clic de ligne fonctionne toujours ailleurs dans la ligne", async () => {
|
|
133
|
+
const onRowClick = jest.fn();
|
|
134
|
+
const onAction = jest.fn();
|
|
135
|
+
renderGrille({
|
|
136
|
+
onRowClick,
|
|
137
|
+
onAction,
|
|
138
|
+
iconsUpTo: 3
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
/* Le containment doit être local à la cellule d'actions : une cellule de
|
|
142
|
+
* données reste le déclencheur du clic de ligne. Sans cette assertion, un
|
|
143
|
+
* containment posé trop haut (sur la ligne) passerait les trois tests
|
|
144
|
+
* ci-dessus tout en cassant §Row Interaction. */
|
|
145
|
+
await userEvent.click(screen.getByText("2025-IM-0042"));
|
|
146
|
+
expect(onRowClick).toHaveBeenCalledTimes(1);
|
|
147
|
+
expect(onAction).not.toHaveBeenCalled();
|
|
148
|
+
});
|
|
149
|
+
});
|
|
150
|
+
//# sourceMappingURL=DataGridRowActionsPropagation.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DataGridRowActionsPropagation.test.js","names":["fireEvent","render","screen","userEvent","DataGrid","buildRowActions","jsx","_jsx","LIGNES","id","reference","COLONNES","key","header","renderGrille","options","descripteurs","label","onClick","onAction","rows","columns","ariaLabel","onRowClick","rowActions","iconsUpTo","undefined","describe","test","jest","fn","click","getByRole","name","expect","toHaveBeenCalledTimes","not","toHaveBeenCalled","bouton","focus","keyboard","getByText"],"sources":["../../../../src/lib/v2/__tests__/DataGridRowActionsPropagation.test.tsx"],"sourcesContent":["import \"@testing-library/jest-dom\";\r\nimport { fireEvent, render, screen } from \"@testing-library/react\";\r\nimport userEvent from \"@testing-library/user-event\";\r\nimport DataGrid from \"../patterns/DataGrid\";\r\nimport { buildRowActions } from \"../patterns/rowActions\";\r\nimport type { RowActionDescriptor } from \"../patterns/rowActions\";\r\n\r\n/**\r\n * DataGrid — la cellule d'actions contient ses propres événements.\r\n *\r\n * CE QUE CE FICHIER PROTÈGE, ET POURQUOI IL EXISTE\r\n * ------------------------------------------------\r\n * §Row Interaction fait du clic de ligne l'ouverture du drawer d'aperçu, et\r\n * des actions de ligne l'affordance COMPLÉMENTAIRE. Les deux cohabitent donc\r\n * sur toute grille de listing de la plateforme — et la cellule d'actions est\r\n * un descendant de la ligne cliquable.\r\n *\r\n * Sans containment, activer une action déclenche AUSSI le clic de ligne :\r\n * l'utilisateur obtient son action et, par-dessus, un drawer qui s'ouvre. Ce\r\n * n'est pas rattrapable au niveau de l'action — `buildRowActions` décrit une\r\n * action comme `onClick: (row) => void` et n'expose délibérément pas\r\n * l'événement DOM, parce qu'un descripteur métier n'a pas à connaître la\r\n * propagation. La cellule est le seul endroit qui tient l'invariant pour\r\n * TOUTES les formes : le kebab, la rangée d'icônes, et n'importe quel\r\n * renderer `rowActions` écrit par un hôte.\r\n *\r\n * Relevé par l'audit Area 3 d'`addm-fe`, dont les deux listings avaient écrit\r\n * leur rangée d'icônes à la main précisément pour appeler `stopPropagation()`\r\n * bouton par bouton — ce qui faisait passer l'adoption de `buildRowActions`\r\n * pour une régression.\r\n *\r\n * Le test couvre les DEUX formes (`iconsUpTo` et le kebab) et les deux\r\n * chemins (souris et clavier), parce que la ligne écoute `onClick` ET\r\n * `onKeyDown`.\r\n *\r\n * POURQUOI `fireEvent` POUR LA SOURIS ET `userEvent` POUR LE CLAVIER\r\n * -----------------------------------------------------------------\r\n * `ROW_ACTIONS_OVERLAY_SX` porte `pointerEvents: \"none\"` et ne passe à `auto`\r\n * que sous `tr:hover`, `tr:focus-within` ou `@media (pointer: coarse)`. jsdom\r\n * ne résout ni les pseudo-classes d'état ni les media queries — même limite\r\n * que celle documentée dans `FieldWidth.test.tsx` — donc l'overlay y reste\r\n * inerte et `user-event` REFUSE de simuler un pointeur dessus. Son refus est\r\n * correct : il modèle un utilisateur, et un utilisateur ne peut pas cliquer un\r\n * élément à `pointer-events: none`. Ce que jsdom ne peut pas modéliser, c'est\r\n * le survol qui précède ce clic dans un vrai navigateur.\r\n *\r\n * Neutraliser la garde (`pointerEventsCheck: Never`) serait prétendre simuler\r\n * un utilisateur tout en désactivant la vérification qui rend la simulation\r\n * crédible. `fireEvent.click` ne prétend rien : il émet un `MouseEvent` qui\r\n * BULLE, ce qui est exactement et uniquement ce que ces deux tests examinent.\r\n * Le chemin clavier, lui, ne passe pas par le hit-testing du pointeur, donc\r\n * `userEvent` y reste l'outil juste — et c'est le chemin où la ligne écoute\r\n * `onKeyDown`.\r\n *\r\n * Ce que ce fichier ne prouve donc PAS : que l'overlay est atteignable à la\r\n * souris. Ça se vérifie dans la story, au survol.\r\n */\r\n\r\ninterface Ligne {\r\n id: number;\r\n reference: string;\r\n}\r\n\r\nconst LIGNES: Ligne[] = [{ id: 1, reference: \"2025-IM-0042\" }];\r\n\r\nconst COLONNES = [{ key: \"reference\", header: \"Référence\" }];\r\n\r\nfunction renderGrille(options: {\r\n onRowClick: () => void;\r\n onAction: () => void;\r\n iconsUpTo?: number;\r\n}) {\r\n const descripteurs: RowActionDescriptor<Ligne>[] = [\r\n {\r\n id: \"consulter\",\r\n label: \"Consulter la ligne\",\r\n onClick: () => options.onAction(),\r\n },\r\n ];\r\n\r\n return render(\r\n <DataGrid<Ligne>\r\n rows={LIGNES}\r\n columns={COLONNES}\r\n ariaLabel=\"Lignes de test\"\r\n onRowClick={options.onRowClick}\r\n rowActions={buildRowActions(\r\n descripteurs,\r\n \"Actions sur la ligne\",\r\n options.iconsUpTo !== undefined\r\n ? { iconsUpTo: options.iconsUpTo }\r\n : undefined\r\n )}\r\n />\r\n );\r\n}\r\n\r\ndescribe(\"DataGrid — une action de ligne ne déclenche pas le clic de ligne\", () => {\r\n test(\"rangée d'icônes, à la souris\", () => {\r\n const onRowClick = jest.fn();\r\n const onAction = jest.fn();\r\n renderGrille({ onRowClick, onAction, iconsUpTo: 3 });\r\n\r\n fireEvent.click(\r\n screen.getByRole(\"button\", { name: \"Consulter la ligne\" })\r\n );\r\n\r\n expect(onAction).toHaveBeenCalledTimes(1);\r\n /* L'assertion qui compte : l'action a eu lieu, la ligne n'a pas été\r\n * ouverte. Avant le containment, les deux se déclenchaient. */\r\n expect(onRowClick).not.toHaveBeenCalled();\r\n });\r\n\r\n test(\"rangée d'icônes, au clavier\", async () => {\r\n const onRowClick = jest.fn();\r\n const onAction = jest.fn();\r\n renderGrille({ onRowClick, onAction, iconsUpTo: 3 });\r\n\r\n const bouton = screen.getByRole(\"button\", { name: \"Consulter la ligne\" });\r\n bouton.focus();\r\n await userEvent.keyboard(\"{Enter}\");\r\n\r\n /* La ligne porte AUSSI un `onKeyDown` (Enter / Espace → onRowClick), donc\r\n * le clavier est un second chemin de fuite, distinct de la souris. */\r\n expect(onAction).toHaveBeenCalledTimes(1);\r\n expect(onRowClick).not.toHaveBeenCalled();\r\n });\r\n\r\n test(\"kebab : ouvrir le menu n'ouvre pas la ligne\", () => {\r\n const onRowClick = jest.fn();\r\n const onAction = jest.fn();\r\n /* Sans `iconsUpTo`, le renderer rend `OverflowMenu` — son déclencheur est\r\n * dans la même position que les boutons d'icône. */\r\n renderGrille({ onRowClick, onAction });\r\n\r\n fireEvent.click(\r\n screen.getByRole(\"button\", { name: \"Actions sur la ligne\" })\r\n );\r\n\r\n expect(onRowClick).not.toHaveBeenCalled();\r\n });\r\n\r\n test(\"le clic de ligne fonctionne toujours ailleurs dans la ligne\", async () => {\r\n const onRowClick = jest.fn();\r\n const onAction = jest.fn();\r\n renderGrille({ onRowClick, onAction, iconsUpTo: 3 });\r\n\r\n /* Le containment doit être local à la cellule d'actions : une cellule de\r\n * données reste le déclencheur du clic de ligne. Sans cette assertion, un\r\n * containment posé trop haut (sur la ligne) passerait les trois tests\r\n * ci-dessus tout en cassant §Row Interaction. */\r\n await userEvent.click(screen.getByText(\"2025-IM-0042\"));\r\n\r\n expect(onRowClick).toHaveBeenCalledTimes(1);\r\n expect(onAction).not.toHaveBeenCalled();\r\n });\r\n});\r\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import "@testing-library/jest-dom";
|
|
2
|
+
import { render, screen } from "@testing-library/react";
|
|
3
|
+
import Drawer from "../components/Drawer";
|
|
4
|
+
import { layout } from "../tokens";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* R-7.4 / WCAG 2.5.5 — the drawer header's icon-only buttons.
|
|
8
|
+
*
|
|
9
|
+
* `tokens/density` states the rule this file guards, in its own words: "Icon-
|
|
10
|
+
* only buttons MUST set min-width/min-height to `tactileMin`", because the
|
|
11
|
+
* VISUAL height of a button may drop below 44px in the tighter density tiers
|
|
12
|
+
* while the hit area may not. The drawer header's three buttons — prev, next,
|
|
13
|
+
* close — were `IconButton size="small"` with only a colour rule: about 34px,
|
|
14
|
+
* ten short of the floor this library imposes on its hosts.
|
|
15
|
+
*
|
|
16
|
+
* The gap stayed invisible while item navigation was rarely wired, since a
|
|
17
|
+
* filter panel renders the close button alone. A module that equips its
|
|
18
|
+
* preview drawers with onPrev/onNext exposes three per drawer — which is what
|
|
19
|
+
* surfaced it.
|
|
20
|
+
*
|
|
21
|
+
* ── WHY `toHaveStyle` AND NOT `element.style` ────────────────────────
|
|
22
|
+
*
|
|
23
|
+
* The first version of this file asserted on `element.style.minWidth` and
|
|
24
|
+
* failed on all three cases with an empty string — correctly. `sx` compiles to
|
|
25
|
+
* an EMOTION CLASS, never to an inline style attribute, so the inline bag is
|
|
26
|
+
* empty by construction. `toHaveStyle` resolves the declaration through
|
|
27
|
+
* `getComputedStyle`, which jsdom does cascade from the injected stylesheet.
|
|
28
|
+
*
|
|
29
|
+
* What this verifies is therefore the DECLARED floor, not a rendered box:
|
|
30
|
+
* jsdom performs no layout, so no assertion here could prove the button
|
|
31
|
+
* measures 44px on screen. The declaration is what the rule asks for, and it
|
|
32
|
+
* is what a refactor of this header would silently drop.
|
|
33
|
+
*/
|
|
34
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
35
|
+
const TACTILE_MIN = `${layout.tactileMin}px`;
|
|
36
|
+
const TACTILE_FLOOR = {
|
|
37
|
+
minWidth: TACTILE_MIN,
|
|
38
|
+
minHeight: TACTILE_MIN
|
|
39
|
+
};
|
|
40
|
+
describe("Drawer — cibles tactiles de l'en-tête (R-7.4)", () => {
|
|
41
|
+
it("plancher de 44px sur le bouton de fermeture", () => {
|
|
42
|
+
render(/*#__PURE__*/_jsx(Drawer, {
|
|
43
|
+
open: true,
|
|
44
|
+
onClose: () => undefined,
|
|
45
|
+
title: "Filtres avanc\xE9s",
|
|
46
|
+
children: "contenu"
|
|
47
|
+
}));
|
|
48
|
+
expect(screen.getByRole("button", {
|
|
49
|
+
name: /Fermer/i
|
|
50
|
+
})).toHaveStyle(TACTILE_FLOOR);
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
/* Les deux flèches ne sont rendues que si un gestionnaire est fourni
|
|
54
|
+
(navigation opt-in, D-A10.2) — c'est ce qui a longtemps masqué l'écart. */
|
|
55
|
+
it("plancher de 44px sur les deux flèches de navigation", () => {
|
|
56
|
+
render(/*#__PURE__*/_jsx(Drawer, {
|
|
57
|
+
open: true,
|
|
58
|
+
onClose: () => undefined,
|
|
59
|
+
title: "Dossier 2026-IM-00042",
|
|
60
|
+
onPrev: () => undefined,
|
|
61
|
+
onNext: () => undefined,
|
|
62
|
+
hasPrev: true,
|
|
63
|
+
hasNext: true,
|
|
64
|
+
children: "contenu"
|
|
65
|
+
}));
|
|
66
|
+
expect(screen.getByRole("button", {
|
|
67
|
+
name: /Précédent/i
|
|
68
|
+
})).toHaveStyle(TACTILE_FLOOR);
|
|
69
|
+
expect(screen.getByRole("button", {
|
|
70
|
+
name: /Suivant/i
|
|
71
|
+
})).toHaveStyle(TACTILE_FLOOR);
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
/* Le plancher vaut aussi pour un bouton DÉSACTIVÉ : il reste une cible que
|
|
75
|
+
l'utilisateur va viser, et le rendre plus petit que les autres ferait
|
|
76
|
+
sauter la rangée d'un tiroir à l'autre. */
|
|
77
|
+
it("plancher maintenu quand la navigation est désactivée", () => {
|
|
78
|
+
render(/*#__PURE__*/_jsx(Drawer, {
|
|
79
|
+
open: true,
|
|
80
|
+
onClose: () => undefined,
|
|
81
|
+
title: "Dossier unique",
|
|
82
|
+
onPrev: () => undefined,
|
|
83
|
+
onNext: () => undefined,
|
|
84
|
+
children: "contenu"
|
|
85
|
+
}));
|
|
86
|
+
const previous = screen.getByRole("button", {
|
|
87
|
+
name: /Précédent/i
|
|
88
|
+
});
|
|
89
|
+
expect(previous).toBeDisabled();
|
|
90
|
+
expect(previous).toHaveStyle(TACTILE_FLOOR);
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
//# sourceMappingURL=DrawerTactileTargets.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DrawerTactileTargets.test.js","names":["render","screen","Drawer","layout","jsx","_jsx","TACTILE_MIN","tactileMin","TACTILE_FLOOR","minWidth","minHeight","describe","it","open","onClose","undefined","title","children","expect","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":"AAAA,OAAO,2BAA2B;AAClC,SAASA,MAAM,EAAEC,MAAM,QAAQ,wBAAwB;AAEvD,OAAOC,MAAM,MAAM,sBAAsB;AACzC,SAASC,MAAM,QAAQ,WAAW;;AAElC;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;AA3BA,SAAAC,GAAA,IAAAC,IAAA;AA6BA,MAAMC,WAAW,GAAG,GAAGH,MAAM,CAACI,UAAU,IAAI;AAC5C,MAAMC,aAAa,GAAG;EAAEC,QAAQ,EAAEH,WAAW;EAAEI,SAAS,EAAEJ;AAAY,CAAC;AAEvEK,QAAQ,CAAC,+CAA+C,EAAE,MAAM;EAC9DC,EAAE,CAAC,6CAA6C,EAAE,MAAM;IACtDZ,MAAM,cACJK,IAAA,CAACH,MAAM;MAACW,IAAI;MAACC,OAAO,EAAEA,CAAA,KAAMC,SAAU;MAACC,KAAK,EAAC,oBAAiB;MAAAC,QAAA,EAAC;IAE/D,CAAQ,CACV,CAAC;IAEDC,MAAM,CAACjB,MAAM,CAACkB,SAAS,CAAC,QAAQ,EAAE;MAAEC,IAAI,EAAE;IAAU,CAAC,CAAC,CAAC,CAACC,WAAW,CACjEb,aACF,CAAC;EACH,CAAC,CAAC;;EAEF;AACF;EACEI,EAAE,CAAC,qDAAqD,EAAE,MAAM;IAC9DZ,MAAM,cACJK,IAAA,CAACH,MAAM;MACLW,IAAI;MACJC,OAAO,EAAEA,CAAA,KAAMC,SAAU;MACzBC,KAAK,EAAC,uBAAuB;MAC7BM,MAAM,EAAEA,CAAA,KAAMP,SAAU;MACxBQ,MAAM,EAAEA,CAAA,KAAMR,SAAU;MACxBS,OAAO;MACPC,OAAO;MAAAR,QAAA,EACR;IAED,CAAQ,CACV,CAAC;IAEDC,MAAM,CAACjB,MAAM,CAACkB,SAAS,CAAC,QAAQ,EAAE;MAAEC,IAAI,EAAE;IAAa,CAAC,CAAC,CAAC,CAACC,WAAW,CACpEb,aACF,CAAC;IACDU,MAAM,CAACjB,MAAM,CAACkB,SAAS,CAAC,QAAQ,EAAE;MAAEC,IAAI,EAAE;IAAW,CAAC,CAAC,CAAC,CAACC,WAAW,CAClEb,aACF,CAAC;EACH,CAAC,CAAC;;EAEF;AACF;AACA;EACEI,EAAE,CAAC,sDAAsD,EAAE,MAAM;IAC/DZ,MAAM,cACJK,IAAA,CAACH,MAAM;MACLW,IAAI;MACJC,OAAO,EAAEA,CAAA,KAAMC,SAAU;MACzBC,KAAK,EAAC,gBAAgB;MACtBM,MAAM,EAAEA,CAAA,KAAMP,SAAU;MACxBQ,MAAM,EAAEA,CAAA,KAAMR,SAAU;MAAAE,QAAA,EACzB;IAED,CAAQ,CACV,CAAC;IAED,MAAMS,QAAQ,GAAGzB,MAAM,CAACkB,SAAS,CAAC,QAAQ,EAAE;MAAEC,IAAI,EAAE;IAAa,CAAC,CAAC;IACnEF,MAAM,CAACQ,QAAQ,CAAC,CAACC,YAAY,CAAC,CAAC;IAC/BT,MAAM,CAACQ,QAAQ,CAAC,CAACL,WAAW,CAACb,aAAa,CAAC;EAC7C,CAAC,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
|
|
@@ -28,22 +28,52 @@ import Field from "../components/Field";
|
|
|
28
28
|
* while the message rendered black and centred. Those live in
|
|
29
29
|
* FieldError.stories.tsx.
|
|
30
30
|
*/
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Fixture : un champ minimal qui CONSOMME les props que `Field` diffuse.
|
|
34
|
+
*
|
|
35
|
+
* `Field` clone son enfant avec `error` et `fullWidth` — délibérément, parce
|
|
36
|
+
* que plusieurs entrées v2 (`NumberInput`, le `renderInput` de `Combobox`) ne
|
|
37
|
+
* sont pas de purs enfants MUI et lisent ces props directement. Un `<input />`
|
|
38
|
+
* NU les laisse donc filer jusqu'au DOM, et React émet deux avertissements à
|
|
39
|
+
* chaque rendu : « Received `true` for a non-boolean attribute `error` » et
|
|
40
|
+
* « React does not recognize the `fullWidth` prop on a DOM element ».
|
|
41
|
+
*
|
|
42
|
+
* Ce n'est PAS un défaut de `Field` : en production l'enfant est un `Input` ou
|
|
43
|
+
* un `Select` du socle, qui consomme ces props. Mais c'était six
|
|
44
|
+
* avertissements dans la sortie de la suite, au milieu desquels un vrai
|
|
45
|
+
* avertissement passe inaperçu — et un audit du socle a effectivement pris ce
|
|
46
|
+
* bruit pour une fuite de props en production avant de lire le composant.
|
|
47
|
+
*
|
|
48
|
+
* La fixture reste volontairement minimale : pas d'`Input` du socle ici, ce
|
|
49
|
+
* fichier teste le CÂBLAGE de `Field` et non l'intégration d'un composant. Elle
|
|
50
|
+
* ne fait qu'absorber les deux props destinées à un contrôle riche.
|
|
51
|
+
*/
|
|
31
52
|
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
32
|
-
|
|
33
|
-
|
|
53
|
+
function BareInput({
|
|
54
|
+
error: _error,
|
|
55
|
+
fullWidth: _fullWidth,
|
|
56
|
+
...rest
|
|
57
|
+
}) {
|
|
58
|
+
return /*#__PURE__*/_jsx("input", {
|
|
59
|
+
...rest
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
describe("FieldError — standalone", () => {
|
|
63
|
+
test("announces itself as an alert carrying the message", () => {
|
|
34
64
|
render(/*#__PURE__*/_jsx(FieldError, {
|
|
35
65
|
children: "Ajoutez au moins un article avant de soumettre."
|
|
36
66
|
}));
|
|
37
67
|
expect(screen.getByRole("alert")).toHaveTextContent("Ajoutez au moins un article avant de soumettre.");
|
|
38
68
|
});
|
|
39
|
-
test("forwards id so a host can wire its own aria-describedby",
|
|
69
|
+
test("forwards id so a host can wire its own aria-describedby", () => {
|
|
40
70
|
render(/*#__PURE__*/_jsx(FieldError, {
|
|
41
71
|
id: "articles-error",
|
|
42
72
|
children: "Ajoutez au moins un article."
|
|
43
73
|
}));
|
|
44
74
|
expect(screen.getByRole("alert")).toHaveAttribute("id", "articles-error");
|
|
45
75
|
});
|
|
46
|
-
test("omits id when none is supplied",
|
|
76
|
+
test("omits id when none is supplied", () => {
|
|
47
77
|
/* The list-level case usually has nothing to bind to. Emitting an empty or
|
|
48
78
|
* generated id would create a describedby target nobody references. */
|
|
49
79
|
render(/*#__PURE__*/_jsx(FieldError, {
|
|
@@ -51,7 +81,7 @@ describe("FieldError — standalone", function () {
|
|
|
51
81
|
}));
|
|
52
82
|
expect(screen.getByRole("alert")).not.toHaveAttribute("id");
|
|
53
83
|
});
|
|
54
|
-
test("the icon is hidden from assistive tech",
|
|
84
|
+
test("the icon is hidden from assistive tech", () => {
|
|
55
85
|
/* R-Ar.2 — the message IS the announcement; an announced glyph would double
|
|
56
86
|
* it. No semantic query reaches a role-less, name-less element, hence the
|
|
57
87
|
* testid the component exposes for exactly this assertion. */
|
|
@@ -61,25 +91,25 @@ describe("FieldError — standalone", function () {
|
|
|
61
91
|
expect(screen.getByTestId("fielderror-icon")).toHaveAttribute("aria-hidden", "true");
|
|
62
92
|
});
|
|
63
93
|
});
|
|
64
|
-
describe("FieldError — inside Field (the wiring that has no visual tell)",
|
|
65
|
-
test("the error becomes the control's accessible description",
|
|
94
|
+
describe("FieldError — inside Field (the wiring that has no visual tell)", () => {
|
|
95
|
+
test("the error becomes the control's accessible description", () => {
|
|
66
96
|
render(/*#__PURE__*/_jsx(Field, {
|
|
67
97
|
label: "Num\xE9ro de titre",
|
|
68
98
|
error: "Le num\xE9ro est invalide. Format : AAAA-IM-NNNNN.",
|
|
69
|
-
children: /*#__PURE__*/_jsx(
|
|
99
|
+
children: /*#__PURE__*/_jsx(BareInput, {})
|
|
70
100
|
}));
|
|
71
101
|
expect(screen.getByRole("textbox")).toHaveAccessibleDescription("Le numéro est invalide. Format : AAAA-IM-NNNNN.");
|
|
72
102
|
});
|
|
73
|
-
test("the control is marked invalid",
|
|
103
|
+
test("the control is marked invalid", () => {
|
|
74
104
|
render(/*#__PURE__*/_jsx(Field, {
|
|
75
105
|
label: "Num\xE9ro",
|
|
76
106
|
error: "Invalide.",
|
|
77
|
-
children: /*#__PURE__*/_jsx(
|
|
107
|
+
children: /*#__PURE__*/_jsx(BareInput, {})
|
|
78
108
|
}));
|
|
79
109
|
// jest-dom's toBeInvalid reads aria-invalid — R-I.3.
|
|
80
110
|
expect(screen.getByRole("textbox")).toBeInvalid();
|
|
81
111
|
});
|
|
82
|
-
test("a host-supplied aria-describedby is PRESERVED, not replaced",
|
|
112
|
+
test("a host-supplied aria-describedby is PRESERVED, not replaced", () => {
|
|
83
113
|
/* The merge is the fragile part. Overwriting instead of merging silently
|
|
84
114
|
* drops a consumer's external help text, and again nothing visual changes.
|
|
85
115
|
* Asserted with two order-independent regexes rather than one exact string,
|
|
@@ -91,66 +121,69 @@ describe("FieldError — inside Field (the wiring that has no visual tell)", fun
|
|
|
91
121
|
}), /*#__PURE__*/_jsx(Field, {
|
|
92
122
|
label: "Num\xE9ro",
|
|
93
123
|
error: "Le num\xE9ro est incomplet.",
|
|
94
|
-
children: /*#__PURE__*/_jsx(
|
|
124
|
+
children: /*#__PURE__*/_jsx(BareInput, {
|
|
95
125
|
"aria-describedby": "host-help"
|
|
96
126
|
})
|
|
97
127
|
})]
|
|
98
128
|
}));
|
|
99
|
-
|
|
129
|
+
const input = screen.getByRole("textbox");
|
|
100
130
|
expect(input).toHaveAccessibleDescription(/Format attendu/);
|
|
101
131
|
expect(input).toHaveAccessibleDescription(/incomplet/);
|
|
102
132
|
});
|
|
103
|
-
test("the hint is suppressed while an error is shown",
|
|
133
|
+
test("the hint is suppressed while an error is shown", () => {
|
|
104
134
|
/* Two competing descriptions under one field is worse than one. The hint
|
|
105
135
|
* returns once the error clears — verified by the rerender below. */
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
136
|
+
const {
|
|
137
|
+
rerender
|
|
138
|
+
} = render(/*#__PURE__*/_jsx(Field, {
|
|
139
|
+
label: "Num\xE9ro",
|
|
140
|
+
hint: "Format : AAAA-IM-NNNNN",
|
|
141
|
+
error: "Le num\xE9ro est incomplet.",
|
|
142
|
+
children: /*#__PURE__*/_jsx(BareInput, {})
|
|
143
|
+
}));
|
|
113
144
|
expect(screen.getByRole("alert")).toHaveTextContent("Le numéro est incomplet.");
|
|
114
145
|
expect(screen.queryByText("Format : AAAA-IM-NNNNN")).not.toBeInTheDocument();
|
|
115
146
|
rerender(/*#__PURE__*/_jsx(Field, {
|
|
116
147
|
label: "Num\xE9ro",
|
|
117
148
|
hint: "Format : AAAA-IM-NNNNN",
|
|
118
|
-
children: /*#__PURE__*/_jsx(
|
|
149
|
+
children: /*#__PURE__*/_jsx(BareInput, {})
|
|
119
150
|
}));
|
|
120
151
|
expect(screen.getByText("Format : AAAA-IM-NNNNN")).toBeInTheDocument();
|
|
121
152
|
});
|
|
122
153
|
});
|
|
123
|
-
describe("FieldError — live-region mounting contract",
|
|
124
|
-
test("no alert exists until an error appears",
|
|
154
|
+
describe("FieldError — live-region mounting contract", () => {
|
|
155
|
+
test("no alert exists until an error appears", () => {
|
|
125
156
|
/* THE contract. `role=\"alert\"` announces on INSERTION: an element mounted
|
|
126
157
|
* permanently with empty content announces nothing when it later fills, so
|
|
127
158
|
* a well-meaning refactor that always renders the container — to \"avoid
|
|
128
159
|
* layout shift\", say — silently kills the announcement while every pixel
|
|
129
160
|
* and every screenshot stays identical. */
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
161
|
+
const {
|
|
162
|
+
rerender
|
|
163
|
+
} = render(/*#__PURE__*/_jsx(Field, {
|
|
164
|
+
label: "Num\xE9ro",
|
|
165
|
+
children: /*#__PURE__*/_jsx(BareInput, {})
|
|
166
|
+
}));
|
|
135
167
|
expect(screen.queryByRole("alert")).not.toBeInTheDocument();
|
|
136
168
|
rerender(/*#__PURE__*/_jsx(Field, {
|
|
137
169
|
label: "Num\xE9ro",
|
|
138
170
|
error: "Le num\xE9ro est incomplet.",
|
|
139
|
-
children: /*#__PURE__*/_jsx(
|
|
171
|
+
children: /*#__PURE__*/_jsx(BareInput, {})
|
|
140
172
|
}));
|
|
141
173
|
expect(screen.getByRole("alert")).toBeInTheDocument();
|
|
142
174
|
});
|
|
143
|
-
test("the alert unmounts when the error clears",
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
175
|
+
test("the alert unmounts when the error clears", () => {
|
|
176
|
+
const {
|
|
177
|
+
rerender
|
|
178
|
+
} = render(/*#__PURE__*/_jsx(Field, {
|
|
179
|
+
label: "Num\xE9ro",
|
|
180
|
+
error: "Le num\xE9ro est incomplet.",
|
|
181
|
+
children: /*#__PURE__*/_jsx(BareInput, {})
|
|
182
|
+
}));
|
|
150
183
|
expect(screen.getByRole("alert")).toBeInTheDocument();
|
|
151
184
|
rerender(/*#__PURE__*/_jsx(Field, {
|
|
152
185
|
label: "Num\xE9ro",
|
|
153
|
-
children: /*#__PURE__*/_jsx(
|
|
186
|
+
children: /*#__PURE__*/_jsx(BareInput, {})
|
|
154
187
|
}));
|
|
155
188
|
expect(screen.queryByRole("alert")).not.toBeInTheDocument();
|
|
156
189
|
expect(screen.getByRole("textbox")).not.toBeInvalid();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FieldError.test.js","names":["render","screen","FieldError","Field","jsx","_jsx","Fragment","_Fragment","jsxs","_jsxs","describe","test","children","expect","getByRole","toHaveTextContent","id","toHaveAttribute","not","getByTestId","label","error","toHaveAccessibleDescription","toBeInvalid","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 { 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":["render","screen","FieldError","Field","jsx","_jsx","Fragment","_Fragment","jsxs","_jsxs","BareInput","error","_error","fullWidth","_fullWidth","rest","describe","test","children","expect","getByRole","toHaveTextContent","id","toHaveAttribute","not","getByTestId","label","toHaveAccessibleDescription","toBeInvalid","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":"AAAA,OAAO,2BAA2B;AAClC,SAASA,MAAM,EAAEC,MAAM,QAAQ,wBAAwB;AAEvD,OAAOC,UAAU,MAAM,0BAA0B;AACjD,OAAOC,KAAK,MAAM,qBAAqB;;AAEvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAnBA,SAAAC,GAAA,IAAAC,IAAA,EAAAC,QAAA,IAAAC,SAAA,EAAAC,IAAA,IAAAC,KAAA;AAoBA,SAASC,SAASA,CAAC;EACjBC,KAAK,EAAEC,MAAM;EACbC,SAAS,EAAEC,UAAU;EACrB,GAAGC;AAIL,CAAC,EAAE;EACD,oBAAOV,IAAA;IAAA,GAAWU;EAAI,CAAG,CAAC;AAC5B;AAEAC,QAAQ,CAAC,yBAAyB,EAAE,MAAM;EACxCC,IAAI,CAAC,mDAAmD,EAAE,MAAM;IAC9DjB,MAAM,cAACK,IAAA,CAACH,UAAU;MAAAgB,QAAA,EAAC;IAA+C,CAAY,CAAC,CAAC;IAChFC,MAAM,CAAClB,MAAM,CAACmB,SAAS,CAAC,OAAO,CAAC,CAAC,CAACC,iBAAiB,CACjD,iDACF,CAAC;EACH,CAAC,CAAC;EAEFJ,IAAI,CAAC,yDAAyD,EAAE,MAAM;IACpEjB,MAAM,cAACK,IAAA,CAACH,UAAU;MAACoB,EAAE,EAAC,gBAAgB;MAAAJ,QAAA,EAAC;IAA4B,CAAY,CAAC,CAAC;IACjFC,MAAM,CAAClB,MAAM,CAACmB,SAAS,CAAC,OAAO,CAAC,CAAC,CAACG,eAAe,CAAC,IAAI,EAAE,gBAAgB,CAAC;EAC3E,CAAC,CAAC;EAEFN,IAAI,CAAC,gCAAgC,EAAE,MAAM;IAC3C;AACJ;IACIjB,MAAM,cAACK,IAAA,CAACH,UAAU;MAAAgB,QAAA,EAAC;IAA4B,CAAY,CAAC,CAAC;IAC7DC,MAAM,CAAClB,MAAM,CAACmB,SAAS,CAAC,OAAO,CAAC,CAAC,CAACI,GAAG,CAACD,eAAe,CAAC,IAAI,CAAC;EAC7D,CAAC,CAAC;EAEFN,IAAI,CAAC,wCAAwC,EAAE,MAAM;IACnD;AACJ;AACA;IACIjB,MAAM,cAACK,IAAA,CAACH,UAAU;MAAAgB,QAAA,EAAC;IAAO,CAAY,CAAC,CAAC;IACxCC,MAAM,CAAClB,MAAM,CAACwB,WAAW,CAAC,iBAAiB,CAAC,CAAC,CAACF,eAAe,CAAC,aAAa,EAAE,MAAM,CAAC;EACtF,CAAC,CAAC;AACJ,CAAC,CAAC;AAEFP,QAAQ,CAAC,gEAAgE,EAAE,MAAM;EAC/EC,IAAI,CAAC,wDAAwD,EAAE,MAAM;IACnEjB,MAAM,cACJK,IAAA,CAACF,KAAK;MAACuB,KAAK,EAAC,oBAAiB;MAACf,KAAK,EAAC,oDAAiD;MAAAO,QAAA,eACpFb,IAAA,CAACK,SAAS,IAAE;IAAC,CACR,CACT,CAAC;IAEDS,MAAM,CAAClB,MAAM,CAACmB,SAAS,CAAC,SAAS,CAAC,CAAC,CAACO,2BAA2B,CAC7D,iDACF,CAAC;EACH,CAAC,CAAC;EAEFV,IAAI,CAAC,+BAA+B,EAAE,MAAM;IAC1CjB,MAAM,cACJK,IAAA,CAACF,KAAK;MAACuB,KAAK,EAAC,WAAQ;MAACf,KAAK,EAAC,WAAW;MAAAO,QAAA,eACrCb,IAAA,CAACK,SAAS,IAAE;IAAC,CACR,CACT,CAAC;IACD;IACAS,MAAM,CAAClB,MAAM,CAACmB,SAAS,CAAC,SAAS,CAAC,CAAC,CAACQ,WAAW,CAAC,CAAC;EACnD,CAAC,CAAC;EAEFX,IAAI,CAAC,6DAA6D,EAAE,MAAM;IACxE;AACJ;AACA;AACA;IACIjB,MAAM,cACJS,KAAA,CAAAF,SAAA;MAAAW,QAAA,gBACEb,IAAA;QAAMiB,EAAE,EAAC,WAAW;QAAAJ,QAAA,EAAC;MAA+B,CAAM,CAAC,eAC3Db,IAAA,CAACF,KAAK;QAACuB,KAAK,EAAC,WAAQ;QAACf,KAAK,EAAC,6BAA0B;QAAAO,QAAA,eACpDb,IAAA,CAACK,SAAS;UAAC,oBAAiB;QAAW,CAAE;MAAC,CACrC,CAAC;IAAA,CACR,CACJ,CAAC;IAED,MAAMmB,KAAK,GAAG5B,MAAM,CAACmB,SAAS,CAAC,SAAS,CAAC;IACzCD,MAAM,CAACU,KAAK,CAAC,CAACF,2BAA2B,CAAC,gBAAgB,CAAC;IAC3DR,MAAM,CAACU,KAAK,CAAC,CAACF,2BAA2B,CAAC,WAAW,CAAC;EACxD,CAAC,CAAC;EAEFV,IAAI,CAAC,gDAAgD,EAAE,MAAM;IAC3D;AACJ;IACI,MAAM;MAAEa;IAAS,CAAC,GAAG9B,MAAM,cACzBK,IAAA,CAACF,KAAK;MAACuB,KAAK,EAAC,WAAQ;MAACK,IAAI,EAAC,wBAAwB;MAACpB,KAAK,EAAC,6BAA0B;MAAAO,QAAA,eAClFb,IAAA,CAACK,SAAS,IAAE;IAAC,CACR,CACT,CAAC;IAEDS,MAAM,CAAClB,MAAM,CAACmB,SAAS,CAAC,OAAO,CAAC,CAAC,CAACC,iBAAiB,CAAC,0BAA0B,CAAC;IAC/EF,MAAM,CAAClB,MAAM,CAAC+B,WAAW,CAAC,wBAAwB,CAAC,CAAC,CAACR,GAAG,CAACS,iBAAiB,CAAC,CAAC;IAE5EH,QAAQ,cACNzB,IAAA,CAACF,KAAK;MAACuB,KAAK,EAAC,WAAQ;MAACK,IAAI,EAAC,wBAAwB;MAAAb,QAAA,eACjDb,IAAA,CAACK,SAAS,IAAE;IAAC,CACR,CACT,CAAC;IACDS,MAAM,CAAClB,MAAM,CAACiC,SAAS,CAAC,wBAAwB,CAAC,CAAC,CAACD,iBAAiB,CAAC,CAAC;EACxE,CAAC,CAAC;AACJ,CAAC,CAAC;AAEFjB,QAAQ,CAAC,4CAA4C,EAAE,MAAM;EAC3DC,IAAI,CAAC,wCAAwC,EAAE,MAAM;IACnD;AACJ;AACA;AACA;AACA;IACI,MAAM;MAAEa;IAAS,CAAC,GAAG9B,MAAM,cACzBK,IAAA,CAACF,KAAK;MAACuB,KAAK,EAAC,WAAQ;MAAAR,QAAA,eACnBb,IAAA,CAACK,SAAS,IAAE;IAAC,CACR,CACT,CAAC;IACDS,MAAM,CAAClB,MAAM,CAACkC,WAAW,CAAC,OAAO,CAAC,CAAC,CAACX,GAAG,CAACS,iBAAiB,CAAC,CAAC;IAE3DH,QAAQ,cACNzB,IAAA,CAACF,KAAK;MAACuB,KAAK,EAAC,WAAQ;MAACf,KAAK,EAAC,6BAA0B;MAAAO,QAAA,eACpDb,IAAA,CAACK,SAAS,IAAE;IAAC,CACR,CACT,CAAC;IACDS,MAAM,CAAClB,MAAM,CAACmB,SAAS,CAAC,OAAO,CAAC,CAAC,CAACa,iBAAiB,CAAC,CAAC;EACvD,CAAC,CAAC;EAEFhB,IAAI,CAAC,0CAA0C,EAAE,MAAM;IACrD,MAAM;MAAEa;IAAS,CAAC,GAAG9B,MAAM,cACzBK,IAAA,CAACF,KAAK;MAACuB,KAAK,EAAC,WAAQ;MAACf,KAAK,EAAC,6BAA0B;MAAAO,QAAA,eACpDb,IAAA,CAACK,SAAS,IAAE;IAAC,CACR,CACT,CAAC;IACDS,MAAM,CAAClB,MAAM,CAACmB,SAAS,CAAC,OAAO,CAAC,CAAC,CAACa,iBAAiB,CAAC,CAAC;IAErDH,QAAQ,cACNzB,IAAA,CAACF,KAAK;MAACuB,KAAK,EAAC,WAAQ;MAAAR,QAAA,eACnBb,IAAA,CAACK,SAAS,IAAE;IAAC,CACR,CACT,CAAC;IACDS,MAAM,CAAClB,MAAM,CAACkC,WAAW,CAAC,OAAO,CAAC,CAAC,CAACX,GAAG,CAACS,iBAAiB,CAAC,CAAC;IAC3Dd,MAAM,CAAClB,MAAM,CAACmB,SAAS,CAAC,SAAS,CAAC,CAAC,CAACI,GAAG,CAACI,WAAW,CAAC,CAAC;EACvD,CAAC,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
|