@cube-dev/ui-kit 0.176.0 → 0.177.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/dist/CHANGELOG.md +26 -0
- package/dist/_internal/hooks/use-debounced-value.js +1 -1
- package/dist/_internal/hooks/use-deprecation-warning.js +1 -1
- package/dist/_internal/hooks/use-event.js +1 -1
- package/dist/_internal/hooks/use-is-first-render.js +1 -1
- package/dist/_internal/hooks/use-sync-ref.js +1 -1
- package/dist/_internal/hooks/use-timer/timer.js +1 -1
- package/dist/_internal/hooks/use-timer/use-timer.js +1 -1
- package/dist/_internal/hooks/use-warn.js +1 -1
- package/dist/components/Block.js +1 -1
- package/dist/components/CollectionItem.js +1 -1
- package/dist/components/GlobalStyles.js +1 -1
- package/dist/components/GridProvider.js +1 -1
- package/dist/components/HiddenInput.js +1 -1
- package/dist/components/Root.js +1 -1
- package/dist/components/actions/Action/Action.js +1 -1
- package/dist/components/actions/Banner/Banner.js +1 -1
- package/dist/components/actions/Button/Button.d.ts +0 -1
- package/dist/components/actions/Button/Button.js +1 -1
- package/dist/components/actions/ButtonGroup/ButtonGroup.js +1 -1
- package/dist/components/actions/ButtonSplit/ButtonSplit.js +1 -1
- package/dist/components/actions/ButtonSplit/context.js +1 -1
- package/dist/components/actions/CommandMenu/CommandMenu.js +1 -1
- package/dist/components/actions/CommandMenu/styled.js +1 -1
- package/dist/components/actions/ItemAction/ItemAction.js +1 -1
- package/dist/components/actions/ItemActionContext.js +1 -1
- package/dist/components/actions/ItemButton/ItemButton.js +1 -1
- package/dist/components/actions/Link/Link.js +1 -1
- package/dist/components/actions/Menu/Menu.js +1 -1
- package/dist/components/actions/Menu/MenuItem.js +1 -1
- package/dist/components/actions/Menu/MenuSection.js +1 -1
- package/dist/components/actions/Menu/MenuTrigger.js +1 -1
- package/dist/components/actions/Menu/SubMenuTrigger.js +1 -1
- package/dist/components/actions/Menu/SubmenuTriggerContext.js +1 -1
- package/dist/components/actions/Menu/context.js +1 -1
- package/dist/components/actions/Menu/styled.js +1 -1
- package/dist/components/actions/index.js +1 -1
- package/dist/components/actions/use-action.js +1 -1
- package/dist/components/actions/use-anchored-menu.js +1 -1
- package/dist/components/actions/use-context-menu.js +1 -1
- package/dist/components/content/ActiveZone/ActiveZone.js +1 -1
- package/dist/components/content/Alert/Alert.js +1 -1
- package/dist/components/content/Alert/use-alert.js +1 -1
- package/dist/components/content/Avatar/Avatar.js +1 -1
- package/dist/components/content/Badge/Badge.js +1 -1
- package/dist/components/content/Card/Card.js +1 -1
- package/dist/components/content/Content.js +1 -1
- package/dist/components/content/CopyPasteBlock/CopyPasteBlock.js +1 -1
- package/dist/components/content/CopySnippet/CopySnippet.js +1 -1
- package/dist/components/content/Disclosure/Disclosure.js +1 -1
- package/dist/components/content/Divider.js +1 -1
- package/dist/components/content/Footer.js +1 -1
- package/dist/components/content/Header.js +1 -1
- package/dist/components/content/HotKeys/HotKeys.js +1 -1
- package/dist/components/content/InfoBadge/InfoBadge.js +1 -1
- package/dist/components/content/InlineInput/InlineInput.js +1 -1
- package/dist/components/content/Item/Item.js +1 -1
- package/dist/components/content/ItemBadge/ItemBadge.js +1 -1
- package/dist/components/content/ItemCard/ItemCard.js +1 -1
- package/dist/components/content/Layout/GridLayout.js +1 -1
- package/dist/components/content/Layout/Layout.js +39 -28
- package/dist/components/content/Layout/Layout.js.map +1 -1
- package/dist/components/content/Layout/LayoutBlock.js +1 -1
- package/dist/components/content/Layout/LayoutCenter.js +1 -1
- package/dist/components/content/Layout/LayoutContainer.js +1 -1
- package/dist/components/content/Layout/LayoutContent.js +1 -1
- package/dist/components/content/Layout/LayoutContext.js +1 -1
- package/dist/components/content/Layout/LayoutFlex.js +1 -1
- package/dist/components/content/Layout/LayoutFooter.js +1 -1
- package/dist/components/content/Layout/LayoutGrid.js +1 -1
- package/dist/components/content/Layout/LayoutHeader.js +1 -1
- package/dist/components/content/Layout/LayoutPane.js +1 -1
- package/dist/components/content/Layout/LayoutPanel.js +1 -1
- package/dist/components/content/Layout/LayoutPanelHeader.js +1 -1
- package/dist/components/content/Layout/LayoutToolbar.js +1 -1
- package/dist/components/content/Layout/hooks/useTinyScrollbar.js +1 -1
- package/dist/components/content/Layout/index.js +1 -1
- package/dist/components/content/Layout/utils.js +1 -1
- package/dist/components/content/Paragraph.js +1 -1
- package/dist/components/content/Placeholder/Placeholder.js +1 -1
- package/dist/components/content/PrismCode/PrismCode.js +1 -1
- package/dist/components/content/PrismCode/prismSetup.js +1 -1
- package/dist/components/content/PrismDiffCode/PrismDiffCode.js +1 -1
- package/dist/components/content/Result/Result.js +1 -1
- package/dist/components/content/Skeleton/Skeleton.js +1 -1
- package/dist/components/content/Tag/Tag.js +1 -1
- package/dist/components/content/Text.d.ts +14 -14
- package/dist/components/content/Text.js +1 -1
- package/dist/components/content/TextItem/TextItem.js +1 -1
- package/dist/components/content/Title.js +1 -1
- package/dist/components/content/Tree/Tree.js +1 -1
- package/dist/components/content/Tree/TreeNode.js +1 -1
- package/dist/components/content/Tree/styled.js +1 -1
- package/dist/components/content/Tree/tree-index.js +1 -1
- package/dist/components/content/Tree/use-checkbox-tree.js +1 -1
- package/dist/components/content/Tree/use-load-data.js +3 -2
- package/dist/components/content/Tree/use-load-data.js.map +1 -1
- package/dist/components/content/highlightText.js +1 -1
- package/dist/components/content/use-auto-tooltip.js +1 -1
- package/dist/components/data/DataTable/DataTable.js +1 -1
- package/dist/components/data/ItemTable/ItemTable.js +1 -1
- package/dist/components/data/ItemTable/ItemTableBulkBar.js +1 -1
- package/dist/components/data/ItemTable/ItemTableDragPreview.js +1 -1
- package/dist/components/data/ItemTable/ItemTableFooter.js +1 -1
- package/dist/components/data/ItemTable/ItemTableToolbar.js +1 -1
- package/dist/components/data/TableBase/ColumnResizer.js +1 -1
- package/dist/components/data/TableBase/RowCollection.js +1 -1
- package/dist/components/data/TableBase/TableHeaderCell.js +1 -1
- package/dist/components/data/TableBase/TableRow.js +1 -1
- package/dist/components/data/TableBase/TableView.js +1 -1
- package/dist/components/data/TableBase/column-menu.js +1 -1
- package/dist/components/data/TableBase/column-tint.js +1 -1
- package/dist/components/data/TableBase/row-menu.js +1 -1
- package/dist/components/data/TableBase/styled.d.ts +1 -2
- package/dist/components/data/TableBase/styled.js +1 -1
- package/dist/components/data/TableBase/table-tree.js +1 -1
- package/dist/components/data/TableBase/types.js +1 -1
- package/dist/components/data/TableBase/use-cell-selection.d.ts +0 -1
- package/dist/components/data/TableBase/use-cell-selection.js +0 -0
- package/dist/components/data/TableBase/use-column-order.js +1 -1
- package/dist/components/data/TableBase/use-container-width.js +1 -1
- package/dist/components/data/TableBase/use-row-move-animation.js +1 -1
- package/dist/components/data/TableBase/use-scrollability.js +1 -1
- package/dist/components/data/TableBase/use-table-columns.js +1 -1
- package/dist/components/data/TableBase/use-table-search.js +1 -1
- package/dist/components/data/TableBase/use-table-selection.js +1 -1
- package/dist/components/data/TableBase/use-table-sort.js +1 -1
- package/dist/components/data/TableBase/use-table-sorts.js +1 -1
- package/dist/components/data/TableBase/use-table-storage.js +1 -1
- package/dist/components/data/TableBase/use-table-tree-state.js +1 -1
- package/dist/components/fields/Checkbox/Checkbox.js +1 -1
- package/dist/components/fields/Checkbox/CheckboxGroup.js +1 -1
- package/dist/components/fields/Checkbox/context.js +1 -1
- package/dist/components/fields/ColorInput/ColorInput.js +1 -1
- package/dist/components/fields/ColorPicker/ColorPicker.js +1 -1
- package/dist/components/fields/ColorSwatch/ColorSwatch.js +1 -1
- package/dist/components/fields/ColorSwatchGroup/ColorSwatchGroup.js +1 -1
- package/dist/components/fields/ComboBox/ComboBox.js +1 -1
- package/dist/components/fields/CommandTextArea/CommandTextArea.js +1 -1
- package/dist/components/fields/CommandTextArea/caretPosition.js +1 -1
- package/dist/components/fields/CommandTextArea/useCaretAnchor.js +1 -1
- package/dist/components/fields/DatePicker/DateInput.js +1 -1
- package/dist/components/fields/DatePicker/DateInputBase.js +1 -1
- package/dist/components/fields/DatePicker/DatePicker.js +1 -1
- package/dist/components/fields/DatePicker/DatePickerButton.js +1 -1
- package/dist/components/fields/DatePicker/DatePickerElement.js +1 -1
- package/dist/components/fields/DatePicker/DatePickerInput.js +1 -1
- package/dist/components/fields/DatePicker/DatePickerSegment.js +1 -1
- package/dist/components/fields/DatePicker/DateRangePicker.js +1 -1
- package/dist/components/fields/DatePicker/DateRangeSeparatedPicker.js +1 -1
- package/dist/components/fields/DatePicker/MonthPicker.js +1 -1
- package/dist/components/fields/DatePicker/PeriodPicker.js +1 -1
- package/dist/components/fields/DatePicker/QuarterPicker.js +1 -1
- package/dist/components/fields/DatePicker/TimeInput.js +1 -1
- package/dist/components/fields/DatePicker/WeekPicker.js +1 -1
- package/dist/components/fields/DatePicker/YearPicker.js +1 -1
- package/dist/components/fields/DatePicker/parseDate.js +1 -1
- package/dist/components/fields/DatePicker/period.js +1 -1
- package/dist/components/fields/DatePicker/props.js +1 -1
- package/dist/components/fields/DatePicker/utils.js +1 -1
- package/dist/components/fields/FileInput/FileInput.js +1 -1
- package/dist/components/fields/FilterListBox/FilterListBox.js +1 -1
- package/dist/components/fields/FilterPicker/FilterPicker.js +1 -1
- package/dist/components/fields/Input/Input.js +1 -1
- package/dist/components/fields/ListBox/DraggableListBox.js +1 -1
- package/dist/components/fields/ListBox/ListBox.js +1 -1
- package/dist/components/fields/ListBoxPopover/ListBoxPopover.js +1 -1
- package/dist/components/fields/ListBoxPopover/index.d.ts +0 -1
- package/dist/components/fields/ListBoxPopover/listNavigation.js +1 -1
- package/dist/components/fields/ListBoxPopover/useCompositeFocus.js +1 -1
- package/dist/components/fields/NumberInput/NumberInput.js +1 -1
- package/dist/components/fields/NumberInput/StepButton.js +1 -1
- package/dist/components/fields/PasswordInput/PasswordInput.js +1 -1
- package/dist/components/fields/Picker/Picker.js +1 -1
- package/dist/components/fields/RadioGroup/Radio.js +1 -1
- package/dist/components/fields/RadioGroup/RadioGroup.js +1 -1
- package/dist/components/fields/RadioGroup/context.js +1 -1
- package/dist/components/fields/SearchComboBox/SearchComboBox.js +1 -1
- package/dist/components/fields/SearchInput/SearchInput.js +1 -1
- package/dist/components/fields/Select/Select.js +1 -1
- package/dist/components/fields/Slider/Gradation.js +1 -1
- package/dist/components/fields/Slider/HueSlider.js +1 -1
- package/dist/components/fields/Slider/RangeSlider.js +1 -1
- package/dist/components/fields/Slider/Slider.js +1 -1
- package/dist/components/fields/Slider/SliderBase.js +1 -1
- package/dist/components/fields/Slider/SliderThumb.js +1 -1
- package/dist/components/fields/Slider/SliderTrack.js +1 -1
- package/dist/components/fields/Slider/elements.js +1 -1
- package/dist/components/fields/Slider/index.js +1 -1
- package/dist/components/fields/Switch/Switch.js +1 -1
- package/dist/components/fields/TextArea/TextArea.js +1 -1
- package/dist/components/fields/TextInput/TextInput.js +1 -1
- package/dist/components/fields/TextInput/TextInputBase.js +1 -1
- package/dist/components/fields/TextInput/useAutoSizeTextArea.js +1 -1
- package/dist/components/fields/TextInputMapper/TextInputMapper.js +1 -1
- package/dist/components/fields/color/ColorPanel.js +1 -1
- package/dist/components/fields/color/channels.js +7 -6
- package/dist/components/fields/color/channels.js.map +1 -1
- package/dist/components/fields/color/color.d.ts +1 -0
- package/dist/components/fields/color/color.js +22 -100
- package/dist/components/fields/color/color.js.map +1 -1
- package/dist/components/fields/color/context.js +1 -1
- package/dist/components/form/FieldWrapper/FieldWrapper.js +3 -2
- package/dist/components/form/FieldWrapper/FieldWrapper.js.map +1 -1
- package/dist/components/form/Form/Field.js +1 -1
- package/dist/components/form/Form/Form.js +1 -1
- package/dist/components/form/Form/ResetButton/ResetButton.js +1 -1
- package/dist/components/form/Form/SubmitButton/SubmitButton.js +1 -1
- package/dist/components/form/Form/SubmitError.js +1 -1
- package/dist/components/form/Form/index.js +1 -1
- package/dist/components/form/Form/use-field/use-field-props.js +1 -1
- package/dist/components/form/Form/use-field/use-field-props.js.map +1 -1
- package/dist/components/form/Form/use-field/use-field.js +1 -1
- package/dist/components/form/Form/use-form.js +1 -1
- package/dist/components/form/Form/validation.js +1 -1
- package/dist/components/form/Label.js +1 -1
- package/dist/components/form/validation/ValidationIndicator.js +1 -1
- package/dist/components/form/validation/resolve-validation-props.js +1 -1
- package/dist/components/form/validation/use-validation-props.js +1 -1
- package/dist/components/form/wrapper.js +1 -1
- package/dist/components/helpers/DisplayTransition/DisplayTransition.js +1 -1
- package/dist/components/helpers/IconSwitch/IconSwitch.js +1 -1
- package/dist/components/layout/Board/Board.js +1 -1
- package/dist/components/layout/Board/BoardProvider.js +1 -1
- package/dist/components/layout/Board/BoardResponsive.js +1 -1
- package/dist/components/layout/Board/Widget.js +1 -1
- package/dist/components/layout/Board/WidgetHost.js +2 -2
- package/dist/components/layout/Board/WidgetHost.js.map +1 -1
- package/dist/components/layout/Board/board-context.js +1 -1
- package/dist/components/layout/Board/board-store.js +1 -1
- package/dist/components/layout/Board/grid-core/calculate.js +1 -1
- package/dist/components/layout/Board/grid-core/collision-modes.js +1 -1
- package/dist/components/layout/Board/grid-core/collision.js +1 -1
- package/dist/components/layout/Board/grid-core/compactors.js +1 -1
- package/dist/components/layout/Board/grid-core/constraints.js +1 -1
- package/dist/components/layout/Board/grid-core/group-move.js +1 -1
- package/dist/components/layout/Board/grid-core/layout.js +1 -1
- package/dist/components/layout/Board/grid-core/placement.js +1 -1
- package/dist/components/layout/Board/grid-core/sort.js +1 -1
- package/dist/components/layout/Board/index.js +1 -1
- package/dist/components/layout/Board/responsive-utils.js +1 -1
- package/dist/components/layout/Board/use-board-layout.js +1 -1
- package/dist/components/layout/Board/use-board-registry.js +1 -1
- package/dist/components/layout/Board/use-board-select-modifier-key.js +1 -1
- package/dist/components/layout/Board/use-board-selection.js +1 -1
- package/dist/components/layout/Flex.js +1 -1
- package/dist/components/layout/Flow.js +1 -1
- package/dist/components/layout/Grid.js +1 -1
- package/dist/components/layout/Panel.js +1 -1
- package/dist/components/layout/Prefix.js +1 -1
- package/dist/components/layout/ResizablePanel.js +1 -1
- package/dist/components/layout/Space.js +1 -1
- package/dist/components/layout/Suffix.js +1 -1
- package/dist/components/navigation/Pagination/Pagination.js +1 -1
- package/dist/components/navigation/Pagination/use-pagination.js +1 -1
- package/dist/components/navigation/Tabs/DraggableTabList.js +1 -1
- package/dist/components/navigation/Tabs/TabButton.js +1 -1
- package/dist/components/navigation/Tabs/TabDropIndicator.js +1 -1
- package/dist/components/navigation/Tabs/TabPanel.js +1 -1
- package/dist/components/navigation/Tabs/TabPicker.js +1 -1
- package/dist/components/navigation/Tabs/Tabs.js +1 -1
- package/dist/components/navigation/Tabs/TabsAction.js +1 -1
- package/dist/components/navigation/Tabs/TabsContext.js +1 -1
- package/dist/components/navigation/Tabs/popover-placement.js +1 -1
- package/dist/components/navigation/Tabs/styled.js +1 -1
- package/dist/components/navigation/Tabs/types.js +1 -1
- package/dist/components/navigation/Tabs/use-tab-editing.js +1 -1
- package/dist/components/navigation/Tabs/use-tab-indicator.js +1 -1
- package/dist/components/organisms/StatsCard/StatsCard.js +1 -1
- package/dist/components/other/Calendar/Calendar.js +1 -1
- package/dist/components/other/Calendar/CalendarCell.js +1 -1
- package/dist/components/other/Calendar/CalendarGrid.js +1 -1
- package/dist/components/other/Calendar/CalendarHeader.js +1 -1
- package/dist/components/other/Calendar/CalendarPanel.js +1 -1
- package/dist/components/other/Calendar/PeriodCalendar.js +1 -1
- package/dist/components/other/Calendar/PeriodGrid.js +1 -1
- package/dist/components/other/Calendar/RangeCalendar.js +1 -1
- package/dist/components/other/Calendar/styled.js +1 -1
- package/dist/components/other/CubeLogo/CubeLogo.js +1 -1
- package/dist/components/other/NoDataIcon/NoDataIcon.js +1 -1
- package/dist/components/overlays/AlertDialog/AlertDialog.js +1 -1
- package/dist/components/overlays/AlertDialog/AlertDialogApiProvider.js +1 -1
- package/dist/components/overlays/AlertDialog/AlertDialogZone.js +1 -1
- package/dist/components/overlays/Dialog/Dialog.js +1 -1
- package/dist/components/overlays/Dialog/DialogContainer.js +1 -1
- package/dist/components/overlays/Dialog/DialogForm.js +1 -1
- package/dist/components/overlays/Dialog/DialogTrigger.js +1 -1
- package/dist/components/overlays/Dialog/context.js +1 -1
- package/dist/components/overlays/Dialog/use-dialog-container.js +1 -1
- package/dist/components/overlays/Modal/Modal.d.ts +1 -2
- package/dist/components/overlays/Modal/Modal.js +1 -1
- package/dist/components/overlays/Modal/OpenTransitionContext.js +1 -1
- package/dist/components/overlays/Modal/Overlay.d.ts +0 -1
- package/dist/components/overlays/Modal/Overlay.js +1 -1
- package/dist/components/overlays/Modal/Popover.js +1 -1
- package/dist/components/overlays/Modal/Tray.js +1 -1
- package/dist/components/overlays/Modal/Underlay.js +1 -1
- package/dist/components/overlays/Modal/types.d.ts +0 -1
- package/dist/components/overlays/Notifications/Notification.js +1 -1
- package/dist/components/overlays/Notifications/NotificationAction.js +1 -1
- package/dist/components/overlays/Notifications/NotificationCard.js +1 -1
- package/dist/components/overlays/Notifications/NotificationContext.d.ts +0 -2
- package/dist/components/overlays/Notifications/NotificationContext.js +1 -1
- package/dist/components/overlays/Notifications/NotificationItem.js +1 -1
- package/dist/components/overlays/Notifications/OverlayContainer.js +1 -1
- package/dist/components/overlays/Notifications/OverlayProvider.js +1 -1
- package/dist/components/overlays/Notifications/PersistentNotificationsList.js +1 -1
- package/dist/components/overlays/Notifications/dismissed-storage.js +1 -1
- package/dist/components/overlays/Notifications/format-relative-time.js +1 -1
- package/dist/components/overlays/Notifications/index.js +1 -1
- package/dist/components/overlays/Notifications/use-notification-state.js +1 -1
- package/dist/components/overlays/Notifications/use-notifications.js +1 -1
- package/dist/components/overlays/Notifications/use-overlay-timers.js +1 -1
- package/dist/components/overlays/Notifications/use-persistent-notifications.js +1 -1
- package/dist/components/overlays/Notifications/use-persistent-state.js +1 -1
- package/dist/components/overlays/Notifications/use-toast-state.js +1 -1
- package/dist/components/overlays/Toast/ToastItem.js +1 -1
- package/dist/components/overlays/Toast/index.js +1 -1
- package/dist/components/overlays/Toast/useProgressToast.js +1 -1
- package/dist/components/overlays/Toast/useToast.js +1 -1
- package/dist/components/overlays/Tooltip/Tooltip.js +1 -1
- package/dist/components/overlays/Tooltip/TooltipProvider.js +1 -1
- package/dist/components/overlays/Tooltip/TooltipTrigger.js +3 -2
- package/dist/components/overlays/Tooltip/TooltipTrigger.js.map +1 -1
- package/dist/components/overlays/Tooltip/context.js +1 -1
- package/dist/components/portal/Portal.js +1 -1
- package/dist/components/portal/PortalProvider.js +1 -1
- package/dist/components/portal/index.d.ts +0 -1
- package/dist/components/portal/usePortal.js +1 -1
- package/dist/components/shared/DraggableCollection.js +1 -1
- package/dist/components/shared/InvalidIcon.js +1 -1
- package/dist/components/shared/ValidIcon.js +1 -1
- package/dist/components/status/LoadingAnimation/LoadingAnimation.js +1 -1
- package/dist/components/status/Spin/Cube.js +1 -1
- package/dist/components/status/Spin/InternalSpinner.js +1 -1
- package/dist/components/status/Spin/Spin.js +1 -1
- package/dist/components/status/Spin/SpinsContainer.js +1 -1
- package/dist/data/item-themes.js +1 -1
- package/dist/data/themes.js +1 -1
- package/dist/eslint-plugin/defaults.generated.js +1 -1
- package/dist/eslint-plugin/index.js +1 -1
- package/dist/eslint-plugin/rules/no-redundant-default-prop.js +1 -1
- package/dist/i18n/I18nProvider.js +1 -1
- package/dist/i18n/createFormatter.js +1 -1
- package/dist/i18n/index.js +1 -1
- package/dist/i18n/instance.js +1 -1
- package/dist/i18n/locales/de-DE/uikit.js +1 -1
- package/dist/i18n/locales/en-US/uikit.js +1 -1
- package/dist/i18n/locales/es-ES/uikit.js +1 -1
- package/dist/i18n/locales/es-MX/uikit.js +1 -1
- package/dist/i18n/locales/fr-FR/uikit.js +1 -1
- package/dist/i18n/locales/it-IT/uikit.js +1 -1
- package/dist/i18n/locales/ja-JP/uikit.js +1 -1
- package/dist/i18n/locales/nb-NO/uikit.js +1 -1
- package/dist/i18n/locales/pt-BR/uikit.js +1 -1
- package/dist/i18n/locales/pt-PT/uikit.js +1 -1
- package/dist/i18n/locales/sv-SE/uikit.js +1 -1
- package/dist/i18n/locales/vi-VN/uikit.js +1 -1
- package/dist/i18n/locales.js +1 -1
- package/dist/i18n/useFormatter.js +1 -1
- package/dist/i18n/useI18n.js +1 -1
- package/dist/icons/AdjustmentsHorizontalIcon.js +1 -1
- package/dist/icons/AdjustmentsIcon.js +1 -1
- package/dist/icons/AiIcon.js +1 -1
- package/dist/icons/AreaChartIcon.js +1 -1
- package/dist/icons/ArrowNarrowDownIcon.js +1 -1
- package/dist/icons/ArrowNarrowUpIcon.js +1 -1
- package/dist/icons/BackwardIcon.js +1 -1
- package/dist/icons/BarChartIcon.js +1 -1
- package/dist/icons/BellFilledIcon.js +1 -1
- package/dist/icons/BellIcon.js +1 -1
- package/dist/icons/BooleanIcon.js +1 -1
- package/dist/icons/CalendarEditIcon.js +1 -1
- package/dist/icons/CalendarIcon.js +1 -1
- package/dist/icons/CaretDownIcon.js +1 -1
- package/dist/icons/CaretUpIcon.js +1 -1
- package/dist/icons/ChartAreaStackedIcon.js +1 -1
- package/dist/icons/ChartAreaStackedPercentageIcon.js +1 -1
- package/dist/icons/ChartBarGroupedHorizontalIcon.js +1 -1
- package/dist/icons/ChartBarGroupedIcon.js +1 -1
- package/dist/icons/ChartBarHorizontalIcon.js +1 -1
- package/dist/icons/ChartBarLineIcon.js +1 -1
- package/dist/icons/ChartBarStackedHorizontalIcon.js +1 -1
- package/dist/icons/ChartBarStackedIcon.js +1 -1
- package/dist/icons/ChartBarStackedPercentageHorizontalIcon.js +1 -1
- package/dist/icons/ChartBarStackedPercentageIcon.js +1 -1
- package/dist/icons/ChartBoxPlot2Icon.js +1 -1
- package/dist/icons/ChartBoxPlotIcon.js +1 -1
- package/dist/icons/ChartBubbleIcon.js +1 -1
- package/dist/icons/ChartDonut2Icon.js +1 -1
- package/dist/icons/ChartFunnelIcon.js +1 -1
- package/dist/icons/ChartHeatmapIcon.js +1 -1
- package/dist/icons/ChartKPIIcon.js +1 -1
- package/dist/icons/ChartPie2Icon.js +1 -1
- package/dist/icons/ChartScatterIcon.js +1 -1
- package/dist/icons/CheckCircleFilledIcon.js +1 -1
- package/dist/icons/CheckCircleIcon.js +1 -1
- package/dist/icons/CheckIcon.js +1 -1
- package/dist/icons/CircleFilledIcon.js +1 -1
- package/dist/icons/ClearIcon.js +1 -1
- package/dist/icons/CloseCircleFilledIcon.js +1 -1
- package/dist/icons/CloseCircleIcon.js +1 -1
- package/dist/icons/CloseIcon.js +1 -1
- package/dist/icons/CodeIcon.js +1 -1
- package/dist/icons/ColumnTotalIcon.js +1 -1
- package/dist/icons/CopyIcon.js +1 -1
- package/dist/icons/CountIcon.js +1 -1
- package/dist/icons/CubeIcon.js +1 -1
- package/dist/icons/CubePauseIcon.js +1 -1
- package/dist/icons/CubePlayIcon.js +1 -1
- package/dist/icons/CurrencyDollarIcon.js +1 -1
- package/dist/icons/DangerIcon.js +1 -1
- package/dist/icons/DashboardIcon.js +1 -1
- package/dist/icons/DatabaseIcon.js +1 -1
- package/dist/icons/DecimalDecreaseIcon.js +1 -1
- package/dist/icons/DecimalIncreaseIcon.js +1 -1
- package/dist/icons/DirectionIcon.js +1 -1
- package/dist/icons/DonutIcon.js +1 -1
- package/dist/icons/DownIcon.js +1 -1
- package/dist/icons/EditIcon.js +1 -1
- package/dist/icons/ExclamationCircleFilledIcon.js +1 -1
- package/dist/icons/ExclamationCircleIcon.js +1 -1
- package/dist/icons/ExclamationIcon.js +1 -1
- package/dist/icons/EyeIcon.js +1 -1
- package/dist/icons/EyeInvisibleIcon.js +1 -1
- package/dist/icons/FilterIcon.js +1 -1
- package/dist/icons/FolderFilledIcon.js +1 -1
- package/dist/icons/FolderIcon.js +1 -1
- package/dist/icons/FolderOpenFilledIcon.js +1 -1
- package/dist/icons/FolderOpenIcon.js +1 -1
- package/dist/icons/ForwardIcon.js +1 -1
- package/dist/icons/GripVerticalIcon.js +1 -1
- package/dist/icons/HierarchyIcon.js +1 -1
- package/dist/icons/HierarchyOpenIcon.js +1 -1
- package/dist/icons/Icon.js +1 -1
- package/dist/icons/InfoCircleIcon.js +1 -1
- package/dist/icons/InfoIcon.js +1 -1
- package/dist/icons/KeyIcon.js +1 -1
- package/dist/icons/LeftIcon.js +1 -1
- package/dist/icons/LineChartIcon.js +1 -1
- package/dist/icons/LoadingIcon.js +1 -1
- package/dist/icons/LockFilledIcon.js +1 -1
- package/dist/icons/LockIcon.js +1 -1
- package/dist/icons/MoreIcon.js +1 -1
- package/dist/icons/NotAllowedIcon.js +1 -1
- package/dist/icons/Number123Icon.js +1 -1
- package/dist/icons/NumberIcon.js +1 -1
- package/dist/icons/PauseCircleFilledIcon.js +1 -1
- package/dist/icons/PauseCircleIcon.js +1 -1
- package/dist/icons/PauseIcon.js +1 -1
- package/dist/icons/PercentageIcon.js +1 -1
- package/dist/icons/PieChartIcon.js +1 -1
- package/dist/icons/PipetteIcon.js +1 -1
- package/dist/icons/PlayCircleIcon.js +1 -1
- package/dist/icons/PlayIcon.js +1 -1
- package/dist/icons/PlusIcon.js +1 -1
- package/dist/icons/ProgressBarIcon.js +1 -1
- package/dist/icons/ReloadIcon.js +1 -1
- package/dist/icons/ReportIcon.js +1 -1
- package/dist/icons/ReturnIcon.js +1 -1
- package/dist/icons/RightIcon.js +1 -1
- package/dist/icons/RowTotalsIcon.js +1 -1
- package/dist/icons/SchemeIcon.js +1 -1
- package/dist/icons/SearchIcon.js +1 -1
- package/dist/icons/SemanticQueryIcon.js +1 -1
- package/dist/icons/SettingsIcon.js +1 -1
- package/dist/icons/ShieldFilledIcon.js +1 -1
- package/dist/icons/ShieldIcon.js +1 -1
- package/dist/icons/SlashIcon.js +1 -1
- package/dist/icons/SparklesIcon.js +1 -1
- package/dist/icons/SqlIcon.js +1 -1
- package/dist/icons/StatsIcon.js +1 -1
- package/dist/icons/StopIcon.js +1 -1
- package/dist/icons/StringIcon.js +1 -1
- package/dist/icons/SubtotalsIcon.js +1 -1
- package/dist/icons/SwitchIcon.js +1 -1
- package/dist/icons/TableIcon.js +1 -1
- package/dist/icons/ThumbsDownIcon.js +1 -1
- package/dist/icons/ThumbsUpIcon.js +1 -1
- package/dist/icons/ThunderboltCrossedIcon.js +1 -1
- package/dist/icons/ThunderboltFilledIcon.js +1 -1
- package/dist/icons/ThunderboltIcon.js +1 -1
- package/dist/icons/TimeIcon.js +1 -1
- package/dist/icons/TrashIcon.js +1 -1
- package/dist/icons/UnlockIcon.js +1 -1
- package/dist/icons/UpIcon.js +1 -1
- package/dist/icons/UserGroupIcon.js +1 -1
- package/dist/icons/UserIcon.js +1 -1
- package/dist/icons/UserLockIcon.js +1 -1
- package/dist/icons/ViewIcon.js +1 -1
- package/dist/icons/WarningFilledIcon.js +1 -1
- package/dist/icons/WarningIcon.js +1 -1
- package/dist/icons/wrap-icon.js +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/probe/canonicalize.js +1 -1
- package/dist/probe/css.js +1 -1
- package/dist/probe/index.js +1 -1
- package/dist/provider.js +1 -1
- package/dist/providers/TrackingProvider.js +1 -1
- package/dist/providers/navigationAdapter.default.js +1 -1
- package/dist/tokens/all-tokens.js +1 -1
- package/dist/tokens/base.js +1 -1
- package/dist/tokens/color-seed.js +1 -1
- package/dist/tokens/color-theme.js +1 -1
- package/dist/tokens/colors.js +1 -1
- package/dist/tokens/index.d.ts +1 -0
- package/dist/tokens/layout.js +1 -1
- package/dist/tokens/lazy-styles.js +1 -1
- package/dist/tokens/legacy-color.d.ts +61 -0
- package/dist/tokens/legacy-color.js +58 -0
- package/dist/tokens/legacy-color.js.map +1 -0
- package/dist/tokens/palette-config.js +1 -1
- package/dist/tokens/palette.js +1 -1
- package/dist/tokens/resolve.js +1 -1
- package/dist/tokens/shadows.js +1 -1
- package/dist/tokens/sizes.js +1 -1
- package/dist/tokens/spacing.js +1 -1
- package/dist/tokens/typography.js +1 -1
- package/dist/utils/ResizeSensor.js +1 -1
- package/dist/utils/colors.d.ts +2 -0
- package/dist/utils/colors.js +257 -0
- package/dist/utils/colors.js.map +1 -0
- package/dist/utils/is-dev-env.js +66 -8
- package/dist/utils/is-dev-env.js.map +1 -1
- package/dist/utils/modules.js +1 -1
- package/dist/utils/promise.js +1 -1
- package/dist/utils/raf.js +1 -1
- package/dist/utils/random.js +1 -1
- package/dist/utils/range.js +1 -1
- package/dist/utils/react/RenderCache.js +1 -1
- package/dist/utils/react/Slots.js +1 -1
- package/dist/utils/react/chain.js +1 -1
- package/dist/utils/react/disabledProps.js +1 -1
- package/dist/utils/react/forwardRefWithGenerics.js +1 -1
- package/dist/utils/react/index.js +1 -1
- package/dist/utils/react/interactions.js +1 -1
- package/dist/utils/react/isTextOnly.js +1 -1
- package/dist/utils/react/mapProps.js +1 -1
- package/dist/utils/react/mergeProps.js +1 -1
- package/dist/utils/react/nullableValue.js +1 -1
- package/dist/utils/react/resolveIcon.js +1 -1
- package/dist/utils/react/sharedStore.js +3 -2
- package/dist/utils/react/sharedStore.js.map +1 -1
- package/dist/utils/react/useBufferedValue.js +1 -1
- package/dist/utils/react/useCombinedRefs.js +1 -1
- package/dist/utils/react/useControlledFocusVisible.js +1 -1
- package/dist/utils/react/useEventBus.js +1 -1
- package/dist/utils/react/useId.js +1 -1
- package/dist/utils/react/useIsDarwin.js +1 -1
- package/dist/utils/react/useKeySymbols.js +1 -1
- package/dist/utils/react/useLayoutEffect.js +1 -1
- package/dist/utils/react/useLocalStorage.js +1 -1
- package/dist/utils/react/useMergeStyles.js +1 -1
- package/dist/utils/react/usePopoverSync.js +1 -1
- package/dist/utils/react/useQaProps.js +1 -1
- package/dist/utils/react/useScheme.js +1 -1
- package/dist/utils/react/useViewportSize.js +1 -1
- package/dist/utils/react/wrapNodeIfPlain.js +1 -1
- package/dist/utils/selection.js +1 -1
- package/dist/utils/styles.js +1 -1
- package/dist/utils/tree.js +1 -1
- package/dist/utils/warnings.js +5 -2
- package/dist/utils/warnings.js.map +1 -1
- package/dist/version.js +2 -2
- package/docs/Usage.md +18 -0
- package/package.json +1 -1
- package/dist/components/fields/ListBoxPopover/useCompositeFocus.d.ts +0 -2
- package/dist/components/portal/PortalProvider.d.ts +0 -2
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.177.0 | Cube Dev Team */
|
|
2
|
+
import { hslToSrgb, okhslToOklch, okhslToSrgb, okhstToOkhsl, oklabToOkhsl, parseHexAlpha } from "@tenphi/glaze";
|
|
3
|
+
|
|
4
|
+
//#region src/utils/colors.ts
|
|
5
|
+
/**
|
|
6
|
+
* Reading a CSS color *literal* into channels — the layer under both the color
|
|
7
|
+
* fields (which parse what a user types) and {@link toLegacyColor} (which parses
|
|
8
|
+
* what `resolveTokenValue()` hands back).
|
|
9
|
+
*
|
|
10
|
+
* It lives here rather than in either consumer because the two need the same
|
|
11
|
+
* grammar and disagreeing about it is invisible: a component this parser fails
|
|
12
|
+
* to recognise does not throw, it makes the whole color unparseable, and the
|
|
13
|
+
* caller falls back to something that merely looks plausible. The cases that
|
|
14
|
+
* actually show up — a negative hue, a `none` component, scientific notation
|
|
15
|
+
* out of a serializer, `oklch(from …)` relative syntax — are exactly the ones a
|
|
16
|
+
* hand-rolled regex misses.
|
|
17
|
+
*
|
|
18
|
+
* Named CSS colors (`red`, `rebeccapurple`) are deliberately not supported,
|
|
19
|
+
* matching `glaze.color()`. `transparent` is the one exception, because the kit
|
|
20
|
+
* declares it: `#clear` is `transparent`.
|
|
21
|
+
*/
|
|
22
|
+
const FUNCTION_RE = /^([a-z]+)\(([^()]+)\)$/;
|
|
23
|
+
/**
|
|
24
|
+
* A number with an optional unit, both captured in one pass.
|
|
25
|
+
*
|
|
26
|
+
* This runs on whatever the user types, so it is written to stay linear in two
|
|
27
|
+
* separate ways. The integer and fraction parts are arranged so that no two
|
|
28
|
+
* quantifiers can consume the same digit — `\d+(?:\.\d*)?` rather than
|
|
29
|
+
* `\d+\.?\d*`, whose `\d+` and `\d*` can split a digit run n ways and make
|
|
30
|
+
* rejecting a long one quadratic. And the unit is a capture group here rather
|
|
31
|
+
* than a second, unanchored scan: reading it back with `/[a-z%]+$/` is itself
|
|
32
|
+
* polynomial (CodeQL `js/polynomial-redos`), because every start position
|
|
33
|
+
* re-walks the run of unit characters before failing at `$` — quadratic on a
|
|
34
|
+
* string of many `%`.
|
|
35
|
+
*/
|
|
36
|
+
const NUMBER_RE = /^([+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?)(%|deg|rad|grad|turn)?$/;
|
|
37
|
+
/** Degrees per unit, for the angle units `<hue>` accepts. */
|
|
38
|
+
const ANGLE_UNITS = {
|
|
39
|
+
deg: 1,
|
|
40
|
+
rad: 180 / Math.PI,
|
|
41
|
+
grad: .9,
|
|
42
|
+
turn: 360
|
|
43
|
+
};
|
|
44
|
+
/**
|
|
45
|
+
* `none` is a real component value, not a parse failure. Outside interpolation
|
|
46
|
+
* and relative-color syntax CSS Color 4 resolves it to zero, which is what every
|
|
47
|
+
* caller here wants — `oklch(0.5 none 200)` is a grey, and `… / none` is
|
|
48
|
+
* invisible rather than unparseable.
|
|
49
|
+
*/
|
|
50
|
+
const NONE = "none";
|
|
51
|
+
/** A component we can read: a number with an optional unit, or `none`. */
|
|
52
|
+
function isComponent(arg) {
|
|
53
|
+
return arg === NONE || NUMBER_RE.test(arg);
|
|
54
|
+
}
|
|
55
|
+
/** Read a numeric component and its unit together, or `null` if it is neither. */
|
|
56
|
+
function readNumber(arg) {
|
|
57
|
+
const match = NUMBER_RE.exec(arg);
|
|
58
|
+
return match ? {
|
|
59
|
+
value: parseFloat(match[1]),
|
|
60
|
+
unit: match[2] ?? ""
|
|
61
|
+
} : null;
|
|
62
|
+
}
|
|
63
|
+
function normalizeHue(hue) {
|
|
64
|
+
if (!Number.isFinite(hue)) return 0;
|
|
65
|
+
return (hue % 360 + 360) % 360;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Split a color-function literal into its name, components and alpha. Both the
|
|
69
|
+
* modern space-separated (`rgb(0 0 0 / 50%)`) and legacy comma-separated
|
|
70
|
+
* (`rgba(0, 0, 0, 0.5)`) syntaxes are accepted.
|
|
71
|
+
*
|
|
72
|
+
* Returns `null` for anything that is not a plain color-function call, which
|
|
73
|
+
* includes the two forms whose value cannot be worked out without a CSS engine:
|
|
74
|
+
* relative syntax (`oklch(from var(--x) l c h)`) and `color-mix()`. Rejecting
|
|
75
|
+
* them is the point — passing them through unchanged is what makes a consumer
|
|
76
|
+
* silently drop the color.
|
|
77
|
+
*/
|
|
78
|
+
function parseColorFunction(input) {
|
|
79
|
+
const match = FUNCTION_RE.exec(input.trim().toLowerCase());
|
|
80
|
+
if (!match) return null;
|
|
81
|
+
const [, name, body] = match;
|
|
82
|
+
const [components, ...rest] = body.split("/");
|
|
83
|
+
if (rest.length > 1) return null;
|
|
84
|
+
let alpha = rest.length ? rest[0].trim() : null;
|
|
85
|
+
const args = components.trim().split(components.includes(",") ? "," : /\s+/).map((part) => part.trim()).filter(Boolean);
|
|
86
|
+
if (args.length === 4) {
|
|
87
|
+
if (alpha !== null) return null;
|
|
88
|
+
alpha = args.pop();
|
|
89
|
+
}
|
|
90
|
+
if (alpha !== null && !isComponent(alpha)) return null;
|
|
91
|
+
return args.every(isComponent) ? {
|
|
92
|
+
name,
|
|
93
|
+
args,
|
|
94
|
+
alpha
|
|
95
|
+
} : null;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Read a non-hue component. `scale` is what `100%` means in this position;
|
|
99
|
+
* `none` is zero, and an angle is not a value this position accepts.
|
|
100
|
+
*/
|
|
101
|
+
function readComponent(arg, scale) {
|
|
102
|
+
if (arg === NONE) return 0;
|
|
103
|
+
const parsed = readNumber(arg);
|
|
104
|
+
if (!parsed) return NaN;
|
|
105
|
+
if (parsed.unit === "%") return parsed.value / 100 * scale;
|
|
106
|
+
return parsed.unit ? NaN : parsed.value;
|
|
107
|
+
}
|
|
108
|
+
/** Read a `<hue>`: any angle unit, or a bare number of degrees. Normalized. */
|
|
109
|
+
function readHue(arg) {
|
|
110
|
+
if (arg === NONE) return 0;
|
|
111
|
+
const parsed = readNumber(arg);
|
|
112
|
+
if (!parsed) return NaN;
|
|
113
|
+
if (parsed.unit === "%") return NaN;
|
|
114
|
+
const perDegree = parsed.unit ? ANGLE_UNITS[parsed.unit] : 1;
|
|
115
|
+
return perDegree === void 0 ? NaN : normalizeHue(parsed.value * perDegree);
|
|
116
|
+
}
|
|
117
|
+
/** Read an `<alpha-value>`. A missing alpha is opaque; out of range is clamped. */
|
|
118
|
+
function readAlpha(arg) {
|
|
119
|
+
if (arg === null) return 1;
|
|
120
|
+
const alpha = readComponent(arg, 1);
|
|
121
|
+
return Number.isFinite(alpha) ? clamp(alpha, 0, 1) : NaN;
|
|
122
|
+
}
|
|
123
|
+
function clamp(value, min, max) {
|
|
124
|
+
return value < min ? min : value > max ? max : value;
|
|
125
|
+
}
|
|
126
|
+
function anyNaN(...values) {
|
|
127
|
+
return values.some((value) => !Number.isFinite(value));
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* The largest OKLCh chroma that stays inside the sRGB gamut for the given hue
|
|
131
|
+
* and OKHSL lightness — that is exactly what OKHSL saturation `1` means.
|
|
132
|
+
*/
|
|
133
|
+
function maxChroma(hue, lightness) {
|
|
134
|
+
return okhslToOklch(normalizeHue(hue), 1, clamp(lightness, 0, 1))[1];
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* OKLCh addresses colors outside the sRGB gamut, so chroma is clipped to the
|
|
138
|
+
* gamut boundary at the requested lightness. Hue is taken from the input rather
|
|
139
|
+
* than from the conversion, which loses it at zero chroma.
|
|
140
|
+
*/
|
|
141
|
+
function oklchToOkhsl(color) {
|
|
142
|
+
const h = normalizeHue(color.h);
|
|
143
|
+
const c = Math.max(color.c, 0);
|
|
144
|
+
const radians = h * Math.PI / 180;
|
|
145
|
+
const [, s, l] = oklabToOkhsl([
|
|
146
|
+
clamp(color.l, 0, 1),
|
|
147
|
+
c * Math.cos(radians),
|
|
148
|
+
c * Math.sin(radians)
|
|
149
|
+
]);
|
|
150
|
+
const limit = maxChroma(h, l);
|
|
151
|
+
return {
|
|
152
|
+
h,
|
|
153
|
+
s: limit > 0 ? c >= limit ? 1 : clamp(s, 0, 1) : 0,
|
|
154
|
+
l: clamp(l, 0, 1)
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
function rgbFromSrgb([r, g, b]) {
|
|
158
|
+
return {
|
|
159
|
+
r: r * 255,
|
|
160
|
+
g: g * 255,
|
|
161
|
+
b: b * 255
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Read any color literal the kit can emit or accept into gamma-encoded sRGB
|
|
166
|
+
* channels plus alpha — the space every legacy consumer speaks.
|
|
167
|
+
*
|
|
168
|
+
* Returns `null` when the input is not a color, or is one whose value depends on
|
|
169
|
+
* a CSS engine we do not have (see {@link parseColorFunction}).
|
|
170
|
+
*/
|
|
171
|
+
function parseSrgbColor(input) {
|
|
172
|
+
const text = input.trim().toLowerCase();
|
|
173
|
+
if (!text) return null;
|
|
174
|
+
if (text === "transparent") return {
|
|
175
|
+
rgb: [
|
|
176
|
+
0,
|
|
177
|
+
0,
|
|
178
|
+
0
|
|
179
|
+
],
|
|
180
|
+
alpha: 0
|
|
181
|
+
};
|
|
182
|
+
if (text.startsWith("#")) {
|
|
183
|
+
const parsed = parseHexAlpha(text);
|
|
184
|
+
return parsed ? {
|
|
185
|
+
rgb: parsed.rgb,
|
|
186
|
+
alpha: parsed.alpha ?? 1
|
|
187
|
+
} : null;
|
|
188
|
+
}
|
|
189
|
+
const parsed = parseColorFunction(text);
|
|
190
|
+
if (!parsed || parsed.args.length !== 3) return null;
|
|
191
|
+
const { name, args } = parsed;
|
|
192
|
+
const alpha = readAlpha(parsed.alpha);
|
|
193
|
+
if (!Number.isFinite(alpha)) return null;
|
|
194
|
+
const rgb = toSrgbChannels(name, args);
|
|
195
|
+
return rgb ? {
|
|
196
|
+
rgb,
|
|
197
|
+
alpha
|
|
198
|
+
} : null;
|
|
199
|
+
}
|
|
200
|
+
function toSrgbChannels(name, args) {
|
|
201
|
+
switch (name) {
|
|
202
|
+
case "rgb":
|
|
203
|
+
case "rgba": {
|
|
204
|
+
const [r, g, b] = args.map((arg) => readComponent(arg, 255));
|
|
205
|
+
if (anyNaN(r, g, b)) return null;
|
|
206
|
+
return [
|
|
207
|
+
clamp(r / 255, 0, 1),
|
|
208
|
+
clamp(g / 255, 0, 1),
|
|
209
|
+
clamp(b / 255, 0, 1)
|
|
210
|
+
];
|
|
211
|
+
}
|
|
212
|
+
case "hsl":
|
|
213
|
+
case "hsla": {
|
|
214
|
+
const h = readHue(args[0]);
|
|
215
|
+
const s = readComponent(args[1], 100) / 100;
|
|
216
|
+
const l = readComponent(args[2], 100) / 100;
|
|
217
|
+
if (anyNaN(h, s, l)) return null;
|
|
218
|
+
return hslToSrgb(h, clamp(s, 0, 1), clamp(l, 0, 1));
|
|
219
|
+
}
|
|
220
|
+
case "okhsl": {
|
|
221
|
+
const h = readHue(args[0]);
|
|
222
|
+
const s = readComponent(args[1], 100) / 100;
|
|
223
|
+
const l = readComponent(args[2], 100) / 100;
|
|
224
|
+
if (anyNaN(h, s, l)) return null;
|
|
225
|
+
return okhslToSrgb(h, clamp(s, 0, 1), clamp(l, 0, 1));
|
|
226
|
+
}
|
|
227
|
+
case "okhst": {
|
|
228
|
+
const h = readHue(args[0]);
|
|
229
|
+
const s = readComponent(args[1], 100) / 100;
|
|
230
|
+
const t = readComponent(args[2], 100) / 100;
|
|
231
|
+
if (anyNaN(h, s, t)) return null;
|
|
232
|
+
const okhsl = okhstToOkhsl({
|
|
233
|
+
h,
|
|
234
|
+
s: clamp(s, 0, 1),
|
|
235
|
+
t: clamp(t, 0, 1)
|
|
236
|
+
});
|
|
237
|
+
return okhslToSrgb(normalizeHue(okhsl.h), clamp(okhsl.s, 0, 1), clamp(okhsl.l, 0, 1));
|
|
238
|
+
}
|
|
239
|
+
case "oklch": {
|
|
240
|
+
const l = readComponent(args[0], 1);
|
|
241
|
+
const c = readComponent(args[1], .4);
|
|
242
|
+
const h = readHue(args[2]);
|
|
243
|
+
if (anyNaN(l, c, h)) return null;
|
|
244
|
+
const okhsl = oklchToOkhsl({
|
|
245
|
+
l,
|
|
246
|
+
c,
|
|
247
|
+
h
|
|
248
|
+
});
|
|
249
|
+
return okhslToSrgb(okhsl.h, okhsl.s, okhsl.l);
|
|
250
|
+
}
|
|
251
|
+
default: return null;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
//#endregion
|
|
256
|
+
export { anyNaN, clamp, maxChroma, normalizeHue, oklchToOkhsl, parseColorFunction, parseSrgbColor, readComponent, readHue, rgbFromSrgb };
|
|
257
|
+
//# sourceMappingURL=colors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"colors.js","names":[],"sources":["../../src/utils/colors.ts"],"sourcesContent":["import {\n hslToSrgb,\n okhslToOklch,\n okhslToSrgb,\n okhstToOkhsl,\n oklabToOkhsl,\n parseHexAlpha,\n} from '@tenphi/glaze';\n\nimport type { OkhslColor, OklchColor, RgbColor } from '@tenphi/glaze';\n\n/**\n * Reading a CSS color *literal* into channels — the layer under both the color\n * fields (which parse what a user types) and {@link toLegacyColor} (which parses\n * what `resolveTokenValue()` hands back).\n *\n * It lives here rather than in either consumer because the two need the same\n * grammar and disagreeing about it is invisible: a component this parser fails\n * to recognise does not throw, it makes the whole color unparseable, and the\n * caller falls back to something that merely looks plausible. The cases that\n * actually show up — a negative hue, a `none` component, scientific notation\n * out of a serializer, `oklch(from …)` relative syntax — are exactly the ones a\n * hand-rolled regex misses.\n *\n * Named CSS colors (`red`, `rebeccapurple`) are deliberately not supported,\n * matching `glaze.color()`. `transparent` is the one exception, because the kit\n * declares it: `#clear` is `transparent`.\n */\n\nconst FUNCTION_RE = /^([a-z]+)\\(([^()]+)\\)$/;\n\n/**\n * A number with an optional unit, both captured in one pass.\n *\n * This runs on whatever the user types, so it is written to stay linear in two\n * separate ways. The integer and fraction parts are arranged so that no two\n * quantifiers can consume the same digit — `\\d+(?:\\.\\d*)?` rather than\n * `\\d+\\.?\\d*`, whose `\\d+` and `\\d*` can split a digit run n ways and make\n * rejecting a long one quadratic. And the unit is a capture group here rather\n * than a second, unanchored scan: reading it back with `/[a-z%]+$/` is itself\n * polynomial (CodeQL `js/polynomial-redos`), because every start position\n * re-walks the run of unit characters before failing at `$` — quadratic on a\n * string of many `%`.\n */\nconst NUMBER_RE =\n /^([+-]?(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:e[+-]?\\d+)?)(%|deg|rad|grad|turn)?$/;\n\n/** Degrees per unit, for the angle units `<hue>` accepts. */\nconst ANGLE_UNITS: Record<string, number> = {\n deg: 1,\n rad: 180 / Math.PI,\n grad: 0.9,\n turn: 360,\n};\n\n/**\n * `none` is a real component value, not a parse failure. Outside interpolation\n * and relative-color syntax CSS Color 4 resolves it to zero, which is what every\n * caller here wants — `oklch(0.5 none 200)` is a grey, and `… / none` is\n * invisible rather than unparseable.\n */\nconst NONE = 'none';\n\n/** A component we can read: a number with an optional unit, or `none`. */\nfunction isComponent(arg: string): boolean {\n return arg === NONE || NUMBER_RE.test(arg);\n}\n\n/** A component's magnitude and its unit, `''` when it is a bare number. */\ninterface NumericComponent {\n value: number;\n unit: string;\n}\n\n/** Read a numeric component and its unit together, or `null` if it is neither. */\nfunction readNumber(arg: string): NumericComponent | null {\n const match = NUMBER_RE.exec(arg);\n\n return match ? { value: parseFloat(match[1]), unit: match[2] ?? '' } : null;\n}\n\nexport function normalizeHue(hue: number): number {\n if (!Number.isFinite(hue)) return 0;\n\n return ((hue % 360) + 360) % 360;\n}\n\n/**\n * A color-function call split into its parts, with alpha separated out. Each\n * component keeps its unit, so the caller can tell `50%` from `50` — what a\n * percentage means is per space and per position (`oklch()`'s `100%` is `1` for\n * lightness and `0.4` for chroma), so only the caller can scale it.\n */\nexport interface ColorFunction {\n /** Lowercased function name — `'oklch'`, `'rgba'`, `'okhst'`. */\n name: string;\n /** The color components, alpha excluded. */\n args: string[];\n /** The alpha component as written, or `null` when the call omits it. */\n alpha: string | null;\n}\n\n/**\n * Split a color-function literal into its name, components and alpha. Both the\n * modern space-separated (`rgb(0 0 0 / 50%)`) and legacy comma-separated\n * (`rgba(0, 0, 0, 0.5)`) syntaxes are accepted.\n *\n * Returns `null` for anything that is not a plain color-function call, which\n * includes the two forms whose value cannot be worked out without a CSS engine:\n * relative syntax (`oklch(from var(--x) l c h)`) and `color-mix()`. Rejecting\n * them is the point — passing them through unchanged is what makes a consumer\n * silently drop the color.\n */\nexport function parseColorFunction(input: string): ColorFunction | null {\n const match = FUNCTION_RE.exec(input.trim().toLowerCase());\n\n if (!match) return null;\n\n const [, name, body] = match;\n const [components, ...rest] = body.split('/');\n\n // More than one slash is never valid syntax.\n if (rest.length > 1) return null;\n\n let alpha: string | null = rest.length ? rest[0].trim() : null;\n\n const args = components\n .trim()\n .split(components.includes(',') ? ',' : /\\s+/)\n .map((part) => part.trim())\n .filter(Boolean);\n\n // A fourth component is alpha — that is the legacy `rgba(r, g, b, a)` /\n // `hsla(h, s, l, a)` form, and the same reading is the useful one for a\n // space-separated four-tuple someone typed without the slash.\n if (args.length === 4) {\n // `rgba(0, 0, 0, 1 / 0.5)` names alpha twice.\n if (alpha !== null) return null;\n\n alpha = args.pop()!;\n }\n\n if (alpha !== null && !isComponent(alpha)) return null;\n\n return args.every(isComponent) ? { name, args, alpha } : null;\n}\n\n/**\n * Read a non-hue component. `scale` is what `100%` means in this position;\n * `none` is zero, and an angle is not a value this position accepts.\n */\nexport function readComponent(arg: string, scale: number): number {\n if (arg === NONE) return 0;\n\n const parsed = readNumber(arg);\n\n if (!parsed) return NaN;\n\n if (parsed.unit === '%') return (parsed.value / 100) * scale;\n\n return parsed.unit ? NaN : parsed.value;\n}\n\n/** Read a `<hue>`: any angle unit, or a bare number of degrees. Normalized. */\nexport function readHue(arg: string): number {\n if (arg === NONE) return 0;\n\n const parsed = readNumber(arg);\n\n if (!parsed) return NaN;\n\n // A percentage is not a valid hue angle.\n if (parsed.unit === '%') return NaN;\n\n // Every unit {@link NUMBER_RE} captures other than `%` is an angle, so the\n // guard is unreachable today. It stays because a unit added there later — a\n // length, say — would otherwise arrive here and be read as degrees.\n const perDegree = parsed.unit ? ANGLE_UNITS[parsed.unit] : 1;\n\n return perDegree === undefined ? NaN : normalizeHue(parsed.value * perDegree);\n}\n\n/** Read an `<alpha-value>`. A missing alpha is opaque; out of range is clamped. */\nexport function readAlpha(arg: string | null): number {\n if (arg === null) return 1;\n\n const alpha = readComponent(arg, 1);\n\n return Number.isFinite(alpha) ? clamp(alpha, 0, 1) : NaN;\n}\n\nexport function clamp(value: number, min: number, max: number): number {\n return value < min ? min : value > max ? max : value;\n}\n\nexport function anyNaN(...values: number[]): boolean {\n return values.some((value) => !Number.isFinite(value));\n}\n\n/**\n * The largest OKLCh chroma that stays inside the sRGB gamut for the given hue\n * and OKHSL lightness — that is exactly what OKHSL saturation `1` means.\n */\nexport function maxChroma(hue: number, lightness: number): number {\n return okhslToOklch(normalizeHue(hue), 1, clamp(lightness, 0, 1))[1];\n}\n\n/**\n * OKLCh addresses colors outside the sRGB gamut, so chroma is clipped to the\n * gamut boundary at the requested lightness. Hue is taken from the input rather\n * than from the conversion, which loses it at zero chroma.\n */\nexport function oklchToOkhsl(color: OklchColor): OkhslColor {\n const h = normalizeHue(color.h);\n const c = Math.max(color.c, 0);\n const radians = (h * Math.PI) / 180;\n const [, s, l] = oklabToOkhsl([\n clamp(color.l, 0, 1),\n c * Math.cos(radians),\n c * Math.sin(radians),\n ]);\n const limit = maxChroma(h, l);\n\n return {\n h,\n s: limit > 0 ? (c >= limit ? 1 : clamp(s, 0, 1)) : 0,\n l: clamp(l, 0, 1),\n };\n}\n\nexport function rgbFromSrgb([r, g, b]: [number, number, number]): RgbColor {\n return { r: r * 255, g: g * 255, b: b * 255 };\n}\n\n/** Gamma-encoded sRGB channels in 0–1, plus alpha in 0–1. */\nexport interface SrgbColor {\n rgb: [number, number, number];\n alpha: number;\n}\n\n/**\n * Read any color literal the kit can emit or accept into gamma-encoded sRGB\n * channels plus alpha — the space every legacy consumer speaks.\n *\n * Returns `null` when the input is not a color, or is one whose value depends on\n * a CSS engine we do not have (see {@link parseColorFunction}).\n */\nexport function parseSrgbColor(input: string): SrgbColor | null {\n const text = input.trim().toLowerCase();\n\n if (!text) return null;\n\n // The one named color the kit declares: `#clear` is `transparent`. Browsers\n // compute it to `rgba(0, 0, 0, 0)`, but a token block read outside a browser\n // hands back the keyword as authored.\n if (text === 'transparent') return { rgb: [0, 0, 0], alpha: 0 };\n\n if (text.startsWith('#')) {\n const parsed = parseHexAlpha(text);\n\n return parsed ? { rgb: parsed.rgb, alpha: parsed.alpha ?? 1 } : null;\n }\n\n const parsed = parseColorFunction(text);\n\n if (!parsed || parsed.args.length !== 3) return null;\n\n const { name, args } = parsed;\n const alpha = readAlpha(parsed.alpha);\n\n if (!Number.isFinite(alpha)) return null;\n\n const rgb = toSrgbChannels(name, args);\n\n return rgb ? { rgb, alpha } : null;\n}\n\nfunction toSrgbChannels(\n name: string,\n args: string[],\n): [number, number, number] | null {\n switch (name) {\n case 'rgb':\n case 'rgba': {\n const [r, g, b] = args.map((arg) => readComponent(arg, 255));\n\n if (anyNaN(r, g, b)) return null;\n\n return [clamp(r / 255, 0, 1), clamp(g / 255, 0, 1), clamp(b / 255, 0, 1)];\n }\n case 'hsl':\n case 'hsla': {\n const h = readHue(args[0]);\n const s = readComponent(args[1], 100) / 100;\n const l = readComponent(args[2], 100) / 100;\n\n if (anyNaN(h, s, l)) return null;\n\n return hslToSrgb(h, clamp(s, 0, 1), clamp(l, 0, 1));\n }\n case 'okhsl': {\n const h = readHue(args[0]);\n const s = readComponent(args[1], 100) / 100;\n const l = readComponent(args[2], 100) / 100;\n\n if (anyNaN(h, s, l)) return null;\n\n return okhslToSrgb(h, clamp(s, 0, 1), clamp(l, 0, 1));\n }\n case 'okhst': {\n const h = readHue(args[0]);\n const s = readComponent(args[1], 100) / 100;\n const t = readComponent(args[2], 100) / 100;\n\n if (anyNaN(h, s, t)) return null;\n\n const okhsl = okhstToOkhsl({\n h,\n s: clamp(s, 0, 1),\n t: clamp(t, 0, 1),\n });\n\n return okhslToSrgb(\n normalizeHue(okhsl.h),\n clamp(okhsl.s, 0, 1),\n clamp(okhsl.l, 0, 1),\n );\n }\n case 'oklch': {\n // In `oklch()` a percentage means 1 for lightness and 0.4 for chroma.\n const l = readComponent(args[0], 1);\n const c = readComponent(args[1], 0.4);\n const h = readHue(args[2]);\n\n if (anyNaN(l, c, h)) return null;\n\n const okhsl = oklchToOkhsl({ l, c, h });\n\n return okhslToSrgb(okhsl.h, okhsl.s, okhsl.l);\n }\n default:\n return null;\n }\n}\n"],"mappings":"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"}
|
package/dist/utils/is-dev-env.js
CHANGED
|
@@ -1,15 +1,73 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.177.0 | Cube Dev Team */
|
|
2
2
|
//#region src/utils/is-dev-env.ts
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
/**
|
|
4
|
+
* `NODE_ENV` as the environment that is actually running reports it, or
|
|
5
|
+
* `undefined` when nothing can say.
|
|
6
|
+
*
|
|
7
|
+
* The one place in ui-kit allowed to read `NODE_ENV`, because it is the one
|
|
8
|
+
* place that has to survive the build unfolded. A comparison compiled into
|
|
9
|
+
* `dist` freezes whatever `NODE_ENV` the release machine exported and hands
|
|
10
|
+
* every consumer the same answer, so `tsdown.config.ts` defines the expression
|
|
11
|
+
* as itself to stop rolldown inlining it - see the comment there.
|
|
12
|
+
*/
|
|
13
|
+
function readNodeEnv() {
|
|
14
|
+
try {
|
|
15
|
+
return process.env.NODE_ENV;
|
|
16
|
+
} catch {
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* `localStorage.UIKIT_DEBUG` as a tri-state: an explicit `"true"` forces ui-kit's
|
|
22
|
+
* diagnostics on and an explicit `"false"` forces them off, in any environment.
|
|
23
|
+
*
|
|
24
|
+
* The escape hatch in both directions. Consumers whose production build somehow
|
|
25
|
+
* resolves to development can silence us without waiting for a release, and
|
|
26
|
+
* anyone debugging a built app can switch us back on.
|
|
27
|
+
*/
|
|
28
|
+
function readDebugFlag() {
|
|
29
|
+
if (typeof window === "undefined" || !window.localStorage) return void 0;
|
|
30
|
+
try {
|
|
31
|
+
const flag = window.localStorage.getItem("UIKIT_DEBUG")?.toLowerCase();
|
|
32
|
+
if (flag === "true") return true;
|
|
33
|
+
if (flag === "false") return false;
|
|
7
34
|
} catch {}
|
|
8
|
-
|
|
9
|
-
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Whether to run diagnostics that only a human looking at the page can act on -
|
|
38
|
+
* a warning drawn into the layout, a complaint about a measurement.
|
|
39
|
+
*
|
|
40
|
+
* Off under `test`: jsdom reports `offsetHeight: 0` for everything, so anything
|
|
41
|
+
* keyed off a measurement is not just noisy in a consumer's test run but wrong.
|
|
42
|
+
* Off under `production`, and off when nobody could say what `NODE_ENV` is -
|
|
43
|
+
* a diagnostic shown to end users is worse than a missing one shown to a
|
|
44
|
+
* developer, who still has `UIKIT_DEBUG`.
|
|
45
|
+
*
|
|
46
|
+
* Use {@link isDevEnvOrTest} instead for diagnostics a test run should surface.
|
|
47
|
+
*/
|
|
48
|
+
function isDevEnv() {
|
|
49
|
+
const flag = readDebugFlag();
|
|
50
|
+
if (flag !== void 0) return flag;
|
|
51
|
+
const nodeEnv = readNodeEnv();
|
|
52
|
+
if (nodeEnv === void 0) return false;
|
|
10
53
|
return nodeEnv !== "test" && nodeEnv !== "production";
|
|
11
54
|
}
|
|
55
|
+
/**
|
|
56
|
+
* Like {@link isDevEnv}, but on under `test` as well.
|
|
57
|
+
*
|
|
58
|
+
* For diagnostics a consumer's test run should still surface - deprecation
|
|
59
|
+
* warnings above all. "You are passing a prop we are about to remove" is worth
|
|
60
|
+
* hearing from CI, and unlike a collapsed-height complaint it cannot be wrong
|
|
61
|
+
* just because jsdom has no layout.
|
|
62
|
+
*/
|
|
63
|
+
function isDevEnvOrTest() {
|
|
64
|
+
const flag = readDebugFlag();
|
|
65
|
+
if (flag !== void 0) return flag;
|
|
66
|
+
const nodeEnv = readNodeEnv();
|
|
67
|
+
if (nodeEnv === void 0) return false;
|
|
68
|
+
return nodeEnv !== "production";
|
|
69
|
+
}
|
|
12
70
|
|
|
13
71
|
//#endregion
|
|
14
|
-
export { isDevEnv };
|
|
72
|
+
export { isDevEnv, isDevEnvOrTest };
|
|
15
73
|
//# sourceMappingURL=is-dev-env.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"is-dev-env.js","names":[],"sources":["../../src/utils/is-dev-env.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"file":"is-dev-env.js","names":[],"sources":["../../src/utils/is-dev-env.ts"],"sourcesContent":["/**\n * `NODE_ENV` as the environment that is actually running reports it, or\n * `undefined` when nothing can say.\n *\n * The one place in ui-kit allowed to read `NODE_ENV`, because it is the one\n * place that has to survive the build unfolded. A comparison compiled into\n * `dist` freezes whatever `NODE_ENV` the release machine exported and hands\n * every consumer the same answer, so `tsdown.config.ts` defines the expression\n * as itself to stop rolldown inlining it - see the comment there.\n */\nfunction readNodeEnv(): string | undefined {\n try {\n // Deliberately unguarded by `typeof process`: a guard would also gate the\n // *substituted* value, and browser bundlers replace this read without\n // defining `process` itself - so `typeof process === 'undefined'` is true\n // in a Vite dev build that just told us NODE_ENV is \"development\". The\n // catch covers the case the guard was there for: no substitution and no\n // `process` to dereference, e.g. an unbundled `<script type=\"module\">`.\n return process.env.NODE_ENV;\n } catch {\n return undefined;\n }\n}\n\n/**\n * `localStorage.UIKIT_DEBUG` as a tri-state: an explicit `\"true\"` forces ui-kit's\n * diagnostics on and an explicit `\"false\"` forces them off, in any environment.\n *\n * The escape hatch in both directions. Consumers whose production build somehow\n * resolves to development can silence us without waiting for a release, and\n * anyone debugging a built app can switch us back on.\n */\nfunction readDebugFlag(): boolean | undefined {\n if (typeof window === 'undefined' || !window.localStorage) return undefined;\n\n try {\n const flag = window.localStorage.getItem('UIKIT_DEBUG')?.toLowerCase();\n\n if (flag === 'true') return true;\n if (flag === 'false') return false;\n } catch {\n // localStorage might not be available (private browsing, etc.)\n }\n\n return undefined;\n}\n\n/**\n * Whether to run diagnostics that only a human looking at the page can act on -\n * a warning drawn into the layout, a complaint about a measurement.\n *\n * Off under `test`: jsdom reports `offsetHeight: 0` for everything, so anything\n * keyed off a measurement is not just noisy in a consumer's test run but wrong.\n * Off under `production`, and off when nobody could say what `NODE_ENV` is -\n * a diagnostic shown to end users is worse than a missing one shown to a\n * developer, who still has `UIKIT_DEBUG`.\n *\n * Use {@link isDevEnvOrTest} instead for diagnostics a test run should surface.\n */\nexport function isDevEnv(): boolean {\n const flag = readDebugFlag();\n\n if (flag !== undefined) return flag;\n\n const nodeEnv = readNodeEnv();\n\n if (nodeEnv === undefined) return false;\n\n return nodeEnv !== 'test' && nodeEnv !== 'production';\n}\n\n/**\n * Like {@link isDevEnv}, but on under `test` as well.\n *\n * For diagnostics a consumer's test run should still surface - deprecation\n * warnings above all. \"You are passing a prop we are about to remove\" is worth\n * hearing from CI, and unlike a collapsed-height complaint it cannot be wrong\n * just because jsdom has no layout.\n */\nexport function isDevEnvOrTest(): boolean {\n const flag = readDebugFlag();\n\n if (flag !== undefined) return flag;\n\n const nodeEnv = readNodeEnv();\n\n if (nodeEnv === undefined) return false;\n\n return nodeEnv !== 'production';\n}\n"],"mappings":";;;;;;;;;;;;AAUA,SAAS,cAAkC;AACzC,KAAI;AAOF;SACM;AACN;;;;;;;;;;;AAYJ,SAAS,gBAAqC;AAC5C,KAAI,OAAO,WAAW,eAAe,CAAC,OAAO,aAAc,QAAO;AAElE,KAAI;EACF,MAAM,OAAO,OAAO,aAAa,QAAQ,cAAc,EAAE,aAAa;AAEtE,MAAI,SAAS,OAAQ,QAAO;AAC5B,MAAI,SAAS,QAAS,QAAO;SACvB;;;;;;;;;;;;;;AAmBV,SAAgB,WAAoB;CAClC,MAAM,OAAO,eAAe;AAE5B,KAAI,SAAS,OAAW,QAAO;CAE/B,MAAM,UAAU,aAAa;AAE7B,KAAI,YAAY,OAAW,QAAO;AAElC,QAAO,YAAY,UAAU,YAAY;;;;;;;;;;AAW3C,SAAgB,iBAA0B;CACxC,MAAM,OAAO,eAAe;AAE5B,KAAI,SAAS,OAAW,QAAO;CAE/B,MAAM,UAAU,aAAa;AAE7B,KAAI,YAAY,OAAW,QAAO;AAElC,QAAO,YAAY"}
|
package/dist/utils/modules.js
CHANGED
package/dist/utils/promise.js
CHANGED
package/dist/utils/raf.js
CHANGED
package/dist/utils/random.js
CHANGED
package/dist/utils/range.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.177.0 | Cube Dev Team */
|
|
2
2
|
import { mergeProps } from "./mergeProps.js";
|
|
3
3
|
import { Children, cloneElement, createContext, useContext, useMemo } from "react";
|
|
4
4
|
import { jsx } from "react/jsx-runtime";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.177.0 | Cube Dev Team */
|
|
2
2
|
import { chain } from "./chain.js";
|
|
3
3
|
import { getDisabledElementProps, omitActivationEventProps } from "./disabledProps.js";
|
|
4
4
|
import { forwardRefWithGenerics } from "./forwardRefWithGenerics.js";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.177.0 | Cube Dev Team */
|
|
2
2
|
//#region src/utils/react/nullableValue.ts
|
|
3
3
|
function castNullableStringValue(props) {
|
|
4
4
|
return castNullableField(props, ["value", "defaultValue"], "string", (v) => String(v));
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.177.0 | Cube Dev Team */
|
|
2
2
|
import { useEvent } from "../../_internal/hooks/use-event.js";
|
|
3
|
+
import { isDevEnv } from "../is-dev-env.js";
|
|
3
4
|
import { useSyncExternalStore } from "react";
|
|
4
5
|
|
|
5
6
|
//#region src/utils/react/sharedStore.ts
|
|
@@ -16,7 +17,7 @@ function createSharedStore(name, initialState) {
|
|
|
16
17
|
state: initialState,
|
|
17
18
|
listeners: /* @__PURE__ */ new Set()
|
|
18
19
|
};
|
|
19
|
-
if (existing && existing.state !== initialState) console.warn(`[createSharedStore] Store "${name}" already exists – the new initialState is ignored to preserve hot-reload state.`);
|
|
20
|
+
if (isDevEnv() && existing && existing.state !== initialState) console.warn(`[createSharedStore] Store "${name}" already exists – the new initialState is ignored to preserve hot-reload state.`);
|
|
20
21
|
if (cacheKey && !existing) globalThis[cacheKey] = holder;
|
|
21
22
|
const getSnapshot = () => holder.state;
|
|
22
23
|
const subscribe = (cb) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sharedStore.js","names":[],"sources":["../../../src/utils/react/sharedStore.ts"],"sourcesContent":["import { useSyncExternalStore } from 'react';\n\nimport { useEvent } from '../../_internal/hooks/use-event';\n\n/** Like React.setState: either a value or a function of the previous value */\ntype Updater<S> = S | ((prev: S) => S);\n\n/* Internal shape kept on globalThis */\ninterface StoreHolder<S> {\n state: S;\n listeners: Set<() => void>;\n}\n\n/**\n * Create a shared store that survives hot-reloads.\n *\n * Pass a unique `name` once per logical store module:\n * export const useSidebarStore = createSharedStore('sidebar', { open: false });\n */\nexport function createSharedStore<S>(\n name: string,\n initialState: S,\n): UseSharedStoreHook<S> {\n const cacheKey = `__sharedStore_${name}__`;\n const existing: StoreHolder<S> | undefined =\n cacheKey && (globalThis as any)[cacheKey];\n\n const holder: StoreHolder<S> = existing ?? {\n state: initialState,\n listeners: new Set<() => void>(),\n };\n\n /* Warn if someone tries to “re-initialise” with a different value */\n if (
|
|
1
|
+
{"version":3,"file":"sharedStore.js","names":[],"sources":["../../../src/utils/react/sharedStore.ts"],"sourcesContent":["import { useSyncExternalStore } from 'react';\n\nimport { useEvent } from '../../_internal/hooks/use-event';\nimport { isDevEnv } from '../is-dev-env';\n\n/** Like React.setState: either a value or a function of the previous value */\ntype Updater<S> = S | ((prev: S) => S);\n\n/* Internal shape kept on globalThis */\ninterface StoreHolder<S> {\n state: S;\n listeners: Set<() => void>;\n}\n\n/**\n * Create a shared store that survives hot-reloads.\n *\n * Pass a unique `name` once per logical store module:\n * export const useSidebarStore = createSharedStore('sidebar', { open: false });\n */\nexport function createSharedStore<S>(\n name: string,\n initialState: S,\n): UseSharedStoreHook<S> {\n const cacheKey = `__sharedStore_${name}__`;\n const existing: StoreHolder<S> | undefined =\n cacheKey && (globalThis as any)[cacheKey];\n\n const holder: StoreHolder<S> = existing ?? {\n state: initialState,\n listeners: new Set<() => void>(),\n };\n\n /* Warn if someone tries to “re-initialise” with a different value */\n if (isDevEnv() && existing && existing.state !== initialState) {\n console.warn(\n `[createSharedStore] Store \"${name}\" already exists – ` +\n 'the new initialState is ignored to preserve hot-reload state.',\n );\n }\n\n if (cacheKey && !existing) {\n (globalThis as any)[cacheKey] = holder;\n }\n\n const getSnapshot = () => holder.state;\n\n const subscribe = (cb: () => void) => {\n holder.listeners.add(cb);\n\n return () => holder.listeners.delete(cb);\n };\n\n const setStore = (update: Updater<S>) => {\n holder.state =\n typeof update === 'function'\n ? (update as (prev: S) => S)(holder.state)\n : update;\n\n holder.listeners.forEach((l) => l());\n };\n\n const useSharedStore: UseSharedStoreHook<S> = () => {\n return [useSyncExternalStore(subscribe, getSnapshot), useEvent(setStore)];\n };\n\n return useSharedStore;\n}\n\ntype UseSharedStoreHook<S> = () => readonly [S, (u: Updater<S>) => void];\n"],"mappings":";;;;;;;;;;;;AAoBA,SAAgB,kBACd,MACA,cACuB;CACvB,MAAM,WAAW,iBAAiB,KAAK;CACvC,MAAM,WACJ,YAAa,WAAmB;CAElC,MAAM,SAAyB,YAAY;EACzC,OAAO;EACP,2BAAW,IAAI,KAAiB;EACjC;AAGD,KAAI,UAAU,IAAI,YAAY,SAAS,UAAU,aAC/C,SAAQ,KACN,8BAA8B,KAAK,kFAEpC;AAGH,KAAI,YAAY,CAAC,SACf,CAAC,WAAmB,YAAY;CAGlC,MAAM,oBAAoB,OAAO;CAEjC,MAAM,aAAa,OAAmB;AACpC,SAAO,UAAU,IAAI,GAAG;AAExB,eAAa,OAAO,UAAU,OAAO,GAAG;;CAG1C,MAAM,YAAY,WAAuB;AACvC,SAAO,QACL,OAAO,WAAW,aACb,OAA0B,OAAO,MAAM,GACxC;AAEN,SAAO,UAAU,SAAS,MAAM,GAAG,CAAC;;CAGtC,MAAM,uBAA8C;AAClD,SAAO,CAAC,qBAAqB,WAAW,YAAY,EAAE,SAAS,SAAS,CAAC;;AAG3E,QAAO"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.177.0 | Cube Dev Team */
|
|
2
2
|
import React, { createContext, useCallback, useContext, useEffect, useMemo, useRef } from "react";
|
|
3
3
|
|
|
4
4
|
//#region src/utils/react/useEventBus.ts
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.177.0 | Cube Dev Team */
|
|
2
2
|
import { useLayoutEffect as useLayoutEffect$1 } from "./useLayoutEffect.js";
|
|
3
3
|
import { useEffect, useRef, useState } from "react";
|
|
4
4
|
import { useSSRSafeId } from "@react-aria/ssr";
|