@cube-dev/ui-kit 0.0.0-canary-51c94b0 → 0.0.0-canary-7d79005
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/README.md +6 -1
- package/dist/README.md +6 -1
- package/dist/_internal/hooks/use-chained-callback.js +1 -1
- 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.d.ts +7 -1
- package/dist/components/Root.js +1 -1
- package/dist/components/Root.js.map +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.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 +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 +21 -21
- 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 +1 -1
- package/dist/components/content/highlightText.js +1 -1
- package/dist/components/content/use-auto-tooltip.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/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/TimeInput.js +1 -1
- package/dist/components/fields/DatePicker/parseDate.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/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/TextInputMapper/TextInputMapper.js +1 -1
- package/dist/components/form/FieldWrapper/FieldWrapper.js +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.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 +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.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/layout.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/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/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/FileTabs/FileTabs.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/RangeCalendar.js +1 -1
- package/dist/components/other/CubeLogo/CubeLogo.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.js +1 -1
- package/dist/components/overlays/Modal/OpenTransitionContext.js +1 -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/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.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 +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/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/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/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.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/base.js +1 -1
- package/dist/tokens/colors.js +1 -1
- package/dist/tokens/index.js +1 -1
- package/dist/tokens/layout.js +1 -1
- package/dist/tokens/lazy-styles.js +1 -1
- package/dist/tokens/palette-config.d.ts +43 -24
- package/dist/tokens/palette-config.js +86 -30
- package/dist/tokens/palette-config.js.map +1 -1
- package/dist/tokens/palette.js +14 -5
- package/dist/tokens/palette.js.map +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/is-dev-env.js +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/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 +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.d.ts +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/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 +1 -1
- package/dist/version.js +2 -2
- package/docs/Theming.md +55 -11
- package/docs/components/Root.md +1 -1
- package/docs/components/other/CubeLogo.md +8 -0
- package/package.json +1 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-7d79005 | Cube Dev Team */
|
|
2
2
|
import { wrapIcon } from "./wrap-icon.js";
|
|
3
3
|
import { jsx } from "react/jsx-runtime";
|
|
4
4
|
import { IconBolt } from "@tabler/icons-react";
|
package/dist/icons/TimeIcon.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-7d79005 | Cube Dev Team */
|
|
2
2
|
import { wrapIcon } from "./wrap-icon.js";
|
|
3
3
|
import { jsx } from "react/jsx-runtime";
|
|
4
4
|
import { IconClockHour4 } from "@tabler/icons-react";
|
package/dist/icons/TrashIcon.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-7d79005 | Cube Dev Team */
|
|
2
2
|
import { wrapIcon } from "./wrap-icon.js";
|
|
3
3
|
import { jsx } from "react/jsx-runtime";
|
|
4
4
|
import { IconTrash } from "@tabler/icons-react";
|
package/dist/icons/UnlockIcon.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-7d79005 | Cube Dev Team */
|
|
2
2
|
import { wrapIcon } from "./wrap-icon.js";
|
|
3
3
|
import { jsx } from "react/jsx-runtime";
|
|
4
4
|
import { IconLockOpen2 } from "@tabler/icons-react";
|
package/dist/icons/UpIcon.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-7d79005 | Cube Dev Team */
|
|
2
2
|
import { wrapIcon } from "./wrap-icon.js";
|
|
3
3
|
import { jsx } from "react/jsx-runtime";
|
|
4
4
|
import { IconChevronUp } from "@tabler/icons-react";
|
package/dist/icons/UserIcon.js
CHANGED
package/dist/icons/ViewIcon.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-7d79005 | Cube Dev Team */
|
|
2
2
|
import { wrapIcon } from "./wrap-icon.js";
|
|
3
3
|
import { jsx } from "react/jsx-runtime";
|
|
4
4
|
import { IconAlertTriangleFilled } from "@tabler/icons-react";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-7d79005 | Cube Dev Team */
|
|
2
2
|
import { wrapIcon } from "./wrap-icon.js";
|
|
3
3
|
import { jsx } from "react/jsx-runtime";
|
|
4
4
|
import { IconAlertTriangle } from "@tabler/icons-react";
|
package/dist/icons/wrap-icon.js
CHANGED
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-7d79005 | Cube Dev Team */
|
|
2
2
|
import { extractStyles } from "./utils/styles.js";
|
|
3
3
|
import { chain } from "./utils/react/chain.js";
|
|
4
4
|
import { forwardRefWithGenerics } from "./utils/react/forwardRefWithGenerics.js";
|
package/dist/provider.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-7d79005 | Cube Dev Team */
|
|
2
2
|
import { EventBusProvider } from "./utils/react/useEventBus.js";
|
|
3
3
|
import { defaultNavigationAdapter } from "./providers/navigationAdapter.default.js";
|
|
4
4
|
import { createContext, useContext, useMemo } from "react";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-7d79005 | Cube Dev Team */
|
|
2
2
|
import { createContext, useContext, useMemo } from "react";
|
|
3
3
|
import { Fragment as Fragment$1, jsx } from "react/jsx-runtime";
|
|
4
4
|
|
package/dist/tokens/base.js
CHANGED
package/dist/tokens/colors.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-7d79005 | Cube Dev Team */
|
|
2
2
|
import { getPaletteVersion } from "./palette-config.js";
|
|
3
3
|
import { BASE_TOKENS } from "./base.js";
|
|
4
4
|
import { lazyStyles } from "./lazy-styles.js";
|
package/dist/tokens/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-7d79005 | Cube Dev Team */
|
|
2
2
|
import { DEFAULT_PALETTE_CONFIG, getPaletteConfig, getPaletteConfigInput, getPaletteVersion, invalidatePaletteTokens, resetPaletteConfig, resolvePaletteConfig, setPaletteConfig, subscribePaletteConfig, usePaletteConfig, usePaletteVersion } from "./palette-config.js";
|
|
3
3
|
import { BASE_TOKENS } from "./base.js";
|
|
4
4
|
import { lazyStyles } from "./lazy-styles.js";
|
package/dist/tokens/layout.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-7d79005 | Cube Dev Team */
|
|
2
2
|
//#region src/tokens/lazy-styles.ts
|
|
3
3
|
/**
|
|
4
4
|
* Proxy that defers to `factory()` on every property / enumeration access.
|
|
@@ -114,30 +114,42 @@ interface ResolvedPaletteConfig {
|
|
|
114
114
|
};
|
|
115
115
|
};
|
|
116
116
|
}
|
|
117
|
-
/**
|
|
117
|
+
/**
|
|
118
|
+
* The palette as it ships, with no tuning applied. Frozen — it is the baseline
|
|
119
|
+
* every resolution falls back to, so a stray write to it would move the defaults
|
|
120
|
+
* for the whole process.
|
|
121
|
+
*/
|
|
118
122
|
declare const DEFAULT_PALETTE_CONFIG: ResolvedPaletteConfig;
|
|
119
123
|
/**
|
|
120
|
-
*
|
|
124
|
+
* Set the palette config.
|
|
121
125
|
*
|
|
122
|
-
*
|
|
123
|
-
*
|
|
124
|
-
*
|
|
125
|
-
*
|
|
126
|
+
* **Replaces**, like `useState` — the config you pass *is* the config, resolved
|
|
127
|
+
* against the shipped defaults. Nothing accumulates, so a field you leave out is a
|
|
128
|
+
* field you do not have: dropping a customization means dropping it from the
|
|
129
|
+
* object, and re-applying the same object twice is the same as applying it once.
|
|
126
130
|
*
|
|
127
131
|
* ```ts
|
|
128
|
-
* setPaletteConfig({ hue: 200,
|
|
132
|
+
* setPaletteConfig({ hue: 200, baseHue: 60 });
|
|
133
|
+
* setPaletteConfig({ hue: 200 }); // baseHue is gone — back to inheriting `hue`
|
|
129
134
|
* ```
|
|
130
135
|
*
|
|
131
|
-
*
|
|
132
|
-
*
|
|
136
|
+
* To adjust one field of the config already in place — a slider in a settings UI —
|
|
137
|
+
* pass an updater. It receives the config as written, sparse, so spreading it
|
|
138
|
+
* preserves which fields are pinned and which still inherit:
|
|
133
139
|
*
|
|
134
140
|
* ```ts
|
|
135
|
-
* setPaletteConfig(
|
|
136
|
-
* setPaletteConfig({ themes: { primary: { saturation: undefined } } }); // inherit again
|
|
141
|
+
* setPaletteConfig((config) => ({ ...config, hue: 200 }));
|
|
137
142
|
* ```
|
|
143
|
+
*
|
|
144
|
+
* The palette is rebuilt lazily on the next token read, and any mounted `<Root>`
|
|
145
|
+
* re-injects the token block — no component re-render is involved, because every
|
|
146
|
+
* color in the kit resolves through a CSS custom property.
|
|
147
|
+
*/
|
|
148
|
+
declare function setPaletteConfig(config: PaletteConfig | ((previous: PaletteConfig) => PaletteConfig)): void;
|
|
149
|
+
/**
|
|
150
|
+
* Drop all tuning and restore the palette the kit ships with. Identical to
|
|
151
|
+
* `setPaletteConfig({})`; it exists to be readable at a call site.
|
|
138
152
|
*/
|
|
139
|
-
declare function setPaletteConfig(config: PaletteConfig): void;
|
|
140
|
-
/** Drop all tuning and restore the palette the kit ships with. */
|
|
141
153
|
declare function resetPaletteConfig(): void;
|
|
142
154
|
/**
|
|
143
155
|
* Force every token to re-resolve without changing the palette config.
|
|
@@ -159,20 +171,22 @@ declare function getPaletteConfig(): ResolvedPaletteConfig;
|
|
|
159
171
|
* to offer a way back:
|
|
160
172
|
*
|
|
161
173
|
* ```ts
|
|
162
|
-
* const pinned = getPaletteConfigInput().
|
|
174
|
+
* const pinned = getPaletteConfigInput().baseHue !== undefined;
|
|
163
175
|
*
|
|
164
|
-
* // Re-link it to the brand by
|
|
165
|
-
* setPaletteConfig({
|
|
176
|
+
* // Re-link it to the brand by dropping the field.
|
|
177
|
+
* setPaletteConfig(({ baseHue, ...config }) => config);
|
|
166
178
|
* ```
|
|
179
|
+
*
|
|
180
|
+
* It is also the value handed to a {@link setPaletteConfig} updater.
|
|
167
181
|
*/
|
|
168
182
|
declare function getPaletteConfigInput(): PaletteConfig;
|
|
169
183
|
/**
|
|
170
|
-
* Resolve a
|
|
184
|
+
* Resolve a patch **over** the current config, without applying it.
|
|
171
185
|
*
|
|
172
|
-
*
|
|
173
|
-
*
|
|
174
|
-
*
|
|
175
|
-
*
|
|
186
|
+
* This one layers, unlike {@link setPaletteConfig}: a preview wants "the theme in
|
|
187
|
+
* use, but in dark", so the fields it does not mention have to come from the live
|
|
188
|
+
* config rather than from the defaults. The store is not touched and no listener
|
|
189
|
+
* fires.
|
|
176
190
|
*/
|
|
177
191
|
declare function resolvePaletteConfig(config?: PaletteConfig): ResolvedPaletteConfig;
|
|
178
192
|
/** Subscribe to palette config changes. Returns an unsubscribe function. */
|
|
@@ -183,21 +197,26 @@ declare function subscribePaletteConfig(listener: () => void): () => void;
|
|
|
183
197
|
*/
|
|
184
198
|
declare function usePaletteVersion(): number;
|
|
185
199
|
/**
|
|
186
|
-
* Read and tune the palette from React, `useState`-style
|
|
200
|
+
* Read and tune the palette from React, `useState`-style — including the part
|
|
201
|
+
* where the setter *replaces*. A control that changes one field wants the updater
|
|
202
|
+
* form, or it will drop every other field:
|
|
187
203
|
*
|
|
188
204
|
* ```tsx
|
|
189
205
|
* const [palette, setPalette] = usePaletteConfig();
|
|
190
206
|
*
|
|
191
207
|
* <HueSlider
|
|
192
208
|
* value={palette.hue}
|
|
193
|
-
* onChange={(hue) => setPalette({ hue })}
|
|
209
|
+
* onChange={(hue) => setPalette((config) => ({ ...config, hue }))}
|
|
194
210
|
* />
|
|
195
211
|
* ```
|
|
196
212
|
*
|
|
213
|
+
* The first element is the *resolved* config, so `palette.hue` is always a number.
|
|
214
|
+
* The updater's argument is the sparse one — see {@link getPaletteConfigInput}.
|
|
215
|
+
*
|
|
197
216
|
* The config is global process state, so every consumer of this hook — and every
|
|
198
217
|
* mounted `<Root>` — sees the same palette.
|
|
199
218
|
*/
|
|
200
|
-
declare function usePaletteConfig(): readonly [ResolvedPaletteConfig,
|
|
219
|
+
declare function usePaletteConfig(): readonly [ResolvedPaletteConfig, typeof setPaletteConfig];
|
|
201
220
|
//#endregion
|
|
202
221
|
export { DEFAULT_PALETTE_CONFIG, PaletteCodeSeed, PaletteConfig, PaletteThemeName, PaletteThemeSeed, ResolvedPaletteConfig, getPaletteConfig, getPaletteConfigInput, invalidatePaletteTokens, resetPaletteConfig, resolvePaletteConfig, setPaletteConfig, subscribePaletteConfig, usePaletteConfig, usePaletteVersion };
|
|
203
222
|
//# sourceMappingURL=palette-config.d.ts.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-7d79005 | Cube Dev Team */
|
|
2
2
|
import { useSyncExternalStore } from "react";
|
|
3
3
|
|
|
4
4
|
//#region src/tokens/palette-config.ts
|
|
@@ -58,12 +58,17 @@ function resolveConfig(input) {
|
|
|
58
58
|
}
|
|
59
59
|
};
|
|
60
60
|
}
|
|
61
|
-
/** The palette as it ships, with no tuning applied. */
|
|
62
|
-
const DEFAULT_PALETTE_CONFIG = resolveConfig({});
|
|
63
61
|
/**
|
|
64
|
-
* The
|
|
65
|
-
*
|
|
66
|
-
*
|
|
62
|
+
* The palette as it ships, with no tuning applied. Frozen — it is the baseline
|
|
63
|
+
* every resolution falls back to, so a stray write to it would move the defaults
|
|
64
|
+
* for the whole process.
|
|
65
|
+
*/
|
|
66
|
+
const DEFAULT_PALETTE_CONFIG = freezeConfig(resolveConfig({}));
|
|
67
|
+
/**
|
|
68
|
+
* The last config *as written*, sparse — not the resolved one. Keeping the sparse
|
|
69
|
+
* form is what makes inheritance live: a `saturation` with no `themes.danger.
|
|
70
|
+
* saturation` beside it means danger genuinely follows the palette, rather than
|
|
71
|
+
* having been frozen at whatever the palette read when it was set.
|
|
67
72
|
*/
|
|
68
73
|
let input = {};
|
|
69
74
|
let resolved = DEFAULT_PALETTE_CONFIG;
|
|
@@ -77,6 +82,10 @@ function mergeSeed(base, patch) {
|
|
|
77
82
|
...patch
|
|
78
83
|
};
|
|
79
84
|
}
|
|
85
|
+
/**
|
|
86
|
+
* Layer a patch over a base config. Used by {@link resolvePaletteConfig} for
|
|
87
|
+
* previews — *not* by {@link setPaletteConfig}, which replaces.
|
|
88
|
+
*/
|
|
80
89
|
function mergeInput(base, patch) {
|
|
81
90
|
const next = {
|
|
82
91
|
...base,
|
|
@@ -125,38 +134,78 @@ function pinSignature(config) {
|
|
|
125
134
|
].flatMap((name) => [set(config.themes?.[name]?.hue), set(config.themes?.[name]?.saturation)])
|
|
126
135
|
].join("");
|
|
127
136
|
}
|
|
137
|
+
/**
|
|
138
|
+
* Snapshot a config so the store owns it outright.
|
|
139
|
+
*
|
|
140
|
+
* Two hazards this closes. The caller's object stays theirs, so mutating it after
|
|
141
|
+
* the call cannot desync `input` from `resolved`. And what we hand back from
|
|
142
|
+
* {@link getPaletteConfig} / {@link getPaletteConfigInput} is frozen, so a caller
|
|
143
|
+
* who writes to it gets a clear failure rather than silently corrupting the store
|
|
144
|
+
* — the version would not bump, and every token cache would go on serving values
|
|
145
|
+
* that no longer match the config.
|
|
146
|
+
*/
|
|
147
|
+
function freezeConfig(config) {
|
|
148
|
+
const themes = config.themes;
|
|
149
|
+
if (themes) {
|
|
150
|
+
for (const seed of Object.values(themes)) if (seed) Object.freeze(seed);
|
|
151
|
+
Object.freeze(themes);
|
|
152
|
+
}
|
|
153
|
+
return Object.freeze(config);
|
|
154
|
+
}
|
|
155
|
+
/** {@link freezeConfig} on a copy, for a config we did not create ourselves. */
|
|
156
|
+
function snapshotConfig(config) {
|
|
157
|
+
const themes = config.themes;
|
|
158
|
+
return freezeConfig({
|
|
159
|
+
...config,
|
|
160
|
+
...themes ? { themes: {
|
|
161
|
+
...themes.success ? { success: { ...themes.success } } : null,
|
|
162
|
+
...themes.danger ? { danger: { ...themes.danger } } : null,
|
|
163
|
+
...themes.warning ? { warning: { ...themes.warning } } : null,
|
|
164
|
+
...themes.note ? { note: { ...themes.note } } : null,
|
|
165
|
+
...themes.code ? { code: { ...themes.code } } : null
|
|
166
|
+
} } : null
|
|
167
|
+
});
|
|
168
|
+
}
|
|
128
169
|
function commit(nextInput) {
|
|
129
170
|
const nextResolved = resolveConfig(nextInput);
|
|
130
171
|
if (isSameConfig(resolved, nextResolved) && pinSignature(input) === pinSignature(nextInput)) return;
|
|
131
|
-
input = nextInput;
|
|
132
|
-
resolved = nextResolved;
|
|
172
|
+
input = snapshotConfig(nextInput);
|
|
173
|
+
resolved = freezeConfig(nextResolved);
|
|
133
174
|
version++;
|
|
134
175
|
listeners.forEach((listener) => listener());
|
|
135
176
|
}
|
|
136
177
|
/**
|
|
137
|
-
*
|
|
178
|
+
* Set the palette config.
|
|
138
179
|
*
|
|
139
|
-
*
|
|
140
|
-
*
|
|
141
|
-
*
|
|
142
|
-
*
|
|
180
|
+
* **Replaces**, like `useState` — the config you pass *is* the config, resolved
|
|
181
|
+
* against the shipped defaults. Nothing accumulates, so a field you leave out is a
|
|
182
|
+
* field you do not have: dropping a customization means dropping it from the
|
|
183
|
+
* object, and re-applying the same object twice is the same as applying it once.
|
|
143
184
|
*
|
|
144
185
|
* ```ts
|
|
145
|
-
* setPaletteConfig({ hue: 200,
|
|
186
|
+
* setPaletteConfig({ hue: 200, baseHue: 60 });
|
|
187
|
+
* setPaletteConfig({ hue: 200 }); // baseHue is gone — back to inheriting `hue`
|
|
146
188
|
* ```
|
|
147
189
|
*
|
|
148
|
-
*
|
|
149
|
-
*
|
|
190
|
+
* To adjust one field of the config already in place — a slider in a settings UI —
|
|
191
|
+
* pass an updater. It receives the config as written, sparse, so spreading it
|
|
192
|
+
* preserves which fields are pinned and which still inherit:
|
|
150
193
|
*
|
|
151
194
|
* ```ts
|
|
152
|
-
* setPaletteConfig(
|
|
153
|
-
* setPaletteConfig({ themes: { primary: { saturation: undefined } } }); // inherit again
|
|
195
|
+
* setPaletteConfig((config) => ({ ...config, hue: 200 }));
|
|
154
196
|
* ```
|
|
197
|
+
*
|
|
198
|
+
* The palette is rebuilt lazily on the next token read, and any mounted `<Root>`
|
|
199
|
+
* re-injects the token block — no component re-render is involved, because every
|
|
200
|
+
* color in the kit resolves through a CSS custom property.
|
|
155
201
|
*/
|
|
156
202
|
function setPaletteConfig(config) {
|
|
157
|
-
commit(
|
|
203
|
+
commit(typeof config === "function" ? config(input) : config);
|
|
158
204
|
}
|
|
159
|
-
/**
|
|
205
|
+
/**
|
|
206
|
+
* Drop all tuning and restore the palette the kit ships with. Identical to
|
|
207
|
+
* `setPaletteConfig({})`; it exists to be readable at a call site.
|
|
208
|
+
*/
|
|
160
209
|
function resetPaletteConfig() {
|
|
161
210
|
commit({});
|
|
162
211
|
}
|
|
@@ -185,22 +234,24 @@ function getPaletteConfig() {
|
|
|
185
234
|
* to offer a way back:
|
|
186
235
|
*
|
|
187
236
|
* ```ts
|
|
188
|
-
* const pinned = getPaletteConfigInput().
|
|
237
|
+
* const pinned = getPaletteConfigInput().baseHue !== undefined;
|
|
189
238
|
*
|
|
190
|
-
* // Re-link it to the brand by
|
|
191
|
-
* setPaletteConfig({
|
|
239
|
+
* // Re-link it to the brand by dropping the field.
|
|
240
|
+
* setPaletteConfig(({ baseHue, ...config }) => config);
|
|
192
241
|
* ```
|
|
242
|
+
*
|
|
243
|
+
* It is also the value handed to a {@link setPaletteConfig} updater.
|
|
193
244
|
*/
|
|
194
245
|
function getPaletteConfigInput() {
|
|
195
246
|
return input;
|
|
196
247
|
}
|
|
197
248
|
/**
|
|
198
|
-
* Resolve a
|
|
249
|
+
* Resolve a patch **over** the current config, without applying it.
|
|
199
250
|
*
|
|
200
|
-
*
|
|
201
|
-
*
|
|
202
|
-
*
|
|
203
|
-
*
|
|
251
|
+
* This one layers, unlike {@link setPaletteConfig}: a preview wants "the theme in
|
|
252
|
+
* use, but in dark", so the fields it does not mention have to come from the live
|
|
253
|
+
* config rather than from the defaults. The store is not touched and no listener
|
|
254
|
+
* fires.
|
|
204
255
|
*/
|
|
205
256
|
function resolvePaletteConfig(config) {
|
|
206
257
|
if (!config) return resolved;
|
|
@@ -229,17 +280,22 @@ function usePaletteVersion() {
|
|
|
229
280
|
return useSyncExternalStore(subscribePaletteConfig, getPaletteVersion, getPaletteVersion);
|
|
230
281
|
}
|
|
231
282
|
/**
|
|
232
|
-
* Read and tune the palette from React, `useState`-style
|
|
283
|
+
* Read and tune the palette from React, `useState`-style — including the part
|
|
284
|
+
* where the setter *replaces*. A control that changes one field wants the updater
|
|
285
|
+
* form, or it will drop every other field:
|
|
233
286
|
*
|
|
234
287
|
* ```tsx
|
|
235
288
|
* const [palette, setPalette] = usePaletteConfig();
|
|
236
289
|
*
|
|
237
290
|
* <HueSlider
|
|
238
291
|
* value={palette.hue}
|
|
239
|
-
* onChange={(hue) => setPalette({ hue })}
|
|
292
|
+
* onChange={(hue) => setPalette((config) => ({ ...config, hue }))}
|
|
240
293
|
* />
|
|
241
294
|
* ```
|
|
242
295
|
*
|
|
296
|
+
* The first element is the *resolved* config, so `palette.hue` is always a number.
|
|
297
|
+
* The updater's argument is the sparse one — see {@link getPaletteConfigInput}.
|
|
298
|
+
*
|
|
243
299
|
* The config is global process state, so every consumer of this hook — and every
|
|
244
300
|
* mounted `<Root>` — sees the same palette.
|
|
245
301
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"palette-config.js","names":[],"sources":["../../src/tokens/palette-config.ts"],"sourcesContent":["import { useSyncExternalStore } from 'react';\n\n/**\n * Runtime configuration for the Glaze-generated color palette.\n *\n * The palette recipe itself lives in `./palette.ts`; this module owns only the\n * *seeds* it is built from, plus a version counter the token caches watch. It\n * deliberately imports nothing else — not the token modules, not `glaze` — so\n * there is no import cycle and no ordering hazard.\n *\n * Reading is free; writing rebuilds the palette on the next token read. See\n * `Getting Started/Theming` in Storybook for the full contract.\n */\n\n// ============================================================================\n// Default seeds\n// ============================================================================\n\n/** Brand hue. Drives the `default`, `primary`, `purple` and `special` themes. */\nexport const DEFAULT_HUE = 280.3;\nexport const DEFAULT_SUCCESS_HUE = 156.9;\nexport const DEFAULT_DANGER_HUE = 23.1;\nexport const DEFAULT_WARNING_HUE = 84.3;\nexport const DEFAULT_NOTE_HUE = 302.3;\n\n/** Seed saturation. Per-color `saturation` in the recipe is a 0–1 factor of it. */\nexport const DEFAULT_SATURATION = 80;\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Hue / saturation seed override for one colored theme. */\nexport interface PaletteThemeSeed {\n /** Hue in degrees (0–360). */\n hue?: number;\n /** Saturation (0–100). Defaults to the palette-level `saturation`. */\n saturation?: number;\n}\n\n/**\n * The `code-*` syntax family takes a saturation and nothing else.\n *\n * Its hues are absolute literals by design, so syntax colors never rotate with the\n * brand — strings would collide with numbers the moment the brand went green. And\n * unlike every other theme, its saturation does **not** inherit the palette-level\n * one: the code palette is calibrated once and stays there, so re-seeding the app\n * cannot quietly wash out a code block.\n */\nexport interface PaletteCodeSeed {\n /** Saturation (0–100). Defaults to {@link DEFAULT_SATURATION}, not to `saturation`. */\n saturation?: number;\n}\n\n/** Names of the themes whose seeds can be overridden individually. */\nexport type PaletteThemeName =\n | 'success'\n | 'danger'\n | 'warning'\n | 'note'\n | 'code';\n\n/**\n * Palette tuning. Every field is optional; omitted fields keep their default,\n * and per-theme fields left unset inherit the palette-level value.\n */\nexport interface PaletteConfig {\n /**\n * Accent hue in degrees (0–360) — the brand.\n *\n * Drives the `accent-*` family on every theme, `primary` / `purple` / `special`,\n * and the brand-tinted odds and ends (`focus`, the loading faces, the disabled\n * chip). Also the default for {@link PaletteConfig.baseHue}.\n */\n hue?: number;\n /**\n * Hue of the **base** zone in degrees (0–360): the neutral chrome — `surface`\n * and its ladder, the `surface-text*` ramp, `border`, `placeholder`. Defaults to\n * `hue`, so the chrome carries a faint tint of the brand unless you say otherwise.\n *\n * Splitting it lets the chrome sit on a different hue from the accent — a warm\n * grey UI with a cool blue brand, say. Only the `default` theme is affected: a\n * colored theme's tinted `surface` deliberately follows *its own* hue, because a\n * danger banner should read as red.\n */\n baseHue?: number;\n /**\n * Seed saturation (0–100), and the fallback for every theme that does not set\n * its own.\n *\n * One scale for the whole theme, by design. Every color's own `saturation` is a\n * 0–1 factor of this seed — `surface` at 0.12, `border` at 0.175, the text ramp\n * at 0.2, the accent family at ~1.0 — so moving it rescales the palette while\n * keeping those proportions. Unlike hue, which is configured separately for the\n * brand and for each status theme, saturation is deliberately not split: the\n * ratio between a subtle surface tint and a saturated accent is part of the\n * design.\n */\n saturation?: number;\n /**\n * Global. Widens the usable chroma range by relaxing the sRGB-safe limit,\n * producing a softer, more even palette across hues. Glaze treats `pastel` as\n * instance-level, so it is threaded into every theme.\n */\n pastel?: boolean;\n /**\n * Global. `'auto'` (the default) keeps the two-tier model: normal colors plus\n * a separate high-contrast tier driven by `<html data-contrast=\"high\">` /\n * `prefers-contrast: more`.\n *\n * A number (0–100) replaces that switch with a slider — and, because a manual\n * level already carries the contrast preference, **drops the high-contrast\n * tier entirely**. `0` reproduces the normal output and `100` the\n * high-contrast output, bit for bit.\n */\n contrastLevel?: number | 'auto';\n /** Per-theme seed overrides. */\n themes?: {\n success?: PaletteThemeSeed;\n danger?: PaletteThemeSeed;\n warning?: PaletteThemeSeed;\n note?: PaletteThemeSeed;\n code?: PaletteCodeSeed;\n };\n}\n\n/** {@link PaletteConfig} with every field resolved to a concrete value. */\nexport interface ResolvedPaletteConfig {\n hue: number;\n baseHue: number;\n saturation: number;\n pastel: boolean;\n contrastLevel: number | 'auto';\n themes: {\n success: { hue: number; saturation: number };\n danger: { hue: number; saturation: number };\n warning: { hue: number; saturation: number };\n note: { hue: number; saturation: number };\n code: { saturation: number };\n };\n}\n\n// ============================================================================\n// Resolution\n// ============================================================================\n\nconst DEFAULT_THEME_HUES = {\n success: DEFAULT_SUCCESS_HUE,\n danger: DEFAULT_DANGER_HUE,\n warning: DEFAULT_WARNING_HUE,\n note: DEFAULT_NOTE_HUE,\n} as const;\n\nfunction resolveConfig(input: PaletteConfig): ResolvedPaletteConfig {\n const saturation = input.saturation ?? DEFAULT_SATURATION;\n const themes = input.themes ?? {};\n\n const hue = input.hue ?? DEFAULT_HUE;\n\n return {\n hue,\n baseHue: input.baseHue ?? hue,\n saturation,\n pastel: input.pastel ?? false,\n contrastLevel: input.contrastLevel ?? 'auto',\n themes: {\n success: {\n hue: themes.success?.hue ?? DEFAULT_THEME_HUES.success,\n saturation: themes.success?.saturation ?? saturation,\n },\n danger: {\n hue: themes.danger?.hue ?? DEFAULT_THEME_HUES.danger,\n saturation: themes.danger?.saturation ?? saturation,\n },\n warning: {\n hue: themes.warning?.hue ?? DEFAULT_THEME_HUES.warning,\n saturation: themes.warning?.saturation ?? saturation,\n },\n note: {\n hue: themes.note?.hue ?? DEFAULT_THEME_HUES.note,\n saturation: themes.note?.saturation ?? saturation,\n },\n // Deliberately NOT `?? saturation`: the code palette is calibrated once and\n // does not follow the palette-level seed. See `PaletteCodeSeed`.\n code: { saturation: themes.code?.saturation ?? DEFAULT_SATURATION },\n },\n };\n}\n\n/** The palette as it ships, with no tuning applied. */\nexport const DEFAULT_PALETTE_CONFIG: ResolvedPaletteConfig = resolveConfig({});\n\n// ============================================================================\n// Store\n// ============================================================================\n\n/**\n * The accumulated *input*, not the resolved config. Keeping the sparse form is\n * what makes inheritance live: a later `setPaletteConfig({ saturation })` still\n * cascades into every theme that never set its own.\n */\nlet input: PaletteConfig = {};\nlet resolved: ResolvedPaletteConfig = DEFAULT_PALETTE_CONFIG;\nlet version = 0;\n\nconst listeners = new Set<() => void>();\n\nfunction mergeSeed<T extends PaletteThemeSeed | PaletteCodeSeed>(\n base: T | undefined,\n patch: T | undefined,\n): T | undefined {\n if (!base) return patch;\n if (!patch) return base;\n\n return { ...base, ...patch };\n}\n\nfunction mergeInput(base: PaletteConfig, patch: PaletteConfig): PaletteConfig {\n const next: PaletteConfig = { ...base, ...patch };\n\n if (base.themes || patch.themes) {\n next.themes = {\n success: mergeSeed(base.themes?.success, patch.themes?.success),\n danger: mergeSeed(base.themes?.danger, patch.themes?.danger),\n warning: mergeSeed(base.themes?.warning, patch.themes?.warning),\n note: mergeSeed(base.themes?.note, patch.themes?.note),\n code: mergeSeed(base.themes?.code, patch.themes?.code),\n };\n }\n\n return next;\n}\n\nfunction isSameConfig(a: ResolvedPaletteConfig, b: ResolvedPaletteConfig) {\n return (\n a.hue === b.hue &&\n a.baseHue === b.baseHue &&\n a.saturation === b.saturation &&\n a.pastel === b.pastel &&\n a.contrastLevel === b.contrastLevel &&\n a.themes.code.saturation === b.themes.code.saturation &&\n (['success', 'danger', 'warning', 'note'] as const).every(\n (name) =>\n a.themes[name].hue === b.themes[name].hue &&\n a.themes[name].saturation === b.themes[name].saturation,\n )\n );\n}\n\n/**\n * Which fields are *explicitly set*, as an order-independent signature.\n *\n * Two configs can resolve to identical values yet differ in which of those values\n * are pinned rather than inherited — pinning `primary.saturation` to the number it\n * already inherited is the obvious case. That difference is invisible to\n * {@link isSameConfig} but visible through {@link getPaletteConfigInput}, so it has\n * to count as a change or a settings UI reading it would never re-render.\n */\nfunction pinSignature(config: PaletteConfig): string {\n const set = (value: unknown) => (value === undefined ? '0' : '1');\n\n return [\n set(config.hue),\n set(config.baseHue),\n set(config.saturation),\n set(config.pastel),\n set(config.contrastLevel),\n set(config.themes?.code?.saturation),\n ...(['success', 'danger', 'warning', 'note'] as const).flatMap((name) => [\n set(config.themes?.[name]?.hue),\n set(config.themes?.[name]?.saturation),\n ]),\n ].join('');\n}\n\nfunction commit(nextInput: PaletteConfig) {\n const nextResolved = resolveConfig(nextInput);\n\n // Bail before bumping the version when nothing observable moved, so re-applying\n // the same config — an inline `<Root palette={{ … }}>` literal on every\n // render, a StrictMode double render — costs nothing.\n if (\n isSameConfig(resolved, nextResolved) &&\n pinSignature(input) === pinSignature(nextInput)\n ) {\n return;\n }\n\n input = nextInput;\n resolved = nextResolved;\n version++;\n\n listeners.forEach((listener) => listener());\n}\n\n/**\n * Merge tuning into the current palette config.\n *\n * Merges, like `glaze.configure()`: omitted fields keep their current value.\n * The palette is rebuilt lazily on the next token read, and any mounted `<Root>`\n * re-injects the token block — no component re-render is involved, because every\n * color in the kit resolves through a CSS custom property.\n *\n * ```ts\n * setPaletteConfig({ hue: 200, themes: { danger: { hue: 12 } } });\n * ```\n *\n * Omitting a field keeps it; passing `undefined` **clears** it, so it goes back to\n * inheriting (per-theme) or to the shipped default (top level):\n *\n * ```ts\n * setPaletteConfig({ themes: { primary: { saturation: 90 } } }); // pin\n * setPaletteConfig({ themes: { primary: { saturation: undefined } } }); // inherit again\n * ```\n */\nexport function setPaletteConfig(config: PaletteConfig): void {\n commit(mergeInput(input, config));\n}\n\n/** Drop all tuning and restore the palette the kit ships with. */\nexport function resetPaletteConfig(): void {\n commit({});\n}\n\n/**\n * Force every token to re-resolve without changing the palette config.\n *\n * Only needed if you drive Glaze directly — `glaze.configure({ darkTone })` and\n * the like. Glaze invalidates its own caches, but the kit's token maps are\n * memoized against *this* module's version, so they need telling. Calling it\n * before the first paint is unnecessary; nothing has been resolved yet.\n */\nexport function invalidatePaletteTokens(): void {\n version++;\n listeners.forEach((listener) => listener());\n}\n\n/** The current config, with every field resolved to a concrete value. */\nexport function getPaletteConfig(): ResolvedPaletteConfig {\n return resolved;\n}\n\n/**\n * The config **as set**, sparse — omitted fields are the ones still inheriting.\n *\n * {@link getPaletteConfig} resolves everything to concrete values, which loses the\n * distinction between \"explicitly 80\" and \"80 because it follows the brand\". A\n * settings UI needs that distinction to show an inherited value as inherited, and\n * to offer a way back:\n *\n * ```ts\n * const pinned = getPaletteConfigInput().themes?.primary?.saturation !== undefined;\n *\n * // Re-link it to the brand by clearing the field.\n * setPaletteConfig({ themes: { primary: { saturation: undefined } } });\n * ```\n */\nexport function getPaletteConfigInput(): PaletteConfig {\n return input;\n}\n\n/**\n * Resolve a partial against the current config **without applying it**.\n *\n * Same merge semantics as {@link setPaletteConfig} — omitted fields keep their\n * current value, unset per-theme fields keep inheriting — but the store is not\n * touched and no listener fires. Used to render a palette the app is not\n * actually using, e.g. for a theme preview.\n */\nexport function resolvePaletteConfig(\n config?: PaletteConfig,\n): ResolvedPaletteConfig {\n if (!config) return resolved;\n\n return resolveConfig(mergeInput(input, config));\n}\n\n/**\n * Increments whenever the resolved config changes. The token caches in\n * `./palette.ts`, `./colors.ts` and `./index.ts` compare against it instead of\n * memoizing forever — the same idiom Glaze uses for its own config version.\n */\nexport function getPaletteVersion(): number {\n return version;\n}\n\n/** Subscribe to palette config changes. Returns an unsubscribe function. */\nexport function subscribePaletteConfig(listener: () => void): () => void {\n listeners.add(listener);\n\n return () => {\n listeners.delete(listener);\n };\n}\n\n// ============================================================================\n// React bindings\n// ============================================================================\n\n/**\n * Re-render on palette config changes. Returns the version, not the config, so\n * the snapshot is a primitive and React never warns about an uncached snapshot.\n */\nexport function usePaletteVersion(): number {\n return useSyncExternalStore(\n subscribePaletteConfig,\n getPaletteVersion,\n getPaletteVersion,\n );\n}\n\n/**\n * Read and tune the palette from React, `useState`-style.\n *\n * ```tsx\n * const [palette, setPalette] = usePaletteConfig();\n *\n * <HueSlider\n * value={palette.hue}\n * onChange={(hue) => setPalette({ hue })}\n * />\n * ```\n *\n * The config is global process state, so every consumer of this hook — and every\n * mounted `<Root>` — sees the same palette.\n */\nexport function usePaletteConfig(): readonly [\n ResolvedPaletteConfig,\n (config: PaletteConfig) => void,\n] {\n usePaletteVersion();\n\n return [getPaletteConfig(), setPaletteConfig];\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"palette-config.js","names":[],"sources":["../../src/tokens/palette-config.ts"],"sourcesContent":["import { useSyncExternalStore } from 'react';\n\n/**\n * Runtime configuration for the Glaze-generated color palette.\n *\n * The palette recipe itself lives in `./palette.ts`; this module owns only the\n * *seeds* it is built from, plus a version counter the token caches watch. It\n * deliberately imports nothing else — not the token modules, not `glaze` — so\n * there is no import cycle and no ordering hazard.\n *\n * Reading is free; writing rebuilds the palette on the next token read. See\n * `Getting Started/Theming` in Storybook for the full contract.\n */\n\n// ============================================================================\n// Default seeds\n// ============================================================================\n\n/** Brand hue. Drives the `default`, `primary`, `purple` and `special` themes. */\nexport const DEFAULT_HUE = 280.3;\nexport const DEFAULT_SUCCESS_HUE = 156.9;\nexport const DEFAULT_DANGER_HUE = 23.1;\nexport const DEFAULT_WARNING_HUE = 84.3;\nexport const DEFAULT_NOTE_HUE = 302.3;\n\n/** Seed saturation. Per-color `saturation` in the recipe is a 0–1 factor of it. */\nexport const DEFAULT_SATURATION = 80;\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Hue / saturation seed override for one colored theme. */\nexport interface PaletteThemeSeed {\n /** Hue in degrees (0–360). */\n hue?: number;\n /** Saturation (0–100). Defaults to the palette-level `saturation`. */\n saturation?: number;\n}\n\n/**\n * The `code-*` syntax family takes a saturation and nothing else.\n *\n * Its hues are absolute literals by design, so syntax colors never rotate with the\n * brand — strings would collide with numbers the moment the brand went green. And\n * unlike every other theme, its saturation does **not** inherit the palette-level\n * one: the code palette is calibrated once and stays there, so re-seeding the app\n * cannot quietly wash out a code block.\n */\nexport interface PaletteCodeSeed {\n /** Saturation (0–100). Defaults to {@link DEFAULT_SATURATION}, not to `saturation`. */\n saturation?: number;\n}\n\n/** Names of the themes whose seeds can be overridden individually. */\nexport type PaletteThemeName =\n | 'success'\n | 'danger'\n | 'warning'\n | 'note'\n | 'code';\n\n/**\n * Palette tuning. Every field is optional; omitted fields keep their default,\n * and per-theme fields left unset inherit the palette-level value.\n */\nexport interface PaletteConfig {\n /**\n * Accent hue in degrees (0–360) — the brand.\n *\n * Drives the `accent-*` family on every theme, `primary` / `purple` / `special`,\n * and the brand-tinted odds and ends (`focus`, the loading faces, the disabled\n * chip). Also the default for {@link PaletteConfig.baseHue}.\n */\n hue?: number;\n /**\n * Hue of the **base** zone in degrees (0–360): the neutral chrome — `surface`\n * and its ladder, the `surface-text*` ramp, `border`, `placeholder`. Defaults to\n * `hue`, so the chrome carries a faint tint of the brand unless you say otherwise.\n *\n * Splitting it lets the chrome sit on a different hue from the accent — a warm\n * grey UI with a cool blue brand, say. Only the `default` theme is affected: a\n * colored theme's tinted `surface` deliberately follows *its own* hue, because a\n * danger banner should read as red.\n */\n baseHue?: number;\n /**\n * Seed saturation (0–100), and the fallback for every theme that does not set\n * its own.\n *\n * One scale for the whole theme, by design. Every color's own `saturation` is a\n * 0–1 factor of this seed — `surface` at 0.12, `border` at 0.175, the text ramp\n * at 0.2, the accent family at ~1.0 — so moving it rescales the palette while\n * keeping those proportions. Unlike hue, which is configured separately for the\n * brand and for each status theme, saturation is deliberately not split: the\n * ratio between a subtle surface tint and a saturated accent is part of the\n * design.\n */\n saturation?: number;\n /**\n * Global. Widens the usable chroma range by relaxing the sRGB-safe limit,\n * producing a softer, more even palette across hues. Glaze treats `pastel` as\n * instance-level, so it is threaded into every theme.\n */\n pastel?: boolean;\n /**\n * Global. `'auto'` (the default) keeps the two-tier model: normal colors plus\n * a separate high-contrast tier driven by `<html data-contrast=\"high\">` /\n * `prefers-contrast: more`.\n *\n * A number (0–100) replaces that switch with a slider — and, because a manual\n * level already carries the contrast preference, **drops the high-contrast\n * tier entirely**. `0` reproduces the normal output and `100` the\n * high-contrast output, bit for bit.\n */\n contrastLevel?: number | 'auto';\n /** Per-theme seed overrides. */\n themes?: {\n success?: PaletteThemeSeed;\n danger?: PaletteThemeSeed;\n warning?: PaletteThemeSeed;\n note?: PaletteThemeSeed;\n code?: PaletteCodeSeed;\n };\n}\n\n/** {@link PaletteConfig} with every field resolved to a concrete value. */\nexport interface ResolvedPaletteConfig {\n hue: number;\n baseHue: number;\n saturation: number;\n pastel: boolean;\n contrastLevel: number | 'auto';\n themes: {\n success: { hue: number; saturation: number };\n danger: { hue: number; saturation: number };\n warning: { hue: number; saturation: number };\n note: { hue: number; saturation: number };\n code: { saturation: number };\n };\n}\n\n// ============================================================================\n// Resolution\n// ============================================================================\n\nconst DEFAULT_THEME_HUES = {\n success: DEFAULT_SUCCESS_HUE,\n danger: DEFAULT_DANGER_HUE,\n warning: DEFAULT_WARNING_HUE,\n note: DEFAULT_NOTE_HUE,\n} as const;\n\nfunction resolveConfig(input: PaletteConfig): ResolvedPaletteConfig {\n const saturation = input.saturation ?? DEFAULT_SATURATION;\n const themes = input.themes ?? {};\n\n const hue = input.hue ?? DEFAULT_HUE;\n\n return {\n hue,\n baseHue: input.baseHue ?? hue,\n saturation,\n pastel: input.pastel ?? false,\n contrastLevel: input.contrastLevel ?? 'auto',\n themes: {\n success: {\n hue: themes.success?.hue ?? DEFAULT_THEME_HUES.success,\n saturation: themes.success?.saturation ?? saturation,\n },\n danger: {\n hue: themes.danger?.hue ?? DEFAULT_THEME_HUES.danger,\n saturation: themes.danger?.saturation ?? saturation,\n },\n warning: {\n hue: themes.warning?.hue ?? DEFAULT_THEME_HUES.warning,\n saturation: themes.warning?.saturation ?? saturation,\n },\n note: {\n hue: themes.note?.hue ?? DEFAULT_THEME_HUES.note,\n saturation: themes.note?.saturation ?? saturation,\n },\n // Deliberately NOT `?? saturation`: the code palette is calibrated once and\n // does not follow the palette-level seed. See `PaletteCodeSeed`.\n code: { saturation: themes.code?.saturation ?? DEFAULT_SATURATION },\n },\n };\n}\n\n/**\n * The palette as it ships, with no tuning applied. Frozen — it is the baseline\n * every resolution falls back to, so a stray write to it would move the defaults\n * for the whole process.\n */\nexport const DEFAULT_PALETTE_CONFIG: ResolvedPaletteConfig = freezeConfig(\n resolveConfig({}),\n);\n\n// ============================================================================\n// Store\n// ============================================================================\n\n/**\n * The last config *as written*, sparse — not the resolved one. Keeping the sparse\n * form is what makes inheritance live: a `saturation` with no `themes.danger.\n * saturation` beside it means danger genuinely follows the palette, rather than\n * having been frozen at whatever the palette read when it was set.\n */\nlet input: PaletteConfig = {};\nlet resolved: ResolvedPaletteConfig = DEFAULT_PALETTE_CONFIG;\nlet version = 0;\n\nconst listeners = new Set<() => void>();\n\nfunction mergeSeed<T extends PaletteThemeSeed | PaletteCodeSeed>(\n base: T | undefined,\n patch: T | undefined,\n): T | undefined {\n if (!base) return patch;\n // A patch that omits the theme entirely says nothing about it, so the base\n // survives. Clearing one of its fields is `{ theme: { hue: undefined } }`.\n if (!patch) return base;\n\n return { ...base, ...patch };\n}\n\n/**\n * Layer a patch over a base config. Used by {@link resolvePaletteConfig} for\n * previews — *not* by {@link setPaletteConfig}, which replaces.\n */\nfunction mergeInput(base: PaletteConfig, patch: PaletteConfig): PaletteConfig {\n const next: PaletteConfig = { ...base, ...patch };\n\n if (base.themes || patch.themes) {\n next.themes = {\n success: mergeSeed(base.themes?.success, patch.themes?.success),\n danger: mergeSeed(base.themes?.danger, patch.themes?.danger),\n warning: mergeSeed(base.themes?.warning, patch.themes?.warning),\n note: mergeSeed(base.themes?.note, patch.themes?.note),\n code: mergeSeed(base.themes?.code, patch.themes?.code),\n };\n }\n\n return next;\n}\n\nfunction isSameConfig(a: ResolvedPaletteConfig, b: ResolvedPaletteConfig) {\n return (\n a.hue === b.hue &&\n a.baseHue === b.baseHue &&\n a.saturation === b.saturation &&\n a.pastel === b.pastel &&\n a.contrastLevel === b.contrastLevel &&\n a.themes.code.saturation === b.themes.code.saturation &&\n (['success', 'danger', 'warning', 'note'] as const).every(\n (name) =>\n a.themes[name].hue === b.themes[name].hue &&\n a.themes[name].saturation === b.themes[name].saturation,\n )\n );\n}\n\n/**\n * Which fields are *explicitly set*, as an order-independent signature.\n *\n * Two configs can resolve to identical values yet differ in which of those values\n * are pinned rather than inherited — pinning `primary.saturation` to the number it\n * already inherited is the obvious case. That difference is invisible to\n * {@link isSameConfig} but visible through {@link getPaletteConfigInput}, so it has\n * to count as a change or a settings UI reading it would never re-render.\n */\nfunction pinSignature(config: PaletteConfig): string {\n const set = (value: unknown) => (value === undefined ? '0' : '1');\n\n return [\n set(config.hue),\n set(config.baseHue),\n set(config.saturation),\n set(config.pastel),\n set(config.contrastLevel),\n set(config.themes?.code?.saturation),\n ...(['success', 'danger', 'warning', 'note'] as const).flatMap((name) => [\n set(config.themes?.[name]?.hue),\n set(config.themes?.[name]?.saturation),\n ]),\n ].join('');\n}\n\n/**\n * Snapshot a config so the store owns it outright.\n *\n * Two hazards this closes. The caller's object stays theirs, so mutating it after\n * the call cannot desync `input` from `resolved`. And what we hand back from\n * {@link getPaletteConfig} / {@link getPaletteConfigInput} is frozen, so a caller\n * who writes to it gets a clear failure rather than silently corrupting the store\n * — the version would not bump, and every token cache would go on serving values\n * that no longer match the config.\n */\nfunction freezeConfig<T extends PaletteConfig | ResolvedPaletteConfig>(\n config: T,\n): T {\n const themes = config.themes;\n\n if (themes) {\n for (const seed of Object.values(themes)) {\n if (seed) Object.freeze(seed);\n }\n Object.freeze(themes);\n }\n\n return Object.freeze(config);\n}\n\n/** {@link freezeConfig} on a copy, for a config we did not create ourselves. */\nfunction snapshotConfig(config: PaletteConfig): PaletteConfig {\n const themes = config.themes;\n\n return freezeConfig({\n ...config,\n ...(themes\n ? {\n themes: {\n ...(themes.success ? { success: { ...themes.success } } : null),\n ...(themes.danger ? { danger: { ...themes.danger } } : null),\n ...(themes.warning ? { warning: { ...themes.warning } } : null),\n ...(themes.note ? { note: { ...themes.note } } : null),\n ...(themes.code ? { code: { ...themes.code } } : null),\n },\n }\n : null),\n });\n}\n\nfunction commit(nextInput: PaletteConfig) {\n const nextResolved = resolveConfig(nextInput);\n\n // Bail before bumping the version when nothing observable moved, so re-applying\n // the same config — an inline `<Root palette={{ … }}>` literal on every\n // render, a StrictMode double render — costs nothing.\n if (\n isSameConfig(resolved, nextResolved) &&\n pinSignature(input) === pinSignature(nextInput)\n ) {\n return;\n }\n\n input = snapshotConfig(nextInput);\n resolved = freezeConfig(nextResolved);\n version++;\n\n listeners.forEach((listener) => listener());\n}\n\n/**\n * Set the palette config.\n *\n * **Replaces**, like `useState` — the config you pass *is* the config, resolved\n * against the shipped defaults. Nothing accumulates, so a field you leave out is a\n * field you do not have: dropping a customization means dropping it from the\n * object, and re-applying the same object twice is the same as applying it once.\n *\n * ```ts\n * setPaletteConfig({ hue: 200, baseHue: 60 });\n * setPaletteConfig({ hue: 200 }); // baseHue is gone — back to inheriting `hue`\n * ```\n *\n * To adjust one field of the config already in place — a slider in a settings UI —\n * pass an updater. It receives the config as written, sparse, so spreading it\n * preserves which fields are pinned and which still inherit:\n *\n * ```ts\n * setPaletteConfig((config) => ({ ...config, hue: 200 }));\n * ```\n *\n * The palette is rebuilt lazily on the next token read, and any mounted `<Root>`\n * re-injects the token block — no component re-render is involved, because every\n * color in the kit resolves through a CSS custom property.\n */\nexport function setPaletteConfig(\n config: PaletteConfig | ((previous: PaletteConfig) => PaletteConfig),\n): void {\n commit(typeof config === 'function' ? config(input) : config);\n}\n\n/**\n * Drop all tuning and restore the palette the kit ships with. Identical to\n * `setPaletteConfig({})`; it exists to be readable at a call site.\n */\nexport function resetPaletteConfig(): void {\n commit({});\n}\n\n/**\n * Force every token to re-resolve without changing the palette config.\n *\n * Only needed if you drive Glaze directly — `glaze.configure({ darkTone })` and\n * the like. Glaze invalidates its own caches, but the kit's token maps are\n * memoized against *this* module's version, so they need telling. Calling it\n * before the first paint is unnecessary; nothing has been resolved yet.\n */\nexport function invalidatePaletteTokens(): void {\n version++;\n listeners.forEach((listener) => listener());\n}\n\n/** The current config, with every field resolved to a concrete value. */\nexport function getPaletteConfig(): ResolvedPaletteConfig {\n return resolved;\n}\n\n/**\n * The config **as set**, sparse — omitted fields are the ones still inheriting.\n *\n * {@link getPaletteConfig} resolves everything to concrete values, which loses the\n * distinction between \"explicitly 80\" and \"80 because it follows the brand\". A\n * settings UI needs that distinction to show an inherited value as inherited, and\n * to offer a way back:\n *\n * ```ts\n * const pinned = getPaletteConfigInput().baseHue !== undefined;\n *\n * // Re-link it to the brand by dropping the field.\n * setPaletteConfig(({ baseHue, ...config }) => config);\n * ```\n *\n * It is also the value handed to a {@link setPaletteConfig} updater.\n */\nexport function getPaletteConfigInput(): PaletteConfig {\n return input;\n}\n\n/**\n * Resolve a patch **over** the current config, without applying it.\n *\n * This one layers, unlike {@link setPaletteConfig}: a preview wants \"the theme in\n * use, but in dark\", so the fields it does not mention have to come from the live\n * config rather than from the defaults. The store is not touched and no listener\n * fires.\n */\nexport function resolvePaletteConfig(\n config?: PaletteConfig,\n): ResolvedPaletteConfig {\n if (!config) return resolved;\n\n return resolveConfig(mergeInput(input, config));\n}\n\n/**\n * Increments whenever the resolved config changes. The token caches in\n * `./palette.ts`, `./colors.ts` and `./index.ts` compare against it instead of\n * memoizing forever — the same idiom Glaze uses for its own config version.\n */\nexport function getPaletteVersion(): number {\n return version;\n}\n\n/** Subscribe to palette config changes. Returns an unsubscribe function. */\nexport function subscribePaletteConfig(listener: () => void): () => void {\n listeners.add(listener);\n\n return () => {\n listeners.delete(listener);\n };\n}\n\n// ============================================================================\n// React bindings\n// ============================================================================\n\n/**\n * Re-render on palette config changes. Returns the version, not the config, so\n * the snapshot is a primitive and React never warns about an uncached snapshot.\n */\nexport function usePaletteVersion(): number {\n return useSyncExternalStore(\n subscribePaletteConfig,\n getPaletteVersion,\n getPaletteVersion,\n );\n}\n\n/**\n * Read and tune the palette from React, `useState`-style — including the part\n * where the setter *replaces*. A control that changes one field wants the updater\n * form, or it will drop every other field:\n *\n * ```tsx\n * const [palette, setPalette] = usePaletteConfig();\n *\n * <HueSlider\n * value={palette.hue}\n * onChange={(hue) => setPalette((config) => ({ ...config, hue }))}\n * />\n * ```\n *\n * The first element is the *resolved* config, so `palette.hue` is always a number.\n * The updater's argument is the sparse one — see {@link getPaletteConfigInput}.\n *\n * The config is global process state, so every consumer of this hook — and every\n * mounted `<Root>` — sees the same palette.\n */\nexport function usePaletteConfig(): readonly [\n ResolvedPaletteConfig,\n typeof setPaletteConfig,\n] {\n usePaletteVersion();\n\n return [getPaletteConfig(), setPaletteConfig];\n}\n"],"mappings":"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"}
|
package/dist/tokens/palette.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-7d79005 | Cube Dev Team */
|
|
2
2
|
import { getPaletteConfig, getPaletteVersion, resolvePaletteConfig } from "./palette-config.js";
|
|
3
3
|
import { lazyStyles } from "./lazy-styles.js";
|
|
4
4
|
import { glaze } from "@tenphi/glaze";
|
|
@@ -625,7 +625,15 @@ const VARIANT_KEY = {
|
|
|
625
625
|
"dark:false": "dark",
|
|
626
626
|
"dark:true": "darkContrast"
|
|
627
627
|
};
|
|
628
|
-
/**
|
|
628
|
+
/**
|
|
629
|
+
* Single-entry memo: all four variants of the last config rendered.
|
|
630
|
+
*
|
|
631
|
+
* Keyed on the palette version as well as the config, because the config is not
|
|
632
|
+
* the only input — `buildPalette` also reads Glaze's own global config
|
|
633
|
+
* (`darkTone`, `darkDesaturation`, the state map). A host that drives Glaze
|
|
634
|
+
* directly and then calls `invalidatePaletteTokens()` bumps the version without
|
|
635
|
+
* touching the config, and the region previews have to follow the document.
|
|
636
|
+
*/
|
|
629
637
|
let renderKey = null;
|
|
630
638
|
let renderVariants = {};
|
|
631
639
|
/**
|
|
@@ -643,7 +651,7 @@ let renderVariants = {};
|
|
|
643
651
|
function renderPaletteTokens(options = {}) {
|
|
644
652
|
const { scheme = "light", highContrast = false, ...config } = options;
|
|
645
653
|
const resolved = resolvePaletteConfig(config);
|
|
646
|
-
const key = JSON.stringify(resolved)
|
|
654
|
+
const key = `${getPaletteVersion()}:${JSON.stringify(resolved)}`;
|
|
647
655
|
if (renderKey !== key) {
|
|
648
656
|
const previousLevel = glaze.getConfig().contrastLevel;
|
|
649
657
|
try {
|
|
@@ -662,11 +670,12 @@ function renderPaletteTokens(options = {}) {
|
|
|
662
670
|
format: "oklch",
|
|
663
671
|
modes
|
|
664
672
|
});
|
|
665
|
-
|
|
666
|
-
for (const name of Object.keys(themed))
|
|
673
|
+
const variants = {};
|
|
674
|
+
for (const name of Object.keys(themed)) variants[name] = {
|
|
667
675
|
...themed[name],
|
|
668
676
|
...pickCodeTokens(code[name] ?? {})
|
|
669
677
|
};
|
|
678
|
+
renderVariants = variants;
|
|
670
679
|
renderKey = key;
|
|
671
680
|
} finally {
|
|
672
681
|
glaze.configure({ contrastLevel: previousLevel });
|