@portnet/ui 6.0.0 → 6.0.2
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 +85 -0
- package/dist/esm/index.js +214 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/v2/__tests__/FieldError.test.js +159 -0
- package/dist/esm/v2/__tests__/FieldError.test.js.map +1 -0
- package/dist/esm/v2/__tests__/FieldWidth.test.js +146 -0
- package/dist/esm/v2/__tests__/FieldWidth.test.js.map +1 -0
- package/dist/esm/v2/__tests__/FileCard.test.js +143 -0
- package/dist/esm/v2/__tests__/FileCard.test.js.map +1 -0
- package/dist/esm/v2/__tests__/FormikCheckbox.test.js +265 -0
- package/dist/esm/v2/__tests__/FormikCheckbox.test.js.map +1 -0
- package/dist/esm/v2/__tests__/FormikDateTimePicker.test.js +248 -0
- package/dist/esm/v2/__tests__/FormikDateTimePicker.test.js.map +1 -0
- package/dist/esm/v2/__tests__/FormikRadioGroup.test.js +380 -0
- package/dist/esm/v2/__tests__/FormikRadioGroup.test.js.map +1 -0
- package/dist/esm/v2/__tests__/MobileRowCard.test.js +332 -0
- package/dist/esm/v2/__tests__/MobileRowCard.test.js.map +1 -0
- package/dist/esm/v2/__tests__/SectionErrorBoundary.test.js +235 -0
- package/dist/esm/v2/__tests__/SectionErrorBoundary.test.js.map +1 -0
- package/dist/esm/v2/__tests__/apiError.test.js +181 -0
- package/dist/esm/v2/__tests__/apiError.test.js.map +1 -0
- package/dist/esm/v2/__tests__/banned-patterns.test.js +270 -0
- package/dist/esm/v2/__tests__/banned-patterns.test.js.map +1 -0
- package/dist/esm/v2/__tests__/contrast-palette.test.js +224 -0
- package/dist/esm/v2/__tests__/contrast-palette.test.js.map +1 -0
- package/dist/esm/v2/__tests__/cssVariables.test.js +157 -0
- package/dist/esm/v2/__tests__/cssVariables.test.js.map +1 -0
- package/dist/esm/v2/__tests__/labels-merge.test.js +146 -0
- package/dist/esm/v2/__tests__/labels-merge.test.js.map +1 -0
- package/dist/esm/v2/__tests__/locale-fallback.test.js +109 -0
- package/dist/esm/v2/__tests__/locale-fallback.test.js.map +1 -0
- package/dist/esm/v2/__tests__/useFocusTrap.test.js +514 -0
- package/dist/esm/v2/__tests__/useFocusTrap.test.js.map +1 -0
- package/dist/esm/v2/components/Accordion.js +230 -0
- package/dist/esm/v2/components/Accordion.js.map +1 -0
- package/dist/esm/v2/components/ActionStrip.js +146 -0
- package/dist/esm/v2/components/ActionStrip.js.map +1 -0
- package/dist/esm/v2/components/Banner.js +254 -0
- package/dist/esm/v2/components/Banner.js.map +1 -0
- package/dist/esm/v2/components/Busy.js +97 -0
- package/dist/esm/v2/components/Busy.js.map +1 -0
- package/dist/esm/v2/components/Button.js +114 -0
- package/dist/esm/v2/components/Button.js.map +1 -0
- package/dist/esm/v2/components/CategoryTag.js +81 -0
- package/dist/esm/v2/components/CategoryTag.js.map +1 -0
- package/dist/esm/v2/components/Checkbox.js +124 -0
- package/dist/esm/v2/components/Checkbox.js.map +1 -0
- package/dist/esm/v2/components/Chip.js +124 -0
- package/dist/esm/v2/components/Chip.js.map +1 -0
- package/dist/esm/v2/components/Combobox.js +394 -0
- package/dist/esm/v2/components/Combobox.js.map +1 -0
- package/dist/esm/v2/components/CommandPalette.js +660 -0
- package/dist/esm/v2/components/CommandPalette.js.map +1 -0
- package/dist/esm/v2/components/ConfirmDialog.js +144 -0
- package/dist/esm/v2/components/ConfirmDialog.js.map +1 -0
- package/dist/esm/v2/components/DatePicker.js +200 -0
- package/dist/esm/v2/components/DatePicker.js.map +1 -0
- package/dist/esm/v2/components/DateRangePicker.js +289 -0
- package/dist/esm/v2/components/DateRangePicker.js.map +1 -0
- package/dist/esm/v2/components/DateTimePicker.js +215 -0
- package/dist/esm/v2/components/DateTimePicker.js.map +1 -0
- package/dist/esm/v2/components/Drawer.js +333 -0
- package/dist/esm/v2/components/Drawer.js.map +1 -0
- package/dist/esm/v2/components/Dropzone.js +540 -0
- package/dist/esm/v2/components/Dropzone.js.map +1 -0
- package/dist/esm/v2/components/EmptyState.js +102 -0
- package/dist/esm/v2/components/EmptyState.js.map +1 -0
- package/dist/esm/v2/components/FavoriteToggle.js +127 -0
- package/dist/esm/v2/components/FavoriteToggle.js.map +1 -0
- package/dist/esm/v2/components/Field.js +259 -0
- package/dist/esm/v2/components/Field.js.map +1 -0
- package/dist/esm/v2/components/FieldError.js +124 -0
- package/dist/esm/v2/components/FieldError.js.map +1 -0
- package/dist/esm/v2/components/FieldHelp.js +202 -0
- package/dist/esm/v2/components/FieldHelp.js.map +1 -0
- package/dist/esm/v2/components/FileCard.js +162 -0
- package/dist/esm/v2/components/FileCard.js.map +1 -0
- package/dist/esm/v2/components/FilterTab.js +138 -0
- package/dist/esm/v2/components/FilterTab.js.map +1 -0
- package/dist/esm/v2/components/ForbiddenPage.js +74 -0
- package/dist/esm/v2/components/ForbiddenPage.js.map +1 -0
- package/dist/esm/v2/components/FormGrid.js +179 -0
- package/dist/esm/v2/components/FormGrid.js.map +1 -0
- package/dist/esm/v2/components/FormikDisplay.js +118 -0
- package/dist/esm/v2/components/FormikDisplay.js.map +1 -0
- package/dist/esm/v2/components/Input.js +107 -0
- package/dist/esm/v2/components/Input.js.map +1 -0
- package/dist/esm/v2/components/KPICard.js +237 -0
- package/dist/esm/v2/components/KPICard.js.map +1 -0
- package/dist/esm/v2/components/KPIStrip.js +84 -0
- package/dist/esm/v2/components/KPIStrip.js.map +1 -0
- package/dist/esm/v2/components/KV.js +75 -0
- package/dist/esm/v2/components/KV.js.map +1 -0
- package/dist/esm/v2/components/KVGrid.js +74 -0
- package/dist/esm/v2/components/KVGrid.js.map +1 -0
- package/dist/esm/v2/components/Layout.js +284 -0
- package/dist/esm/v2/components/Layout.js.map +1 -0
- package/dist/esm/v2/components/MobileRowCard.js +314 -0
- package/dist/esm/v2/components/MobileRowCard.js.map +1 -0
- package/dist/esm/v2/components/Modal.js +276 -0
- package/dist/esm/v2/components/Modal.js.map +1 -0
- package/dist/esm/v2/components/NetworkErrorPage.js +78 -0
- package/dist/esm/v2/components/NetworkErrorPage.js.map +1 -0
- package/dist/esm/v2/components/NotFoundPage.js +58 -0
- package/dist/esm/v2/components/NotFoundPage.js.map +1 -0
- package/dist/esm/v2/components/NumberInput.js +309 -0
- package/dist/esm/v2/components/NumberInput.js.map +1 -0
- package/dist/esm/v2/components/OverflowMenu.js +184 -0
- package/dist/esm/v2/components/OverflowMenu.js.map +1 -0
- package/dist/esm/v2/components/PdfViewer.js +122 -0
- package/dist/esm/v2/components/PdfViewer.js.map +1 -0
- package/dist/esm/v2/components/ProgressBar.js +202 -0
- package/dist/esm/v2/components/ProgressBar.js.map +1 -0
- package/dist/esm/v2/components/Radio.js +228 -0
- package/dist/esm/v2/components/Radio.js.map +1 -0
- package/dist/esm/v2/components/SectionErrorBoundary.js +214 -0
- package/dist/esm/v2/components/SectionErrorBoundary.js.map +1 -0
- package/dist/esm/v2/components/SectionHeader.js +132 -0
- package/dist/esm/v2/components/SectionHeader.js.map +1 -0
- package/dist/esm/v2/components/Segmented.js +254 -0
- package/dist/esm/v2/components/Segmented.js.map +1 -0
- package/dist/esm/v2/components/Select.js +490 -0
- package/dist/esm/v2/components/Select.js.map +1 -0
- package/dist/esm/v2/components/ServerErrorPage.js +74 -0
- package/dist/esm/v2/components/ServerErrorPage.js.map +1 -0
- package/dist/esm/v2/components/Skeleton.js +269 -0
- package/dist/esm/v2/components/Skeleton.js.map +1 -0
- package/dist/esm/v2/components/SkipLink.js +49 -0
- package/dist/esm/v2/components/SkipLink.js.map +1 -0
- package/dist/esm/v2/components/Spinner.js +69 -0
- package/dist/esm/v2/components/Spinner.js.map +1 -0
- package/dist/esm/v2/components/Status.js +64 -0
- package/dist/esm/v2/components/Status.js.map +1 -0
- package/dist/esm/v2/components/Stepper.js +432 -0
- package/dist/esm/v2/components/Stepper.js.map +1 -0
- package/dist/esm/v2/components/Surface.js +159 -0
- package/dist/esm/v2/components/Surface.js.map +1 -0
- package/dist/esm/v2/components/Switch.js +128 -0
- package/dist/esm/v2/components/Switch.js.map +1 -0
- package/dist/esm/v2/components/Tabs.js +150 -0
- package/dist/esm/v2/components/Tabs.js.map +1 -0
- package/dist/esm/v2/components/TelInput.js +274 -0
- package/dist/esm/v2/components/TelInput.js.map +1 -0
- package/dist/esm/v2/components/Textarea.js +72 -0
- package/dist/esm/v2/components/Textarea.js.map +1 -0
- package/dist/esm/v2/components/TimePicker.js +134 -0
- package/dist/esm/v2/components/TimePicker.js.map +1 -0
- package/dist/esm/v2/components/Toast.js +376 -0
- package/dist/esm/v2/components/Toast.js.map +1 -0
- package/dist/esm/v2/components/Tooltip.js +161 -0
- package/dist/esm/v2/components/Tooltip.js.map +1 -0
- package/dist/esm/v2/components/_ErrorPageBody.js +85 -0
- package/dist/esm/v2/components/_ErrorPageBody.js.map +1 -0
- package/dist/esm/v2/components/_pickerShared.js +60 -0
- package/dist/esm/v2/components/_pickerShared.js.map +1 -0
- package/dist/esm/v2/components/index.js +271 -0
- package/dist/esm/v2/components/index.js.map +1 -0
- package/dist/esm/v2/hooks/index.js +10 -0
- package/dist/esm/v2/hooks/index.js.map +1 -0
- package/dist/esm/v2/hooks/useDelayedFlag.js +55 -0
- package/dist/esm/v2/hooks/useDelayedFlag.js.map +1 -0
- package/dist/esm/v2/hooks/useDensity.js +119 -0
- package/dist/esm/v2/hooks/useDensity.js.map +1 -0
- package/dist/esm/v2/hooks/useFocusFirstError.js +197 -0
- package/dist/esm/v2/hooks/useFocusFirstError.js.map +1 -0
- package/dist/esm/v2/hooks/useFocusTrap.js +202 -0
- package/dist/esm/v2/hooks/useFocusTrap.js.map +1 -0
- package/dist/esm/v2/hooks/useFormAutoSave.js +181 -0
- package/dist/esm/v2/hooks/useFormAutoSave.js.map +1 -0
- package/dist/esm/v2/hooks/useFormCompletionProgress.js +131 -0
- package/dist/esm/v2/hooks/useFormCompletionProgress.js.map +1 -0
- package/dist/esm/v2/hooks/useResolvedDensity.js +44 -0
- package/dist/esm/v2/hooks/useResolvedDensity.js.map +1 -0
- package/dist/esm/v2/hooks/useSortedRows.js +32 -0
- package/dist/esm/v2/hooks/useSortedRows.js.map +1 -0
- package/dist/esm/v2/hooks/useTabLoading.js +79 -0
- package/dist/esm/v2/hooks/useTabLoading.js.map +1 -0
- package/dist/esm/v2/index.js +132 -0
- package/dist/esm/v2/index.js.map +1 -0
- package/dist/esm/v2/modalContext.js +108 -0
- package/dist/esm/v2/modalContext.js.map +1 -0
- package/dist/esm/v2/models/favorite.js +2 -0
- package/dist/esm/v2/models/favorite.js.map +1 -0
- package/dist/esm/v2/models/index.js +12 -0
- package/dist/esm/v2/models/index.js.map +1 -0
- package/dist/esm/v2/models/personalization.js +2 -0
- package/dist/esm/v2/models/personalization.js.map +1 -0
- package/dist/esm/v2/models/referentiel.js +2 -0
- package/dist/esm/v2/models/referentiel.js.map +1 -0
- package/dist/esm/v2/models/savedFilter.js +2 -0
- package/dist/esm/v2/models/savedFilter.js.map +1 -0
- package/dist/esm/v2/patterns/ActionBar.js +603 -0
- package/dist/esm/v2/patterns/ActionBar.js.map +1 -0
- package/dist/esm/v2/patterns/BulkActionBar.js +147 -0
- package/dist/esm/v2/patterns/BulkActionBar.js.map +1 -0
- package/dist/esm/v2/patterns/CollapsibleDataGrid.js +303 -0
- package/dist/esm/v2/patterns/CollapsibleDataGrid.js.map +1 -0
- package/dist/esm/v2/patterns/ColumnsToggle.js +301 -0
- package/dist/esm/v2/patterns/ColumnsToggle.js.map +1 -0
- package/dist/esm/v2/patterns/DataGrid.js +820 -0
- package/dist/esm/v2/patterns/DataGrid.js.map +1 -0
- package/dist/esm/v2/patterns/DataGridSettingsMenu.js +375 -0
- package/dist/esm/v2/patterns/DataGridSettingsMenu.js.map +1 -0
- package/dist/esm/v2/patterns/DataGridToolbar.js +249 -0
- package/dist/esm/v2/patterns/DataGridToolbar.js.map +1 -0
- package/dist/esm/v2/patterns/DataGridVirtualized.js +523 -0
- package/dist/esm/v2/patterns/DataGridVirtualized.js.map +1 -0
- package/dist/esm/v2/patterns/DeleteResourceConfirmDialog.js +70 -0
- package/dist/esm/v2/patterns/DeleteResourceConfirmDialog.js.map +1 -0
- package/dist/esm/v2/patterns/FavoriteColumn.js +117 -0
- package/dist/esm/v2/patterns/FavoriteColumn.js.map +1 -0
- package/dist/esm/v2/patterns/FavoritesFilter.js +91 -0
- package/dist/esm/v2/patterns/FavoritesFilter.js.map +1 -0
- package/dist/esm/v2/patterns/FormErrorSummary.js +101 -0
- package/dist/esm/v2/patterns/FormErrorSummary.js.map +1 -0
- package/dist/esm/v2/patterns/FormPageShell.js +126 -0
- package/dist/esm/v2/patterns/FormPageShell.js.map +1 -0
- package/dist/esm/v2/patterns/FormSection.js +190 -0
- package/dist/esm/v2/patterns/FormSection.js.map +1 -0
- package/dist/esm/v2/patterns/FormikCheckbox.js +140 -0
- package/dist/esm/v2/patterns/FormikCheckbox.js.map +1 -0
- package/dist/esm/v2/patterns/FormikCheckboxGroup.js +110 -0
- package/dist/esm/v2/patterns/FormikCheckboxGroup.js.map +1 -0
- package/dist/esm/v2/patterns/FormikCombobox.js +118 -0
- package/dist/esm/v2/patterns/FormikCombobox.js.map +1 -0
- package/dist/esm/v2/patterns/FormikDatePicker.js +162 -0
- package/dist/esm/v2/patterns/FormikDatePicker.js.map +1 -0
- package/dist/esm/v2/patterns/FormikDateTimePicker.js +150 -0
- package/dist/esm/v2/patterns/FormikDateTimePicker.js.map +1 -0
- package/dist/esm/v2/patterns/FormikErrorFocus.js +77 -0
- package/dist/esm/v2/patterns/FormikErrorFocus.js.map +1 -0
- package/dist/esm/v2/patterns/FormikFile.js +148 -0
- package/dist/esm/v2/patterns/FormikFile.js.map +1 -0
- package/dist/esm/v2/patterns/FormikInput.js +130 -0
- package/dist/esm/v2/patterns/FormikInput.js.map +1 -0
- package/dist/esm/v2/patterns/FormikRadioGroup.js +141 -0
- package/dist/esm/v2/patterns/FormikRadioGroup.js.map +1 -0
- package/dist/esm/v2/patterns/FormikReferentielField.js +116 -0
- package/dist/esm/v2/patterns/FormikReferentielField.js.map +1 -0
- package/dist/esm/v2/patterns/FormikSelect.js +162 -0
- package/dist/esm/v2/patterns/FormikSelect.js.map +1 -0
- package/dist/esm/v2/patterns/FormikTextarea.js +79 -0
- package/dist/esm/v2/patterns/FormikTextarea.js.map +1 -0
- package/dist/esm/v2/patterns/KeyboardShortcutsHelp.js +212 -0
- package/dist/esm/v2/patterns/KeyboardShortcutsHelp.js.map +1 -0
- package/dist/esm/v2/patterns/NetworkErrorBanner.js +72 -0
- package/dist/esm/v2/patterns/NetworkErrorBanner.js.map +1 -0
- package/dist/esm/v2/patterns/PageContent.js +62 -0
- package/dist/esm/v2/patterns/PageContent.js.map +1 -0
- package/dist/esm/v2/patterns/ReferentielField.js +615 -0
- package/dist/esm/v2/patterns/ReferentielField.js.map +1 -0
- package/dist/esm/v2/patterns/RowFavoriteToggle.js +122 -0
- package/dist/esm/v2/patterns/RowFavoriteToggle.js.map +1 -0
- package/dist/esm/v2/patterns/SaveFilterDialog.js +197 -0
- package/dist/esm/v2/patterns/SaveFilterDialog.js.map +1 -0
- package/dist/esm/v2/patterns/SavedFiltersMenu.js +406 -0
- package/dist/esm/v2/patterns/SavedFiltersMenu.js.map +1 -0
- package/dist/esm/v2/patterns/SkeletonPageShell.js +342 -0
- package/dist/esm/v2/patterns/SkeletonPageShell.js.map +1 -0
- package/dist/esm/v2/patterns/SortableHeader.js +179 -0
- package/dist/esm/v2/patterns/SortableHeader.js.map +1 -0
- package/dist/esm/v2/patterns/Tour.js +471 -0
- package/dist/esm/v2/patterns/Tour.js.map +1 -0
- package/dist/esm/v2/patterns/_dataGridShared.js +431 -0
- package/dist/esm/v2/patterns/_dataGridShared.js.map +1 -0
- package/dist/esm/v2/patterns/_pickerSerialisation.js +74 -0
- package/dist/esm/v2/patterns/_pickerSerialisation.js.map +1 -0
- package/dist/esm/v2/patterns/_sort.js +112 -0
- package/dist/esm/v2/patterns/_sort.js.map +1 -0
- package/dist/esm/v2/patterns/_useColumnReorder.js +257 -0
- package/dist/esm/v2/patterns/_useColumnReorder.js.map +1 -0
- package/dist/esm/v2/patterns/_useColumnResize.js +191 -0
- package/dist/esm/v2/patterns/_useColumnResize.js.map +1 -0
- package/dist/esm/v2/patterns/index.js +178 -0
- package/dist/esm/v2/patterns/index.js.map +1 -0
- package/dist/esm/v2/personalization/PersonalizationProvider.js +168 -0
- package/dist/esm/v2/personalization/PersonalizationProvider.js.map +1 -0
- package/dist/esm/v2/personalization/adapters/_storageKey.js +60 -0
- package/dist/esm/v2/personalization/adapters/_storageKey.js.map +1 -0
- package/dist/esm/v2/personalization/adapters/createLocalStorageAdapter.js +124 -0
- package/dist/esm/v2/personalization/adapters/createLocalStorageAdapter.js.map +1 -0
- package/dist/esm/v2/personalization/adapters/createMemoryAdapter.js +70 -0
- package/dist/esm/v2/personalization/adapters/createMemoryAdapter.js.map +1 -0
- package/dist/esm/v2/personalization/adapters/index.js +11 -0
- package/dist/esm/v2/personalization/adapters/index.js.map +1 -0
- package/dist/esm/v2/personalization/capabilities/favorites.js +216 -0
- package/dist/esm/v2/personalization/capabilities/favorites.js.map +1 -0
- package/dist/esm/v2/personalization/capabilities/favoritesView.js +111 -0
- package/dist/esm/v2/personalization/capabilities/favoritesView.js.map +1 -0
- package/dist/esm/v2/personalization/capabilities/gridPreferences.js +209 -0
- package/dist/esm/v2/personalization/capabilities/gridPreferences.js.map +1 -0
- package/dist/esm/v2/personalization/capabilities/index.js +22 -0
- package/dist/esm/v2/personalization/capabilities/index.js.map +1 -0
- package/dist/esm/v2/personalization/capabilities/savedFilters.js +291 -0
- package/dist/esm/v2/personalization/capabilities/savedFilters.js.map +1 -0
- package/dist/esm/v2/personalization/createPersonalizationStore.js +472 -0
- package/dist/esm/v2/personalization/createPersonalizationStore.js.map +1 -0
- package/dist/esm/v2/personalization/index.js +64 -0
- package/dist/esm/v2/personalization/index.js.map +1 -0
- package/dist/esm/v2/personalization/personalizationContext.js +108 -0
- package/dist/esm/v2/personalization/personalizationContext.js.map +1 -0
- package/dist/esm/v2/personalization/schema.js +92 -0
- package/dist/esm/v2/personalization/schema.js.map +1 -0
- package/dist/esm/v2/personalization/types.js +2 -0
- package/dist/esm/v2/personalization/types.js.map +1 -0
- package/dist/esm/v2/referentiel/ReferentielProvider.js +87 -0
- package/dist/esm/v2/referentiel/ReferentielProvider.js.map +1 -0
- package/dist/esm/v2/referentiel/index.js +15 -0
- package/dist/esm/v2/referentiel/index.js.map +1 -0
- package/dist/esm/v2/referentiel/useReferentielClient.js +37 -0
- package/dist/esm/v2/referentiel/useReferentielClient.js.map +1 -0
- package/dist/esm/v2/referentiel/useReferentielOptions.js +169 -0
- package/dist/esm/v2/referentiel/useReferentielOptions.js.map +1 -0
- package/dist/esm/v2/referentiel/useReferentielSearch.js +132 -0
- package/dist/esm/v2/referentiel/useReferentielSearch.js.map +1 -0
- package/dist/esm/v2/styles/base.css +425 -0
- package/dist/esm/v2/styles/css.d.ts +10 -0
- package/dist/esm/v2/styles/index.js +12 -0
- package/dist/esm/v2/styles/index.js.map +1 -0
- package/dist/esm/v2/theme/_brand.js +64 -0
- package/dist/esm/v2/theme/_brand.js.map +1 -0
- package/dist/esm/v2/theme/_brandSecondary.js +60 -0
- package/dist/esm/v2/theme/_brandSecondary.js.map +1 -0
- package/dist/esm/v2/theme/createPortnetTheme.js +548 -0
- package/dist/esm/v2/theme/createPortnetTheme.js.map +1 -0
- package/dist/esm/v2/theme/cssVariables.js +198 -0
- package/dist/esm/v2/theme/cssVariables.js.map +1 -0
- package/dist/esm/v2/theme/index.js +32 -0
- package/dist/esm/v2/theme/index.js.map +1 -0
- package/dist/esm/v2/tokens/breakpoints.js +106 -0
- package/dist/esm/v2/tokens/breakpoints.js.map +1 -0
- package/dist/esm/v2/tokens/colors.js +219 -0
- package/dist/esm/v2/tokens/colors.js.map +1 -0
- package/dist/esm/v2/tokens/density.js +98 -0
- package/dist/esm/v2/tokens/density.js.map +1 -0
- package/dist/esm/v2/tokens/index.js +80 -0
- package/dist/esm/v2/tokens/index.js.map +1 -0
- package/dist/esm/v2/tokens/motion.js +88 -0
- package/dist/esm/v2/tokens/motion.js.map +1 -0
- package/dist/esm/v2/tokens/radius.js +22 -0
- package/dist/esm/v2/tokens/radius.js.map +1 -0
- package/dist/esm/v2/tokens/shadows.js +40 -0
- package/dist/esm/v2/tokens/shadows.js.map +1 -0
- package/dist/esm/v2/tokens/spacing.js +51 -0
- package/dist/esm/v2/tokens/spacing.js.map +1 -0
- package/dist/esm/v2/tokens/state.js +41 -0
- package/dist/esm/v2/tokens/state.js.map +1 -0
- package/dist/esm/v2/tokens/statusPalette.js +66 -0
- package/dist/esm/v2/tokens/statusPalette.js.map +1 -0
- package/dist/esm/v2/tokens/tokens.json +153 -0
- package/dist/esm/v2/tokens/typography.js +149 -0
- package/dist/esm/v2/tokens/typography.js.map +1 -0
- package/dist/esm/v2/tokens/zIndex.js +44 -0
- package/dist/esm/v2/tokens/zIndex.js.map +1 -0
- package/dist/esm/v2/types/common.js +2 -0
- package/dist/esm/v2/types/common.js.map +1 -0
- package/dist/esm/v2/types/datagrid.js +2 -0
- package/dist/esm/v2/types/datagrid.js.map +1 -0
- package/dist/esm/v2/types/index.js +12 -0
- package/dist/esm/v2/types/index.js.map +1 -0
- package/dist/esm/v2/utils/apiError.js +281 -0
- package/dist/esm/v2/utils/apiError.js.map +1 -0
- package/dist/esm/v2/utils/contrast.js +157 -0
- package/dist/esm/v2/utils/contrast.js.map +1 -0
- package/dist/esm/v2/utils/cx.js +38 -0
- package/dist/esm/v2/utils/cx.js.map +1 -0
- package/dist/esm/v2/utils/fileDownload.js +226 -0
- package/dist/esm/v2/utils/fileDownload.js.map +1 -0
- package/dist/esm/v2/utils/fmtMoney.js +78 -0
- package/dist/esm/v2/utils/fmtMoney.js.map +1 -0
- package/dist/esm/v2/utils/index.js +43 -0
- package/dist/esm/v2/utils/index.js.map +1 -0
- package/dist/esm/v2/utils/mergeLabels.js +86 -0
- package/dist/esm/v2/utils/mergeLabels.js.map +1 -0
- package/dist/esm/v2/utils/networkStatus.js +114 -0
- package/dist/esm/v2/utils/networkStatus.js.map +1 -0
- package/dist/index.d.ts +5 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +35 -0
- package/dist/index.js.map +1 -1
- package/dist/v2/__tests__/FieldError.test.js +160 -0
- package/dist/v2/__tests__/FieldError.test.js.map +1 -0
- package/dist/v2/__tests__/FieldWidth.test.js +150 -0
- package/dist/v2/__tests__/FieldWidth.test.js.map +1 -0
- package/dist/v2/__tests__/FileCard.test.js +144 -0
- package/dist/v2/__tests__/FileCard.test.js.map +1 -0
- package/dist/v2/__tests__/FormikCheckbox.test.js +268 -0
- package/dist/v2/__tests__/FormikCheckbox.test.js.map +1 -0
- package/dist/v2/__tests__/FormikDateTimePicker.test.js +247 -0
- package/dist/v2/__tests__/FormikDateTimePicker.test.js.map +1 -0
- package/dist/v2/__tests__/FormikRadioGroup.test.js +381 -0
- package/dist/v2/__tests__/FormikRadioGroup.test.js.map +1 -0
- package/dist/v2/__tests__/MobileRowCard.test.js +52 -56
- package/dist/v2/__tests__/MobileRowCard.test.js.map +1 -1
- package/dist/v2/__tests__/SectionErrorBoundary.test.js +237 -0
- package/dist/v2/__tests__/SectionErrorBoundary.test.js.map +1 -0
- package/dist/v2/__tests__/labels-merge.test.js +20 -24
- package/dist/v2/__tests__/labels-merge.test.js.map +1 -1
- package/dist/v2/components/Accordion.d.ts +6 -6
- package/dist/v2/components/Accordion.d.ts.map +1 -1
- package/dist/v2/components/Accordion.js.map +1 -1
- package/dist/v2/components/ActionStrip.d.ts +12 -12
- package/dist/v2/components/ActionStrip.d.ts.map +1 -1
- package/dist/v2/components/ActionStrip.js.map +1 -1
- package/dist/v2/components/Banner.d.ts +48 -9
- package/dist/v2/components/Banner.d.ts.map +1 -1
- package/dist/v2/components/Banner.js +116 -35
- package/dist/v2/components/Banner.js.map +1 -1
- package/dist/v2/components/Busy.d.ts +3 -3
- package/dist/v2/components/Busy.d.ts.map +1 -1
- package/dist/v2/components/Busy.js.map +1 -1
- package/dist/v2/components/Button.d.ts +6 -6
- package/dist/v2/components/Button.d.ts.map +1 -1
- package/dist/v2/components/Button.js.map +1 -1
- package/dist/v2/components/CategoryTag.d.ts +3 -3
- package/dist/v2/components/CategoryTag.d.ts.map +1 -1
- package/dist/v2/components/CategoryTag.js.map +1 -1
- package/dist/v2/components/Checkbox.d.ts +11 -11
- package/dist/v2/components/Checkbox.d.ts.map +1 -1
- package/dist/v2/components/Checkbox.js.map +1 -1
- package/dist/v2/components/Chip.d.ts +8 -8
- package/dist/v2/components/Chip.d.ts.map +1 -1
- package/dist/v2/components/Chip.js +2 -1
- package/dist/v2/components/Chip.js.map +1 -1
- package/dist/v2/components/Combobox.d.ts +27 -27
- package/dist/v2/components/Combobox.d.ts.map +1 -1
- package/dist/v2/components/Combobox.js +3 -2
- package/dist/v2/components/Combobox.js.map +1 -1
- package/dist/v2/components/CommandPalette.d.ts +20 -20
- package/dist/v2/components/CommandPalette.d.ts.map +1 -1
- package/dist/v2/components/CommandPalette.js +2 -6
- package/dist/v2/components/CommandPalette.js.map +1 -1
- package/dist/v2/components/ConfirmDialog.d.ts +13 -13
- package/dist/v2/components/ConfirmDialog.d.ts.map +1 -1
- package/dist/v2/components/ConfirmDialog.js +2 -1
- package/dist/v2/components/ConfirmDialog.js.map +1 -1
- package/dist/v2/components/DatePicker.d.ts +11 -11
- package/dist/v2/components/DatePicker.d.ts.map +1 -1
- package/dist/v2/components/DatePicker.js.map +1 -1
- package/dist/v2/components/DateRangePicker.d.ts +16 -16
- package/dist/v2/components/DateRangePicker.d.ts.map +1 -1
- package/dist/v2/components/DateRangePicker.js +2 -1
- package/dist/v2/components/DateRangePicker.js.map +1 -1
- package/dist/v2/components/DateTimePicker.d.ts +11 -11
- package/dist/v2/components/DateTimePicker.d.ts.map +1 -1
- package/dist/v2/components/DateTimePicker.js +37 -4
- package/dist/v2/components/DateTimePicker.js.map +1 -1
- package/dist/v2/components/Drawer.d.ts +18 -18
- package/dist/v2/components/Drawer.d.ts.map +1 -1
- package/dist/v2/components/Drawer.js +2 -1
- package/dist/v2/components/Drawer.js.map +1 -1
- package/dist/v2/components/Dropzone.d.ts +34 -34
- package/dist/v2/components/Dropzone.d.ts.map +1 -1
- package/dist/v2/components/Dropzone.js +11 -3
- package/dist/v2/components/Dropzone.js.map +1 -1
- package/dist/v2/components/EmptyState.d.ts +7 -7
- package/dist/v2/components/EmptyState.d.ts.map +1 -1
- package/dist/v2/components/EmptyState.js.map +1 -1
- package/dist/v2/components/FavoriteToggle.d.ts +7 -7
- package/dist/v2/components/FavoriteToggle.d.ts.map +1 -1
- package/dist/v2/components/FavoriteToggle.js +2 -1
- package/dist/v2/components/FavoriteToggle.js.map +1 -1
- package/dist/v2/components/Field.d.ts +76 -13
- package/dist/v2/components/Field.d.ts.map +1 -1
- package/dist/v2/components/Field.js +87 -9
- package/dist/v2/components/Field.js.map +1 -1
- package/dist/v2/components/FieldError.d.ts +78 -0
- package/dist/v2/components/FieldError.d.ts.map +1 -0
- package/dist/v2/components/FieldError.js +131 -0
- package/dist/v2/components/FieldError.js.map +1 -0
- package/dist/v2/components/FieldHelp.d.ts +7 -7
- package/dist/v2/components/FieldHelp.d.ts.map +1 -1
- package/dist/v2/components/FieldHelp.js.map +1 -1
- package/dist/v2/components/FileCard.d.ts +75 -0
- package/dist/v2/components/FileCard.d.ts.map +1 -0
- package/dist/v2/components/FileCard.js +169 -0
- package/dist/v2/components/FileCard.js.map +1 -0
- package/dist/v2/components/FilterTab.d.ts +9 -9
- package/dist/v2/components/FilterTab.d.ts.map +1 -1
- package/dist/v2/components/FilterTab.js +2 -1
- package/dist/v2/components/FilterTab.js.map +1 -1
- package/dist/v2/components/FormGrid.d.ts +9 -4
- package/dist/v2/components/FormGrid.d.ts.map +1 -1
- package/dist/v2/components/FormGrid.js +11 -1
- package/dist/v2/components/FormGrid.js.map +1 -1
- package/dist/v2/components/FormikDisplay.d.ts +6 -6
- package/dist/v2/components/FormikDisplay.d.ts.map +1 -1
- package/dist/v2/components/FormikDisplay.js.map +1 -1
- package/dist/v2/components/Input.d.ts +6 -6
- package/dist/v2/components/Input.d.ts.map +1 -1
- package/dist/v2/components/Input.js.map +1 -1
- package/dist/v2/components/KPICard.d.ts +43 -13
- package/dist/v2/components/KPICard.d.ts.map +1 -1
- package/dist/v2/components/KPICard.js +53 -14
- package/dist/v2/components/KPICard.js.map +1 -1
- package/dist/v2/components/KPIStrip.d.ts +68 -0
- package/dist/v2/components/KPIStrip.d.ts.map +1 -0
- package/dist/v2/components/KPIStrip.js +92 -0
- package/dist/v2/components/KPIStrip.js.map +1 -0
- package/dist/v2/components/KV.d.ts +3 -3
- package/dist/v2/components/KV.d.ts.map +1 -1
- package/dist/v2/components/KV.js.map +1 -1
- package/dist/v2/components/KVGrid.d.ts +2 -2
- package/dist/v2/components/KVGrid.d.ts.map +1 -1
- package/dist/v2/components/KVGrid.js +8 -1
- package/dist/v2/components/KVGrid.js.map +1 -1
- package/dist/v2/components/Layout.d.ts +7 -7
- package/dist/v2/components/Layout.d.ts.map +1 -1
- package/dist/v2/components/Layout.js.map +1 -1
- package/dist/v2/components/MobileRowCard.d.ts +13 -13
- package/dist/v2/components/MobileRowCard.d.ts.map +1 -1
- package/dist/v2/components/MobileRowCard.js.map +1 -1
- package/dist/v2/components/Modal.d.ts +12 -12
- package/dist/v2/components/Modal.d.ts.map +1 -1
- package/dist/v2/components/Modal.js.map +1 -1
- package/dist/v2/components/NetworkErrorPage.d.ts +1 -1
- package/dist/v2/components/NetworkErrorPage.d.ts.map +1 -1
- package/dist/v2/components/NetworkErrorPage.js.map +1 -1
- package/dist/v2/components/NumberInput.d.ts +14 -14
- package/dist/v2/components/NumberInput.d.ts.map +1 -1
- package/dist/v2/components/NumberInput.js +7 -6
- package/dist/v2/components/NumberInput.js.map +1 -1
- package/dist/v2/components/OverflowMenu.d.ts +14 -14
- package/dist/v2/components/OverflowMenu.d.ts.map +1 -1
- package/dist/v2/components/OverflowMenu.js +4 -8
- package/dist/v2/components/OverflowMenu.js.map +1 -1
- package/dist/v2/components/PdfViewer.d.ts +9 -9
- package/dist/v2/components/PdfViewer.d.ts.map +1 -1
- package/dist/v2/components/PdfViewer.js.map +1 -1
- package/dist/v2/components/ProgressBar.d.ts +10 -10
- package/dist/v2/components/ProgressBar.d.ts.map +1 -1
- package/dist/v2/components/ProgressBar.js.map +1 -1
- package/dist/v2/components/Radio.d.ts +7 -7
- package/dist/v2/components/Radio.d.ts.map +1 -1
- package/dist/v2/components/Radio.js.map +1 -1
- package/dist/v2/components/SectionErrorBoundary.d.ts +89 -0
- package/dist/v2/components/SectionErrorBoundary.d.ts.map +1 -0
- package/dist/v2/components/SectionErrorBoundary.js +221 -0
- package/dist/v2/components/SectionErrorBoundary.js.map +1 -0
- package/dist/v2/components/SectionHeader.d.ts +5 -5
- package/dist/v2/components/SectionHeader.d.ts.map +1 -1
- package/dist/v2/components/SectionHeader.js.map +1 -1
- package/dist/v2/components/Segmented.d.ts +11 -11
- package/dist/v2/components/Segmented.d.ts.map +1 -1
- package/dist/v2/components/Segmented.js.map +1 -1
- package/dist/v2/components/Select.d.ts +33 -15
- package/dist/v2/components/Select.d.ts.map +1 -1
- package/dist/v2/components/Select.js +147 -30
- package/dist/v2/components/Select.js.map +1 -1
- package/dist/v2/components/ServerErrorPage.d.ts +1 -1
- package/dist/v2/components/ServerErrorPage.d.ts.map +1 -1
- package/dist/v2/components/ServerErrorPage.js.map +1 -1
- package/dist/v2/components/Skeleton.d.ts +15 -15
- package/dist/v2/components/Skeleton.d.ts.map +1 -1
- package/dist/v2/components/Skeleton.js.map +1 -1
- package/dist/v2/components/SkipLink.d.ts +2 -2
- package/dist/v2/components/SkipLink.d.ts.map +1 -1
- package/dist/v2/components/SkipLink.js.map +1 -1
- package/dist/v2/components/Status.d.ts +3 -3
- package/dist/v2/components/Status.d.ts.map +1 -1
- package/dist/v2/components/Status.js.map +1 -1
- package/dist/v2/components/Stepper.d.ts +28 -22
- package/dist/v2/components/Stepper.d.ts.map +1 -1
- package/dist/v2/components/Stepper.js +31 -5
- package/dist/v2/components/Stepper.js.map +1 -1
- package/dist/v2/components/Surface.d.ts +94 -0
- package/dist/v2/components/Surface.d.ts.map +1 -0
- package/dist/v2/components/Surface.js +163 -0
- package/dist/v2/components/Surface.js.map +1 -0
- package/dist/v2/components/Switch.d.ts +4 -4
- package/dist/v2/components/Switch.d.ts.map +1 -1
- package/dist/v2/components/Switch.js.map +1 -1
- package/dist/v2/components/Tabs.d.ts +6 -6
- package/dist/v2/components/Tabs.d.ts.map +1 -1
- package/dist/v2/components/Tabs.js.map +1 -1
- package/dist/v2/components/TelInput.d.ts +8 -8
- package/dist/v2/components/TelInput.d.ts.map +1 -1
- package/dist/v2/components/TelInput.js +18 -18
- package/dist/v2/components/TelInput.js.map +1 -1
- package/dist/v2/components/Textarea.d.ts +1 -1
- package/dist/v2/components/Textarea.d.ts.map +1 -1
- package/dist/v2/components/Textarea.js.map +1 -1
- package/dist/v2/components/TimePicker.d.ts +11 -11
- package/dist/v2/components/TimePicker.d.ts.map +1 -1
- package/dist/v2/components/TimePicker.js.map +1 -1
- package/dist/v2/components/Toast.d.ts +6 -6
- package/dist/v2/components/Toast.d.ts.map +1 -1
- package/dist/v2/components/Toast.js +9 -8
- package/dist/v2/components/Toast.js.map +1 -1
- package/dist/v2/components/Tooltip.d.ts +1 -1
- package/dist/v2/components/Tooltip.d.ts.map +1 -1
- package/dist/v2/components/Tooltip.js.map +1 -1
- package/dist/v2/components/index.d.ts +170 -0
- package/dist/v2/components/index.d.ts.map +1 -1
- package/dist/v2/components/index.js +35 -0
- package/dist/v2/components/index.js.map +1 -1
- package/dist/v2/index.d.ts.map +1 -1
- package/dist/v2/index.js.map +1 -1
- package/dist/v2/models/favorite.d.ts +1 -1
- package/dist/v2/models/favorite.d.ts.map +1 -1
- package/dist/v2/models/favorite.js.map +1 -1
- package/dist/v2/models/personalization.d.ts +13 -13
- 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 +11 -11
- 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 -8
- package/dist/v2/models/savedFilter.d.ts.map +1 -1
- package/dist/v2/models/savedFilter.js.map +1 -1
- package/dist/v2/patterns/ActionBar.d.ts +33 -33
- package/dist/v2/patterns/ActionBar.d.ts.map +1 -1
- package/dist/v2/patterns/ActionBar.js +2 -1
- package/dist/v2/patterns/ActionBar.js.map +1 -1
- package/dist/v2/patterns/BulkActionBar.d.ts +12 -12
- package/dist/v2/patterns/BulkActionBar.d.ts.map +1 -1
- package/dist/v2/patterns/BulkActionBar.js +2 -1
- package/dist/v2/patterns/BulkActionBar.js.map +1 -1
- package/dist/v2/patterns/CollapsibleDataGrid.d.ts +15 -15
- package/dist/v2/patterns/CollapsibleDataGrid.d.ts.map +1 -1
- package/dist/v2/patterns/CollapsibleDataGrid.js.map +1 -1
- package/dist/v2/patterns/ColumnsToggle.d.ts +7 -7
- package/dist/v2/patterns/ColumnsToggle.d.ts.map +1 -1
- package/dist/v2/patterns/ColumnsToggle.js +4 -8
- package/dist/v2/patterns/ColumnsToggle.js.map +1 -1
- package/dist/v2/patterns/DataGridSettingsMenu.d.ts +12 -12
- package/dist/v2/patterns/DataGridSettingsMenu.d.ts.map +1 -1
- package/dist/v2/patterns/DataGridSettingsMenu.js +9 -8
- package/dist/v2/patterns/DataGridSettingsMenu.js.map +1 -1
- package/dist/v2/patterns/DataGridToolbar.d.ts +40 -40
- package/dist/v2/patterns/DataGridToolbar.d.ts.map +1 -1
- package/dist/v2/patterns/DataGridToolbar.js +2 -1
- package/dist/v2/patterns/DataGridToolbar.js.map +1 -1
- package/dist/v2/patterns/DataGridVirtualized.d.ts +27 -27
- package/dist/v2/patterns/DataGridVirtualized.d.ts.map +1 -1
- package/dist/v2/patterns/DataGridVirtualized.js.map +1 -1
- package/dist/v2/patterns/DeleteResourceConfirmDialog.d.ts +5 -5
- package/dist/v2/patterns/DeleteResourceConfirmDialog.d.ts.map +1 -1
- package/dist/v2/patterns/DeleteResourceConfirmDialog.js.map +1 -1
- package/dist/v2/patterns/FavoriteColumn.d.ts +15 -15
- package/dist/v2/patterns/FavoriteColumn.d.ts.map +1 -1
- package/dist/v2/patterns/FavoriteColumn.js +14 -61
- package/dist/v2/patterns/FavoriteColumn.js.map +1 -1
- package/dist/v2/patterns/FavoritesFilter.d.ts +10 -10
- package/dist/v2/patterns/FavoritesFilter.d.ts.map +1 -1
- package/dist/v2/patterns/FavoritesFilter.js +2 -1
- package/dist/v2/patterns/FavoritesFilter.js.map +1 -1
- package/dist/v2/patterns/FormErrorSummary.d.ts +4 -4
- package/dist/v2/patterns/FormErrorSummary.d.ts.map +1 -1
- package/dist/v2/patterns/FormErrorSummary.js.map +1 -1
- package/dist/v2/patterns/FormPageShell.d.ts +4 -4
- package/dist/v2/patterns/FormPageShell.d.ts.map +1 -1
- package/dist/v2/patterns/FormPageShell.js.map +1 -1
- package/dist/v2/patterns/FormSection.d.ts +19 -8
- package/dist/v2/patterns/FormSection.d.ts.map +1 -1
- package/dist/v2/patterns/FormSection.js +106 -71
- package/dist/v2/patterns/FormSection.js.map +1 -1
- package/dist/v2/patterns/FormikCheckbox.d.ts +77 -0
- package/dist/v2/patterns/FormikCheckbox.d.ts.map +1 -0
- package/dist/v2/patterns/FormikCheckbox.js +147 -0
- package/dist/v2/patterns/FormikCheckbox.js.map +1 -0
- package/dist/v2/patterns/FormikCheckboxGroup.d.ts +6 -6
- package/dist/v2/patterns/FormikCheckboxGroup.d.ts.map +1 -1
- package/dist/v2/patterns/FormikCheckboxGroup.js.map +1 -1
- package/dist/v2/patterns/FormikCombobox.d.ts +18 -12
- package/dist/v2/patterns/FormikCombobox.d.ts.map +1 -1
- package/dist/v2/patterns/FormikCombobox.js +5 -2
- package/dist/v2/patterns/FormikCombobox.js.map +1 -1
- package/dist/v2/patterns/FormikDatePicker.d.ts +48 -8
- package/dist/v2/patterns/FormikDatePicker.d.ts.map +1 -1
- package/dist/v2/patterns/FormikDatePicker.js +58 -65
- package/dist/v2/patterns/FormikDatePicker.js.map +1 -1
- package/dist/v2/patterns/FormikDateTimePicker.d.ts +111 -0
- package/dist/v2/patterns/FormikDateTimePicker.d.ts.map +1 -0
- package/dist/v2/patterns/FormikDateTimePicker.js +158 -0
- package/dist/v2/patterns/FormikDateTimePicker.js.map +1 -0
- package/dist/v2/patterns/FormikErrorFocus.d.ts +3 -3
- package/dist/v2/patterns/FormikErrorFocus.d.ts.map +1 -1
- package/dist/v2/patterns/FormikErrorFocus.js.map +1 -1
- package/dist/v2/patterns/FormikFile.d.ts +8 -8
- package/dist/v2/patterns/FormikFile.d.ts.map +1 -1
- package/dist/v2/patterns/FormikFile.js.map +1 -1
- package/dist/v2/patterns/FormikInput.d.ts +51 -6
- package/dist/v2/patterns/FormikInput.d.ts.map +1 -1
- package/dist/v2/patterns/FormikInput.js +53 -2
- package/dist/v2/patterns/FormikInput.js.map +1 -1
- package/dist/v2/patterns/FormikRadioGroup.d.ts +80 -0
- package/dist/v2/patterns/FormikRadioGroup.d.ts.map +1 -0
- package/dist/v2/patterns/FormikRadioGroup.js +148 -0
- package/dist/v2/patterns/FormikRadioGroup.js.map +1 -0
- package/dist/v2/patterns/FormikReferentielField.d.ts +8 -8
- package/dist/v2/patterns/FormikReferentielField.d.ts.map +1 -1
- package/dist/v2/patterns/FormikReferentielField.js.map +1 -1
- package/dist/v2/patterns/FormikSelect.d.ts +41 -12
- package/dist/v2/patterns/FormikSelect.d.ts.map +1 -1
- package/dist/v2/patterns/FormikSelect.js +32 -3
- package/dist/v2/patterns/FormikSelect.js.map +1 -1
- package/dist/v2/patterns/FormikTextarea.d.ts +14 -6
- package/dist/v2/patterns/FormikTextarea.d.ts.map +1 -1
- package/dist/v2/patterns/FormikTextarea.js +5 -2
- package/dist/v2/patterns/FormikTextarea.js.map +1 -1
- package/dist/v2/patterns/KeyboardShortcutsHelp.d.ts +21 -8
- package/dist/v2/patterns/KeyboardShortcutsHelp.d.ts.map +1 -1
- package/dist/v2/patterns/KeyboardShortcutsHelp.js +27 -14
- package/dist/v2/patterns/KeyboardShortcutsHelp.js.map +1 -1
- package/dist/v2/patterns/NetworkErrorBanner.d.ts +4 -4
- package/dist/v2/patterns/NetworkErrorBanner.d.ts.map +1 -1
- package/dist/v2/patterns/NetworkErrorBanner.js.map +1 -1
- package/dist/v2/patterns/PageContent.d.ts +3 -3
- package/dist/v2/patterns/PageContent.d.ts.map +1 -1
- package/dist/v2/patterns/PageContent.js.map +1 -1
- package/dist/v2/patterns/ReferentielField.d.ts +49 -49
- package/dist/v2/patterns/ReferentielField.d.ts.map +1 -1
- package/dist/v2/patterns/ReferentielField.js +2 -1
- package/dist/v2/patterns/ReferentielField.js.map +1 -1
- package/dist/v2/patterns/RowFavoriteToggle.d.ts +92 -0
- package/dist/v2/patterns/RowFavoriteToggle.d.ts.map +1 -0
- package/dist/v2/patterns/RowFavoriteToggle.js +127 -0
- package/dist/v2/patterns/RowFavoriteToggle.js.map +1 -0
- package/dist/v2/patterns/SaveFilterDialog.d.ts +10 -10
- package/dist/v2/patterns/SaveFilterDialog.d.ts.map +1 -1
- package/dist/v2/patterns/SaveFilterDialog.js +9 -8
- package/dist/v2/patterns/SaveFilterDialog.js.map +1 -1
- package/dist/v2/patterns/SavedFiltersMenu.d.ts +7 -7
- package/dist/v2/patterns/SavedFiltersMenu.d.ts.map +1 -1
- package/dist/v2/patterns/SavedFiltersMenu.js +9 -8
- package/dist/v2/patterns/SavedFiltersMenu.js.map +1 -1
- package/dist/v2/patterns/SkeletonPageShell.d.ts +7 -7
- package/dist/v2/patterns/SkeletonPageShell.d.ts.map +1 -1
- package/dist/v2/patterns/SkeletonPageShell.js.map +1 -1
- package/dist/v2/patterns/SortableHeader.d.ts +1 -1
- package/dist/v2/patterns/SortableHeader.d.ts.map +1 -1
- package/dist/v2/patterns/SortableHeader.js.map +1 -1
- package/dist/v2/patterns/Tour.d.ts +12 -12
- package/dist/v2/patterns/Tour.d.ts.map +1 -1
- package/dist/v2/patterns/Tour.js +9 -8
- package/dist/v2/patterns/Tour.js.map +1 -1
- package/dist/v2/patterns/_dataGridShared.d.ts +25 -6
- package/dist/v2/patterns/_dataGridShared.d.ts.map +1 -1
- package/dist/v2/patterns/_dataGridShared.js +37 -3
- package/dist/v2/patterns/_dataGridShared.js.map +1 -1
- package/dist/v2/patterns/_pickerSerialisation.d.ts +44 -0
- package/dist/v2/patterns/_pickerSerialisation.d.ts.map +1 -0
- package/dist/v2/patterns/_pickerSerialisation.js +81 -0
- package/dist/v2/patterns/_pickerSerialisation.js.map +1 -0
- package/dist/v2/patterns/_useColumnReorder.d.ts +1 -1
- package/dist/v2/patterns/_useColumnReorder.d.ts.map +1 -1
- package/dist/v2/patterns/_useColumnReorder.js.map +1 -1
- package/dist/v2/patterns/_useColumnResize.d.ts +1 -1
- package/dist/v2/patterns/_useColumnResize.d.ts.map +1 -1
- package/dist/v2/patterns/_useColumnResize.js.map +1 -1
- package/dist/v2/patterns/index.d.ts +114 -0
- package/dist/v2/patterns/index.d.ts.map +1 -1
- package/dist/v2/patterns/index.js +34 -0
- package/dist/v2/patterns/index.js.map +1 -1
- package/dist/v2/personalization/PersonalizationProvider.d.ts +9 -9
- package/dist/v2/personalization/PersonalizationProvider.d.ts.map +1 -1
- package/dist/v2/personalization/PersonalizationProvider.js.map +1 -1
- package/dist/v2/personalization/adapters/createLocalStorageAdapter.d.ts +1 -1
- package/dist/v2/personalization/adapters/createLocalStorageAdapter.d.ts.map +1 -1
- package/dist/v2/personalization/adapters/createLocalStorageAdapter.js.map +1 -1
- package/dist/v2/personalization/adapters/createMemoryAdapter.d.ts +1 -1
- package/dist/v2/personalization/adapters/createMemoryAdapter.d.ts.map +1 -1
- package/dist/v2/personalization/adapters/createMemoryAdapter.js.map +1 -1
- package/dist/v2/personalization/capabilities/favoritesView.d.ts +3 -3
- package/dist/v2/personalization/capabilities/favoritesView.d.ts.map +1 -1
- package/dist/v2/personalization/capabilities/favoritesView.js.map +1 -1
- package/dist/v2/personalization/capabilities/gridPreferences.d.ts +100 -0
- package/dist/v2/personalization/capabilities/gridPreferences.d.ts.map +1 -0
- package/dist/v2/personalization/capabilities/gridPreferences.js +215 -0
- package/dist/v2/personalization/capabilities/gridPreferences.js.map +1 -0
- package/dist/v2/personalization/capabilities/index.d.ts +6 -0
- package/dist/v2/personalization/capabilities/index.d.ts.map +1 -1
- package/dist/v2/personalization/capabilities/index.js +13 -0
- package/dist/v2/personalization/capabilities/index.js.map +1 -1
- package/dist/v2/personalization/capabilities/savedFilters.d.ts +3 -3
- package/dist/v2/personalization/capabilities/savedFilters.d.ts.map +1 -1
- package/dist/v2/personalization/capabilities/savedFilters.js.map +1 -1
- package/dist/v2/personalization/createPersonalizationStore.d.ts +8 -8
- package/dist/v2/personalization/createPersonalizationStore.d.ts.map +1 -1
- package/dist/v2/personalization/createPersonalizationStore.js.map +1 -1
- package/dist/v2/personalization/index.d.ts +18 -0
- package/dist/v2/personalization/index.d.ts.map +1 -1
- package/dist/v2/personalization/index.js +13 -0
- package/dist/v2/personalization/index.js.map +1 -1
- package/dist/v2/personalization/schema.d.ts +2 -2
- package/dist/v2/personalization/schema.d.ts.map +1 -1
- package/dist/v2/personalization/schema.js.map +1 -1
- package/dist/v2/personalization/types.d.ts +19 -19
- package/dist/v2/personalization/types.d.ts.map +1 -1
- package/dist/v2/personalization/types.js.map +1 -1
- package/dist/v2/referentiel/ReferentielProvider.d.ts +4 -4
- package/dist/v2/referentiel/ReferentielProvider.d.ts.map +1 -1
- package/dist/v2/referentiel/ReferentielProvider.js.map +1 -1
- package/dist/v2/referentiel/useReferentielOptions.d.ts +4 -4
- package/dist/v2/referentiel/useReferentielOptions.d.ts.map +1 -1
- package/dist/v2/referentiel/useReferentielOptions.js.map +1 -1
- package/dist/v2/referentiel/useReferentielSearch.d.ts +3 -3
- package/dist/v2/referentiel/useReferentielSearch.d.ts.map +1 -1
- package/dist/v2/referentiel/useReferentielSearch.js.map +1 -1
- package/dist/v2/theme/createPortnetTheme.d.ts +32 -7
- package/dist/v2/theme/createPortnetTheme.d.ts.map +1 -1
- package/dist/v2/theme/createPortnetTheme.js +25 -1
- package/dist/v2/theme/createPortnetTheme.js.map +1 -1
- package/dist/v2/types/datagrid.d.ts +59 -59
- package/dist/v2/types/datagrid.d.ts.map +1 -1
- package/dist/v2/types/datagrid.js.map +1 -1
- package/dist/v2/utils/apiError.d.ts +65 -4
- package/dist/v2/utils/apiError.d.ts.map +1 -1
- package/dist/v2/utils/apiError.js +69 -6
- package/dist/v2/utils/apiError.js.map +1 -1
- package/dist/v2/utils/index.d.ts +1 -0
- package/dist/v2/utils/index.d.ts.map +1 -1
- package/dist/v2/utils/index.js +7 -0
- package/dist/v2/utils/index.js.map +1 -1
- package/dist/v2/utils/mergeLabels.d.ts +59 -0
- package/dist/v2/utils/mergeLabels.d.ts.map +1 -0
- package/dist/v2/utils/mergeLabels.js +93 -0
- package/dist/v2/utils/mergeLabels.js.map +1 -0
- package/package.json +23 -15
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import "@testing-library/jest-dom";
|
|
2
|
+
import { render, screen } from "@testing-library/react";
|
|
3
|
+
import Field, { FIELD_MAX_WIDTH } from "../components/Field";
|
|
4
|
+
import Input from "../components/Input";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Field — largeur semantique (gap G-H) : tests de contrat.
|
|
8
|
+
*
|
|
9
|
+
* CE QUE JSDOM PEUT ET NE PEUT PAS VERIFIER
|
|
10
|
+
* -----------------------------------------
|
|
11
|
+
* Le plafond n'est pose qu'a partir du palier `sm` — le standard exigeant
|
|
12
|
+
* « 100% grid width » sur mobile. Il passe donc par une requete media
|
|
13
|
+
* qu'`emotion` injecte dans la feuille de style, et jsdom ne resout pas les
|
|
14
|
+
* requetes media : `getComputedStyle` ne rendra jamais la largeur effective au
|
|
15
|
+
* palier desktop. Un test de rendu ne PEUT pas l'assertir, et pretendre le
|
|
16
|
+
* faire donnerait un test qui passe sans rien verifier.
|
|
17
|
+
*
|
|
18
|
+
* Ce fichier epingle donc ce qui est verifiable et qui compte :
|
|
19
|
+
*
|
|
20
|
+
* 1. LES CINQ VALEURS. C'est le point sensible du tour : elles ne se lisent
|
|
21
|
+
* pas dans le standard, qui donne des FOURCHETTES — quelqu'un a choisi, et
|
|
22
|
+
* ce choix doit etre visible et protege. Si l'equipe design les revoit,
|
|
23
|
+
* c'est ce test qui doit etre mis a jour sciemment, pas un ecran qui doit
|
|
24
|
+
* bouger par surprise.
|
|
25
|
+
*
|
|
26
|
+
* 2. QUE `width` NE CASSE PAS LE CABLAGE D'ACCESSIBILITE. `Field` associe
|
|
27
|
+
* libelle, indication et erreur au controle ; ajouter une contrainte de
|
|
28
|
+
* mise en page ne doit rien y toucher. C'est la regression la plus
|
|
29
|
+
* probable d'un changement qui passe par `sx`.
|
|
30
|
+
*
|
|
31
|
+
* 3. QUE L'OMISSION RESTE NEUTRE. Sans `width`, aucun plafond : les
|
|
32
|
+
* appelants d'avant G-H ne doivent pas bouger d'un pixel.
|
|
33
|
+
*
|
|
34
|
+
* Le comportement responsive lui-meme se verifie dans la story, en
|
|
35
|
+
* redimensionnant la fenetre — c'est la que le contrat est observable.
|
|
36
|
+
*/
|
|
37
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
38
|
+
describe("Field — les cinq gabarits (G-H)", function () {
|
|
39
|
+
test("les valeurs sont celles retenues dans la fourchette du standard", function () {
|
|
40
|
+
/* Fourchettes du standard, et valeur retenue (le HAUT, ces largeurs etant
|
|
41
|
+
* des plafonds) :
|
|
42
|
+
* xs ~80-120 -> 120 s ~160-200 -> 200
|
|
43
|
+
* m ~320-400 -> 400 l ~500-600 -> 600
|
|
44
|
+
* xl 100%
|
|
45
|
+
* Chaque valeur passe par une variable CSS pour etre revue sans toucher au
|
|
46
|
+
* code : c'est le repli qui est epingle ici. */
|
|
47
|
+
expect(FIELD_MAX_WIDTH.xs).toBe("var(--field-w-xs, 120px)");
|
|
48
|
+
expect(FIELD_MAX_WIDTH.s).toBe("var(--field-w-s, 200px)");
|
|
49
|
+
expect(FIELD_MAX_WIDTH.m).toBe("var(--field-w-m, 400px)");
|
|
50
|
+
expect(FIELD_MAX_WIDTH.l).toBe("var(--field-w-l, 600px)");
|
|
51
|
+
expect(FIELD_MAX_WIDTH.xl).toBe("100%");
|
|
52
|
+
});
|
|
53
|
+
test("les cinq gabarits du standard sont couverts, ni plus ni moins", function () {
|
|
54
|
+
/* Un gabarit ajoute ou retire est un ecart au standard, pas un detail
|
|
55
|
+
* d'implementation. */
|
|
56
|
+
expect(Object.keys(FIELD_MAX_WIDTH).sort()).toEqual(["l", "m", "s", "xl", "xs"]);
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
describe("Field — `width` ne touche pas au cablage d'accessibilite", function () {
|
|
60
|
+
test("le libelle nomme toujours le controle", function () {
|
|
61
|
+
render(/*#__PURE__*/_jsx(Field, {
|
|
62
|
+
label: "Identifiant fiscal",
|
|
63
|
+
htmlFor: "ifu",
|
|
64
|
+
width: "s",
|
|
65
|
+
children: /*#__PURE__*/_jsx(Input, {})
|
|
66
|
+
}));
|
|
67
|
+
expect(screen.getByRole("textbox", {
|
|
68
|
+
name: /Identifiant fiscal/
|
|
69
|
+
})).toBeInTheDocument();
|
|
70
|
+
});
|
|
71
|
+
test("l'erreur reste la description accessible du controle", function () {
|
|
72
|
+
render(/*#__PURE__*/_jsx(Field, {
|
|
73
|
+
label: "Identifiant fiscal",
|
|
74
|
+
htmlFor: "ifu",
|
|
75
|
+
width: "s",
|
|
76
|
+
error: "Quinze caract\xE8res maximum.",
|
|
77
|
+
children: /*#__PURE__*/_jsx(Input, {})
|
|
78
|
+
}));
|
|
79
|
+
expect(screen.getByRole("textbox")).toHaveAccessibleDescription("Quinze caractères maximum.");
|
|
80
|
+
expect(screen.getByRole("textbox")).toHaveAttribute("aria-invalid", "true");
|
|
81
|
+
});
|
|
82
|
+
test("l'indication reste la description accessible du controle", function () {
|
|
83
|
+
render(/*#__PURE__*/_jsx(Field, {
|
|
84
|
+
label: "Adresse",
|
|
85
|
+
htmlFor: "adresse",
|
|
86
|
+
width: "l",
|
|
87
|
+
hint: "Voie, code postal et ville.",
|
|
88
|
+
children: /*#__PURE__*/_jsx(Input, {})
|
|
89
|
+
}));
|
|
90
|
+
expect(screen.getByRole("textbox")).toHaveAccessibleDescription("Voie, code postal et ville.");
|
|
91
|
+
});
|
|
92
|
+
test("`required` reste annonce comme tel", function () {
|
|
93
|
+
render(/*#__PURE__*/_jsx(Field, {
|
|
94
|
+
label: "Marque",
|
|
95
|
+
htmlFor: "marque",
|
|
96
|
+
width: "m",
|
|
97
|
+
required: true,
|
|
98
|
+
children: /*#__PURE__*/_jsx(Input, {})
|
|
99
|
+
}));
|
|
100
|
+
|
|
101
|
+
/* `toBeRequired` accepte l'attribut NATIF `required` comme `aria-required` :
|
|
102
|
+
* c'est volontaire, et c'est la bonne assertion ici.
|
|
103
|
+
*
|
|
104
|
+
* Les deux mecanismes coexistent dans la library, par des chemins
|
|
105
|
+
* differents, et viser l'un des deux nommement rendrait le test faux sans
|
|
106
|
+
* que le comportement change :
|
|
107
|
+
* — sur un controle MUI (`Input`, `Textarea`), `Field` passe `required`
|
|
108
|
+
* au `FormControl`, dont le CONTEXTE le propage jusqu'a l'input, qui
|
|
109
|
+
* porte alors l'attribut natif ;
|
|
110
|
+
* — sur un groupe (`RadioGroup`), aucun contexte ne s'applique : `Field`
|
|
111
|
+
* injecte `aria-required` sur l'enfant, que le groupe transmet a son
|
|
112
|
+
* `role="radiogroup"` (voir le test de `FormikRadioGroup`).
|
|
113
|
+
*
|
|
114
|
+
* Ce qui compte pour R-I.2 est qu'une technologie d'assistance l'annonce,
|
|
115
|
+
* pas quel attribut le porte. */
|
|
116
|
+
expect(screen.getByRole("textbox")).toBeRequired();
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
describe("Field — l'omission reste neutre", function () {
|
|
120
|
+
test("sans `width`, le champ se rend et se nomme comme avant G-H", function () {
|
|
121
|
+
/* Ce que ce test prouve, et ce qu'il ne prouve pas.
|
|
122
|
+
*
|
|
123
|
+
* L'absence de plafond n'est PAS assertable : elle se lit dans la feuille
|
|
124
|
+
* de style generee par `emotion`, que jsdom ne resout pas plus qu'une
|
|
125
|
+
* requete media. Une premiere version comparait le nombre de noeuds avec
|
|
126
|
+
* et sans `width` — ce qui exigeait un acces direct au DOM, interdit a
|
|
127
|
+
* juste titre par `testing-library/no-node-access` : compter des `<label>`
|
|
128
|
+
* teste l'implementation, pas le comportement.
|
|
129
|
+
*
|
|
130
|
+
* Ce qui EST verifiable et suffit a la retrocompatibilite : sans `width`,
|
|
131
|
+
* le controle est rendu, nomme par son libelle, et n'a herite d'aucun etat
|
|
132
|
+
* qu'il n'a pas demande. Le plafond, lui, se verifie dans la story. */
|
|
133
|
+
render(/*#__PURE__*/_jsx(Field, {
|
|
134
|
+
label: "Marque",
|
|
135
|
+
htmlFor: "sans-gabarit",
|
|
136
|
+
children: /*#__PURE__*/_jsx(Input, {})
|
|
137
|
+
}));
|
|
138
|
+
var champ = screen.getByRole("textbox", {
|
|
139
|
+
name: /Marque/
|
|
140
|
+
});
|
|
141
|
+
expect(champ).toBeInTheDocument();
|
|
142
|
+
expect(champ).not.toBeRequired();
|
|
143
|
+
expect(champ).not.toBeInvalid();
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
//# sourceMappingURL=FieldWidth.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FieldWidth.test.js","names":["render","screen","Field","FIELD_MAX_WIDTH","Input","jsx","_jsx","describe","test","expect","xs","toBe","s","m","l","xl","Object","keys","sort","toEqual","label","htmlFor","width","children","getByRole","name","toBeInTheDocument","error","toHaveAccessibleDescription","toHaveAttribute","hint","required","toBeRequired","champ","not","toBeInvalid"],"sources":["../../../../src/lib/v2/__tests__/FieldWidth.test.tsx"],"sourcesContent":["import \"@testing-library/jest-dom\";\r\nimport { render, screen } from \"@testing-library/react\";\r\nimport Field, { FIELD_MAX_WIDTH } from \"../components/Field\";\r\nimport Input from \"../components/Input\";\r\n\r\n/**\r\n * Field — largeur semantique (gap G-H) : tests de contrat.\r\n *\r\n * CE QUE JSDOM PEUT ET NE PEUT PAS VERIFIER\r\n * -----------------------------------------\r\n * Le plafond n'est pose qu'a partir du palier `sm` — le standard exigeant\r\n * « 100% grid width » sur mobile. Il passe donc par une requete media\r\n * qu'`emotion` injecte dans la feuille de style, et jsdom ne resout pas les\r\n * requetes media : `getComputedStyle` ne rendra jamais la largeur effective au\r\n * palier desktop. Un test de rendu ne PEUT pas l'assertir, et pretendre le\r\n * faire donnerait un test qui passe sans rien verifier.\r\n *\r\n * Ce fichier epingle donc ce qui est verifiable et qui compte :\r\n *\r\n * 1. LES CINQ VALEURS. C'est le point sensible du tour : elles ne se lisent\r\n * pas dans le standard, qui donne des FOURCHETTES — quelqu'un a choisi, et\r\n * ce choix doit etre visible et protege. Si l'equipe design les revoit,\r\n * c'est ce test qui doit etre mis a jour sciemment, pas un ecran qui doit\r\n * bouger par surprise.\r\n *\r\n * 2. QUE `width` NE CASSE PAS LE CABLAGE D'ACCESSIBILITE. `Field` associe\r\n * libelle, indication et erreur au controle ; ajouter une contrainte de\r\n * mise en page ne doit rien y toucher. C'est la regression la plus\r\n * probable d'un changement qui passe par `sx`.\r\n *\r\n * 3. QUE L'OMISSION RESTE NEUTRE. Sans `width`, aucun plafond : les\r\n * appelants d'avant G-H ne doivent pas bouger d'un pixel.\r\n *\r\n * Le comportement responsive lui-meme se verifie dans la story, en\r\n * redimensionnant la fenetre — c'est la que le contrat est observable.\r\n */\r\n\r\ndescribe(\"Field — les cinq gabarits (G-H)\", () => {\r\n test(\"les valeurs sont celles retenues dans la fourchette du standard\", () => {\r\n /* Fourchettes du standard, et valeur retenue (le HAUT, ces largeurs etant\r\n * des plafonds) :\r\n * xs ~80-120 -> 120 s ~160-200 -> 200\r\n * m ~320-400 -> 400 l ~500-600 -> 600\r\n * xl 100%\r\n * Chaque valeur passe par une variable CSS pour etre revue sans toucher au\r\n * code : c'est le repli qui est epingle ici. */\r\n expect(FIELD_MAX_WIDTH.xs).toBe(\"var(--field-w-xs, 120px)\");\r\n expect(FIELD_MAX_WIDTH.s).toBe(\"var(--field-w-s, 200px)\");\r\n expect(FIELD_MAX_WIDTH.m).toBe(\"var(--field-w-m, 400px)\");\r\n expect(FIELD_MAX_WIDTH.l).toBe(\"var(--field-w-l, 600px)\");\r\n expect(FIELD_MAX_WIDTH.xl).toBe(\"100%\");\r\n });\r\n\r\n test(\"les cinq gabarits du standard sont couverts, ni plus ni moins\", () => {\r\n /* Un gabarit ajoute ou retire est un ecart au standard, pas un detail\r\n * d'implementation. */\r\n expect(Object.keys(FIELD_MAX_WIDTH).sort()).toEqual([\r\n \"l\",\r\n \"m\",\r\n \"s\",\r\n \"xl\",\r\n \"xs\",\r\n ]);\r\n });\r\n});\r\n\r\ndescribe(\"Field — `width` ne touche pas au cablage d'accessibilite\", () => {\r\n test(\"le libelle nomme toujours le controle\", () => {\r\n render(\r\n <Field label=\"Identifiant fiscal\" htmlFor=\"ifu\" width=\"s\">\r\n <Input />\r\n </Field>\r\n );\r\n\r\n expect(\r\n screen.getByRole(\"textbox\", { name: /Identifiant fiscal/ })\r\n ).toBeInTheDocument();\r\n });\r\n\r\n test(\"l'erreur reste la description accessible du controle\", () => {\r\n render(\r\n <Field\r\n label=\"Identifiant fiscal\"\r\n htmlFor=\"ifu\"\r\n width=\"s\"\r\n error=\"Quinze caractères maximum.\"\r\n >\r\n <Input />\r\n </Field>\r\n );\r\n\r\n expect(screen.getByRole(\"textbox\")).toHaveAccessibleDescription(\r\n \"Quinze caractères maximum.\"\r\n );\r\n expect(screen.getByRole(\"textbox\")).toHaveAttribute(\r\n \"aria-invalid\",\r\n \"true\"\r\n );\r\n });\r\n\r\n test(\"l'indication reste la description accessible du controle\", () => {\r\n render(\r\n <Field\r\n label=\"Adresse\"\r\n htmlFor=\"adresse\"\r\n width=\"l\"\r\n hint=\"Voie, code postal et ville.\"\r\n >\r\n <Input />\r\n </Field>\r\n );\r\n\r\n expect(screen.getByRole(\"textbox\")).toHaveAccessibleDescription(\r\n \"Voie, code postal et ville.\"\r\n );\r\n });\r\n\r\n test(\"`required` reste annonce comme tel\", () => {\r\n render(\r\n <Field label=\"Marque\" htmlFor=\"marque\" width=\"m\" required>\r\n <Input />\r\n </Field>\r\n );\r\n\r\n /* `toBeRequired` accepte l'attribut NATIF `required` comme `aria-required` :\r\n * c'est volontaire, et c'est la bonne assertion ici.\r\n *\r\n * Les deux mecanismes coexistent dans la library, par des chemins\r\n * differents, et viser l'un des deux nommement rendrait le test faux sans\r\n * que le comportement change :\r\n * — sur un controle MUI (`Input`, `Textarea`), `Field` passe `required`\r\n * au `FormControl`, dont le CONTEXTE le propage jusqu'a l'input, qui\r\n * porte alors l'attribut natif ;\r\n * — sur un groupe (`RadioGroup`), aucun contexte ne s'applique : `Field`\r\n * injecte `aria-required` sur l'enfant, que le groupe transmet a son\r\n * `role=\"radiogroup\"` (voir le test de `FormikRadioGroup`).\r\n *\r\n * Ce qui compte pour R-I.2 est qu'une technologie d'assistance l'annonce,\r\n * pas quel attribut le porte. */\r\n expect(screen.getByRole(\"textbox\")).toBeRequired();\r\n });\r\n});\r\n\r\ndescribe(\"Field — l'omission reste neutre\", () => {\r\n test(\"sans `width`, le champ se rend et se nomme comme avant G-H\", () => {\r\n /* Ce que ce test prouve, et ce qu'il ne prouve pas.\r\n *\r\n * L'absence de plafond n'est PAS assertable : elle se lit dans la feuille\r\n * de style generee par `emotion`, que jsdom ne resout pas plus qu'une\r\n * requete media. Une premiere version comparait le nombre de noeuds avec\r\n * et sans `width` — ce qui exigeait un acces direct au DOM, interdit a\r\n * juste titre par `testing-library/no-node-access` : compter des `<label>`\r\n * teste l'implementation, pas le comportement.\r\n *\r\n * Ce qui EST verifiable et suffit a la retrocompatibilite : sans `width`,\r\n * le controle est rendu, nomme par son libelle, et n'a herite d'aucun etat\r\n * qu'il n'a pas demande. Le plafond, lui, se verifie dans la story. */\r\n render(\r\n <Field label=\"Marque\" htmlFor=\"sans-gabarit\">\r\n <Input />\r\n </Field>\r\n );\r\n\r\n const champ = screen.getByRole(\"textbox\", { name: /Marque/ });\r\n expect(champ).toBeInTheDocument();\r\n expect(champ).not.toBeRequired();\r\n expect(champ).not.toBeInvalid();\r\n });\r\n});\r\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import "@testing-library/jest-dom";
|
|
2
|
+
import { render, screen } from "@testing-library/react";
|
|
3
|
+
import FileCard from "../components/FileCard";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* FileCard — contract tests.
|
|
7
|
+
*
|
|
8
|
+
* WHY THIS FILE EXISTS
|
|
9
|
+
* --------------------
|
|
10
|
+
* §10.3 R-G.6 MUST — "Snapshot Storybook + tests Jest/Testing-Library". The
|
|
11
|
+
* component was extracted from THREE hand-written copies found in addpe-fe
|
|
12
|
+
* (Attachment, AutorisationPreviewDrawer, AutorisationDetail), which had drifted
|
|
13
|
+
* to three different paddings for one concept. Consolidating them means a single
|
|
14
|
+
* change now moves every attachment row in the fleet, so the contracts below are
|
|
15
|
+
* the ones that must not move silently.
|
|
16
|
+
*
|
|
17
|
+
* NOT COVERED — deliberately
|
|
18
|
+
* The width negotiation is the most fragile part of this component and it is
|
|
19
|
+
* NOT tested here: `text-overflow: ellipsis`, `minWidth: 0` on the identity
|
|
20
|
+
* block and `flexShrink: 0` on the action cluster are LAYOUT, and jsdom computes
|
|
21
|
+
* no layout. A test asserting them would pass while the card is broken on a
|
|
22
|
+
* phone — worse than no coverage, because it would look like coverage. That
|
|
23
|
+
* contract lives in FileCard.stories.tsx ("Long filename"), which is where a
|
|
24
|
+
* browser can actually check it. Same reasoning as MobileRowCard.test.tsx
|
|
25
|
+
* records for R-G.3.
|
|
26
|
+
*/
|
|
27
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
28
|
+
describe("FileCard — identity", function () {
|
|
29
|
+
test("renders the filename and mirrors it into title for the truncated case", function () {
|
|
30
|
+
var name = "autorisation-de-depot-prealable-a-l-exportation-2025-IM-0042-revision-finale.pdf";
|
|
31
|
+
render(/*#__PURE__*/_jsx(FileCard, {
|
|
32
|
+
name: name
|
|
33
|
+
}));
|
|
34
|
+
|
|
35
|
+
/* The title attribute is the ONLY reason `name` is typed `string` rather
|
|
36
|
+
* than ReactNode: once the CSS ellipsis hides the tail, the attribute is
|
|
37
|
+
* what keeps the full filename reachable. Losing it is invisible in every
|
|
38
|
+
* screenshot and only hurts the user with the long filename. */
|
|
39
|
+
expect(screen.getByText(name)).toHaveAttribute("title", name);
|
|
40
|
+
});
|
|
41
|
+
test("renders the meta line when supplied", function () {
|
|
42
|
+
render(/*#__PURE__*/_jsx(FileCard, {
|
|
43
|
+
name: "facture.pdf",
|
|
44
|
+
meta: "1,24 Mo"
|
|
45
|
+
}));
|
|
46
|
+
expect(screen.getByText("1,24 Mo")).toBeInTheDocument();
|
|
47
|
+
});
|
|
48
|
+
test("omits the meta line entirely when absent or empty", function () {
|
|
49
|
+
/* Not rendered rather than rendered blank: an empty second line reads as
|
|
50
|
+
* missing data, and it changes the row height, which breaks the alignment
|
|
51
|
+
* of a list of files. Both `undefined` and `""` are covered because a host
|
|
52
|
+
* formatting a byte count from an optional field produces either.
|
|
53
|
+
*
|
|
54
|
+
* Queried by testid, not by walking parentElement: "absent, not empty"
|
|
55
|
+
* cannot be expressed as a text query, and the repo's eslint config forbids
|
|
56
|
+
* direct node access — correctly, since a structural child count would also
|
|
57
|
+
* break the moment the component gains an unrelated third line. */
|
|
58
|
+
var _render = render(/*#__PURE__*/_jsx(FileCard, {
|
|
59
|
+
name: "a.pdf"
|
|
60
|
+
})),
|
|
61
|
+
rerender = _render.rerender;
|
|
62
|
+
expect(screen.getByText("a.pdf")).toBeInTheDocument();
|
|
63
|
+
expect(screen.queryByTestId("filecard-meta")).not.toBeInTheDocument();
|
|
64
|
+
rerender(/*#__PURE__*/_jsx(FileCard, {
|
|
65
|
+
name: "a.pdf",
|
|
66
|
+
meta: ""
|
|
67
|
+
}));
|
|
68
|
+
expect(screen.queryByTestId("filecard-meta")).not.toBeInTheDocument();
|
|
69
|
+
rerender(/*#__PURE__*/_jsx(FileCard, {
|
|
70
|
+
name: "a.pdf",
|
|
71
|
+
meta: "248 Ko"
|
|
72
|
+
}));
|
|
73
|
+
expect(screen.getByTestId("filecard-meta")).toHaveTextContent("248 Ko");
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
describe("FileCard — actions slot", function () {
|
|
77
|
+
test("renders host-supplied actions", function () {
|
|
78
|
+
render(/*#__PURE__*/_jsx(FileCard, {
|
|
79
|
+
name: "a.pdf",
|
|
80
|
+
actions: /*#__PURE__*/_jsx("button", {
|
|
81
|
+
type: "button",
|
|
82
|
+
children: "T\xE9l\xE9charger"
|
|
83
|
+
})
|
|
84
|
+
}));
|
|
85
|
+
expect(screen.getByRole("button", {
|
|
86
|
+
name: "Télécharger"
|
|
87
|
+
})).toBeInTheDocument();
|
|
88
|
+
});
|
|
89
|
+
test("renders no action cluster when actions is absent", function () {
|
|
90
|
+
render(/*#__PURE__*/_jsx(FileCard, {
|
|
91
|
+
name: "a.pdf"
|
|
92
|
+
}));
|
|
93
|
+
expect(screen.queryByRole("button")).not.toBeInTheDocument();
|
|
94
|
+
});
|
|
95
|
+
test("does not invent any action of its own", function () {
|
|
96
|
+
/* Regression guard on the component's SCOPE, not its rendering. FileCard is
|
|
97
|
+
* presentational: a download link, a delete confirmation and a blob URL all
|
|
98
|
+
* belong to the host. If a future change adds a built-in button, this fails
|
|
99
|
+
* — which is the intent. */
|
|
100
|
+
render(/*#__PURE__*/_jsx(FileCard, {
|
|
101
|
+
name: "a.pdf",
|
|
102
|
+
meta: "1 Ko"
|
|
103
|
+
}));
|
|
104
|
+
expect(screen.queryByRole("button")).not.toBeInTheDocument();
|
|
105
|
+
expect(screen.queryByRole("link")).not.toBeInTheDocument();
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
describe("FileCard — accessibility", function () {
|
|
109
|
+
test("the leading icon is hidden from assistive tech", function () {
|
|
110
|
+
/* R-Ar.2 — the filename IS the accessible name; a decorative glyph carrying
|
|
111
|
+
* one would make a screen reader announce the row twice. The wrapper has no
|
|
112
|
+
* role and no name by design, so there is no semantic query for it: the
|
|
113
|
+
* component exposes a stable testid for exactly this assertion. */
|
|
114
|
+
render(/*#__PURE__*/_jsx(FileCard, {
|
|
115
|
+
name: "a.pdf"
|
|
116
|
+
}));
|
|
117
|
+
expect(screen.getByTestId("filecard-icon")).toHaveAttribute("aria-hidden", "true");
|
|
118
|
+
});
|
|
119
|
+
test("a custom icon replaces the default and stays hidden", function () {
|
|
120
|
+
/* The second assertion is the one that matters: a host passing its own glyph
|
|
121
|
+
* must not be able to leak it into the accessibility tree. */
|
|
122
|
+
render(/*#__PURE__*/_jsx(FileCard, {
|
|
123
|
+
name: "a.pdf",
|
|
124
|
+
icon: /*#__PURE__*/_jsx("svg", {
|
|
125
|
+
"data-testid": "custom"
|
|
126
|
+
})
|
|
127
|
+
}));
|
|
128
|
+
expect(screen.getByTestId("custom")).toBeInTheDocument();
|
|
129
|
+
expect(screen.getByTestId("filecard-icon")).toHaveAttribute("aria-hidden", "true");
|
|
130
|
+
});
|
|
131
|
+
test("carries no role of its own", function () {
|
|
132
|
+
/* The card is not interactive — only its actions are. Giving it role=button
|
|
133
|
+
* or wrapping it in a group without an accessible name would add noise to
|
|
134
|
+
* the SR tree. Asserted so a future "make the whole row clickable" change
|
|
135
|
+
* has to be a deliberate decision rather than a drive-by. */
|
|
136
|
+
render(/*#__PURE__*/_jsx(FileCard, {
|
|
137
|
+
name: "a.pdf"
|
|
138
|
+
}));
|
|
139
|
+
expect(screen.queryByRole("button")).not.toBeInTheDocument();
|
|
140
|
+
expect(screen.queryByRole("group")).not.toBeInTheDocument();
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
//# sourceMappingURL=FileCard.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FileCard.test.js","names":["render","screen","FileCard","jsx","_jsx","describe","test","name","expect","getByText","toHaveAttribute","meta","toBeInTheDocument","_render","rerender","queryByTestId","not","getByTestId","toHaveTextContent","actions","type","children","getByRole","queryByRole","icon"],"sources":["../../../../src/lib/v2/__tests__/FileCard.test.tsx"],"sourcesContent":["import \"@testing-library/jest-dom\";\r\nimport { render, screen } from \"@testing-library/react\";\r\nimport FileCard from \"../components/FileCard\";\r\n\r\n/**\r\n * FileCard — contract tests.\r\n *\r\n * WHY THIS FILE EXISTS\r\n * --------------------\r\n * §10.3 R-G.6 MUST — \"Snapshot Storybook + tests Jest/Testing-Library\". The\r\n * component was extracted from THREE hand-written copies found in addpe-fe\r\n * (Attachment, AutorisationPreviewDrawer, AutorisationDetail), which had drifted\r\n * to three different paddings for one concept. Consolidating them means a single\r\n * change now moves every attachment row in the fleet, so the contracts below are\r\n * the ones that must not move silently.\r\n *\r\n * NOT COVERED — deliberately\r\n * The width negotiation is the most fragile part of this component and it is\r\n * NOT tested here: `text-overflow: ellipsis`, `minWidth: 0` on the identity\r\n * block and `flexShrink: 0` on the action cluster are LAYOUT, and jsdom computes\r\n * no layout. A test asserting them would pass while the card is broken on a\r\n * phone — worse than no coverage, because it would look like coverage. That\r\n * contract lives in FileCard.stories.tsx (\"Long filename\"), which is where a\r\n * browser can actually check it. Same reasoning as MobileRowCard.test.tsx\r\n * records for R-G.3.\r\n */\r\ndescribe(\"FileCard — identity\", () => {\r\n test(\"renders the filename and mirrors it into title for the truncated case\", () => {\r\n const name =\r\n \"autorisation-de-depot-prealable-a-l-exportation-2025-IM-0042-revision-finale.pdf\";\r\n render(<FileCard name={name} />);\r\n\r\n /* The title attribute is the ONLY reason `name` is typed `string` rather\r\n * than ReactNode: once the CSS ellipsis hides the tail, the attribute is\r\n * what keeps the full filename reachable. Losing it is invisible in every\r\n * screenshot and only hurts the user with the long filename. */\r\n expect(screen.getByText(name)).toHaveAttribute(\"title\", name);\r\n });\r\n\r\n test(\"renders the meta line when supplied\", () => {\r\n render(<FileCard name=\"facture.pdf\" meta=\"1,24 Mo\" />);\r\n expect(screen.getByText(\"1,24 Mo\")).toBeInTheDocument();\r\n });\r\n\r\n test(\"omits the meta line entirely when absent or empty\", () => {\r\n /* Not rendered rather than rendered blank: an empty second line reads as\r\n * missing data, and it changes the row height, which breaks the alignment\r\n * of a list of files. Both `undefined` and `\"\"` are covered because a host\r\n * formatting a byte count from an optional field produces either.\r\n *\r\n * Queried by testid, not by walking parentElement: \"absent, not empty\"\r\n * cannot be expressed as a text query, and the repo's eslint config forbids\r\n * direct node access — correctly, since a structural child count would also\r\n * break the moment the component gains an unrelated third line. */\r\n const { rerender } = render(<FileCard name=\"a.pdf\" />);\r\n expect(screen.getByText(\"a.pdf\")).toBeInTheDocument();\r\n expect(screen.queryByTestId(\"filecard-meta\")).not.toBeInTheDocument();\r\n\r\n rerender(<FileCard name=\"a.pdf\" meta=\"\" />);\r\n expect(screen.queryByTestId(\"filecard-meta\")).not.toBeInTheDocument();\r\n\r\n rerender(<FileCard name=\"a.pdf\" meta=\"248 Ko\" />);\r\n expect(screen.getByTestId(\"filecard-meta\")).toHaveTextContent(\"248 Ko\");\r\n });\r\n});\r\n\r\ndescribe(\"FileCard — actions slot\", () => {\r\n test(\"renders host-supplied actions\", () => {\r\n render(\r\n <FileCard\r\n name=\"a.pdf\"\r\n actions={<button type=\"button\">Télécharger</button>}\r\n />\r\n );\r\n expect(screen.getByRole(\"button\", { name: \"Télécharger\" })).toBeInTheDocument();\r\n });\r\n\r\n test(\"renders no action cluster when actions is absent\", () => {\r\n render(<FileCard name=\"a.pdf\" />);\r\n expect(screen.queryByRole(\"button\")).not.toBeInTheDocument();\r\n });\r\n\r\n test(\"does not invent any action of its own\", () => {\r\n /* Regression guard on the component's SCOPE, not its rendering. FileCard is\r\n * presentational: a download link, a delete confirmation and a blob URL all\r\n * belong to the host. If a future change adds a built-in button, this fails\r\n * — which is the intent. */\r\n render(<FileCard name=\"a.pdf\" meta=\"1 Ko\" />);\r\n expect(screen.queryByRole(\"button\")).not.toBeInTheDocument();\r\n expect(screen.queryByRole(\"link\")).not.toBeInTheDocument();\r\n });\r\n});\r\n\r\ndescribe(\"FileCard — accessibility\", () => {\r\n test(\"the leading icon is hidden from assistive tech\", () => {\r\n /* R-Ar.2 — the filename IS the accessible name; a decorative glyph carrying\r\n * one would make a screen reader announce the row twice. The wrapper has no\r\n * role and no name by design, so there is no semantic query for it: the\r\n * component exposes a stable testid for exactly this assertion. */\r\n render(<FileCard name=\"a.pdf\" />);\r\n expect(screen.getByTestId(\"filecard-icon\")).toHaveAttribute(\"aria-hidden\", \"true\");\r\n });\r\n\r\n test(\"a custom icon replaces the default and stays hidden\", () => {\r\n /* The second assertion is the one that matters: a host passing its own glyph\r\n * must not be able to leak it into the accessibility tree. */\r\n render(<FileCard name=\"a.pdf\" icon={<svg data-testid=\"custom\" />} />);\r\n expect(screen.getByTestId(\"custom\")).toBeInTheDocument();\r\n expect(screen.getByTestId(\"filecard-icon\")).toHaveAttribute(\"aria-hidden\", \"true\");\r\n });\r\n\r\n test(\"carries no role of its own\", () => {\r\n /* The card is not interactive — only its actions are. Giving it role=button\r\n * or wrapping it in a group without an accessible name would add noise to\r\n * the SR tree. Asserted so a future \"make the whole row clickable\" change\r\n * has to be a deliberate decision rather than a drive-by. */\r\n render(<FileCard name=\"a.pdf\" />);\r\n expect(screen.queryByRole(\"button\")).not.toBeInTheDocument();\r\n expect(screen.queryByRole(\"group\")).not.toBeInTheDocument();\r\n });\r\n});\r\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
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); }
|
|
2
|
+
var _excluded = ["initialValue", "required", "onValues"];
|
|
3
|
+
function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return exports; }; var exports = {}, Op = Object.prototype, hasOwn = Op.hasOwnProperty, defineProperty = Object.defineProperty || function (obj, key, desc) { obj[key] = desc.value; }, $Symbol = "function" == typeof Symbol ? Symbol : {}, iteratorSymbol = $Symbol.iterator || "@@iterator", asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator", toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag"; function define(obj, key, value) { return Object.defineProperty(obj, key, { value: value, enumerable: !0, configurable: !0, writable: !0 }), obj[key]; } try { define({}, ""); } catch (err) { define = function define(obj, key, value) { return obj[key] = value; }; } function wrap(innerFn, outerFn, self, tryLocsList) { var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator, generator = Object.create(protoGenerator.prototype), context = new Context(tryLocsList || []); return defineProperty(generator, "_invoke", { value: makeInvokeMethod(innerFn, self, context) }), generator; } function tryCatch(fn, obj, arg) { try { return { type: "normal", arg: fn.call(obj, arg) }; } catch (err) { return { type: "throw", arg: err }; } } exports.wrap = wrap; var ContinueSentinel = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var IteratorPrototype = {}; define(IteratorPrototype, iteratorSymbol, function () { return this; }); var getProto = Object.getPrototypeOf, NativeIteratorPrototype = getProto && getProto(getProto(values([]))); NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol) && (IteratorPrototype = NativeIteratorPrototype); var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype); function defineIteratorMethods(prototype) { ["next", "throw", "return"].forEach(function (method) { define(prototype, method, function (arg) { return this._invoke(method, arg); }); }); } function AsyncIterator(generator, PromiseImpl) { function invoke(method, arg, resolve, reject) { var record = tryCatch(generator[method], generator, arg); if ("throw" !== record.type) { var result = record.arg, value = result.value; return value && "object" == _typeof(value) && hasOwn.call(value, "__await") ? PromiseImpl.resolve(value.__await).then(function (value) { invoke("next", value, resolve, reject); }, function (err) { invoke("throw", err, resolve, reject); }) : PromiseImpl.resolve(value).then(function (unwrapped) { result.value = unwrapped, resolve(result); }, function (error) { return invoke("throw", error, resolve, reject); }); } reject(record.arg); } var previousPromise; defineProperty(this, "_invoke", { value: function value(method, arg) { function callInvokeWithMethodAndArg() { return new PromiseImpl(function (resolve, reject) { invoke(method, arg, resolve, reject); }); } return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(innerFn, self, context) { var state = "suspendedStart"; return function (method, arg) { if ("executing" === state) throw new Error("Generator is already running"); if ("completed" === state) { if ("throw" === method) throw arg; return doneResult(); } for (context.method = method, context.arg = arg;;) { var delegate = context.delegate; if (delegate) { var delegateResult = maybeInvokeDelegate(delegate, context); if (delegateResult) { if (delegateResult === ContinueSentinel) continue; return delegateResult; } } if ("next" === context.method) context.sent = context._sent = context.arg;else if ("throw" === context.method) { if ("suspendedStart" === state) throw state = "completed", context.arg; context.dispatchException(context.arg); } else "return" === context.method && context.abrupt("return", context.arg); state = "executing"; var record = tryCatch(innerFn, self, context); if ("normal" === record.type) { if (state = context.done ? "completed" : "suspendedYield", record.arg === ContinueSentinel) continue; return { value: record.arg, done: context.done }; } "throw" === record.type && (state = "completed", context.method = "throw", context.arg = record.arg); } }; } function maybeInvokeDelegate(delegate, context) { var methodName = context.method, method = delegate.iterator[methodName]; if (undefined === method) return context.delegate = null, "throw" === methodName && delegate.iterator["return"] && (context.method = "return", context.arg = undefined, maybeInvokeDelegate(delegate, context), "throw" === context.method) || "return" !== methodName && (context.method = "throw", context.arg = new TypeError("The iterator does not provide a '" + methodName + "' method")), ContinueSentinel; var record = tryCatch(method, delegate.iterator, context.arg); if ("throw" === record.type) return context.method = "throw", context.arg = record.arg, context.delegate = null, ContinueSentinel; var info = record.arg; return info ? info.done ? (context[delegate.resultName] = info.value, context.next = delegate.nextLoc, "return" !== context.method && (context.method = "next", context.arg = undefined), context.delegate = null, ContinueSentinel) : info : (context.method = "throw", context.arg = new TypeError("iterator result is not an object"), context.delegate = null, ContinueSentinel); } function pushTryEntry(locs) { var entry = { tryLoc: locs[0] }; 1 in locs && (entry.catchLoc = locs[1]), 2 in locs && (entry.finallyLoc = locs[2], entry.afterLoc = locs[3]), this.tryEntries.push(entry); } function resetTryEntry(entry) { var record = entry.completion || {}; record.type = "normal", delete record.arg, entry.completion = record; } function Context(tryLocsList) { this.tryEntries = [{ tryLoc: "root" }], tryLocsList.forEach(pushTryEntry, this), this.reset(!0); } function values(iterable) { if (iterable) { var iteratorMethod = iterable[iteratorSymbol]; if (iteratorMethod) return iteratorMethod.call(iterable); if ("function" == typeof iterable.next) return iterable; if (!isNaN(iterable.length)) { var i = -1, next = function next() { for (; ++i < iterable.length;) { if (hasOwn.call(iterable, i)) return next.value = iterable[i], next.done = !1, next; } return next.value = undefined, next.done = !0, next; }; return next.next = next; } } return { next: doneResult }; } function doneResult() { return { value: undefined, done: !0 }; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, defineProperty(Gp, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), defineProperty(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, "GeneratorFunction"), exports.isGeneratorFunction = function (genFun) { var ctor = "function" == typeof genFun && genFun.constructor; return !!ctor && (ctor === GeneratorFunction || "GeneratorFunction" === (ctor.displayName || ctor.name)); }, exports.mark = function (genFun) { return Object.setPrototypeOf ? Object.setPrototypeOf(genFun, GeneratorFunctionPrototype) : (genFun.__proto__ = GeneratorFunctionPrototype, define(genFun, toStringTagSymbol, "GeneratorFunction")), genFun.prototype = Object.create(Gp), genFun; }, exports.awrap = function (arg) { return { __await: arg }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, asyncIteratorSymbol, function () { return this; }), exports.AsyncIterator = AsyncIterator, exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) { void 0 === PromiseImpl && (PromiseImpl = Promise); var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl); return exports.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) { return result.done ? result.value : iter.next(); }); }, defineIteratorMethods(Gp), define(Gp, toStringTagSymbol, "Generator"), define(Gp, iteratorSymbol, function () { return this; }), define(Gp, "toString", function () { return "[object Generator]"; }), exports.keys = function (val) { var object = Object(val), keys = []; for (var key in object) { keys.push(key); } return keys.reverse(), function next() { for (; keys.length;) { var key = keys.pop(); if (key in object) return next.value = key, next.done = !1, next; } return next.done = !0, next; }; }, exports.values = values, Context.prototype = { constructor: Context, reset: function reset(skipTempReset) { if (this.prev = 0, this.next = 0, this.sent = this._sent = undefined, this.done = !1, this.delegate = null, this.method = "next", this.arg = undefined, this.tryEntries.forEach(resetTryEntry), !skipTempReset) for (var name in this) { "t" === name.charAt(0) && hasOwn.call(this, name) && !isNaN(+name.slice(1)) && (this[name] = undefined); } }, stop: function stop() { this.done = !0; var rootRecord = this.tryEntries[0].completion; if ("throw" === rootRecord.type) throw rootRecord.arg; return this.rval; }, dispatchException: function dispatchException(exception) { if (this.done) throw exception; var context = this; function handle(loc, caught) { return record.type = "throw", record.arg = exception, context.next = loc, caught && (context.method = "next", context.arg = undefined), !!caught; } for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i], record = entry.completion; if ("root" === entry.tryLoc) return handle("end"); if (entry.tryLoc <= this.prev) { var hasCatch = hasOwn.call(entry, "catchLoc"), hasFinally = hasOwn.call(entry, "finallyLoc"); if (hasCatch && hasFinally) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } else if (hasCatch) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); } else { if (!hasFinally) throw new Error("try statement without catch or finally"); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } } } }, abrupt: function abrupt(type, arg) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc <= this.prev && hasOwn.call(entry, "finallyLoc") && this.prev < entry.finallyLoc) { var finallyEntry = entry; break; } } finallyEntry && ("break" === type || "continue" === type) && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc && (finallyEntry = null); var record = finallyEntry ? finallyEntry.completion : {}; return record.type = type, record.arg = arg, finallyEntry ? (this.method = "next", this.next = finallyEntry.finallyLoc, ContinueSentinel) : this.complete(record); }, complete: function complete(record, afterLoc) { if ("throw" === record.type) throw record.arg; return "break" === record.type || "continue" === record.type ? this.next = record.arg : "return" === record.type ? (this.rval = this.arg = record.arg, this.method = "return", this.next = "end") : "normal" === record.type && afterLoc && (this.next = afterLoc), ContinueSentinel; }, finish: function finish(finallyLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.finallyLoc === finallyLoc) return this.complete(entry.completion, entry.afterLoc), resetTryEntry(entry), ContinueSentinel; } }, "catch": function _catch(tryLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc === tryLoc) { var record = entry.completion; if ("throw" === record.type) { var thrown = record.arg; resetTryEntry(entry); } return thrown; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(iterable, resultName, nextLoc) { return this.delegate = { iterator: values(iterable), resultName: resultName, nextLoc: nextLoc }, "next" === this.method && (this.arg = undefined), ContinueSentinel; } }, exports; }
|
|
4
|
+
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
|
|
5
|
+
function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
|
|
6
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
7
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
8
|
+
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
9
|
+
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
|
|
10
|
+
function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
|
|
11
|
+
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
|
12
|
+
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
|
13
|
+
import "@testing-library/jest-dom";
|
|
14
|
+
import * as React from "react";
|
|
15
|
+
import { render, screen } from "@testing-library/react";
|
|
16
|
+
import userEvent from "@testing-library/user-event";
|
|
17
|
+
import { Formik, Form } from "formik";
|
|
18
|
+
import FormikCheckbox from "../patterns/FormikCheckbox";
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* FormikCheckbox — contract tests (gap G-A).
|
|
22
|
+
*
|
|
23
|
+
* WHY THIS FILE EXISTS
|
|
24
|
+
* --------------------
|
|
25
|
+
* §10.3 R-G.6 MUST. But the contracts worth pinning here are the ones a
|
|
26
|
+
* screenshot cannot see, and each of them is a real defect this bridge was
|
|
27
|
+
* created to stop repeating:
|
|
28
|
+
*
|
|
29
|
+
* 1. THE VALUE SHAPE. This component exists because `FormikCheckboxGroup`
|
|
30
|
+
* writes an ARRAY. If a refactor ever routed this bridge through the group,
|
|
31
|
+
* hosts would start sending `["on"]` where their payload declares a
|
|
32
|
+
* boolean — visually identical, and wrong all the way to the database.
|
|
33
|
+
*
|
|
34
|
+
* 2. TOUCHED-ON-CHANGE. A checkbox has no meaningful blur-before-change, so
|
|
35
|
+
* if the field is only marked touched on blur, a required-checkbox error
|
|
36
|
+
* stays invisible however many times the user clicks. That is exactly the
|
|
37
|
+
* defect reported from refonte-frontend, where a hand-rolled bridge
|
|
38
|
+
* rendered no message at all.
|
|
39
|
+
*
|
|
40
|
+
* 3. `aria-required` LANDS ON THE INPUT. `Field` injects it onto its child,
|
|
41
|
+
* which here is the CheckboxGroup — a `role="group"` div that does not
|
|
42
|
+
* forward it. Assert the input, not the group.
|
|
43
|
+
*
|
|
44
|
+
* 4. NO `error` ATTRIBUTE ON THE DOM. `Field` clones its child with
|
|
45
|
+
* `error`/`disabled` for the v2 inputs that read them directly. A bare
|
|
46
|
+
* `Checkbox` would spread `error` down to the native input; the
|
|
47
|
+
* CheckboxGroup wrapper is what absorbs it. Drop the wrapper and React
|
|
48
|
+
* starts warning while every pixel stays identical.
|
|
49
|
+
*
|
|
50
|
+
* NOT COVERED — deliberately: the asterisk colour and the grey error panel are
|
|
51
|
+
* CSS variables, which jsdom does not resolve. Those belong to the story.
|
|
52
|
+
*/
|
|
53
|
+
|
|
54
|
+
/** Minimal host: a Formik form exposing its values for assertion. */
|
|
55
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
56
|
+
function Hote(_ref) {
|
|
57
|
+
var initialValue = _ref.initialValue,
|
|
58
|
+
required = _ref.required,
|
|
59
|
+
onValues = _ref.onValues,
|
|
60
|
+
props = _objectWithoutProperties(_ref, _excluded);
|
|
61
|
+
return /*#__PURE__*/_jsx(Formik, {
|
|
62
|
+
initialValues: {
|
|
63
|
+
flag: initialValue
|
|
64
|
+
},
|
|
65
|
+
validate: function validate(values) {
|
|
66
|
+
return required && values.flag !== true ? {
|
|
67
|
+
flag: "Cochez cette case pour continuer."
|
|
68
|
+
} : {};
|
|
69
|
+
},
|
|
70
|
+
onSubmit: function onSubmit() {
|
|
71
|
+
return undefined;
|
|
72
|
+
},
|
|
73
|
+
children: function children(_ref2) {
|
|
74
|
+
var values = _ref2.values;
|
|
75
|
+
onValues === null || onValues === void 0 ? void 0 : onValues(values);
|
|
76
|
+
return /*#__PURE__*/_jsx(Form, {
|
|
77
|
+
children: /*#__PURE__*/_jsx(FormikCheckbox, _objectSpread(_objectSpread({
|
|
78
|
+
name: "flag",
|
|
79
|
+
label: "Premi\xE8re d\xE9claration"
|
|
80
|
+
}, required !== undefined ? {
|
|
81
|
+
required: required
|
|
82
|
+
} : {}), props))
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
describe("FormikCheckbox — the value stays a BOOLEAN", function () {
|
|
88
|
+
test("toggling writes `true`, untoggling writes `false` — never an array", /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
|
|
89
|
+
var vues;
|
|
90
|
+
return _regeneratorRuntime().wrap(function _callee$(_context) {
|
|
91
|
+
while (1) {
|
|
92
|
+
switch (_context.prev = _context.next) {
|
|
93
|
+
case 0:
|
|
94
|
+
vues = [];
|
|
95
|
+
render(/*#__PURE__*/_jsx(Hote, {
|
|
96
|
+
initialValue: false,
|
|
97
|
+
onValues: function onValues(v) {
|
|
98
|
+
return vues.push(v.flag);
|
|
99
|
+
}
|
|
100
|
+
}));
|
|
101
|
+
_context.next = 4;
|
|
102
|
+
return userEvent.click(screen.getByRole("checkbox"));
|
|
103
|
+
case 4:
|
|
104
|
+
expect(vues.at(-1)).toBe(true);
|
|
105
|
+
_context.next = 7;
|
|
106
|
+
return userEvent.click(screen.getByRole("checkbox"));
|
|
107
|
+
case 7:
|
|
108
|
+
expect(vues.at(-1)).toBe(false);
|
|
109
|
+
|
|
110
|
+
/* The point of the assertion: not one intermediate value was an array. */
|
|
111
|
+
expect(vues.some(function (v) {
|
|
112
|
+
return Array.isArray(v);
|
|
113
|
+
})).toBe(false);
|
|
114
|
+
case 9:
|
|
115
|
+
case "end":
|
|
116
|
+
return _context.stop();
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}, _callee);
|
|
120
|
+
})));
|
|
121
|
+
test("a `null` seed renders a CONTROLLED, unchecked input", function () {
|
|
122
|
+
/* Hosts seed these flags with `null` (« not answered yet »). Passing that
|
|
123
|
+
* straight to `checked` makes React treat the input as uncontrolled for one
|
|
124
|
+
* render, then warn and lose the first click. */
|
|
125
|
+
var avertissements = [];
|
|
126
|
+
var spy = jest.spyOn(console, "error").mockImplementation(function () {
|
|
127
|
+
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
128
|
+
args[_key] = arguments[_key];
|
|
129
|
+
}
|
|
130
|
+
avertissements.push(args);
|
|
131
|
+
});
|
|
132
|
+
render(/*#__PURE__*/_jsx(Hote, {
|
|
133
|
+
initialValue: null
|
|
134
|
+
}));
|
|
135
|
+
expect(screen.getByRole("checkbox")).not.toBeChecked();
|
|
136
|
+
expect(avertissements.some(function (a) {
|
|
137
|
+
return String(a[0]).includes("uncontrolled");
|
|
138
|
+
})).toBe(false);
|
|
139
|
+
spy.mockRestore();
|
|
140
|
+
});
|
|
141
|
+
});
|
|
142
|
+
describe("FormikCheckbox — the error is reachable without a blur", function () {
|
|
143
|
+
test("clicking marks the field touched, so the message appears", /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee2() {
|
|
144
|
+
return _regeneratorRuntime().wrap(function _callee2$(_context2) {
|
|
145
|
+
while (1) {
|
|
146
|
+
switch (_context2.prev = _context2.next) {
|
|
147
|
+
case 0:
|
|
148
|
+
render(/*#__PURE__*/_jsx(Hote, {
|
|
149
|
+
initialValue: false,
|
|
150
|
+
required: true
|
|
151
|
+
}));
|
|
152
|
+
|
|
153
|
+
/* Untouched: no message, however invalid the value is. */
|
|
154
|
+
expect(screen.queryByRole("alert")).not.toBeInTheDocument();
|
|
155
|
+
|
|
156
|
+
/* Check then uncheck — the field is now touched AND invalid. */
|
|
157
|
+
_context2.next = 4;
|
|
158
|
+
return userEvent.click(screen.getByRole("checkbox"));
|
|
159
|
+
case 4:
|
|
160
|
+
_context2.next = 6;
|
|
161
|
+
return userEvent.click(screen.getByRole("checkbox"));
|
|
162
|
+
case 6:
|
|
163
|
+
expect(screen.getByRole("alert")).toHaveTextContent("Cochez cette case pour continuer.");
|
|
164
|
+
case 7:
|
|
165
|
+
case "end":
|
|
166
|
+
return _context2.stop();
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}, _callee2);
|
|
170
|
+
})));
|
|
171
|
+
test("the message becomes the group's accessible description", /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee3() {
|
|
172
|
+
return _regeneratorRuntime().wrap(function _callee3$(_context3) {
|
|
173
|
+
while (1) {
|
|
174
|
+
switch (_context3.prev = _context3.next) {
|
|
175
|
+
case 0:
|
|
176
|
+
render(/*#__PURE__*/_jsx(Hote, {
|
|
177
|
+
initialValue: false,
|
|
178
|
+
required: true
|
|
179
|
+
}));
|
|
180
|
+
_context3.next = 3;
|
|
181
|
+
return userEvent.click(screen.getByRole("checkbox"));
|
|
182
|
+
case 3:
|
|
183
|
+
_context3.next = 5;
|
|
184
|
+
return userEvent.click(screen.getByRole("checkbox"));
|
|
185
|
+
case 5:
|
|
186
|
+
expect(screen.getByRole("group")).toHaveAccessibleDescription("Cochez cette case pour continuer.");
|
|
187
|
+
case 6:
|
|
188
|
+
case "end":
|
|
189
|
+
return _context3.stop();
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}, _callee3);
|
|
193
|
+
})));
|
|
194
|
+
test("the hint shows while valid and is suppressed by the error", /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee4() {
|
|
195
|
+
return _regeneratorRuntime().wrap(function _callee4$(_context4) {
|
|
196
|
+
while (1) {
|
|
197
|
+
switch (_context4.prev = _context4.next) {
|
|
198
|
+
case 0:
|
|
199
|
+
render(/*#__PURE__*/_jsx(Hote, {
|
|
200
|
+
initialValue: false,
|
|
201
|
+
required: true,
|
|
202
|
+
hint: "Obligatoire pour soumettre la demande"
|
|
203
|
+
}));
|
|
204
|
+
expect(screen.getByText("Obligatoire pour soumettre la demande")).toBeInTheDocument();
|
|
205
|
+
_context4.next = 4;
|
|
206
|
+
return userEvent.click(screen.getByRole("checkbox"));
|
|
207
|
+
case 4:
|
|
208
|
+
_context4.next = 6;
|
|
209
|
+
return userEvent.click(screen.getByRole("checkbox"));
|
|
210
|
+
case 6:
|
|
211
|
+
expect(screen.queryByText("Obligatoire pour soumettre la demande")).not.toBeInTheDocument();
|
|
212
|
+
case 7:
|
|
213
|
+
case "end":
|
|
214
|
+
return _context4.stop();
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}, _callee4);
|
|
218
|
+
})));
|
|
219
|
+
});
|
|
220
|
+
describe("FormikCheckbox — ARIA and DOM hygiene", function () {
|
|
221
|
+
test("`required` puts aria-required on the INPUT, not on the group", function () {
|
|
222
|
+
/* Field's own injection lands on the CheckboxGroup, which is a role=group
|
|
223
|
+
* div and does not forward it — hence the explicit inputProps route. */
|
|
224
|
+
render(/*#__PURE__*/_jsx(Hote, {
|
|
225
|
+
initialValue: false,
|
|
226
|
+
required: true
|
|
227
|
+
}));
|
|
228
|
+
expect(screen.getByRole("checkbox")).toHaveAttribute("aria-required", "true");
|
|
229
|
+
});
|
|
230
|
+
test("the label names the checkbox", function () {
|
|
231
|
+
render(/*#__PURE__*/_jsx(Hote, {
|
|
232
|
+
initialValue: false
|
|
233
|
+
}));
|
|
234
|
+
expect(screen.getByRole("checkbox", {
|
|
235
|
+
name: /Première déclaration/
|
|
236
|
+
})).toBeInTheDocument();
|
|
237
|
+
});
|
|
238
|
+
test("no `error` attribute leaks onto the native input", /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee5() {
|
|
239
|
+
return _regeneratorRuntime().wrap(function _callee5$(_context5) {
|
|
240
|
+
while (1) {
|
|
241
|
+
switch (_context5.prev = _context5.next) {
|
|
242
|
+
case 0:
|
|
243
|
+
/* The CheckboxGroup wrapper is what absorbs Field's `error` clone. Without
|
|
244
|
+
* it React warns and the DOM carries an invalid attribute — with no visual
|
|
245
|
+
* tell whatsoever. */
|
|
246
|
+
render(/*#__PURE__*/_jsx(Hote, {
|
|
247
|
+
initialValue: false,
|
|
248
|
+
required: true
|
|
249
|
+
}));
|
|
250
|
+
_context5.next = 3;
|
|
251
|
+
return userEvent.click(screen.getByRole("checkbox"));
|
|
252
|
+
case 3:
|
|
253
|
+
_context5.next = 5;
|
|
254
|
+
return userEvent.click(screen.getByRole("checkbox"));
|
|
255
|
+
case 5:
|
|
256
|
+
expect(screen.getByRole("checkbox")).not.toHaveAttribute("error");
|
|
257
|
+
case 6:
|
|
258
|
+
case "end":
|
|
259
|
+
return _context5.stop();
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
}, _callee5);
|
|
263
|
+
})));
|
|
264
|
+
});
|
|
265
|
+
//# sourceMappingURL=FormikCheckbox.test.js.map
|