@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
|
@@ -5,7 +5,7 @@ var _react = require("@testing-library/react");
|
|
|
5
5
|
var _FieldError = _interopRequireDefault(require("../components/FieldError"));
|
|
6
6
|
var _Field = _interopRequireDefault(require("../components/Field"));
|
|
7
7
|
var _jsxRuntime = require("react/jsx-runtime");
|
|
8
|
-
function _interopRequireDefault(
|
|
8
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
9
9
|
/**
|
|
10
10
|
* FieldError — contract tests, including its integration into Field.
|
|
11
11
|
*
|
|
@@ -30,57 +30,87 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "d
|
|
|
30
30
|
* resolves neither CSS variables nor flexbox, so asserting them here would pass
|
|
31
31
|
* while the message rendered black and centred. Those live in
|
|
32
32
|
* FieldError.stories.tsx.
|
|
33
|
-
*/
|
|
34
|
-
|
|
35
|
-
|
|
33
|
+
*/
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Fixture : un champ minimal qui CONSOMME les props que `Field` diffuse.
|
|
37
|
+
*
|
|
38
|
+
* `Field` clone son enfant avec `error` et `fullWidth` — délibérément, parce
|
|
39
|
+
* que plusieurs entrées v2 (`NumberInput`, le `renderInput` de `Combobox`) ne
|
|
40
|
+
* sont pas de purs enfants MUI et lisent ces props directement. Un `<input />`
|
|
41
|
+
* NU les laisse donc filer jusqu'au DOM, et React émet deux avertissements à
|
|
42
|
+
* chaque rendu : « Received `true` for a non-boolean attribute `error` » et
|
|
43
|
+
* « React does not recognize the `fullWidth` prop on a DOM element ».
|
|
44
|
+
*
|
|
45
|
+
* Ce n'est PAS un défaut de `Field` : en production l'enfant est un `Input` ou
|
|
46
|
+
* un `Select` du socle, qui consomme ces props. Mais c'était six
|
|
47
|
+
* avertissements dans la sortie de la suite, au milieu desquels un vrai
|
|
48
|
+
* avertissement passe inaperçu — et un audit du socle a effectivement pris ce
|
|
49
|
+
* bruit pour une fuite de props en production avant de lire le composant.
|
|
50
|
+
*
|
|
51
|
+
* La fixture reste volontairement minimale : pas d'`Input` du socle ici, ce
|
|
52
|
+
* fichier teste le CÂBLAGE de `Field` et non l'intégration d'un composant. Elle
|
|
53
|
+
* ne fait qu'absorber les deux props destinées à un contrôle riche.
|
|
54
|
+
*/function BareInput({
|
|
55
|
+
error: _error,
|
|
56
|
+
fullWidth: _fullWidth,
|
|
57
|
+
...rest
|
|
58
|
+
}) {
|
|
59
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsx)("input", {
|
|
60
|
+
...rest
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
describe("FieldError — standalone", () => {
|
|
64
|
+
test("announces itself as an alert carrying the message", () => {
|
|
65
|
+
(0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_FieldError.default, {
|
|
36
66
|
children: "Ajoutez au moins un article avant de soumettre."
|
|
37
67
|
}));
|
|
38
68
|
expect(_react.screen.getByRole("alert")).toHaveTextContent("Ajoutez au moins un article avant de soumettre.");
|
|
39
69
|
});
|
|
40
|
-
test("forwards id so a host can wire its own aria-describedby",
|
|
41
|
-
(0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_FieldError
|
|
70
|
+
test("forwards id so a host can wire its own aria-describedby", () => {
|
|
71
|
+
(0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_FieldError.default, {
|
|
42
72
|
id: "articles-error",
|
|
43
73
|
children: "Ajoutez au moins un article."
|
|
44
74
|
}));
|
|
45
75
|
expect(_react.screen.getByRole("alert")).toHaveAttribute("id", "articles-error");
|
|
46
76
|
});
|
|
47
|
-
test("omits id when none is supplied",
|
|
77
|
+
test("omits id when none is supplied", () => {
|
|
48
78
|
/* The list-level case usually has nothing to bind to. Emitting an empty or
|
|
49
79
|
* generated id would create a describedby target nobody references. */
|
|
50
|
-
(0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_FieldError
|
|
80
|
+
(0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_FieldError.default, {
|
|
51
81
|
children: "Ajoutez au moins un article."
|
|
52
82
|
}));
|
|
53
83
|
expect(_react.screen.getByRole("alert")).not.toHaveAttribute("id");
|
|
54
84
|
});
|
|
55
|
-
test("the icon is hidden from assistive tech",
|
|
85
|
+
test("the icon is hidden from assistive tech", () => {
|
|
56
86
|
/* R-Ar.2 — the message IS the announcement; an announced glyph would double
|
|
57
87
|
* it. No semantic query reaches a role-less, name-less element, hence the
|
|
58
88
|
* testid the component exposes for exactly this assertion. */
|
|
59
|
-
(0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_FieldError
|
|
89
|
+
(0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_FieldError.default, {
|
|
60
90
|
children: "Message"
|
|
61
91
|
}));
|
|
62
92
|
expect(_react.screen.getByTestId("fielderror-icon")).toHaveAttribute("aria-hidden", "true");
|
|
63
93
|
});
|
|
64
94
|
});
|
|
65
|
-
describe("FieldError — inside Field (the wiring that has no visual tell)",
|
|
66
|
-
test("the error becomes the control's accessible description",
|
|
67
|
-
(0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_Field
|
|
95
|
+
describe("FieldError — inside Field (the wiring that has no visual tell)", () => {
|
|
96
|
+
test("the error becomes the control's accessible description", () => {
|
|
97
|
+
(0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_Field.default, {
|
|
68
98
|
label: "Num\xE9ro de titre",
|
|
69
99
|
error: "Le num\xE9ro est invalide. Format : AAAA-IM-NNNNN.",
|
|
70
|
-
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(
|
|
100
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(BareInput, {})
|
|
71
101
|
}));
|
|
72
102
|
expect(_react.screen.getByRole("textbox")).toHaveAccessibleDescription("Le numéro est invalide. Format : AAAA-IM-NNNNN.");
|
|
73
103
|
});
|
|
74
|
-
test("the control is marked invalid",
|
|
75
|
-
(0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_Field
|
|
104
|
+
test("the control is marked invalid", () => {
|
|
105
|
+
(0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_Field.default, {
|
|
76
106
|
label: "Num\xE9ro",
|
|
77
107
|
error: "Invalide.",
|
|
78
|
-
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(
|
|
108
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(BareInput, {})
|
|
79
109
|
}));
|
|
80
110
|
// jest-dom's toBeInvalid reads aria-invalid — R-I.3.
|
|
81
111
|
expect(_react.screen.getByRole("textbox")).toBeInvalid();
|
|
82
112
|
});
|
|
83
|
-
test("a host-supplied aria-describedby is PRESERVED, not replaced",
|
|
113
|
+
test("a host-supplied aria-describedby is PRESERVED, not replaced", () => {
|
|
84
114
|
/* The merge is the fragile part. Overwriting instead of merging silently
|
|
85
115
|
* drops a consumer's external help text, and again nothing visual changes.
|
|
86
116
|
* Asserted with two order-independent regexes rather than one exact string,
|
|
@@ -89,69 +119,72 @@ describe("FieldError — inside Field (the wiring that has no visual tell)", fun
|
|
|
89
119
|
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
|
|
90
120
|
id: "host-help",
|
|
91
121
|
children: "Format attendu : AAAA-IM-NNNNN."
|
|
92
|
-
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Field
|
|
122
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Field.default, {
|
|
93
123
|
label: "Num\xE9ro",
|
|
94
124
|
error: "Le num\xE9ro est incomplet.",
|
|
95
|
-
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(
|
|
125
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(BareInput, {
|
|
96
126
|
"aria-describedby": "host-help"
|
|
97
127
|
})
|
|
98
128
|
})]
|
|
99
129
|
}));
|
|
100
|
-
|
|
130
|
+
const input = _react.screen.getByRole("textbox");
|
|
101
131
|
expect(input).toHaveAccessibleDescription(/Format attendu/);
|
|
102
132
|
expect(input).toHaveAccessibleDescription(/incomplet/);
|
|
103
133
|
});
|
|
104
|
-
test("the hint is suppressed while an error is shown",
|
|
134
|
+
test("the hint is suppressed while an error is shown", () => {
|
|
105
135
|
/* Two competing descriptions under one field is worse than one. The hint
|
|
106
136
|
* returns once the error clears — verified by the rerender below. */
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
137
|
+
const {
|
|
138
|
+
rerender
|
|
139
|
+
} = (0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_Field.default, {
|
|
140
|
+
label: "Num\xE9ro",
|
|
141
|
+
hint: "Format : AAAA-IM-NNNNN",
|
|
142
|
+
error: "Le num\xE9ro est incomplet.",
|
|
143
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(BareInput, {})
|
|
144
|
+
}));
|
|
114
145
|
expect(_react.screen.getByRole("alert")).toHaveTextContent("Le numéro est incomplet.");
|
|
115
146
|
expect(_react.screen.queryByText("Format : AAAA-IM-NNNNN")).not.toBeInTheDocument();
|
|
116
|
-
rerender(/*#__PURE__*/(0, _jsxRuntime.jsx)(_Field
|
|
147
|
+
rerender(/*#__PURE__*/(0, _jsxRuntime.jsx)(_Field.default, {
|
|
117
148
|
label: "Num\xE9ro",
|
|
118
149
|
hint: "Format : AAAA-IM-NNNNN",
|
|
119
|
-
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(
|
|
150
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(BareInput, {})
|
|
120
151
|
}));
|
|
121
152
|
expect(_react.screen.getByText("Format : AAAA-IM-NNNNN")).toBeInTheDocument();
|
|
122
153
|
});
|
|
123
154
|
});
|
|
124
|
-
describe("FieldError — live-region mounting contract",
|
|
125
|
-
test("no alert exists until an error appears",
|
|
155
|
+
describe("FieldError — live-region mounting contract", () => {
|
|
156
|
+
test("no alert exists until an error appears", () => {
|
|
126
157
|
/* THE contract. `role=\"alert\"` announces on INSERTION: an element mounted
|
|
127
158
|
* permanently with empty content announces nothing when it later fills, so
|
|
128
159
|
* a well-meaning refactor that always renders the container — to \"avoid
|
|
129
160
|
* layout shift\", say — silently kills the announcement while every pixel
|
|
130
161
|
* and every screenshot stays identical. */
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
162
|
+
const {
|
|
163
|
+
rerender
|
|
164
|
+
} = (0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_Field.default, {
|
|
165
|
+
label: "Num\xE9ro",
|
|
166
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(BareInput, {})
|
|
167
|
+
}));
|
|
136
168
|
expect(_react.screen.queryByRole("alert")).not.toBeInTheDocument();
|
|
137
|
-
rerender(/*#__PURE__*/(0, _jsxRuntime.jsx)(_Field
|
|
169
|
+
rerender(/*#__PURE__*/(0, _jsxRuntime.jsx)(_Field.default, {
|
|
138
170
|
label: "Num\xE9ro",
|
|
139
171
|
error: "Le num\xE9ro est incomplet.",
|
|
140
|
-
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(
|
|
172
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(BareInput, {})
|
|
141
173
|
}));
|
|
142
174
|
expect(_react.screen.getByRole("alert")).toBeInTheDocument();
|
|
143
175
|
});
|
|
144
|
-
test("the alert unmounts when the error clears",
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
176
|
+
test("the alert unmounts when the error clears", () => {
|
|
177
|
+
const {
|
|
178
|
+
rerender
|
|
179
|
+
} = (0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_Field.default, {
|
|
180
|
+
label: "Num\xE9ro",
|
|
181
|
+
error: "Le num\xE9ro est incomplet.",
|
|
182
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(BareInput, {})
|
|
183
|
+
}));
|
|
151
184
|
expect(_react.screen.getByRole("alert")).toBeInTheDocument();
|
|
152
|
-
rerender(/*#__PURE__*/(0, _jsxRuntime.jsx)(_Field
|
|
185
|
+
rerender(/*#__PURE__*/(0, _jsxRuntime.jsx)(_Field.default, {
|
|
153
186
|
label: "Num\xE9ro",
|
|
154
|
-
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(
|
|
187
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(BareInput, {})
|
|
155
188
|
}));
|
|
156
189
|
expect(_react.screen.queryByRole("alert")).not.toBeInTheDocument();
|
|
157
190
|
expect(_react.screen.getByRole("textbox")).not.toBeInvalid();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FieldError.test.js","names":["require","_react","_FieldError","_interopRequireDefault","_Field","_jsxRuntime","obj","__esModule","describe","test","render","jsx","children","expect","screen","getByRole","toHaveTextContent","id","toHaveAttribute","not","getByTestId","label","error","toHaveAccessibleDescription","toBeInvalid","jsxs","Fragment","input","_render","hint","rerender","queryByText","toBeInTheDocument","getByText","_render2","queryByRole","_render3"],"sources":["../../../src/lib/v2/__tests__/FieldError.test.tsx"],"sourcesContent":["import \"@testing-library/jest-dom\";\r\nimport { render, screen } from \"@testing-library/react\";\r\nimport FieldError from \"../components/FieldError\";\r\nimport Field from \"../components/Field\";\r\n\r\n/**\r\n * FieldError — contract tests, including its integration into Field.\r\n *\r\n * WHY THIS FILE EXISTS\r\n * --------------------\r\n * §10.3 R-G.6 MUST. But the real reason is narrower and worth stating: the\r\n * contract this component carries is INVISIBLE. `Field` supplies an id, and that\r\n * id must reach the control's `aria-describedby` so a screen reader announces\r\n * the error when focus lands on the input. Break that wiring and NOTHING\r\n * changes: same pixels, same screenshot, same visual review — only a blind user\r\n * silently stops being told why their submit failed. There is no way to catch\r\n * that except by asserting it.\r\n *\r\n * The assertions below use `toHaveAccessibleDescription`, not id comparisons, on\r\n * purpose. It resolves aria-describedby to the text a screen reader would\r\n * actually announce, so the test states the USER-FACING outcome and stays true\r\n * if the id-generation scheme ever changes.\r\n *\r\n * NOT COVERED — deliberately\r\n * R-4.1's visual half (\"sous le champ, en rouge, avec icône\") and the\r\n * first-line icon alignment on a wrapping message are layout and colour. jsdom\r\n * resolves neither CSS variables nor flexbox, so asserting them here would pass\r\n * while the message rendered black and centred. Those live in\r\n * FieldError.stories.tsx.\r\n */\r\ndescribe(\"FieldError — standalone\", () => {\r\n test(\"announces itself as an alert carrying the message\", () => {\r\n render(<FieldError>Ajoutez au moins un article avant de soumettre.</FieldError>);\r\n expect(screen.getByRole(\"alert\")).toHaveTextContent(\r\n \"Ajoutez au moins un article avant de soumettre.\"\r\n );\r\n });\r\n\r\n test(\"forwards id so a host can wire its own aria-describedby\", () => {\r\n render(<FieldError id=\"articles-error\">Ajoutez au moins un article.</FieldError>);\r\n expect(screen.getByRole(\"alert\")).toHaveAttribute(\"id\", \"articles-error\");\r\n });\r\n\r\n test(\"omits id when none is supplied\", () => {\r\n /* The list-level case usually has nothing to bind to. Emitting an empty or\r\n * generated id would create a describedby target nobody references. */\r\n render(<FieldError>Ajoutez au moins un article.</FieldError>);\r\n expect(screen.getByRole(\"alert\")).not.toHaveAttribute(\"id\");\r\n });\r\n\r\n test(\"the icon is hidden from assistive tech\", () => {\r\n /* R-Ar.2 — the message IS the announcement; an announced glyph would double\r\n * it. No semantic query reaches a role-less, name-less element, hence the\r\n * testid the component exposes for exactly this assertion. */\r\n render(<FieldError>Message</FieldError>);\r\n expect(screen.getByTestId(\"fielderror-icon\")).toHaveAttribute(\"aria-hidden\", \"true\");\r\n });\r\n});\r\n\r\ndescribe(\"FieldError — inside Field (the wiring that has no visual tell)\", () => {\r\n test(\"the error becomes the control's accessible description\", () => {\r\n render(\r\n <Field label=\"Numéro de titre\" error=\"Le numéro est invalide. Format : AAAA-IM-NNNNN.\">\r\n <input />\r\n </Field>\r\n );\r\n\r\n expect(screen.getByRole(\"textbox\")).toHaveAccessibleDescription(\r\n \"Le numéro est invalide. Format : AAAA-IM-NNNNN.\"\r\n );\r\n });\r\n\r\n test(\"the control is marked invalid\", () => {\r\n render(\r\n <Field label=\"Numéro\" error=\"Invalide.\">\r\n <input />\r\n </Field>\r\n );\r\n // jest-dom's toBeInvalid reads aria-invalid — R-I.3.\r\n expect(screen.getByRole(\"textbox\")).toBeInvalid();\r\n });\r\n\r\n test(\"a host-supplied aria-describedby is PRESERVED, not replaced\", () => {\r\n /* The merge is the fragile part. Overwriting instead of merging silently\r\n * drops a consumer's external help text, and again nothing visual changes.\r\n * Asserted with two order-independent regexes rather than one exact string,\r\n * so the test does not encode which fragment Field puts first. */\r\n render(\r\n <>\r\n <span id=\"host-help\">Format attendu : AAAA-IM-NNNNN.</span>\r\n <Field label=\"Numéro\" error=\"Le numéro est incomplet.\">\r\n <input aria-describedby=\"host-help\" />\r\n </Field>\r\n </>\r\n );\r\n\r\n const input = screen.getByRole(\"textbox\");\r\n expect(input).toHaveAccessibleDescription(/Format attendu/);\r\n expect(input).toHaveAccessibleDescription(/incomplet/);\r\n });\r\n\r\n test(\"the hint is suppressed while an error is shown\", () => {\r\n /* Two competing descriptions under one field is worse than one. The hint\r\n * returns once the error clears — verified by the rerender below. */\r\n const { rerender } = render(\r\n <Field label=\"Numéro\" hint=\"Format : AAAA-IM-NNNNN\" error=\"Le numéro est incomplet.\">\r\n <input />\r\n </Field>\r\n );\r\n\r\n expect(screen.getByRole(\"alert\")).toHaveTextContent(\"Le numéro est incomplet.\");\r\n expect(screen.queryByText(\"Format : AAAA-IM-NNNNN\")).not.toBeInTheDocument();\r\n\r\n rerender(\r\n <Field label=\"Numéro\" hint=\"Format : AAAA-IM-NNNNN\">\r\n <input />\r\n </Field>\r\n );\r\n expect(screen.getByText(\"Format : AAAA-IM-NNNNN\")).toBeInTheDocument();\r\n });\r\n});\r\n\r\ndescribe(\"FieldError — live-region mounting contract\", () => {\r\n test(\"no alert exists until an error appears\", () => {\r\n /* THE contract. `role=\\\"alert\\\"` announces on INSERTION: an element mounted\r\n * permanently with empty content announces nothing when it later fills, so\r\n * a well-meaning refactor that always renders the container — to \\\"avoid\r\n * layout shift\\\", say — silently kills the announcement while every pixel\r\n * and every screenshot stays identical. */\r\n const { rerender } = render(\r\n <Field label=\"Numéro\">\r\n <input />\r\n </Field>\r\n );\r\n expect(screen.queryByRole(\"alert\")).not.toBeInTheDocument();\r\n\r\n rerender(\r\n <Field label=\"Numéro\" error=\"Le numéro est incomplet.\">\r\n <input />\r\n </Field>\r\n );\r\n expect(screen.getByRole(\"alert\")).toBeInTheDocument();\r\n });\r\n\r\n test(\"the alert unmounts when the error clears\", () => {\r\n const { rerender } = render(\r\n <Field label=\"Numéro\" error=\"Le numéro est incomplet.\">\r\n <input />\r\n </Field>\r\n );\r\n expect(screen.getByRole(\"alert\")).toBeInTheDocument();\r\n\r\n rerender(\r\n <Field label=\"Numéro\">\r\n <input />\r\n </Field>\r\n );\r\n expect(screen.queryByRole(\"alert\")).not.toBeInTheDocument();\r\n expect(screen.getByRole(\"textbox\")).not.toBeInvalid();\r\n });\r\n});\r\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"FieldError.test.js","names":["require","_react","_FieldError","_interopRequireDefault","_Field","_jsxRuntime","e","__esModule","default","BareInput","error","_error","fullWidth","_fullWidth","rest","jsx","describe","test","render","children","expect","screen","getByRole","toHaveTextContent","id","toHaveAttribute","not","getByTestId","label","toHaveAccessibleDescription","toBeInvalid","jsxs","Fragment","input","rerender","hint","queryByText","toBeInTheDocument","getByText","queryByRole"],"sources":["../../../src/lib/v2/__tests__/FieldError.test.tsx"],"sourcesContent":["import \"@testing-library/jest-dom\";\r\nimport { render, screen } from \"@testing-library/react\";\r\nimport type { InputHTMLAttributes } from \"react\";\r\nimport FieldError from \"../components/FieldError\";\r\nimport Field from \"../components/Field\";\r\n\r\n/**\r\n * FieldError — contract tests, including its integration into Field.\r\n *\r\n * WHY THIS FILE EXISTS\r\n * --------------------\r\n * §10.3 R-G.6 MUST. But the real reason is narrower and worth stating: the\r\n * contract this component carries is INVISIBLE. `Field` supplies an id, and that\r\n * id must reach the control's `aria-describedby` so a screen reader announces\r\n * the error when focus lands on the input. Break that wiring and NOTHING\r\n * changes: same pixels, same screenshot, same visual review — only a blind user\r\n * silently stops being told why their submit failed. There is no way to catch\r\n * that except by asserting it.\r\n *\r\n * The assertions below use `toHaveAccessibleDescription`, not id comparisons, on\r\n * purpose. It resolves aria-describedby to the text a screen reader would\r\n * actually announce, so the test states the USER-FACING outcome and stays true\r\n * if the id-generation scheme ever changes.\r\n *\r\n * NOT COVERED — deliberately\r\n * R-4.1's visual half (\"sous le champ, en rouge, avec icône\") and the\r\n * first-line icon alignment on a wrapping message are layout and colour. jsdom\r\n * resolves neither CSS variables nor flexbox, so asserting them here would pass\r\n * while the message rendered black and centred. Those live in\r\n * FieldError.stories.tsx.\r\n */\r\n\r\n/**\r\n * Fixture : un champ minimal qui CONSOMME les props que `Field` diffuse.\r\n *\r\n * `Field` clone son enfant avec `error` et `fullWidth` — délibérément, parce\r\n * que plusieurs entrées v2 (`NumberInput`, le `renderInput` de `Combobox`) ne\r\n * sont pas de purs enfants MUI et lisent ces props directement. Un `<input />`\r\n * NU les laisse donc filer jusqu'au DOM, et React émet deux avertissements à\r\n * chaque rendu : « Received `true` for a non-boolean attribute `error` » et\r\n * « React does not recognize the `fullWidth` prop on a DOM element ».\r\n *\r\n * Ce n'est PAS un défaut de `Field` : en production l'enfant est un `Input` ou\r\n * un `Select` du socle, qui consomme ces props. Mais c'était six\r\n * avertissements dans la sortie de la suite, au milieu desquels un vrai\r\n * avertissement passe inaperçu — et un audit du socle a effectivement pris ce\r\n * bruit pour une fuite de props en production avant de lire le composant.\r\n *\r\n * La fixture reste volontairement minimale : pas d'`Input` du socle ici, ce\r\n * fichier teste le CÂBLAGE de `Field` et non l'intégration d'un composant. Elle\r\n * ne fait qu'absorber les deux props destinées à un contrôle riche.\r\n */\r\nfunction BareInput({\r\n error: _error,\r\n fullWidth: _fullWidth,\r\n ...rest\r\n}: InputHTMLAttributes<HTMLInputElement> & {\r\n error?: boolean | undefined;\r\n fullWidth?: boolean | undefined;\r\n}) {\r\n return <input {...rest} />;\r\n}\r\n\r\ndescribe(\"FieldError — standalone\", () => {\r\n test(\"announces itself as an alert carrying the message\", () => {\r\n render(<FieldError>Ajoutez au moins un article avant de soumettre.</FieldError>);\r\n expect(screen.getByRole(\"alert\")).toHaveTextContent(\r\n \"Ajoutez au moins un article avant de soumettre.\"\r\n );\r\n });\r\n\r\n test(\"forwards id so a host can wire its own aria-describedby\", () => {\r\n render(<FieldError id=\"articles-error\">Ajoutez au moins un article.</FieldError>);\r\n expect(screen.getByRole(\"alert\")).toHaveAttribute(\"id\", \"articles-error\");\r\n });\r\n\r\n test(\"omits id when none is supplied\", () => {\r\n /* The list-level case usually has nothing to bind to. Emitting an empty or\r\n * generated id would create a describedby target nobody references. */\r\n render(<FieldError>Ajoutez au moins un article.</FieldError>);\r\n expect(screen.getByRole(\"alert\")).not.toHaveAttribute(\"id\");\r\n });\r\n\r\n test(\"the icon is hidden from assistive tech\", () => {\r\n /* R-Ar.2 — the message IS the announcement; an announced glyph would double\r\n * it. No semantic query reaches a role-less, name-less element, hence the\r\n * testid the component exposes for exactly this assertion. */\r\n render(<FieldError>Message</FieldError>);\r\n expect(screen.getByTestId(\"fielderror-icon\")).toHaveAttribute(\"aria-hidden\", \"true\");\r\n });\r\n});\r\n\r\ndescribe(\"FieldError — inside Field (the wiring that has no visual tell)\", () => {\r\n test(\"the error becomes the control's accessible description\", () => {\r\n render(\r\n <Field label=\"Numéro de titre\" error=\"Le numéro est invalide. Format : AAAA-IM-NNNNN.\">\r\n <BareInput />\r\n </Field>\r\n );\r\n\r\n expect(screen.getByRole(\"textbox\")).toHaveAccessibleDescription(\r\n \"Le numéro est invalide. Format : AAAA-IM-NNNNN.\"\r\n );\r\n });\r\n\r\n test(\"the control is marked invalid\", () => {\r\n render(\r\n <Field label=\"Numéro\" error=\"Invalide.\">\r\n <BareInput />\r\n </Field>\r\n );\r\n // jest-dom's toBeInvalid reads aria-invalid — R-I.3.\r\n expect(screen.getByRole(\"textbox\")).toBeInvalid();\r\n });\r\n\r\n test(\"a host-supplied aria-describedby is PRESERVED, not replaced\", () => {\r\n /* The merge is the fragile part. Overwriting instead of merging silently\r\n * drops a consumer's external help text, and again nothing visual changes.\r\n * Asserted with two order-independent regexes rather than one exact string,\r\n * so the test does not encode which fragment Field puts first. */\r\n render(\r\n <>\r\n <span id=\"host-help\">Format attendu : AAAA-IM-NNNNN.</span>\r\n <Field label=\"Numéro\" error=\"Le numéro est incomplet.\">\r\n <BareInput aria-describedby=\"host-help\" />\r\n </Field>\r\n </>\r\n );\r\n\r\n const input = screen.getByRole(\"textbox\");\r\n expect(input).toHaveAccessibleDescription(/Format attendu/);\r\n expect(input).toHaveAccessibleDescription(/incomplet/);\r\n });\r\n\r\n test(\"the hint is suppressed while an error is shown\", () => {\r\n /* Two competing descriptions under one field is worse than one. The hint\r\n * returns once the error clears — verified by the rerender below. */\r\n const { rerender } = render(\r\n <Field label=\"Numéro\" hint=\"Format : AAAA-IM-NNNNN\" error=\"Le numéro est incomplet.\">\r\n <BareInput />\r\n </Field>\r\n );\r\n\r\n expect(screen.getByRole(\"alert\")).toHaveTextContent(\"Le numéro est incomplet.\");\r\n expect(screen.queryByText(\"Format : AAAA-IM-NNNNN\")).not.toBeInTheDocument();\r\n\r\n rerender(\r\n <Field label=\"Numéro\" hint=\"Format : AAAA-IM-NNNNN\">\r\n <BareInput />\r\n </Field>\r\n );\r\n expect(screen.getByText(\"Format : AAAA-IM-NNNNN\")).toBeInTheDocument();\r\n });\r\n});\r\n\r\ndescribe(\"FieldError — live-region mounting contract\", () => {\r\n test(\"no alert exists until an error appears\", () => {\r\n /* THE contract. `role=\\\"alert\\\"` announces on INSERTION: an element mounted\r\n * permanently with empty content announces nothing when it later fills, so\r\n * a well-meaning refactor that always renders the container — to \\\"avoid\r\n * layout shift\\\", say — silently kills the announcement while every pixel\r\n * and every screenshot stays identical. */\r\n const { rerender } = render(\r\n <Field label=\"Numéro\">\r\n <BareInput />\r\n </Field>\r\n );\r\n expect(screen.queryByRole(\"alert\")).not.toBeInTheDocument();\r\n\r\n rerender(\r\n <Field label=\"Numéro\" error=\"Le numéro est incomplet.\">\r\n <BareInput />\r\n </Field>\r\n );\r\n expect(screen.getByRole(\"alert\")).toBeInTheDocument();\r\n });\r\n\r\n test(\"the alert unmounts when the error clears\", () => {\r\n const { rerender } = render(\r\n <Field label=\"Numéro\" error=\"Le numéro est incomplet.\">\r\n <BareInput />\r\n </Field>\r\n );\r\n expect(screen.getByRole(\"alert\")).toBeInTheDocument();\r\n\r\n rerender(\r\n <Field label=\"Numéro\">\r\n <BareInput />\r\n </Field>\r\n );\r\n expect(screen.queryByRole(\"alert\")).not.toBeInTheDocument();\r\n expect(screen.getByRole(\"textbox\")).not.toBeInvalid();\r\n });\r\n});\r\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
require("@testing-library/jest-dom");
|
|
4
|
+
var _react = require("@testing-library/react");
|
|
5
|
+
var _Field = _interopRequireDefault(require("../components/Field"));
|
|
6
|
+
var _Select = _interopRequireDefault(require("../components/Select"));
|
|
7
|
+
var _FieldHelp = _interopRequireDefault(require("../components/FieldHelp"));
|
|
8
|
+
var _jsxRuntime = require("react/jsx-runtime");
|
|
9
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
10
|
+
/**
|
|
11
|
+
* R-I.1 — the accessible NAME of a wrapped control.
|
|
12
|
+
*
|
|
13
|
+
* ── WHY THIS FILE EXISTS ─────────────────────────────────────────────
|
|
14
|
+
*
|
|
15
|
+
* `Field` associated its label through `htmlFor` / `id` only. That pair names
|
|
16
|
+
* LABELABLE elements — input, select, textarea, button, meter, output,
|
|
17
|
+
* progress — and nothing else. `Select` renders its visible surface as a
|
|
18
|
+
* `div[role="combobox"]`, so the pair resolved to NOTHING: the control had no
|
|
19
|
+
* accessible name at all, and a screen reader announced "combobox, collapsed"
|
|
20
|
+
* without ever saying which field it was.
|
|
21
|
+
*
|
|
22
|
+
* Nothing on screen showed it. The label was there, in the right place, in the
|
|
23
|
+
* right colour. Every filter drawer and every form of every module carried the
|
|
24
|
+
* defect, and it took an axe-core run in a consuming module
|
|
25
|
+
* (`autorisation-admis-pour-conforme-fe`, Area 10) to surface it as
|
|
26
|
+
* `aria-input-field-name`.
|
|
27
|
+
*
|
|
28
|
+
* The assertions below use `toHaveAccessibleName`, not attribute comparisons,
|
|
29
|
+
* on purpose: it resolves the whole name computation — `aria-labelledby`, then
|
|
30
|
+
* `aria-label`, then the `label[for]` pair — to the string a screen reader
|
|
31
|
+
* would announce. A test asserting `aria-labelledby="pui-xyz-l"` would pass
|
|
32
|
+
* even if that id pointed at an empty element.
|
|
33
|
+
*
|
|
34
|
+
* ── NOT COVERED, AND IT IS A REAL LIMITATION ────────────────────
|
|
35
|
+
*
|
|
36
|
+
* A consumer-supplied `aria-labelledby` on a NON-group child is not merged
|
|
37
|
+
* into the name. `aria-describedby` is (R-I.3), which makes the asymmetry
|
|
38
|
+
* surprising enough to state: the describedby merge happens in `Field`, while
|
|
39
|
+
* naming goes through MUI's `labelId`, and MUI does not concatenate the two.
|
|
40
|
+
* An earlier version of this file asserted the merge and failed with
|
|
41
|
+
* `Received: "Ville"` — the Field label alone.
|
|
42
|
+
*
|
|
43
|
+
* Nothing is silently lost: the field IS named, by its own label, which is the
|
|
44
|
+
* name a user should hear. A host needing an additional name should put it in
|
|
45
|
+
* `label` rather than reaching around the wrapper. Widening this would mean
|
|
46
|
+
* interpolating a token LIST into `labelId`, a prop documented as "the ID of an
|
|
47
|
+
* element" — clever, undocumented, and the kind of thing that breaks on a MUI
|
|
48
|
+
* minor.
|
|
49
|
+
*/
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Fixture : un champ minimal qui CONSOMME les props diffusées par `Field`.
|
|
53
|
+
*
|
|
54
|
+
* Même raison que dans `FieldError.test.tsx` : un `<input />` nu laisse filer
|
|
55
|
+
* `error` et `fullWidth` jusqu'au DOM et produit deux avertissements React par
|
|
56
|
+
* rendu, au milieu desquels un VRAI avertissement passerait inaperçu.
|
|
57
|
+
*/function BareInput({
|
|
58
|
+
error: _error,
|
|
59
|
+
fullWidth: _fullWidth,
|
|
60
|
+
...rest
|
|
61
|
+
}) {
|
|
62
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsx)("input", {
|
|
63
|
+
...rest
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
const noop = () => undefined;
|
|
67
|
+
const OPTIONS = [{
|
|
68
|
+
value: "1",
|
|
69
|
+
label: "Casablanca"
|
|
70
|
+
}, {
|
|
71
|
+
value: "2",
|
|
72
|
+
label: "Rabat"
|
|
73
|
+
}];
|
|
74
|
+
describe("Field — nom accessible du contrôle", () => {
|
|
75
|
+
/* The case that already worked: a native, labelable child. Asserted so the
|
|
76
|
+
* fix cannot regress it — adding `aria-labelledby` everywhere had to leave
|
|
77
|
+
* this one announcing exactly the same string. */
|
|
78
|
+
it("nomme un contrôle natif (déjà couvert par htmlFor)", () => {
|
|
79
|
+
(0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_Field.default, {
|
|
80
|
+
label: "R\xE9f\xE9rence de la demande",
|
|
81
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(BareInput, {})
|
|
82
|
+
}));
|
|
83
|
+
expect(_react.screen.getByRole("textbox")).toHaveAccessibleName("Référence de la demande");
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
/* THE DEFECT. A div-based control cannot be named by htmlFor/id. */
|
|
87
|
+
it("nomme un Select, dont la surface est un div[role=combobox]", () => {
|
|
88
|
+
(0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_Field.default, {
|
|
89
|
+
label: "Ville de l'unit\xE9",
|
|
90
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Select.default, {
|
|
91
|
+
value: "",
|
|
92
|
+
onChange: noop,
|
|
93
|
+
options: OPTIONS
|
|
94
|
+
})
|
|
95
|
+
}));
|
|
96
|
+
expect(_react.screen.getByRole("combobox")).toHaveAccessibleName("Ville de l'unité");
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
/* The required asterisk is `aria-hidden`, so it must not leak into the name:
|
|
100
|
+
* "Ville de l'unité *" is not what a user should hear. */
|
|
101
|
+
it("n'inclut pas l'astérisque des champs requis", () => {
|
|
102
|
+
(0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_Field.default, {
|
|
103
|
+
label: "Ville de l'unit\xE9",
|
|
104
|
+
required: true,
|
|
105
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Select.default, {
|
|
106
|
+
value: "",
|
|
107
|
+
onChange: noop,
|
|
108
|
+
options: OPTIONS
|
|
109
|
+
})
|
|
110
|
+
}));
|
|
111
|
+
expect(_react.screen.getByRole("combobox")).toHaveAccessibleName("Ville de l'unité");
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* The reason `labelId` sits on a span around the TEXT and not on the label
|
|
116
|
+
* element: `aria-labelledby` resolves to its target's text content, and a
|
|
117
|
+
* help button inside the label carries its own accessible name. Anchoring on
|
|
118
|
+
* the whole label would announce "Ville de l'unité Aide sur ce champ".
|
|
119
|
+
*
|
|
120
|
+
* This also fixes the `htmlFor` path, which had the same flaw.
|
|
121
|
+
*/
|
|
122
|
+
it("n'inclut pas le nom du bouton d'aide du libellé", () => {
|
|
123
|
+
(0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_Field.default, {
|
|
124
|
+
label: "Ville de l'unit\xE9",
|
|
125
|
+
helpAdornment: /*#__PURE__*/(0, _jsxRuntime.jsx)(_FieldHelp.default, {
|
|
126
|
+
ariaLabel: "Aide sur ce champ",
|
|
127
|
+
children: "Texte d'aide."
|
|
128
|
+
}),
|
|
129
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Select.default, {
|
|
130
|
+
value: "",
|
|
131
|
+
onChange: noop,
|
|
132
|
+
options: OPTIONS
|
|
133
|
+
})
|
|
134
|
+
}));
|
|
135
|
+
expect(_react.screen.getByRole("combobox")).toHaveAccessibleName("Ville de l'unité");
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
/* Group mode keeps working: the label is a plain span there, and the group is
|
|
139
|
+
* named by `aria-labelledby` — which DOES reach its target, because it is the
|
|
140
|
+
* child's own root that carries `role="group"`. */
|
|
141
|
+
it("nomme un groupe ARIA", () => {
|
|
142
|
+
(0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_Field.default, {
|
|
143
|
+
label: "Type de contr\xF4le",
|
|
144
|
+
group: true,
|
|
145
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
|
|
146
|
+
role: "group",
|
|
147
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("input", {
|
|
148
|
+
type: "radio",
|
|
149
|
+
name: "t",
|
|
150
|
+
"aria-label": "Documentaire"
|
|
151
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsx)("input", {
|
|
152
|
+
type: "radio",
|
|
153
|
+
name: "t",
|
|
154
|
+
"aria-label": "Physique"
|
|
155
|
+
})]
|
|
156
|
+
})
|
|
157
|
+
}));
|
|
158
|
+
expect(_react.screen.getByRole("group")).toHaveAccessibleName("Type de contrôle");
|
|
159
|
+
});
|
|
160
|
+
});
|
|
161
|
+
//# sourceMappingURL=FieldNaming.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FieldNaming.test.js","names":["require","_react","_Field","_interopRequireDefault","_Select","_FieldHelp","_jsxRuntime","e","__esModule","default","BareInput","error","_error","fullWidth","_fullWidth","rest","jsx","noop","undefined","OPTIONS","value","label","describe","it","render","children","expect","screen","getByRole","toHaveAccessibleName","onChange","options","required","helpAdornment","ariaLabel","group","jsxs","role","type","name"],"sources":["../../../src/lib/v2/__tests__/FieldNaming.test.tsx"],"sourcesContent":["import \"@testing-library/jest-dom\";\r\nimport { render, screen } from \"@testing-library/react\";\r\nimport type { InputHTMLAttributes } from \"react\";\r\n\r\nimport Field from \"../components/Field\";\r\nimport Select from \"../components/Select\";\r\nimport FieldHelp from \"../components/FieldHelp\";\r\n\r\n/**\r\n * R-I.1 — the accessible NAME of a wrapped control.\r\n *\r\n * ── WHY THIS FILE EXISTS ─────────────────────────────────────────────\r\n *\r\n * `Field` associated its label through `htmlFor` / `id` only. That pair names\r\n * LABELABLE elements — input, select, textarea, button, meter, output,\r\n * progress — and nothing else. `Select` renders its visible surface as a\r\n * `div[role=\"combobox\"]`, so the pair resolved to NOTHING: the control had no\r\n * accessible name at all, and a screen reader announced \"combobox, collapsed\"\r\n * without ever saying which field it was.\r\n *\r\n * Nothing on screen showed it. The label was there, in the right place, in the\r\n * right colour. Every filter drawer and every form of every module carried the\r\n * defect, and it took an axe-core run in a consuming module\r\n * (`autorisation-admis-pour-conforme-fe`, Area 10) to surface it as\r\n * `aria-input-field-name`.\r\n *\r\n * The assertions below use `toHaveAccessibleName`, not attribute comparisons,\r\n * on purpose: it resolves the whole name computation — `aria-labelledby`, then\r\n * `aria-label`, then the `label[for]` pair — to the string a screen reader\r\n * would announce. A test asserting `aria-labelledby=\"pui-xyz-l\"` would pass\r\n * even if that id pointed at an empty element.\r\n *\r\n * ── NOT COVERED, AND IT IS A REAL LIMITATION ────────────────────\r\n *\r\n * A consumer-supplied `aria-labelledby` on a NON-group child is not merged\r\n * into the name. `aria-describedby` is (R-I.3), which makes the asymmetry\r\n * surprising enough to state: the describedby merge happens in `Field`, while\r\n * naming goes through MUI's `labelId`, and MUI does not concatenate the two.\r\n * An earlier version of this file asserted the merge and failed with\r\n * `Received: \"Ville\"` — the Field label alone.\r\n *\r\n * Nothing is silently lost: the field IS named, by its own label, which is the\r\n * name a user should hear. A host needing an additional name should put it in\r\n * `label` rather than reaching around the wrapper. Widening this would mean\r\n * interpolating a token LIST into `labelId`, a prop documented as \"the ID of an\r\n * element\" — clever, undocumented, and the kind of thing that breaks on a MUI\r\n * minor.\r\n */\r\n\r\n/**\r\n * Fixture : un champ minimal qui CONSOMME les props diffusées par `Field`.\r\n *\r\n * Même raison que dans `FieldError.test.tsx` : un `<input />` nu laisse filer\r\n * `error` et `fullWidth` jusqu'au DOM et produit deux avertissements React par\r\n * rendu, au milieu desquels un VRAI avertissement passerait inaperçu.\r\n */\r\nfunction BareInput({\r\n error: _error,\r\n fullWidth: _fullWidth,\r\n ...rest\r\n}: InputHTMLAttributes<HTMLInputElement> & {\r\n error?: boolean | undefined;\r\n fullWidth?: boolean | undefined;\r\n}) {\r\n return <input {...rest} />;\r\n}\r\n\r\nconst noop = () => undefined;\r\n\r\nconst OPTIONS = [\r\n { value: \"1\", label: \"Casablanca\" },\r\n { value: \"2\", label: \"Rabat\" },\r\n];\r\n\r\ndescribe(\"Field — nom accessible du contrôle\", () => {\r\n /* The case that already worked: a native, labelable child. Asserted so the\r\n * fix cannot regress it — adding `aria-labelledby` everywhere had to leave\r\n * this one announcing exactly the same string. */\r\n it(\"nomme un contrôle natif (déjà couvert par htmlFor)\", () => {\r\n render(\r\n <Field label=\"Référence de la demande\">\r\n <BareInput />\r\n </Field>\r\n );\r\n\r\n expect(screen.getByRole(\"textbox\")).toHaveAccessibleName(\r\n \"Référence de la demande\"\r\n );\r\n });\r\n\r\n /* THE DEFECT. A div-based control cannot be named by htmlFor/id. */\r\n it(\"nomme un Select, dont la surface est un div[role=combobox]\", () => {\r\n render(\r\n <Field label=\"Ville de l'unité\">\r\n <Select value=\"\" onChange={noop} options={OPTIONS} />\r\n </Field>\r\n );\r\n\r\n expect(screen.getByRole(\"combobox\")).toHaveAccessibleName(\r\n \"Ville de l'unité\"\r\n );\r\n });\r\n\r\n /* The required asterisk is `aria-hidden`, so it must not leak into the name:\r\n * \"Ville de l'unité *\" is not what a user should hear. */\r\n it(\"n'inclut pas l'astérisque des champs requis\", () => {\r\n render(\r\n <Field label=\"Ville de l'unité\" required>\r\n <Select value=\"\" onChange={noop} options={OPTIONS} />\r\n </Field>\r\n );\r\n\r\n expect(screen.getByRole(\"combobox\")).toHaveAccessibleName(\r\n \"Ville de l'unité\"\r\n );\r\n });\r\n\r\n /**\r\n * The reason `labelId` sits on a span around the TEXT and not on the label\r\n * element: `aria-labelledby` resolves to its target's text content, and a\r\n * help button inside the label carries its own accessible name. Anchoring on\r\n * the whole label would announce \"Ville de l'unité Aide sur ce champ\".\r\n *\r\n * This also fixes the `htmlFor` path, which had the same flaw.\r\n */\r\n it(\"n'inclut pas le nom du bouton d'aide du libellé\", () => {\r\n render(\r\n <Field\r\n label=\"Ville de l'unité\"\r\n helpAdornment={<FieldHelp ariaLabel=\"Aide sur ce champ\">Texte d'aide.</FieldHelp>}\r\n >\r\n <Select value=\"\" onChange={noop} options={OPTIONS} />\r\n </Field>\r\n );\r\n\r\n expect(screen.getByRole(\"combobox\")).toHaveAccessibleName(\r\n \"Ville de l'unité\"\r\n );\r\n });\r\n\r\n /* Group mode keeps working: the label is a plain span there, and the group is\r\n * named by `aria-labelledby` — which DOES reach its target, because it is the\r\n * child's own root that carries `role=\"group\"`. */\r\n it(\"nomme un groupe ARIA\", () => {\r\n render(\r\n <Field label=\"Type de contrôle\" group>\r\n <div role=\"group\">\r\n <input type=\"radio\" name=\"t\" aria-label=\"Documentaire\" />\r\n <input type=\"radio\" name=\"t\" aria-label=\"Physique\" />\r\n </div>\r\n </Field>\r\n );\r\n\r\n expect(screen.getByRole(\"group\")).toHaveAccessibleName(\"Type de contrôle\");\r\n });\r\n});\r\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,14 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
|
|
4
3
|
require("@testing-library/jest-dom");
|
|
5
4
|
var _react = require("@testing-library/react");
|
|
6
5
|
var _Field = _interopRequireWildcard(require("../components/Field"));
|
|
7
6
|
var _Input = _interopRequireDefault(require("../components/Input"));
|
|
8
7
|
var _jsxRuntime = require("react/jsx-runtime");
|
|
9
|
-
function _interopRequireDefault(
|
|
10
|
-
function
|
|
11
|
-
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
8
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
9
|
+
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
12
10
|
/**
|
|
13
11
|
* Field — largeur semantique (gap G-H) : tests de contrat.
|
|
14
12
|
*
|
|
@@ -39,8 +37,8 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
|
|
|
39
37
|
*
|
|
40
38
|
* Le comportement responsive lui-meme se verifie dans la story, en
|
|
41
39
|
* redimensionnant la fenetre — c'est la que le contrat est observable.
|
|
42
|
-
*/describe("Field — les cinq gabarits (G-H)",
|
|
43
|
-
test("les valeurs sont celles retenues dans la fourchette du standard",
|
|
40
|
+
*/describe("Field — les cinq gabarits (G-H)", () => {
|
|
41
|
+
test("les valeurs sont celles retenues dans la fourchette du standard", () => {
|
|
44
42
|
/* Fourchettes du standard, et valeur retenue (le HAUT, ces largeurs etant
|
|
45
43
|
* des plafonds) :
|
|
46
44
|
* xs ~80-120 -> 120 s ~160-200 -> 200
|
|
@@ -54,52 +52,52 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
|
|
|
54
52
|
expect(_Field.FIELD_MAX_WIDTH.l).toBe("var(--field-w-l, 600px)");
|
|
55
53
|
expect(_Field.FIELD_MAX_WIDTH.xl).toBe("100%");
|
|
56
54
|
});
|
|
57
|
-
test("les cinq gabarits du standard sont couverts, ni plus ni moins",
|
|
55
|
+
test("les cinq gabarits du standard sont couverts, ni plus ni moins", () => {
|
|
58
56
|
/* Un gabarit ajoute ou retire est un ecart au standard, pas un detail
|
|
59
57
|
* d'implementation. */
|
|
60
58
|
expect(Object.keys(_Field.FIELD_MAX_WIDTH).sort()).toEqual(["l", "m", "s", "xl", "xs"]);
|
|
61
59
|
});
|
|
62
60
|
});
|
|
63
|
-
describe("Field — `width` ne touche pas au cablage d'accessibilite",
|
|
64
|
-
test("le libelle nomme toujours le controle",
|
|
65
|
-
(0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_Field
|
|
61
|
+
describe("Field — `width` ne touche pas au cablage d'accessibilite", () => {
|
|
62
|
+
test("le libelle nomme toujours le controle", () => {
|
|
63
|
+
(0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_Field.default, {
|
|
66
64
|
label: "Identifiant fiscal",
|
|
67
65
|
htmlFor: "ifu",
|
|
68
66
|
width: "s",
|
|
69
|
-
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Input
|
|
67
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Input.default, {})
|
|
70
68
|
}));
|
|
71
69
|
expect(_react.screen.getByRole("textbox", {
|
|
72
70
|
name: /Identifiant fiscal/
|
|
73
71
|
})).toBeInTheDocument();
|
|
74
72
|
});
|
|
75
|
-
test("l'erreur reste la description accessible du controle",
|
|
76
|
-
(0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_Field
|
|
73
|
+
test("l'erreur reste la description accessible du controle", () => {
|
|
74
|
+
(0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_Field.default, {
|
|
77
75
|
label: "Identifiant fiscal",
|
|
78
76
|
htmlFor: "ifu",
|
|
79
77
|
width: "s",
|
|
80
78
|
error: "Quinze caract\xE8res maximum.",
|
|
81
|
-
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Input
|
|
79
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Input.default, {})
|
|
82
80
|
}));
|
|
83
81
|
expect(_react.screen.getByRole("textbox")).toHaveAccessibleDescription("Quinze caractères maximum.");
|
|
84
82
|
expect(_react.screen.getByRole("textbox")).toHaveAttribute("aria-invalid", "true");
|
|
85
83
|
});
|
|
86
|
-
test("l'indication reste la description accessible du controle",
|
|
87
|
-
(0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_Field
|
|
84
|
+
test("l'indication reste la description accessible du controle", () => {
|
|
85
|
+
(0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_Field.default, {
|
|
88
86
|
label: "Adresse",
|
|
89
87
|
htmlFor: "adresse",
|
|
90
88
|
width: "l",
|
|
91
89
|
hint: "Voie, code postal et ville.",
|
|
92
|
-
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Input
|
|
90
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Input.default, {})
|
|
93
91
|
}));
|
|
94
92
|
expect(_react.screen.getByRole("textbox")).toHaveAccessibleDescription("Voie, code postal et ville.");
|
|
95
93
|
});
|
|
96
|
-
test("`required` reste annonce comme tel",
|
|
97
|
-
(0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_Field
|
|
94
|
+
test("`required` reste annonce comme tel", () => {
|
|
95
|
+
(0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_Field.default, {
|
|
98
96
|
label: "Marque",
|
|
99
97
|
htmlFor: "marque",
|
|
100
98
|
width: "m",
|
|
101
99
|
required: true,
|
|
102
|
-
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Input
|
|
100
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Input.default, {})
|
|
103
101
|
}));
|
|
104
102
|
|
|
105
103
|
/* `toBeRequired` accepte l'attribut NATIF `required` comme `aria-required` :
|
|
@@ -120,8 +118,8 @@ describe("Field — `width` ne touche pas au cablage d'accessibilite", function
|
|
|
120
118
|
expect(_react.screen.getByRole("textbox")).toBeRequired();
|
|
121
119
|
});
|
|
122
120
|
});
|
|
123
|
-
describe("Field — l'omission reste neutre",
|
|
124
|
-
test("sans `width`, le champ se rend et se nomme comme avant G-H",
|
|
121
|
+
describe("Field — l'omission reste neutre", () => {
|
|
122
|
+
test("sans `width`, le champ se rend et se nomme comme avant G-H", () => {
|
|
125
123
|
/* Ce que ce test prouve, et ce qu'il ne prouve pas.
|
|
126
124
|
*
|
|
127
125
|
* L'absence de plafond n'est PAS assertable : elle se lit dans la feuille
|
|
@@ -134,12 +132,12 @@ describe("Field — l'omission reste neutre", function () {
|
|
|
134
132
|
* Ce qui EST verifiable et suffit a la retrocompatibilite : sans `width`,
|
|
135
133
|
* le controle est rendu, nomme par son libelle, et n'a herite d'aucun etat
|
|
136
134
|
* qu'il n'a pas demande. Le plafond, lui, se verifie dans la story. */
|
|
137
|
-
(0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_Field
|
|
135
|
+
(0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_Field.default, {
|
|
138
136
|
label: "Marque",
|
|
139
137
|
htmlFor: "sans-gabarit",
|
|
140
|
-
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Input
|
|
138
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Input.default, {})
|
|
141
139
|
}));
|
|
142
|
-
|
|
140
|
+
const champ = _react.screen.getByRole("textbox", {
|
|
143
141
|
name: /Marque/
|
|
144
142
|
});
|
|
145
143
|
expect(champ).toBeInTheDocument();
|