@rio-cloud/rio-uikit 2.0.0 → 2.1.0
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/components/actionBarItem/ActionBarItem.d.ts +2 -2
- package/components/actionBarItem/ActionBarItem.js.map +1 -1
- package/components/applicationHeader/ApplicationHeader.d.ts +6 -7
- package/components/applicationHeader/ApplicationHeader.js.map +1 -1
- package/components/applicationLayout/SubNavigation.d.ts +7 -0
- package/components/applicationLayout/SubNavigation.js.map +1 -1
- package/components/assetTree/AssetTree.d.ts +7 -0
- package/components/assetTree/AssetTree.js.map +1 -1
- package/components/assetTree/Tree.d.ts +15 -0
- package/components/assetTree/Tree.js.map +1 -1
- package/components/assetTree/TreeIcon.d.ts +30 -0
- package/components/assetTree/TreeIcon.js +16 -0
- package/components/assetTree/TreeIcon.js.map +1 -0
- package/components/assetTree/TreeLeaf.js +22 -22
- package/components/assetTree/TreeLeaf.js.map +1 -1
- package/components/assetTree/TreeNode.js +25 -25
- package/components/assetTree/TreeNode.js.map +1 -1
- package/components/assetTree/TreeSearch.d.ts +2 -0
- package/components/assetTree/TreeSearch.js.map +1 -1
- package/components/barList/BarList.d.ts +26 -0
- package/components/barList/BarList.js.map +1 -1
- package/components/bottomSheet/BottomSheet.d.ts +17 -3
- package/components/bottomSheet/BottomSheet.js.map +1 -1
- package/components/bottomSheet/TimedBottomSheet.d.ts +10 -0
- package/components/bottomSheet/TimedBottomSheet.js.map +1 -1
- package/components/calendarStripe/CalendarStripe.d.ts +1 -1
- package/components/calendarStripe/CalendarStripe.js +34 -36
- package/components/calendarStripe/CalendarStripe.js.map +1 -1
- package/components/charts/Area.d.ts +2 -2
- package/components/charts/Area.js.map +1 -1
- package/components/charts/Line.d.ts +2 -2
- package/components/charts/Line.js.map +1 -1
- package/components/checkbox/Checkbox.d.ts +0 -3
- package/components/checkbox/Checkbox.js.map +1 -1
- package/components/clearableInput/ClearableInput.d.ts +21 -20
- package/components/clearableInput/ClearableInput.js.map +1 -1
- package/components/collapse/Collapse.d.ts +3 -0
- package/components/collapse/Collapse.js +12 -12
- package/components/collapse/Collapse.js.map +1 -1
- package/components/contentLoader/ContentLoader.d.ts +10 -2
- package/components/contentLoader/ContentLoader.js.map +1 -1
- package/components/dataTabs/DataTabs.d.ts +6 -0
- package/components/dataTabs/DataTabs.js.map +1 -1
- package/components/datepicker/DatePicker.d.ts +2 -2
- package/components/datepicker/DatePicker.js +31 -31
- package/components/datepicker/DatePicker.js.map +1 -1
- package/components/dialog/ConfirmationDialog.d.ts +22 -0
- package/components/dialog/ConfirmationDialog.js.map +1 -1
- package/components/dialog/Dialog.d.ts +13 -1
- package/components/dialog/Dialog.js.map +1 -1
- package/components/dialog/ReleaseNotesDialog.d.ts +3 -3
- package/components/dialog/ReleaseNotesDialog.js.map +1 -1
- package/components/dropdown/ButtonDropdown.d.ts +4 -0
- package/components/dropdown/ButtonDropdown.js +51 -51
- package/components/dropdown/ButtonDropdown.js.map +1 -1
- package/components/dropdown/DropdownSubmenu.d.ts +4 -0
- package/components/dropdown/DropdownSubmenu.js.map +1 -1
- package/components/editableContent/EditableContent.d.ts +6 -0
- package/components/editableContent/EditableContent.js.map +1 -1
- package/components/expander/ExpanderList.d.ts +3 -0
- package/components/expander/ExpanderList.js.map +1 -1
- package/components/expander/ExpanderPanel.d.ts +14 -4
- package/components/expander/ExpanderPanel.js.map +1 -1
- package/components/fade/Fade.d.ts +1 -1
- package/components/fade/Fade.js.map +1 -1
- package/components/filepicker/FilePicker.d.ts +0 -2
- package/components/filepicker/FilePicker.js.map +1 -1
- package/components/groupedItemList/GroupedItemList.d.ts +10 -7
- package/components/groupedItemList/GroupedItemList.js.map +1 -1
- package/components/listMenu/ListMenu.js.map +1 -1
- package/components/listMenu/ListMenuGroup.d.ts +2 -1
- package/components/listMenu/ListMenuGroup.js.map +1 -1
- package/components/map/components/Map.js.map +1 -1
- package/components/map/components/constants.js.map +1 -1
- package/components/map/components/features/ContextMenuItem.d.ts +1 -1
- package/components/map/components/features/ContextMenuItem.js +2 -17
- package/components/map/components/features/ContextMenuItem.js.map +1 -1
- package/components/map/components/features/basics/Polyline.d.ts +4 -1
- package/components/map/components/features/basics/Polyline.js +1 -1
- package/components/map/components/features/basics/Polyline.js.map +1 -1
- package/components/map/components/features/layers/MarkerLayer.d.ts +3 -1
- package/components/map/components/features/layers/MarkerLayer.js.map +1 -1
- package/components/map/components/features/layers/clustering/ClusterLayer.js +1 -1
- package/components/map/components/features/layers/clustering/ClusterLayer.js.map +1 -1
- package/components/map/components/features/layers/clustering/SimpleClusterLayer.d.ts +3 -2
- package/components/map/components/features/layers/clustering/SimpleClusterLayer.js.map +1 -1
- package/components/map/components/features/layers/overlayLayers/RoadRestrictionLayer.js +7 -7
- package/components/map/components/features/layers/overlayLayers/RoadRestrictionLayer.js.map +1 -1
- package/components/map/components/features/layers/overlayLayers/TrafficLayer.js +4 -4
- package/components/map/components/features/layers/overlayLayers/TrafficLayer.js.map +1 -1
- package/components/map/utils/clustering.d.ts +6 -1
- package/components/map/utils/clustering.js +25 -19
- package/components/map/utils/clustering.js.map +1 -1
- package/components/map/utils/rendering.d.ts +1 -1
- package/components/map/utils/rendering.js +23 -23
- package/components/map/utils/rendering.js.map +1 -1
- package/components/menuItems/MenuItem.d.ts +23 -0
- package/components/menuItems/MenuItem.js.map +1 -1
- package/components/notification/Notification.js +4 -4
- package/components/notification/Notification.js.map +1 -1
- package/components/onboarding/OnboardingTip.d.ts +18 -12
- package/components/onboarding/OnboardingTip.js.map +1 -1
- package/components/overlay/OverlayTrigger.d.ts +43 -1
- package/components/overlay/OverlayTrigger.js.map +1 -1
- package/components/pager/Pager.d.ts +3 -0
- package/components/pager/Pager.js.map +1 -1
- package/components/popover/Popover.d.ts +1 -0
- package/components/popover/Popover.js.map +1 -1
- package/components/preloader/ImagePreloader.d.ts +1 -1
- package/components/preloader/ImagePreloader.js.map +1 -1
- package/components/radiobutton/RadioButton.d.ts +9 -5
- package/components/radiobutton/RadioButton.js.map +1 -1
- package/components/releaseNotes/ReleaseNotes.d.ts +0 -3
- package/components/releaseNotes/ReleaseNotes.js.map +1 -1
- package/components/resizer/Resizer.d.ts +17 -3
- package/components/resizer/Resizer.js.map +1 -1
- package/components/rioglyph/Rioglyph.d.ts +20 -8
- package/components/rioglyph/Rioglyph.js.map +1 -1
- package/components/rules/RulesWrapper.js +1 -1
- package/components/rules/RulesWrapper.js.map +1 -1
- package/components/saveableInput/SaveableDateInput.d.ts +20 -2
- package/components/saveableInput/SaveableDateInput.js.map +1 -1
- package/components/saveableInput/SaveableInput.d.ts +10 -2
- package/components/saveableInput/SaveableInput.js.map +1 -1
- package/components/selects/BaseSelectDropdown.js +90 -79
- package/components/selects/BaseSelectDropdown.js.map +1 -1
- package/components/selects/Select.d.ts +5 -0
- package/components/selects/Select.js +94 -94
- package/components/selects/Select.js.map +1 -1
- package/components/sidebars/Sidebar.d.ts +19 -3
- package/components/sidebars/Sidebar.js.map +1 -1
- package/components/slider/RangeSlider.d.ts +15 -0
- package/components/slider/RangeSlider.js.map +1 -1
- package/components/slider/Slider.d.ts +9 -0
- package/components/slider/Slider.js.map +1 -1
- package/components/smoothScrollbars/SmoothScrollbars.d.ts +44 -0
- package/components/smoothScrollbars/SmoothScrollbars.js.map +1 -1
- package/components/spinner/Spinner.d.ts +3 -3
- package/components/spinner/Spinner.js.map +1 -1
- package/components/states/BaseStateProps.d.ts +6 -2
- package/components/states/StateIcon.d.ts +14 -1
- package/components/states/StateIcon.js.map +1 -1
- package/components/statsWidget/StatsWidget.d.ts +2 -0
- package/components/statsWidget/StatsWidget.js.map +1 -1
- package/components/statsWidget/StatsWidgetBody.d.ts +1 -0
- package/components/statsWidget/StatsWidgetBody.js.map +1 -1
- package/components/statsWidget/StatsWidgetNumber.d.ts +2 -0
- package/components/statsWidget/StatsWidgetNumber.js.map +1 -1
- package/components/statusBar/StatusBar.d.ts +2 -31
- package/components/statusBar/StatusBar.js.map +1 -1
- package/components/statusBar/StatusBarIcon.d.ts +2 -2
- package/components/statusBar/StatusBarIcon.js.map +1 -1
- package/components/statusBar/StatusBarLabel.d.ts +2 -2
- package/components/statusBar/StatusBarLabel.js.map +1 -1
- package/components/statusBar/StatusBarProgressBar.d.ts +1 -1
- package/components/statusBar/StatusBarProgressBar.js.map +1 -1
- package/components/statusBar/{StatusBar.types.d.ts → StatusBarProps.d.ts} +44 -2
- package/components/steppedProgressBar/SteppedProgressBar.d.ts +1 -1
- package/components/steppedProgressBar/SteppedProgressBar.js.map +1 -1
- package/components/switch/Switch.d.ts +13 -1
- package/components/switch/Switch.js.map +1 -1
- package/components/table/SortArrowDown.d.ts +1 -1
- package/components/table/SortArrowDown.js.map +1 -1
- package/components/table/SortArrowUp.d.ts +1 -1
- package/components/table/SortArrowUp.js.map +1 -1
- package/components/table/TableSettingsDialog.d.ts +5 -0
- package/components/table/TableSettingsDialog.js +119 -109
- package/components/table/TableSettingsDialog.js.map +1 -1
- package/components/table/TableSettingsDialogFooter.js +9 -9
- package/components/table/TableSettingsDialogFooter.js.map +1 -1
- package/components/table/TableViewToggles.d.ts +21 -1
- package/components/table/TableViewToggles.js.map +1 -1
- package/components/tag/Tag.d.ts +7 -2
- package/components/tag/Tag.js.map +1 -1
- package/components/tagManager/TagManager.d.ts +15 -0
- package/components/tagManager/TagManager.js.map +1 -1
- package/components/tagManager/TagManagerTag.d.ts +9 -0
- package/components/teaser/Teaser.d.ts +57 -55
- package/components/teaser/Teaser.js.map +1 -1
- package/components/teaser/TeaserContainer.d.ts +1 -1
- package/components/teaser/TeaserContainer.js.map +1 -1
- package/components/tooltip/SimpleTooltip.d.ts +22 -4
- package/components/tooltip/SimpleTooltip.js.map +1 -1
- package/components/tooltip/Tooltip.d.ts +22 -2
- package/components/tooltip/Tooltip.js.map +1 -1
- package/components/video/ResponsiveVideo.d.ts +8 -3
- package/components/video/ResponsiveVideo.js.map +1 -1
- package/hooks/useKey.d.ts +1 -1
- package/hooks/useKey.js.map +1 -1
- package/hooks/useOnboarding.d.ts +86 -80
- package/hooks/useOnboarding.js.map +1 -1
- package/hooks/useTableExport.js.map +1 -1
- package/hooks/useUncontrollable.d.ts +1 -1
- package/hooks/useUncontrollable.js.map +1 -1
- package/package.json +12 -14
- package/utils/colorScheme.js +14 -13
- package/utils/colorScheme.js.map +1 -1
- package/utils/cssuseragent.js.map +1 -1
- package/utils/scrollItemIntoView.js +12 -11
- package/utils/scrollItemIntoView.js.map +1 -1
- package/utils/urlFeatureToggles.js +19 -20
- package/utils/urlFeatureToggles.js.map +1 -1
- package/version.d.ts +1 -1
- package/version.js +1 -1
- package/version.js.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useOnboarding.js","sources":["../../src/hooks/useOnboarding.ts"],"sourcesContent":["import {\n driver,\n type PopoverDOM as DriverPopoverDOM,\n type State as DriverState,\n type AllowedButtons,\n type DriveStep,\n type DriverHook,\n} from 'driver.js';\nimport 'driver.js/dist/driver.css';\n\n// Features:\n// [x] - Close on click outside\n// [x] - Multiple steps with backdrop\n// [x] - drive vs. highlight\n// [x] - allow for controlling state (setStep, etc)\n// [-] - Single step to replace OnboardingTip (no buttons except close), no backdrop\n// [-] - Styling - as driver.js is using a singleton, setting styles for another onboarding step will override the global styles\n\nexport type PopoverDOM = DriverPopoverDOM;\nexport type OnboardingState = DriverState;\n\ntype DriverCallbackOptions = Parameters<DriverHook>[2];\n\n/**\n * Describes a single step in an Onboarding Tour.\n *\n * Is based on the underlying {@link DriveStep driver.js step configuration object}.\n *\n * @see https://driverjs.com/docs/configuration\n */\nexport type OnboardingStep = DriveStep & {\n /**\n * The target element to highlight.\n *\n * This can be a DOM element (ref), a function that returns a DOM element, or a CSS selector (most likely, you want\n * to go with a selector as it's the easiest one to implement).\n *\n * If this is a selector, the first matching element will be highlighted.\n *\n * If no element is given, the popover will simply be centered on the screen.\n *\n * @example '[data-onboarding-walkthrough-step=\"2\"]'\n */\n element?: string | Element;\n\n /**\n * Defines the content and appearance of the popover.\n */\n popover: {\n /**\n * Title text to be shown.\n *\n * You can use HTML here, but maybe you shouldn't.\n */\n title?: string;\n\n /**\n * Description text to be shown.\n *\n * You can use HTML here, but maybe you shouldn't.\n */\n description?: string;\n\n /**\n * The position of the popover relative to the target element.\n *\n * @default 'left'\n */\n side?: 'top' | 'right' | 'bottom' | 'left' | 'over';\n\n /**\n * Where the popover is anchored to the target element.\n *\n * @default 'start'\n */\n align?: 'start' | 'center' | 'end';\n\n /**\n * The buttons that should be shown in the popover - for this step only.\n *\n * When highlighting a single element (there is just a single step), there are no buttons by default. When\n * showing a step of a multi-step tour, all buttons are shown by default.\n *\n * The \"close\" button is a simple \"X\" in the popover.\n * The \"previous\" and \"next\" buttons are actual text buttons. can define the text contents of those buttons via\n * the {@link prevBtnText}, {@link nextBtnText} and {@link doneBtnText} properties.\n *\n * This overrides the showButtons array on the {@link OnboardingOptions}.\n */\n showButtons?: AllowedButtons[];\n\n /**\n * The buttons that should be disabled in the popover - for this step only.\n *\n * This is useful when you want to show some of the buttons, but disable them anyway.\n *\n * This overrides the disableButtons array on the {@link OnboardingOptions}.\n */\n disableButtons?: AllowedButtons[];\n\n /**\n * Whether to disable interaction with the highlighted element.\n *\n * @default false\n */\n disableActiveInteraction?: boolean;\n\n /**\n * Custom class to add to the popover element.\n *\n * This can be used to style the popover.\n */\n popoverClass?: string;\n\n /**\n * Text to use for the \"previous\" button - specific for this step only.\n *\n * This overrides the prevBtnText on the {@link OnboardingOptions}.\n */\n prevBtnText?: string;\n\n /**\n * Text to use for the \"next\" button - specific for this step only.\n *\n * This overrides the nextBtnText on the {@link OnboardingOptions}.\n */\n nextBtnText?: string;\n\n /**\n * Text to use for the \"done\" (a.k.a. the final \"next\") button - specific for this step only.\n *\n * This overrides the doneBtnText on the {@link OnboardingOptions}.\n */\n doneBtnText?: string;\n };\n\n /**\n * Callback triggered when the highlighting is about to become visible.\n *\n * @param element The target DOM element of the step.\n * @param step The {@link DriveStep driver.js step object} configured for the step.\n * @param opts The configuration options and current state of the driver object as well as the driver object itself.\n */\n onHighlightStarted?: (element: Element | undefined, step: OnboardingStep, opts: DriverCallbackOptions) => void;\n\n /**\n * Callback triggered when the highlight is visible.\n *\n * @param element The target DOM element of the step.\n * @param step The {@link DriveStep driver.js step object} configured for the step.\n * @param opts The configuration options and current state of the driver object as well as the driver object itself.\n */\n onHighlighted?: (element: Element | undefined, step: OnboardingStep, opts: DriverCallbackOptions) => void;\n\n /**\n * Callback triggered when the highlight is about to become invisible.\n *\n * @param element The target DOM element of the step.\n * @param step The {@link DriveStep driver.js step object} configured for the step.\n * @param opts The configuration options and current state of the driver object as well as the driver object itself.\n */\n onDeselected?: (element: Element | undefined, step: OnboardingStep, opts: DriverCallbackOptions) => void;\n};\n\ntype OnboardingOptions = {\n /**\n * Array of steps to highlight.\n *\n * You should pass this when you want to set up a tour.\n */\n steps?: OnboardingStep[];\n\n /**\n * The buttons that should be shown in popovers.\n *\n * When highlighting a single element (there is just a single step), there are no buttons by default. When showing\n * a step of a multi-step tour, all buttons are shown by default.\n *\n * The \"close\" button is a simple \"X\" in the popover.\n * The \"previous\" and \"next\" buttons are actual text buttons. can define the text contents of those buttons via\n * the {@link prevBtnText}, {@link nextBtnText} and {@link doneBtnText} properties.\n */\n showButtons?: AllowedButtons[];\n\n /**\n * The buttons that should be disabled in popovers.\n *\n * This is useful when you want to show some of the buttons, but disable them anyway.\n */\n disableButtons?: AllowedButtons[];\n\n /**\n * Text to use for the \"previous\" button.\n *\n * @default 'Previous'\n */\n prevBtnText?: string;\n\n /**\n * Text to use for the \"next\" button.\n *\n * @default 'Next'\n */\n nextBtnText?: string;\n\n /**\n * Text to use for the \"done\" (a.k.a. the final \"next\") button.\n *\n * When given, this overrides the {@link nextBtnText} in the final popover of a tour.\n *\n * @default 'Done'\n */\n doneBtnText?: string;\n\n /**\n * Indicates whether to show progress in the onboarding popover.\n *\n * @default true\n */\n showProgress?: boolean;\n\n /**\n * Whether to allow closing the popover by clicking on the backdrop.\n *\n * This should be disabled during a tour to ensure the user completes the tour, but can be enabled on the last step.\n *\n * @default false\n */\n allowClose?: boolean;\n\n /**\n * Distance between the highlighted element and the cutout.\n *\n * @default 10\n */\n stagePadding?: number;\n\n /**\n * Radius of the cutout around the highlighted element.\n *\n * @default 5\n */\n stageRadius?: number;\n\n /**\n * Whether to allow keyboard navigation.\n *\n * @default true\n */\n allowKeyboardControl?: boolean;\n\n /**\n * Whether to disable interaction with the highlighted element.\n * Can be configured at the step level as well.\n *\n * @default false\n */\n disableActiveInteraction?: boolean;\n\n /**\n * Option to disable the backdrop. Note, the backdrop element is still there but with 100% opacity\n * and the close on the backdrop is disabled.\n *\n * @default false\n */\n noBackdrop?: boolean;\n\n /**\n * Additional classes set on the popover itself.\n */\n popoverClass?: string;\n\n /**\n * Callback triggered when an onboarding popover renders.\n *\n * @param element The target DOM element of the step.\n * @param opts The configuration options and current state of the driver object as well as the driver object itself.\n */\n onPopoverRender?: (popover: PopoverDOM, opts: OnboardingState) => void;\n\n /**\n * Callback triggered when the onboarding tour is destroyed.\n */\n onDestroyed?: () => void;\n};\n\nexport const useOnboardingTour = (params: OnboardingOptions) => {\n const {\n steps,\n prevBtnText = 'Previous',\n nextBtnText = 'Next',\n doneBtnText = 'Done',\n showProgress = true,\n allowClose = false,\n stagePadding = 10,\n stageRadius = 5,\n allowKeyboardControl = true,\n showButtons,\n disableButtons,\n popoverClass,\n noBackdrop = false,\n onPopoverRender = () => {},\n onDestroyed = () => {},\n ...driverProps\n } = params;\n\n const handlePopoverRender = (popover: DriverPopoverDOM, options: DriverCallbackOptions) => {\n onPopoverRender(popover, options.state);\n };\n\n const handleDestroyed = () => {\n onDestroyed();\n };\n\n const isSingleStep = !steps || steps.length === 1;\n\n // This configuration is applied to all steps.\n // Driver.js allows also for individual customization for single steps too.\n const driverInstance = driver({\n steps,\n prevBtnText,\n nextBtnText,\n doneBtnText,\n showProgress: isSingleStep ? false : showProgress,\n showButtons: isSingleStep ? (['close'] as AllowedButtons[]) : showButtons,\n allowClose,\n overlayOpacity: noBackdrop ? 0 : 0.5,\n disableButtons,\n progressText: '{{current}} / {{total}}',\n overlayColor: 'var(--color-black)',\n stagePadding,\n stageRadius,\n allowKeyboardControl,\n popoverClass,\n onPopoverRender: handlePopoverRender,\n onDestroyed: handleDestroyed,\n ...driverProps,\n });\n\n return {\n // Use for onboarding tours. Pass in all steps as \"steps\" parameter for initial configuration.\n run: () => driverInstance.drive(),\n\n // Use for single element highlights -> see useOnboardingTip\n // highlight: (step: OnboardingStep) => driverInstance.highlight(step),\n\n // Cleanup the onboarding\n destroy: () => driverInstance.destroy(),\n\n // Gets the current state of the onboarding with the current step\n onboardingState: () => driverInstance.getState(),\n\n // Recalculate and redraw the highlight\n refresh: () => driverInstance.refresh(),\n\n // Is the tour or highlight currently active\n isActive: () => driverInstance.isActive(),\n\n // Move to the next step\n moveNext: () => driverInstance.moveNext(),\n\n // Move to the previous step\n movePrevious: () => driverInstance.movePrevious(),\n\n // Move to the step 4\n moveTo: (stepNumber: number) => driverInstance.moveTo(stepNumber),\n\n // Is there a next step\n hasNextStep: () => driverInstance.hasNextStep(),\n\n // Is there a previous step\n hasPreviousStep: () => driverInstance.hasPreviousStep(),\n\n // Is the current step the first step\n isFirstStep: () => driverInstance.isFirstStep(),\n\n // Is the current step the last step\n isLastStep: () => driverInstance.isLastStep(),\n\n // Gets the active step index\n getActiveIndex: () => driverInstance.getActiveIndex(),\n };\n};\n\ntype OnboardingTipOptions = {\n allowClose?: boolean;\n stagePadding?: number;\n stageRadius?: number;\n noBackdrop?: boolean;\n};\n\n/**\n * Note: please use the {@link import('../components/onboarding/OnboardingTip')#default OnboardingTip} instead of this\n * hook!\n *\n * This is kept only for future development of driver.js with the hope to solve the global driver styling issue and to\n * eventually replace the OnboardingTooltip also with driver.js.\n *\n * @experimental\n */\nexport const useOnboardingTip = (options?: OnboardingTipOptions) => {\n const { allowClose = true, stagePadding = 0, stageRadius = 5, noBackdrop = true } = options || {};\n\n const driverInstance = driver({\n allowClose,\n stagePadding,\n stageRadius,\n overlayOpacity: noBackdrop ? 0 : 0.5,\n overlayColor: undefined,\n });\n\n return {\n highlight: (step: OnboardingStep) => driverInstance.highlight(step),\n destroy: () => driverInstance.destroy(),\n refresh: () => driverInstance.refresh(),\n isActive: () => driverInstance.isActive(),\n };\n};\n"],"names":["useOnboardingTour","params","steps","prevBtnText","nextBtnText","doneBtnText","showProgress","allowClose","stagePadding","stageRadius","allowKeyboardControl","showButtons","disableButtons","popoverClass","noBackdrop","onPopoverRender","onDestroyed","driverProps","handlePopoverRender","popover","options","handleDestroyed","isSingleStep","driverInstance","driver","stepNumber","useOnboardingTip","step"],"mappings":";;AA8RO,MAAMA,IAAoB,CAACC,MAA8B;AAC5D,QAAM;AAAA,IACF,OAAAC;AAAA,IACA,aAAAC,IAAc;AAAA,IACd,aAAAC,IAAc;AAAA,IACd,aAAAC,IAAc;AAAA,IACd,cAAAC,IAAe;AAAA,IACf,YAAAC,IAAa;AAAA,IACb,cAAAC,IAAe;AAAA,IACf,aAAAC,IAAc;AAAA,IACd,sBAAAC,IAAuB;AAAA,IACvB,aAAAC;AAAA,IACA,gBAAAC;AAAA,IACA,cAAAC;AAAA,IACA,YAAAC,IAAa;AAAA,IACb,iBAAAC,IAAkB,MAAM;AAAA,IAAC;AAAA,IACzB,aAAAC,IAAc,MAAM;AAAA,IAAC;AAAA,IACrB,GAAGC;AAAA,EAAA,IACHhB,GAEEiB,IAAsB,CAACC,GAA2BC,MAAmC;AACvF,IAAAL,EAAgBI,GAASC,EAAQ,KAAK;AAAA,EAC1C,GAEMC,IAAkB,MAAM;AAC1B,IAAAL,EAAA;AAAA,EACJ,GAEMM,IAAe,CAACpB,KAASA,EAAM,WAAW,GAI1CqB,IAAiBC,EAAO;AAAA,IAC1B,OAAAtB;AAAA,IACA,aAAAC;AAAA,IACA,aAAAC;AAAA,IACA,aAAAC;AAAA,IACA,cAAciB,IAAe,KAAQhB;AAAA,IACrC,aAAagB,IAAgB,CAAC,OAAO,IAAyBX;AAAA,IAC9D,YAAAJ;AAAA,IACA,gBAAgBO,IAAa,IAAI;AAAA,IACjC,gBAAAF;AAAA,IACA,cAAc;AAAA,IACd,cAAc;AAAA,IACd,cAAAJ;AAAA,IACA,aAAAC;AAAA,IACA,sBAAAC;AAAA,IACA,cAAAG;AAAA,IACA,iBAAiBK;AAAA,IACjB,aAAaG;AAAA,IACb,GAAGJ;AAAA,EAAA,CACN;AAED,SAAO;AAAA;AAAA,IAEH,KAAK,MAAMM,EAAe,MAAA;AAAA;AAAA;AAAA;AAAA,IAM1B,SAAS,MAAMA,EAAe,QAAA;AAAA;AAAA,IAG9B,iBAAiB,MAAMA,EAAe,SAAA;AAAA;AAAA,IAGtC,SAAS,MAAMA,EAAe,QAAA;AAAA;AAAA,IAG9B,UAAU,MAAMA,EAAe,SAAA;AAAA;AAAA,IAG/B,UAAU,MAAMA,EAAe,SAAA;AAAA;AAAA,IAG/B,cAAc,MAAMA,EAAe,aAAA;AAAA;AAAA,IAGnC,QAAQ,CAACE,MAAuBF,EAAe,OAAOE,CAAU;AAAA;AAAA,IAGhE,aAAa,MAAMF,EAAe,YAAA;AAAA;AAAA,IAGlC,iBAAiB,MAAMA,EAAe,gBAAA;AAAA;AAAA,IAGtC,aAAa,MAAMA,EAAe,YAAA;AAAA;AAAA,IAGlC,YAAY,MAAMA,EAAe,WAAA;AAAA;AAAA,IAGjC,gBAAgB,MAAMA,EAAe,eAAA;AAAA,EAAe;AAE5D,GAkBaG,IAAmB,CAACN,MAAmC;AAChE,QAAM,EAAE,YAAAb,IAAa,IAAM,cAAAC,IAAe,GAAG,aAAAC,IAAc,GAAG,YAAAK,IAAa,GAAA,IAASM,KAAW,CAAA,GAEzFG,IAAiBC,EAAO;AAAA,IAC1B,YAAAjB;AAAA,IACA,cAAAC;AAAA,IACA,aAAAC;AAAA,IACA,gBAAgBK,IAAa,IAAI;AAAA,IACjC,cAAc;AAAA,EAAA,CACjB;AAED,SAAO;AAAA,IACH,WAAW,CAACa,MAAyBJ,EAAe,UAAUI,CAAI;AAAA,IAClE,SAAS,MAAMJ,EAAe,QAAA;AAAA,IAC9B,SAAS,MAAMA,EAAe,QAAA;AAAA,IAC9B,UAAU,MAAMA,EAAe,SAAA;AAAA,EAAS;AAEhD;"}
|
|
1
|
+
{"version":3,"file":"useOnboarding.js","sources":["../../src/hooks/useOnboarding.ts"],"sourcesContent":["import {\n driver,\n type PopoverDOM as DriverPopoverDOM,\n type State as DriverState,\n type AllowedButtons,\n type DriveStep,\n type DriverHook,\n} from 'driver.js';\nimport 'driver.js/dist/driver.css';\n\n// Features:\n// [x] - Close on click outside\n// [x] - Multiple steps with backdrop\n// [x] - drive vs. highlight\n// [x] - allow for controlling state (setStep, etc)\n// [-] - Single step to replace OnboardingTip (no buttons except close), no backdrop\n// [-] - Styling - as driver.js is using a singleton, setting styles for another onboarding step will override the global styles\n\nexport type PopoverDOM = DriverPopoverDOM;\nexport type OnboardingState = DriverState;\n\ntype DriverCallbackOptions = Parameters<DriverHook>[2];\n\ntype OnboardingPopoverContent = {\n /**\n * Title text to be shown.\n *\n * You can use HTML here, but maybe you shouldn't.\n */\n title?: string;\n\n /**\n * Description text to be shown.\n *\n * You can use HTML here, but maybe you shouldn't.\n */\n description?: string;\n\n /**\n * The position of the popover relative to the target element.\n *\n * @default 'left'\n */\n side?: 'top' | 'right' | 'bottom' | 'left' | 'over';\n\n /**\n * Where the popover is anchored to the target element.\n *\n * @default 'start'\n */\n align?: 'start' | 'center' | 'end';\n\n /**\n * The buttons that should be shown in the popover - for this step only.\n *\n * When highlighting a single element (there is just a single step), there are no buttons by default. When\n * showing a step of a multi-step tour, all buttons are shown by default.\n *\n * The \"close\" button is a simple \"X\" in the popover.\n * The \"previous\" and \"next\" buttons are actual text buttons. can define the text contents of those buttons via\n * the {@link prevBtnText}, {@link nextBtnText} and {@link doneBtnText} properties.\n *\n * This overrides the showButtons array on the {@link OnboardingOptions}.\n */\n showButtons?: AllowedButtons[];\n\n /**\n * The buttons that should be disabled in the popover - for this step only.\n *\n * This is useful when you want to show some of the buttons, but disable them anyway.\n *\n * This overrides the disableButtons array on the {@link OnboardingOptions}.\n */\n disableButtons?: AllowedButtons[];\n\n /**\n * Whether to disable interaction with the highlighted element.\n *\n * @default false\n */\n disableActiveInteraction?: boolean;\n\n /**\n * Custom class to add to the popover element.\n *\n * This can be used to style the popover.\n */\n popoverClass?: string;\n\n /**\n * Text to use for the \"previous\" button - specific for this step only.\n *\n * This overrides the prevBtnText on the {@link OnboardingOptions}.\n */\n prevBtnText?: string;\n\n /**\n * Text to use for the \"next\" button - specific for this step only.\n *\n * This overrides the nextBtnText on the {@link OnboardingOptions}.\n */\n nextBtnText?: string;\n\n /**\n * Text to use for the \"done\" (a.k.a. the final \"next\") button - specific for this step only.\n *\n * This overrides the doneBtnText on the {@link OnboardingOptions}.\n */\n doneBtnText?: string;\n};\n\n/**\n * Describes a single step in an Onboarding Tour.\n *\n * Is based on the underlying {@link DriveStep driver.js step configuration object}.\n *\n * @see https://driverjs.com/docs/configuration\n */\nexport type OnboardingStep = DriveStep & {\n /**\n * The target element to highlight.\n *\n * This can be a DOM element (ref), a function that returns a DOM element, or a CSS selector (most likely, you want\n * to go with a selector as it's the easiest one to implement).\n *\n * If this is a selector, the first matching element will be highlighted.\n *\n * If no element is given, the popover will simply be centered on the screen.\n *\n * @example '[data-onboarding-walkthrough-step=\"2\"]'\n */\n element?: string | Element;\n\n /**\n * Defines the content and appearance of the popover.\n */\n popover: OnboardingPopoverContent;\n\n /**\n * Callback triggered when the highlighting is about to become visible.\n *\n * @param element The target DOM element of the step.\n * @param step The {@link DriveStep driver.js step object} configured for the step.\n * @param opts The configuration options and current state of the driver object as well as the driver object itself.\n */\n onHighlightStarted?: (element: Element | undefined, step: OnboardingStep, opts: DriverCallbackOptions) => void;\n\n /**\n * Callback triggered when the highlight is visible.\n *\n * @param element The target DOM element of the step.\n * @param step The {@link DriveStep driver.js step object} configured for the step.\n * @param opts The configuration options and current state of the driver object as well as the driver object itself.\n */\n onHighlighted?: (element: Element | undefined, step: OnboardingStep, opts: DriverCallbackOptions) => void;\n\n /**\n * Callback triggered when the highlight is about to become invisible.\n *\n * @param element The target DOM element of the step.\n * @param step The {@link DriveStep driver.js step object} configured for the step.\n * @param opts The configuration options and current state of the driver object as well as the driver object itself.\n */\n onDeselected?: (element: Element | undefined, step: OnboardingStep, opts: DriverCallbackOptions) => void;\n};\n\ntype OnboardingOptions = {\n /**\n * Array of steps to highlight.\n *\n * You should pass this when you want to set up a tour.\n */\n steps?: OnboardingStep[];\n\n /**\n * Array of buttons to show in the popover.\n *\n * When highlighting a single element (there is just a single step), there are no buttons by default. When showing\n * a step of a multi-step tour, all buttons are shown by default.\n *\n * The `close` button is a simple \"X\" in the popover.\n *\n * The `previous` and `next` buttons are actual text buttons. You can define the text contents of those buttons via\n * the {@link prevBtnText}, {@link nextBtnText} and {@link doneBtnText} properties.\n *\n * Defaults to [\"next\", \"previous\", \"close\"] for product tours and [] for single element highlighting.\n *\n * @default '[\"next\", \"previous\", \"close\"]'\n */\n showButtons?: AllowedButtons[];\n\n /**\n * The buttons that should be disabled in popovers.\n *\n * This is useful when you want to show some of the buttons, but disable them anyway.\n */\n disableButtons?: AllowedButtons[];\n\n /**\n * Text to use for the \"previous\" button.\n *\n * @default 'Previous'\n */\n prevBtnText?: string;\n\n /**\n * Text to use for the \"next\" button.\n *\n * @default 'Next'\n */\n nextBtnText?: string;\n\n /**\n * Text to use for the \"done\" (a.k.a. the final \"next\") button.\n *\n * When given, this overrides the {@link nextBtnText} in the final popover of a tour.\n *\n * @default 'Done'\n */\n doneBtnText?: string;\n\n /**\n * Indicates whether to show progress in the onboarding popover.\n *\n * @default true\n */\n showProgress?: boolean;\n\n /**\n * Whether to allow closing the popover by clicking on the backdrop.\n *\n * This should be disabled during a tour to ensure the user completes the tour, but can be enabled on the last step.\n *\n * @default false\n */\n allowClose?: boolean;\n\n /**\n * Distance between the highlighted element and the cutout.\n *\n * @default 10\n */\n stagePadding?: number;\n\n /**\n * Radius of the cutout around the highlighted element.\n *\n * @default 5\n */\n stageRadius?: number;\n\n /**\n * Whether to allow keyboard navigation.\n *\n * @default true\n */\n allowKeyboardControl?: boolean;\n\n /**\n * Whether to disable interaction with the highlighted element.\n * Can be configured at the step level as well.\n *\n * @default false\n */\n disableActiveInteraction?: boolean;\n\n /**\n * Option to disable the backdrop. Note, the backdrop element is still there but with 100% opacity\n * and the close on the backdrop is disabled.\n *\n * @default false\n */\n noBackdrop?: boolean;\n\n /**\n * Additional classes set on the popover itself.\n */\n popoverClass?: string;\n\n /**\n * Callback triggered when an onboarding popover renders.\n *\n * @param element The target DOM element of the step.\n * @param opts The configuration options and current state of the driver object as well as the driver object itself.\n */\n onPopoverRender?: (popover: PopoverDOM, opts: OnboardingState) => void;\n\n /**\n * Callback triggered when the onboarding tour is destroyed.\n */\n onDestroyed?: () => void;\n};\n\nexport const useOnboardingTour = (params: OnboardingOptions) => {\n const {\n steps,\n prevBtnText = 'Previous',\n nextBtnText = 'Next',\n doneBtnText = 'Done',\n showProgress = true,\n allowClose = false,\n stagePadding = 10,\n stageRadius = 5,\n allowKeyboardControl = true,\n showButtons,\n disableButtons,\n popoverClass,\n noBackdrop = false,\n onPopoverRender = () => {},\n onDestroyed = () => {},\n ...driverProps\n } = params;\n\n const handlePopoverRender = (popover: DriverPopoverDOM, options: DriverCallbackOptions) => {\n onPopoverRender(popover, options.state);\n };\n\n const handleDestroyed = () => {\n onDestroyed();\n };\n\n const isSingleStep = !steps || steps.length === 1;\n\n // This configuration is applied to all steps.\n // Driver.js allows also for individual customization for single steps too.\n const driverInstance = driver({\n steps,\n prevBtnText,\n nextBtnText,\n doneBtnText,\n showProgress: isSingleStep ? false : showProgress,\n showButtons: isSingleStep ? (['close'] as AllowedButtons[]) : showButtons,\n allowClose,\n overlayOpacity: noBackdrop ? 0 : 0.5,\n disableButtons,\n progressText: '{{current}} / {{total}}',\n overlayColor: 'var(--color-black)',\n stagePadding,\n stageRadius,\n allowKeyboardControl,\n popoverClass,\n onPopoverRender: handlePopoverRender,\n onDestroyed: handleDestroyed,\n ...driverProps,\n });\n\n return {\n // Use for onboarding tours. Pass in all steps as \"steps\" parameter for initial configuration.\n run: () => driverInstance.drive(),\n\n // Use for single element highlights -> see useOnboardingTip\n // highlight: (step: OnboardingStep) => driverInstance.highlight(step),\n\n // Cleanup the onboarding\n destroy: () => driverInstance.destroy(),\n\n // Gets the current state of the onboarding with the current step\n onboardingState: () => driverInstance.getState(),\n\n // Recalculate and redraw the highlight\n refresh: () => driverInstance.refresh(),\n\n // Is the tour or highlight currently active\n isActive: () => driverInstance.isActive(),\n\n // Move to the next step\n moveNext: () => driverInstance.moveNext(),\n\n // Move to the previous step\n movePrevious: () => driverInstance.movePrevious(),\n\n // Move to the step 4\n moveTo: (stepNumber: number) => driverInstance.moveTo(stepNumber),\n\n // Is there a next step\n hasNextStep: () => driverInstance.hasNextStep(),\n\n // Is there a previous step\n hasPreviousStep: () => driverInstance.hasPreviousStep(),\n\n // Is the current step the first step\n isFirstStep: () => driverInstance.isFirstStep(),\n\n // Is the current step the last step\n isLastStep: () => driverInstance.isLastStep(),\n\n // Gets the active step index\n getActiveIndex: () => driverInstance.getActiveIndex(),\n };\n};\n\ntype OnboardingTipOptions = {\n allowClose?: boolean;\n stagePadding?: number;\n stageRadius?: number;\n noBackdrop?: boolean;\n};\n\n/**\n * Note: please use the {@link import('../components/onboarding/OnboardingTip')#default OnboardingTip} instead of this\n * hook!\n *\n * This is kept only for future development of driver.js with the hope to solve the global driver styling issue and to\n * eventually replace the OnboardingTooltip also with driver.js.\n *\n * @experimental\n */\nexport const useOnboardingTip = (options?: OnboardingTipOptions) => {\n const { allowClose = true, stagePadding = 0, stageRadius = 5, noBackdrop = true } = options || {};\n\n const driverInstance = driver({\n allowClose,\n stagePadding,\n stageRadius,\n overlayOpacity: noBackdrop ? 0 : 0.5,\n overlayColor: undefined,\n });\n\n return {\n highlight: (step: OnboardingStep) => driverInstance.highlight(step),\n destroy: () => driverInstance.destroy(),\n refresh: () => driverInstance.refresh(),\n isActive: () => driverInstance.isActive(),\n };\n};\n"],"names":["useOnboardingTour","params","steps","prevBtnText","nextBtnText","doneBtnText","showProgress","allowClose","stagePadding","stageRadius","allowKeyboardControl","showButtons","disableButtons","popoverClass","noBackdrop","onPopoverRender","onDestroyed","driverProps","handlePopoverRender","popover","options","handleDestroyed","isSingleStep","driverInstance","driver","stepNumber","useOnboardingTip","step"],"mappings":";;AAqSO,MAAMA,IAAoB,CAACC,MAA8B;AAC5D,QAAM;AAAA,IACF,OAAAC;AAAA,IACA,aAAAC,IAAc;AAAA,IACd,aAAAC,IAAc;AAAA,IACd,aAAAC,IAAc;AAAA,IACd,cAAAC,IAAe;AAAA,IACf,YAAAC,IAAa;AAAA,IACb,cAAAC,IAAe;AAAA,IACf,aAAAC,IAAc;AAAA,IACd,sBAAAC,IAAuB;AAAA,IACvB,aAAAC;AAAA,IACA,gBAAAC;AAAA,IACA,cAAAC;AAAA,IACA,YAAAC,IAAa;AAAA,IACb,iBAAAC,IAAkB,MAAM;AAAA,IAAC;AAAA,IACzB,aAAAC,IAAc,MAAM;AAAA,IAAC;AAAA,IACrB,GAAGC;AAAA,EAAA,IACHhB,GAEEiB,IAAsB,CAACC,GAA2BC,MAAmC;AACvF,IAAAL,EAAgBI,GAASC,EAAQ,KAAK;AAAA,EAC1C,GAEMC,IAAkB,MAAM;AAC1B,IAAAL,EAAA;AAAA,EACJ,GAEMM,IAAe,CAACpB,KAASA,EAAM,WAAW,GAI1CqB,IAAiBC,EAAO;AAAA,IAC1B,OAAAtB;AAAA,IACA,aAAAC;AAAA,IACA,aAAAC;AAAA,IACA,aAAAC;AAAA,IACA,cAAciB,IAAe,KAAQhB;AAAA,IACrC,aAAagB,IAAgB,CAAC,OAAO,IAAyBX;AAAA,IAC9D,YAAAJ;AAAA,IACA,gBAAgBO,IAAa,IAAI;AAAA,IACjC,gBAAAF;AAAA,IACA,cAAc;AAAA,IACd,cAAc;AAAA,IACd,cAAAJ;AAAA,IACA,aAAAC;AAAA,IACA,sBAAAC;AAAA,IACA,cAAAG;AAAA,IACA,iBAAiBK;AAAA,IACjB,aAAaG;AAAA,IACb,GAAGJ;AAAA,EAAA,CACN;AAED,SAAO;AAAA;AAAA,IAEH,KAAK,MAAMM,EAAe,MAAA;AAAA;AAAA;AAAA;AAAA,IAM1B,SAAS,MAAMA,EAAe,QAAA;AAAA;AAAA,IAG9B,iBAAiB,MAAMA,EAAe,SAAA;AAAA;AAAA,IAGtC,SAAS,MAAMA,EAAe,QAAA;AAAA;AAAA,IAG9B,UAAU,MAAMA,EAAe,SAAA;AAAA;AAAA,IAG/B,UAAU,MAAMA,EAAe,SAAA;AAAA;AAAA,IAG/B,cAAc,MAAMA,EAAe,aAAA;AAAA;AAAA,IAGnC,QAAQ,CAACE,MAAuBF,EAAe,OAAOE,CAAU;AAAA;AAAA,IAGhE,aAAa,MAAMF,EAAe,YAAA;AAAA;AAAA,IAGlC,iBAAiB,MAAMA,EAAe,gBAAA;AAAA;AAAA,IAGtC,aAAa,MAAMA,EAAe,YAAA;AAAA;AAAA,IAGlC,YAAY,MAAMA,EAAe,WAAA;AAAA;AAAA,IAGjC,gBAAgB,MAAMA,EAAe,eAAA;AAAA,EAAe;AAE5D,GAkBaG,IAAmB,CAACN,MAAmC;AAChE,QAAM,EAAE,YAAAb,IAAa,IAAM,cAAAC,IAAe,GAAG,aAAAC,IAAc,GAAG,YAAAK,IAAa,GAAA,IAASM,KAAW,CAAA,GAEzFG,IAAiBC,EAAO;AAAA,IAC1B,YAAAjB;AAAA,IACA,cAAAC;AAAA,IACA,aAAAC;AAAA,IACA,gBAAgBK,IAAa,IAAI;AAAA,IACjC,cAAc;AAAA,EAAA,CACjB;AAED,SAAO;AAAA,IACH,WAAW,CAACa,MAAyBJ,EAAe,UAAUI,CAAI;AAAA,IAClE,SAAS,MAAMJ,EAAe,QAAA;AAAA,IAC9B,SAAS,MAAMA,EAAe,QAAA;AAAA,IAC9B,UAAU,MAAMA,EAAe,SAAA;AAAA,EAAS;AAEhD;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useTableExport.js","sources":["../../src/hooks/useTableExport.ts"],"sourcesContent":["import { useCallback } from 'react';\n\n/**\n * Options for exporting tabular data to CSV.\n */\nexport type ExportOptions<T extends object> = {\n /**\n * Array of data objects to export. Each object represents one row in the table.\n */\n data: T[];\n\n /**\n * Optional name for the exported file.\n * @default \"export.csv\"\n */\n fileName?: string;\n\n /**\n * Optional list of object keys to export as columns.\n * If omitted, all keys from the first row will be used.\n */\n columns?: (keyof T)[];\n\n /**\n * Optional map of column keys to custom header labels.\n * @example { firstName: 'First Name' }\n */\n headers?: Partial<Record<keyof T, string>>;\n\n /**\n * Optional delimiter to use between values in the CSV.\n * You can use `\";\"` or `\"\\t\"` for other formats.\n * @default \",\"\n */\n delimiter?: string;\n\n /**\n * Whether to include UTF-8 BOM (useful for Excel).\n * @default true\n */\n withBom?: boolean;\n};\n\n/**\n * Converts a dataset into CSV format as a string.\n *\n * @template T Type of each row object.\n * @param data The data array to convert.\n * @param columns Optional keys to include as columns.\n * @param headers Optional key-to-label mapping for header row.\n * @param delimiter Delimiter to separate columns. Defaults to `\",\"`.\n * @returns A string representing the CSV data.\n */\nconst convertToCSV = <T extends object>(\n data: T[],\n columns: (keyof T)[],\n headers?: Partial<Record<keyof T, string>>,\n delimiter = ','\n): string => {\n if (!data.length) {\n return '';\n }\n\n const escapeFn = (val: any) => {\n if (val === null || val === undefined) {\n return '';\n }\n\n const str = String(val);\n const needsQuotes = str.includes(delimiter) || str.includes('\"') || str.includes('\\n');\n const escaped = str.replace(/\"/g, '\"\"');\n return needsQuotes ? `\"${escaped}\"` : escaped;\n };\n\n const headerRow = columns.map(key => escapeFn(headers?.[key] ?? String(key))).join(delimiter);\n\n const dataRows = data.map(row => columns.map(key => escapeFn(row[key])).join(delimiter));\n\n return [headerRow, ...dataRows].join('\\n');\n};\n\n/**\n * React hook for exporting tabular data to a downloadable CSV file.\n *\n * @template T Type of each data row object.\n * @returns An object with a `exportToCSV` function to trigger the export.\n *\n * @example\n * const { exportToCSV } = useTableExport<User>();\n * exportToCSV({ data: users, fileName: 'users.csv', delimiter: ';' });\n */\nconst useTableExport = <T extends object>() => {\n const exportToCSV = useCallback(\n ({ data, fileName = 'export.csv', columns, headers, delimiter = ',', withBom = true }: ExportOptions<T>) => {\n if (!data.length) {\n return;\n }\n\n const cols = columns ?? (Object.keys(data[0]) as (keyof T)[]);\n const csv = convertToCSV(data, cols, headers, delimiter);\n\n const bom = withBom ? '\\uFEFF' : '';\n const blob = new Blob([bom + csv], { type: 'text/csv;charset=utf-8;' });\n\n const link = document.createElement('a');\n link.href = URL.createObjectURL(blob);\n link.setAttribute('download', fileName);\n\n document.body.appendChild(link);\n link.click();\n\n document.body.removeChild(link);\n },\n []\n );\n\n return { exportToCSV };\n};\n\nexport default useTableExport;\n"],"names":["convertToCSV","data","columns","headers","delimiter","escapeFn","val","str","needsQuotes","escaped","headerRow","key","dataRows","row","useTableExport","useCallback","fileName","withBom","cols","csv","bom","blob","link"],"mappings":";AAqDA,MAAMA,IAAe,CACjBC,GACAC,GACAC,GACAC,IAAY,QACH;AACT,MAAI,CAACH,EAAK;AACN,WAAO;
|
|
1
|
+
{"version":3,"file":"useTableExport.js","sources":["../../src/hooks/useTableExport.ts"],"sourcesContent":["import { useCallback } from 'react';\n\n/**\n * Options for exporting tabular data to CSV.\n */\nexport type ExportOptions<T extends object> = {\n /**\n * Array of data objects to export. Each object represents one row in the table.\n */\n data: T[];\n\n /**\n * Optional name for the exported file.\n * @default \"export.csv\"\n */\n fileName?: string;\n\n /**\n * Optional list of object keys to export as columns.\n * If omitted, all keys from the first row will be used.\n */\n columns?: (keyof T)[];\n\n /**\n * Optional map of column keys to custom header labels.\n * @example { firstName: 'First Name' }\n */\n headers?: Partial<Record<keyof T, string>>;\n\n /**\n * Optional delimiter to use between values in the CSV.\n * You can use `\";\"` or `\"\\t\"` for other formats.\n * @default \",\"\n */\n delimiter?: string;\n\n /**\n * Whether to include UTF-8 BOM (useful for Excel).\n * @default true\n */\n withBom?: boolean;\n};\n\n/**\n * Converts a dataset into CSV format as a string.\n *\n * @template T Type of each row object.\n * @param data The data array to convert.\n * @param columns Optional keys to include as columns.\n * @param headers Optional key-to-label mapping for header row.\n * @param delimiter Delimiter to separate columns. Defaults to `\",\"`.\n * @returns A string representing the CSV data.\n */\nconst convertToCSV = <T extends object>(\n data: T[],\n columns: (keyof T)[],\n headers?: Partial<Record<keyof T, string>>,\n delimiter = ','\n): string => {\n if (!data.length) {\n return '';\n }\n\n // biome-ignore lint/suspicious/noExplicitAny: whatever type, it will be converted to string anyways\n const escapeFn = (val: any) => {\n if (val === null || val === undefined) {\n return '';\n }\n\n const str = String(val);\n const needsQuotes = str.includes(delimiter) || str.includes('\"') || str.includes('\\n');\n const escaped = str.replace(/\"/g, '\"\"');\n return needsQuotes ? `\"${escaped}\"` : escaped;\n };\n\n const headerRow = columns.map(key => escapeFn(headers?.[key] ?? String(key))).join(delimiter);\n\n const dataRows = data.map(row => columns.map(key => escapeFn(row[key])).join(delimiter));\n\n return [headerRow, ...dataRows].join('\\n');\n};\n\n/**\n * React hook for exporting tabular data to a downloadable CSV file.\n *\n * @template T Type of each data row object.\n * @returns An object with a `exportToCSV` function to trigger the export.\n *\n * @example\n * const { exportToCSV } = useTableExport<User>();\n * exportToCSV({ data: users, fileName: 'users.csv', delimiter: ';' });\n */\nconst useTableExport = <T extends object>() => {\n const exportToCSV = useCallback(\n ({ data, fileName = 'export.csv', columns, headers, delimiter = ',', withBom = true }: ExportOptions<T>) => {\n if (!data.length) {\n return;\n }\n\n const cols = columns ?? (Object.keys(data[0]) as (keyof T)[]);\n const csv = convertToCSV(data, cols, headers, delimiter);\n\n const bom = withBom ? '\\uFEFF' : '';\n const blob = new Blob([bom + csv], { type: 'text/csv;charset=utf-8;' });\n\n const link = document.createElement('a');\n link.href = URL.createObjectURL(blob);\n link.setAttribute('download', fileName);\n\n document.body.appendChild(link);\n link.click();\n\n document.body.removeChild(link);\n },\n []\n );\n\n return { exportToCSV };\n};\n\nexport default useTableExport;\n"],"names":["convertToCSV","data","columns","headers","delimiter","escapeFn","val","str","needsQuotes","escaped","headerRow","key","dataRows","row","useTableExport","useCallback","fileName","withBom","cols","csv","bom","blob","link"],"mappings":";AAqDA,MAAMA,IAAe,CACjBC,GACAC,GACAC,GACAC,IAAY,QACH;AACT,MAAI,CAACH,EAAK;AACN,WAAO;AAIX,QAAMI,IAAW,CAACC,MAAa;AAC3B,QAAIA,KAAQ;AACR,aAAO;AAGX,UAAMC,IAAM,OAAOD,CAAG,GAChBE,IAAcD,EAAI,SAASH,CAAS,KAAKG,EAAI,SAAS,GAAG,KAAKA,EAAI,SAAS;AAAA,CAAI,GAC/EE,IAAUF,EAAI,QAAQ,MAAM,IAAI;AACtC,WAAOC,IAAc,IAAIC,CAAO,MAAMA;AAAA,EAC1C,GAEMC,IAAYR,EAAQ,IAAI,CAAAS,MAAON,EAASF,IAAUQ,CAAG,KAAK,OAAOA,CAAG,CAAC,CAAC,EAAE,KAAKP,CAAS,GAEtFQ,IAAWX,EAAK,IAAI,CAAAY,MAAOX,EAAQ,IAAI,CAAAS,MAAON,EAASQ,EAAIF,CAAG,CAAC,CAAC,EAAE,KAAKP,CAAS,CAAC;AAEvF,SAAO,CAACM,GAAW,GAAGE,CAAQ,EAAE,KAAK;AAAA,CAAI;AAC7C,GAYME,IAAiB,OAyBZ,EAAE,aAxBWC;AAAA,EAChB,CAAC,EAAE,MAAAd,GAAM,UAAAe,IAAW,cAAc,SAAAd,GAAS,SAAAC,GAAS,WAAAC,IAAY,KAAK,SAAAa,IAAU,SAA6B;AACxG,QAAI,CAAChB,EAAK;AACN;AAGJ,UAAMiB,IAAOhB,KAAY,OAAO,KAAKD,EAAK,CAAC,CAAC,GACtCkB,IAAMnB,EAAaC,GAAMiB,GAAMf,GAASC,CAAS,GAEjDgB,IAAMH,IAAU,WAAW,IAC3BI,IAAO,IAAI,KAAK,CAACD,IAAMD,CAAG,GAAG,EAAE,MAAM,2BAA2B,GAEhEG,IAAO,SAAS,cAAc,GAAG;AACvC,IAAAA,EAAK,OAAO,IAAI,gBAAgBD,CAAI,GACpCC,EAAK,aAAa,YAAYN,CAAQ,GAEtC,SAAS,KAAK,YAAYM,CAAI,GAC9BA,EAAK,MAAA,GAEL,SAAS,KAAK,YAAYA,CAAI;AAAA,EAClC;AAAA,EACA,CAAA;AAAC,EAGI;"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export type Handler = (value: any, ...args: any[]) => any;
|
|
2
2
|
export declare function defaultKey(key: string): string;
|
|
3
3
|
declare function useUncontrolledProp<TProp, THandler extends Handler = Handler>(propValue: TProp | undefined, defaultValue: TProp, handler?: THandler): readonly [TProp, THandler];
|
|
4
|
-
declare function useUncontrolledProp<TProp, THandler extends Handler = Handler>(propValue: TProp | undefined, defaultValue?: TProp | undefined, handler?: THandler): readonly [TProp | undefined, (...args: Parameters<THandler>) => ReturnType<THandler> |
|
|
4
|
+
declare function useUncontrolledProp<TProp, THandler extends Handler = Handler>(propValue: TProp | undefined, defaultValue?: TProp | undefined, handler?: THandler): readonly [TProp | undefined, (...args: Parameters<THandler>) => ReturnType<THandler> | undefined];
|
|
5
5
|
export { useUncontrolledProp };
|
|
6
6
|
type FilterFlags<Base, Condition> = {
|
|
7
7
|
[Key in keyof Base]: NonNullable<Base[Key]> extends Condition ? Key : never;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useUncontrollable.js","sources":["../../src/hooks/useUncontrollable.ts"],"sourcesContent":["/* eslint-disable prefer-arrow/prefer-arrow-functions */\n// forked from https://github.com/jquense/uncontrollable/blob/master/src/index.ts\nimport { useCallback, useRef, useState } from 'react';\n\nexport type Handler = (value: any, ...args: any[]) => any;\n\nexport function defaultKey(key: string) {\n return
|
|
1
|
+
{"version":3,"file":"useUncontrollable.js","sources":["../../src/hooks/useUncontrollable.ts"],"sourcesContent":["/* eslint-disable prefer-arrow/prefer-arrow-functions */\n// forked from https://github.com/jquense/uncontrollable/blob/master/src/index.ts\nimport { useCallback, useRef, useState } from 'react';\n\n// biome-ignore lint/suspicious/noExplicitAny: unknown types\nexport type Handler = (value: any, ...args: any[]) => any;\n\nexport function defaultKey(key: string) {\n return `default${key.charAt(0).toUpperCase()}${key.substr(1)}`;\n}\n\nfunction useUncontrolledProp<TProp, THandler extends Handler = Handler>(\n propValue: TProp | undefined,\n defaultValue: TProp,\n handler?: THandler\n): readonly [TProp, THandler];\n\nfunction useUncontrolledProp<TProp, THandler extends Handler = Handler>(\n propValue: TProp | undefined,\n defaultValue?: TProp | undefined,\n handler?: THandler\n): readonly [TProp | undefined, (...args: Parameters<THandler>) => ReturnType<THandler> | undefined];\n\nfunction useUncontrolledProp<TProp, THandler extends Handler = Handler>(\n propValue: TProp | undefined,\n defaultValue: TProp | undefined,\n handler?: THandler\n) {\n const wasPropRef = useRef<boolean>(propValue !== undefined);\n const [stateValue, setState] = useState<TProp | undefined>(defaultValue);\n\n const isProp = propValue !== undefined;\n const wasProp = wasPropRef.current;\n\n wasPropRef.current = isProp;\n\n /**\n * If a prop switches from controlled to Uncontrolled\n * reset its value to the defaultValue\n */\n if (!isProp && wasProp && stateValue !== defaultValue) {\n setState(defaultValue);\n }\n\n return [\n isProp ? propValue : stateValue,\n useCallback(\n (...args: Parameters<THandler>): ReturnType<THandler> | undefined => {\n const [value, ...rest] = args;\n const returnValue = handler?.(value, ...rest);\n setState(value);\n return returnValue;\n },\n [handler]\n ),\n ] as const;\n}\n\nexport { useUncontrolledProp };\n\ntype FilterFlags<Base, Condition> = {\n [Key in keyof Base]: NonNullable<Base[Key]> extends Condition ? Key : never;\n};\n\ntype AllowedNames<Base, Condition> = FilterFlags<Base, Condition>[keyof Base];\n\ntype ConfigMap<TProps extends object> = {\n // biome-ignore lint/complexity/noBannedTypes: any function\n [p in keyof TProps]?: AllowedNames<TProps, Function>;\n};\n\nexport function useUncontrolled<TProps extends object, TDefaults extends string = never>(\n props: TProps,\n config: ConfigMap<TProps>\n): Omit<TProps, TDefaults> {\n return Object.keys(config).reduce((result: TProps, fieldName: string) => {\n // biome-ignore lint/suspicious/noExplicitAny: any result\n const { [defaultKey(fieldName)]: defaultValue, [fieldName]: propsValue, ...rest } = result as any;\n\n // @ts-expect-error-next-line\n const handlerName = config[fieldName];\n // @ts-expect-error-next-line\n const [value, handler] = useUncontrolledProp(propsValue, defaultValue, props[handlerName]);\n\n return {\n ...rest,\n [fieldName]: value,\n [handlerName]: handler,\n };\n }, props);\n}\n"],"names":["useUncontrolledProp","propValue","defaultValue","handler","wasPropRef","useRef","stateValue","setState","useState","isProp","wasProp","useCallback","args","value","rest","returnValue"],"mappings":";AAuBA,SAASA,EACLC,GACAC,GACAC,GACF;AACE,QAAMC,IAAaC,EAAgBJ,MAAc,MAAS,GACpD,CAACK,GAAYC,CAAQ,IAAIC,EAA4BN,CAAY,GAEjEO,IAASR,MAAc,QACvBS,IAAUN,EAAW;AAE3B,SAAAA,EAAW,UAAUK,GAMjB,CAACA,KAAUC,KAAWJ,MAAeJ,KACrCK,EAASL,CAAY,GAGlB;AAAA,IACHO,IAASR,IAAYK;AAAA,IACrBK;AAAA,MACI,IAAIC,MAAiE;AACjE,cAAM,CAACC,GAAO,GAAGC,CAAI,IAAIF,GACnBG,IAAcZ,IAAUU,GAAO,GAAGC,CAAI;AAC5C,eAAAP,EAASM,CAAK,GACPE;AAAA,MACX;AAAA,MACA,CAACZ,CAAO;AAAA,IAAA;AAAA,EACZ;AAER;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rio-cloud/rio-uikit",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.1.0",
|
|
4
4
|
"description": "The RIO UIKIT component library",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -46,29 +46,28 @@
|
|
|
46
46
|
}
|
|
47
47
|
},
|
|
48
48
|
"devDependencies": {
|
|
49
|
-
"@biomejs/biome": "2.3.
|
|
49
|
+
"@biomejs/biome": "2.3.10",
|
|
50
50
|
"@rio-cloud/biome-config": "1.1.0",
|
|
51
|
-
"@rio-cloud/vite-plugin-frontend-license-check": "1.1.
|
|
51
|
+
"@rio-cloud/vite-plugin-frontend-license-check": "1.1.1",
|
|
52
52
|
"@testing-library/dom": "10.4.1",
|
|
53
53
|
"@testing-library/jest-dom": "6.9.1",
|
|
54
|
-
"@testing-library/react": "16.3.
|
|
54
|
+
"@testing-library/react": "16.3.1",
|
|
55
55
|
"@testing-library/user-event": "14.6.1",
|
|
56
56
|
"@types/heremaps": "3.1.14",
|
|
57
57
|
"@types/node": "24.10.1",
|
|
58
|
-
"@types/qs": "6.14.0",
|
|
59
58
|
"@types/react": "18.3.18",
|
|
60
59
|
"@types/react-dom": "18.3.5",
|
|
61
60
|
"@types/react-redux": "7.1.34",
|
|
62
61
|
"@types/resize-observer-browser": "0.1.11",
|
|
63
62
|
"@vitejs/plugin-react": "5.1.2",
|
|
64
63
|
"@vitest/coverage-c8": "0.33.0",
|
|
65
|
-
"autoprefixer": "10.4.
|
|
64
|
+
"autoprefixer": "10.4.23",
|
|
66
65
|
"backstopjs": "6.3.25",
|
|
67
66
|
"copyfiles": "2.4.1",
|
|
68
67
|
"dotenv": "17.2.3",
|
|
69
68
|
"glob": "13.0.0",
|
|
70
69
|
"happy-dom": "20.0.11",
|
|
71
|
-
"jsdom": "27.
|
|
70
|
+
"jsdom": "27.4.0",
|
|
72
71
|
"jsdom-global": "3.0.2",
|
|
73
72
|
"postcss": "8.5.6",
|
|
74
73
|
"postcss-preset-env": "8.5.1",
|
|
@@ -78,11 +77,11 @@
|
|
|
78
77
|
"react-dom": "18.0.0",
|
|
79
78
|
"react-intl": "7.1.14",
|
|
80
79
|
"rollup-plugin-copy": "3.5.0",
|
|
81
|
-
"sass": "1.
|
|
80
|
+
"sass": "1.97.1",
|
|
82
81
|
"strip-ansi": "7.1.2",
|
|
83
82
|
"svgo": "4.0.0",
|
|
84
83
|
"typescript": "5.9.3",
|
|
85
|
-
"vite": "7.
|
|
84
|
+
"vite": "7.3.0",
|
|
86
85
|
"vite-plugin-dts": "4.5.4",
|
|
87
86
|
"vite-plugin-zip-pack": "1.2.4",
|
|
88
87
|
"vitest": "3.2.4",
|
|
@@ -99,11 +98,11 @@
|
|
|
99
98
|
"@dnd-kit/utilities": "3.2.2",
|
|
100
99
|
"@formkit/auto-animate": "0.9.0",
|
|
101
100
|
"@popperjs/core": "2.11.8",
|
|
102
|
-
"@tanstack/react-virtual": "3.13.
|
|
101
|
+
"@tanstack/react-virtual": "3.13.14",
|
|
103
102
|
"classnames": "2.5.1",
|
|
104
103
|
"date-fns": "4.1.0",
|
|
105
104
|
"driver.js": "1.4.0",
|
|
106
|
-
"es-toolkit": "1.
|
|
105
|
+
"es-toolkit": "1.43.0",
|
|
107
106
|
"events": "3.3.0",
|
|
108
107
|
"iframe-resizer-react": "1.1.0",
|
|
109
108
|
"moment": "2.30.1",
|
|
@@ -111,19 +110,18 @@
|
|
|
111
110
|
"natural-orderby": "5.0.0",
|
|
112
111
|
"process": "0.11.10",
|
|
113
112
|
"prop-types": "15.8.1",
|
|
114
|
-
"qs": "6.14.0",
|
|
115
113
|
"react-bootstrap": "1.6.4",
|
|
116
114
|
"react-content-loader": "7.1.1",
|
|
117
115
|
"react-custom-scrollbars-4": "4.5.1",
|
|
118
116
|
"react-datetime": "github:rio-cloud/react-datetime#v3.1.1-1-merged",
|
|
119
|
-
"react-day-picker": "9.
|
|
117
|
+
"react-day-picker": "9.13.0",
|
|
120
118
|
"react-dropzone": "14.3.8",
|
|
121
119
|
"react-imask": "7.6.1",
|
|
122
120
|
"react-notifications": "1.7.4",
|
|
123
121
|
"react-onclickoutside": "6.13.2",
|
|
124
122
|
"react-popper": "2.3.0",
|
|
125
123
|
"react-toastify": "11.0.5",
|
|
126
|
-
"recharts": "3.
|
|
124
|
+
"recharts": "3.6.0",
|
|
127
125
|
"tiny-invariant": "1.3.3",
|
|
128
126
|
"tslib": "2.8.1"
|
|
129
127
|
},
|
package/utils/colorScheme.js
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
|
-
const d = "uikit-color-scheme"
|
|
1
|
+
const d = "uikit-color-scheme";
|
|
2
|
+
const r = ".rio.cloud", E = "Thu, 18 Dec 2030 12:00:00 UTC", n = "data-theme", s = "themechange", l = "default", h = "system", i = "light", a = "dark", t = (e) => {
|
|
2
3
|
e ? document.documentElement.setAttribute(n, e) : document.documentElement.removeAttribute(n);
|
|
3
|
-
},
|
|
4
|
-
const e =
|
|
4
|
+
}, T = () => decodeURIComponent(document.cookie).split(";").find((c) => c.includes(d))?.split("=")[1], u = () => {
|
|
5
|
+
const e = T();
|
|
5
6
|
switch (e) {
|
|
6
|
-
case
|
|
7
|
+
case l:
|
|
7
8
|
t();
|
|
8
9
|
break;
|
|
9
|
-
case
|
|
10
|
+
case h:
|
|
10
11
|
window.matchMedia("(prefers-color-scheme: dark)").matches ? t(a) : t(i);
|
|
11
12
|
break;
|
|
12
13
|
case i:
|
|
@@ -16,14 +17,14 @@ const d = "uikit-color-scheme", r = "/", E = ".rio.cloud", l = "Thu, 18 Dec 2030
|
|
|
16
17
|
}
|
|
17
18
|
return e;
|
|
18
19
|
}, A = (e) => {
|
|
19
|
-
const o = window.location.host.startsWith("localhost") || window.location.host.startsWith("127.0.0.1"), c = encodeURIComponent(e), m = o ? "localhost" :
|
|
20
|
-
document.cookie = `${d}=${c};domain=${m};expires=${
|
|
21
|
-
},
|
|
20
|
+
const o = window.location.host.startsWith("localhost") || window.location.host.startsWith("127.0.0.1"), c = encodeURIComponent(e), m = o ? "localhost" : r;
|
|
21
|
+
document.cookie = `${d}=${c};domain=${m};expires=${E};path=/`;
|
|
22
|
+
}, f = () => {
|
|
22
23
|
window.addEventListener(
|
|
23
24
|
"message",
|
|
24
25
|
({ data: e }) => {
|
|
25
26
|
if (e === s) {
|
|
26
|
-
|
|
27
|
+
u();
|
|
27
28
|
for (const o of document.getElementsByTagName("iframe"))
|
|
28
29
|
o.contentWindow?.postMessage(s, "*");
|
|
29
30
|
}
|
|
@@ -35,11 +36,11 @@ export {
|
|
|
35
36
|
s as THEME_CHANGE_EVENT,
|
|
36
37
|
a as THEME_DARK,
|
|
37
38
|
n as THEME_DATA_ATTRIBUTE,
|
|
38
|
-
|
|
39
|
+
l as THEME_DEFAULT,
|
|
39
40
|
i as THEME_LIGHT,
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
41
|
+
h as THEME_SYSTEM,
|
|
42
|
+
u as getColorScheme,
|
|
43
|
+
f as listenForSchemeChange,
|
|
43
44
|
A as setColorScheme
|
|
44
45
|
};
|
|
45
46
|
//# sourceMappingURL=colorScheme.js.map
|
package/utils/colorScheme.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"colorScheme.js","sources":["../../src/utils/colorScheme.ts"],"sourcesContent":["const COOKIE_NAME = 'uikit-color-scheme';\nconst PATH = '/';\nconst DOMAIN = '.rio.cloud';\nconst EXPIRATION_DATE = 'Thu, 18 Dec 2030 12:00:00 UTC';\n\nexport const THEME_DATA_ATTRIBUTE = 'data-theme';\nexport const THEME_CHANGE_EVENT = 'themechange';\n\nexport const THEME_DEFAULT = 'default' as const;\nexport const THEME_SYSTEM = 'system' as const;\nexport const THEME_LIGHT = 'light' as const;\nexport const THEME_DARK = 'dark' as const;\n\nexport type ColorScheme = typeof THEME_DEFAULT | typeof THEME_SYSTEM | typeof THEME_LIGHT | typeof THEME_DARK;\n\nconst updateHtmlScheme = (scheme?: ColorScheme | undefined) => {\n if (scheme) {\n document.documentElement.setAttribute(THEME_DATA_ATTRIBUTE, scheme);\n } else {\n document.documentElement.removeAttribute(THEME_DATA_ATTRIBUTE);\n }\n};\n\nconst getSchemeFromCookie = () => {\n const decodedCookie = decodeURIComponent(document.cookie);\n const find = decodedCookie.split(';').find(entry => entry.includes(COOKIE_NAME));\n return find?.split('=')[1] as ColorScheme | undefined;\n};\n\n/**\n * Returns the desired color scheme based on the user's cookie.\n *\n * This might be `undefined`, too, when no cookie value is set!\n */\nexport const getColorScheme = () => {\n const colorScheme = getSchemeFromCookie();\n\n switch (colorScheme) {\n case THEME_DEFAULT:\n updateHtmlScheme();\n break;\n\n case THEME_SYSTEM:\n if (window.matchMedia('(prefers-color-scheme: dark)').matches) {\n updateHtmlScheme(THEME_DARK);\n } else {\n updateHtmlScheme(THEME_LIGHT);\n }\n break;\n\n case THEME_LIGHT:\n case THEME_DARK:\n updateHtmlScheme(colorScheme);\n break;\n }\n\n return colorScheme;\n};\n\n/**\n * Stores the given preferred color scheme in the browser's cookies.\n *\n * This should be done by a RIO service like User Profile SPA using a theme switcher component from the UIKIT where this\n * function is referenced.\n *\n * @param scheme The color scheme to save.\n */\nexport const setColorScheme = (scheme: ColorScheme) => {\n const isDevEnv = window.location.host.startsWith('localhost') || window.location.host.startsWith('127.0.0.1');\n\n const newCookieValues = encodeURIComponent(scheme);\n const domain = isDevEnv ? 'localhost' : DOMAIN;\n document.cookie = `${COOKIE_NAME}=${newCookieValues};domain=${domain};expires=${EXPIRATION_DATE};path=${PATH}`;\n};\n\n/**\n * Initiates listening for theme change events.\n */\nexport const listenForSchemeChange = () => {\n window.addEventListener(\n 'message',\n ({ data }) => {\n if (data === THEME_CHANGE_EVENT) {\n getColorScheme();\n\n // Re-send the event to all iframes that might not be notified yet\n for (const iframe of document.getElementsByTagName('iframe')) {\n iframe.contentWindow?.postMessage(THEME_CHANGE_EVENT, '*');\n }\n }\n },\n false\n );\n};\n"],"names":["COOKIE_NAME","
|
|
1
|
+
{"version":3,"file":"colorScheme.js","sources":["../../src/utils/colorScheme.ts"],"sourcesContent":["const COOKIE_NAME = 'uikit-color-scheme';\nconst PATH = '/';\nconst DOMAIN = '.rio.cloud';\nconst EXPIRATION_DATE = 'Thu, 18 Dec 2030 12:00:00 UTC';\n\nexport const THEME_DATA_ATTRIBUTE = 'data-theme';\nexport const THEME_CHANGE_EVENT = 'themechange';\n\nexport const THEME_DEFAULT = 'default' as const;\nexport const THEME_SYSTEM = 'system' as const;\nexport const THEME_LIGHT = 'light' as const;\nexport const THEME_DARK = 'dark' as const;\n\nexport type ColorScheme = typeof THEME_DEFAULT | typeof THEME_SYSTEM | typeof THEME_LIGHT | typeof THEME_DARK;\n\nconst updateHtmlScheme = (scheme?: ColorScheme | undefined) => {\n if (scheme) {\n document.documentElement.setAttribute(THEME_DATA_ATTRIBUTE, scheme);\n } else {\n document.documentElement.removeAttribute(THEME_DATA_ATTRIBUTE);\n }\n};\n\nconst getSchemeFromCookie = () => {\n const decodedCookie = decodeURIComponent(document.cookie);\n const find = decodedCookie.split(';').find(entry => entry.includes(COOKIE_NAME));\n return find?.split('=')[1] as ColorScheme | undefined;\n};\n\n/**\n * Returns the desired color scheme based on the user's cookie.\n *\n * This might be `undefined`, too, when no cookie value is set!\n */\nexport const getColorScheme = () => {\n const colorScheme = getSchemeFromCookie();\n\n switch (colorScheme) {\n case THEME_DEFAULT:\n updateHtmlScheme();\n break;\n\n case THEME_SYSTEM:\n if (window.matchMedia('(prefers-color-scheme: dark)').matches) {\n updateHtmlScheme(THEME_DARK);\n } else {\n updateHtmlScheme(THEME_LIGHT);\n }\n break;\n\n case THEME_LIGHT:\n case THEME_DARK:\n updateHtmlScheme(colorScheme);\n break;\n }\n\n return colorScheme;\n};\n\n/**\n * Stores the given preferred color scheme in the browser's cookies.\n *\n * This should be done by a RIO service like User Profile SPA using a theme switcher component from the UIKIT where this\n * function is referenced.\n *\n * @param scheme The color scheme to save.\n */\nexport const setColorScheme = (scheme: ColorScheme) => {\n const isDevEnv = window.location.host.startsWith('localhost') || window.location.host.startsWith('127.0.0.1');\n\n const newCookieValues = encodeURIComponent(scheme);\n const domain = isDevEnv ? 'localhost' : DOMAIN;\n document.cookie = `${COOKIE_NAME}=${newCookieValues};domain=${domain};expires=${EXPIRATION_DATE};path=${PATH}`;\n};\n\n/**\n * Initiates listening for theme change events.\n */\nexport const listenForSchemeChange = () => {\n window.addEventListener(\n 'message',\n ({ data }) => {\n if (data === THEME_CHANGE_EVENT) {\n getColorScheme();\n\n // Re-send the event to all iframes that might not be notified yet\n for (const iframe of document.getElementsByTagName('iframe')) {\n iframe.contentWindow?.postMessage(THEME_CHANGE_EVENT, '*');\n }\n }\n },\n false\n );\n};\n"],"names":["COOKIE_NAME","DOMAIN","EXPIRATION_DATE","THEME_DATA_ATTRIBUTE","THEME_CHANGE_EVENT","THEME_DEFAULT","THEME_SYSTEM","THEME_LIGHT","THEME_DARK","updateHtmlScheme","scheme","getSchemeFromCookie","entry","getColorScheme","colorScheme","setColorScheme","isDevEnv","newCookieValues","domain","listenForSchemeChange","data","iframe"],"mappings":"AAAA,MAAMA,IAAc;AAEpB,MAAMC,IAAS,cACTC,IAAkB,iCAEXC,IAAuB,cACvBC,IAAqB,eAErBC,IAAgB,WAChBC,IAAe,UACfC,IAAc,SACdC,IAAa,QAIpBC,IAAmB,CAACC,MAAqC;AAC3D,EAAIA,IACA,SAAS,gBAAgB,aAAaP,GAAsBO,CAAM,IAElE,SAAS,gBAAgB,gBAAgBP,CAAoB;AAErE,GAEMQ,IAAsB,MACF,mBAAmB,SAAS,MAAM,EAC7B,MAAM,GAAG,EAAE,KAAK,CAAAC,MAASA,EAAM,SAASZ,CAAW,CAAC,GAClE,MAAM,GAAG,EAAE,CAAC,GAQhBa,IAAiB,MAAM;AAChC,QAAMC,IAAcH,EAAA;AAEpB,UAAQG,GAAA;AAAA,IACJ,KAAKT;AACD,MAAAI,EAAA;AACA;AAAA,IAEJ,KAAKH;AACD,MAAI,OAAO,WAAW,8BAA8B,EAAE,UAClDG,EAAiBD,CAAU,IAE3BC,EAAiBF,CAAW;AAEhC;AAAA,IAEJ,KAAKA;AAAA,IACL,KAAKC;AACD,MAAAC,EAAiBK,CAAW;AAC5B;AAAA,EAAA;AAGR,SAAOA;AACX,GAUaC,IAAiB,CAACL,MAAwB;AACnD,QAAMM,IAAW,OAAO,SAAS,KAAK,WAAW,WAAW,KAAK,OAAO,SAAS,KAAK,WAAW,WAAW,GAEtGC,IAAkB,mBAAmBP,CAAM,GAC3CQ,IAASF,IAAW,cAAcf;AACxC,WAAS,SAAS,GAAGD,CAAW,IAAIiB,CAAe,WAAWC,CAAM,YAAYhB,CAAe;AACnG,GAKaiB,IAAwB,MAAM;AACvC,SAAO;AAAA,IACH;AAAA,IACA,CAAC,EAAE,MAAAC,EAAA,MAAW;AACV,UAAIA,MAAShB,GAAoB;AAC7B,QAAAS,EAAA;AAGA,mBAAWQ,KAAU,SAAS,qBAAqB,QAAQ;AACvD,UAAAA,EAAO,eAAe,YAAYjB,GAAoB,GAAG;AAAA,MAEjE;AAAA,IACJ;AAAA,IACA;AAAA,EAAA;AAER;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cssuseragent.js","sources":["../../src/utils/cssuseragent.js"],"sourcesContent":["/* eslint-disable */\n\n/**\n * CssUserAgent (cssua.js) v2.1.31\n * http://cssuseragent.org\n *\n * Copyright (c)2006-2015 Stephen M. McKamey.\n * Licensed under The MIT License.\n */\n/*jshint smarttabs:true, regexp:false, browser:true */\n\n/**\n * @param html {Object} root DOM element\n * @param userAgent {string} browser userAgent string\n * @return {Object}\n */\nexport const cssua = (html, userAgent, sa) => {\n 'use strict';\n\n /**\n * @const\n * @type {string}\n */\n var PREFIX = ' ua-';\n\n /**\n * @const\n * @type {RegExp}\n */\n var R_Platform = /\\s*([\\-\\w ]+)[\\s\\/\\:]([\\d_]+\\b(?:[\\-\\._\\/]\\w+)*)/;\n\n /**\n * @const\n * @type {RegExp}\n */\n var R_Version = /([\\w\\-\\.]+[\\s\\/][v]?[\\d_]+\\b(?:[\\-\\._\\/]\\w+)*)/g;\n\n /**\n * @const\n * @type {RegExp}\n */\n var R_BlackBerry = /\\b(?:(blackberry\\w*|bb10)|(rim tablet os))(?:\\/(\\d+\\.\\d+(?:\\.\\w+)*))?/;\n\n /**\n * @const\n * @type {RegExp}\n */\n var R_Silk = /\\bsilk-accelerated=true\\b/;\n\n /**\n * @const\n * @type {RegExp}\n */\n var R_FluidApp = /\\bfluidapp\\b/;\n\n /**\n * @const\n * @type {RegExp}\n */\n var R_desktop = /(\\bwindows\\b|\\bmacintosh\\b|\\blinux\\b|\\bunix\\b)/;\n\n /**\n * @const\n * @type {RegExp}\n */\n var R_mobile =\n /(\\bandroid\\b|\\bipad\\b|\\bipod\\b|\\bwindows phone\\b|\\bwpdesktop\\b|\\bxblwp7\\b|\\bzunewp7\\b|\\bwindows ce\\b|\\bblackberry\\w*|\\bbb10\\b|\\brim tablet os\\b|\\bmeego|\\bwebos\\b|\\bpalm|\\bsymbian|\\bj2me\\b|\\bdocomo\\b|\\bpda\\b|\\bchtml\\b|\\bmidp\\b|\\bcldc\\b|\\w*?mobile\\w*?|\\w*?phone\\w*?)/;\n\n /**\n * @const\n * @type {RegExp}\n */\n var R_game = /(\\bxbox\\b|\\bplaystation\\b|\\bnintendo\\s+\\w+)/;\n\n /**\n * The root CssUserAgent\n * @type {Object}\n */\n var cssua = {\n parse:\n /**\n * @param uaStr {string}\n * @return {Object}\n */\n function (uaStr, sa) {\n /**\n * @type {Object}\n */\n var ua = {};\n if (sa) {\n ua.standalone = sa;\n }\n\n uaStr = ('' + uaStr).toLowerCase();\n if (!uaStr) {\n return ua;\n }\n\n var i,\n count,\n raw = uaStr.split(/[()]/);\n for (var j = 0, rawCount = raw.length; j < rawCount; j++) {\n if (j % 2) {\n // inside parens covers platform identifiers\n var platforms = raw[j].split(';');\n for (i = 0, count = platforms.length; i < count; i++) {\n if (R_Platform.exec(platforms[i])) {\n var key = RegExp.$1.split(' ').join('_'),\n val = RegExp.$2;\n\n // if duplicate entries favor highest version\n if (!ua[key] || Number.parseFloat(ua[key]) < Number.parseFloat(val)) {\n ua[key] = val;\n }\n }\n }\n } else {\n // outside parens covers most version identifiers\n var uas = raw[j].match(R_Version);\n if (uas) {\n for (i = 0, count = uas.length; i < count; i++) {\n var parts = uas[i].split(/[\\/\\s]+/);\n if (parts.length && parts[0] !== 'mozilla') {\n ua[parts[0].split(' ').join('_')] = parts.slice(1).join('-');\n }\n }\n }\n }\n }\n\n if (R_mobile.exec(uaStr)) {\n // mobile device indicators\n ua.mobile = RegExp.$1;\n if (R_BlackBerry.exec(uaStr)) {\n delete ua[ua.mobile];\n ua.blackberry = ua.version || RegExp.$3 || RegExp.$2 || RegExp.$1;\n if (RegExp.$1) {\n // standardize non-tablet blackberry\n ua.mobile = 'blackberry';\n } else if (ua.version === '0.0.1') {\n // fix playbook 1.0 quirk\n ua.blackberry = '7.1.0.0';\n }\n }\n } else if (R_game.exec(uaStr)) {\n // game console indicators\n ua.game = RegExp.$1;\n var game = ua.game.split(' ').join('_');\n\n if (ua.version && !ua[game]) {\n ua[game] = ua.version;\n }\n } else if (R_desktop.exec(uaStr)) {\n // desktop OS indicators\n ua.desktop = RegExp.$1;\n }\n\n // platform naming standardizations\n if (ua.intel_mac_os_x) {\n ua.mac_os_x = ua.intel_mac_os_x.split('_').join('.');\n delete ua.intel_mac_os_x;\n } else if (ua.cpu_iphone_os) {\n ua.ios = ua.cpu_iphone_os.split('_').join('.');\n delete ua.cpu_iphone_os;\n } else if (ua.cpu_os) {\n ua.ios = ua.cpu_os.split('_').join('.');\n delete ua.cpu_os;\n } else if (ua.mobile === 'iphone' && !ua.ios) {\n ua.ios = '1';\n }\n\n // UA naming standardizations\n if (ua.opera && ua.version) {\n ua.opera = ua.version;\n // version/XXX refers to opera\n delete ua.blackberry;\n } else if (R_Silk.exec(uaStr)) {\n ua.silk_accelerated = true;\n } else if (R_FluidApp.exec(uaStr)) {\n ua.fluidapp = ua.version;\n }\n\n if (ua.edge) {\n delete ua.applewebkit;\n delete ua.safari;\n delete ua.chrome;\n delete ua.android;\n }\n\n if (ua.applewebkit) {\n ua.webkit = ua.applewebkit;\n delete ua.applewebkit;\n\n if (ua.opr) {\n ua.opera = ua.opr;\n delete ua.opr;\n delete ua.chrome;\n }\n\n if (ua.safari) {\n if (\n ua.chrome ||\n ua.crios ||\n ua.fxios ||\n ua.opera ||\n ua.silk ||\n ua.fluidapp ||\n ua.phantomjs ||\n (ua.mobile && !ua.ios)\n ) {\n delete ua.safari;\n\n if (ua.vivaldi) {\n delete ua.chrome;\n }\n } else if (ua.version && !ua.rim_tablet_os) {\n ua.safari = ua.version;\n } else {\n ua.safari =\n {\n 419: '2.0.4',\n 417: '2.0.3',\n 416: '2.0.2',\n 412: '2.0',\n 312: '1.3',\n 125: '1.2',\n 85: '1.0',\n }[Number.parseInt(ua.safari, 10)] || ua.safari;\n }\n }\n } else if (ua.msie || ua.trident) {\n if (!ua.opera) {\n // standardize Internet Explorer\n ua.ie = ua.msie || ua.rv;\n }\n delete ua.msie;\n delete ua.android;\n\n if (ua.windows_phone_os) {\n // standardize window phone\n ua.windows_phone = ua.windows_phone_os;\n delete ua.windows_phone_os;\n } else if (ua.mobile === 'wpdesktop' || ua.mobile === 'xblwp7' || ua.mobile === 'zunewp7') {\n ua.mobile = 'windows desktop';\n ua.windows_phone = +ua.ie < 9 ? '7.0' : +ua.ie < 10 ? '7.5' : '8.0';\n delete ua.windows_nt;\n }\n } else if (ua.gecko || ua.firefox) {\n ua.gecko = ua.rv;\n }\n\n if (ua.rv) {\n delete ua.rv;\n }\n if (ua.version) {\n delete ua.version;\n }\n\n return ua;\n },\n\n format:\n /**\n * @param ua {Object}\n * @return {string}\n */\n function (ua) {\n /**\n * @param b {string} browser key\n * @param v {string} browser value\n * @return {string} formatted CSS classes\n */\n function format(b, v) {\n b = b.split('.').join('-');\n\n /**\n * @type {string}\n */\n var css = PREFIX + b;\n if (typeof v === 'string') {\n v = v.split(' ').join('_').split('.').join('-');\n var i = v.indexOf('-');\n while (i > 0) {\n // loop through chopping last '-' to end off\n // concat result onto return string\n css += PREFIX + b + '-' + v.substring(0, i);\n i = v.indexOf('-', i + 1);\n }\n css += PREFIX + b + '-' + v;\n }\n return css;\n }\n\n /**\n * @type {string}\n */\n var uaCss = '';\n for (var b in ua) {\n if (b && ua.hasOwnProperty(b)) {\n uaCss += format(b, ua[b]);\n }\n }\n\n // user-agent classNames\n return uaCss;\n },\n\n encode:\n /**\n * Encodes parsed userAgent object as a compact URI-Encoded key-value collection\n * @param ua {Object}\n * @return {string}\n */\n function (ua) {\n var query = '';\n for (var b in ua) {\n if (b && ua.hasOwnProperty(b)) {\n if (query) {\n query += '&';\n }\n query += encodeURIComponent(b) + '=' + encodeURIComponent(ua[b]);\n }\n }\n return query;\n },\n };\n\n /**\n * @const\n * @type {Object}\n */\n cssua.userAgent = cssua.ua = cssua.parse(userAgent, sa);\n\n /**\n * @const\n * @type {string}\n */\n var ua = cssua.format(cssua.ua) + ' js';\n\n // append CSS classes to HTML node\n if (html.className) {\n html.className = html.className.replace(/\\bno-js\\b/g, '') + ua;\n } else {\n html.className = ua.substr(1);\n }\n\n return cssua;\n};\n"],"names":["cssua","html","userAgent","sa","PREFIX","R_Platform","R_Version","R_BlackBerry","R_Silk","R_FluidApp","R_desktop","R_mobile","R_game","uaStr","ua","i","count","raw","j","rawCount","platforms","key","val","uas","parts","game","format","b","v","css","uaCss","query"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cssuseragent.js","sources":["../../src/utils/cssuseragent.js"],"sourcesContent":["/** biome-ignore-all lint/suspicious/noRedundantUseStrict: 3rd party code */\n/** biome-ignore-all lint/suspicious/noPrototypeBuiltins: 3rd party code */\n/** biome-ignore-all lint/complexity/useArrowFunction: 3rd party code */\n/** biome-ignore-all lint/style/useTemplate: 3rd party code */\n\n/**\n * CssUserAgent (cssua.js) v2.1.31\n * http://cssuseragent.org\n *\n * Copyright (c)2006-2015 Stephen M. McKamey.\n * Licensed under The MIT License.\n */\n/*jshint smarttabs:true, regexp:false, browser:true */\n\n/**\n * @param html {Object} root DOM element\n * @param userAgent {string} browser userAgent string\n * @return {Object}\n */\nexport const cssua = (html, userAgent, sa) => {\n 'use strict';\n\n /**\n * @const\n * @type {string}\n */\n var PREFIX = ' ua-';\n\n /**\n * @const\n * @type {RegExp}\n */\n var R_Platform = /\\s*([\\-\\w ]+)[\\s\\/\\:]([\\d_]+\\b(?:[\\-\\._\\/]\\w+)*)/;\n\n /**\n * @const\n * @type {RegExp}\n */\n var R_Version = /([\\w\\-\\.]+[\\s\\/][v]?[\\d_]+\\b(?:[\\-\\._\\/]\\w+)*)/g;\n\n /**\n * @const\n * @type {RegExp}\n */\n var R_BlackBerry = /\\b(?:(blackberry\\w*|bb10)|(rim tablet os))(?:\\/(\\d+\\.\\d+(?:\\.\\w+)*))?/;\n\n /**\n * @const\n * @type {RegExp}\n */\n var R_Silk = /\\bsilk-accelerated=true\\b/;\n\n /**\n * @const\n * @type {RegExp}\n */\n var R_FluidApp = /\\bfluidapp\\b/;\n\n /**\n * @const\n * @type {RegExp}\n */\n var R_desktop = /(\\bwindows\\b|\\bmacintosh\\b|\\blinux\\b|\\bunix\\b)/;\n\n /**\n * @const\n * @type {RegExp}\n */\n var R_mobile =\n /(\\bandroid\\b|\\bipad\\b|\\bipod\\b|\\bwindows phone\\b|\\bwpdesktop\\b|\\bxblwp7\\b|\\bzunewp7\\b|\\bwindows ce\\b|\\bblackberry\\w*|\\bbb10\\b|\\brim tablet os\\b|\\bmeego|\\bwebos\\b|\\bpalm|\\bsymbian|\\bj2me\\b|\\bdocomo\\b|\\bpda\\b|\\bchtml\\b|\\bmidp\\b|\\bcldc\\b|\\w*?mobile\\w*?|\\w*?phone\\w*?)/;\n\n /**\n * @const\n * @type {RegExp}\n */\n var R_game = /(\\bxbox\\b|\\bplaystation\\b|\\bnintendo\\s+\\w+)/;\n\n /**\n * The root CssUserAgent\n * @type {Object}\n */\n var cssua = {\n parse:\n /**\n * @param uaStr {string}\n * @return {Object}\n */\n function (uaStr, sa) {\n /**\n * @type {Object}\n */\n var ua = {};\n if (sa) {\n ua.standalone = sa;\n }\n\n uaStr = ('' + uaStr).toLowerCase();\n if (!uaStr) {\n return ua;\n }\n\n var i,\n count,\n raw = uaStr.split(/[()]/);\n for (var j = 0, rawCount = raw.length; j < rawCount; j++) {\n if (j % 2) {\n // inside parens covers platform identifiers\n var platforms = raw[j].split(';');\n for (i = 0, count = platforms.length; i < count; i++) {\n if (R_Platform.exec(platforms[i])) {\n var key = RegExp.$1.split(' ').join('_'),\n val = RegExp.$2;\n\n // if duplicate entries favor highest version\n if (!ua[key] || Number.parseFloat(ua[key]) < Number.parseFloat(val)) {\n ua[key] = val;\n }\n }\n }\n } else {\n // outside parens covers most version identifiers\n var uas = raw[j].match(R_Version);\n if (uas) {\n for (i = 0, count = uas.length; i < count; i++) {\n var parts = uas[i].split(/[\\/\\s]+/);\n if (parts.length && parts[0] !== 'mozilla') {\n ua[parts[0].split(' ').join('_')] = parts.slice(1).join('-');\n }\n }\n }\n }\n }\n\n if (R_mobile.exec(uaStr)) {\n // mobile device indicators\n ua.mobile = RegExp.$1;\n if (R_BlackBerry.exec(uaStr)) {\n delete ua[ua.mobile];\n ua.blackberry = ua.version || RegExp.$3 || RegExp.$2 || RegExp.$1;\n if (RegExp.$1) {\n // standardize non-tablet blackberry\n ua.mobile = 'blackberry';\n } else if (ua.version === '0.0.1') {\n // fix playbook 1.0 quirk\n ua.blackberry = '7.1.0.0';\n }\n }\n } else if (R_game.exec(uaStr)) {\n // game console indicators\n ua.game = RegExp.$1;\n var game = ua.game.split(' ').join('_');\n\n if (ua.version && !ua[game]) {\n ua[game] = ua.version;\n }\n } else if (R_desktop.exec(uaStr)) {\n // desktop OS indicators\n ua.desktop = RegExp.$1;\n }\n\n // platform naming standardizations\n if (ua.intel_mac_os_x) {\n ua.mac_os_x = ua.intel_mac_os_x.split('_').join('.');\n delete ua.intel_mac_os_x;\n } else if (ua.cpu_iphone_os) {\n ua.ios = ua.cpu_iphone_os.split('_').join('.');\n delete ua.cpu_iphone_os;\n } else if (ua.cpu_os) {\n ua.ios = ua.cpu_os.split('_').join('.');\n delete ua.cpu_os;\n } else if (ua.mobile === 'iphone' && !ua.ios) {\n ua.ios = '1';\n }\n\n // UA naming standardizations\n if (ua.opera && ua.version) {\n ua.opera = ua.version;\n // version/XXX refers to opera\n delete ua.blackberry;\n } else if (R_Silk.exec(uaStr)) {\n ua.silk_accelerated = true;\n } else if (R_FluidApp.exec(uaStr)) {\n ua.fluidapp = ua.version;\n }\n\n if (ua.edge) {\n delete ua.applewebkit;\n delete ua.safari;\n delete ua.chrome;\n delete ua.android;\n }\n\n if (ua.applewebkit) {\n ua.webkit = ua.applewebkit;\n delete ua.applewebkit;\n\n if (ua.opr) {\n ua.opera = ua.opr;\n delete ua.opr;\n delete ua.chrome;\n }\n\n if (ua.safari) {\n if (\n ua.chrome ||\n ua.crios ||\n ua.fxios ||\n ua.opera ||\n ua.silk ||\n ua.fluidapp ||\n ua.phantomjs ||\n (ua.mobile && !ua.ios)\n ) {\n delete ua.safari;\n\n if (ua.vivaldi) {\n delete ua.chrome;\n }\n } else if (ua.version && !ua.rim_tablet_os) {\n ua.safari = ua.version;\n } else {\n ua.safari =\n {\n 419: '2.0.4',\n 417: '2.0.3',\n 416: '2.0.2',\n 412: '2.0',\n 312: '1.3',\n 125: '1.2',\n 85: '1.0',\n }[Number.parseInt(ua.safari, 10)] || ua.safari;\n }\n }\n } else if (ua.msie || ua.trident) {\n if (!ua.opera) {\n // standardize Internet Explorer\n ua.ie = ua.msie || ua.rv;\n }\n delete ua.msie;\n delete ua.android;\n\n if (ua.windows_phone_os) {\n // standardize window phone\n ua.windows_phone = ua.windows_phone_os;\n delete ua.windows_phone_os;\n } else if (ua.mobile === 'wpdesktop' || ua.mobile === 'xblwp7' || ua.mobile === 'zunewp7') {\n ua.mobile = 'windows desktop';\n ua.windows_phone = +ua.ie < 9 ? '7.0' : +ua.ie < 10 ? '7.5' : '8.0';\n delete ua.windows_nt;\n }\n } else if (ua.gecko || ua.firefox) {\n ua.gecko = ua.rv;\n }\n\n if (ua.rv) {\n delete ua.rv;\n }\n if (ua.version) {\n delete ua.version;\n }\n\n return ua;\n },\n\n format:\n /**\n * @param ua {Object}\n * @return {string}\n */\n function (ua) {\n /**\n * @param b {string} browser key\n * @param v {string} browser value\n * @return {string} formatted CSS classes\n */\n function format(b, v) {\n b = b.split('.').join('-');\n\n /**\n * @type {string}\n */\n var css = PREFIX + b;\n if (typeof v === 'string') {\n v = v.split(' ').join('_').split('.').join('-');\n var i = v.indexOf('-');\n while (i > 0) {\n // loop through chopping last '-' to end off\n // concat result onto return string\n css += PREFIX + b + '-' + v.substring(0, i);\n i = v.indexOf('-', i + 1);\n }\n css += PREFIX + b + '-' + v;\n }\n return css;\n }\n\n /**\n * @type {string}\n */\n var uaCss = '';\n for (var b in ua) {\n if (b && ua.hasOwnProperty(b)) {\n uaCss += format(b, ua[b]);\n }\n }\n\n // user-agent classNames\n return uaCss;\n },\n\n encode:\n /**\n * Encodes parsed userAgent object as a compact URI-Encoded key-value collection\n * @param ua {Object}\n * @return {string}\n */\n function (ua) {\n var query = '';\n for (var b in ua) {\n if (b && ua.hasOwnProperty(b)) {\n if (query) {\n query += '&';\n }\n query += encodeURIComponent(b) + '=' + encodeURIComponent(ua[b]);\n }\n }\n return query;\n },\n };\n\n /**\n * @const\n * @type {Object}\n */\n cssua.userAgent = cssua.ua = cssua.parse(userAgent, sa);\n\n /**\n * @const\n * @type {string}\n */\n var ua = cssua.format(cssua.ua) + ' js';\n\n // append CSS classes to HTML node\n if (html.className) {\n html.className = html.className.replace(/\\bno-js\\b/g, '') + ua;\n } else {\n html.className = ua.substr(1);\n }\n\n return cssua;\n};\n"],"names":["cssua","html","userAgent","sa","PREFIX","R_Platform","R_Version","R_BlackBerry","R_Silk","R_FluidApp","R_desktop","R_mobile","R_game","uaStr","ua","i","count","raw","j","rawCount","platforms","key","val","uas","parts","game","format","b","v","css","uaCss","query"],"mappings":"AAmBY,MAACA,IAAQ,CAACC,GAAMC,GAAWC,MAAO;AAO1C,MAAIC,IAAS,QAMTC,IAAa,oDAMbC,IAAY,mDAMZC,IAAe,yEAMfC,IAAS,6BAMTC,IAAa,gBAMbC,IAAY,kDAMZC,IACA,4QAMAC,IAAS,+CAMTZ,IAAQ;AAAA,IACR;AAAA;AAAA;AAAA;AAAA;AAAA,MAKI,SAAUa,GAAOV,GAAI;AAIjB,YAAIW,IAAK,CAAA;AAMT,YALIX,MACAW,EAAG,aAAaX,IAGpBU,KAAS,KAAKA,GAAO,YAAW,GAC5B,CAACA;AACD,iBAAOC;AAMX,iBAHIC,GACAC,GACAC,IAAMJ,EAAM,MAAM,MAAM,GACnBK,IAAI,GAAGC,IAAWF,EAAI,QAAQC,IAAIC,GAAUD;AACjD,cAAIA,IAAI,GAAG;AAEP,gBAAIE,IAAYH,EAAIC,CAAC,EAAE,MAAM,GAAG;AAChC,iBAAKH,IAAI,GAAGC,IAAQI,EAAU,QAAQL,IAAIC,GAAOD;AAC7C,kBAAIV,EAAW,KAAKe,EAAUL,CAAC,CAAC,GAAG;AAC/B,oBAAIM,IAAM,OAAO,GAAG,MAAM,GAAG,EAAE,KAAK,GAAG,GACnCC,IAAM,OAAO;AAGjB,iBAAI,CAACR,EAAGO,CAAG,KAAK,OAAO,WAAWP,EAAGO,CAAG,CAAC,IAAI,OAAO,WAAWC,CAAG,OAC9DR,EAAGO,CAAG,IAAIC;AAAA,cAElB;AAAA,UAER,OAAO;AAEH,gBAAIC,IAAMN,EAAIC,CAAC,EAAE,MAAMZ,CAAS;AAChC,gBAAIiB;AACA,mBAAKR,IAAI,GAAGC,IAAQO,EAAI,QAAQR,IAAIC,GAAOD,KAAK;AAC5C,oBAAIS,IAAQD,EAAIR,CAAC,EAAE,MAAM,SAAS;AAClC,gBAAIS,EAAM,UAAUA,EAAM,CAAC,MAAM,cAC7BV,EAAGU,EAAM,CAAC,EAAE,MAAM,GAAG,EAAE,KAAK,GAAG,CAAC,IAAIA,EAAM,MAAM,CAAC,EAAE,KAAK,GAAG;AAAA,cAEnE;AAAA,UAER;AAGJ,YAAIb,EAAS,KAAKE,CAAK;AAEnB,UAAAC,EAAG,SAAS,OAAO,IACfP,EAAa,KAAKM,CAAK,MACvB,OAAOC,EAAGA,EAAG,MAAM,GACnBA,EAAG,aAAaA,EAAG,WAAW,OAAO,MAAM,OAAO,MAAM,OAAO,IAC3D,OAAO,KAEPA,EAAG,SAAS,eACLA,EAAG,YAAY,YAEtBA,EAAG,aAAa;AAAA,iBAGjBF,EAAO,KAAKC,CAAK,GAAG;AAE3B,UAAAC,EAAG,OAAO,OAAO;AACjB,cAAIW,IAAOX,EAAG,KAAK,MAAM,GAAG,EAAE,KAAK,GAAG;AAEtC,UAAIA,EAAG,WAAW,CAACA,EAAGW,CAAI,MACtBX,EAAGW,CAAI,IAAIX,EAAG;AAAA,QAEtB,MAAO,CAAIJ,EAAU,KAAKG,CAAK,MAE3BC,EAAG,UAAU,OAAO;AAIxB,eAAIA,EAAG,kBACHA,EAAG,WAAWA,EAAG,eAAe,MAAM,GAAG,EAAE,KAAK,GAAG,GACnD,OAAOA,EAAG,kBACHA,EAAG,iBACVA,EAAG,MAAMA,EAAG,cAAc,MAAM,GAAG,EAAE,KAAK,GAAG,GAC7C,OAAOA,EAAG,iBACHA,EAAG,UACVA,EAAG,MAAMA,EAAG,OAAO,MAAM,GAAG,EAAE,KAAK,GAAG,GACtC,OAAOA,EAAG,UACHA,EAAG,WAAW,YAAY,CAACA,EAAG,QACrCA,EAAG,MAAM,MAITA,EAAG,SAASA,EAAG,WACfA,EAAG,QAAQA,EAAG,SAEd,OAAOA,EAAG,cACHN,EAAO,KAAKK,CAAK,IACxBC,EAAG,mBAAmB,KACfL,EAAW,KAAKI,CAAK,MAC5BC,EAAG,WAAWA,EAAG,UAGjBA,EAAG,SACH,OAAOA,EAAG,aACV,OAAOA,EAAG,QACV,OAAOA,EAAG,QACV,OAAOA,EAAG,UAGVA,EAAG,eACHA,EAAG,SAASA,EAAG,aACf,OAAOA,EAAG,aAENA,EAAG,QACHA,EAAG,QAAQA,EAAG,KACd,OAAOA,EAAG,KACV,OAAOA,EAAG,SAGVA,EAAG,WAECA,EAAG,UACHA,EAAG,SACHA,EAAG,SACHA,EAAG,SACHA,EAAG,QACHA,EAAG,YACHA,EAAG,aACFA,EAAG,UAAU,CAACA,EAAG,OAElB,OAAOA,EAAG,QAENA,EAAG,WACH,OAAOA,EAAG,UAEPA,EAAG,WAAW,CAACA,EAAG,gBACzBA,EAAG,SAASA,EAAG,UAEfA,EAAG,SACC;AAAA,UACI,KAAK;AAAA,UACL,KAAK;AAAA,UACL,KAAK;AAAA,UACL,KAAK;AAAA,UACL,KAAK;AAAA,UACL,KAAK;AAAA,UACL,IAAI;AAAA,QACxC,EAAkC,OAAO,SAASA,EAAG,QAAQ,EAAE,CAAC,KAAKA,EAAG,WAG7CA,EAAG,QAAQA,EAAG,WAChBA,EAAG,UAEJA,EAAG,KAAKA,EAAG,QAAQA,EAAG,KAE1B,OAAOA,EAAG,MACV,OAAOA,EAAG,SAENA,EAAG,oBAEHA,EAAG,gBAAgBA,EAAG,kBACtB,OAAOA,EAAG,qBACHA,EAAG,WAAW,eAAeA,EAAG,WAAW,YAAYA,EAAG,WAAW,eAC5EA,EAAG,SAAS,mBACZA,EAAG,gBAAgB,CAACA,EAAG,KAAK,IAAI,QAAQ,CAACA,EAAG,KAAK,KAAK,QAAQ,OAC9D,OAAOA,EAAG,gBAEPA,EAAG,SAASA,EAAG,aACtBA,EAAG,QAAQA,EAAG,KAGdA,EAAG,MACH,OAAOA,EAAG,IAEVA,EAAG,WACH,OAAOA,EAAG,SAGPA;AAAA,MACX;AAAA;AAAA,IAEJ;AAAA;AAAA;AAAA;AAAA;AAAA,MAKI,SAAUA,GAAI;AAMV,iBAASY,EAAOC,GAAGC,GAAG;AAClB,UAAAD,IAAIA,EAAE,MAAM,GAAG,EAAE,KAAK,GAAG;AAKzB,cAAIE,IAAMzB,IAASuB;AACnB,cAAI,OAAOC,KAAM,UAAU;AACvB,YAAAA,IAAIA,EAAE,MAAM,GAAG,EAAE,KAAK,GAAG,EAAE,MAAM,GAAG,EAAE,KAAK,GAAG;AAE9C,qBADIb,IAAIa,EAAE,QAAQ,GAAG,GACdb,IAAI;AAGP,cAAAc,KAAOzB,IAASuB,IAAI,MAAMC,EAAE,UAAU,GAAGb,CAAC,GAC1CA,IAAIa,EAAE,QAAQ,KAAKb,IAAI,CAAC;AAE5B,YAAAc,KAAOzB,IAASuB,IAAI,MAAMC;AAAA,UAC9B;AACA,iBAAOC;AAAA,QACX;AAKA,YAAIC,IAAQ;AACZ,iBAASH,KAAKb;AACV,UAAIa,KAAKb,EAAG,eAAea,CAAC,MACxBG,KAASJ,EAAOC,GAAGb,EAAGa,CAAC,CAAC;AAKhC,eAAOG;AAAA,MACX;AAAA;AAAA,IAEJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAMI,SAAUhB,GAAI;AACV,YAAIiB,IAAQ;AACZ,iBAASJ,KAAKb;AACV,UAAIa,KAAKb,EAAG,eAAea,CAAC,MACpBI,MACAA,KAAS,MAEbA,KAAS,mBAAmBJ,CAAC,IAAI,MAAM,mBAAmBb,EAAGa,CAAC,CAAC;AAGvE,eAAOI;AAAA,MACX;AAAA;AAAA,EACZ;AAMI,EAAA/B,EAAM,YAAYA,EAAM,KAAKA,EAAM,MAAME,GAAWC,CAAE;AAMtD,MAAIW,IAAKd,EAAM,OAAOA,EAAM,EAAE,IAAI;AAGlC,SAAIC,EAAK,YACLA,EAAK,YAAYA,EAAK,UAAU,QAAQ,cAAc,EAAE,IAAIa,IAE5Db,EAAK,YAAYa,EAAG,OAAO,CAAC,GAGzBd;AACX;"}
|
|
@@ -1,19 +1,20 @@
|
|
|
1
|
-
const
|
|
2
|
-
|
|
1
|
+
const g = "up", f = "down";
|
|
2
|
+
const m = (l, t, s) => {
|
|
3
|
+
if (!t || !s)
|
|
3
4
|
return;
|
|
4
|
-
const
|
|
5
|
-
switch (
|
|
6
|
-
case
|
|
7
|
-
|
|
5
|
+
const i = t.clientHeight, n = t.scrollTop, o = s.clientHeight, c = s.offsetTop, e = c + o, a = n + i;
|
|
6
|
+
switch (l) {
|
|
7
|
+
case "up":
|
|
8
|
+
c < n && (t.scrollTop = c - 4);
|
|
8
9
|
break;
|
|
9
|
-
case
|
|
10
|
-
|
|
10
|
+
case f:
|
|
11
|
+
e > a && (t.scrollTop = e - i + 4);
|
|
11
12
|
break;
|
|
12
13
|
}
|
|
13
14
|
};
|
|
14
15
|
export {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
16
|
+
f as DOWN,
|
|
17
|
+
g as UP,
|
|
18
|
+
m as scrollItemIntoView
|
|
18
19
|
};
|
|
19
20
|
//# sourceMappingURL=scrollItemIntoView.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scrollItemIntoView.js","sources":["../../src/utils/scrollItemIntoView.ts"],"sourcesContent":["export const UP = 'up';\nexport const DOWN = 'down';\n\n// Scroll to selected dropdown menu-item in case the item is not visible due to overflow\nexport const scrollItemIntoView = (\n direction: string,\n dropDownDOMNode: HTMLElement | null,\n focusedItemDOMNode: HTMLElement | null | undefined\n) => {\n if (!dropDownDOMNode || !focusedItemDOMNode) {\n return;\n }\n\n const menuHeight = dropDownDOMNode.clientHeight;\n const itemHeight = focusedItemDOMNode.clientHeight;\n const itemOffsetTop = focusedItemDOMNode.offsetTop;\n\n switch (direction) {\n case UP:\n if (itemOffsetTop <
|
|
1
|
+
{"version":3,"file":"scrollItemIntoView.js","sources":["../../src/utils/scrollItemIntoView.ts"],"sourcesContent":["export const UP = 'up';\nexport const DOWN = 'down';\n\n// Used to adds some spacing for the scrolling so the item is not exactly at the same line\nconst spacing = 4;\n\n// Scroll to selected dropdown menu-item in case the item is not visible due to overflow\nexport const scrollItemIntoView = (\n direction: string,\n dropDownDOMNode: HTMLElement | null,\n focusedItemDOMNode: HTMLElement | null | undefined\n) => {\n if (!dropDownDOMNode || !focusedItemDOMNode) {\n return;\n }\n\n const menuHeight = dropDownDOMNode.clientHeight;\n const menuScrollTop = dropDownDOMNode.scrollTop;\n const itemHeight = focusedItemDOMNode.clientHeight;\n const itemOffsetTop = focusedItemDOMNode.offsetTop;\n const itemOffsetBottom = itemOffsetTop + itemHeight;\n const menuVisibleBottom = menuScrollTop + menuHeight;\n\n switch (direction) {\n case UP:\n if (itemOffsetTop < menuScrollTop) {\n dropDownDOMNode.scrollTop = itemOffsetTop - spacing;\n }\n break;\n case DOWN:\n if (itemOffsetBottom > menuVisibleBottom) {\n dropDownDOMNode.scrollTop = itemOffsetBottom - menuHeight + spacing;\n }\n break;\n default:\n break;\n }\n};\n"],"names":["UP","DOWN","scrollItemIntoView","direction","dropDownDOMNode","focusedItemDOMNode","menuHeight","menuScrollTop","itemHeight","itemOffsetTop","itemOffsetBottom","menuVisibleBottom"],"mappings":"AAAO,MAAMA,IAAK,MACLC,IAAO;AAMb,MAAMC,IAAqB,CAC9BC,GACAC,GACAC,MACC;AACD,MAAI,CAACD,KAAmB,CAACC;AACrB;AAGJ,QAAMC,IAAaF,EAAgB,cAC7BG,IAAgBH,EAAgB,WAChCI,IAAaH,EAAmB,cAChCI,IAAgBJ,EAAmB,WACnCK,IAAmBD,IAAgBD,GACnCG,IAAoBJ,IAAgBD;AAE1C,UAAQH,GAAA;AAAA,IACJ,KAAK;AACD,MAAIM,IAAgBF,MAChBH,EAAgB,YAAYK,IAAgB;AAEhD;AAAA,IACJ,KAAKR;AACD,MAAIS,IAAmBC,MACnBP,EAAgB,YAAYM,IAAmBJ,IAAa;AAEhE;AAAA,EAEA;AAEZ;"}
|
|
@@ -1,27 +1,26 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { get as h, mapValues as d } from "es-toolkit/compat";
|
|
1
|
+
import { mapValues as h } from "es-toolkit/compat";
|
|
3
2
|
import { storage as n } from "./storageUtils.js";
|
|
4
|
-
const
|
|
3
|
+
const i = "featureToggle.", f = (t, o) => {
|
|
5
4
|
try {
|
|
6
|
-
t.forEach((
|
|
7
|
-
n.removeItem(
|
|
5
|
+
t.forEach((e) => {
|
|
6
|
+
n.removeItem(e, o);
|
|
8
7
|
});
|
|
9
|
-
} catch (
|
|
10
|
-
console.error(
|
|
8
|
+
} catch (e) {
|
|
9
|
+
console.error(e);
|
|
11
10
|
}
|
|
12
|
-
},
|
|
13
|
-
const [
|
|
14
|
-
return c ?
|
|
15
|
-
}, l = (t) => t === "true" || t === "1", u = (t) => t,
|
|
11
|
+
}, r = (t, o, e, s) => {
|
|
12
|
+
const [d, m = ""] = window.location.hash.split("?"), a = new URLSearchParams(m).get(t) ?? "", c = a ? n.save(t, a, o) : n.load(t, o);
|
|
13
|
+
return c ? e(c) : s;
|
|
14
|
+
}, l = (t) => t === "true" || t === "1", u = (t) => t, g = (t) => Number.parseFloat(t), D = (t) => (o) => r(t, o, l, null), F = (t, o) => (e) => r(t, e, l, o), N = (t) => (o) => r(t, o, u, null), S = (t, o) => (e) => r(t, e, u, o), p = (t) => (o) => r(t, o, g, null), w = (t, o) => (e) => r(t, e, g, o), B = (t, o = [], e = i) => (f(o, e), h(t, (s) => s(e)));
|
|
16
15
|
export {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
16
|
+
i as DEFAULT_PREFIX,
|
|
17
|
+
D as asBoolean,
|
|
18
|
+
F as asBooleanWithDefault,
|
|
19
|
+
p as asNumber,
|
|
20
|
+
w as asNumberWithDefault,
|
|
21
|
+
N as asString,
|
|
22
|
+
S as asStringWithDefault,
|
|
23
|
+
f as cleanupOldToggles,
|
|
24
|
+
B as detectFeatureToggles
|
|
26
25
|
};
|
|
27
26
|
//# sourceMappingURL=urlFeatureToggles.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"urlFeatureToggles.js","sources":["../../src/utils/urlFeatureToggles.ts"],"sourcesContent":["import
|
|
1
|
+
{"version":3,"file":"urlFeatureToggles.js","sources":["../../src/utils/urlFeatureToggles.ts"],"sourcesContent":["import { mapValues } from 'es-toolkit/compat';\n\nimport { storage } from './storageUtils';\n\nexport const DEFAULT_PREFIX = 'featureToggle.';\n\nexport type ToggleType = string | boolean | number;\n\nexport const cleanupOldToggles = (oldToggles: string[], prefix: string) => {\n try {\n oldToggles.forEach(toggle => {\n storage.removeItem(toggle, prefix);\n });\n } catch (error) {\n console.error(error);\n }\n};\n\nconst detectToggle = <T extends ToggleType, DEFAULT extends T | null>(\n param: string,\n prefix: string,\n transformFn: (urlValue: string) => T,\n defaultValue: DEFAULT\n) => {\n const [_, searchParams = ''] = window.location.hash.split('?');\n const urlValue = new URLSearchParams(searchParams).get(param) ?? '';\n\n const storageValue = urlValue ? storage.save(param, urlValue, prefix) : storage.load(param, prefix);\n return storageValue ? transformFn(storageValue) : defaultValue;\n};\n\nconst transformBoolean = (value: string) => value === 'true' || value === '1';\nconst transformString = (value: string) => value;\nconst transformNumber = (value: string) => Number.parseFloat(value);\n\nexport const asBoolean = (urlParamName: string) => (prefix: string) =>\n detectToggle(urlParamName, prefix, transformBoolean, null);\n\nexport const asBooleanWithDefault = (urlParamName: string, defaultValue: boolean) => (prefix: string) =>\n detectToggle(urlParamName, prefix, transformBoolean, defaultValue);\n\nexport const asString = (urlParamName: string) => (prefix: string) =>\n detectToggle(urlParamName, prefix, transformString, null);\n\nexport const asStringWithDefault = (urlParamName: string, defaultValue: string) => (prefix: string) =>\n detectToggle(urlParamName, prefix, transformString, defaultValue);\n\nexport const asNumber = (urlParamName: string) => (prefix: string) =>\n detectToggle(urlParamName, prefix, transformNumber, null);\n\nexport const asNumberWithDefault = (urlParamName: string, defaultValue: number) => (prefix: string) =>\n detectToggle(urlParamName, prefix, transformNumber, defaultValue);\n\ntype ToggleValueExtractor = (prefix: string) => ToggleType | null;\n\n// The extends conditional here is intentional because it gives nicer type hints in editors.\ntype ToggleValues<TOGGLE_DEFS> =\n TOGGLE_DEFS extends Record<string, ToggleValueExtractor>\n ? {\n [K in keyof TOGGLE_DEFS]: ReturnType<TOGGLE_DEFS[K]>;\n }\n : never;\n\nexport const detectFeatureToggles = <TOGGLE_DEFS extends Record<string, ToggleValueExtractor>>(\n toggleDefinitions: TOGGLE_DEFS,\n oldToggles: string[] = [],\n prefix: string = DEFAULT_PREFIX\n): ToggleValues<TOGGLE_DEFS> => {\n cleanupOldToggles(oldToggles, prefix);\n\n return mapValues(toggleDefinitions, toggleFn => toggleFn(prefix)) as ToggleValues<TOGGLE_DEFS>;\n};\n"],"names":["DEFAULT_PREFIX","cleanupOldToggles","oldToggles","prefix","toggle","storage","error","detectToggle","param","transformFn","defaultValue","_","searchParams","urlValue","storageValue","transformBoolean","value","transformString","transformNumber","asBoolean","urlParamName","asBooleanWithDefault","asString","asStringWithDefault","asNumber","asNumberWithDefault","detectFeatureToggles","toggleDefinitions","mapValues","toggleFn"],"mappings":";;AAIO,MAAMA,IAAiB,kBAIjBC,IAAoB,CAACC,GAAsBC,MAAmB;AACvE,MAAI;AACA,IAAAD,EAAW,QAAQ,CAAAE,MAAU;AACzB,MAAAC,EAAQ,WAAWD,GAAQD,CAAM;AAAA,IACrC,CAAC;AAAA,EACL,SAASG,GAAO;AACZ,YAAQ,MAAMA,CAAK;AAAA,EACvB;AACJ,GAEMC,IAAe,CACjBC,GACAL,GACAM,GACAC,MACC;AACD,QAAM,CAACC,GAAGC,IAAe,EAAE,IAAI,OAAO,SAAS,KAAK,MAAM,GAAG,GACvDC,IAAW,IAAI,gBAAgBD,CAAY,EAAE,IAAIJ,CAAK,KAAK,IAE3DM,IAAeD,IAAWR,EAAQ,KAAKG,GAAOK,GAAUV,CAAM,IAAIE,EAAQ,KAAKG,GAAOL,CAAM;AAClG,SAAOW,IAAeL,EAAYK,CAAY,IAAIJ;AACtD,GAEMK,IAAmB,CAACC,MAAkBA,MAAU,UAAUA,MAAU,KACpEC,IAAkB,CAACD,MAAkBA,GACrCE,IAAkB,CAACF,MAAkB,OAAO,WAAWA,CAAK,GAErDG,IAAY,CAACC,MAAyB,CAACjB,MAChDI,EAAaa,GAAcjB,GAAQY,GAAkB,IAAI,GAEhDM,IAAuB,CAACD,GAAsBV,MAA0B,CAACP,MAClFI,EAAaa,GAAcjB,GAAQY,GAAkBL,CAAY,GAExDY,IAAW,CAACF,MAAyB,CAACjB,MAC/CI,EAAaa,GAAcjB,GAAQc,GAAiB,IAAI,GAE/CM,IAAsB,CAACH,GAAsBV,MAAyB,CAACP,MAChFI,EAAaa,GAAcjB,GAAQc,GAAiBP,CAAY,GAEvDc,IAAW,CAACJ,MAAyB,CAACjB,MAC/CI,EAAaa,GAAcjB,GAAQe,GAAiB,IAAI,GAE/CO,IAAsB,CAACL,GAAsBV,MAAyB,CAACP,MAChFI,EAAaa,GAAcjB,GAAQe,GAAiBR,CAAY,GAYvDgB,IAAuB,CAChCC,GACAzB,IAAuB,CAAA,GACvBC,IAAiBH,OAEjBC,EAAkBC,GAAYC,CAAM,GAE7ByB,EAAUD,GAAmB,CAAAE,MAAYA,EAAS1B,CAAM,CAAC;"}
|
package/version.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export const version: "2.
|
|
1
|
+
export const version: "2.1.0";
|
package/version.js
CHANGED
package/version.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.js","sources":["../src/version.js"],"sourcesContent":["export const version = '2.
|
|
1
|
+
{"version":3,"file":"version.js","sources":["../src/version.js"],"sourcesContent":["export const version = '2.1.0';\n"],"names":["version"],"mappings":"AAAY,MAACA,IAAU;"}
|