@portnet/ui 6.0.1 → 6.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +737 -0
- package/dist/esm/index.js +90 -3
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/v2/__tests__/AppMain.test.js +130 -0
- package/dist/esm/v2/__tests__/AppMain.test.js.map +1 -0
- package/dist/esm/v2/__tests__/ChartFigure.test.js +180 -0
- package/dist/esm/v2/__tests__/ChartFigure.test.js.map +1 -0
- package/dist/esm/v2/__tests__/DataGridRowActionsPropagation.test.js +150 -0
- package/dist/esm/v2/__tests__/DataGridRowActionsPropagation.test.js.map +1 -0
- package/dist/esm/v2/__tests__/DrawerTactileTargets.test.js +93 -0
- package/dist/esm/v2/__tests__/DrawerTactileTargets.test.js.map +1 -0
- package/dist/esm/v2/__tests__/FieldError.test.js +71 -39
- package/dist/esm/v2/__tests__/FieldError.test.js.map +1 -1
- package/dist/esm/v2/__tests__/FieldNaming.test.js +160 -0
- package/dist/esm/v2/__tests__/FieldNaming.test.js.map +1 -0
- package/dist/esm/v2/__tests__/FieldWidth.test.js +146 -0
- package/dist/esm/v2/__tests__/FieldWidth.test.js.map +1 -0
- package/dist/esm/v2/__tests__/FileCard.test.js +18 -18
- package/dist/esm/v2/__tests__/FileCard.test.js.map +1 -1
- package/dist/esm/v2/__tests__/FormikCheckbox.test.js +173 -0
- package/dist/esm/v2/__tests__/FormikCheckbox.test.js.map +1 -0
- package/dist/esm/v2/__tests__/FormikDateTimePicker.test.js +236 -0
- package/dist/esm/v2/__tests__/FormikDateTimePicker.test.js.map +1 -0
- package/dist/esm/v2/__tests__/FormikDisplayWidth.test.js +101 -0
- package/dist/esm/v2/__tests__/FormikDisplayWidth.test.js.map +1 -0
- package/dist/esm/v2/__tests__/FormikRadioGroup.test.js +299 -0
- package/dist/esm/v2/__tests__/FormikRadioGroup.test.js.map +1 -0
- package/dist/esm/v2/__tests__/MobileRowCard.test.js +44 -43
- package/dist/esm/v2/__tests__/MobileRowCard.test.js.map +1 -1
- package/dist/esm/v2/__tests__/PreviewDrawer.test.js +165 -0
- package/dist/esm/v2/__tests__/PreviewDrawer.test.js.map +1 -0
- package/dist/esm/v2/__tests__/ReferentielFieldContainer.test.js +156 -0
- package/dist/esm/v2/__tests__/ReferentielFieldContainer.test.js.map +1 -0
- package/dist/esm/v2/__tests__/SectionErrorBoundary.test.js +37 -52
- package/dist/esm/v2/__tests__/SectionErrorBoundary.test.js.map +1 -1
- package/dist/esm/v2/__tests__/apiError.test.js +50 -69
- package/dist/esm/v2/__tests__/apiError.test.js.map +1 -1
- package/dist/esm/v2/__tests__/banned-patterns.test.js +41 -122
- package/dist/esm/v2/__tests__/banned-patterns.test.js.map +1 -1
- package/dist/esm/v2/__tests__/chart-palette.test.js +204 -0
- package/dist/esm/v2/__tests__/chart-palette.test.js.map +1 -0
- package/dist/esm/v2/__tests__/contrast-palette.test.js +42 -74
- package/dist/esm/v2/__tests__/contrast-palette.test.js.map +1 -1
- package/dist/esm/v2/__tests__/cssVariables.test.js +44 -51
- package/dist/esm/v2/__tests__/cssVariables.test.js.map +1 -1
- package/dist/esm/v2/__tests__/fileValidation.test.js +134 -0
- package/dist/esm/v2/__tests__/fileValidation.test.js.map +1 -0
- package/dist/esm/v2/__tests__/filterCriteria.test.js +321 -0
- package/dist/esm/v2/__tests__/filterCriteria.test.js.map +1 -0
- package/dist/esm/v2/__tests__/fmtDate.test.js +68 -0
- package/dist/esm/v2/__tests__/fmtDate.test.js.map +1 -0
- package/dist/esm/v2/__tests__/gap-leakage-refonte.test.js +218 -0
- package/dist/esm/v2/__tests__/gap-leakage-refonte.test.js.map +1 -0
- package/dist/esm/v2/__tests__/labels-merge.test.js +17 -22
- package/dist/esm/v2/__tests__/labels-merge.test.js.map +1 -1
- package/dist/esm/v2/__tests__/locale-fallback.test.js +35 -40
- package/dist/esm/v2/__tests__/locale-fallback.test.js.map +1 -1
- package/dist/esm/v2/__tests__/reviveSavedCriteria.test.js +143 -0
- package/dist/esm/v2/__tests__/reviveSavedCriteria.test.js.map +1 -0
- package/dist/esm/v2/__tests__/rowActions.test.js +182 -0
- package/dist/esm/v2/__tests__/rowActions.test.js.map +1 -0
- package/dist/esm/v2/__tests__/useFocusOnRouteChange.test.js +155 -0
- package/dist/esm/v2/__tests__/useFocusOnRouteChange.test.js.map +1 -0
- package/dist/esm/v2/__tests__/useFocusTrap.test.js +266 -402
- package/dist/esm/v2/__tests__/useFocusTrap.test.js.map +1 -1
- package/dist/esm/v2/__tests__/usePrefersReducedMotion.test.js +120 -0
- package/dist/esm/v2/__tests__/usePrefersReducedMotion.test.js.map +1 -0
- package/dist/esm/v2/components/Accordion.js +48 -70
- package/dist/esm/v2/components/Accordion.js.map +1 -1
- package/dist/esm/v2/components/ActionStrip.js +31 -43
- package/dist/esm/v2/components/ActionStrip.js.map +1 -1
- package/dist/esm/v2/components/Banner.js +25 -22
- package/dist/esm/v2/components/Banner.js.map +1 -1
- package/dist/esm/v2/components/Busy.js +14 -19
- package/dist/esm/v2/components/Busy.js.map +1 -1
- package/dist/esm/v2/components/Button.js +34 -45
- package/dist/esm/v2/components/Button.js.map +1 -1
- package/dist/esm/v2/components/CategoryTag.js +44 -27
- package/dist/esm/v2/components/CategoryTag.js.map +1 -1
- package/dist/esm/v2/components/Checkbox.js +32 -38
- package/dist/esm/v2/components/Checkbox.js.map +1 -1
- package/dist/esm/v2/components/Chip.js +23 -36
- package/dist/esm/v2/components/Chip.js.map +1 -1
- package/dist/esm/v2/components/Combobox.js +112 -136
- package/dist/esm/v2/components/Combobox.js.map +1 -1
- package/dist/esm/v2/components/CommandPalette.js +113 -198
- package/dist/esm/v2/components/CommandPalette.js.map +1 -1
- package/dist/esm/v2/components/ConfirmDialog.js +36 -45
- package/dist/esm/v2/components/ConfirmDialog.js.map +1 -1
- package/dist/esm/v2/components/DatePicker.js +78 -81
- package/dist/esm/v2/components/DatePicker.js.map +1 -1
- package/dist/esm/v2/components/DateRangePicker.js +63 -74
- package/dist/esm/v2/components/DateRangePicker.js.map +1 -1
- package/dist/esm/v2/components/DateTimePicker.js +118 -90
- package/dist/esm/v2/components/DateTimePicker.js.map +1 -1
- package/dist/esm/v2/components/Drawer.js +71 -65
- package/dist/esm/v2/components/Drawer.js.map +1 -1
- package/dist/esm/v2/components/Dropzone.js +130 -177
- package/dist/esm/v2/components/Dropzone.js.map +1 -1
- package/dist/esm/v2/components/EmptyState.js +9 -9
- package/dist/esm/v2/components/EmptyState.js.map +1 -1
- package/dist/esm/v2/components/FavoriteToggle.js +24 -33
- package/dist/esm/v2/components/FavoriteToggle.js.map +1 -1
- package/dist/esm/v2/components/Field.js +210 -52
- package/dist/esm/v2/components/Field.js.map +1 -1
- package/dist/esm/v2/components/FieldError.js +9 -13
- package/dist/esm/v2/components/FieldError.js.map +1 -1
- package/dist/esm/v2/components/FieldHelp.js +28 -49
- package/dist/esm/v2/components/FieldHelp.js.map +1 -1
- package/dist/esm/v2/components/FileCard.js +14 -19
- package/dist/esm/v2/components/FileCard.js.map +1 -1
- package/dist/esm/v2/components/FilterTab.js +22 -31
- package/dist/esm/v2/components/FilterTab.js.map +1 -1
- package/dist/esm/v2/components/ForbiddenPage.js +28 -8
- package/dist/esm/v2/components/ForbiddenPage.js.map +1 -1
- package/dist/esm/v2/components/FormGrid.js +48 -54
- package/dist/esm/v2/components/FormGrid.js.map +1 -1
- package/dist/esm/v2/components/FormikDisplay.js +98 -24
- package/dist/esm/v2/components/FormikDisplay.js.map +1 -1
- package/dist/esm/v2/components/Input.js +75 -34
- package/dist/esm/v2/components/Input.js.map +1 -1
- package/dist/esm/v2/components/KPICard.js +42 -51
- package/dist/esm/v2/components/KPICard.js.map +1 -1
- package/dist/esm/v2/components/KPIStrip.js +9 -15
- package/dist/esm/v2/components/KPIStrip.js.map +1 -1
- package/dist/esm/v2/components/KV.js +16 -23
- package/dist/esm/v2/components/KV.js.map +1 -1
- package/dist/esm/v2/components/KVGrid.js +15 -23
- package/dist/esm/v2/components/KVGrid.js.map +1 -1
- package/dist/esm/v2/components/Layout.js +81 -117
- package/dist/esm/v2/components/Layout.js.map +1 -1
- package/dist/esm/v2/components/MobileRowCard.js +64 -75
- package/dist/esm/v2/components/MobileRowCard.js.map +1 -1
- package/dist/esm/v2/components/Modal.js +44 -53
- package/dist/esm/v2/components/Modal.js.map +1 -1
- package/dist/esm/v2/components/NetworkErrorPage.js +28 -11
- package/dist/esm/v2/components/NetworkErrorPage.js.map +1 -1
- package/dist/esm/v2/components/NotFoundPage.js +28 -9
- package/dist/esm/v2/components/NotFoundPage.js.map +1 -1
- package/dist/esm/v2/components/NumberInput.js +77 -107
- package/dist/esm/v2/components/NumberInput.js.map +1 -1
- package/dist/esm/v2/components/OverflowMenu.js +24 -42
- package/dist/esm/v2/components/OverflowMenu.js.map +1 -1
- package/dist/esm/v2/components/PdfViewer.js +24 -33
- package/dist/esm/v2/components/PdfViewer.js.map +1 -1
- package/dist/esm/v2/components/ProgressBar.js +28 -36
- package/dist/esm/v2/components/ProgressBar.js.map +1 -1
- package/dist/esm/v2/components/Radio.js +49 -57
- package/dist/esm/v2/components/Radio.js.map +1 -1
- package/dist/esm/v2/components/SectionErrorBoundary.js +84 -130
- package/dist/esm/v2/components/SectionErrorBoundary.js.map +1 -1
- package/dist/esm/v2/components/SectionHeader.js +24 -31
- package/dist/esm/v2/components/SectionHeader.js.map +1 -1
- package/dist/esm/v2/components/Segmented.js +59 -84
- package/dist/esm/v2/components/Segmented.js.map +1 -1
- package/dist/esm/v2/components/Select.js +100 -138
- package/dist/esm/v2/components/Select.js.map +1 -1
- package/dist/esm/v2/components/ServerErrorPage.js +27 -10
- package/dist/esm/v2/components/ServerErrorPage.js.map +1 -1
- package/dist/esm/v2/components/Skeleton.js +81 -96
- package/dist/esm/v2/components/Skeleton.js.map +1 -1
- package/dist/esm/v2/components/SkipLink.js +6 -7
- package/dist/esm/v2/components/SkipLink.js.map +1 -1
- package/dist/esm/v2/components/Spinner.js +13 -22
- package/dist/esm/v2/components/Spinner.js.map +1 -1
- package/dist/esm/v2/components/Status.js +14 -25
- package/dist/esm/v2/components/Status.js.map +1 -1
- package/dist/esm/v2/components/Stepper.js +68 -71
- package/dist/esm/v2/components/Stepper.js.map +1 -1
- package/dist/esm/v2/components/Surface.js +25 -44
- package/dist/esm/v2/components/Surface.js.map +1 -1
- package/dist/esm/v2/components/Switch.js +21 -29
- package/dist/esm/v2/components/Switch.js.map +1 -1
- package/dist/esm/v2/components/TabPanel.js +84 -0
- package/dist/esm/v2/components/TabPanel.js.map +1 -0
- package/dist/esm/v2/components/Tabs.js +43 -19
- package/dist/esm/v2/components/Tabs.js.map +1 -1
- package/dist/esm/v2/components/TelInput.js +75 -108
- package/dist/esm/v2/components/TelInput.js.map +1 -1
- package/dist/esm/v2/components/Textarea.js +21 -30
- package/dist/esm/v2/components/Textarea.js.map +1 -1
- package/dist/esm/v2/components/TimePicker.js +59 -69
- package/dist/esm/v2/components/TimePicker.js.map +1 -1
- package/dist/esm/v2/components/Toast.js +109 -163
- package/dist/esm/v2/components/Toast.js.map +1 -1
- package/dist/esm/v2/components/Tooltip.js +18 -31
- package/dist/esm/v2/components/Tooltip.js.map +1 -1
- package/dist/esm/v2/components/_ErrorPageBody.js +6 -5
- package/dist/esm/v2/components/_ErrorPageBody.js.map +1 -1
- package/dist/esm/v2/components/_pickerShared.js +2 -2
- package/dist/esm/v2/components/_pickerShared.js.map +1 -1
- package/dist/esm/v2/components/index.js +64 -0
- package/dist/esm/v2/components/index.js.map +1 -1
- package/dist/esm/v2/hooks/index.js +62 -0
- package/dist/esm/v2/hooks/index.js.map +1 -1
- package/dist/esm/v2/hooks/useAppliedFilters.js +112 -0
- package/dist/esm/v2/hooks/useAppliedFilters.js.map +1 -0
- package/dist/esm/v2/hooks/useDebouncedCallback.js +82 -0
- package/dist/esm/v2/hooks/useDebouncedCallback.js.map +1 -0
- package/dist/esm/v2/hooks/useDelayedFlag.js +5 -19
- package/dist/esm/v2/hooks/useDelayedFlag.js.map +1 -1
- package/dist/esm/v2/hooks/useDensity.js +13 -17
- package/dist/esm/v2/hooks/useDensity.js.map +1 -1
- package/dist/esm/v2/hooks/useFocusFirstError.js +25 -33
- package/dist/esm/v2/hooks/useFocusFirstError.js.map +1 -1
- package/dist/esm/v2/hooks/useFocusOnRouteChange.js +81 -0
- package/dist/esm/v2/hooks/useFocusOnRouteChange.js.map +1 -0
- package/dist/esm/v2/hooks/useFocusTrap.js +19 -23
- package/dist/esm/v2/hooks/useFocusTrap.js.map +1 -1
- package/dist/esm/v2/hooks/useFormAutoSave.js +38 -53
- package/dist/esm/v2/hooks/useFormAutoSave.js.map +1 -1
- package/dist/esm/v2/hooks/useFormCompletionProgress.js +32 -51
- package/dist/esm/v2/hooks/useFormCompletionProgress.js.map +1 -1
- package/dist/esm/v2/hooks/useKeyboardShortcuts.js +125 -0
- package/dist/esm/v2/hooks/useKeyboardShortcuts.js.map +1 -0
- package/dist/esm/v2/hooks/usePrefersReducedMotion.js +99 -0
- package/dist/esm/v2/hooks/usePrefersReducedMotion.js.map +1 -0
- package/dist/esm/v2/hooks/useResolvedDensity.js +2 -10
- package/dist/esm/v2/hooks/useResolvedDensity.js.map +1 -1
- package/dist/esm/v2/hooks/useSortedRows.js +3 -5
- package/dist/esm/v2/hooks/useSortedRows.js.map +1 -1
- package/dist/esm/v2/hooks/useTabLoading.js +6 -21
- package/dist/esm/v2/hooks/useTabLoading.js.map +1 -1
- package/dist/esm/v2/index.js +14 -4
- package/dist/esm/v2/index.js.map +1 -1
- package/dist/esm/v2/modalContext.js +2 -2
- package/dist/esm/v2/modalContext.js.map +1 -1
- package/dist/esm/v2/models/favorite.js.map +1 -1
- package/dist/esm/v2/models/personalization.js.map +1 -1
- package/dist/esm/v2/models/referentiel.js.map +1 -1
- package/dist/esm/v2/models/savedFilter.js.map +1 -1
- package/dist/esm/v2/patterns/ActionBar.js +115 -159
- package/dist/esm/v2/patterns/ActionBar.js.map +1 -1
- package/dist/esm/v2/patterns/AppMain.js +108 -0
- package/dist/esm/v2/patterns/AppMain.js.map +1 -0
- package/dist/esm/v2/patterns/BulkActionBar.js +31 -34
- package/dist/esm/v2/patterns/BulkActionBar.js.map +1 -1
- package/dist/esm/v2/patterns/ChartFigure.js +151 -0
- package/dist/esm/v2/patterns/ChartFigure.js.map +1 -0
- package/dist/esm/v2/patterns/CollapsibleDataGrid.js +111 -152
- package/dist/esm/v2/patterns/CollapsibleDataGrid.js.map +1 -1
- package/dist/esm/v2/patterns/ColumnsToggle.js +43 -77
- package/dist/esm/v2/patterns/ColumnsToggle.js.map +1 -1
- package/dist/esm/v2/patterns/DataGrid.js +221 -255
- package/dist/esm/v2/patterns/DataGrid.js.map +1 -1
- package/dist/esm/v2/patterns/DataGridSettingsMenu.js +76 -94
- package/dist/esm/v2/patterns/DataGridSettingsMenu.js.map +1 -1
- package/dist/esm/v2/patterns/DataGridToolbar.js +85 -89
- package/dist/esm/v2/patterns/DataGridToolbar.js.map +1 -1
- package/dist/esm/v2/patterns/DataGridVirtualized.js +141 -182
- package/dist/esm/v2/patterns/DataGridVirtualized.js.map +1 -1
- package/dist/esm/v2/patterns/DeleteResourceConfirmDialog.js +26 -30
- package/dist/esm/v2/patterns/DeleteResourceConfirmDialog.js.map +1 -1
- package/dist/esm/v2/patterns/DetailSplit.js +108 -0
- package/dist/esm/v2/patterns/DetailSplit.js.map +1 -0
- package/dist/esm/v2/patterns/FavoriteColumn.js +26 -75
- package/dist/esm/v2/patterns/FavoriteColumn.js.map +1 -1
- package/dist/esm/v2/patterns/FavoritesFilter.js +30 -39
- package/dist/esm/v2/patterns/FavoritesFilter.js.map +1 -1
- package/dist/esm/v2/patterns/FilterTabBar.js +112 -0
- package/dist/esm/v2/patterns/FilterTabBar.js.map +1 -0
- package/dist/esm/v2/patterns/FormErrorSummary.js +12 -13
- package/dist/esm/v2/patterns/FormErrorSummary.js.map +1 -1
- package/dist/esm/v2/patterns/FormPageShell.js +43 -41
- package/dist/esm/v2/patterns/FormPageShell.js.map +1 -1
- package/dist/esm/v2/patterns/FormSection.js +30 -38
- package/dist/esm/v2/patterns/FormSection.js.map +1 -1
- package/dist/esm/v2/patterns/FormikCheckbox.js +130 -0
- package/dist/esm/v2/patterns/FormikCheckbox.js.map +1 -0
- package/dist/esm/v2/patterns/FormikCheckboxGroup.js +56 -60
- package/dist/esm/v2/patterns/FormikCheckboxGroup.js.map +1 -1
- package/dist/esm/v2/patterns/FormikCombobox.js +51 -66
- package/dist/esm/v2/patterns/FormikCombobox.js.map +1 -1
- package/dist/esm/v2/patterns/FormikDatePicker.js +51 -99
- package/dist/esm/v2/patterns/FormikDatePicker.js.map +1 -1
- package/dist/esm/v2/patterns/FormikDateTimePicker.js +136 -0
- package/dist/esm/v2/patterns/FormikDateTimePicker.js.map +1 -0
- package/dist/esm/v2/patterns/FormikErrorFocus.js +22 -23
- package/dist/esm/v2/patterns/FormikErrorFocus.js.map +1 -1
- package/dist/esm/v2/patterns/FormikErrorSummary.js +89 -0
- package/dist/esm/v2/patterns/FormikErrorSummary.js.map +1 -0
- package/dist/esm/v2/patterns/FormikFile.js +94 -78
- package/dist/esm/v2/patterns/FormikFile.js.map +1 -1
- package/dist/esm/v2/patterns/FormikInput.js +40 -50
- package/dist/esm/v2/patterns/FormikInput.js.map +1 -1
- package/dist/esm/v2/patterns/FormikRadioGroup.js +129 -0
- package/dist/esm/v2/patterns/FormikRadioGroup.js.map +1 -0
- package/dist/esm/v2/patterns/FormikReferentielField.js +49 -59
- package/dist/esm/v2/patterns/FormikReferentielField.js.map +1 -1
- package/dist/esm/v2/patterns/FormikSelect.js +64 -84
- package/dist/esm/v2/patterns/FormikSelect.js.map +1 -1
- package/dist/esm/v2/patterns/FormikTextarea.js +30 -43
- package/dist/esm/v2/patterns/FormikTextarea.js.map +1 -1
- package/dist/esm/v2/patterns/KeyboardShortcutsHelp.js +64 -65
- package/dist/esm/v2/patterns/KeyboardShortcutsHelp.js.map +1 -1
- package/dist/esm/v2/patterns/NetworkErrorBanner.js +6 -7
- package/dist/esm/v2/patterns/NetworkErrorBanner.js.map +1 -1
- package/dist/esm/v2/patterns/PageContent.js +10 -14
- package/dist/esm/v2/patterns/PageContent.js.map +1 -1
- package/dist/esm/v2/patterns/PreviewDrawer.js +153 -0
- package/dist/esm/v2/patterns/PreviewDrawer.js.map +1 -0
- package/dist/esm/v2/patterns/ReferentielField.js +327 -312
- package/dist/esm/v2/patterns/ReferentielField.js.map +1 -1
- package/dist/esm/v2/patterns/RowFavoriteToggle.js +127 -0
- package/dist/esm/v2/patterns/RowFavoriteToggle.js.map +1 -0
- package/dist/esm/v2/patterns/SaveFilterDialog.js +38 -66
- package/dist/esm/v2/patterns/SaveFilterDialog.js.map +1 -1
- package/dist/esm/v2/patterns/SavedFiltersMenu.js +62 -81
- package/dist/esm/v2/patterns/SavedFiltersMenu.js.map +1 -1
- package/dist/esm/v2/patterns/SkeletonPageShell.js +106 -129
- package/dist/esm/v2/patterns/SkeletonPageShell.js.map +1 -1
- package/dist/esm/v2/patterns/SortableHeader.js +22 -45
- package/dist/esm/v2/patterns/SortableHeader.js.map +1 -1
- package/dist/esm/v2/patterns/Tour.js +94 -120
- package/dist/esm/v2/patterns/Tour.js.map +1 -1
- package/dist/esm/v2/patterns/_dataGridShared.js +107 -128
- package/dist/esm/v2/patterns/_dataGridShared.js.map +1 -1
- package/dist/esm/v2/patterns/_pickerSerialisation.js +72 -0
- package/dist/esm/v2/patterns/_pickerSerialisation.js.map +1 -0
- package/dist/esm/v2/patterns/_sort.js +17 -33
- package/dist/esm/v2/patterns/_sort.js.map +1 -1
- package/dist/esm/v2/patterns/_useColumnReorder.js +122 -160
- package/dist/esm/v2/patterns/_useColumnReorder.js.map +1 -1
- package/dist/esm/v2/patterns/_useColumnResize.js +78 -96
- package/dist/esm/v2/patterns/_useColumnResize.js.map +1 -1
- package/dist/esm/v2/patterns/filterCriteria.js +102 -0
- package/dist/esm/v2/patterns/filterCriteria.js.map +1 -0
- package/dist/esm/v2/patterns/index.js +235 -0
- package/dist/esm/v2/patterns/index.js.map +1 -1
- package/dist/esm/v2/patterns/rowActions.js +223 -0
- package/dist/esm/v2/patterns/rowActions.js.map +1 -0
- package/dist/esm/v2/personalization/PersonalizationProvider.js +50 -47
- package/dist/esm/v2/personalization/PersonalizationProvider.js.map +1 -1
- package/dist/esm/v2/personalization/adapters/_storageKey.js +5 -5
- package/dist/esm/v2/personalization/adapters/_storageKey.js.map +1 -1
- package/dist/esm/v2/personalization/adapters/createLocalStorageAdapter.js +22 -23
- package/dist/esm/v2/personalization/adapters/createLocalStorageAdapter.js.map +1 -1
- package/dist/esm/v2/personalization/adapters/createMemoryAdapter.js +13 -13
- package/dist/esm/v2/personalization/adapters/createMemoryAdapter.js.map +1 -1
- package/dist/esm/v2/personalization/capabilities/favorites.js +36 -60
- package/dist/esm/v2/personalization/capabilities/favorites.js.map +1 -1
- package/dist/esm/v2/personalization/capabilities/favoritesView.js +22 -34
- package/dist/esm/v2/personalization/capabilities/favoritesView.js.map +1 -1
- package/dist/esm/v2/personalization/capabilities/gridPreferences.js +203 -0
- package/dist/esm/v2/personalization/capabilities/gridPreferences.js.map +1 -0
- package/dist/esm/v2/personalization/capabilities/index.js +5 -0
- package/dist/esm/v2/personalization/capabilities/index.js.map +1 -1
- package/dist/esm/v2/personalization/capabilities/reviveSavedCriteria.js +119 -0
- package/dist/esm/v2/personalization/capabilities/reviveSavedCriteria.js.map +1 -0
- package/dist/esm/v2/personalization/capabilities/savedFilters.js +90 -98
- package/dist/esm/v2/personalization/capabilities/savedFilters.js.map +1 -1
- package/dist/esm/v2/personalization/createPersonalizationStore.js +78 -181
- package/dist/esm/v2/personalization/createPersonalizationStore.js.map +1 -1
- package/dist/esm/v2/personalization/index.js +35 -0
- package/dist/esm/v2/personalization/index.js.map +1 -1
- package/dist/esm/v2/personalization/personalizationContext.js +9 -9
- package/dist/esm/v2/personalization/personalizationContext.js.map +1 -1
- package/dist/esm/v2/personalization/schema.js +8 -9
- package/dist/esm/v2/personalization/schema.js.map +1 -1
- package/dist/esm/v2/referentiel/ReferentielProvider.js +27 -42
- package/dist/esm/v2/referentiel/ReferentielProvider.js.map +1 -1
- package/dist/esm/v2/referentiel/types.js +2 -0
- package/dist/esm/v2/referentiel/types.js.map +1 -0
- package/dist/esm/v2/referentiel/useReferentielClient.js +10 -11
- package/dist/esm/v2/referentiel/useReferentielClient.js.map +1 -1
- package/dist/esm/v2/referentiel/useReferentielOptions.js +60 -117
- package/dist/esm/v2/referentiel/useReferentielOptions.js.map +1 -1
- package/dist/esm/v2/referentiel/useReferentielSearch.js +37 -91
- package/dist/esm/v2/referentiel/useReferentielSearch.js.map +1 -1
- package/dist/esm/v2/theme/_brand.js +8 -24
- package/dist/esm/v2/theme/_brand.js.map +1 -1
- package/dist/esm/v2/theme/_brandSecondary.js +8 -24
- package/dist/esm/v2/theme/_brandSecondary.js.map +1 -1
- package/dist/esm/v2/theme/createPortnetTheme.js +51 -61
- package/dist/esm/v2/theme/createPortnetTheme.js.map +1 -1
- package/dist/esm/v2/theme/cssVariables.js +62 -69
- package/dist/esm/v2/theme/cssVariables.js.map +1 -1
- package/dist/esm/v2/theme/index.js +5 -5
- package/dist/esm/v2/theme/index.js.map +1 -1
- package/dist/esm/v2/tokens/breakpoints.js +14 -14
- package/dist/esm/v2/tokens/breakpoints.js.map +1 -1
- package/dist/esm/v2/tokens/chart.js +261 -0
- package/dist/esm/v2/tokens/chart.js.map +1 -0
- package/dist/esm/v2/tokens/colors.js +22 -22
- package/dist/esm/v2/tokens/colors.js.map +1 -1
- package/dist/esm/v2/tokens/density.js +62 -7
- package/dist/esm/v2/tokens/density.js.map +1 -1
- package/dist/esm/v2/tokens/index.js +49 -34
- package/dist/esm/v2/tokens/index.js.map +1 -1
- package/dist/esm/v2/tokens/motion.js +12 -20
- package/dist/esm/v2/tokens/motion.js.map +1 -1
- package/dist/esm/v2/tokens/radius.js +1 -1
- package/dist/esm/v2/tokens/radius.js.map +1 -1
- package/dist/esm/v2/tokens/shadows.js +6 -6
- package/dist/esm/v2/tokens/shadows.js.map +1 -1
- package/dist/esm/v2/tokens/spacing.js +2 -2
- package/dist/esm/v2/tokens/spacing.js.map +1 -1
- package/dist/esm/v2/tokens/state.js +1 -1
- package/dist/esm/v2/tokens/state.js.map +1 -1
- package/dist/esm/v2/tokens/statusPalette.js +17 -21
- package/dist/esm/v2/tokens/statusPalette.js.map +1 -1
- package/dist/esm/v2/tokens/tokens.json +6 -1
- package/dist/esm/v2/tokens/typography.js +13 -13
- package/dist/esm/v2/tokens/typography.js.map +1 -1
- package/dist/esm/v2/tokens/zIndex.js +1 -1
- package/dist/esm/v2/tokens/zIndex.js.map +1 -1
- package/dist/esm/v2/types/datagrid.js.map +1 -1
- package/dist/esm/v2/utils/apiError.js +16 -37
- package/dist/esm/v2/utils/apiError.js.map +1 -1
- package/dist/esm/v2/utils/contrast.js +31 -32
- package/dist/esm/v2/utils/contrast.js.map +1 -1
- package/dist/esm/v2/utils/cx.js +5 -25
- package/dist/esm/v2/utils/cx.js.map +1 -1
- package/dist/esm/v2/utils/fileDownload.js +23 -26
- package/dist/esm/v2/utils/fileDownload.js.map +1 -1
- package/dist/esm/v2/utils/fileValidation.js +209 -0
- package/dist/esm/v2/utils/fileValidation.js.map +1 -0
- package/dist/esm/v2/utils/fmtDate.js +111 -0
- package/dist/esm/v2/utils/fmtDate.js.map +1 -0
- package/dist/esm/v2/utils/fmtMoney.js +8 -10
- package/dist/esm/v2/utils/fmtMoney.js.map +1 -1
- package/dist/esm/v2/utils/formikErrors.js +78 -0
- package/dist/esm/v2/utils/formikErrors.js.map +1 -0
- package/dist/esm/v2/utils/index.js +35 -2
- package/dist/esm/v2/utils/index.js.map +1 -1
- package/dist/esm/v2/utils/mergeLabels.js +7 -12
- package/dist/esm/v2/utils/mergeLabels.js.map +1 -1
- package/dist/esm/v2/utils/networkStatus.js +12 -12
- package/dist/esm/v2/utils/networkStatus.js.map +1 -1
- package/dist/index.d.ts +9 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +122 -47
- package/dist/index.js.map +1 -1
- package/dist/v2/__tests__/AppMain.test.js +133 -0
- package/dist/v2/__tests__/AppMain.test.js.map +1 -0
- package/dist/v2/__tests__/ChartFigure.test.js +183 -0
- package/dist/v2/__tests__/ChartFigure.test.js.map +1 -0
- package/dist/v2/__tests__/DataGridRowActionsPropagation.test.js +153 -0
- package/dist/v2/__tests__/DataGridRowActionsPropagation.test.js.map +1 -0
- package/dist/v2/__tests__/DrawerTactileTargets.test.js +94 -0
- package/dist/v2/__tests__/DrawerTactileTargets.test.js.map +1 -0
- package/dist/v2/__tests__/FieldError.test.js +98 -69
- package/dist/v2/__tests__/FieldError.test.js.map +1 -1
- package/dist/v2/__tests__/FieldNaming.test.js +161 -0
- package/dist/v2/__tests__/FieldNaming.test.js.map +1 -0
- package/dist/v2/__tests__/FieldWidth.test.js +148 -0
- package/dist/v2/__tests__/FieldWidth.test.js.map +1 -0
- package/dist/v2/__tests__/FileCard.test.js +45 -48
- package/dist/v2/__tests__/FileCard.test.js.map +1 -1
- package/dist/v2/__tests__/FormikCheckbox.test.js +175 -0
- package/dist/v2/__tests__/FormikCheckbox.test.js.map +1 -0
- package/dist/v2/__tests__/FormikDateTimePicker.test.js +237 -0
- package/dist/v2/__tests__/FormikDateTimePicker.test.js.map +1 -0
- package/dist/v2/__tests__/FormikDisplayWidth.test.js +102 -0
- package/dist/v2/__tests__/FormikDisplayWidth.test.js.map +1 -0
- package/dist/v2/__tests__/FormikRadioGroup.test.js +300 -0
- package/dist/v2/__tests__/FormikRadioGroup.test.js.map +1 -0
- package/dist/v2/__tests__/MobileRowCard.test.js +100 -102
- package/dist/v2/__tests__/MobileRowCard.test.js.map +1 -1
- package/dist/v2/__tests__/PreviewDrawer.test.js +169 -0
- package/dist/v2/__tests__/PreviewDrawer.test.js.map +1 -0
- package/dist/v2/__tests__/ReferentielFieldContainer.test.js +159 -0
- package/dist/v2/__tests__/ReferentielFieldContainer.test.js.map +1 -0
- package/dist/v2/__tests__/SectionErrorBoundary.test.js +53 -68
- package/dist/v2/__tests__/SectionErrorBoundary.test.js.map +1 -1
- package/dist/v2/__tests__/apiError.test.js +50 -69
- package/dist/v2/__tests__/apiError.test.js.map +1 -1
- package/dist/v2/__tests__/banned-patterns.test.js +42 -123
- package/dist/v2/__tests__/banned-patterns.test.js.map +1 -1
- package/dist/v2/__tests__/chart-palette.test.js +205 -0
- package/dist/v2/__tests__/chart-palette.test.js.map +1 -0
- package/dist/v2/__tests__/contrast-palette.test.js +42 -74
- package/dist/v2/__tests__/contrast-palette.test.js.map +1 -1
- package/dist/v2/__tests__/cssVariables.test.js +44 -51
- package/dist/v2/__tests__/cssVariables.test.js.map +1 -1
- package/dist/v2/__tests__/fileValidation.test.js +136 -0
- package/dist/v2/__tests__/fileValidation.test.js.map +1 -0
- package/dist/v2/__tests__/filterCriteria.test.js +324 -0
- package/dist/v2/__tests__/filterCriteria.test.js.map +1 -0
- package/dist/v2/__tests__/fmtDate.test.js +69 -0
- package/dist/v2/__tests__/fmtDate.test.js.map +1 -0
- package/dist/v2/__tests__/gap-leakage-refonte.test.js +221 -0
- package/dist/v2/__tests__/gap-leakage-refonte.test.js.map +1 -0
- package/dist/v2/__tests__/labels-merge.test.js +38 -46
- package/dist/v2/__tests__/labels-merge.test.js.map +1 -1
- package/dist/v2/__tests__/locale-fallback.test.js +47 -52
- package/dist/v2/__tests__/locale-fallback.test.js.map +1 -1
- package/dist/v2/__tests__/reviveSavedCriteria.test.js +144 -0
- package/dist/v2/__tests__/reviveSavedCriteria.test.js.map +1 -0
- package/dist/v2/__tests__/rowActions.test.js +186 -0
- package/dist/v2/__tests__/rowActions.test.js.map +1 -0
- package/dist/v2/__tests__/useFocusOnRouteChange.test.js +156 -0
- package/dist/v2/__tests__/useFocusOnRouteChange.test.js.map +1 -0
- package/dist/v2/__tests__/useFocusTrap.test.js +270 -407
- package/dist/v2/__tests__/useFocusTrap.test.js.map +1 -1
- package/dist/v2/__tests__/usePrefersReducedMotion.test.js +123 -0
- package/dist/v2/__tests__/usePrefersReducedMotion.test.js.map +1 -0
- package/dist/v2/components/Accordion.js +60 -82
- package/dist/v2/components/Accordion.js.map +1 -1
- package/dist/v2/components/ActionStrip.js +40 -52
- package/dist/v2/components/ActionStrip.js.map +1 -1
- package/dist/v2/components/Banner.js +42 -41
- package/dist/v2/components/Banner.js.map +1 -1
- package/dist/v2/components/Busy.js +22 -27
- package/dist/v2/components/Busy.js.map +1 -1
- package/dist/v2/components/Button.js +39 -50
- package/dist/v2/components/Button.js.map +1 -1
- package/dist/v2/components/CategoryTag.d.ts.map +1 -1
- package/dist/v2/components/CategoryTag.js +49 -32
- package/dist/v2/components/CategoryTag.js.map +1 -1
- package/dist/v2/components/Checkbox.js +39 -45
- package/dist/v2/components/Checkbox.js.map +1 -1
- package/dist/v2/components/Chip.js +29 -42
- package/dist/v2/components/Chip.js.map +1 -1
- package/dist/v2/components/Combobox.js +122 -144
- package/dist/v2/components/Combobox.js.map +1 -1
- package/dist/v2/components/CommandPalette.js +138 -225
- package/dist/v2/components/CommandPalette.js.map +1 -1
- package/dist/v2/components/ConfirmDialog.js +46 -56
- package/dist/v2/components/ConfirmDialog.js.map +1 -1
- package/dist/v2/components/DatePicker.js +81 -86
- package/dist/v2/components/DatePicker.js.map +1 -1
- package/dist/v2/components/DateRangePicker.js +77 -87
- package/dist/v2/components/DateRangePicker.js.map +1 -1
- package/dist/v2/components/DateTimePicker.d.ts.map +1 -1
- package/dist/v2/components/DateTimePicker.js +121 -95
- package/dist/v2/components/DateTimePicker.js.map +1 -1
- package/dist/v2/components/Drawer.d.ts.map +1 -1
- package/dist/v2/components/Drawer.js +93 -88
- package/dist/v2/components/Drawer.js.map +1 -1
- package/dist/v2/components/Dropzone.js +150 -196
- package/dist/v2/components/Dropzone.js.map +1 -1
- package/dist/v2/components/EmptyState.js +18 -20
- package/dist/v2/components/EmptyState.js.map +1 -1
- package/dist/v2/components/FavoriteToggle.js +28 -39
- package/dist/v2/components/FavoriteToggle.js.map +1 -1
- package/dist/v2/components/Field.d.ts +121 -5
- package/dist/v2/components/Field.d.ts.map +1 -1
- package/dist/v2/components/Field.js +221 -62
- package/dist/v2/components/Field.js.map +1 -1
- package/dist/v2/components/FieldError.js +18 -21
- package/dist/v2/components/FieldError.js.map +1 -1
- package/dist/v2/components/FieldHelp.js +40 -60
- package/dist/v2/components/FieldHelp.js.map +1 -1
- package/dist/v2/components/FileCard.js +27 -31
- package/dist/v2/components/FileCard.js.map +1 -1
- package/dist/v2/components/FilterTab.js +30 -38
- package/dist/v2/components/FilterTab.js.map +1 -1
- package/dist/v2/components/ForbiddenPage.d.ts +25 -1
- package/dist/v2/components/ForbiddenPage.d.ts.map +1 -1
- package/dist/v2/components/ForbiddenPage.js +37 -17
- package/dist/v2/components/ForbiddenPage.js.map +1 -1
- package/dist/v2/components/FormGrid.js +53 -59
- package/dist/v2/components/FormGrid.js.map +1 -1
- package/dist/v2/components/FormikDisplay.d.ts +50 -1
- package/dist/v2/components/FormikDisplay.d.ts.map +1 -1
- package/dist/v2/components/FormikDisplay.js +108 -33
- package/dist/v2/components/FormikDisplay.js.map +1 -1
- package/dist/v2/components/Input.d.ts +40 -0
- package/dist/v2/components/Input.d.ts.map +1 -1
- package/dist/v2/components/Input.js +81 -41
- package/dist/v2/components/Input.js.map +1 -1
- package/dist/v2/components/KPICard.js +57 -67
- package/dist/v2/components/KPICard.js.map +1 -1
- package/dist/v2/components/KPIStrip.js +16 -22
- package/dist/v2/components/KPIStrip.js.map +1 -1
- package/dist/v2/components/KV.js +25 -31
- package/dist/v2/components/KV.js.map +1 -1
- package/dist/v2/components/KVGrid.js +19 -26
- package/dist/v2/components/KVGrid.js.map +1 -1
- package/dist/v2/components/Layout.js +91 -120
- package/dist/v2/components/Layout.js.map +1 -1
- package/dist/v2/components/MobileRowCard.js +79 -91
- package/dist/v2/components/MobileRowCard.js.map +1 -1
- package/dist/v2/components/Modal.js +61 -69
- package/dist/v2/components/Modal.js.map +1 -1
- package/dist/v2/components/NetworkErrorPage.d.ts +19 -1
- package/dist/v2/components/NetworkErrorPage.d.ts.map +1 -1
- package/dist/v2/components/NetworkErrorPage.js +38 -21
- package/dist/v2/components/NetworkErrorPage.js.map +1 -1
- package/dist/v2/components/NotFoundPage.d.ts +17 -1
- package/dist/v2/components/NotFoundPage.d.ts.map +1 -1
- package/dist/v2/components/NotFoundPage.js +37 -18
- package/dist/v2/components/NotFoundPage.js.map +1 -1
- package/dist/v2/components/NumberInput.js +88 -118
- package/dist/v2/components/NumberInput.js.map +1 -1
- package/dist/v2/components/OverflowMenu.js +38 -56
- package/dist/v2/components/OverflowMenu.js.map +1 -1
- package/dist/v2/components/PdfViewer.js +34 -45
- package/dist/v2/components/PdfViewer.js.map +1 -1
- package/dist/v2/components/ProgressBar.js +42 -49
- package/dist/v2/components/ProgressBar.js.map +1 -1
- package/dist/v2/components/Radio.js +59 -67
- package/dist/v2/components/Radio.js.map +1 -1
- package/dist/v2/components/SectionErrorBoundary.js +90 -135
- package/dist/v2/components/SectionErrorBoundary.js.map +1 -1
- package/dist/v2/components/SectionHeader.js +34 -41
- package/dist/v2/components/SectionHeader.js.map +1 -1
- package/dist/v2/components/Segmented.js +69 -93
- package/dist/v2/components/Segmented.js.map +1 -1
- package/dist/v2/components/Select.d.ts +26 -2
- package/dist/v2/components/Select.d.ts.map +1 -1
- package/dist/v2/components/Select.js +120 -155
- package/dist/v2/components/Select.js.map +1 -1
- package/dist/v2/components/ServerErrorPage.d.ts +27 -1
- package/dist/v2/components/ServerErrorPage.d.ts.map +1 -1
- package/dist/v2/components/ServerErrorPage.js +37 -20
- package/dist/v2/components/ServerErrorPage.js.map +1 -1
- package/dist/v2/components/Skeleton.js +86 -100
- package/dist/v2/components/Skeleton.js.map +1 -1
- package/dist/v2/components/SkipLink.js +9 -12
- package/dist/v2/components/SkipLink.js.map +1 -1
- package/dist/v2/components/Spinner.js +16 -25
- package/dist/v2/components/Spinner.js.map +1 -1
- package/dist/v2/components/Status.js +18 -29
- package/dist/v2/components/Status.js.map +1 -1
- package/dist/v2/components/Stepper.js +80 -82
- package/dist/v2/components/Stepper.js.map +1 -1
- package/dist/v2/components/Surface.js +34 -49
- package/dist/v2/components/Surface.js.map +1 -1
- package/dist/v2/components/Switch.js +29 -37
- package/dist/v2/components/Switch.js.map +1 -1
- package/dist/v2/components/TabPanel.d.ts +17 -0
- package/dist/v2/components/TabPanel.d.ts.map +1 -0
- package/dist/v2/components/TabPanel.js +90 -0
- package/dist/v2/components/TabPanel.js.map +1 -0
- package/dist/v2/components/Tabs.d.ts +25 -0
- package/dist/v2/components/Tabs.d.ts.map +1 -1
- package/dist/v2/components/Tabs.js +53 -29
- package/dist/v2/components/Tabs.js.map +1 -1
- package/dist/v2/components/TelInput.js +80 -115
- package/dist/v2/components/TelInput.js.map +1 -1
- package/dist/v2/components/Textarea.js +26 -35
- package/dist/v2/components/Textarea.js.map +1 -1
- package/dist/v2/components/TimePicker.js +62 -74
- package/dist/v2/components/TimePicker.js.map +1 -1
- package/dist/v2/components/Toast.js +119 -174
- package/dist/v2/components/Toast.js.map +1 -1
- package/dist/v2/components/Tooltip.js +23 -38
- package/dist/v2/components/Tooltip.js.map +1 -1
- package/dist/v2/components/_ErrorPageBody.js +15 -16
- package/dist/v2/components/_ErrorPageBody.js.map +1 -1
- package/dist/v2/components/_pickerShared.js +5 -5
- package/dist/v2/components/_pickerShared.js.map +1 -1
- package/dist/v2/components/index.d.ts +67 -1
- package/dist/v2/components/index.d.ts.map +1 -1
- package/dist/v2/components/index.js +153 -136
- package/dist/v2/components/index.js.map +1 -1
- package/dist/v2/hooks/index.d.ts +65 -0
- package/dist/v2/hooks/index.d.ts.map +1 -1
- package/dist/v2/hooks/index.js +63 -24
- package/dist/v2/hooks/index.js.map +1 -1
- package/dist/v2/hooks/useAppliedFilters.d.ts +102 -0
- package/dist/v2/hooks/useAppliedFilters.d.ts.map +1 -0
- package/dist/v2/hooks/useAppliedFilters.js +117 -0
- package/dist/v2/hooks/useAppliedFilters.js.map +1 -0
- package/dist/v2/hooks/useDebouncedCallback.d.ts +64 -0
- package/dist/v2/hooks/useDebouncedCallback.d.ts.map +1 -0
- package/dist/v2/hooks/useDebouncedCallback.js +87 -0
- package/dist/v2/hooks/useDebouncedCallback.js.map +1 -0
- package/dist/v2/hooks/useDelayedFlag.js +6 -20
- package/dist/v2/hooks/useDelayedFlag.js.map +1 -1
- package/dist/v2/hooks/useDensity.d.ts.map +1 -1
- package/dist/v2/hooks/useDensity.js +14 -18
- package/dist/v2/hooks/useDensity.js.map +1 -1
- package/dist/v2/hooks/useFocusFirstError.js +26 -34
- package/dist/v2/hooks/useFocusFirstError.js.map +1 -1
- package/dist/v2/hooks/useFocusOnRouteChange.d.ts +65 -0
- package/dist/v2/hooks/useFocusOnRouteChange.d.ts.map +1 -0
- package/dist/v2/hooks/useFocusOnRouteChange.js +88 -0
- package/dist/v2/hooks/useFocusOnRouteChange.js.map +1 -0
- package/dist/v2/hooks/useFocusTrap.js +20 -24
- package/dist/v2/hooks/useFocusTrap.js.map +1 -1
- package/dist/v2/hooks/useFormAutoSave.d.ts +4 -4
- package/dist/v2/hooks/useFormAutoSave.d.ts.map +1 -1
- package/dist/v2/hooks/useFormAutoSave.js +39 -54
- package/dist/v2/hooks/useFormAutoSave.js.map +1 -1
- package/dist/v2/hooks/useFormCompletionProgress.d.ts +1 -1
- package/dist/v2/hooks/useFormCompletionProgress.d.ts.map +1 -1
- package/dist/v2/hooks/useFormCompletionProgress.js +33 -52
- package/dist/v2/hooks/useFormCompletionProgress.js.map +1 -1
- package/dist/v2/hooks/useKeyboardShortcuts.d.ts +25 -0
- package/dist/v2/hooks/useKeyboardShortcuts.d.ts.map +1 -0
- package/dist/v2/hooks/useKeyboardShortcuts.js +132 -0
- package/dist/v2/hooks/useKeyboardShortcuts.js.map +1 -0
- package/dist/v2/hooks/usePrefersReducedMotion.d.ts +56 -0
- package/dist/v2/hooks/usePrefersReducedMotion.d.ts.map +1 -0
- package/dist/v2/hooks/usePrefersReducedMotion.js +105 -0
- package/dist/v2/hooks/usePrefersReducedMotion.js.map +1 -0
- package/dist/v2/hooks/useResolvedDensity.js +5 -13
- package/dist/v2/hooks/useResolvedDensity.js.map +1 -1
- package/dist/v2/hooks/useSortedRows.js +4 -6
- package/dist/v2/hooks/useSortedRows.js.map +1 -1
- package/dist/v2/hooks/useTabLoading.js +7 -22
- package/dist/v2/hooks/useTabLoading.js.map +1 -1
- package/dist/v2/index.d.ts.map +1 -1
- package/dist/v2/index.js +143 -145
- package/dist/v2/index.js.map +1 -1
- package/dist/v2/modalContext.js +2 -2
- package/dist/v2/modalContext.js.map +1 -1
- package/dist/v2/models/favorite.d.ts +8 -9
- package/dist/v2/models/favorite.d.ts.map +1 -1
- package/dist/v2/models/favorite.js.map +1 -1
- package/dist/v2/models/index.js +4 -4
- package/dist/v2/models/index.js.map +1 -1
- package/dist/v2/models/personalization.d.ts +44 -48
- package/dist/v2/models/personalization.d.ts.map +1 -1
- package/dist/v2/models/personalization.js.map +1 -1
- package/dist/v2/models/referentiel.d.ts +32 -50
- package/dist/v2/models/referentiel.d.ts.map +1 -1
- package/dist/v2/models/referentiel.js.map +1 -1
- package/dist/v2/models/savedFilter.d.ts +8 -17
- package/dist/v2/models/savedFilter.d.ts.map +1 -1
- package/dist/v2/models/savedFilter.js.map +1 -1
- package/dist/v2/patterns/ActionBar.js +152 -187
- package/dist/v2/patterns/ActionBar.js.map +1 -1
- package/dist/v2/patterns/AppMain.d.ts +109 -0
- package/dist/v2/patterns/AppMain.d.ts.map +1 -0
- package/dist/v2/patterns/AppMain.js +115 -0
- package/dist/v2/patterns/AppMain.js.map +1 -0
- package/dist/v2/patterns/BulkActionBar.js +40 -42
- package/dist/v2/patterns/BulkActionBar.js.map +1 -1
- package/dist/v2/patterns/ChartFigure.d.ts +124 -0
- package/dist/v2/patterns/ChartFigure.d.ts.map +1 -0
- package/dist/v2/patterns/ChartFigure.js +159 -0
- package/dist/v2/patterns/ChartFigure.js.map +1 -0
- package/dist/v2/patterns/CollapsibleDataGrid.js +138 -174
- package/dist/v2/patterns/CollapsibleDataGrid.js.map +1 -1
- package/dist/v2/patterns/ColumnsToggle.js +60 -94
- package/dist/v2/patterns/ColumnsToggle.js.map +1 -1
- package/dist/v2/patterns/DataGrid.d.ts.map +1 -1
- package/dist/v2/patterns/DataGrid.js +262 -297
- package/dist/v2/patterns/DataGrid.js.map +1 -1
- package/dist/v2/patterns/DataGridSettingsMenu.d.ts +12 -0
- package/dist/v2/patterns/DataGridSettingsMenu.d.ts.map +1 -1
- package/dist/v2/patterns/DataGridSettingsMenu.js +104 -121
- package/dist/v2/patterns/DataGridSettingsMenu.js.map +1 -1
- package/dist/v2/patterns/DataGridToolbar.js +103 -106
- package/dist/v2/patterns/DataGridToolbar.js.map +1 -1
- package/dist/v2/patterns/DataGridVirtualized.js +179 -217
- package/dist/v2/patterns/DataGridVirtualized.js.map +1 -1
- package/dist/v2/patterns/DeleteResourceConfirmDialog.js +32 -35
- package/dist/v2/patterns/DeleteResourceConfirmDialog.js.map +1 -1
- package/dist/v2/patterns/DetailSplit.d.ts +87 -0
- package/dist/v2/patterns/DetailSplit.d.ts.map +1 -0
- package/dist/v2/patterns/DetailSplit.js +116 -0
- package/dist/v2/patterns/DetailSplit.js.map +1 -0
- package/dist/v2/patterns/FavoriteColumn.d.ts +9 -9
- package/dist/v2/patterns/FavoriteColumn.d.ts.map +1 -1
- package/dist/v2/patterns/FavoriteColumn.js +32 -80
- package/dist/v2/patterns/FavoriteColumn.js.map +1 -1
- package/dist/v2/patterns/FavoritesFilter.js +36 -44
- package/dist/v2/patterns/FavoritesFilter.js.map +1 -1
- package/dist/v2/patterns/FilterTabBar.d.ts +28 -0
- package/dist/v2/patterns/FilterTabBar.d.ts.map +1 -0
- package/dist/v2/patterns/FilterTabBar.js +120 -0
- package/dist/v2/patterns/FilterTabBar.js.map +1 -0
- package/dist/v2/patterns/FormErrorSummary.js +20 -23
- package/dist/v2/patterns/FormErrorSummary.js.map +1 -1
- package/dist/v2/patterns/FormPageShell.js +53 -50
- package/dist/v2/patterns/FormPageShell.js.map +1 -1
- package/dist/v2/patterns/FormSection.d.ts +8 -3
- package/dist/v2/patterns/FormSection.d.ts.map +1 -1
- package/dist/v2/patterns/FormSection.js +44 -51
- package/dist/v2/patterns/FormSection.js.map +1 -1
- package/dist/v2/patterns/FormikCheckbox.d.ts +77 -0
- package/dist/v2/patterns/FormikCheckbox.d.ts.map +1 -0
- package/dist/v2/patterns/FormikCheckbox.js +138 -0
- package/dist/v2/patterns/FormikCheckbox.js.map +1 -0
- package/dist/v2/patterns/FormikCheckboxGroup.d.ts +17 -1
- package/dist/v2/patterns/FormikCheckboxGroup.d.ts.map +1 -1
- package/dist/v2/patterns/FormikCheckboxGroup.js +62 -65
- package/dist/v2/patterns/FormikCheckboxGroup.js.map +1 -1
- package/dist/v2/patterns/FormikCombobox.d.ts +7 -1
- package/dist/v2/patterns/FormikCombobox.d.ts.map +1 -1
- package/dist/v2/patterns/FormikCombobox.js +55 -69
- package/dist/v2/patterns/FormikCombobox.js.map +1 -1
- package/dist/v2/patterns/FormikDatePicker.d.ts +13 -1
- package/dist/v2/patterns/FormikDatePicker.d.ts.map +1 -1
- package/dist/v2/patterns/FormikDatePicker.js +59 -106
- package/dist/v2/patterns/FormikDatePicker.js.map +1 -1
- package/dist/v2/patterns/FormikDateTimePicker.d.ts +111 -0
- package/dist/v2/patterns/FormikDateTimePicker.d.ts.map +1 -0
- package/dist/v2/patterns/FormikDateTimePicker.js +144 -0
- package/dist/v2/patterns/FormikDateTimePicker.js.map +1 -0
- package/dist/v2/patterns/FormikErrorFocus.js +25 -26
- package/dist/v2/patterns/FormikErrorFocus.js.map +1 -1
- package/dist/v2/patterns/FormikErrorSummary.d.ts +74 -0
- package/dist/v2/patterns/FormikErrorSummary.d.ts.map +1 -0
- package/dist/v2/patterns/FormikErrorSummary.js +97 -0
- package/dist/v2/patterns/FormikErrorSummary.js.map +1 -0
- package/dist/v2/patterns/FormikFile.d.ts +14 -1
- package/dist/v2/patterns/FormikFile.d.ts.map +1 -1
- package/dist/v2/patterns/FormikFile.js +99 -83
- package/dist/v2/patterns/FormikFile.js.map +1 -1
- package/dist/v2/patterns/FormikInput.d.ts +11 -1
- package/dist/v2/patterns/FormikInput.d.ts.map +1 -1
- package/dist/v2/patterns/FormikInput.js +45 -55
- package/dist/v2/patterns/FormikInput.js.map +1 -1
- package/dist/v2/patterns/FormikRadioGroup.d.ts +80 -0
- package/dist/v2/patterns/FormikRadioGroup.d.ts.map +1 -0
- package/dist/v2/patterns/FormikRadioGroup.js +137 -0
- package/dist/v2/patterns/FormikRadioGroup.js.map +1 -0
- package/dist/v2/patterns/FormikReferentielField.d.ts +12 -1
- package/dist/v2/patterns/FormikReferentielField.d.ts.map +1 -1
- package/dist/v2/patterns/FormikReferentielField.js +54 -64
- package/dist/v2/patterns/FormikReferentielField.js.map +1 -1
- package/dist/v2/patterns/FormikSelect.d.ts +9 -1
- package/dist/v2/patterns/FormikSelect.d.ts.map +1 -1
- package/dist/v2/patterns/FormikSelect.js +70 -89
- package/dist/v2/patterns/FormikSelect.js.map +1 -1
- package/dist/v2/patterns/FormikTextarea.d.ts +9 -1
- package/dist/v2/patterns/FormikTextarea.d.ts.map +1 -1
- package/dist/v2/patterns/FormikTextarea.js +35 -48
- package/dist/v2/patterns/FormikTextarea.js.map +1 -1
- package/dist/v2/patterns/KeyboardShortcutsHelp.d.ts +14 -1
- package/dist/v2/patterns/KeyboardShortcutsHelp.d.ts.map +1 -1
- package/dist/v2/patterns/KeyboardShortcutsHelp.js +71 -74
- package/dist/v2/patterns/KeyboardShortcutsHelp.js.map +1 -1
- package/dist/v2/patterns/NetworkErrorBanner.js +13 -16
- package/dist/v2/patterns/NetworkErrorBanner.js.map +1 -1
- package/dist/v2/patterns/PageContent.js +17 -20
- package/dist/v2/patterns/PageContent.js.map +1 -1
- package/dist/v2/patterns/PreviewDrawer.d.ts +49 -0
- package/dist/v2/patterns/PreviewDrawer.d.ts.map +1 -0
- package/dist/v2/patterns/PreviewDrawer.js +159 -0
- package/dist/v2/patterns/PreviewDrawer.js.map +1 -0
- package/dist/v2/patterns/ReferentielField.d.ts +86 -2
- package/dist/v2/patterns/ReferentielField.d.ts.map +1 -1
- package/dist/v2/patterns/ReferentielField.js +347 -327
- package/dist/v2/patterns/ReferentielField.js.map +1 -1
- package/dist/v2/patterns/RowFavoriteToggle.d.ts +98 -0
- package/dist/v2/patterns/RowFavoriteToggle.d.ts.map +1 -0
- package/dist/v2/patterns/RowFavoriteToggle.js +135 -0
- package/dist/v2/patterns/RowFavoriteToggle.js.map +1 -0
- package/dist/v2/patterns/SaveFilterDialog.js +50 -77
- package/dist/v2/patterns/SaveFilterDialog.js.map +1 -1
- package/dist/v2/patterns/SavedFiltersMenu.js +89 -107
- package/dist/v2/patterns/SavedFiltersMenu.js.map +1 -1
- package/dist/v2/patterns/SkeletonPageShell.js +122 -143
- package/dist/v2/patterns/SkeletonPageShell.js.map +1 -1
- package/dist/v2/patterns/SortableHeader.js +35 -57
- package/dist/v2/patterns/SortableHeader.js.map +1 -1
- package/dist/v2/patterns/Tour.js +121 -142
- package/dist/v2/patterns/Tour.js.map +1 -1
- package/dist/v2/patterns/_dataGridShared.d.ts.map +1 -1
- package/dist/v2/patterns/_dataGridShared.js +131 -147
- package/dist/v2/patterns/_dataGridShared.js.map +1 -1
- package/dist/v2/patterns/_pickerSerialisation.d.ts +44 -0
- package/dist/v2/patterns/_pickerSerialisation.d.ts.map +1 -0
- package/dist/v2/patterns/_pickerSerialisation.js +80 -0
- package/dist/v2/patterns/_pickerSerialisation.js.map +1 -0
- package/dist/v2/patterns/_sort.js +17 -33
- package/dist/v2/patterns/_sort.js.map +1 -1
- package/dist/v2/patterns/_useColumnReorder.js +124 -163
- package/dist/v2/patterns/_useColumnReorder.js.map +1 -1
- package/dist/v2/patterns/_useColumnResize.js +80 -99
- package/dist/v2/patterns/_useColumnResize.js.map +1 -1
- package/dist/v2/patterns/filterCriteria.d.ts +78 -0
- package/dist/v2/patterns/filterCriteria.d.ts.map +1 -0
- package/dist/v2/patterns/filterCriteria.js +110 -0
- package/dist/v2/patterns/filterCriteria.js.map +1 -0
- package/dist/v2/patterns/index.d.ts +247 -0
- package/dist/v2/patterns/index.d.ts.map +1 -1
- package/dist/v2/patterns/index.js +182 -70
- package/dist/v2/patterns/index.js.map +1 -1
- package/dist/v2/patterns/rowActions.d.ts +150 -0
- package/dist/v2/patterns/rowActions.d.ts.map +1 -0
- package/dist/v2/patterns/rowActions.js +232 -0
- package/dist/v2/patterns/rowActions.js.map +1 -0
- package/dist/v2/personalization/PersonalizationProvider.d.ts.map +1 -1
- package/dist/v2/personalization/PersonalizationProvider.js +57 -53
- package/dist/v2/personalization/PersonalizationProvider.js.map +1 -1
- package/dist/v2/personalization/adapters/_storageKey.js +5 -5
- package/dist/v2/personalization/adapters/_storageKey.js.map +1 -1
- package/dist/v2/personalization/adapters/createLocalStorageAdapter.js +25 -24
- package/dist/v2/personalization/adapters/createLocalStorageAdapter.js.map +1 -1
- package/dist/v2/personalization/adapters/createMemoryAdapter.js +14 -14
- package/dist/v2/personalization/adapters/createMemoryAdapter.js.map +1 -1
- package/dist/v2/personalization/adapters/index.js +5 -5
- package/dist/v2/personalization/adapters/index.js.map +1 -1
- package/dist/v2/personalization/capabilities/favorites.js +39 -62
- package/dist/v2/personalization/capabilities/favorites.js.map +1 -1
- package/dist/v2/personalization/capabilities/favoritesView.js +25 -37
- package/dist/v2/personalization/capabilities/favoritesView.js.map +1 -1
- package/dist/v2/personalization/capabilities/gridPreferences.d.ts +100 -0
- package/dist/v2/personalization/capabilities/gridPreferences.d.ts.map +1 -0
- package/dist/v2/personalization/capabilities/gridPreferences.js +210 -0
- package/dist/v2/personalization/capabilities/gridPreferences.js.map +1 -0
- package/dist/v2/personalization/capabilities/index.d.ts +6 -0
- package/dist/v2/personalization/capabilities/index.d.ts.map +1 -1
- package/dist/v2/personalization/capabilities/index.js +23 -10
- package/dist/v2/personalization/capabilities/index.js.map +1 -1
- package/dist/v2/personalization/capabilities/reviveSavedCriteria.d.ts +88 -0
- package/dist/v2/personalization/capabilities/reviveSavedCriteria.d.ts.map +1 -0
- package/dist/v2/personalization/capabilities/reviveSavedCriteria.js +126 -0
- package/dist/v2/personalization/capabilities/reviveSavedCriteria.js.map +1 -0
- package/dist/v2/personalization/capabilities/savedFilters.js +93 -100
- package/dist/v2/personalization/capabilities/savedFilters.js.map +1 -1
- package/dist/v2/personalization/createPersonalizationStore.d.ts.map +1 -1
- package/dist/v2/personalization/createPersonalizationStore.js +81 -182
- package/dist/v2/personalization/createPersonalizationStore.js.map +1 -1
- package/dist/v2/personalization/index.d.ts +34 -0
- package/dist/v2/personalization/index.d.ts.map +1 -1
- package/dist/v2/personalization/index.js +41 -21
- package/dist/v2/personalization/index.js.map +1 -1
- package/dist/v2/personalization/personalizationContext.js +10 -12
- package/dist/v2/personalization/personalizationContext.js.map +1 -1
- package/dist/v2/personalization/schema.js +8 -9
- package/dist/v2/personalization/schema.js.map +1 -1
- package/dist/v2/referentiel/ReferentielProvider.js +31 -45
- package/dist/v2/referentiel/ReferentielProvider.js.map +1 -1
- package/dist/v2/referentiel/index.js +11 -13
- package/dist/v2/referentiel/index.js.map +1 -1
- package/dist/v2/referentiel/types.d.ts +105 -0
- package/dist/v2/referentiel/types.d.ts.map +1 -0
- package/dist/v2/referentiel/types.js +6 -0
- package/dist/v2/referentiel/types.js.map +1 -0
- package/dist/v2/referentiel/useReferentielClient.js +13 -16
- package/dist/v2/referentiel/useReferentielClient.js.map +1 -1
- package/dist/v2/referentiel/useReferentielOptions.d.ts +7 -17
- package/dist/v2/referentiel/useReferentielOptions.d.ts.map +1 -1
- package/dist/v2/referentiel/useReferentielOptions.js +63 -120
- package/dist/v2/referentiel/useReferentielOptions.js.map +1 -1
- package/dist/v2/referentiel/useReferentielSearch.d.ts +7 -48
- package/dist/v2/referentiel/useReferentielSearch.d.ts.map +1 -1
- package/dist/v2/referentiel/useReferentielSearch.js +40 -95
- package/dist/v2/referentiel/useReferentielSearch.js.map +1 -1
- package/dist/v2/theme/_brand.js +12 -26
- package/dist/v2/theme/_brand.js.map +1 -1
- package/dist/v2/theme/_brandSecondary.js +12 -26
- package/dist/v2/theme/_brandSecondary.js.map +1 -1
- package/dist/v2/theme/createPortnetTheme.js +41 -49
- package/dist/v2/theme/createPortnetTheme.js.map +1 -1
- package/dist/v2/theme/cssVariables.d.ts +3 -3
- package/dist/v2/theme/cssVariables.d.ts.map +1 -1
- package/dist/v2/theme/cssVariables.js +65 -70
- package/dist/v2/theme/cssVariables.js.map +1 -1
- package/dist/v2/theme/index.js +10 -10
- package/dist/v2/theme/index.js.map +1 -1
- package/dist/v2/tokens/breakpoints.js +16 -16
- package/dist/v2/tokens/breakpoints.js.map +1 -1
- package/dist/v2/tokens/chart.d.ts +103 -0
- package/dist/v2/tokens/chart.d.ts.map +1 -0
- package/dist/v2/tokens/chart.js +270 -0
- package/dist/v2/tokens/chart.js.map +1 -0
- package/dist/v2/tokens/colors.js +24 -24
- package/dist/v2/tokens/colors.js.map +1 -1
- package/dist/v2/tokens/density.d.ts +104 -0
- package/dist/v2/tokens/density.d.ts.map +1 -1
- package/dist/v2/tokens/density.js +67 -12
- package/dist/v2/tokens/density.js.map +1 -1
- package/dist/v2/tokens/index.d.ts +50 -1
- package/dist/v2/tokens/index.d.ts.map +1 -1
- package/dist/v2/tokens/index.js +116 -68
- package/dist/v2/tokens/index.js.map +1 -1
- package/dist/v2/tokens/motion.js +16 -22
- package/dist/v2/tokens/motion.js.map +1 -1
- package/dist/v2/tokens/radius.js +3 -3
- package/dist/v2/tokens/radius.js.map +1 -1
- package/dist/v2/tokens/shadows.js +8 -8
- package/dist/v2/tokens/shadows.js.map +1 -1
- package/dist/v2/tokens/spacing.js +4 -4
- package/dist/v2/tokens/spacing.js.map +1 -1
- package/dist/v2/tokens/state.js +3 -3
- package/dist/v2/tokens/state.js.map +1 -1
- package/dist/v2/tokens/statusPalette.js +21 -23
- package/dist/v2/tokens/statusPalette.js.map +1 -1
- package/dist/v2/tokens/tokens.json +6 -1
- package/dist/v2/tokens/typography.js +15 -15
- package/dist/v2/tokens/typography.js.map +1 -1
- package/dist/v2/tokens/zIndex.js +3 -3
- package/dist/v2/tokens/zIndex.js.map +1 -1
- package/dist/v2/types/datagrid.d.ts +9 -1
- package/dist/v2/types/datagrid.d.ts.map +1 -1
- package/dist/v2/types/datagrid.js.map +1 -1
- package/dist/v2/types/index.js +2 -2
- package/dist/v2/types/index.js.map +1 -1
- package/dist/v2/utils/apiError.js +16 -37
- package/dist/v2/utils/apiError.js.map +1 -1
- package/dist/v2/utils/contrast.js +31 -32
- package/dist/v2/utils/contrast.js.map +1 -1
- package/dist/v2/utils/cx.js +7 -27
- package/dist/v2/utils/cx.js.map +1 -1
- package/dist/v2/utils/fileDownload.js +25 -28
- package/dist/v2/utils/fileDownload.js.map +1 -1
- package/dist/v2/utils/fileValidation.d.ts +116 -0
- package/dist/v2/utils/fileValidation.d.ts.map +1 -0
- package/dist/v2/utils/fileValidation.js +220 -0
- package/dist/v2/utils/fileValidation.js.map +1 -0
- package/dist/v2/utils/fmtDate.d.ts +103 -0
- package/dist/v2/utils/fmtDate.d.ts.map +1 -0
- package/dist/v2/utils/fmtDate.js +119 -0
- package/dist/v2/utils/fmtDate.js.map +1 -0
- package/dist/v2/utils/fmtMoney.d.ts +3 -3
- package/dist/v2/utils/fmtMoney.d.ts.map +1 -1
- package/dist/v2/utils/fmtMoney.js +9 -11
- package/dist/v2/utils/fmtMoney.js.map +1 -1
- package/dist/v2/utils/formikErrors.d.ts +67 -0
- package/dist/v2/utils/formikErrors.d.ts.map +1 -0
- package/dist/v2/utils/formikErrors.js +85 -0
- package/dist/v2/utils/formikErrors.js.map +1 -0
- package/dist/v2/utils/index.d.ts +5 -0
- package/dist/v2/utils/index.d.ts.map +1 -1
- package/dist/v2/utils/index.js +67 -18
- package/dist/v2/utils/index.js.map +1 -1
- package/dist/v2/utils/mergeLabels.js +9 -14
- package/dist/v2/utils/mergeLabels.js.map +1 -1
- package/dist/v2/utils/networkStatus.js +14 -14
- package/dist/v2/utils/networkStatus.js.map +1 -1
- package/package.json +26 -9
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PersonalizationProvider.js","names":["React","_interopRequireWildcard","require","_personalizationContext","_createPersonalizationStore","_interopRequireDefault","_createLocalStorageAdapter","_jsxRuntime","obj","__esModule","_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","_typeof","cache","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","prototype","hasOwnProperty","call","desc","set","Symbol","iterator","constructor","ownKeys","object","enumerableOnly","keys","getOwnPropertySymbols","symbols","filter","sym","enumerable","push","apply","_objectSpread","target","i","arguments","length","source","forEach","_defineProperty","getOwnPropertyDescriptors","defineProperties","value","_toPropertyKey","configurable","writable","arg","_toPrimitive","String","input","hint","prim","toPrimitive","undefined","res","TypeError","Number","isDev","process","env","DEFAULT_PERSONALIZATION_LABELS","exports","freeze","addFavorite","removeFavorite","favoritesOnly","showAll","favoriteColumnHeader","savedFilters","saveCurrentFilter","filterNameLabel","filterNamePlaceholder","saveFilter","updateFilter","deleteFilter","deleteFilterConfirm","setAsDefault","defaultBadge","manageFilters","noSavedFilters","cancel","UserPersonalizationProvider","props","children","userId","tenantId","appId","adapter","defaults","labels","onError","_props$hydrateStrateg","hydrateStrategy","console","warn","resolvedUserId","scope","useMemo","buildScope","defaultAdapterRef","useRef","current","createLocalStorageAdapter","resolvedAdapter","store","buildStore","createPersonalizationStore","useEffect","lifecycle","hydrate","off","connect","teardown","dispose","syncRuntime","setRuntime","prevAdapterRef","guardAdapterIdentity","mergedLabels","mergeLabels","assign","configValue","buildConfig","jsx","PersonalizationConfigContext","Provider","PersonalizationStoreContext","_default"],"sources":["../../../src/lib/v2/personalization/PersonalizationProvider.tsx"],"sourcesContent":["/**\r\n * UserPersonalizationProvider — Portnet UI v2 · personalization\r\n *\r\n * The single configuration point for per-user personalization. Mount it\r\n * once near the app root; every capability (favorites, saved filters, and\r\n * future slices) reads through the one store it establishes.\r\n *\r\n * import {\r\n * UserPersonalizationProvider,\r\n * createLocalStorageAdapter,\r\n * } from \"@portnet/ui/v2/personalization\";\r\n *\r\n * <UserPersonalizationProvider userId={user.id} tenantId={tenant.id}>\r\n * <App />\r\n * </UserPersonalizationProvider>\r\n *\r\n * Store lifecycle\r\n * - Exactly one store per scope. Memoised on (scope, adapter) ONLY;\r\n * onError / hydrateStrategy are pushed in live via store.setRuntime so\r\n * inline handlers never recreate the store.\r\n * - The default localStorage adapter is created once (ref). A PROVIDED\r\n * adapter must be stable (useMemo/module singleton) — a dev guard warns\r\n * if its identity changes between renders.\r\n * - A lifecycle effect runs hydrate() + connect() and dispose()s the old\r\n * store on scope change / unmount (cross-tab listener torn down).\r\n *\r\n * React 18/19 compatible: no 19-only API is required.\r\n */\r\n\r\nimport * as React from \"react\";\r\n\r\nimport {\r\n PersonalizationConfigContext,\r\n PersonalizationStoreContext,\r\n} from \"./personalizationContext\";\r\nimport type {\r\n PersonalizationConfig,\r\n PersonalizationLabels,\r\n} from \"./personalizationContext\";\r\nimport createPersonalizationStore from \"./createPersonalizationStore\";\r\nimport type { PersonalizationErrorHandler } from \"./createPersonalizationStore\";\r\nimport createLocalStorageAdapter from \"./adapters/createLocalStorageAdapter\";\r\nimport type { Adapter, HydrateStrategy, Scope } from \"./types\";\r\n\r\nconst isDev =\r\n typeof process !== \"undefined\" &&\r\n process.env &&\r\n process.env[\"NODE_ENV\"] !== \"production\";\r\n\r\n/**\r\n * Default labels for the whole foundation (FR — charter default). Hosts\r\n * override any subset via the `labels` prop; EN/AR overrides supported.\r\n * Front-loaded here so the favorites (Batch 3) and saved-filters (Batch 4)\r\n * components read consistent copy from one place.\r\n */\r\nexport const DEFAULT_PERSONALIZATION_LABELS = Object.freeze({\r\n // Follow / \"suivis\" (Batch 3)\r\n addFavorite: \"Suivre\",\r\n removeFavorite: \"Ne plus suivre\",\r\n favoritesOnly: \"Suivis uniquement\",\r\n showAll: \"Tout afficher\",\r\n favoriteColumnHeader: \"Suivis\",\r\n // Saved filters (Batch 4)\r\n savedFilters: \"Filtres enregistrés\",\r\n saveCurrentFilter: \"Enregistrer le filtre actuel…\",\r\n filterNameLabel: \"Nom du filtre\",\r\n filterNamePlaceholder: \"ex. Dossiers en attente\",\r\n saveFilter: \"Enregistrer\",\r\n updateFilter: \"Mettre à jour\",\r\n deleteFilter: \"Supprimer\",\r\n deleteFilterConfirm: \"Supprimer ce filtre enregistré ?\",\r\n setAsDefault: \"Définir par défaut\",\r\n defaultBadge: \"Par défaut\",\r\n manageFilters: \"Gérer les filtres\",\r\n noSavedFilters: \"Aucun filtre enregistré\",\r\n cancel: \"Annuler\",\r\n} satisfies PersonalizationLabels);\r\n\r\nexport interface UserPersonalizationProviderProps {\r\n children?: React.ReactNode | undefined;\r\n /** Required (in practice) — scopes all persisted preferences to this user. */\r\n userId?: string | undefined;\r\n /** Optional multi-tenant partition. */\r\n tenantId?: string | undefined;\r\n /** Optional per-app partition. */\r\n appId?: string | undefined;\r\n /** Persistence boundary. Defaults to createLocalStorageAdapter(). Must be stable. */\r\n adapter?: Adapter | undefined;\r\n /** Per-capability seed overrides, e.g. { favorites: {}, savedFilters: {} }. */\r\n defaults?: Record<string, unknown> | undefined;\r\n /** Label overrides (FR default; EN/AR supported). */\r\n labels?: Partial<PersonalizationLabels> | undefined;\r\n /** Central persistence-error hook: (error, { scope, capabilityId }) => void. */\r\n onError?: PersonalizationErrorHandler | undefined;\r\n /** Reconciliation policy between optimistic local state and adapter truth. @default \"remote-wins\" */\r\n hydrateStrategy?: HydrateStrategy | undefined;\r\n}\r\n\r\nexport function UserPersonalizationProvider(\r\n props: UserPersonalizationProviderProps\r\n): React.JSX.Element {\r\n const {\r\n children,\r\n userId,\r\n tenantId,\r\n appId,\r\n adapter,\r\n defaults,\r\n labels,\r\n onError,\r\n hydrateStrategy = \"remote-wins\",\r\n } = props;\r\n\r\n if (isDev && !userId && typeof console !== \"undefined\" && console.warn) {\r\n // eslint-disable-next-line no-console\r\n console.warn(\r\n \"[@portnet/ui v2] UserPersonalizationProvider: `userId` is required to scope personalization. \" +\r\n \"Falling back to 'anonymous' — persisted preferences will be shared across unauthenticated sessions.\"\r\n );\r\n }\r\n const resolvedUserId = userId || \"anonymous\";\r\n\r\n const scope = React.useMemo<Scope>(\r\n function buildScope() {\r\n return {\r\n userId: resolvedUserId,\r\n ...(tenantId !== undefined ? { tenantId } : {}),\r\n ...(appId !== undefined ? { appId } : {}),\r\n };\r\n },\r\n [resolvedUserId, tenantId, appId]\r\n );\r\n\r\n // Default adapter created once; a provided adapter is trusted to be stable.\r\n const defaultAdapterRef = React.useRef<Adapter | null>(null);\r\n if (!adapter && !defaultAdapterRef.current) {\r\n defaultAdapterRef.current = createLocalStorageAdapter();\r\n }\r\n const resolvedAdapter = adapter || defaultAdapterRef.current;\r\n\r\n // One store per (scope, adapter). Intentionally NOT keyed on\r\n // defaults/onError/hydrateStrategy: those are fed live below.\r\n const store = React.useMemo(\r\n function buildStore() {\r\n return createPersonalizationStore({\r\n scope: scope,\r\n adapter: resolvedAdapter,\r\n ...(defaults !== undefined ? { defaults } : {}),\r\n ...(onError !== undefined ? { onError } : {}),\r\n hydrateStrategy: hydrateStrategy,\r\n });\r\n },\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [scope, resolvedAdapter]\r\n );\r\n\r\n // Hydrate + cross-tab connect; dispose on store change / unmount.\r\n React.useEffect(\r\n function lifecycle() {\r\n store.hydrate();\r\n const off = store.connect();\r\n return function teardown() {\r\n if (typeof off === \"function\") off();\r\n store.dispose();\r\n };\r\n },\r\n [store]\r\n );\r\n\r\n // Push live runtime options without recreating the store.\r\n React.useEffect(\r\n function syncRuntime() {\r\n store.setRuntime({\r\n ...(onError !== undefined ? { onError } : {}),\r\n hydrateStrategy: hydrateStrategy,\r\n });\r\n },\r\n [store, onError, hydrateStrategy]\r\n );\r\n\r\n // Dev guard: a non-memoised adapter prop would recreate the store each\r\n // render and wipe in-memory state. Warn so it's caught early.\r\n const prevAdapterRef = React.useRef<Adapter | null>(resolvedAdapter);\r\n React.useEffect(\r\n function guardAdapterIdentity() {\r\n if (\r\n isDev &&\r\n prevAdapterRef.current !== resolvedAdapter &&\r\n typeof console !== \"undefined\" &&\r\n console.warn\r\n ) {\r\n // eslint-disable-next-line no-console\r\n console.warn(\r\n \"[@portnet/ui v2] UserPersonalizationProvider: the `adapter` prop changed identity between \" +\r\n \"renders. Memoise it (useMemo or a module singleton) to avoid re-creating the personalization store.\"\r\n );\r\n }\r\n prevAdapterRef.current = resolvedAdapter;\r\n },\r\n [resolvedAdapter]\r\n );\r\n\r\n const mergedLabels = React.useMemo<PersonalizationLabels>(\r\n function mergeLabels() {\r\n return labels\r\n ? Object.assign({}, DEFAULT_PERSONALIZATION_LABELS, labels)\r\n : DEFAULT_PERSONALIZATION_LABELS;\r\n },\r\n [labels]\r\n );\r\n\r\n const configValue = React.useMemo<PersonalizationConfig>(\r\n function buildConfig() {\r\n return { scope: scope, labels: mergedLabels };\r\n },\r\n [scope, mergedLabels]\r\n );\r\n\r\n return (\r\n <PersonalizationConfigContext.Provider value={configValue}>\r\n <PersonalizationStoreContext.Provider value={store}>\r\n {children}\r\n </PersonalizationStoreContext.Provider>\r\n </PersonalizationConfigContext.Provider>\r\n );\r\n}\r\n\r\nexport default UserPersonalizationProvider;\r\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"PersonalizationProvider.js","names":["React","_interopRequireWildcard","require","_personalizationContext","_createPersonalizationStore","_interopRequireDefault","_createLocalStorageAdapter","_jsxRuntime","e","__esModule","default","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","isDev","process","env","DEFAULT_PERSONALIZATION_LABELS","exports","freeze","addFavorite","removeFavorite","favoritesOnly","showAll","favoriteColumnHeader","savedFilters","saveCurrentFilter","filterNameLabel","filterNamePlaceholder","saveFilter","updateFilter","deleteFilter","deleteFilterConfirm","setAsDefault","defaultBadge","manageFilters","noSavedFilters","cancel","UserPersonalizationProvider","props","children","userId","tenantId","appId","adapter","defaults","labels","onError","hydrateStrategy","console","warn","resolvedUserId","scope","useMemo","buildScope","undefined","defaultAdapterRef","useRef","current","createLocalStorageAdapter","resolvedAdapter","store","buildStore","createPersonalizationStore","useEffect","lifecycle","hydrate","off","connect","teardown","dispose","syncRuntime","setRuntime","prevAdapterRef","guardAdapterIdentity","mergedLabels","mergeLabels","assign","configValue","buildConfig","jsx","PersonalizationConfigContext","Provider","value","PersonalizationStoreContext","_default"],"sources":["../../../src/lib/v2/personalization/PersonalizationProvider.tsx"],"sourcesContent":["/**\r\n * UserPersonalizationProvider — Portnet UI v2 · personalization\r\n *\r\n * The single configuration point for per-user personalization. Mount it\r\n * once near the app root; every capability (favorites, saved filters, and\r\n * future slices) reads through the one store it establishes.\r\n *\r\n * import {\r\n * UserPersonalizationProvider,\r\n * createLocalStorageAdapter,\r\n * } from \"@portnet/ui/v2/personalization\";\r\n *\r\n * <UserPersonalizationProvider userId={user.id} tenantId={tenant.id}>\r\n * <App />\r\n * </UserPersonalizationProvider>\r\n *\r\n * Store lifecycle\r\n * - Exactly one store per scope. Memoised on (scope, adapter) ONLY;\r\n * onError / hydrateStrategy are pushed in live via store.setRuntime so\r\n * inline handlers never recreate the store.\r\n * - The default localStorage adapter is created once (ref). A PROVIDED\r\n * adapter must be stable (useMemo/module singleton) — a dev guard warns\r\n * if its identity changes between renders.\r\n * - A lifecycle effect runs hydrate() + connect() and dispose()s the old\r\n * store on scope change / unmount (cross-tab listener torn down).\r\n *\r\n * React 18/19 compatible: no 19-only API is required.\r\n */\r\n\r\nimport * as React from \"react\";\r\n\r\nimport {\r\n PersonalizationConfigContext,\r\n PersonalizationStoreContext,\r\n} from \"./personalizationContext\";\r\nimport type {\r\n PersonalizationConfig,\r\n PersonalizationLabels,\r\n} from \"./personalizationContext\";\r\nimport createPersonalizationStore from \"./createPersonalizationStore\";\r\nimport type { PersonalizationErrorHandler } from \"./createPersonalizationStore\";\r\nimport createLocalStorageAdapter from \"./adapters/createLocalStorageAdapter\";\r\nimport type { Adapter, HydrateStrategy, Scope } from \"./types\";\r\n\r\nconst isDev =\r\n typeof process !== \"undefined\" &&\r\n process.env &&\r\n process.env[\"NODE_ENV\"] !== \"production\";\r\n\r\n/**\r\n * Default labels for the whole foundation (FR — charter default). Hosts\r\n * override any subset via the `labels` prop; EN/AR overrides supported.\r\n * Front-loaded here so the favorites (Batch 3) and saved-filters (Batch 4)\r\n * components read consistent copy from one place.\r\n */\r\nexport const DEFAULT_PERSONALIZATION_LABELS = Object.freeze({\r\n // Follow / \"suivis\" (Batch 3)\r\n addFavorite: \"Suivre\",\r\n removeFavorite: \"Ne plus suivre\",\r\n favoritesOnly: \"Suivis uniquement\",\r\n showAll: \"Tout afficher\",\r\n favoriteColumnHeader: \"Suivis\",\r\n // Saved filters (Batch 4)\r\n savedFilters: \"Filtres enregistrés\",\r\n saveCurrentFilter: \"Enregistrer le filtre actuel…\",\r\n filterNameLabel: \"Nom du filtre\",\r\n filterNamePlaceholder: \"ex. Dossiers en attente\",\r\n saveFilter: \"Enregistrer\",\r\n updateFilter: \"Mettre à jour\",\r\n deleteFilter: \"Supprimer\",\r\n deleteFilterConfirm: \"Supprimer ce filtre enregistré ?\",\r\n setAsDefault: \"Définir par défaut\",\r\n defaultBadge: \"Par défaut\",\r\n manageFilters: \"Gérer les filtres\",\r\n noSavedFilters: \"Aucun filtre enregistré\",\r\n cancel: \"Annuler\",\r\n} satisfies PersonalizationLabels);\r\n\r\nexport interface UserPersonalizationProviderProps {\r\n children?: React.ReactNode | undefined;\r\n /** Required (in practice) — scopes all persisted preferences to this user. */\r\n userId?: string | undefined;\r\n /** Optional multi-tenant partition. */\r\n tenantId?: string | undefined;\r\n /** Optional per-app partition. */\r\n appId?: string | undefined;\r\n /** Persistence boundary. Defaults to createLocalStorageAdapter(). Must be stable. */\r\n adapter?: Adapter | undefined;\r\n /** Per-capability seed overrides, e.g. { favorites: {}, savedFilters: {} }. */\r\n defaults?: Record<string, unknown> | undefined;\r\n /** Label overrides (FR default; EN/AR supported). */\r\n labels?: Partial<PersonalizationLabels> | undefined;\r\n /** Central persistence-error hook: (error, { scope, capabilityId }) => void. */\r\n onError?: PersonalizationErrorHandler | undefined;\r\n /** Reconciliation policy between optimistic local state and adapter truth. @default \"remote-wins\" */\r\n hydrateStrategy?: HydrateStrategy | undefined;\r\n}\r\n\r\nexport function UserPersonalizationProvider(\r\n props: UserPersonalizationProviderProps\r\n): React.JSX.Element {\r\n const {\r\n children,\r\n userId,\r\n tenantId,\r\n appId,\r\n adapter,\r\n defaults,\r\n labels,\r\n onError,\r\n hydrateStrategy = \"remote-wins\",\r\n } = props;\r\n\r\n // eslint-disable-next-line no-console\r\n if (isDev && !userId && typeof console !== \"undefined\" && console.warn) {\r\n // eslint-disable-next-line no-console\r\n console.warn(\r\n \"[@portnet/ui v2] UserPersonalizationProvider: `userId` is required to scope personalization. \" +\r\n \"Falling back to 'anonymous' — persisted preferences will be shared across unauthenticated sessions.\"\r\n );\r\n }\r\n const resolvedUserId = userId || \"anonymous\";\r\n\r\n const scope = React.useMemo<Scope>(\r\n function buildScope() {\r\n return {\r\n userId: resolvedUserId,\r\n ...(tenantId !== undefined ? { tenantId } : {}),\r\n ...(appId !== undefined ? { appId } : {}),\r\n };\r\n },\r\n [resolvedUserId, tenantId, appId]\r\n );\r\n\r\n // Default adapter created once; a provided adapter is trusted to be stable.\r\n const defaultAdapterRef = React.useRef<Adapter | null>(null);\r\n if (!adapter && !defaultAdapterRef.current) {\r\n defaultAdapterRef.current = createLocalStorageAdapter();\r\n }\r\n const resolvedAdapter = adapter || defaultAdapterRef.current;\r\n\r\n // One store per (scope, adapter). Intentionally NOT keyed on\r\n // defaults/onError/hydrateStrategy: those are fed live below.\r\n const store = React.useMemo(\r\n function buildStore() {\r\n return createPersonalizationStore({\r\n scope: scope,\r\n adapter: resolvedAdapter,\r\n ...(defaults !== undefined ? { defaults } : {}),\r\n ...(onError !== undefined ? { onError } : {}),\r\n hydrateStrategy: hydrateStrategy,\r\n });\r\n },\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [scope, resolvedAdapter]\r\n );\r\n\r\n // Hydrate + cross-tab connect; dispose on store change / unmount.\r\n React.useEffect(\r\n function lifecycle() {\r\n store.hydrate();\r\n const off = store.connect();\r\n return function teardown() {\r\n if (typeof off === \"function\") off();\r\n store.dispose();\r\n };\r\n },\r\n [store]\r\n );\r\n\r\n // Push live runtime options without recreating the store.\r\n React.useEffect(\r\n function syncRuntime() {\r\n store.setRuntime({\r\n ...(onError !== undefined ? { onError } : {}),\r\n hydrateStrategy: hydrateStrategy,\r\n });\r\n },\r\n [store, onError, hydrateStrategy]\r\n );\r\n\r\n // Dev guard: a non-memoised adapter prop would recreate the store each\r\n // render and wipe in-memory state. Warn so it's caught early.\r\n const prevAdapterRef = React.useRef<Adapter | null>(resolvedAdapter);\r\n React.useEffect(\r\n function guardAdapterIdentity() {\r\n if (\r\n isDev &&\r\n prevAdapterRef.current !== resolvedAdapter &&\r\n typeof console !== \"undefined\" &&\r\n // eslint-disable-next-line no-console\r\n console.warn\r\n ) {\r\n // eslint-disable-next-line no-console\r\n console.warn(\r\n \"[@portnet/ui v2] UserPersonalizationProvider: the `adapter` prop changed identity between \" +\r\n \"renders. Memoise it (useMemo or a module singleton) to avoid re-creating the personalization store.\"\r\n );\r\n }\r\n prevAdapterRef.current = resolvedAdapter;\r\n },\r\n [resolvedAdapter]\r\n );\r\n\r\n const mergedLabels = React.useMemo<PersonalizationLabels>(\r\n function mergeLabels() {\r\n return labels\r\n ? Object.assign({}, DEFAULT_PERSONALIZATION_LABELS, labels)\r\n : DEFAULT_PERSONALIZATION_LABELS;\r\n },\r\n [labels]\r\n );\r\n\r\n const configValue = React.useMemo<PersonalizationConfig>(\r\n function buildConfig() {\r\n return { scope: scope, labels: mergedLabels };\r\n },\r\n [scope, mergedLabels]\r\n );\r\n\r\n return (\r\n <PersonalizationConfigContext.Provider value={configValue}>\r\n <PersonalizationStoreContext.Provider value={store}>\r\n {children}\r\n </PersonalizationStoreContext.Provider>\r\n </PersonalizationConfigContext.Provider>\r\n );\r\n}\r\n\r\nexport default UserPersonalizationProvider;\r\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -29,14 +29,14 @@ var _schema = require("../schema");
|
|
|
29
29
|
* Underscore-prefixed: internal, never re-exported from the public surface.
|
|
30
30
|
*/
|
|
31
31
|
|
|
32
|
-
|
|
32
|
+
const KEY_PREFIX = exports.KEY_PREFIX = "portnet-ui:perso";
|
|
33
33
|
function enc(value) {
|
|
34
34
|
return encodeURIComponent(String(value == null ? "" : value));
|
|
35
35
|
}
|
|
36
36
|
|
|
37
37
|
/** Full storage key for one (scope, capability). */
|
|
38
38
|
function buildKey(scope, capabilityId) {
|
|
39
|
-
|
|
39
|
+
const parts = [KEY_PREFIX, _schema.KEY_SCHEME_VERSION];
|
|
40
40
|
if (scope && scope.tenantId) parts.push(enc(scope.tenantId));
|
|
41
41
|
parts.push(enc(scope ? scope.userId : ""));
|
|
42
42
|
parts.push(capabilityId);
|
|
@@ -48,7 +48,7 @@ function buildKey(scope, capabilityId) {
|
|
|
48
48
|
* capability segment follows immediately.
|
|
49
49
|
*/
|
|
50
50
|
function buildScopePrefix(scope) {
|
|
51
|
-
|
|
51
|
+
const parts = [KEY_PREFIX, _schema.KEY_SCHEME_VERSION];
|
|
52
52
|
if (scope && scope.tenantId) parts.push(enc(scope.tenantId));
|
|
53
53
|
parts.push(enc(scope ? scope.userId : ""));
|
|
54
54
|
parts.push(""); // trailing ':' after join
|
|
@@ -61,9 +61,9 @@ function buildScopePrefix(scope) {
|
|
|
61
61
|
*/
|
|
62
62
|
function parseCapabilityFromKey(key, scope) {
|
|
63
63
|
if (typeof key !== "string") return null;
|
|
64
|
-
|
|
64
|
+
const prefix = buildScopePrefix(scope);
|
|
65
65
|
if (key.indexOf(prefix) !== 0) return null;
|
|
66
|
-
|
|
66
|
+
const capId = key.slice(prefix.length);
|
|
67
67
|
return capId || null;
|
|
68
68
|
}
|
|
69
69
|
//# sourceMappingURL=_storageKey.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_storageKey.js","names":["_schema","require","KEY_PREFIX","exports","enc","value","encodeURIComponent","String","buildKey","scope","capabilityId","parts","KEY_SCHEME_VERSION","tenantId","push","userId","join","buildScopePrefix","parseCapabilityFromKey","key","prefix","indexOf","capId","slice","length"],"sources":["../../../../src/lib/v2/personalization/adapters/_storageKey.ts"],"sourcesContent":["/**\r\n * _storageKey — Portnet UI v2 · personalization adapters (private)\r\n *\r\n * Composite key scheme shared by storage adapters:\r\n *\r\n * portnet-ui:perso:v1:{tenantId?}:{userId}:{capabilityId}\r\n *\r\n * Design notes\r\n * - `resourceKey` is NOT in the key — it lives inside the capability\r\n * payload. One storage entry per (scope, capability) → cheap prefix scan\r\n * on load, one removeItem to clear.\r\n * - Scope segments (tenantId, userId) are encodeURIComponent-escaped so\r\n * arbitrary host identifiers — including ones containing ':' — remain\r\n * unambiguous. `capabilityId` is a controlled slug and is left raw so\r\n * `buildScopePrefix` + `slice()` recover it directly.\r\n * - `:v1:` is the KEY-SCHEME version (storage layout), independent of a\r\n * capability payload's `schemaVersion`.\r\n *\r\n * Underscore-prefixed: internal, never re-exported from the public surface.\r\n */\r\n\r\nimport { KEY_SCHEME_VERSION } from \"../schema\";\r\nimport type { Scope } from \"../types\";\r\n\r\nexport const KEY_PREFIX = \"portnet-ui:perso\";\r\n\r\nfunction enc(value: string | undefined): string {\r\n return encodeURIComponent(String(value == null ? \"\" : value));\r\n}\r\n\r\n/** Full storage key for one (scope, capability). */\r\nexport function buildKey(scope: Scope, capabilityId: string): string {\r\n const parts = [KEY_PREFIX, KEY_SCHEME_VERSION];\r\n if (scope && scope.tenantId) parts.push(enc(scope.tenantId));\r\n parts.push(enc(scope ? scope.userId : \"\"));\r\n parts.push(capabilityId);\r\n return parts.join(\":\");\r\n}\r\n\r\n/**\r\n * Prefix shared by every capability key of a scope — terminated by ':' so the\r\n * capability segment follows immediately.\r\n */\r\nexport function buildScopePrefix(scope: Scope): string {\r\n const parts = [KEY_PREFIX, KEY_SCHEME_VERSION];\r\n if (scope && scope.tenantId) parts.push(enc(scope.tenantId));\r\n parts.push(enc(scope ? scope.userId : \"\"));\r\n parts.push(\"\"); // trailing ':' after join\r\n return parts.join(\":\");\r\n}\r\n\r\n/**\r\n * Recover the capabilityId from a storage key for a given scope, or null when\r\n * the key does not belong to this scope.\r\n */\r\nexport function parseCapabilityFromKey(\r\n key: string,\r\n scope: Scope\r\n): string | null {\r\n if (typeof key !== \"string\") return null;\r\n const prefix = buildScopePrefix(scope);\r\n if (key.indexOf(prefix) !== 0) return null;\r\n const capId = key.slice(prefix.length);\r\n return capId || null;\r\n}\r\n"],"mappings":";;;;;;;;;AAqBA,IAAAA,OAAA,GAAAC,OAAA;AArBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAKO,
|
|
1
|
+
{"version":3,"file":"_storageKey.js","names":["_schema","require","KEY_PREFIX","exports","enc","value","encodeURIComponent","String","buildKey","scope","capabilityId","parts","KEY_SCHEME_VERSION","tenantId","push","userId","join","buildScopePrefix","parseCapabilityFromKey","key","prefix","indexOf","capId","slice","length"],"sources":["../../../../src/lib/v2/personalization/adapters/_storageKey.ts"],"sourcesContent":["/**\r\n * _storageKey — Portnet UI v2 · personalization adapters (private)\r\n *\r\n * Composite key scheme shared by storage adapters:\r\n *\r\n * portnet-ui:perso:v1:{tenantId?}:{userId}:{capabilityId}\r\n *\r\n * Design notes\r\n * - `resourceKey` is NOT in the key — it lives inside the capability\r\n * payload. One storage entry per (scope, capability) → cheap prefix scan\r\n * on load, one removeItem to clear.\r\n * - Scope segments (tenantId, userId) are encodeURIComponent-escaped so\r\n * arbitrary host identifiers — including ones containing ':' — remain\r\n * unambiguous. `capabilityId` is a controlled slug and is left raw so\r\n * `buildScopePrefix` + `slice()` recover it directly.\r\n * - `:v1:` is the KEY-SCHEME version (storage layout), independent of a\r\n * capability payload's `schemaVersion`.\r\n *\r\n * Underscore-prefixed: internal, never re-exported from the public surface.\r\n */\r\n\r\nimport { KEY_SCHEME_VERSION } from \"../schema\";\r\nimport type { Scope } from \"../types\";\r\n\r\nexport const KEY_PREFIX = \"portnet-ui:perso\";\r\n\r\nfunction enc(value: string | undefined): string {\r\n return encodeURIComponent(String(value == null ? \"\" : value));\r\n}\r\n\r\n/** Full storage key for one (scope, capability). */\r\nexport function buildKey(scope: Scope, capabilityId: string): string {\r\n const parts = [KEY_PREFIX, KEY_SCHEME_VERSION];\r\n if (scope && scope.tenantId) parts.push(enc(scope.tenantId));\r\n parts.push(enc(scope ? scope.userId : \"\"));\r\n parts.push(capabilityId);\r\n return parts.join(\":\");\r\n}\r\n\r\n/**\r\n * Prefix shared by every capability key of a scope — terminated by ':' so the\r\n * capability segment follows immediately.\r\n */\r\nexport function buildScopePrefix(scope: Scope): string {\r\n const parts = [KEY_PREFIX, KEY_SCHEME_VERSION];\r\n if (scope && scope.tenantId) parts.push(enc(scope.tenantId));\r\n parts.push(enc(scope ? scope.userId : \"\"));\r\n parts.push(\"\"); // trailing ':' after join\r\n return parts.join(\":\");\r\n}\r\n\r\n/**\r\n * Recover the capabilityId from a storage key for a given scope, or null when\r\n * the key does not belong to this scope.\r\n */\r\nexport function parseCapabilityFromKey(\r\n key: string,\r\n scope: Scope\r\n): string | null {\r\n if (typeof key !== \"string\") return null;\r\n const prefix = buildScopePrefix(scope);\r\n if (key.indexOf(prefix) !== 0) return null;\r\n const capId = key.slice(prefix.length);\r\n return capId || null;\r\n}\r\n"],"mappings":";;;;;;;;;AAqBA,IAAAA,OAAA,GAAAC,OAAA;AArBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAKO,MAAMC,UAAU,GAAAC,OAAA,CAAAD,UAAA,GAAG,kBAAkB;AAE5C,SAASE,GAAGA,CAACC,KAAyB,EAAU;EAC9C,OAAOC,kBAAkB,CAACC,MAAM,CAACF,KAAK,IAAI,IAAI,GAAG,EAAE,GAAGA,KAAK,CAAC,CAAC;AAC/D;;AAEA;AACO,SAASG,QAAQA,CAACC,KAAY,EAAEC,YAAoB,EAAU;EACnE,MAAMC,KAAK,GAAG,CAACT,UAAU,EAAEU,0BAAkB,CAAC;EAC9C,IAAIH,KAAK,IAAIA,KAAK,CAACI,QAAQ,EAAEF,KAAK,CAACG,IAAI,CAACV,GAAG,CAACK,KAAK,CAACI,QAAQ,CAAC,CAAC;EAC5DF,KAAK,CAACG,IAAI,CAACV,GAAG,CAACK,KAAK,GAAGA,KAAK,CAACM,MAAM,GAAG,EAAE,CAAC,CAAC;EAC1CJ,KAAK,CAACG,IAAI,CAACJ,YAAY,CAAC;EACxB,OAAOC,KAAK,CAACK,IAAI,CAAC,GAAG,CAAC;AACxB;;AAEA;AACA;AACA;AACA;AACO,SAASC,gBAAgBA,CAACR,KAAY,EAAU;EACrD,MAAME,KAAK,GAAG,CAACT,UAAU,EAAEU,0BAAkB,CAAC;EAC9C,IAAIH,KAAK,IAAIA,KAAK,CAACI,QAAQ,EAAEF,KAAK,CAACG,IAAI,CAACV,GAAG,CAACK,KAAK,CAACI,QAAQ,CAAC,CAAC;EAC5DF,KAAK,CAACG,IAAI,CAACV,GAAG,CAACK,KAAK,GAAGA,KAAK,CAACM,MAAM,GAAG,EAAE,CAAC,CAAC;EAC1CJ,KAAK,CAACG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;EAChB,OAAOH,KAAK,CAACK,IAAI,CAAC,GAAG,CAAC;AACxB;;AAEA;AACA;AACA;AACA;AACO,SAASE,sBAAsBA,CACpCC,GAAW,EACXV,KAAY,EACG;EACf,IAAI,OAAOU,GAAG,KAAK,QAAQ,EAAE,OAAO,IAAI;EACxC,MAAMC,MAAM,GAAGH,gBAAgB,CAACR,KAAK,CAAC;EACtC,IAAIU,GAAG,CAACE,OAAO,CAACD,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,IAAI;EAC1C,MAAME,KAAK,GAAGH,GAAG,CAACI,KAAK,CAACH,MAAM,CAACI,MAAM,CAAC;EACtC,OAAOF,KAAK,IAAI,IAAI;AACtB","ignoreList":[]}
|
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports
|
|
6
|
+
exports.default = createLocalStorageAdapter;
|
|
7
7
|
var _storageKey = require("./_storageKey");
|
|
8
|
-
|
|
8
|
+
/**
|
|
9
9
|
* createLocalStorageAdapter — Portnet UI v2 · personalization
|
|
10
10
|
*
|
|
11
11
|
* Default Adapter. Persists each capability as an opaque envelope under a
|
|
@@ -29,19 +29,20 @@ function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" =
|
|
|
29
29
|
* in OTHER tabs only — the writing tab is reconciled via the store's in-memory
|
|
30
30
|
* path.
|
|
31
31
|
*/
|
|
32
|
+
|
|
32
33
|
/** Object keys that must never be written from external (storage-derived) data. */
|
|
33
|
-
|
|
34
|
+
const RESERVED_KEYS = new Set(["__proto__", "constructor", "prototype"]);
|
|
34
35
|
function createLocalStorageAdapter(options) {
|
|
35
|
-
|
|
36
|
-
|
|
36
|
+
const opts = options || {};
|
|
37
|
+
const storage = opts.storage || (typeof window !== "undefined" && window.localStorage ? window.localStorage : null);
|
|
37
38
|
function isValidEnvelope(env) {
|
|
38
|
-
return !!env &&
|
|
39
|
+
return !!env && typeof env === "object" && Object.prototype.hasOwnProperty.call(env, "payload");
|
|
39
40
|
}
|
|
40
41
|
function safeRemove(key) {
|
|
41
42
|
if (!storage) return;
|
|
42
43
|
try {
|
|
43
44
|
storage.removeItem(key);
|
|
44
|
-
} catch
|
|
45
|
+
} catch {
|
|
45
46
|
/* ignore */
|
|
46
47
|
}
|
|
47
48
|
}
|
|
@@ -49,27 +50,27 @@ function createLocalStorageAdapter(options) {
|
|
|
49
50
|
/** Synchronous scan of every capability blob for `scope`. */
|
|
50
51
|
function loadSync(scope) {
|
|
51
52
|
if (!storage) return {};
|
|
52
|
-
|
|
53
|
+
const out = {};
|
|
53
54
|
try {
|
|
54
|
-
|
|
55
|
-
for (
|
|
56
|
-
|
|
55
|
+
const prefix = (0, _storageKey.buildScopePrefix)(scope);
|
|
56
|
+
for (let i = 0; i < storage.length; i++) {
|
|
57
|
+
const key = storage.key(i);
|
|
57
58
|
if (!key || key.indexOf(prefix) !== 0) continue;
|
|
58
|
-
|
|
59
|
+
const capId = key.slice(prefix.length);
|
|
59
60
|
// Skip empty + reserved keys: a same-origin writer could craft a
|
|
60
61
|
// `<prefix>__proto__` key, and `out[capId] = env` would otherwise hit
|
|
61
62
|
// the __proto__ setter on the accumulator (SEC-LS1).
|
|
62
63
|
if (!capId || RESERVED_KEYS.has(capId)) continue;
|
|
63
|
-
|
|
64
|
+
const raw = storage.getItem(key);
|
|
64
65
|
if (!raw) continue;
|
|
65
66
|
try {
|
|
66
|
-
|
|
67
|
+
const env = JSON.parse(raw);
|
|
67
68
|
if (isValidEnvelope(env)) out[capId] = env;else safeRemove(key);
|
|
68
|
-
} catch
|
|
69
|
+
} catch {
|
|
69
70
|
safeRemove(key);
|
|
70
71
|
}
|
|
71
72
|
}
|
|
72
|
-
} catch
|
|
73
|
+
} catch {
|
|
73
74
|
/* enumeration blocked (sandboxed) — return what we have */
|
|
74
75
|
}
|
|
75
76
|
return out;
|
|
@@ -97,13 +98,13 @@ function createLocalStorageAdapter(options) {
|
|
|
97
98
|
if (typeof window === "undefined" || typeof window.addEventListener !== "function") {
|
|
98
99
|
return function noop() {};
|
|
99
100
|
}
|
|
100
|
-
|
|
101
|
-
|
|
101
|
+
const prefix = (0, _storageKey.buildScopePrefix)(scope);
|
|
102
|
+
const handler = function handleStorage(e) {
|
|
102
103
|
if (!e || e.key == null) return; // e.key === null on storage.clear()
|
|
103
104
|
// storageArea may be undefined in some environments; only filter when present.
|
|
104
105
|
if (e.storageArea && e.storageArea !== storage) return;
|
|
105
106
|
if (e.key.indexOf(prefix) !== 0) return;
|
|
106
|
-
|
|
107
|
+
const capId = e.key.slice(prefix.length);
|
|
107
108
|
if (capId && !RESERVED_KEYS.has(capId)) onChange(capId);
|
|
108
109
|
};
|
|
109
110
|
window.addEventListener("storage", handler);
|
|
@@ -113,11 +114,11 @@ function createLocalStorageAdapter(options) {
|
|
|
113
114
|
}
|
|
114
115
|
return Object.freeze({
|
|
115
116
|
name: "localStorage",
|
|
116
|
-
load
|
|
117
|
-
loadSync
|
|
118
|
-
save
|
|
119
|
-
remove
|
|
120
|
-
subscribe
|
|
117
|
+
load,
|
|
118
|
+
loadSync,
|
|
119
|
+
save,
|
|
120
|
+
remove,
|
|
121
|
+
subscribe,
|
|
121
122
|
capabilities: Object.freeze({
|
|
122
123
|
crossTab: true,
|
|
123
124
|
remote: false,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createLocalStorageAdapter.js","names":["_storageKey","require","_typeof","obj","Symbol","iterator","constructor","prototype","RESERVED_KEYS","Set","createLocalStorageAdapter","options","opts","storage","window","localStorage","isValidEnvelope","env","Object","hasOwnProperty","call","safeRemove","key","removeItem","_unused","loadSync","scope","out","prefix","buildScopePrefix","i","length","indexOf","capId","slice","has","raw","getItem","JSON","parse","_unused2","_unused3","load","Promise","resolve","save","capabilityId","envelope","setItem","buildKey","stringify","e","reject","remove","subscribe","onChange","addEventListener","noop","handler","handleStorage","storageArea","unsubscribe","removeEventListener","freeze","name","capabilities","crossTab","remote","shared"],"sources":["../../../../src/lib/v2/personalization/adapters/createLocalStorageAdapter.ts"],"sourcesContent":["/**\r\n * createLocalStorageAdapter — Portnet UI v2 · personalization\r\n *\r\n * Default Adapter. Persists each capability as an opaque envelope under a\r\n * scoped key (see adapters/_storageKey.ts). The adapter never interprets\r\n * `envelope.payload`.\r\n *\r\n * Safety:\r\n * - SSR-safe: with no `window`, the adapter is inert (load → {}, save →\r\n * resolved no-op) so it can be constructed anywhere.\r\n * - Every storage access is try/catch-wrapped. `save` REJECTS on quota/\r\n * private-mode failure so the store can keep the optimistic value for the\r\n * session and surface the error via onError.\r\n * - Reads self-heal: malformed entries are removed on sight.\r\n * - Reserved-key hardening: capability ids of `__proto__` / `constructor` /\r\n * `prototype` are skipped while scanning so a crafted same-origin key can't\r\n * reach the `__proto__` setter on the accumulator (SEC-LS1).\r\n * - NOTE: localStorage is readable by any same-origin script. Do NOT persist\r\n * secrets or PII in a capability payload (SEC-LS2).\r\n *\r\n * Cross-tab: `subscribe` listens to the `storage` event, which the spec fires\r\n * in OTHER tabs only — the writing tab is reconciled via the store's in-memory\r\n * path.\r\n */\r\n\r\nimport { buildKey, buildScopePrefix } from \"./_storageKey\";\r\nimport type { Adapter, Envelope, Scope } from \"../types\";\r\n\r\nexport interface LocalStorageAdapterOptions {\r\n /** Inject a Storage impl (tests / custom). */\r\n storage?: Storage | undefined;\r\n}\r\n\r\n/** Object keys that must never be written from external (storage-derived) data. */\r\nconst RESERVED_KEYS = new Set([\"__proto__\", \"constructor\", \"prototype\"]);\r\n\r\nexport default function createLocalStorageAdapter(\r\n options?: LocalStorageAdapterOptions\r\n): Adapter {\r\n const opts: LocalStorageAdapterOptions = options || {};\r\n const storage: Storage | null =\r\n opts.storage ||\r\n (typeof window !== \"undefined\" && window.localStorage\r\n ? window.localStorage\r\n : null);\r\n\r\n function isValidEnvelope(env: unknown): env is Envelope {\r\n return (\r\n !!env &&\r\n typeof env === \"object\" &&\r\n Object.prototype.hasOwnProperty.call(env, \"payload\")\r\n );\r\n }\r\n\r\n function safeRemove(key: string): void {\r\n if (!storage) return;\r\n try {\r\n storage.removeItem(key);\r\n } catch {\r\n /* ignore */\r\n }\r\n }\r\n\r\n /** Synchronous scan of every capability blob for `scope`. */\r\n function loadSync(scope: Scope): Record<string, Envelope> {\r\n if (!storage) return {};\r\n const out: Record<string, Envelope> = {};\r\n try {\r\n const prefix = buildScopePrefix(scope);\r\n for (let i = 0; i < storage.length; i++) {\r\n const key = storage.key(i);\r\n if (!key || key.indexOf(prefix) !== 0) continue;\r\n const capId = key.slice(prefix.length);\r\n // Skip empty + reserved keys: a same-origin writer could craft a\r\n // `<prefix>__proto__` key, and `out[capId] = env` would otherwise hit\r\n // the __proto__ setter on the accumulator (SEC-LS1).\r\n if (!capId || RESERVED_KEYS.has(capId)) continue;\r\n const raw = storage.getItem(key);\r\n if (!raw) continue;\r\n try {\r\n const env: unknown = JSON.parse(raw);\r\n if (isValidEnvelope(env)) out[capId] = env;\r\n else safeRemove(key);\r\n } catch {\r\n safeRemove(key);\r\n }\r\n }\r\n } catch {\r\n /* enumeration blocked (sandboxed) — return what we have */\r\n }\r\n return out;\r\n }\r\n\r\n function load(scope: Scope): Promise<Record<string, Envelope>> {\r\n return Promise.resolve(loadSync(scope));\r\n }\r\n\r\n function save(\r\n scope: Scope,\r\n capabilityId: string,\r\n envelope: Envelope\r\n ): Promise<void> {\r\n if (!storage) return Promise.resolve();\r\n try {\r\n storage.setItem(buildKey(scope, capabilityId), JSON.stringify(envelope));\r\n return Promise.resolve();\r\n } catch (e) {\r\n // Quota exceeded / private mode / sandboxed: reject so the store keeps\r\n // the optimistic in-memory value and notifies onError.\r\n return Promise.reject(e);\r\n }\r\n }\r\n\r\n function remove(scope: Scope, capabilityId: string): Promise<void> {\r\n if (!storage) return Promise.resolve();\r\n safeRemove(buildKey(scope, capabilityId));\r\n return Promise.resolve();\r\n }\r\n\r\n function subscribe(\r\n scope: Scope,\r\n onChange: (capabilityId: string) => void\r\n ): () => void {\r\n if (\r\n typeof window === \"undefined\" ||\r\n typeof window.addEventListener !== \"function\"\r\n ) {\r\n return function noop() {};\r\n }\r\n const prefix = buildScopePrefix(scope);\r\n const handler = function handleStorage(e: StorageEvent) {\r\n if (!e || e.key == null) return; // e.key === null on storage.clear()\r\n // storageArea may be undefined in some environments; only filter when present.\r\n if (e.storageArea && e.storageArea !== storage) return;\r\n if (e.key.indexOf(prefix) !== 0) return;\r\n const capId = e.key.slice(prefix.length);\r\n if (capId && !RESERVED_KEYS.has(capId)) onChange(capId);\r\n };\r\n window.addEventListener(\"storage\", handler);\r\n return function unsubscribe() {\r\n window.removeEventListener(\"storage\", handler);\r\n };\r\n }\r\n\r\n return Object.freeze({\r\n name: \"localStorage\",\r\n load,\r\n loadSync,\r\n save,\r\n remove,\r\n subscribe,\r\n capabilities: Object.freeze({\r\n crossTab: true,\r\n remote: false,\r\n shared: false,\r\n }),\r\n });\r\n}\r\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"createLocalStorageAdapter.js","names":["_storageKey","require","RESERVED_KEYS","Set","createLocalStorageAdapter","options","opts","storage","window","localStorage","isValidEnvelope","env","Object","prototype","hasOwnProperty","call","safeRemove","key","removeItem","loadSync","scope","out","prefix","buildScopePrefix","i","length","indexOf","capId","slice","has","raw","getItem","JSON","parse","load","Promise","resolve","save","capabilityId","envelope","setItem","buildKey","stringify","e","reject","remove","subscribe","onChange","addEventListener","noop","handler","handleStorage","storageArea","unsubscribe","removeEventListener","freeze","name","capabilities","crossTab","remote","shared"],"sources":["../../../../src/lib/v2/personalization/adapters/createLocalStorageAdapter.ts"],"sourcesContent":["/**\r\n * createLocalStorageAdapter — Portnet UI v2 · personalization\r\n *\r\n * Default Adapter. Persists each capability as an opaque envelope under a\r\n * scoped key (see adapters/_storageKey.ts). The adapter never interprets\r\n * `envelope.payload`.\r\n *\r\n * Safety:\r\n * - SSR-safe: with no `window`, the adapter is inert (load → {}, save →\r\n * resolved no-op) so it can be constructed anywhere.\r\n * - Every storage access is try/catch-wrapped. `save` REJECTS on quota/\r\n * private-mode failure so the store can keep the optimistic value for the\r\n * session and surface the error via onError.\r\n * - Reads self-heal: malformed entries are removed on sight.\r\n * - Reserved-key hardening: capability ids of `__proto__` / `constructor` /\r\n * `prototype` are skipped while scanning so a crafted same-origin key can't\r\n * reach the `__proto__` setter on the accumulator (SEC-LS1).\r\n * - NOTE: localStorage is readable by any same-origin script. Do NOT persist\r\n * secrets or PII in a capability payload (SEC-LS2).\r\n *\r\n * Cross-tab: `subscribe` listens to the `storage` event, which the spec fires\r\n * in OTHER tabs only — the writing tab is reconciled via the store's in-memory\r\n * path.\r\n */\r\n\r\nimport { buildKey, buildScopePrefix } from \"./_storageKey\";\r\nimport type { Adapter, Envelope, Scope } from \"../types\";\r\n\r\nexport interface LocalStorageAdapterOptions {\r\n /** Inject a Storage impl (tests / custom). */\r\n storage?: Storage | undefined;\r\n}\r\n\r\n/** Object keys that must never be written from external (storage-derived) data. */\r\nconst RESERVED_KEYS = new Set([\"__proto__\", \"constructor\", \"prototype\"]);\r\n\r\nexport default function createLocalStorageAdapter(\r\n options?: LocalStorageAdapterOptions\r\n): Adapter {\r\n const opts: LocalStorageAdapterOptions = options || {};\r\n const storage: Storage | null =\r\n opts.storage ||\r\n (typeof window !== \"undefined\" && window.localStorage\r\n ? window.localStorage\r\n : null);\r\n\r\n function isValidEnvelope(env: unknown): env is Envelope {\r\n return (\r\n !!env &&\r\n typeof env === \"object\" &&\r\n Object.prototype.hasOwnProperty.call(env, \"payload\")\r\n );\r\n }\r\n\r\n function safeRemove(key: string): void {\r\n if (!storage) return;\r\n try {\r\n storage.removeItem(key);\r\n } catch {\r\n /* ignore */\r\n }\r\n }\r\n\r\n /** Synchronous scan of every capability blob for `scope`. */\r\n function loadSync(scope: Scope): Record<string, Envelope> {\r\n if (!storage) return {};\r\n const out: Record<string, Envelope> = {};\r\n try {\r\n const prefix = buildScopePrefix(scope);\r\n for (let i = 0; i < storage.length; i++) {\r\n const key = storage.key(i);\r\n if (!key || key.indexOf(prefix) !== 0) continue;\r\n const capId = key.slice(prefix.length);\r\n // Skip empty + reserved keys: a same-origin writer could craft a\r\n // `<prefix>__proto__` key, and `out[capId] = env` would otherwise hit\r\n // the __proto__ setter on the accumulator (SEC-LS1).\r\n if (!capId || RESERVED_KEYS.has(capId)) continue;\r\n const raw = storage.getItem(key);\r\n if (!raw) continue;\r\n try {\r\n const env: unknown = JSON.parse(raw);\r\n if (isValidEnvelope(env)) out[capId] = env;\r\n else safeRemove(key);\r\n } catch {\r\n safeRemove(key);\r\n }\r\n }\r\n } catch {\r\n /* enumeration blocked (sandboxed) — return what we have */\r\n }\r\n return out;\r\n }\r\n\r\n function load(scope: Scope): Promise<Record<string, Envelope>> {\r\n return Promise.resolve(loadSync(scope));\r\n }\r\n\r\n function save(\r\n scope: Scope,\r\n capabilityId: string,\r\n envelope: Envelope\r\n ): Promise<void> {\r\n if (!storage) return Promise.resolve();\r\n try {\r\n storage.setItem(buildKey(scope, capabilityId), JSON.stringify(envelope));\r\n return Promise.resolve();\r\n } catch (e) {\r\n // Quota exceeded / private mode / sandboxed: reject so the store keeps\r\n // the optimistic in-memory value and notifies onError.\r\n return Promise.reject(e);\r\n }\r\n }\r\n\r\n function remove(scope: Scope, capabilityId: string): Promise<void> {\r\n if (!storage) return Promise.resolve();\r\n safeRemove(buildKey(scope, capabilityId));\r\n return Promise.resolve();\r\n }\r\n\r\n function subscribe(\r\n scope: Scope,\r\n onChange: (capabilityId: string) => void\r\n ): () => void {\r\n if (\r\n typeof window === \"undefined\" ||\r\n typeof window.addEventListener !== \"function\"\r\n ) {\r\n return function noop() {};\r\n }\r\n const prefix = buildScopePrefix(scope);\r\n const handler = function handleStorage(e: StorageEvent) {\r\n if (!e || e.key == null) return; // e.key === null on storage.clear()\r\n // storageArea may be undefined in some environments; only filter when present.\r\n if (e.storageArea && e.storageArea !== storage) return;\r\n if (e.key.indexOf(prefix) !== 0) return;\r\n const capId = e.key.slice(prefix.length);\r\n if (capId && !RESERVED_KEYS.has(capId)) onChange(capId);\r\n };\r\n window.addEventListener(\"storage\", handler);\r\n return function unsubscribe() {\r\n window.removeEventListener(\"storage\", handler);\r\n };\r\n }\r\n\r\n return Object.freeze({\r\n name: \"localStorage\",\r\n load,\r\n loadSync,\r\n save,\r\n remove,\r\n subscribe,\r\n capabilities: Object.freeze({\r\n crossTab: true,\r\n remote: false,\r\n shared: false,\r\n }),\r\n });\r\n}\r\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports
|
|
6
|
+
exports.default = createMemoryAdapter;
|
|
7
7
|
/**
|
|
8
8
|
* createMemoryAdapter — Portnet UI v2 · personalization
|
|
9
9
|
*
|
|
@@ -19,17 +19,17 @@ exports["default"] = createMemoryAdapter;
|
|
|
19
19
|
*/
|
|
20
20
|
|
|
21
21
|
function createMemoryAdapter(options) {
|
|
22
|
-
|
|
22
|
+
const opts = options || {};
|
|
23
23
|
/** composite key -> envelope */
|
|
24
|
-
|
|
24
|
+
const map = new Map();
|
|
25
25
|
function compositeKey(scope, capabilityId) {
|
|
26
|
-
|
|
27
|
-
|
|
26
|
+
const tenant = scope && scope.tenantId ? scope.tenantId : "";
|
|
27
|
+
const user = scope && scope.userId ? scope.userId : "";
|
|
28
28
|
return tenant + "::" + user + "::" + capabilityId;
|
|
29
29
|
}
|
|
30
30
|
function scopePrefix(scope) {
|
|
31
|
-
|
|
32
|
-
|
|
31
|
+
const tenant = scope && scope.tenantId ? scope.tenantId : "";
|
|
32
|
+
const user = scope && scope.userId ? scope.userId : "";
|
|
33
33
|
return tenant + "::" + user + "::";
|
|
34
34
|
}
|
|
35
35
|
if (Array.isArray(opts.seed)) {
|
|
@@ -40,8 +40,8 @@ function createMemoryAdapter(options) {
|
|
|
40
40
|
});
|
|
41
41
|
}
|
|
42
42
|
function loadSync(scope) {
|
|
43
|
-
|
|
44
|
-
|
|
43
|
+
const out = {};
|
|
44
|
+
const prefix = scopePrefix(scope);
|
|
45
45
|
map.forEach(function collect(envelope, key) {
|
|
46
46
|
if (key.indexOf(prefix) === 0) {
|
|
47
47
|
out[key.slice(prefix.length)] = envelope;
|
|
@@ -57,15 +57,15 @@ function createMemoryAdapter(options) {
|
|
|
57
57
|
return Promise.resolve();
|
|
58
58
|
}
|
|
59
59
|
function remove(scope, capabilityId) {
|
|
60
|
-
map
|
|
60
|
+
map.delete(compositeKey(scope, capabilityId));
|
|
61
61
|
return Promise.resolve();
|
|
62
62
|
}
|
|
63
63
|
return Object.freeze({
|
|
64
64
|
name: "memory",
|
|
65
|
-
load
|
|
66
|
-
loadSync
|
|
67
|
-
save
|
|
68
|
-
remove
|
|
65
|
+
load,
|
|
66
|
+
loadSync,
|
|
67
|
+
save,
|
|
68
|
+
remove,
|
|
69
69
|
capabilities: Object.freeze({
|
|
70
70
|
crossTab: false,
|
|
71
71
|
remote: false,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createMemoryAdapter.js","names":["createMemoryAdapter","options","opts","map","Map","compositeKey","scope","capabilityId","tenant","tenantId","user","userId","scopePrefix","Array","isArray","seed","forEach","seedEntry","entry","envelope","set","loadSync","out","prefix","collect","key","indexOf","slice","length","load","Promise","resolve","save","remove","Object","freeze","name","capabilities","crossTab","remote","shared"],"sources":["../../../../src/lib/v2/personalization/adapters/createMemoryAdapter.ts"],"sourcesContent":["/**\r\n * createMemoryAdapter — Portnet UI v2 · personalization\r\n *\r\n * An Adapter that keeps everything in a Map. Use it for:\r\n * - unit tests (deterministic, no global storage state),\r\n * - SSR / sandboxed environments where localStorage is unavailable,\r\n * - Storybook stories (optionally pre-seeded),\r\n * - an explicit \"do not persist\" opt-out.\r\n *\r\n * Same contract as the localStorage adapter minus `subscribe` (a single\r\n * in-memory context has no cross-tab notion). `remote:false` lets the store\r\n * skip the redundant async re-hydrate after a synchronous seed.\r\n */\r\n\r\nimport type { Adapter, Envelope, Scope } from \"../types\";\r\n\r\nexport interface MemoryAdapterSeedEntry {\r\n scope: Scope;\r\n capabilityId: string;\r\n envelope: Envelope;\r\n}\r\n\r\nexport interface MemoryAdapterOptions {\r\n /** Optional pre-populated entries for tests/stories. */\r\n seed?: MemoryAdapterSeedEntry[] | undefined;\r\n}\r\n\r\nexport default function createMemoryAdapter(\r\n options?: MemoryAdapterOptions\r\n): Adapter {\r\n const opts: MemoryAdapterOptions = options || {};\r\n /** composite key -> envelope */\r\n const map = new Map<string, Envelope>();\r\n\r\n function compositeKey(scope: Scope, capabilityId: string): string {\r\n const tenant = scope && scope.tenantId ? scope.tenantId : \"\";\r\n const user = scope && scope.userId ? scope.userId : \"\";\r\n return tenant + \"::\" + user + \"::\" + capabilityId;\r\n }\r\n\r\n function scopePrefix(scope: Scope): string {\r\n const tenant = scope && scope.tenantId ? scope.tenantId : \"\";\r\n const user = scope && scope.userId ? scope.userId : \"\";\r\n return tenant + \"::\" + user + \"::\";\r\n }\r\n\r\n if (Array.isArray(opts.seed)) {\r\n opts.seed.forEach(function seedEntry(entry) {\r\n if (entry && entry.scope && entry.capabilityId && entry.envelope) {\r\n map.set(compositeKey(entry.scope, entry.capabilityId), entry.envelope);\r\n }\r\n });\r\n }\r\n\r\n function loadSync(scope: Scope): Record<string, Envelope> {\r\n const out: Record<string, Envelope> = {};\r\n const prefix = scopePrefix(scope);\r\n map.forEach(function collect(envelope, key) {\r\n if (key.indexOf(prefix) === 0) {\r\n out[key.slice(prefix.length)] = envelope;\r\n }\r\n });\r\n return out;\r\n }\r\n\r\n function load(scope: Scope): Promise<Record<string, Envelope>> {\r\n return Promise.resolve(loadSync(scope));\r\n }\r\n\r\n function save(\r\n scope: Scope,\r\n capabilityId: string,\r\n envelope: Envelope\r\n ): Promise<void> {\r\n map.set(compositeKey(scope, capabilityId), envelope);\r\n return Promise.resolve();\r\n }\r\n\r\n function remove(scope: Scope, capabilityId: string): Promise<void> {\r\n map.delete(compositeKey(scope, capabilityId));\r\n return Promise.resolve();\r\n }\r\n\r\n return Object.freeze({\r\n name: \"memory\",\r\n load,\r\n loadSync,\r\n save,\r\n remove,\r\n capabilities: Object.freeze({\r\n crossTab: false,\r\n remote: false,\r\n shared: false,\r\n }),\r\n });\r\n}\r\n"],"mappings":";;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAee,SAASA,mBAAmBA,CACzCC,OAA8B,EACrB;EACT,
|
|
1
|
+
{"version":3,"file":"createMemoryAdapter.js","names":["createMemoryAdapter","options","opts","map","Map","compositeKey","scope","capabilityId","tenant","tenantId","user","userId","scopePrefix","Array","isArray","seed","forEach","seedEntry","entry","envelope","set","loadSync","out","prefix","collect","key","indexOf","slice","length","load","Promise","resolve","save","remove","delete","Object","freeze","name","capabilities","crossTab","remote","shared"],"sources":["../../../../src/lib/v2/personalization/adapters/createMemoryAdapter.ts"],"sourcesContent":["/**\r\n * createMemoryAdapter — Portnet UI v2 · personalization\r\n *\r\n * An Adapter that keeps everything in a Map. Use it for:\r\n * - unit tests (deterministic, no global storage state),\r\n * - SSR / sandboxed environments where localStorage is unavailable,\r\n * - Storybook stories (optionally pre-seeded),\r\n * - an explicit \"do not persist\" opt-out.\r\n *\r\n * Same contract as the localStorage adapter minus `subscribe` (a single\r\n * in-memory context has no cross-tab notion). `remote:false` lets the store\r\n * skip the redundant async re-hydrate after a synchronous seed.\r\n */\r\n\r\nimport type { Adapter, Envelope, Scope } from \"../types\";\r\n\r\nexport interface MemoryAdapterSeedEntry {\r\n scope: Scope;\r\n capabilityId: string;\r\n envelope: Envelope;\r\n}\r\n\r\nexport interface MemoryAdapterOptions {\r\n /** Optional pre-populated entries for tests/stories. */\r\n seed?: MemoryAdapterSeedEntry[] | undefined;\r\n}\r\n\r\nexport default function createMemoryAdapter(\r\n options?: MemoryAdapterOptions\r\n): Adapter {\r\n const opts: MemoryAdapterOptions = options || {};\r\n /** composite key -> envelope */\r\n const map = new Map<string, Envelope>();\r\n\r\n function compositeKey(scope: Scope, capabilityId: string): string {\r\n const tenant = scope && scope.tenantId ? scope.tenantId : \"\";\r\n const user = scope && scope.userId ? scope.userId : \"\";\r\n return tenant + \"::\" + user + \"::\" + capabilityId;\r\n }\r\n\r\n function scopePrefix(scope: Scope): string {\r\n const tenant = scope && scope.tenantId ? scope.tenantId : \"\";\r\n const user = scope && scope.userId ? scope.userId : \"\";\r\n return tenant + \"::\" + user + \"::\";\r\n }\r\n\r\n if (Array.isArray(opts.seed)) {\r\n opts.seed.forEach(function seedEntry(entry) {\r\n if (entry && entry.scope && entry.capabilityId && entry.envelope) {\r\n map.set(compositeKey(entry.scope, entry.capabilityId), entry.envelope);\r\n }\r\n });\r\n }\r\n\r\n function loadSync(scope: Scope): Record<string, Envelope> {\r\n const out: Record<string, Envelope> = {};\r\n const prefix = scopePrefix(scope);\r\n map.forEach(function collect(envelope, key) {\r\n if (key.indexOf(prefix) === 0) {\r\n out[key.slice(prefix.length)] = envelope;\r\n }\r\n });\r\n return out;\r\n }\r\n\r\n function load(scope: Scope): Promise<Record<string, Envelope>> {\r\n return Promise.resolve(loadSync(scope));\r\n }\r\n\r\n function save(\r\n scope: Scope,\r\n capabilityId: string,\r\n envelope: Envelope\r\n ): Promise<void> {\r\n map.set(compositeKey(scope, capabilityId), envelope);\r\n return Promise.resolve();\r\n }\r\n\r\n function remove(scope: Scope, capabilityId: string): Promise<void> {\r\n map.delete(compositeKey(scope, capabilityId));\r\n return Promise.resolve();\r\n }\r\n\r\n return Object.freeze({\r\n name: \"memory\",\r\n load,\r\n loadSync,\r\n save,\r\n remove,\r\n capabilities: Object.freeze({\r\n crossTab: false,\r\n remote: false,\r\n shared: false,\r\n }),\r\n });\r\n}\r\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -5,17 +5,17 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
Object.defineProperty(exports, "createLocalStorageAdapter", {
|
|
7
7
|
enumerable: true,
|
|
8
|
-
get: function
|
|
9
|
-
return _createLocalStorageAdapter
|
|
8
|
+
get: function () {
|
|
9
|
+
return _createLocalStorageAdapter.default;
|
|
10
10
|
}
|
|
11
11
|
});
|
|
12
12
|
Object.defineProperty(exports, "createMemoryAdapter", {
|
|
13
13
|
enumerable: true,
|
|
14
|
-
get: function
|
|
15
|
-
return _createMemoryAdapter
|
|
14
|
+
get: function () {
|
|
15
|
+
return _createMemoryAdapter.default;
|
|
16
16
|
}
|
|
17
17
|
});
|
|
18
18
|
var _createLocalStorageAdapter = _interopRequireDefault(require("./createLocalStorageAdapter"));
|
|
19
19
|
var _createMemoryAdapter = _interopRequireDefault(require("./createMemoryAdapter"));
|
|
20
|
-
function _interopRequireDefault(
|
|
20
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
21
21
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["_createLocalStorageAdapter","_interopRequireDefault","require","_createMemoryAdapter","
|
|
1
|
+
{"version":3,"file":"index.js","names":["_createLocalStorageAdapter","_interopRequireDefault","require","_createMemoryAdapter","e","__esModule","default"],"sources":["../../../../src/lib/v2/personalization/adapters/index.ts"],"sourcesContent":["/**\r\n * adapters — Portnet UI v2 · personalization\r\n *\r\n * Built-in storage adapters. A future remote adapter\r\n * (createRestPersonalizationAdapter) drops in here and is swappable with\r\n * zero changes to the store, the slices, the hooks, or the components.\r\n */\r\n\r\nexport { default as createLocalStorageAdapter } from \"./createLocalStorageAdapter\";\r\nexport { default as createMemoryAdapter } from \"./createMemoryAdapter\";\r\n"],"mappings":";;;;;;;;;;;;;;;;;AAQA,IAAAA,0BAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,oBAAA,GAAAF,sBAAA,CAAAC,OAAA;AAAuE,SAAAD,uBAAAG,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA","ignoreList":[]}
|