@portnet/ui 5.0.32 → 6.0.1
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 +524 -0
- package/README.md +101 -38
- package/dist/esm/index.js +196 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/v2/__tests__/FieldError.test.js +160 -0
- package/dist/esm/v2/__tests__/FieldError.test.js.map +1 -0
- package/dist/esm/v2/__tests__/FileCard.test.js +144 -0
- package/dist/esm/v2/__tests__/FileCard.test.js.map +1 -0
- package/dist/esm/v2/__tests__/MobileRowCard.test.js +333 -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 +147 -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 +182 -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 +197 -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 +244 -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 +121 -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 +164 -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/FormikCheckboxGroup.js +110 -0
- package/dist/esm/v2/patterns/FormikCheckboxGroup.js.map +1 -0
- package/dist/esm/v2/patterns/FormikCombobox.js +115 -0
- package/dist/esm/v2/patterns/FormikCombobox.js.map +1 -0
- package/dist/esm/v2/patterns/FormikDatePicker.js +196 -0
- package/dist/esm/v2/patterns/FormikDatePicker.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 +127 -0
- package/dist/esm/v2/patterns/FormikInput.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 +159 -0
- package/dist/esm/v2/patterns/FormikSelect.js.map +1 -0
- package/dist/esm/v2/patterns/FormikTextarea.js +76 -0
- package/dist/esm/v2/patterns/FormikTextarea.js.map +1 -0
- package/dist/esm/v2/patterns/KeyboardShortcutsHelp.js +195 -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/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/_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 +95 -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/index.js +17 -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 +46 -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 +60 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +183 -191
- package/dist/index.js.map +1 -0
- package/dist/v2/__tests__/FieldError.test.js +164 -0
- package/dist/v2/__tests__/FieldError.test.js.map +1 -0
- package/dist/v2/__tests__/FileCard.test.js +148 -0
- package/dist/v2/__tests__/FileCard.test.js.map +1 -0
- package/dist/v2/__tests__/MobileRowCard.test.js +337 -0
- package/dist/v2/__tests__/MobileRowCard.test.js.map +1 -0
- package/dist/v2/__tests__/SectionErrorBoundary.test.js +237 -0
- package/dist/v2/__tests__/SectionErrorBoundary.test.js.map +1 -0
- package/dist/v2/__tests__/apiError.test.js +182 -0
- package/dist/v2/__tests__/apiError.test.js.map +1 -0
- package/dist/v2/__tests__/banned-patterns.test.js +272 -0
- package/dist/v2/__tests__/banned-patterns.test.js.map +1 -0
- package/dist/v2/__tests__/contrast-palette.test.js +225 -0
- package/dist/v2/__tests__/contrast-palette.test.js.map +1 -0
- package/dist/v2/__tests__/cssVariables.test.js +158 -0
- package/dist/v2/__tests__/cssVariables.test.js.map +1 -0
- package/dist/v2/__tests__/labels-merge.test.js +153 -0
- package/dist/v2/__tests__/labels-merge.test.js.map +1 -0
- package/dist/v2/__tests__/locale-fallback.test.js +111 -0
- package/dist/v2/__tests__/locale-fallback.test.js.map +1 -0
- package/dist/v2/__tests__/useFocusTrap.test.js +517 -0
- package/dist/v2/__tests__/useFocusTrap.test.js.map +1 -0
- package/dist/v2/components/Accordion.d.ts +56 -0
- package/dist/v2/components/Accordion.d.ts.map +1 -0
- package/dist/v2/components/Accordion.js +238 -0
- package/dist/v2/components/Accordion.js.map +1 -0
- package/dist/v2/components/ActionStrip.d.ts +67 -0
- package/dist/v2/components/ActionStrip.d.ts.map +1 -0
- package/dist/v2/components/ActionStrip.js +154 -0
- package/dist/v2/components/ActionStrip.js.map +1 -0
- package/dist/v2/components/Banner.d.ts +88 -0
- package/dist/v2/components/Banner.d.ts.map +1 -0
- package/dist/v2/components/Banner.js +264 -0
- package/dist/v2/components/Banner.js.map +1 -0
- package/dist/v2/components/Busy.d.ts +18 -0
- package/dist/v2/components/Busy.d.ts.map +1 -0
- package/dist/v2/components/Busy.js +104 -0
- package/dist/v2/components/Busy.js.map +1 -0
- package/dist/v2/components/Button.d.ts +36 -0
- package/dist/v2/components/Button.d.ts.map +1 -0
- package/dist/v2/components/Button.js +122 -0
- package/dist/v2/components/Button.js.map +1 -0
- package/dist/v2/components/CategoryTag.d.ts +45 -0
- package/dist/v2/components/CategoryTag.d.ts.map +1 -0
- package/dist/v2/components/CategoryTag.js +89 -0
- package/dist/v2/components/CategoryTag.js.map +1 -0
- package/dist/v2/components/Checkbox.d.ts +59 -0
- package/dist/v2/components/Checkbox.d.ts.map +1 -0
- package/dist/v2/components/Checkbox.js +134 -0
- package/dist/v2/components/Checkbox.js.map +1 -0
- package/dist/v2/components/Chip.d.ts +48 -0
- package/dist/v2/components/Chip.d.ts.map +1 -0
- package/dist/v2/components/Chip.js +132 -0
- package/dist/v2/components/Chip.js.map +1 -0
- package/dist/v2/components/Combobox.d.ts +134 -0
- package/dist/v2/components/Combobox.d.ts.map +1 -0
- package/dist/v2/components/Combobox.js +400 -0
- package/dist/v2/components/Combobox.js.map +1 -0
- package/dist/v2/components/CommandPalette.d.ts +36 -0
- package/dist/v2/components/CommandPalette.d.ts.map +1 -0
- package/dist/v2/components/CommandPalette.js +668 -0
- package/dist/v2/components/CommandPalette.js.map +1 -0
- package/dist/v2/components/ConfirmDialog.d.ts +23 -0
- package/dist/v2/components/ConfirmDialog.d.ts.map +1 -0
- package/dist/v2/components/ConfirmDialog.js +151 -0
- package/dist/v2/components/ConfirmDialog.js.map +1 -0
- package/dist/v2/components/DatePicker.d.ts +21 -0
- package/dist/v2/components/DatePicker.d.ts.map +1 -0
- package/dist/v2/components/DatePicker.js +207 -0
- package/dist/v2/components/DatePicker.js.map +1 -0
- package/dist/v2/components/DateRangePicker.d.ts +81 -0
- package/dist/v2/components/DateRangePicker.d.ts.map +1 -0
- package/dist/v2/components/DateRangePicker.js +296 -0
- package/dist/v2/components/DateRangePicker.js.map +1 -0
- package/dist/v2/components/DateTimePicker.d.ts +21 -0
- package/dist/v2/components/DateTimePicker.d.ts.map +1 -0
- package/dist/v2/components/DateTimePicker.js +189 -0
- package/dist/v2/components/DateTimePicker.js.map +1 -0
- package/dist/v2/components/Drawer.d.ts +34 -0
- package/dist/v2/components/Drawer.d.ts.map +1 -0
- package/dist/v2/components/Drawer.js +340 -0
- package/dist/v2/components/Drawer.js.map +1 -0
- package/dist/v2/components/Dropzone.d.ts +150 -0
- package/dist/v2/components/Dropzone.d.ts.map +1 -0
- package/dist/v2/components/Dropzone.js +547 -0
- package/dist/v2/components/Dropzone.js.map +1 -0
- package/dist/v2/components/EmptyState.d.ts +36 -0
- package/dist/v2/components/EmptyState.d.ts.map +1 -0
- package/dist/v2/components/EmptyState.js +112 -0
- package/dist/v2/components/EmptyState.js.map +1 -0
- package/dist/v2/components/FavoriteToggle.d.ts +22 -0
- package/dist/v2/components/FavoriteToggle.d.ts.map +1 -0
- package/dist/v2/components/FavoriteToggle.js +135 -0
- package/dist/v2/components/FavoriteToggle.js.map +1 -0
- package/dist/v2/components/Field.d.ts +63 -0
- package/dist/v2/components/Field.d.ts.map +1 -0
- package/dist/v2/components/Field.js +204 -0
- package/dist/v2/components/Field.js.map +1 -0
- 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 +54 -0
- package/dist/v2/components/FieldHelp.d.ts.map +1 -0
- package/dist/v2/components/FieldHelp.js +209 -0
- package/dist/v2/components/FieldHelp.js.map +1 -0
- 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 +35 -0
- package/dist/v2/components/FilterTab.d.ts.map +1 -0
- package/dist/v2/components/FilterTab.js +145 -0
- package/dist/v2/components/FilterTab.js.map +1 -0
- package/dist/v2/components/ForbiddenPage.d.ts +40 -0
- package/dist/v2/components/ForbiddenPage.d.ts.map +1 -0
- package/dist/v2/components/ForbiddenPage.js +81 -0
- package/dist/v2/components/ForbiddenPage.js.map +1 -0
- package/dist/v2/components/FormGrid.d.ts +81 -0
- package/dist/v2/components/FormGrid.d.ts.map +1 -0
- package/dist/v2/components/FormGrid.js +187 -0
- package/dist/v2/components/FormGrid.js.map +1 -0
- package/dist/v2/components/FormikDisplay.d.ts +38 -0
- package/dist/v2/components/FormikDisplay.d.ts.map +1 -0
- package/dist/v2/components/FormikDisplay.js +125 -0
- package/dist/v2/components/FormikDisplay.js.map +1 -0
- package/dist/v2/components/Input.d.ts +62 -0
- package/dist/v2/components/Input.d.ts.map +1 -0
- package/dist/v2/components/Input.js +115 -0
- package/dist/v2/components/Input.js.map +1 -0
- package/dist/v2/components/KPICard.d.ts +52 -0
- package/dist/v2/components/KPICard.d.ts.map +1 -0
- package/dist/v2/components/KPICard.js +244 -0
- package/dist/v2/components/KPICard.js.map +1 -0
- 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 +25 -0
- package/dist/v2/components/KV.d.ts.map +1 -0
- package/dist/v2/components/KV.js +82 -0
- package/dist/v2/components/KV.js.map +1 -0
- package/dist/v2/components/KVGrid.d.ts +44 -0
- package/dist/v2/components/KVGrid.d.ts.map +1 -0
- package/dist/v2/components/KVGrid.js +80 -0
- package/dist/v2/components/KVGrid.js.map +1 -0
- package/dist/v2/components/Layout.d.ts +78 -0
- package/dist/v2/components/Layout.d.ts.map +1 -0
- package/dist/v2/components/Layout.js +284 -0
- package/dist/v2/components/Layout.js.map +1 -0
- package/dist/v2/components/MobileRowCard.d.ts +63 -0
- package/dist/v2/components/MobileRowCard.d.ts.map +1 -0
- package/dist/v2/components/MobileRowCard.js +321 -0
- package/dist/v2/components/MobileRowCard.js.map +1 -0
- package/dist/v2/components/Modal.d.ts +21 -0
- package/dist/v2/components/Modal.d.ts.map +1 -0
- package/dist/v2/components/Modal.js +281 -0
- package/dist/v2/components/Modal.js.map +1 -0
- package/dist/v2/components/NetworkErrorPage.d.ts +11 -0
- package/dist/v2/components/NetworkErrorPage.d.ts.map +1 -0
- package/dist/v2/components/NetworkErrorPage.js +86 -0
- package/dist/v2/components/NetworkErrorPage.js.map +1 -0
- package/dist/v2/components/NotFoundPage.d.ts +9 -0
- package/dist/v2/components/NotFoundPage.d.ts.map +1 -0
- package/dist/v2/components/NotFoundPage.js +66 -0
- package/dist/v2/components/NotFoundPage.js.map +1 -0
- package/dist/v2/components/NumberInput.d.ts +83 -0
- package/dist/v2/components/NumberInput.d.ts.map +1 -0
- package/dist/v2/components/NumberInput.js +317 -0
- package/dist/v2/components/NumberInput.js.map +1 -0
- package/dist/v2/components/OverflowMenu.d.ts +55 -0
- package/dist/v2/components/OverflowMenu.d.ts.map +1 -0
- package/dist/v2/components/OverflowMenu.js +192 -0
- package/dist/v2/components/OverflowMenu.js.map +1 -0
- package/dist/v2/components/PdfViewer.d.ts +56 -0
- package/dist/v2/components/PdfViewer.d.ts.map +1 -0
- package/dist/v2/components/PdfViewer.js +132 -0
- package/dist/v2/components/PdfViewer.js.map +1 -0
- package/dist/v2/components/ProgressBar.d.ts +53 -0
- package/dist/v2/components/ProgressBar.d.ts.map +1 -0
- package/dist/v2/components/ProgressBar.js +209 -0
- package/dist/v2/components/ProgressBar.js.map +1 -0
- package/dist/v2/components/Radio.d.ts +78 -0
- package/dist/v2/components/Radio.d.ts.map +1 -0
- package/dist/v2/components/Radio.js +238 -0
- package/dist/v2/components/Radio.js.map +1 -0
- 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 +53 -0
- package/dist/v2/components/SectionHeader.d.ts.map +1 -0
- package/dist/v2/components/SectionHeader.js +140 -0
- package/dist/v2/components/SectionHeader.js.map +1 -0
- package/dist/v2/components/Segmented.d.ts +61 -0
- package/dist/v2/components/Segmented.d.ts.map +1 -0
- package/dist/v2/components/Segmented.js +261 -0
- package/dist/v2/components/Segmented.js.map +1 -0
- package/dist/v2/components/Select.d.ts +90 -0
- package/dist/v2/components/Select.d.ts.map +1 -0
- package/dist/v2/components/Select.js +499 -0
- package/dist/v2/components/Select.js.map +1 -0
- package/dist/v2/components/ServerErrorPage.d.ts +11 -0
- package/dist/v2/components/ServerErrorPage.d.ts.map +1 -0
- package/dist/v2/components/ServerErrorPage.js +82 -0
- package/dist/v2/components/ServerErrorPage.js.map +1 -0
- package/dist/v2/components/Skeleton.d.ts +56 -0
- package/dist/v2/components/Skeleton.d.ts.map +1 -0
- package/dist/v2/components/Skeleton.js +281 -0
- package/dist/v2/components/Skeleton.js.map +1 -0
- package/dist/v2/components/SkipLink.d.ts +30 -0
- package/dist/v2/components/SkipLink.d.ts.map +1 -0
- package/dist/v2/components/SkipLink.js +58 -0
- package/dist/v2/components/SkipLink.js.map +1 -0
- package/dist/v2/components/Spinner.d.ts +40 -0
- package/dist/v2/components/Spinner.d.ts.map +1 -0
- package/dist/v2/components/Spinner.js +76 -0
- package/dist/v2/components/Spinner.js.map +1 -0
- package/dist/v2/components/Status.d.ts +42 -0
- package/dist/v2/components/Status.d.ts.map +1 -0
- package/dist/v2/components/Status.js +71 -0
- package/dist/v2/components/Status.js.map +1 -0
- package/dist/v2/components/Stepper.d.ts +142 -0
- package/dist/v2/components/Stepper.d.ts.map +1 -0
- package/dist/v2/components/Stepper.js +441 -0
- package/dist/v2/components/Stepper.js.map +1 -0
- 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 +30 -0
- package/dist/v2/components/Switch.d.ts.map +1 -0
- package/dist/v2/components/Switch.js +136 -0
- package/dist/v2/components/Switch.js.map +1 -0
- package/dist/v2/components/Tabs.d.ts +49 -0
- package/dist/v2/components/Tabs.d.ts.map +1 -0
- package/dist/v2/components/Tabs.js +160 -0
- package/dist/v2/components/Tabs.js.map +1 -0
- package/dist/v2/components/TelInput.d.ts +33 -0
- package/dist/v2/components/TelInput.d.ts.map +1 -0
- package/dist/v2/components/TelInput.js +282 -0
- package/dist/v2/components/TelInput.js.map +1 -0
- package/dist/v2/components/Textarea.d.ts +23 -0
- package/dist/v2/components/Textarea.d.ts.map +1 -0
- package/dist/v2/components/Textarea.js +80 -0
- package/dist/v2/components/Textarea.js.map +1 -0
- package/dist/v2/components/TimePicker.d.ts +21 -0
- package/dist/v2/components/TimePicker.d.ts.map +1 -0
- package/dist/v2/components/TimePicker.js +141 -0
- package/dist/v2/components/TimePicker.js.map +1 -0
- package/dist/v2/components/Toast.d.ts +32 -0
- package/dist/v2/components/Toast.d.ts.map +1 -0
- package/dist/v2/components/Toast.js +385 -0
- package/dist/v2/components/Toast.js.map +1 -0
- package/dist/v2/components/Tooltip.d.ts +9 -0
- package/dist/v2/components/Tooltip.d.ts.map +1 -0
- package/dist/v2/components/Tooltip.js +169 -0
- package/dist/v2/components/Tooltip.js.map +1 -0
- package/dist/v2/components/_ErrorPageBody.d.ts +48 -0
- package/dist/v2/components/_ErrorPageBody.d.ts.map +1 -0
- package/dist/v2/components/_ErrorPageBody.js +96 -0
- package/dist/v2/components/_ErrorPageBody.js.map +1 -0
- package/dist/v2/components/_pickerShared.d.ts +47 -0
- package/dist/v2/components/_pickerShared.d.ts.map +1 -0
- package/dist/v2/components/_pickerShared.js +68 -0
- package/dist/v2/components/_pickerShared.js.map +1 -0
- package/dist/v2/components/index.d.ts +226 -0
- package/dist/v2/components/index.d.ts.map +1 -0
- package/dist/v2/components/index.js +512 -0
- package/dist/v2/components/index.js.map +1 -0
- package/dist/v2/hooks/index.d.ts +11 -0
- package/dist/v2/hooks/index.d.ts.map +1 -0
- package/dist/v2/hooks/index.js +85 -0
- package/dist/v2/hooks/index.js.map +1 -0
- package/dist/v2/hooks/useDelayedFlag.d.ts +22 -0
- package/dist/v2/hooks/useDelayedFlag.d.ts.map +1 -0
- package/dist/v2/hooks/useDelayedFlag.js +60 -0
- package/dist/v2/hooks/useDelayedFlag.js.map +1 -0
- package/dist/v2/hooks/useDensity.d.ts +23 -0
- package/dist/v2/hooks/useDensity.d.ts.map +1 -0
- package/dist/v2/hooks/useDensity.js +124 -0
- package/dist/v2/hooks/useDensity.js.map +1 -0
- package/dist/v2/hooks/useFocusFirstError.d.ts +121 -0
- package/dist/v2/hooks/useFocusFirstError.d.ts.map +1 -0
- package/dist/v2/hooks/useFocusFirstError.js +203 -0
- package/dist/v2/hooks/useFocusFirstError.js.map +1 -0
- package/dist/v2/hooks/useFocusTrap.d.ts +3 -0
- package/dist/v2/hooks/useFocusTrap.d.ts.map +1 -0
- package/dist/v2/hooks/useFocusTrap.js +207 -0
- package/dist/v2/hooks/useFocusTrap.js.map +1 -0
- package/dist/v2/hooks/useFormAutoSave.d.ts +42 -0
- package/dist/v2/hooks/useFormAutoSave.d.ts.map +1 -0
- package/dist/v2/hooks/useFormAutoSave.js +186 -0
- package/dist/v2/hooks/useFormAutoSave.js.map +1 -0
- package/dist/v2/hooks/useFormCompletionProgress.d.ts +52 -0
- package/dist/v2/hooks/useFormCompletionProgress.d.ts.map +1 -0
- package/dist/v2/hooks/useFormCompletionProgress.js +136 -0
- package/dist/v2/hooks/useFormCompletionProgress.js.map +1 -0
- package/dist/v2/hooks/useResolvedDensity.d.ts +31 -0
- package/dist/v2/hooks/useResolvedDensity.d.ts.map +1 -0
- package/dist/v2/hooks/useResolvedDensity.js +50 -0
- package/dist/v2/hooks/useResolvedDensity.js.map +1 -0
- package/dist/v2/hooks/useSortedRows.d.ts +25 -0
- package/dist/v2/hooks/useSortedRows.d.ts.map +1 -0
- package/dist/v2/hooks/useSortedRows.js +38 -0
- package/dist/v2/hooks/useSortedRows.js.map +1 -0
- package/dist/v2/hooks/useTabLoading.d.ts +39 -0
- package/dist/v2/hooks/useTabLoading.d.ts.map +1 -0
- package/dist/v2/hooks/useTabLoading.js +85 -0
- package/dist/v2/hooks/useTabLoading.js.map +1 -0
- package/dist/v2/index.d.ts +115 -0
- package/dist/v2/index.d.ts.map +1 -0
- package/dist/v2/index.js +1127 -0
- package/dist/v2/index.js.map +1 -0
- package/dist/v2/modalContext.d.ts +96 -0
- package/dist/v2/modalContext.d.ts.map +1 -0
- package/dist/v2/modalContext.js +113 -0
- package/dist/v2/modalContext.js.map +1 -0
- package/dist/v2/models/favorite.d.ts +14 -0
- package/dist/v2/models/favorite.d.ts.map +1 -0
- package/dist/v2/models/favorite.js +6 -0
- package/dist/v2/models/favorite.js.map +1 -0
- package/dist/v2/models/index.d.ts +11 -0
- package/dist/v2/models/index.d.ts.map +1 -0
- package/dist/v2/models/index.js +50 -0
- package/dist/v2/models/index.js.map +1 -0
- package/dist/v2/models/personalization.d.ts +65 -0
- package/dist/v2/models/personalization.d.ts.map +1 -0
- package/dist/v2/models/personalization.js +6 -0
- package/dist/v2/models/personalization.js.map +1 -0
- package/dist/v2/models/referentiel.d.ts +67 -0
- package/dist/v2/models/referentiel.d.ts.map +1 -0
- package/dist/v2/models/referentiel.js +6 -0
- package/dist/v2/models/referentiel.js.map +1 -0
- package/dist/v2/models/savedFilter.d.ts +22 -0
- package/dist/v2/models/savedFilter.d.ts.map +1 -0
- package/dist/v2/models/savedFilter.js +6 -0
- package/dist/v2/models/savedFilter.js.map +1 -0
- package/dist/v2/patterns/ActionBar.d.ts +137 -0
- package/dist/v2/patterns/ActionBar.d.ts.map +1 -0
- package/dist/v2/patterns/ActionBar.js +602 -0
- package/dist/v2/patterns/ActionBar.js.map +1 -0
- package/dist/v2/patterns/BulkActionBar.d.ts +63 -0
- package/dist/v2/patterns/BulkActionBar.d.ts.map +1 -0
- package/dist/v2/patterns/BulkActionBar.js +154 -0
- package/dist/v2/patterns/BulkActionBar.js.map +1 -0
- package/dist/v2/patterns/CollapsibleDataGrid.d.ts +62 -0
- package/dist/v2/patterns/CollapsibleDataGrid.d.ts.map +1 -0
- package/dist/v2/patterns/CollapsibleDataGrid.js +306 -0
- package/dist/v2/patterns/CollapsibleDataGrid.js.map +1 -0
- package/dist/v2/patterns/ColumnsToggle.d.ts +55 -0
- package/dist/v2/patterns/ColumnsToggle.d.ts.map +1 -0
- package/dist/v2/patterns/ColumnsToggle.js +310 -0
- package/dist/v2/patterns/ColumnsToggle.js.map +1 -0
- package/dist/v2/patterns/DataGrid.d.ts +7 -0
- package/dist/v2/patterns/DataGrid.d.ts.map +1 -0
- package/dist/v2/patterns/DataGrid.js +834 -0
- package/dist/v2/patterns/DataGrid.js.map +1 -0
- package/dist/v2/patterns/DataGridSettingsMenu.d.ts +68 -0
- package/dist/v2/patterns/DataGridSettingsMenu.d.ts.map +1 -0
- package/dist/v2/patterns/DataGridSettingsMenu.js +382 -0
- package/dist/v2/patterns/DataGridSettingsMenu.js.map +1 -0
- package/dist/v2/patterns/DataGridToolbar.d.ts +81 -0
- package/dist/v2/patterns/DataGridToolbar.d.ts.map +1 -0
- package/dist/v2/patterns/DataGridToolbar.js +256 -0
- package/dist/v2/patterns/DataGridToolbar.js.map +1 -0
- package/dist/v2/patterns/DataGridVirtualized.d.ts +76 -0
- package/dist/v2/patterns/DataGridVirtualized.d.ts.map +1 -0
- package/dist/v2/patterns/DataGridVirtualized.js +528 -0
- package/dist/v2/patterns/DataGridVirtualized.js.map +1 -0
- package/dist/v2/patterns/DeleteResourceConfirmDialog.d.ts +46 -0
- package/dist/v2/patterns/DeleteResourceConfirmDialog.d.ts.map +1 -0
- package/dist/v2/patterns/DeleteResourceConfirmDialog.js +77 -0
- package/dist/v2/patterns/DeleteResourceConfirmDialog.js.map +1 -0
- package/dist/v2/patterns/FavoriteColumn.d.ts +72 -0
- package/dist/v2/patterns/FavoriteColumn.d.ts.map +1 -0
- package/dist/v2/patterns/FavoriteColumn.js +171 -0
- package/dist/v2/patterns/FavoriteColumn.js.map +1 -0
- package/dist/v2/patterns/FavoritesFilter.d.ts +51 -0
- package/dist/v2/patterns/FavoritesFilter.d.ts.map +1 -0
- package/dist/v2/patterns/FavoritesFilter.js +98 -0
- package/dist/v2/patterns/FavoritesFilter.js.map +1 -0
- package/dist/v2/patterns/FormErrorSummary.d.ts +39 -0
- package/dist/v2/patterns/FormErrorSummary.d.ts.map +1 -0
- package/dist/v2/patterns/FormErrorSummary.js +111 -0
- package/dist/v2/patterns/FormErrorSummary.js.map +1 -0
- package/dist/v2/patterns/FormPageShell.d.ts +55 -0
- package/dist/v2/patterns/FormPageShell.d.ts.map +1 -0
- package/dist/v2/patterns/FormPageShell.js +133 -0
- package/dist/v2/patterns/FormPageShell.js.map +1 -0
- package/dist/v2/patterns/FormSection.d.ts +64 -0
- package/dist/v2/patterns/FormSection.d.ts.map +1 -0
- package/dist/v2/patterns/FormSection.js +197 -0
- package/dist/v2/patterns/FormSection.js.map +1 -0
- package/dist/v2/patterns/FormikCheckboxGroup.d.ts +51 -0
- package/dist/v2/patterns/FormikCheckboxGroup.d.ts.map +1 -0
- package/dist/v2/patterns/FormikCheckboxGroup.js +117 -0
- package/dist/v2/patterns/FormikCheckboxGroup.js.map +1 -0
- package/dist/v2/patterns/FormikCombobox.d.ts +43 -0
- package/dist/v2/patterns/FormikCombobox.d.ts.map +1 -0
- package/dist/v2/patterns/FormikCombobox.js +121 -0
- package/dist/v2/patterns/FormikCombobox.js.map +1 -0
- package/dist/v2/patterns/FormikDatePicker.d.ts +115 -0
- package/dist/v2/patterns/FormikDatePicker.d.ts.map +1 -0
- package/dist/v2/patterns/FormikDatePicker.js +203 -0
- package/dist/v2/patterns/FormikDatePicker.js.map +1 -0
- package/dist/v2/patterns/FormikErrorFocus.d.ts +59 -0
- package/dist/v2/patterns/FormikErrorFocus.d.ts.map +1 -0
- package/dist/v2/patterns/FormikErrorFocus.js +83 -0
- package/dist/v2/patterns/FormikErrorFocus.js.map +1 -0
- package/dist/v2/patterns/FormikFile.d.ts +43 -0
- package/dist/v2/patterns/FormikFile.d.ts.map +1 -0
- package/dist/v2/patterns/FormikFile.js +156 -0
- package/dist/v2/patterns/FormikFile.js.map +1 -0
- package/dist/v2/patterns/FormikInput.d.ts +72 -0
- package/dist/v2/patterns/FormikInput.d.ts.map +1 -0
- package/dist/v2/patterns/FormikInput.js +135 -0
- package/dist/v2/patterns/FormikInput.js.map +1 -0
- package/dist/v2/patterns/FormikReferentielField.d.ts +33 -0
- package/dist/v2/patterns/FormikReferentielField.d.ts.map +1 -0
- package/dist/v2/patterns/FormikReferentielField.js +124 -0
- package/dist/v2/patterns/FormikReferentielField.js.map +1 -0
- package/dist/v2/patterns/FormikSelect.d.ts +61 -0
- package/dist/v2/patterns/FormikSelect.d.ts.map +1 -0
- package/dist/v2/patterns/FormikSelect.js +165 -0
- package/dist/v2/patterns/FormikSelect.js.map +1 -0
- package/dist/v2/patterns/FormikTextarea.d.ts +31 -0
- package/dist/v2/patterns/FormikTextarea.d.ts.map +1 -0
- package/dist/v2/patterns/FormikTextarea.js +84 -0
- package/dist/v2/patterns/FormikTextarea.js.map +1 -0
- package/dist/v2/patterns/KeyboardShortcutsHelp.d.ts +44 -0
- package/dist/v2/patterns/KeyboardShortcutsHelp.d.ts.map +1 -0
- package/dist/v2/patterns/KeyboardShortcutsHelp.js +203 -0
- package/dist/v2/patterns/KeyboardShortcutsHelp.js.map +1 -0
- package/dist/v2/patterns/NetworkErrorBanner.d.ts +26 -0
- package/dist/v2/patterns/NetworkErrorBanner.d.ts.map +1 -0
- package/dist/v2/patterns/NetworkErrorBanner.js +82 -0
- package/dist/v2/patterns/NetworkErrorBanner.js.map +1 -0
- package/dist/v2/patterns/PageContent.d.ts +40 -0
- package/dist/v2/patterns/PageContent.d.ts.map +1 -0
- package/dist/v2/patterns/PageContent.js +69 -0
- package/dist/v2/patterns/PageContent.js.map +1 -0
- package/dist/v2/patterns/ReferentielField.d.ts +118 -0
- package/dist/v2/patterns/ReferentielField.d.ts.map +1 -0
- package/dist/v2/patterns/ReferentielField.js +618 -0
- package/dist/v2/patterns/ReferentielField.js.map +1 -0
- package/dist/v2/patterns/SaveFilterDialog.d.ts +68 -0
- package/dist/v2/patterns/SaveFilterDialog.d.ts.map +1 -0
- package/dist/v2/patterns/SaveFilterDialog.js +204 -0
- package/dist/v2/patterns/SaveFilterDialog.js.map +1 -0
- package/dist/v2/patterns/SavedFiltersMenu.d.ts +74 -0
- package/dist/v2/patterns/SavedFiltersMenu.d.ts.map +1 -0
- package/dist/v2/patterns/SavedFiltersMenu.js +413 -0
- package/dist/v2/patterns/SavedFiltersMenu.js.map +1 -0
- package/dist/v2/patterns/SkeletonPageShell.d.ts +76 -0
- package/dist/v2/patterns/SkeletonPageShell.d.ts.map +1 -0
- package/dist/v2/patterns/SkeletonPageShell.js +347 -0
- package/dist/v2/patterns/SkeletonPageShell.js.map +1 -0
- package/dist/v2/patterns/SortableHeader.d.ts +47 -0
- package/dist/v2/patterns/SortableHeader.d.ts.map +1 -0
- package/dist/v2/patterns/SortableHeader.js +193 -0
- package/dist/v2/patterns/SortableHeader.js.map +1 -0
- package/dist/v2/patterns/Tour.d.ts +55 -0
- package/dist/v2/patterns/Tour.d.ts.map +1 -0
- package/dist/v2/patterns/Tour.js +474 -0
- package/dist/v2/patterns/Tour.js.map +1 -0
- package/dist/v2/patterns/_dataGridShared.d.ts +144 -0
- package/dist/v2/patterns/_dataGridShared.d.ts.map +1 -0
- package/dist/v2/patterns/_dataGridShared.js +440 -0
- package/dist/v2/patterns/_dataGridShared.js.map +1 -0
- package/dist/v2/patterns/_sort.d.ts +22 -0
- package/dist/v2/patterns/_sort.d.ts.map +1 -0
- package/dist/v2/patterns/_sort.js +118 -0
- package/dist/v2/patterns/_sort.js.map +1 -0
- package/dist/v2/patterns/_useColumnReorder.d.ts +69 -0
- package/dist/v2/patterns/_useColumnReorder.d.ts.map +1 -0
- package/dist/v2/patterns/_useColumnReorder.js +264 -0
- package/dist/v2/patterns/_useColumnReorder.js.map +1 -0
- package/dist/v2/patterns/_useColumnResize.d.ts +49 -0
- package/dist/v2/patterns/_useColumnResize.d.ts.map +1 -0
- package/dist/v2/patterns/_useColumnResize.js +198 -0
- package/dist/v2/patterns/_useColumnResize.js.map +1 -0
- package/dist/v2/patterns/index.d.ts +89 -0
- package/dist/v2/patterns/index.d.ts.map +1 -0
- package/dist/v2/patterns/index.js +246 -0
- package/dist/v2/patterns/index.js.map +1 -0
- package/dist/v2/personalization/PersonalizationProvider.d.ts +80 -0
- package/dist/v2/personalization/PersonalizationProvider.d.ts.map +1 -0
- package/dist/v2/personalization/PersonalizationProvider.js +177 -0
- package/dist/v2/personalization/PersonalizationProvider.js.map +1 -0
- package/dist/v2/personalization/adapters/_storageKey.d.ts +35 -0
- package/dist/v2/personalization/adapters/_storageKey.d.ts.map +1 -0
- package/dist/v2/personalization/adapters/_storageKey.js +69 -0
- package/dist/v2/personalization/adapters/_storageKey.js.map +1 -0
- package/dist/v2/personalization/adapters/createLocalStorageAdapter.d.ts +31 -0
- package/dist/v2/personalization/adapters/createLocalStorageAdapter.d.ts.map +1 -0
- package/dist/v2/personalization/adapters/createLocalStorageAdapter.js +128 -0
- package/dist/v2/personalization/adapters/createLocalStorageAdapter.js.map +1 -0
- package/dist/v2/personalization/adapters/createMemoryAdapter.d.ts +25 -0
- package/dist/v2/personalization/adapters/createMemoryAdapter.d.ts.map +1 -0
- package/dist/v2/personalization/adapters/createMemoryAdapter.js +76 -0
- package/dist/v2/personalization/adapters/createMemoryAdapter.js.map +1 -0
- package/dist/v2/personalization/adapters/index.d.ts +10 -0
- package/dist/v2/personalization/adapters/index.d.ts.map +1 -0
- package/dist/v2/personalization/adapters/index.js +21 -0
- package/dist/v2/personalization/adapters/index.js.map +1 -0
- package/dist/v2/personalization/capabilities/favorites.d.ts +53 -0
- package/dist/v2/personalization/capabilities/favorites.d.ts.map +1 -0
- package/dist/v2/personalization/capabilities/favorites.js +223 -0
- package/dist/v2/personalization/capabilities/favorites.js.map +1 -0
- package/dist/v2/personalization/capabilities/favoritesView.d.ts +58 -0
- package/dist/v2/personalization/capabilities/favoritesView.d.ts.map +1 -0
- package/dist/v2/personalization/capabilities/favoritesView.js +121 -0
- package/dist/v2/personalization/capabilities/favoritesView.js.map +1 -0
- package/dist/v2/personalization/capabilities/index.d.ts +16 -0
- package/dist/v2/personalization/capabilities/index.d.ts.map +1 -0
- package/dist/v2/personalization/capabilities/index.js +69 -0
- package/dist/v2/personalization/capabilities/index.js.map +1 -0
- package/dist/v2/personalization/capabilities/savedFilters.d.ts +61 -0
- package/dist/v2/personalization/capabilities/savedFilters.d.ts.map +1 -0
- package/dist/v2/personalization/capabilities/savedFilters.js +297 -0
- package/dist/v2/personalization/capabilities/savedFilters.js.map +1 -0
- package/dist/v2/personalization/createPersonalizationStore.d.ts +76 -0
- package/dist/v2/personalization/createPersonalizationStore.d.ts.map +1 -0
- package/dist/v2/personalization/createPersonalizationStore.js +475 -0
- package/dist/v2/personalization/createPersonalizationStore.js.map +1 -0
- package/dist/v2/personalization/index.d.ts +33 -0
- package/dist/v2/personalization/index.d.ts.map +1 -0
- package/dist/v2/personalization/index.js +111 -0
- package/dist/v2/personalization/index.js.map +1 -0
- package/dist/v2/personalization/personalizationContext.d.ts +78 -0
- package/dist/v2/personalization/personalizationContext.d.ts.map +1 -0
- package/dist/v2/personalization/personalizationContext.js +121 -0
- package/dist/v2/personalization/personalizationContext.js.map +1 -0
- package/dist/v2/personalization/schema.d.ts +60 -0
- package/dist/v2/personalization/schema.d.ts.map +1 -0
- package/dist/v2/personalization/schema.js +102 -0
- package/dist/v2/personalization/schema.js.map +1 -0
- package/dist/v2/personalization/types.d.ts +81 -0
- package/dist/v2/personalization/types.d.ts.map +1 -0
- package/dist/v2/personalization/types.js +6 -0
- package/dist/v2/personalization/types.js.map +1 -0
- package/dist/v2/referentiel/ReferentielProvider.d.ts +53 -0
- package/dist/v2/referentiel/ReferentielProvider.d.ts.map +1 -0
- package/dist/v2/referentiel/ReferentielProvider.js +94 -0
- package/dist/v2/referentiel/ReferentielProvider.js.map +1 -0
- package/dist/v2/referentiel/index.d.ts +18 -0
- package/dist/v2/referentiel/index.d.ts.map +1 -0
- package/dist/v2/referentiel/index.js +44 -0
- package/dist/v2/referentiel/index.js.map +1 -0
- package/dist/v2/referentiel/useReferentielClient.d.ts +15 -0
- package/dist/v2/referentiel/useReferentielClient.d.ts.map +1 -0
- package/dist/v2/referentiel/useReferentielClient.js +46 -0
- package/dist/v2/referentiel/useReferentielClient.js.map +1 -0
- package/dist/v2/referentiel/useReferentielOptions.d.ts +40 -0
- package/dist/v2/referentiel/useReferentielOptions.d.ts.map +1 -0
- package/dist/v2/referentiel/useReferentielOptions.js +177 -0
- package/dist/v2/referentiel/useReferentielOptions.js.map +1 -0
- package/dist/v2/referentiel/useReferentielSearch.d.ts +76 -0
- package/dist/v2/referentiel/useReferentielSearch.d.ts.map +1 -0
- package/dist/v2/referentiel/useReferentielSearch.js +140 -0
- package/dist/v2/referentiel/useReferentielSearch.js.map +1 -0
- package/dist/v2/styles/base.css +425 -0
- package/dist/v2/styles/css.d.ts +10 -0
- package/dist/v2/styles/index.d.ts +12 -0
- package/dist/v2/styles/index.d.ts.map +1 -0
- package/dist/v2/styles/index.js +4 -0
- package/dist/v2/styles/index.js.map +1 -0
- package/dist/v2/theme/_brand.d.ts +29 -0
- package/dist/v2/theme/_brand.d.ts.map +1 -0
- package/dist/v2/theme/_brand.js +69 -0
- package/dist/v2/theme/_brand.js.map +1 -0
- package/dist/v2/theme/_brandSecondary.d.ts +26 -0
- package/dist/v2/theme/_brandSecondary.d.ts.map +1 -0
- package/dist/v2/theme/_brandSecondary.js +65 -0
- package/dist/v2/theme/_brandSecondary.js.map +1 -0
- package/dist/v2/theme/createPortnetTheme.d.ts +75 -0
- package/dist/v2/theme/createPortnetTheme.d.ts.map +1 -0
- package/dist/v2/theme/createPortnetTheme.js +553 -0
- package/dist/v2/theme/createPortnetTheme.js.map +1 -0
- package/dist/v2/theme/cssVariables.d.ts +41 -0
- package/dist/v2/theme/cssVariables.d.ts.map +1 -0
- package/dist/v2/theme/cssVariables.js +205 -0
- package/dist/v2/theme/cssVariables.js.map +1 -0
- package/dist/v2/theme/index.d.ts +33 -0
- package/dist/v2/theme/index.d.ts.map +1 -0
- package/dist/v2/theme/index.js +60 -0
- package/dist/v2/theme/index.js.map +1 -0
- package/dist/v2/tokens/breakpoints.d.ts +74 -0
- package/dist/v2/tokens/breakpoints.d.ts.map +1 -0
- package/dist/v2/tokens/breakpoints.js +114 -0
- package/dist/v2/tokens/breakpoints.js.map +1 -0
- package/dist/v2/tokens/colors.d.ts +228 -0
- package/dist/v2/tokens/colors.d.ts.map +1 -0
- package/dist/v2/tokens/colors.js +225 -0
- package/dist/v2/tokens/colors.js.map +1 -0
- package/dist/v2/tokens/density.d.ts +142 -0
- package/dist/v2/tokens/density.d.ts.map +1 -0
- package/dist/v2/tokens/density.js +111 -0
- package/dist/v2/tokens/density.js.map +1 -0
- package/dist/v2/tokens/index.d.ts +556 -0
- package/dist/v2/tokens/index.d.ts.map +1 -0
- package/dist/v2/tokens/index.js +313 -0
- package/dist/v2/tokens/index.js.map +1 -0
- package/dist/v2/tokens/motion.d.ts +85 -0
- package/dist/v2/tokens/motion.d.ts.map +1 -0
- package/dist/v2/tokens/motion.js +94 -0
- package/dist/v2/tokens/motion.js.map +1 -0
- package/dist/v2/tokens/radius.d.ts +18 -0
- package/dist/v2/tokens/radius.d.ts.map +1 -0
- package/dist/v2/tokens/radius.js +28 -0
- package/dist/v2/tokens/radius.js.map +1 -0
- package/dist/v2/tokens/shadows.d.ts +25 -0
- package/dist/v2/tokens/shadows.d.ts.map +1 -0
- package/dist/v2/tokens/shadows.js +46 -0
- package/dist/v2/tokens/shadows.js.map +1 -0
- package/dist/v2/tokens/spacing.d.ts +38 -0
- package/dist/v2/tokens/spacing.d.ts.map +1 -0
- package/dist/v2/tokens/spacing.js +57 -0
- package/dist/v2/tokens/spacing.js.map +1 -0
- package/dist/v2/tokens/state.d.ts +40 -0
- package/dist/v2/tokens/state.d.ts.map +1 -0
- package/dist/v2/tokens/state.js +47 -0
- package/dist/v2/tokens/state.js.map +1 -0
- package/dist/v2/tokens/statusPalette.d.ts +54 -0
- package/dist/v2/tokens/statusPalette.d.ts.map +1 -0
- package/dist/v2/tokens/statusPalette.js +72 -0
- package/dist/v2/tokens/statusPalette.js.map +1 -0
- package/dist/v2/tokens/tokens.json +153 -0
- package/dist/v2/tokens/typography.d.ts +206 -0
- package/dist/v2/tokens/typography.d.ts.map +1 -0
- package/dist/v2/tokens/typography.js +155 -0
- package/dist/v2/tokens/typography.js.map +1 -0
- package/dist/v2/tokens/zIndex.d.ts +33 -0
- package/dist/v2/tokens/zIndex.d.ts.map +1 -0
- package/dist/v2/tokens/zIndex.js +50 -0
- package/dist/v2/tokens/zIndex.js.map +1 -0
- package/dist/v2/types/common.d.ts +24 -0
- package/dist/v2/types/common.d.ts.map +1 -0
- package/dist/v2/types/common.js +6 -0
- package/dist/v2/types/common.js.map +1 -0
- package/dist/v2/types/datagrid.d.ts +131 -0
- package/dist/v2/types/datagrid.d.ts.map +1 -0
- package/dist/v2/types/datagrid.js +6 -0
- package/dist/v2/types/datagrid.js.map +1 -0
- package/dist/v2/types/index.d.ts +11 -0
- package/dist/v2/types/index.d.ts.map +1 -0
- package/dist/v2/types/index.js +28 -0
- package/dist/v2/types/index.js.map +1 -0
- package/dist/v2/utils/apiError.d.ts +151 -0
- package/dist/v2/utils/apiError.d.ts.map +1 -0
- package/dist/v2/utils/apiError.js +290 -0
- package/dist/v2/utils/apiError.js.map +1 -0
- package/dist/v2/utils/contrast.d.ts +68 -0
- package/dist/v2/utils/contrast.d.ts.map +1 -0
- package/dist/v2/utils/contrast.js +167 -0
- package/dist/v2/utils/contrast.js.map +1 -0
- package/dist/v2/utils/cx.d.ts +9 -0
- package/dist/v2/utils/cx.d.ts.map +1 -0
- package/dist/v2/utils/cx.js +45 -0
- package/dist/v2/utils/cx.js.map +1 -0
- package/dist/v2/utils/fileDownload.d.ts +94 -0
- package/dist/v2/utils/fileDownload.d.ts.map +1 -0
- package/dist/v2/utils/fileDownload.js +236 -0
- package/dist/v2/utils/fileDownload.js.map +1 -0
- package/dist/v2/utils/fmtMoney.d.ts +28 -0
- package/dist/v2/utils/fmtMoney.d.ts.map +1 -0
- package/dist/v2/utils/fmtMoney.js +84 -0
- package/dist/v2/utils/fmtMoney.js.map +1 -0
- package/dist/v2/utils/index.d.ts +9 -0
- package/dist/v2/utils/index.d.ts.map +1 -0
- package/dist/v2/utils/index.js +97 -0
- package/dist/v2/utils/index.js.map +1 -0
- 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/dist/v2/utils/networkStatus.d.ts +88 -0
- package/dist/v2/utils/networkStatus.d.ts.map +1 -0
- package/dist/v2/utils/networkStatus.js +121 -0
- package/dist/v2/utils/networkStatus.js.map +1 -0
- package/package.json +198 -76
- package/dist/api/guideApi.js +0 -12
- package/dist/api/guideImageService.js +0 -119
- package/dist/api/reclamationApi.js +0 -119
- package/dist/assets/guides/FAQ.json +0 -118
- package/dist/assets/guides/index.js +0 -11
- package/dist/assets/images/tijariaLogo.ico +0 -0
- package/dist/components/buttons/PuiButton.js +0 -217
- package/dist/components/buttons/PuiIconButton.js +0 -98
- package/dist/components/common/PuiAlertContext.js +0 -12
- package/dist/components/common/PuiHelpWidgetContext.js +0 -17
- package/dist/components/common/StyledMuiButton.js +0 -48
- package/dist/components/common/StyledMuiTextField.js +0 -180
- package/dist/components/inputs/PuiAutocomplete.js +0 -352
- package/dist/components/inputs/PuiCheckbox.js +0 -308
- package/dist/components/inputs/PuiCheckboxGroup.js +0 -215
- package/dist/components/inputs/PuiCheckboxItem.js +0 -162
- package/dist/components/inputs/PuiDateField.js +0 -280
- package/dist/components/inputs/PuiDateTimeField.js +0 -276
- package/dist/components/inputs/PuiFileField.js +0 -265
- package/dist/components/inputs/PuiRadioGroup.js +0 -197
- package/dist/components/inputs/PuiRadioItem.js +0 -100
- package/dist/components/inputs/PuiSelect.js +0 -427
- package/dist/components/inputs/PuiTextField.js +0 -263
- package/dist/components/others/PuiBadge.js +0 -58
- package/dist/components/others/PuiChip.js +0 -150
- package/dist/components/others/PuiDialog.js +0 -102
- package/dist/components/others/PuiFormikForm.js +0 -70
- package/dist/components/others/PuiGrid.js +0 -23
- package/dist/components/others/PuiIcon.js +0 -92
- package/dist/components/others/PuiLoadingBackdrop.js +0 -32
- package/dist/components/others/PuiMainContainer.js +0 -41
- package/dist/components/others/PuiNavigation.js +0 -68
- package/dist/components/others/PuiSection.js +0 -187
- package/dist/components/others/PuiTooltip.js +0 -86
- package/dist/components/providers/PuiAlertProvider.js +0 -134
- package/dist/components/providers/PuiHelpWidgetProvider.js +0 -91
- package/dist/components/providers/PuiLocalizationProvider.js +0 -34
- package/dist/components/referentiel/common/ReferetielContext.js +0 -12
- package/dist/components/referentiel/common/constants/specificReferentielsApis.js +0 -22
- package/dist/components/referentiel/common/constants/specificReferentielsBaseColumns.js +0 -691
- package/dist/components/referentiel/common/constants/specificReferentielsBaseFilters.js +0 -598
- package/dist/components/referentiel/common/constants/specificReferentielsInitialValues.js +0 -80
- package/dist/components/referentiel/common/constants/specificReferentielsKeys.js +0 -18
- package/dist/components/referentiel/common/constants/specificReferentielsTitles.js +0 -22
- package/dist/components/referentiel/common/constants/specificReferentielsValidationSchemas.js +0 -85
- package/dist/components/referentiel/components/PuiBasePopupReferentielField.js +0 -356
- package/dist/components/referentiel/components/PuiCustomPopupReferentielField.js +0 -181
- package/dist/components/referentiel/components/PuiSimplePopupReferentielField.js +0 -325
- package/dist/components/referentiel/components/PuiSimpleReferentielField.js +0 -203
- package/dist/components/referentiel/components/PuiSpecificReferentielField.js +0 -352
- package/dist/components/referentiel/providers/PuiReferentielProvider.js +0 -66
- package/dist/components/tab/PuiTab.js +0 -25
- package/dist/components/tab/PuiTabs.js +0 -148
- package/dist/components/table/PuiTable.js +0 -643
- package/dist/components/table/PuiTableAction.js +0 -75
- package/dist/components/typography/PuiDefinition.js +0 -42
- package/dist/components/typography/PuiIndication.js +0 -80
- package/dist/components/typography/PuiMainTitle.js +0 -144
- package/dist/components/ui/dialogs/PuiSearchDialog.js +0 -106
- package/dist/components/ui/pages/errors/PuiErrorBasePage.js +0 -73
- package/dist/components/ui/pages/errors/PuiForbiddenErrorPage.js +0 -36
- package/dist/components/ui/pages/errors/PuiNetworkErrorPage.js +0 -36
- package/dist/components/ui/pages/errors/PuiNotFoundErrorPage.js +0 -30
- package/dist/components/ui/pages/errors/PuiServerErrorPage.js +0 -37
- package/dist/components/ui/pages/general/PuiDefaultPage.js +0 -68
- package/dist/components/ui/pages/general/PuiSearchPage.js +0 -203
- package/dist/components/widgets/GuideImage.js +0 -251
- package/dist/components/widgets/PuiHelpWidget.js +0 -4276
- package/dist/config/apperance.js +0 -26
- package/dist/config/mapping.js +0 -26
- package/dist/config/referentiel.js +0 -10
- package/dist/general/yupValidationErrors.js +0 -8
- package/dist/hooks/useAlert.js +0 -19
- package/dist/hooks/useAxios.js +0 -23
- package/dist/hooks/useQuery.js +0 -21
- package/dist/hooks/useReclamation.js +0 -116
- package/dist/styles/ReclamationFormModal.css +0 -629
- package/dist/styles/help-widget.css +0 -621
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { useSyncExternalStore } from "react";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* useDensity — Portnet UI v2
|
|
5
|
+
*
|
|
6
|
+
* Reads / writes the user's density preference (charter R-DG.11).
|
|
7
|
+
* Applies it as `data-density` on <html> so all density-aware
|
|
8
|
+
* tokens cascade.
|
|
9
|
+
*
|
|
10
|
+
* const [density, setDensity] = useDensity();
|
|
11
|
+
* <button onClick={() => setDensity(density === "compact" ? "comfortable" : "compact")} />
|
|
12
|
+
*
|
|
13
|
+
* Synchronisation guarantees
|
|
14
|
+
* - Multi-instance same-tab: every useDensity() consumer sees
|
|
15
|
+
* the same value at all times. Implemented via a module-level
|
|
16
|
+
* subscriber set fed by useSyncExternalStore.
|
|
17
|
+
* - Cross-tab: a `storage` event listener at module load
|
|
18
|
+
* propagates updates from sibling tabs sharing the origin.
|
|
19
|
+
* - SSR-safe: server snapshot returns the DEFAULT; all DOM and
|
|
20
|
+
* storage interactions are guarded.
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
var STORAGE_KEY = "portnet-ui-density";
|
|
24
|
+
var DEFAULT = "comfortable";
|
|
25
|
+
var VALID = Object.freeze(["comfortable", "compact"]);
|
|
26
|
+
var VALID_SET = new Set(VALID);
|
|
27
|
+
function isDensityPref(v) {
|
|
28
|
+
return typeof v === "string" && VALID_SET.has(v);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/* ── Module-level store ───────────────────────────────── */
|
|
32
|
+
|
|
33
|
+
/** Source of truth. Lazy-read from storage at module load on the client. */
|
|
34
|
+
var memoryValue = readInitialValue();
|
|
35
|
+
|
|
36
|
+
/** Active hook subscribers — notified on every value change. */
|
|
37
|
+
var subscribers = new Set();
|
|
38
|
+
function readInitialValue() {
|
|
39
|
+
if (typeof window === "undefined") return DEFAULT;
|
|
40
|
+
try {
|
|
41
|
+
var raw = window.localStorage.getItem(STORAGE_KEY);
|
|
42
|
+
return isDensityPref(raw) ? raw : DEFAULT;
|
|
43
|
+
} catch (_unused) {
|
|
44
|
+
return DEFAULT;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
function applyToDom(value) {
|
|
48
|
+
if (typeof document === "undefined") return;
|
|
49
|
+
document.documentElement.dataset["density"] = value;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/** Apply the initial value to the DOM at module load (client-side). */
|
|
53
|
+
applyToDom(memoryValue);
|
|
54
|
+
|
|
55
|
+
/* Cross-tab sync. The `storage` event fires in OTHER tabs only —
|
|
56
|
+
* the writing tab is informed via the in-memory subscribers path. */
|
|
57
|
+
if (typeof window !== "undefined") {
|
|
58
|
+
window.addEventListener("storage", function (e) {
|
|
59
|
+
if (e.key !== STORAGE_KEY) return;
|
|
60
|
+
if (!isDensityPref(e.newValue)) return;
|
|
61
|
+
if (e.newValue === memoryValue) return;
|
|
62
|
+
memoryValue = e.newValue;
|
|
63
|
+
applyToDom(memoryValue);
|
|
64
|
+
// No storage write here — the originating tab already wrote.
|
|
65
|
+
notify();
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
function notify() {
|
|
69
|
+
// Iterate a snapshot — a subscriber that unmounts during notify
|
|
70
|
+
// would otherwise mutate the Set under iteration.
|
|
71
|
+
for (var _i = 0, _Array$from = Array.from(subscribers); _i < _Array$from.length; _i++) {
|
|
72
|
+
var cb = _Array$from[_i];
|
|
73
|
+
cb();
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
function subscribe(callback) {
|
|
77
|
+
subscribers.add(callback);
|
|
78
|
+
return function () {
|
|
79
|
+
return subscribers["delete"](callback);
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
function getSnapshot() {
|
|
83
|
+
return memoryValue;
|
|
84
|
+
}
|
|
85
|
+
function getServerSnapshot() {
|
|
86
|
+
return DEFAULT;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/* ── Setter (module-level so identity is stable across renders) ── */
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Set the density preference. Ignores invalid values silently
|
|
93
|
+
* (consumer-supplied data sanitation is not this hook's job) and
|
|
94
|
+
* short-circuits when the value is unchanged.
|
|
95
|
+
*/
|
|
96
|
+
function setDensityValue(value) {
|
|
97
|
+
if (!VALID_SET.has(value)) return;
|
|
98
|
+
if (value === memoryValue) return;
|
|
99
|
+
memoryValue = value;
|
|
100
|
+
applyToDom(value);
|
|
101
|
+
if (typeof window !== "undefined") {
|
|
102
|
+
try {
|
|
103
|
+
window.localStorage.setItem(STORAGE_KEY, value);
|
|
104
|
+
} catch (err) {
|
|
105
|
+
// Quota, private mode, or sandboxed iframe — preference is
|
|
106
|
+
// applied for this session but won't persist. Surface in dev.
|
|
107
|
+
if (typeof console !== "undefined" && console.warn) {
|
|
108
|
+
// eslint-disable-next-line no-console
|
|
109
|
+
console.warn("[@portnet/ui v2] useDensity: localStorage write failed", err);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
notify();
|
|
114
|
+
}
|
|
115
|
+
export default function useDensity() {
|
|
116
|
+
var density = useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);
|
|
117
|
+
return [density, setDensityValue];
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=useDensity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useDensity.js","names":["useSyncExternalStore","STORAGE_KEY","DEFAULT","VALID","Object","freeze","VALID_SET","Set","isDensityPref","v","has","memoryValue","readInitialValue","subscribers","window","raw","localStorage","getItem","_unused","applyToDom","value","document","documentElement","dataset","addEventListener","e","key","newValue","notify","_i","_Array$from","Array","from","length","cb","subscribe","callback","add","getSnapshot","getServerSnapshot","setDensityValue","setItem","err","console","warn","useDensity","density"],"sources":["../../../../src/lib/v2/hooks/useDensity.ts"],"sourcesContent":["import { useSyncExternalStore } from \"react\";\r\n\r\n/**\r\n * useDensity — Portnet UI v2\r\n *\r\n * Reads / writes the user's density preference (charter R-DG.11).\r\n * Applies it as `data-density` on <html> so all density-aware\r\n * tokens cascade.\r\n *\r\n * const [density, setDensity] = useDensity();\r\n * <button onClick={() => setDensity(density === \"compact\" ? \"comfortable\" : \"compact\")} />\r\n *\r\n * Synchronisation guarantees\r\n * - Multi-instance same-tab: every useDensity() consumer sees\r\n * the same value at all times. Implemented via a module-level\r\n * subscriber set fed by useSyncExternalStore.\r\n * - Cross-tab: a `storage` event listener at module load\r\n * propagates updates from sibling tabs sharing the origin.\r\n * - SSR-safe: server snapshot returns the DEFAULT; all DOM and\r\n * storage interactions are guarded.\r\n */\r\n\r\ntype DensityPref = \"comfortable\" | \"compact\";\r\n\r\nconst STORAGE_KEY = \"portnet-ui-density\";\r\nconst DEFAULT: DensityPref = \"comfortable\";\r\nconst VALID = Object.freeze([\"comfortable\", \"compact\"]);\r\nconst VALID_SET = new Set<string>(VALID);\r\n\r\nfunction isDensityPref(v: unknown): v is DensityPref {\r\n return typeof v === \"string\" && VALID_SET.has(v);\r\n}\r\n\r\n/* ── Module-level store ───────────────────────────────── */\r\n\r\n/** Source of truth. Lazy-read from storage at module load on the client. */\r\nlet memoryValue: DensityPref = readInitialValue();\r\n\r\n/** Active hook subscribers — notified on every value change. */\r\nconst subscribers = new Set<() => void>();\r\n\r\nfunction readInitialValue(): DensityPref {\r\n if (typeof window === \"undefined\") return DEFAULT;\r\n try {\r\n const raw = window.localStorage.getItem(STORAGE_KEY);\r\n return isDensityPref(raw) ? raw : DEFAULT;\r\n } catch {\r\n return DEFAULT;\r\n }\r\n}\r\n\r\nfunction applyToDom(value: DensityPref): void {\r\n if (typeof document === \"undefined\") return;\r\n document.documentElement.dataset[\"density\"] = value;\r\n}\r\n\r\n/** Apply the initial value to the DOM at module load (client-side). */\r\napplyToDom(memoryValue);\r\n\r\n/* Cross-tab sync. The `storage` event fires in OTHER tabs only —\r\n * the writing tab is informed via the in-memory subscribers path. */\r\nif (typeof window !== \"undefined\") {\r\n window.addEventListener(\"storage\", (e) => {\r\n if (e.key !== STORAGE_KEY) return;\r\n if (!isDensityPref(e.newValue)) return;\r\n if (e.newValue === memoryValue) return;\r\n memoryValue = e.newValue;\r\n applyToDom(memoryValue);\r\n // No storage write here — the originating tab already wrote.\r\n notify();\r\n });\r\n}\r\n\r\nfunction notify(): void {\r\n // Iterate a snapshot — a subscriber that unmounts during notify\r\n // would otherwise mutate the Set under iteration.\r\n for (const cb of Array.from(subscribers)) cb();\r\n}\r\n\r\nfunction subscribe(callback: () => void): () => void {\r\n subscribers.add(callback);\r\n return () => subscribers.delete(callback);\r\n}\r\n\r\nfunction getSnapshot(): DensityPref {\r\n return memoryValue;\r\n}\r\n\r\nfunction getServerSnapshot(): DensityPref {\r\n return DEFAULT;\r\n}\r\n\r\n/* ── Setter (module-level so identity is stable across renders) ── */\r\n\r\n/**\r\n * Set the density preference. Ignores invalid values silently\r\n * (consumer-supplied data sanitation is not this hook's job) and\r\n * short-circuits when the value is unchanged.\r\n */\r\nfunction setDensityValue(value: DensityPref): void {\r\n if (!VALID_SET.has(value)) return;\r\n if (value === memoryValue) return;\r\n memoryValue = value;\r\n applyToDom(value);\r\n if (typeof window !== \"undefined\") {\r\n try {\r\n window.localStorage.setItem(STORAGE_KEY, value);\r\n } catch (err) {\r\n // Quota, private mode, or sandboxed iframe — preference is\r\n // applied for this session but won't persist. Surface in dev.\r\n if (typeof console !== \"undefined\" && console.warn) {\r\n // eslint-disable-next-line no-console\r\n console.warn(\"[@portnet/ui v2] useDensity: localStorage write failed\", err);\r\n }\r\n }\r\n }\r\n notify();\r\n}\r\n\r\nexport default function useDensity(): [DensityPref, (value: DensityPref) => void] {\r\n const density = useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);\r\n return [density, setDensityValue];\r\n}\r\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
import { useEffect, useRef } from "react";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* useFocusFirstError — Portnet UI v2
|
|
5
|
+
*
|
|
6
|
+
* Charter §05.3 R-F.3 MUST — "Submit form échoué → focus sur premier champ
|
|
7
|
+
* en erreur". Charter §04.1 R-FV.3 MUST — "Scroll auto vers premier champ
|
|
8
|
+
* en erreur + focus". Both are the same behaviour; this is it, once.
|
|
9
|
+
*
|
|
10
|
+
* Formik-FREE on purpose, exactly like useFormAutoSave: the caller passes
|
|
11
|
+
* `errors`, `submitCount` and the rendered field order as plain values.
|
|
12
|
+
* Formik coupling belongs in patterns/ — use <FormikErrorFocus /> when the
|
|
13
|
+
* form is a Formik form and this hook directly when it is not (a manual
|
|
14
|
+
* "Ajouter" guard, a non-Formik dropzone section, a reducer-driven form).
|
|
15
|
+
*
|
|
16
|
+
* // Formik form — prefer the pattern, which wires this for you:
|
|
17
|
+
* <FormikErrorFocus order={["numeroFacture", "fournisseur", "dateFacture"]} />
|
|
18
|
+
*
|
|
19
|
+
* // Manual guard — call the imperative helper directly:
|
|
20
|
+
* const missing = requiredFields.filter((f) => !f.value);
|
|
21
|
+
* if (missing.length > 0) {
|
|
22
|
+
* missing.forEach((f) => setFieldError(f.name, REQUIRED));
|
|
23
|
+
* focusFieldByName(missing[0].name);
|
|
24
|
+
* return;
|
|
25
|
+
* }
|
|
26
|
+
*
|
|
27
|
+
* ── WHY THE `[id=]` LOOKUP COMES FIRST ──────────────────────────────
|
|
28
|
+
*
|
|
29
|
+
* Hosts have consistently written `[name="<field>"]`, which is wrong for
|
|
30
|
+
* most v2 fields. The Formik bridges wrap their control in Field, which
|
|
31
|
+
* does `htmlFor={htmlFor || name}` and then
|
|
32
|
+
* `cloneElement(child, { id: inputId })` — so the field NAME is published
|
|
33
|
+
* as the control's `id`, and whether it also appears as `name` depends
|
|
34
|
+
* entirely on which primitive is underneath. It does for Input/Textarea.
|
|
35
|
+
* It does not for Select, Combobox, DatePicker or ReferentielField.
|
|
36
|
+
*
|
|
37
|
+
* A `[name=]`-only selector therefore fails precisely on the compound
|
|
38
|
+
* fields, silently — the call runs, matches nothing, and the form reads as
|
|
39
|
+
* compliant. `[id=]` is guaranteed by the Field contract for every bridge,
|
|
40
|
+
* so it is tried first; `[name=]` and `[data-field=]` remain as fallbacks
|
|
41
|
+
* for hand-rolled controls that never went through Field.
|
|
42
|
+
*
|
|
43
|
+
* ── WHAT THIS DELIBERATELY DOES NOT DO ──────────────────────────────
|
|
44
|
+
*
|
|
45
|
+
* It does not focus a control it cannot see. A field inside a collapsed
|
|
46
|
+
* <details> (Accordion.Item) or a display:none branch has no client rects,
|
|
47
|
+
* and focusing it would scroll the page to an invisible target and strand
|
|
48
|
+
* the user with no visible focus ring. `focusFieldByName` returns false in
|
|
49
|
+
* that case and dev-warns rather than guessing — the inline error
|
|
50
|
+
* (role="alert" via Field) still carries the message, and R-FV.2's summary
|
|
51
|
+
* banner (FormErrorSummary) is the right affordance for reaching a field
|
|
52
|
+
* in a closed section.
|
|
53
|
+
*
|
|
54
|
+
* It also does not announce anything. Field already renders its error with
|
|
55
|
+
* role="alert"; a second live region would double-announce.
|
|
56
|
+
*/
|
|
57
|
+
|
|
58
|
+
/** Options for the imperative helper. */
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Focusable descendants, for the case where the resolved element is a
|
|
62
|
+
* wrapper rather than the control itself. Excludes tabindex="-1", which is
|
|
63
|
+
* programmatically focusable but deliberately out of the tab order — landing
|
|
64
|
+
* there would put the user somewhere Tab cannot return to.
|
|
65
|
+
*/
|
|
66
|
+
var FOCUSABLE_WITHIN = 'input,select,textarea,button,[href],[tabindex]:not([tabindex="-1"])';
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Escape a value for use inside an attribute selector.
|
|
70
|
+
*
|
|
71
|
+
* CSS.escape where available, with a manual quote/backslash escape as the
|
|
72
|
+
* fallback — same guard shape DataGrid uses for its reorder-grip lookup.
|
|
73
|
+
* Field names are developer-authored, so this is robustness rather than a
|
|
74
|
+
* sanitisation boundary.
|
|
75
|
+
*/
|
|
76
|
+
function escapeAttributeValue(value) {
|
|
77
|
+
if (typeof window !== "undefined" && window.CSS && typeof window.CSS.escape === "function") {
|
|
78
|
+
return window.CSS.escape(value);
|
|
79
|
+
}
|
|
80
|
+
return value.replace(/["\\]/g, "\\$&");
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Is this element something a user can actually be sent to?
|
|
85
|
+
*
|
|
86
|
+
* `getClientRects().length === 0` is what excludes a field inside a
|
|
87
|
+
* collapsed <details> or a display:none branch. offsetParent alone is not
|
|
88
|
+
* enough — it is also null for position:fixed elements, which are visible.
|
|
89
|
+
*/
|
|
90
|
+
function isFocusableNow(el) {
|
|
91
|
+
if (!(el instanceof HTMLElement)) return false;
|
|
92
|
+
if (el.hasAttribute("disabled")) return false;
|
|
93
|
+
if (el.getAttribute("aria-hidden") === "true") return false;
|
|
94
|
+
if (el.getClientRects().length === 0) return false;
|
|
95
|
+
return true;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Focus the control registered under `name`, resolving it the way the v2
|
|
100
|
+
* Field contract publishes it.
|
|
101
|
+
*
|
|
102
|
+
* @returns true when a visible, enabled control was focused. False means
|
|
103
|
+
* nothing matched, or the match was hidden or disabled — the
|
|
104
|
+
* caller should keep its inline error and, ideally, render
|
|
105
|
+
* FormErrorSummary so the field is still reachable.
|
|
106
|
+
*/
|
|
107
|
+
export function focusFieldByName(name) {
|
|
108
|
+
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
109
|
+
if (typeof document === "undefined") return false;
|
|
110
|
+
if (!name) return false;
|
|
111
|
+
var escaped = escapeAttributeValue(name);
|
|
112
|
+
|
|
113
|
+
/* Order matters — see the `[id=]` note in the module docstring. */
|
|
114
|
+
var selectors = ["[id=\"".concat(escaped, "\"]"), "[name=\"".concat(escaped, "\"]"), "[data-field=\"".concat(escaped, "\"]")];
|
|
115
|
+
for (var _i = 0, _selectors = selectors; _i < _selectors.length; _i++) {
|
|
116
|
+
var selector = _selectors[_i];
|
|
117
|
+
var host = null;
|
|
118
|
+
try {
|
|
119
|
+
host = document.querySelector(selector);
|
|
120
|
+
} catch (_unused) {
|
|
121
|
+
/* Malformed selector — try the next shape rather than throwing into
|
|
122
|
+
the caller's validation branch. */
|
|
123
|
+
host = null;
|
|
124
|
+
}
|
|
125
|
+
if (host === null) continue;
|
|
126
|
+
var target = isFocusableNow(host) ? host : host.querySelector(FOCUSABLE_WITHIN);
|
|
127
|
+
if (!isFocusableNow(target)) continue;
|
|
128
|
+
if (options.scroll !== false) {
|
|
129
|
+
try {
|
|
130
|
+
target.scrollIntoView({
|
|
131
|
+
block: "center",
|
|
132
|
+
behavior: "auto"
|
|
133
|
+
});
|
|
134
|
+
} catch (_unused2) {
|
|
135
|
+
/* jsdom and older Safari lack the options overload. Focus below
|
|
136
|
+
still scrolls the control into view natively. */
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
target.focus();
|
|
140
|
+
return true;
|
|
141
|
+
}
|
|
142
|
+
return false;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Move focus to the first field in error after each failed submit.
|
|
147
|
+
*
|
|
148
|
+
* Fires when `submitCount` increases AND an error is present. The two
|
|
149
|
+
* conditions are separate on purpose: Formik increments submitCount before
|
|
150
|
+
* async validation resolves, so on the render where the counter changes
|
|
151
|
+
* `errors` can still be empty. Marking the attempt handled only once an
|
|
152
|
+
* error is actually found lets the effect re-run when the errors land,
|
|
153
|
+
* without re-firing for the same attempt afterwards.
|
|
154
|
+
*/
|
|
155
|
+
export default function useFocusFirstError(_ref) {
|
|
156
|
+
var errors = _ref.errors,
|
|
157
|
+
order = _ref.order,
|
|
158
|
+
_ref$submitCount = _ref.submitCount,
|
|
159
|
+
submitCount = _ref$submitCount === void 0 ? 0 : _ref$submitCount,
|
|
160
|
+
_ref$enabled = _ref.enabled,
|
|
161
|
+
enabled = _ref$enabled === void 0 ? true : _ref$enabled,
|
|
162
|
+
_ref$scroll = _ref.scroll,
|
|
163
|
+
scroll = _ref$scroll === void 0 ? true : _ref$scroll;
|
|
164
|
+
/** Highest submitCount already acted on. */
|
|
165
|
+
var handledRef = useRef(0);
|
|
166
|
+
useEffect(function () {
|
|
167
|
+
if (!enabled) return undefined;
|
|
168
|
+
if (submitCount <= handledRef.current) return undefined;
|
|
169
|
+
if (!errors) return undefined;
|
|
170
|
+
var names = order !== undefined && order.length > 0 ? order : Object.keys(errors);
|
|
171
|
+
var first = names.find(function (name) {
|
|
172
|
+
return Boolean(errors[name]);
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
/* No error yet: either validation is still in flight for this attempt,
|
|
176
|
+
or it passed. Leave handledRef alone so a later errors update for the
|
|
177
|
+
SAME attempt is still honoured. */
|
|
178
|
+
if (first === undefined) return undefined;
|
|
179
|
+
handledRef.current = submitCount;
|
|
180
|
+
|
|
181
|
+
/* One frame, so the inline errors have rendered and the target exists
|
|
182
|
+
and is measurable before it is focused and scrolled to. */
|
|
183
|
+
var frame = requestAnimationFrame(function () {
|
|
184
|
+
var focused = focusFieldByName(first, {
|
|
185
|
+
scroll: scroll
|
|
186
|
+
});
|
|
187
|
+
if (!focused && process.env["NODE_ENV"] !== "production") {
|
|
188
|
+
// eslint-disable-next-line no-console
|
|
189
|
+
console.warn("[v2.useFocusFirstError] Could not focus \"".concat(first, "\" \u2014 no visible, ") + "enabled control matched [id], [name] or [data-field]. Either the " + "field is in a collapsed section, or its control does not publish " + "the field name (a hand-rolled control that skips Field). R-F.3 is " + "NOT satisfied for this field; render FormErrorSummary (R-FV.2) so " + "it stays reachable.");
|
|
190
|
+
}
|
|
191
|
+
});
|
|
192
|
+
return function () {
|
|
193
|
+
return cancelAnimationFrame(frame);
|
|
194
|
+
};
|
|
195
|
+
}, [errors, order, submitCount, enabled, scroll]);
|
|
196
|
+
}
|
|
197
|
+
//# sourceMappingURL=useFocusFirstError.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useFocusFirstError.js","names":["useEffect","useRef","FOCUSABLE_WITHIN","escapeAttributeValue","value","window","CSS","escape","replace","isFocusableNow","el","HTMLElement","hasAttribute","getAttribute","getClientRects","length","focusFieldByName","name","options","arguments","undefined","document","escaped","selectors","concat","_i","_selectors","selector","host","querySelector","_unused","target","scroll","scrollIntoView","block","behavior","_unused2","focus","useFocusFirstError","_ref","errors","order","_ref$submitCount","submitCount","_ref$enabled","enabled","_ref$scroll","handledRef","current","names","Object","keys","first","find","Boolean","frame","requestAnimationFrame","focused","process","env","console","warn","cancelAnimationFrame"],"sources":["../../../../src/lib/v2/hooks/useFocusFirstError.ts"],"sourcesContent":["import { useEffect, useRef } from \"react\";\r\n\r\n/**\r\n * useFocusFirstError — Portnet UI v2\r\n *\r\n * Charter §05.3 R-F.3 MUST — \"Submit form échoué → focus sur premier champ\r\n * en erreur\". Charter §04.1 R-FV.3 MUST — \"Scroll auto vers premier champ\r\n * en erreur + focus\". Both are the same behaviour; this is it, once.\r\n *\r\n * Formik-FREE on purpose, exactly like useFormAutoSave: the caller passes\r\n * `errors`, `submitCount` and the rendered field order as plain values.\r\n * Formik coupling belongs in patterns/ — use <FormikErrorFocus /> when the\r\n * form is a Formik form and this hook directly when it is not (a manual\r\n * \"Ajouter\" guard, a non-Formik dropzone section, a reducer-driven form).\r\n *\r\n * // Formik form — prefer the pattern, which wires this for you:\r\n * <FormikErrorFocus order={[\"numeroFacture\", \"fournisseur\", \"dateFacture\"]} />\r\n *\r\n * // Manual guard — call the imperative helper directly:\r\n * const missing = requiredFields.filter((f) => !f.value);\r\n * if (missing.length > 0) {\r\n * missing.forEach((f) => setFieldError(f.name, REQUIRED));\r\n * focusFieldByName(missing[0].name);\r\n * return;\r\n * }\r\n *\r\n * ── WHY THE `[id=]` LOOKUP COMES FIRST ──────────────────────────────\r\n *\r\n * Hosts have consistently written `[name=\"<field>\"]`, which is wrong for\r\n * most v2 fields. The Formik bridges wrap their control in Field, which\r\n * does `htmlFor={htmlFor || name}` and then\r\n * `cloneElement(child, { id: inputId })` — so the field NAME is published\r\n * as the control's `id`, and whether it also appears as `name` depends\r\n * entirely on which primitive is underneath. It does for Input/Textarea.\r\n * It does not for Select, Combobox, DatePicker or ReferentielField.\r\n *\r\n * A `[name=]`-only selector therefore fails precisely on the compound\r\n * fields, silently — the call runs, matches nothing, and the form reads as\r\n * compliant. `[id=]` is guaranteed by the Field contract for every bridge,\r\n * so it is tried first; `[name=]` and `[data-field=]` remain as fallbacks\r\n * for hand-rolled controls that never went through Field.\r\n *\r\n * ── WHAT THIS DELIBERATELY DOES NOT DO ──────────────────────────────\r\n *\r\n * It does not focus a control it cannot see. A field inside a collapsed\r\n * <details> (Accordion.Item) or a display:none branch has no client rects,\r\n * and focusing it would scroll the page to an invisible target and strand\r\n * the user with no visible focus ring. `focusFieldByName` returns false in\r\n * that case and dev-warns rather than guessing — the inline error\r\n * (role=\"alert\" via Field) still carries the message, and R-FV.2's summary\r\n * banner (FormErrorSummary) is the right affordance for reaching a field\r\n * in a closed section.\r\n *\r\n * It also does not announce anything. Field already renders its error with\r\n * role=\"alert\"; a second live region would double-announce.\r\n */\r\n\r\n/** Options for the imperative helper. */\r\nexport type FocusFieldOptions = {\r\n /**\r\n * Scroll the resolved control into view before focusing.\r\n *\r\n * `behavior: \"auto\"` always — never \"smooth\". R-Tg.2 caps animation at\r\n * 0.01 ms under prefers-reduced-motion, and a smooth scroll triggered by\r\n * a failed submit is exactly the motion that rule exists to suppress.\r\n *\r\n * @default true\r\n */\r\n scroll?: boolean | undefined;\r\n};\r\n\r\nexport type UseFocusFirstErrorOptions = {\r\n /**\r\n * Field name -> error. Formik's `errors` satisfies this directly.\r\n *\r\n * Only truthiness is read, so any error shape works (string, node,\r\n * nested object).\r\n */\r\n errors?: Readonly<Record<string, unknown>> | undefined;\r\n /**\r\n * Field names in RENDERED order — top-to-bottom as the user sees them.\r\n *\r\n * SUPPLY THIS. Without it the order falls back to `Object.keys(errors)`,\r\n * which is the order the validator happened to write its keys in and has\r\n * no relationship to the layout; \"first field in error\" then means\r\n * \"whichever field Yup reached first\", which can be the last one on\r\n * screen.\r\n */\r\n order?: readonly string[] | undefined;\r\n /**\r\n * Submit attempt counter. Formik's `submitCount`.\r\n *\r\n * This is the TRIGGER: focus moves when it increases, never on an\r\n * ordinary re-render. Without it a persisting error would re-steal focus\r\n * every time the component re-rendered, which is worse than not moving\r\n * focus at all.\r\n */\r\n submitCount?: number | undefined;\r\n /** @default true */\r\n enabled?: boolean | undefined;\r\n /** @default true */\r\n scroll?: boolean | undefined;\r\n};\r\n\r\n/**\r\n * Focusable descendants, for the case where the resolved element is a\r\n * wrapper rather than the control itself. Excludes tabindex=\"-1\", which is\r\n * programmatically focusable but deliberately out of the tab order — landing\r\n * there would put the user somewhere Tab cannot return to.\r\n */\r\nconst FOCUSABLE_WITHIN =\r\n 'input,select,textarea,button,[href],[tabindex]:not([tabindex=\"-1\"])';\r\n\r\n/**\r\n * Escape a value for use inside an attribute selector.\r\n *\r\n * CSS.escape where available, with a manual quote/backslash escape as the\r\n * fallback — same guard shape DataGrid uses for its reorder-grip lookup.\r\n * Field names are developer-authored, so this is robustness rather than a\r\n * sanitisation boundary.\r\n */\r\nfunction escapeAttributeValue(value: string): string {\r\n if (\r\n typeof window !== \"undefined\" &&\r\n window.CSS &&\r\n typeof window.CSS.escape === \"function\"\r\n ) {\r\n return window.CSS.escape(value);\r\n }\r\n return value.replace(/[\"\\\\]/g, \"\\\\$&\");\r\n}\r\n\r\n/**\r\n * Is this element something a user can actually be sent to?\r\n *\r\n * `getClientRects().length === 0` is what excludes a field inside a\r\n * collapsed <details> or a display:none branch. offsetParent alone is not\r\n * enough — it is also null for position:fixed elements, which are visible.\r\n */\r\nfunction isFocusableNow(el: Element | null): el is HTMLElement {\r\n if (!(el instanceof HTMLElement)) return false;\r\n if (el.hasAttribute(\"disabled\")) return false;\r\n if (el.getAttribute(\"aria-hidden\") === \"true\") return false;\r\n if (el.getClientRects().length === 0) return false;\r\n return true;\r\n}\r\n\r\n/**\r\n * Focus the control registered under `name`, resolving it the way the v2\r\n * Field contract publishes it.\r\n *\r\n * @returns true when a visible, enabled control was focused. False means\r\n * nothing matched, or the match was hidden or disabled — the\r\n * caller should keep its inline error and, ideally, render\r\n * FormErrorSummary so the field is still reachable.\r\n */\r\nexport function focusFieldByName(\r\n name: string,\r\n options: FocusFieldOptions = {}\r\n): boolean {\r\n if (typeof document === \"undefined\") return false;\r\n if (!name) return false;\r\n\r\n const escaped = escapeAttributeValue(name);\r\n\r\n /* Order matters — see the `[id=]` note in the module docstring. */\r\n const selectors = [\r\n `[id=\"${escaped}\"]`,\r\n `[name=\"${escaped}\"]`,\r\n `[data-field=\"${escaped}\"]`,\r\n ];\r\n\r\n for (const selector of selectors) {\r\n let host: Element | null = null;\r\n try {\r\n host = document.querySelector(selector);\r\n } catch {\r\n /* Malformed selector — try the next shape rather than throwing into\r\n the caller's validation branch. */\r\n host = null;\r\n }\r\n if (host === null) continue;\r\n\r\n const target = isFocusableNow(host)\r\n ? host\r\n : host.querySelector(FOCUSABLE_WITHIN);\r\n\r\n if (!isFocusableNow(target)) continue;\r\n\r\n if (options.scroll !== false) {\r\n try {\r\n target.scrollIntoView({ block: \"center\", behavior: \"auto\" });\r\n } catch {\r\n /* jsdom and older Safari lack the options overload. Focus below\r\n still scrolls the control into view natively. */\r\n }\r\n }\r\n\r\n target.focus();\r\n return true;\r\n }\r\n\r\n return false;\r\n}\r\n\r\n/**\r\n * Move focus to the first field in error after each failed submit.\r\n *\r\n * Fires when `submitCount` increases AND an error is present. The two\r\n * conditions are separate on purpose: Formik increments submitCount before\r\n * async validation resolves, so on the render where the counter changes\r\n * `errors` can still be empty. Marking the attempt handled only once an\r\n * error is actually found lets the effect re-run when the errors land,\r\n * without re-firing for the same attempt afterwards.\r\n */\r\nexport default function useFocusFirstError({\r\n errors,\r\n order,\r\n submitCount = 0,\r\n enabled = true,\r\n scroll = true,\r\n}: UseFocusFirstErrorOptions): void {\r\n /** Highest submitCount already acted on. */\r\n const handledRef = useRef(0);\r\n\r\n useEffect(() => {\r\n if (!enabled) return undefined;\r\n if (submitCount <= handledRef.current) return undefined;\r\n if (!errors) return undefined;\r\n\r\n const names =\r\n order !== undefined && order.length > 0 ? order : Object.keys(errors);\r\n\r\n const first = names.find((name) => Boolean(errors[name]));\r\n\r\n /* No error yet: either validation is still in flight for this attempt,\r\n or it passed. Leave handledRef alone so a later errors update for the\r\n SAME attempt is still honoured. */\r\n if (first === undefined) return undefined;\r\n\r\n handledRef.current = submitCount;\r\n\r\n /* One frame, so the inline errors have rendered and the target exists\r\n and is measurable before it is focused and scrolled to. */\r\n const frame = requestAnimationFrame(() => {\r\n const focused = focusFieldByName(first, { scroll });\r\n\r\n if (!focused && process.env[\"NODE_ENV\"] !== \"production\") {\r\n // eslint-disable-next-line no-console\r\n console.warn(\r\n `[v2.useFocusFirstError] Could not focus \"${first}\" — no visible, ` +\r\n \"enabled control matched [id], [name] or [data-field]. Either the \" +\r\n \"field is in a collapsed section, or its control does not publish \" +\r\n \"the field name (a hand-rolled control that skips Field). R-F.3 is \" +\r\n \"NOT satisfied for this field; render FormErrorSummary (R-FV.2) so \" +\r\n \"it stays reachable.\"\r\n );\r\n }\r\n });\r\n\r\n return () => cancelAnimationFrame(frame);\r\n }, [errors, order, submitCount, enabled, scroll]);\r\n}\r\n"],"mappings":"AAAA,SAASA,SAAS,EAAEC,MAAM,QAAQ,OAAO;;AAEzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AA+CA;AACA;AACA;AACA;AACA;AACA;AACA,IAAMC,gBAAgB,GACpB,qEAAqE;;AAEvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASC,oBAAoBA,CAACC,KAAa,EAAU;EACnD,IACE,OAAOC,MAAM,KAAK,WAAW,IAC7BA,MAAM,CAACC,GAAG,IACV,OAAOD,MAAM,CAACC,GAAG,CAACC,MAAM,KAAK,UAAU,EACvC;IACA,OAAOF,MAAM,CAACC,GAAG,CAACC,MAAM,CAACH,KAAK,CAAC;EACjC;EACA,OAAOA,KAAK,CAACI,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC;AACxC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASC,cAAcA,CAACC,EAAkB,EAAqB;EAC7D,IAAI,EAAEA,EAAE,YAAYC,WAAW,CAAC,EAAE,OAAO,KAAK;EAC9C,IAAID,EAAE,CAACE,YAAY,CAAC,UAAU,CAAC,EAAE,OAAO,KAAK;EAC7C,IAAIF,EAAE,CAACG,YAAY,CAAC,aAAa,CAAC,KAAK,MAAM,EAAE,OAAO,KAAK;EAC3D,IAAIH,EAAE,CAACI,cAAc,CAAC,CAAC,CAACC,MAAM,KAAK,CAAC,EAAE,OAAO,KAAK;EAClD,OAAO,IAAI;AACb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,gBAAgBA,CAC9BC,IAAY,EAEH;EAAA,IADTC,OAA0B,GAAAC,SAAA,CAAAJ,MAAA,QAAAI,SAAA,QAAAC,SAAA,GAAAD,SAAA,MAAG,CAAC,CAAC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","ignoreList":[]}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
import { useEffect } from "react";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* useFocusTrap — Portnet UI v2
|
|
5
|
+
*
|
|
6
|
+
* Traps Tab / Shift+Tab inside `ref` while `isActive`.
|
|
7
|
+
* On activation, focuses the first `[autofocus]` / `[data-autofocus]`
|
|
8
|
+
* descendant if present, otherwise the first focusable child.
|
|
9
|
+
* On deactivation, restores focus to the element that previously held
|
|
10
|
+
* it (only if still in the DOM).
|
|
11
|
+
*
|
|
12
|
+
* WCAG 2.4.3, charter R-F.2.
|
|
13
|
+
*
|
|
14
|
+
* Implementation notes
|
|
15
|
+
* - Keydown listener attached to `document` in capture phase. If
|
|
16
|
+
* focus has somehow escaped the container, the next Tab is caught
|
|
17
|
+
* and warped back inside.
|
|
18
|
+
* - NESTED TRAPS — only the topmost trap on `trapStack` intercepts
|
|
19
|
+
* Tab. Outer traps stay registered and resume duty when the inner
|
|
20
|
+
* trap unmounts. This makes ConfirmDialog-in-Drawer-in-Modal
|
|
21
|
+
* flows behave correctly.
|
|
22
|
+
* - Focusable elements are filtered to exclude those inside
|
|
23
|
+
* aria-hidden / inert / hidden / display:none subtrees, even
|
|
24
|
+
* though querySelectorAll happily returns them.
|
|
25
|
+
* - BOUNDARY SCOPE — Tab is intercepted only at the cycle edges
|
|
26
|
+
* (Tab on `last`, Shift+Tab on `first`) plus the escaped-focus
|
|
27
|
+
* recovery path. Mid-cycle moves are deliberately left to the
|
|
28
|
+
* browser's native tab order.
|
|
29
|
+
*
|
|
30
|
+
* Consequence worth knowing: the filter above decides what counts
|
|
31
|
+
* as `first` / `last`, so the trap never DELIVERS focus into a
|
|
32
|
+
* filtered element — but it cannot stop the browser tabbing into
|
|
33
|
+
* one mid-cycle. `hidden` and `inert` are unaffected (both remove
|
|
34
|
+
* an element from the native tab order); `aria-hidden` is NOT, as
|
|
35
|
+
* per spec it annotates only the accessibility tree. So a
|
|
36
|
+
* focusable control inside `aria-hidden="true"` IS still reachable
|
|
37
|
+
* by Tab — that is a content defect (axe `aria-hidden-focus`), and
|
|
38
|
+
* the fix is `inert` on the subtree, not more interception here.
|
|
39
|
+
*
|
|
40
|
+
* Full per-Tab interception would close that gap, at the cost of
|
|
41
|
+
* taking over native traversal for every Modal / Drawer /
|
|
42
|
+
* ConfirmDialog in the fleet — which also breaks radio-group
|
|
43
|
+
* roving tabindex and any positive `tabindex` ordering. Not done
|
|
44
|
+
* without a browser-level test bed. See the aria-hidden case in
|
|
45
|
+
* __tests__/useFocusTrap.test.tsx.
|
|
46
|
+
* - Cleanup never calls focus() on an unmounted or detached
|
|
47
|
+
* trigger and cancels the initial-focus rAF.
|
|
48
|
+
*
|
|
49
|
+
* Escape handling is INTENTIONALLY OUT OF SCOPE — the consumer (Modal,
|
|
50
|
+
* Drawer, ConfirmDialog) is responsible for closing on Escape per
|
|
51
|
+
* R-F.1. Mixing concerns here would force every trap user to opt out.
|
|
52
|
+
*
|
|
53
|
+
* @param ref The container ref to trap focus inside. Accepts a
|
|
54
|
+
* nullable `current` (`RefObject<T | null>`) so callers
|
|
55
|
+
* can pass `useRef<HTMLElement>(null)` directly without a
|
|
56
|
+
* cast — the effect no-ops until `current` is populated.
|
|
57
|
+
* @param isActive Whether the trap is currently on.
|
|
58
|
+
*/
|
|
59
|
+
|
|
60
|
+
var FOCUSABLE_SELECTORS = ["a[href]", "button:not(:disabled)", "input:not(:disabled)", "select:not(:disabled)", "textarea:not(:disabled)", '[tabindex]:not([tabindex="-1"])', '[contenteditable]:not([contenteditable="false"])', "audio[controls]", "video[controls]"].join(", ");
|
|
61
|
+
var AUTOFOCUS_SELECTORS = "[autofocus], [data-autofocus]";
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Module-level stack of active trap containers. Only the LAST entry
|
|
65
|
+
* (innermost trap) intercepts Tab; outer traps stay registered but
|
|
66
|
+
* pass-through. Cleanup pops by reference to tolerate out-of-order
|
|
67
|
+
* unmount sequences (portal teardown, hot-replace).
|
|
68
|
+
*/
|
|
69
|
+
var trapStack = [];
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Is `container` the INNERMOST active trap?
|
|
73
|
+
*
|
|
74
|
+
* ⚠ DO NOT REPLACE THIS WITH `trapStack[trapStack.length - 1] === container`.
|
|
75
|
+
*
|
|
76
|
+
* Stack POSITION does not track nesting depth. React runs CHILD effects before
|
|
77
|
+
* PARENT effects, so when an outer and an inner trap mount in the SAME commit
|
|
78
|
+
* (Modal rendering a ConfirmDialog, Drawer with a nested trap) the INNER trap is
|
|
79
|
+
* pushed FIRST and the OUTER one LAST — making the last entry the OUTERMOST trap,
|
|
80
|
+
* the exact opposite of the intent.
|
|
81
|
+
*
|
|
82
|
+
* Push order only happens to match nesting when the traps mount at different
|
|
83
|
+
* times, which is the common case and why the bug stayed hidden. The
|
|
84
|
+
* simultaneous-mount path gave Tab duty to the trap BEHIND the dialog the user
|
|
85
|
+
* was looking at (R-M.2 / R-F.2).
|
|
86
|
+
*
|
|
87
|
+
* Containment is order-independent: a trap is innermost when no other active
|
|
88
|
+
* trap lives inside it. Correct for both mount orderings, and for unmount — once
|
|
89
|
+
* the inner trap pops, the outer contains nothing and resumes duty.
|
|
90
|
+
*/
|
|
91
|
+
function isInnermostTrap(container) {
|
|
92
|
+
return !trapStack.some(function (other) {
|
|
93
|
+
return other !== container && container.contains(other);
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* True iff the element is rendered AND not inside an aria-hidden /
|
|
99
|
+
* inert / hidden / display:none ancestor. querySelectorAll picks
|
|
100
|
+
* those up indiscriminately, so re-filter at use time.
|
|
101
|
+
*/
|
|
102
|
+
function isVisuallyFocusable(el) {
|
|
103
|
+
if (!el) return false;
|
|
104
|
+
if ("disabled" in el && el.disabled) return false;
|
|
105
|
+
if (el.getAttribute && el.getAttribute("aria-disabled") === "true") return false;
|
|
106
|
+
// Cheap visibility test — covers display:none and visibility:hidden.
|
|
107
|
+
// Note: elements with `display: contents` may report 0 rects but have
|
|
108
|
+
// focusable descendants; the descendants themselves still match if
|
|
109
|
+
// they have their own boxes, so this filter is a reasonable trade-off.
|
|
110
|
+
if (typeof el.getClientRects === "function" && el.getClientRects().length === 0) {
|
|
111
|
+
return false;
|
|
112
|
+
}
|
|
113
|
+
// Walk ancestors for hidden / aria-hidden / inert.
|
|
114
|
+
var node = el;
|
|
115
|
+
while (node && node !== document.body) {
|
|
116
|
+
if (node.hasAttribute && (node.hasAttribute("inert") || node.hasAttribute("hidden") || node.getAttribute("aria-hidden") === "true")) {
|
|
117
|
+
return false;
|
|
118
|
+
}
|
|
119
|
+
node = node.parentElement;
|
|
120
|
+
}
|
|
121
|
+
return true;
|
|
122
|
+
}
|
|
123
|
+
export default function useFocusTrap(ref, isActive) {
|
|
124
|
+
useEffect(function () {
|
|
125
|
+
if (!isActive || !ref.current) return undefined;
|
|
126
|
+
var container = ref.current;
|
|
127
|
+
trapStack.push(container);
|
|
128
|
+
var getFocusable = function getFocusable() {
|
|
129
|
+
return Array.from(container.querySelectorAll(FOCUSABLE_SELECTORS)).filter(isVisuallyFocusable);
|
|
130
|
+
};
|
|
131
|
+
var trigger = document.activeElement;
|
|
132
|
+
|
|
133
|
+
// Initial focus, deferred to next frame so React has finished
|
|
134
|
+
// painting any conditional content. Cancellation handle stored
|
|
135
|
+
// so unmount-within-same-frame cannot leak a stale .focus() call.
|
|
136
|
+
var rafId = requestAnimationFrame(function () {
|
|
137
|
+
/* Only the innermost trap claims initial focus — same predicate as `trap()`
|
|
138
|
+
* below, so keyboard duty and initial focus can never disagree.
|
|
139
|
+
*
|
|
140
|
+
* Initial focus was previously unguarded: every trap focused on
|
|
141
|
+
* activation regardless of nesting, so on simultaneous mount the outer
|
|
142
|
+
* trap's rAF fired last and overwrote the inner trap's focus. */
|
|
143
|
+
if (!isInnermostTrap(container)) return;
|
|
144
|
+
var explicit = container.querySelector(AUTOFOCUS_SELECTORS);
|
|
145
|
+
var target = explicit && isVisuallyFocusable(explicit) ? explicit : getFocusable()[0];
|
|
146
|
+
if (target && typeof target.focus === "function") target.focus();
|
|
147
|
+
});
|
|
148
|
+
var trap = function trap(e) {
|
|
149
|
+
if (e.key !== "Tab") return;
|
|
150
|
+
// Only the innermost trap acts. Outer traps stay registered and defer.
|
|
151
|
+
// Containment, NOT stack position — see isInnermostTrap.
|
|
152
|
+
if (!isInnermostTrap(container)) return;
|
|
153
|
+
var els = getFocusable();
|
|
154
|
+
if (!els.length) {
|
|
155
|
+
// Pathological case (no focusable inside): swallow Tab so
|
|
156
|
+
// focus cannot escape into the page behind the trap.
|
|
157
|
+
e.preventDefault();
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
var first = els[0];
|
|
161
|
+
var last = els[els.length - 1];
|
|
162
|
+
if (!first || !last) return;
|
|
163
|
+
var active = document.activeElement;
|
|
164
|
+
|
|
165
|
+
// Recovery: if focus is currently OUTSIDE the container, warp it
|
|
166
|
+
// back to the first focusable. Without this, an escaped focus
|
|
167
|
+
// (mount race, programmatic blur, SR virtual cursor) leaks Tab
|
|
168
|
+
// navigation to the page behind the trap.
|
|
169
|
+
if (!container.contains(active)) {
|
|
170
|
+
e.preventDefault();
|
|
171
|
+
first.focus();
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
if (e.shiftKey && active === first) {
|
|
175
|
+
e.preventDefault();
|
|
176
|
+
last.focus();
|
|
177
|
+
} else if (!e.shiftKey && active === last) {
|
|
178
|
+
e.preventDefault();
|
|
179
|
+
first.focus();
|
|
180
|
+
}
|
|
181
|
+
};
|
|
182
|
+
document.addEventListener("keydown", trap, true);
|
|
183
|
+
return function () {
|
|
184
|
+
cancelAnimationFrame(rafId);
|
|
185
|
+
|
|
186
|
+
// Pop by reference (NOT by index) — tolerates out-of-order
|
|
187
|
+
// unmount sequences during portal teardown or hot-replace.
|
|
188
|
+
var idx = trapStack.lastIndexOf(container);
|
|
189
|
+
if (idx >= 0) trapStack.splice(idx, 1);
|
|
190
|
+
document.removeEventListener("keydown", trap, true);
|
|
191
|
+
|
|
192
|
+
// Restore focus only if the trigger is still mounted, focusable,
|
|
193
|
+
// and not currently disabled. Calling .focus() on a detached or
|
|
194
|
+
// disabled node silently leaves focus on <body> with no visible
|
|
195
|
+
// indicator — actively user-hostile.
|
|
196
|
+
if (trigger && trigger !== document.body && "focus" in trigger && typeof trigger.focus === "function" && document.body.contains(trigger) && !("disabled" in trigger && trigger.disabled)) {
|
|
197
|
+
trigger.focus();
|
|
198
|
+
}
|
|
199
|
+
};
|
|
200
|
+
}, [isActive, ref]);
|
|
201
|
+
}
|
|
202
|
+
//# sourceMappingURL=useFocusTrap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useFocusTrap.js","names":["useEffect","FOCUSABLE_SELECTORS","join","AUTOFOCUS_SELECTORS","trapStack","isInnermostTrap","container","some","other","contains","isVisuallyFocusable","el","disabled","getAttribute","getClientRects","length","node","document","body","hasAttribute","parentElement","useFocusTrap","ref","isActive","current","undefined","push","getFocusable","Array","from","querySelectorAll","filter","trigger","activeElement","rafId","requestAnimationFrame","explicit","querySelector","target","focus","trap","e","key","els","preventDefault","first","last","active","shiftKey","addEventListener","cancelAnimationFrame","idx","lastIndexOf","splice","removeEventListener"],"sources":["../../../../src/lib/v2/hooks/useFocusTrap.ts"],"sourcesContent":["import { useEffect, type RefObject } from \"react\";\r\n\r\n/**\r\n * useFocusTrap — Portnet UI v2\r\n *\r\n * Traps Tab / Shift+Tab inside `ref` while `isActive`.\r\n * On activation, focuses the first `[autofocus]` / `[data-autofocus]`\r\n * descendant if present, otherwise the first focusable child.\r\n * On deactivation, restores focus to the element that previously held\r\n * it (only if still in the DOM).\r\n *\r\n * WCAG 2.4.3, charter R-F.2.\r\n *\r\n * Implementation notes\r\n * - Keydown listener attached to `document` in capture phase. If\r\n * focus has somehow escaped the container, the next Tab is caught\r\n * and warped back inside.\r\n * - NESTED TRAPS — only the topmost trap on `trapStack` intercepts\r\n * Tab. Outer traps stay registered and resume duty when the inner\r\n * trap unmounts. This makes ConfirmDialog-in-Drawer-in-Modal\r\n * flows behave correctly.\r\n * - Focusable elements are filtered to exclude those inside\r\n * aria-hidden / inert / hidden / display:none subtrees, even\r\n * though querySelectorAll happily returns them.\r\n * - BOUNDARY SCOPE — Tab is intercepted only at the cycle edges\r\n * (Tab on `last`, Shift+Tab on `first`) plus the escaped-focus\r\n * recovery path. Mid-cycle moves are deliberately left to the\r\n * browser's native tab order.\r\n *\r\n * Consequence worth knowing: the filter above decides what counts\r\n * as `first` / `last`, so the trap never DELIVERS focus into a\r\n * filtered element — but it cannot stop the browser tabbing into\r\n * one mid-cycle. `hidden` and `inert` are unaffected (both remove\r\n * an element from the native tab order); `aria-hidden` is NOT, as\r\n * per spec it annotates only the accessibility tree. So a\r\n * focusable control inside `aria-hidden=\"true\"` IS still reachable\r\n * by Tab — that is a content defect (axe `aria-hidden-focus`), and\r\n * the fix is `inert` on the subtree, not more interception here.\r\n *\r\n * Full per-Tab interception would close that gap, at the cost of\r\n * taking over native traversal for every Modal / Drawer /\r\n * ConfirmDialog in the fleet — which also breaks radio-group\r\n * roving tabindex and any positive `tabindex` ordering. Not done\r\n * without a browser-level test bed. See the aria-hidden case in\r\n * __tests__/useFocusTrap.test.tsx.\r\n * - Cleanup never calls focus() on an unmounted or detached\r\n * trigger and cancels the initial-focus rAF.\r\n *\r\n * Escape handling is INTENTIONALLY OUT OF SCOPE — the consumer (Modal,\r\n * Drawer, ConfirmDialog) is responsible for closing on Escape per\r\n * R-F.1. Mixing concerns here would force every trap user to opt out.\r\n *\r\n * @param ref The container ref to trap focus inside. Accepts a\r\n * nullable `current` (`RefObject<T | null>`) so callers\r\n * can pass `useRef<HTMLElement>(null)` directly without a\r\n * cast — the effect no-ops until `current` is populated.\r\n * @param isActive Whether the trap is currently on.\r\n */\r\n\r\nconst FOCUSABLE_SELECTORS = [\r\n \"a[href]\",\r\n \"button:not(:disabled)\",\r\n \"input:not(:disabled)\",\r\n \"select:not(:disabled)\",\r\n \"textarea:not(:disabled)\",\r\n '[tabindex]:not([tabindex=\"-1\"])',\r\n '[contenteditable]:not([contenteditable=\"false\"])',\r\n \"audio[controls]\",\r\n \"video[controls]\",\r\n].join(\", \");\r\n\r\nconst AUTOFOCUS_SELECTORS = \"[autofocus], [data-autofocus]\";\r\n\r\n/**\r\n * Module-level stack of active trap containers. Only the LAST entry\r\n * (innermost trap) intercepts Tab; outer traps stay registered but\r\n * pass-through. Cleanup pops by reference to tolerate out-of-order\r\n * unmount sequences (portal teardown, hot-replace).\r\n */\r\nconst trapStack: HTMLElement[] = [];\r\n\r\n/**\r\n * Is `container` the INNERMOST active trap?\r\n *\r\n * ⚠ DO NOT REPLACE THIS WITH `trapStack[trapStack.length - 1] === container`.\r\n *\r\n * Stack POSITION does not track nesting depth. React runs CHILD effects before\r\n * PARENT effects, so when an outer and an inner trap mount in the SAME commit\r\n * (Modal rendering a ConfirmDialog, Drawer with a nested trap) the INNER trap is\r\n * pushed FIRST and the OUTER one LAST — making the last entry the OUTERMOST trap,\r\n * the exact opposite of the intent.\r\n *\r\n * Push order only happens to match nesting when the traps mount at different\r\n * times, which is the common case and why the bug stayed hidden. The\r\n * simultaneous-mount path gave Tab duty to the trap BEHIND the dialog the user\r\n * was looking at (R-M.2 / R-F.2).\r\n *\r\n * Containment is order-independent: a trap is innermost when no other active\r\n * trap lives inside it. Correct for both mount orderings, and for unmount — once\r\n * the inner trap pops, the outer contains nothing and resumes duty.\r\n */\r\nfunction isInnermostTrap(container: HTMLElement): boolean {\r\n return !trapStack.some(\r\n (other) => other !== container && container.contains(other)\r\n );\r\n}\r\n\r\n/**\r\n * True iff the element is rendered AND not inside an aria-hidden /\r\n * inert / hidden / display:none ancestor. querySelectorAll picks\r\n * those up indiscriminately, so re-filter at use time.\r\n */\r\nfunction isVisuallyFocusable(el: Element | null): el is HTMLElement {\r\n if (!el) return false;\r\n if (\"disabled\" in el && el.disabled) return false;\r\n if (el.getAttribute && el.getAttribute(\"aria-disabled\") === \"true\") return false;\r\n // Cheap visibility test — covers display:none and visibility:hidden.\r\n // Note: elements with `display: contents` may report 0 rects but have\r\n // focusable descendants; the descendants themselves still match if\r\n // they have their own boxes, so this filter is a reasonable trade-off.\r\n if (typeof el.getClientRects === \"function\" && el.getClientRects().length === 0) {\r\n return false;\r\n }\r\n // Walk ancestors for hidden / aria-hidden / inert.\r\n let node: Element | null = el;\r\n while (node && node !== document.body) {\r\n if (node.hasAttribute && (\r\n node.hasAttribute(\"inert\") ||\r\n node.hasAttribute(\"hidden\") ||\r\n node.getAttribute(\"aria-hidden\") === \"true\"\r\n )) {\r\n return false;\r\n }\r\n node = node.parentElement;\r\n }\r\n return true;\r\n}\r\n\r\nexport default function useFocusTrap<T extends HTMLElement = HTMLElement>(\r\n ref: RefObject<T | null>,\r\n isActive: boolean\r\n): void {\r\n useEffect(() => {\r\n if (!isActive || !ref.current) return undefined;\r\n\r\n const container = ref.current;\r\n trapStack.push(container);\r\n\r\n const getFocusable = (): HTMLElement[] =>\r\n Array.from(container.querySelectorAll(FOCUSABLE_SELECTORS)).filter(isVisuallyFocusable);\r\n\r\n const trigger = document.activeElement;\r\n\r\n // Initial focus, deferred to next frame so React has finished\r\n // painting any conditional content. Cancellation handle stored\r\n // so unmount-within-same-frame cannot leak a stale .focus() call.\r\n const rafId = requestAnimationFrame(() => {\r\n /* Only the innermost trap claims initial focus — same predicate as `trap()`\r\n * below, so keyboard duty and initial focus can never disagree.\r\n *\r\n * Initial focus was previously unguarded: every trap focused on\r\n * activation regardless of nesting, so on simultaneous mount the outer\r\n * trap's rAF fired last and overwrote the inner trap's focus. */\r\n if (!isInnermostTrap(container)) return;\r\n\r\n const explicit = container.querySelector(AUTOFOCUS_SELECTORS);\r\n const target = (explicit && isVisuallyFocusable(explicit))\r\n ? explicit\r\n : getFocusable()[0];\r\n if (target && typeof target.focus === \"function\") target.focus();\r\n });\r\n\r\n const trap = (e: KeyboardEvent): void => {\r\n if (e.key !== \"Tab\") return;\r\n // Only the innermost trap acts. Outer traps stay registered and defer.\r\n // Containment, NOT stack position — see isInnermostTrap.\r\n if (!isInnermostTrap(container)) return;\r\n\r\n const els = getFocusable();\r\n if (!els.length) {\r\n // Pathological case (no focusable inside): swallow Tab so\r\n // focus cannot escape into the page behind the trap.\r\n e.preventDefault();\r\n return;\r\n }\r\n const first = els[0];\r\n const last = els[els.length - 1];\r\n if (!first || !last) return;\r\n const active = document.activeElement;\r\n\r\n // Recovery: if focus is currently OUTSIDE the container, warp it\r\n // back to the first focusable. Without this, an escaped focus\r\n // (mount race, programmatic blur, SR virtual cursor) leaks Tab\r\n // navigation to the page behind the trap.\r\n if (!container.contains(active)) {\r\n e.preventDefault();\r\n first.focus();\r\n return;\r\n }\r\n\r\n if (e.shiftKey && active === first) {\r\n e.preventDefault();\r\n last.focus();\r\n } else if (!e.shiftKey && active === last) {\r\n e.preventDefault();\r\n first.focus();\r\n }\r\n };\r\n\r\n document.addEventListener(\"keydown\", trap, true);\r\n\r\n return () => {\r\n cancelAnimationFrame(rafId);\r\n\r\n // Pop by reference (NOT by index) — tolerates out-of-order\r\n // unmount sequences during portal teardown or hot-replace.\r\n const idx = trapStack.lastIndexOf(container);\r\n if (idx >= 0) trapStack.splice(idx, 1);\r\n\r\n document.removeEventListener(\"keydown\", trap, true);\r\n\r\n // Restore focus only if the trigger is still mounted, focusable,\r\n // and not currently disabled. Calling .focus() on a detached or\r\n // disabled node silently leaves focus on <body> with no visible\r\n // indicator — actively user-hostile.\r\n if (\r\n trigger &&\r\n trigger !== document.body &&\r\n \"focus\" in trigger &&\r\n typeof trigger.focus === \"function\" &&\r\n document.body.contains(trigger) &&\r\n !(\"disabled\" in trigger && trigger.disabled)\r\n ) {\r\n trigger.focus();\r\n }\r\n };\r\n }, [isActive, ref]);\r\n}\r\n"],"mappings":"AAAA,SAASA,SAAS,QAAwB,OAAO;;AAEjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,IAAMC,mBAAmB,GAAG,CAC1B,SAAS,EACT,uBAAuB,EACvB,sBAAsB,EACtB,uBAAuB,EACvB,yBAAyB,EACzB,iCAAiC,EACjC,kDAAkD,EAClD,iBAAiB,EACjB,iBAAiB,CAClB,CAACC,IAAI,CAAC,IAAI,CAAC;AAEZ,IAAMC,mBAAmB,GAAG,+BAA+B;;AAE3D;AACA;AACA;AACA;AACA;AACA;AACA,IAAMC,SAAwB,GAAG,EAAE;;AAEnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASC,eAAeA,CAACC,SAAsB,EAAW;EACxD,OAAO,CAACF,SAAS,CAACG,IAAI,CACpB,UAACC,KAAK;IAAA,OAAKA,KAAK,KAAKF,SAAS,IAAIA,SAAS,CAACG,QAAQ,CAACD,KAAK,CAAC;EAAA,CAC7D,CAAC;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA,SAASE,mBAAmBA,CAACC,EAAkB,EAAqB;EAClE,IAAI,CAACA,EAAE,EAAE,OAAO,KAAK;EACrB,IAAI,UAAU,IAAIA,EAAE,IAAIA,EAAE,CAACC,QAAQ,EAAE,OAAO,KAAK;EACjD,IAAID,EAAE,CAACE,YAAY,IAAIF,EAAE,CAACE,YAAY,CAAC,eAAe,CAAC,KAAK,MAAM,EAAE,OAAO,KAAK;EAChF;EACA;EACA;EACA;EACA,IAAI,OAAOF,EAAE,CAACG,cAAc,KAAK,UAAU,IAAIH,EAAE,CAACG,cAAc,CAAC,CAAC,CAACC,MAAM,KAAK,CAAC,EAAE;IAC/E,OAAO,KAAK;EACd;EACA;EACA,IAAIC,IAAoB,GAAGL,EAAE;EAC7B,OAAOK,IAAI,IAAIA,IAAI,KAAKC,QAAQ,CAACC,IAAI,EAAE;IACrC,IAAIF,IAAI,CAACG,YAAY,KACnBH,IAAI,CAACG,YAAY,CAAC,OAAO,CAAC,IAC1BH,IAAI,CAACG,YAAY,CAAC,QAAQ,CAAC,IAC3BH,IAAI,CAACH,YAAY,CAAC,aAAa,CAAC,KAAK,MAAM,CAC5C,EAAE;MACD,OAAO,KAAK;IACd;IACAG,IAAI,GAAGA,IAAI,CAACI,aAAa;EAC3B;EACA,OAAO,IAAI;AACb;AAEA,eAAe,SAASC,YAAYA,CAClCC,GAAwB,EACxBC,QAAiB,EACX;EACNvB,SAAS,CAAC,YAAM;IACd,IAAI,CAACuB,QAAQ,IAAI,CAACD,GAAG,CAACE,OAAO,EAAE,OAAOC,SAAS;IAE/C,IAAMnB,SAAS,GAAGgB,GAAG,CAACE,OAAO;IAC7BpB,SAAS,CAACsB,IAAI,CAACpB,SAAS,CAAC;IAEzB,IAAMqB,YAAY,GAAG,SAAfA,YAAYA,CAAA;MAAA,OAChBC,KAAK,CAACC,IAAI,CAACvB,SAAS,CAACwB,gBAAgB,CAAC7B,mBAAmB,CAAC,CAAC,CAAC8B,MAAM,CAACrB,mBAAmB,CAAC;IAAA;IAEzF,IAAMsB,OAAO,GAAGf,QAAQ,CAACgB,aAAa;;IAEtC;IACA;IACA;IACA,IAAMC,KAAK,GAAGC,qBAAqB,CAAC,YAAM;MACxC;AACN;AACA;AACA;AACA;AACA;MACM,IAAI,CAAC9B,eAAe,CAACC,SAAS,CAAC,EAAE;MAEjC,IAAM8B,QAAQ,GAAG9B,SAAS,CAAC+B,aAAa,CAAClC,mBAAmB,CAAC;MAC7D,IAAMmC,MAAM,GAAIF,QAAQ,IAAI1B,mBAAmB,CAAC0B,QAAQ,CAAC,GACrDA,QAAQ,GACRT,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;MACrB,IAAIW,MAAM,IAAI,OAAOA,MAAM,CAACC,KAAK,KAAK,UAAU,EAAED,MAAM,CAACC,KAAK,CAAC,CAAC;IAClE,CAAC,CAAC;IAEF,IAAMC,IAAI,GAAG,SAAPA,IAAIA,CAAIC,CAAgB,EAAW;MACvC,IAAIA,CAAC,CAACC,GAAG,KAAK,KAAK,EAAE;MACrB;MACA;MACA,IAAI,CAACrC,eAAe,CAACC,SAAS,CAAC,EAAE;MAEjC,IAAMqC,GAAG,GAAGhB,YAAY,CAAC,CAAC;MAC1B,IAAI,CAACgB,GAAG,CAAC5B,MAAM,EAAE;QACf;QACA;QACA0B,CAAC,CAACG,cAAc,CAAC,CAAC;QAClB;MACF;MACA,IAAMC,KAAK,GAAGF,GAAG,CAAC,CAAC,CAAC;MACpB,IAAMG,IAAI,GAAGH,GAAG,CAACA,GAAG,CAAC5B,MAAM,GAAG,CAAC,CAAC;MAChC,IAAI,CAAC8B,KAAK,IAAI,CAACC,IAAI,EAAE;MACrB,IAAMC,MAAM,GAAG9B,QAAQ,CAACgB,aAAa;;MAErC;MACA;MACA;MACA;MACA,IAAI,CAAC3B,SAAS,CAACG,QAAQ,CAACsC,MAAM,CAAC,EAAE;QAC/BN,CAAC,CAACG,cAAc,CAAC,CAAC;QAClBC,KAAK,CAACN,KAAK,CAAC,CAAC;QACb;MACF;MAEA,IAAIE,CAAC,CAACO,QAAQ,IAAID,MAAM,KAAKF,KAAK,EAAE;QAClCJ,CAAC,CAACG,cAAc,CAAC,CAAC;QAClBE,IAAI,CAACP,KAAK,CAAC,CAAC;MACd,CAAC,MAAM,IAAI,CAACE,CAAC,CAACO,QAAQ,IAAID,MAAM,KAAKD,IAAI,EAAE;QACzCL,CAAC,CAACG,cAAc,CAAC,CAAC;QAClBC,KAAK,CAACN,KAAK,CAAC,CAAC;MACf;IACF,CAAC;IAEDtB,QAAQ,CAACgC,gBAAgB,CAAC,SAAS,EAAET,IAAI,EAAE,IAAI,CAAC;IAEhD,OAAO,YAAM;MACXU,oBAAoB,CAAChB,KAAK,CAAC;;MAE3B;MACA;MACA,IAAMiB,GAAG,GAAG/C,SAAS,CAACgD,WAAW,CAAC9C,SAAS,CAAC;MAC5C,IAAI6C,GAAG,IAAI,CAAC,EAAE/C,SAAS,CAACiD,MAAM,CAACF,GAAG,EAAE,CAAC,CAAC;MAEtClC,QAAQ,CAACqC,mBAAmB,CAAC,SAAS,EAAEd,IAAI,EAAE,IAAI,CAAC;;MAEnD;MACA;MACA;MACA;MACA,IACER,OAAO,IACPA,OAAO,KAAKf,QAAQ,CAACC,IAAI,IACzB,OAAO,IAAIc,OAAO,IAClB,OAAOA,OAAO,CAACO,KAAK,KAAK,UAAU,IACnCtB,QAAQ,CAACC,IAAI,CAACT,QAAQ,CAACuB,OAAO,CAAC,IAC/B,EAAE,UAAU,IAAIA,OAAO,IAAIA,OAAO,CAACpB,QAAQ,CAAC,EAC5C;QACAoB,OAAO,CAACO,KAAK,CAAC,CAAC;MACjB;IACF,CAAC;EACH,CAAC,EAAE,CAAChB,QAAQ,EAAED,GAAG,CAAC,CAAC;AACrB","ignoreList":[]}
|