@cube-dev/ui-kit 0.0.0-canary-694a764 → 0.0.0-canary-dcbc0fb
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/_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 +4 -4
- 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.d.ts +1 -0
- 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 +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 +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 +2 -1
- package/dist/components/data/TableBase/styled.js +1 -1
- package/dist/components/data/TableBase/types.js +1 -1
- package/dist/components/data/TableBase/use-cell-selection.d.ts +1 -0
- 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/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 +3 -2
- package/dist/components/fields/ColorInput/ColorInput.js.map +1 -1
- package/dist/components/fields/ColorPicker/ColorPicker.js +2 -2
- package/dist/components/fields/ColorPicker/ColorPicker.js.map +1 -1
- package/dist/components/fields/{color → ColorSwatch}/ColorSwatch.d.ts +8 -2
- package/dist/components/fields/{color → ColorSwatch}/ColorSwatch.js +14 -6
- package/dist/components/fields/ColorSwatch/ColorSwatch.js.map +1 -0
- package/dist/components/fields/ColorSwatch/index.d.ts +2 -0
- 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 +1 -0
- package/dist/components/fields/ListBoxPopover/listNavigation.js +1 -1
- package/dist/components/fields/ListBoxPopover/useCompositeFocus.d.ts +2 -0
- 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 +2 -1
- package/dist/components/fields/RadioGroup/RadioGroup.js.map +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 +15 -2
- package/dist/components/fields/Slider/HueSlider.js.map +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/fields/color/ColorPanel.js +1 -1
- package/dist/components/fields/color/channels.js +1 -1
- package/dist/components/fields/color/color.js +1 -1
- package/dist/components/fields/color/context.js +1 -1
- package/dist/components/fields/color/index.d.ts +0 -1
- package/dist/components/fields/index.d.ts +2 -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/group-move.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/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/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 +2 -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.d.ts +1 -0
- 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 +1 -0
- 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 +2 -0
- 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.d.ts +2 -0
- package/dist/components/portal/PortalProvider.js +1 -1
- package/dist/components/portal/index.d.ts +1 -0
- 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 +4 -3
- package/dist/index.js +5 -4
- 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/base.js +1 -1
- package/dist/tokens/color-seed.d.ts +44 -0
- package/dist/tokens/color-seed.js +48 -0
- package/dist/tokens/color-seed.js.map +1 -0
- package/dist/tokens/color-theme.d.ts +8 -1
- package/dist/tokens/color-theme.js +19 -7
- package/dist/tokens/color-theme.js.map +1 -1
- package/dist/tokens/colors.js +1 -1
- package/dist/tokens/index.d.ts +2 -1
- package/dist/tokens/index.js +3 -2
- package/dist/tokens/index.js.map +1 -1
- package/dist/tokens/layout.js +1 -1
- package/dist/tokens/lazy-styles.js +1 -1
- package/dist/tokens/palette-config.d.ts +175 -9
- package/dist/tokens/palette-config.js +62 -10
- package/dist/tokens/palette-config.js.map +1 -1
- package/dist/tokens/palette.js +398 -157
- 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/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 +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/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 +306 -30
- package/docs/components/fields/ColorSwatch.md +148 -0
- package/docs/glaze/api.md +117 -38
- package/docs/glaze/methodology.md +15 -13
- package/docs/glaze/okhst.md +4 -0
- package/package.json +2 -2
- package/dist/components/fields/color/ColorSwatch.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"palette.js","names":[],"sources":["../../src/tokens/palette.ts"],"sourcesContent":["import { glaze } from '@tenphi/glaze';\n\nimport { lazyStyles } from './lazy-styles';\nimport {\n getPaletteConfig,\n getPaletteVersion,\n resolvePaletteConfig,\n} from './palette-config';\n\nimport type {\n ColorMap,\n GlazeConfigOverride,\n GlazePalette,\n GlazeTheme,\n} from '@tenphi/glaze';\nimport type { Styles, Tokens } from '@tenphi/tasty';\nimport type { PaletteConfig, ResolvedPaletteConfig } from './palette-config';\n\n/** Which resolved scheme variant {@link renderPaletteTokens} should return. */\nexport interface RenderPaletteOptions extends PaletteConfig {\n /** Color scheme to resolve. Default: `'light'`. */\n scheme?: 'light' | 'dark';\n /** Resolve the high-contrast variant of that scheme. Default: `false`. */\n highContrast?: boolean;\n}\n\n/**\n * Glaze-generated color palette for the Cube UI Kit.\n *\n * Produces light, dark, and high-contrast color variants from a single\n * source of truth. Every color token is emitted as a tasty state map:\n *\n * '#surface': { '': 'oklch(...)', '@dark': 'oklch(...)', '@hc': 'oklch(...)' }\n *\n * The `@dark` and `@hc` state aliases are wired up globally in\n * `src/components/Root.tsx` (see `setGlobalPredefinedStates`).\n *\n * This module owns the *recipe* — which colors exist and how each one is\n * positioned relative to its base. The *seeds* it is built from (hue,\n * saturation, pastel, contrast level) live in `./palette-config.ts` and are\n * tunable at runtime; `buildPalette()` below is a pure function of them.\n */\n\n// ============================================================================\n// Recipe constants\n// ============================================================================\n\n// Relative tone ramp from a white surface.\n// Tone is a contrast-uniform 0–100 scale (OKHST). A relative tone delta of -N\n// yields a fixed WCAG contrast step against the base regardless of where the\n// base sits on the scale. These constants form the primary text ramp; the\n// surface-2 / surface-3 variants reuse the same absolute targets via a small\n// offset because their bases are shifted down from `surface`.\nconst TEXT_TONE = -98; // relative tone delta from white surface (~cr 21)\nconst TEXT_SOFT_TONE = -72; // relative tone delta from white surface (~cr 9)\nconst TEXT_SOFT2_TONE = -52; // relative tone delta from white surface (~cr 4.5)\nconst SURFACE_2_TEXT_OFFSET = 2;\nconst SURFACE_3_TEXT_OFFSET = 4;\n\n// Syntax highlighting keeps its own fixed hue reference (see the `code-*` block\n// below). This is the kit's default brand hue, frozen as a literal: string\n// literals were historically purple because the brand is, but they must not\n// follow a re-seeded brand hue — a green brand would collide `code-string` with\n// `code-number` (156°) and make strings and numbers indistinguishable.\nconst CODE_STRING_HUE = 280.3;\n\n/**\n * Saturation factor of the neutral `surface`.\n *\n * Shared with the code theme, which mirrors `surface` to solve its contrast floors\n * against the real page background — the two must not drift apart.\n */\nconst SURFACE_SATURATION = 0.12;\n\nconst TINTED_SURFACE_SATURATION = 0.2;\nconst TINTED_SURFACE_TONE_OFFSET = 2;\n\n/**\n * Syntax highlighting for `PrismCode`, as its own theme.\n *\n * A small palette of *adaptive* colored tokens. Each one is anchored to `surface`\n * with a relative tone plus an `['AA','AAA']` readability floor, so it stays legible\n * in light, dark and high contrast. Hues mirror the long-standing PrismCode\n * reference (pink keywords / pink functions / purple strings / green numbers / gray\n * comments); `code-attribute` keeps cyan for HTML attribute names, CSS properties\n * and selectors, while HTML/XML tag names reuse `code-keyword`. Diff insertion and\n * deletion reuse the `success-*` / `danger-*` ramps instead.\n *\n * Three things are deliberately static here. Every hue is an absolute literal, so a\n * re-seeded brand cannot rotate the syntax palette — a green brand would otherwise\n * collide `code-string` with `code-number` (156°). These factors are relative to\n * the *code* theme's own seed (`themes.code.saturation`), not the palette-level one,\n * so tuning the app's saturation cannot wash out a code block. And `pastel` is held\n * off here whatever the palette does, for the same reason: it lowers the chroma\n * ceiling hard enough to take `code-keyword` from ~0.19 to ~0.07, which is the\n * difference between distinguishable syntax and mud. Between them, these mean the\n * emitted `code-*` values are a function of the code saturation alone.\n *\n * That separate seed is the only reason these live outside the default theme: a\n * theme colour can never exceed its own seed, and four of these sit at factor `1.0`,\n * so they could not hold their chroma inside a default theme seeded below 80.\n */\nconst CODE_COLORS: ColorMap = {\n 'code-comment': {\n base: 'surface',\n hue: 280,\n saturation: 0.1,\n tone: '-50',\n contrast: ['AA', 'AAA'],\n },\n 'code-punctuation': {\n base: 'surface',\n hue: 348,\n saturation: 0.4,\n tone: '-50',\n contrast: ['AA', 'AAA'],\n },\n 'code-keyword': {\n base: 'surface',\n hue: 348,\n saturation: 1,\n tone: '-54',\n contrast: ['AA', 'AAA'],\n },\n 'code-string': {\n base: 'surface',\n hue: CODE_STRING_HUE,\n saturation: 1,\n tone: '-50',\n contrast: ['AA', 'AAA'],\n },\n 'code-number': {\n base: 'surface',\n hue: 156,\n saturation: 0.9,\n tone: '-50',\n contrast: ['AA', 'AAA'],\n },\n 'code-function': {\n base: 'surface',\n hue: 348,\n saturation: 1,\n tone: '-54',\n contrast: ['AA', 'AAA'],\n },\n 'code-attribute': {\n base: 'surface',\n hue: 200,\n saturation: 1,\n tone: '-50',\n contrast: ['AA', 'AAA'],\n },\n};\n\n/**\n * Build the standalone theme the `code-*` tokens live in.\n *\n * Its seed is the code saturation, so {@link CODE_COLORS} keeps its authored factors\n * verbatim and resolves identically at any palette saturation. The mirrored `surface`\n * is an implementation detail — it exists only as the contrast base, and is filtered\n * out of the emitted tokens by {@link pickCodeTokens}.\n *\n * `instanceConfig` arrives with `pastel` pinned off, so the mirror is non-pastel too\n * even when the app is. Harmless: at saturation factor 0.12 the pastel ceiling moves\n * the mirror's chroma and leaves its tone — the axis every `code-*` contrast floor is\n * solved against — bit-identical.\n */\nfunction buildCodeTheme(\n config: ResolvedPaletteConfig,\n instanceConfig: GlazeConfigOverride | undefined,\n): GlazeTheme {\n const codeSaturation = config.themes.code.saturation;\n const theme = glaze(config.hue, codeSaturation, instanceConfig);\n\n // Re-express the default theme's `surface` as a factor of the *code* seed, so it\n // resolves to the same colour the code actually sits on. Written as a ratio of\n // seeds so the default config lands on exactly `SURFACE_SATURATION`.\n let mirrorFactor = SURFACE_SATURATION * (config.saturation / codeSaturation);\n\n if (mirrorFactor > 1) {\n // Only reachable with a code saturation far below the palette's. Glaze would\n // clamp this silently and then solve every contrast floor against the wrong\n // background, so say so.\n // eslint-disable-next-line no-console\n console.warn(\n `[cube-ui-kit] themes.code.saturation (${codeSaturation}) is too low for ` +\n `saturation ${config.saturation}: the mirrored code surface would need a ` +\n `factor of ${mirrorFactor.toFixed(3)}. Clamped to 1; raise the code ` +\n `saturation to keep syntax contrast accurate.`,\n );\n mirrorFactor = 1;\n }\n\n theme.colors({\n surface: { tone: 100, saturation: mirrorFactor },\n ...CODE_COLORS,\n });\n\n return theme;\n}\n\n/** What {@link buildPalette} produces: the themed palette plus the code theme. */\ninterface BuiltPalette {\n palette: GlazePalette;\n codeTheme: GlazeTheme;\n}\n\n/** Drop the mirrored `surface`, keeping only the `code-*` tokens. */\nfunction pickCodeTokens<T>(tokens: Record<string, T>): Record<string, T> {\n const out: Record<string, T> = {};\n\n for (const name of Object.keys(tokens)) {\n if (name.startsWith('code-') || name.startsWith('#code-')) {\n out[name] = tokens[name];\n }\n }\n\n return out;\n}\n\n// ============================================================================\n// Global Glaze configuration\n// ============================================================================\n\nglaze.configure({\n states: {\n dark: '@dark',\n highContrast: '@hc',\n },\n modes: {\n dark: true,\n highContrast: true,\n },\n darkTone: [14, 95],\n darkDesaturation: 0,\n});\n\n/**\n * Per-colored-theme overrides on top of the default theme:\n * - `surface` — bumped saturation so the banner bg is visibly tinted.\n * - `border` — bumped saturation so OUTLINE-variant borders pick up the\n * theme hue (used by `#<theme>-border` in `item-themes.ts`). Mirrors the\n * default-theme `border` shape (`base: 'surface'`, tone window) but\n * with higher saturation. Glaze's `extend({ colors })` redefines each\n * listed color from scratch, so we restate the full definition here.\n */\nconst TINTED_SURFACE_OVERRIDE: ColorMap = {\n surface: {\n tone: [\n 100 - TINTED_SURFACE_TONE_OFFSET,\n 100 - TINTED_SURFACE_TONE_OFFSET * 2,\n ],\n saturation: TINTED_SURFACE_SATURATION,\n },\n border: {\n base: 'surface',\n tone: ['-10', '-30'],\n saturation: 0.3,\n },\n 'surface-text': {\n base: 'surface',\n tone: `${TEXT_TONE - TINTED_SURFACE_TONE_OFFSET}`,\n saturation: 0.25,\n contrast: ['AA', 'AAA'],\n },\n 'surface-text-soft': {\n base: 'surface',\n tone: `${TEXT_SOFT_TONE - TINTED_SURFACE_TONE_OFFSET}`,\n saturation: 0.25,\n contrast: ['AA', 'AAA'],\n },\n 'surface-text-soft-2': {\n base: 'surface',\n tone: `${TEXT_SOFT2_TONE - TINTED_SURFACE_TONE_OFFSET}`,\n saturation: 0.25,\n contrast: ['AA', 'AAA'],\n },\n};\n\n/**\n * A tinted surface, a banding step, and text guaranteed to read on both.\n *\n * The recipe behind {@link getColorTheme} in `./color-theme.ts`, which builds\n * one-off themes at runtime from an arbitrary hue. It lives here so it shares\n * `TINTED_SURFACE_SATURATION`, the tone offsets and the text ramp with\n * {@link TINTED_SURFACE_OVERRIDE} above rather than forking them — a runtime tint\n * and a built-in theme's `surface` should be the same colour for the same hue.\n *\n * Three colours, because that is what banded, readable table column needs:\n * `surface` for even rows, `surface-2` one tone step down for odd rows and\n * pinned totals, and `surface-2-text`.\n *\n * The text is anchored to `surface-2`, not `surface`. `surface-2` has the lower\n * contrast headroom in BOTH schemes — a darker background under dark text in\n * light, a lighter one under light text in dark — so solving the floor there\n * clears it on both bands. The neutral ramp's own `surface-2-text` is shaped the\n * same way for the same reason.\n */\nexport const TINT_RECIPE: ColorMap = {\n surface: {\n tone: [\n 100 - TINTED_SURFACE_TONE_OFFSET,\n 100 - TINTED_SURFACE_TONE_OFFSET * 2,\n ],\n saturation: TINTED_SURFACE_SATURATION,\n },\n 'surface-2': {\n base: 'surface',\n // Mirrors the neutral ramp's step from `surface` to `surface-2`: enough to\n // read as banding down a column, not enough to read as two colours.\n tone: ['-2', '-4'],\n saturation: TINTED_SURFACE_SATURATION,\n },\n 'surface-2-text': {\n base: 'surface-2',\n tone: `${TEXT_TONE - TINTED_SURFACE_TONE_OFFSET - SURFACE_2_TEXT_OFFSET}`,\n saturation: 0.25,\n // The whole point: Glaze binary-searches the tone per scheme until the floor\n // is met, so a caller cannot persist an unreadable pair.\n contrast: ['AA', 'AAA'],\n },\n /**\n * The softer step, for a tinted column HEADER.\n *\n * A neutral header is deliberately muted (`HeadRow` publishes `#dark-03`), so\n * a tinted one taking the full-strength body text read markedly darker than\n * the headers either side of it — measured at 16:1 against their 4.9:1. This\n * keeps the two consistent, and the `AA` floor still applies.\n */\n 'surface-2-text-soft': {\n base: 'surface-2',\n tone: `${TEXT_SOFT_TONE - TINTED_SURFACE_TONE_OFFSET - SURFACE_2_TEXT_OFFSET}`,\n saturation: 0.25,\n contrast: ['AA', 'AAA'],\n },\n};\n\n// ============================================================================\n// Palette construction\n// ============================================================================\n\n/**\n * Build the full palette from a resolved config.\n *\n * Pure: it reads nothing but its argument (and the global Glaze config, which\n * the caller sets first), so re-running it with the same config yields the same\n * tokens. Theme instances are immutable with respect to their hue / saturation\n * seed and a `GlazePalette` has no mutation API, so re-seeding means rebuilding.\n */\nfunction buildPalette(\n config: ResolvedPaletteConfig,\n options: {\n /**\n * Carry `contrastLevel` on the theme instances instead of relying on the\n * global Glaze config. Used when rendering a palette the app is not running,\n * so a preview cannot disturb the live one. The resolved values are the same\n * either way; only which scheme variants get *emitted* differs, and callers\n * that isolate pick their variant explicitly.\n */\n isolateContrastLevel?: boolean;\n } = {},\n): BuiltPalette {\n const { hue, baseHue, saturation, pastel, themes, contrastLevel } = config;\n\n // The one override the code theme shares with the rest of the palette.\n const sharedOverrides: GlazeConfigOverride = options.isolateContrastLevel\n ? { contrastLevel }\n : {};\n\n // `pastel` is instance-level in Glaze (not settable via `glaze.configure`).\n // Setting it on the two root themes is enough: `extend({ config })` merges\n // with the parent's override, so the derived themes inherit it. When it is\n // off we omit the field entirely rather than pass `false` — the two are\n // equivalent, and omitting keeps the default output provably untouched.\n const overrides: GlazeConfigOverride = {\n ...sharedOverrides,\n ...(pastel ? { pastel: true } : null),\n };\n const instanceConfig: GlazeConfigOverride | undefined = Object.keys(overrides)\n .length\n ? overrides\n : undefined;\n\n // `pastel` deliberately does *not* reach the code theme: syntax colors answer\n // to `themes.code.saturation` and nothing else. Pinned to `false` rather than\n // omitted — the same value Glaze defaults to, but here it is the point of the\n // override, not an absence. See {@link buildCodeTheme}.\n const codeInstanceConfig: GlazeConfigOverride = {\n ...sharedOverrides,\n pastel: false,\n };\n\n // --------------------------------------------------------------------------\n // Default theme (neutral, primary in palette → exported unprefixed)\n // --------------------------------------------------------------------------\n\n const defaultTheme = glaze(hue, saturation, instanceConfig);\n\n defaultTheme.colors({\n // ---- Surfaces (neutral, very low saturation) ----\n surface: { tone: 100, saturation: SURFACE_SATURATION, hue: baseHue },\n 'surface-2': {\n hue: baseHue,\n base: 'surface',\n tone: ['-2', '-4'],\n saturation: 0.1,\n inherit: false,\n },\n 'surface-3': {\n hue: baseHue,\n base: 'surface',\n tone: ['-4', '-8'],\n saturation: 0.1,\n inherit: false,\n },\n 'surface-4': {\n hue: baseHue,\n base: 'surface',\n tone: ['-6', '-12'],\n saturation: 0.1,\n inherit: false,\n },\n\n // ---- Text on surfaces ----\n // Tone is the contrast-uniform OKHST axis, so a relative tone delta directly\n // encodes a WCAG contrast step. `surface-text` sits at tone 2 (a -98 delta\n // from white), giving the same near-black appearance as the legacy `#dark`.\n // We still keep an `['AA','AAA']` contrast floor on every text-on-surface\n // color so a future low-contrast scale can shift the ramp down without ever\n // breaking readability.\n 'surface-text': {\n hue: baseHue,\n base: 'surface',\n tone: `${TEXT_TONE - 2}`,\n saturation: 0.2,\n contrast: ['AA', 'AAA'],\n },\n 'surface-text-soft': {\n hue: baseHue,\n base: 'surface',\n tone: `${TEXT_SOFT_TONE - 2}`,\n saturation: 0.2,\n contrast: ['AA', 'AAA'],\n inherit: false,\n },\n 'surface-text-soft-2': {\n hue: baseHue,\n base: 'surface',\n tone: `${TEXT_SOFT2_TONE - 2}`,\n saturation: 0.2,\n contrast: ['AA', 'AAA'],\n inherit: false,\n },\n 'surface-2-text': {\n hue: baseHue,\n base: 'surface-2',\n tone: `${TEXT_TONE + SURFACE_2_TEXT_OFFSET}`,\n saturation: 0.2,\n contrast: ['AA', 'AAA'],\n inherit: false,\n },\n 'surface-2-text-soft': {\n hue: baseHue,\n base: 'surface-2',\n tone: `${TEXT_SOFT_TONE + SURFACE_2_TEXT_OFFSET}`,\n saturation: 0.2,\n contrast: ['AA', 'AAA'],\n inherit: false,\n },\n 'surface-3-text': {\n hue: baseHue,\n base: 'surface-3',\n tone: `${TEXT_TONE + SURFACE_3_TEXT_OFFSET}`,\n saturation: 0.2,\n contrast: ['AA', 'AAA'],\n inherit: false,\n },\n 'surface-3-text-soft': {\n hue: baseHue,\n base: 'surface-3',\n tone: `${TEXT_SOFT_TONE + SURFACE_3_TEXT_OFFSET}`,\n saturation: 0.2,\n contrast: ['AA', 'AAA'],\n inherit: false,\n },\n\n // ---- Other neutral UI primitives (default-only) ----\n border: {\n hue: baseHue,\n base: 'surface',\n tone: ['-10', '-30'],\n saturation: 0.175,\n },\n placeholder: {\n hue: baseHue,\n base: 'surface',\n tone: '-33',\n saturation: 0.175,\n inherit: false,\n },\n focus: {\n base: 'surface',\n tone: '-29',\n saturation: 0.8625,\n inherit: false,\n },\n disabled: {\n tone: 80.8,\n saturation: 0.4,\n inherit: false,\n },\n // Disabled fill chip + text — both adaptive (mode 'auto') and positioned\n // with relative tone deltas against `surface` so the disabled state has the\n // same perceived intensity in light, dark, and high-contrast schemes. No\n // numeric contrast prop is needed: tone is already on a WCAG-uniform scale.\n //\n // Tone deltas reproduce the legacy palette's disabled appearance exactly:\n // the chip sits ~cr 1.11 vs `surface` (a faint greyed pill for\n // OUTLINE/SECONDARY/item disabled states) and the label ~cr 2.02 vs\n // `surface` — intentionally sub-AA so it reads as disabled while staying the\n // same softness clear/link disabled labels had before. PRIMARY-style buttons\n // use the brand-tinted `accent-disabled-*` variants below instead. Both\n // tokens stay default-only (`inherit: false`) — colored themes inherit their\n // own disabled chip via the accent variants.\n 'disabled-surface': {\n hue: baseHue,\n base: 'surface',\n tone: '-3.5',\n saturation: 0.2,\n inherit: false,\n },\n 'disabled-surface-text': {\n base: 'surface',\n tone: '-23',\n saturation: 0.3,\n inherit: false,\n },\n\n // Fixed-mode \"always dark\" surface for elements that intentionally stay\n // inverted regardless of scheme (tooltips, code blocks, popovers with their\n // own dark theme, etc.). `mode: 'fixed'` bypasses the dark-scheme inversion\n // so the color reads as a dark surface in light, dark, and high-contrast.\n // Pair with `#white` (built-in) for foreground text.\n 'surface-inverse': {\n hue: baseHue,\n tone: 12,\n saturation: 0.475,\n mode: 'fixed',\n inherit: false,\n },\n\n // ---- Accent system (theme-aware, inherited by colored themes) ----\n // Everything here is anchored to a fixed white \"accent-surface-text\" via\n // `mode: 'fixed'` + relative tone deltas, so accent colors stay visually\n // consistent across light/dark/high-contrast schemes (the brand color does\n // not flip). The solid fills are white-text-on-brand backgrounds, so they\n // keep an `['AA','AAA']` contrast floor even though the chosen tone deltas\n // already exceed it. This leaves room for a future low-contrast scale.\n 'accent-surface-text': { tone: 100, mode: 'fixed' },\n 'accent-surface': {\n base: 'accent-surface-text',\n tone: '-49',\n contrast: ['AA', 'AAA'],\n mode: 'fixed',\n },\n 'accent-surface-2': {\n base: 'accent-surface-text',\n tone: '-52',\n contrast: ['AA', 'AAA'],\n mode: 'fixed',\n },\n 'accent-surface-3': {\n base: 'accent-surface-text',\n tone: '-55',\n contrast: ['AA', 'AAA'],\n mode: 'fixed',\n },\n // Hover variant of `accent-surface` — a *fixed*-mode darker shade used as\n // the hover fill for solid PRIMARY-type buttons. Anchored to the same\n // accent-surface-text so it stays in the same hue family. The relative tone\n // lands a few steps darker than the pressed state in both schemes.\n 'accent-surface-hover': {\n base: 'accent-surface-text',\n tone: '-58',\n contrast: ['AA', 'AAA'],\n mode: 'fixed',\n },\n // Border for accent surfaces — a small relative tone step away from the\n // brand fill so it stays in the brand hue family and does not flip in dark\n // mode. No contrast prop needed; the delta is chosen directly on the tone\n // scale.\n 'accent-surface-border': {\n base: 'accent-surface',\n tone: '+13',\n mode: 'fixed',\n },\n // Opaque stand-in for the BASE selected fill used by outline / outline-2 /\n // clear Item types (`#surface|#surface-2|#surface-3` + `#accent-surface.09`).\n // Anchors `accent-text` contrast. `value: 9` matches the `.09` alpha overlay;\n // `space: 'srgb'` approximates CSS two-layer compositing. Inherited so\n // colored themes re-resolve against their own `surface` + `accent-surface`\n // (default `surface-2`/`surface-3` are `inherit: false` and can't be the mix\n // base). Primary's tinted `surface` makes this slightly harder than default\n // clear-selected, covering outline / outline-2 selected fills as well.\n 'accent-selected-fill': {\n type: 'mix',\n base: 'surface',\n target: 'accent-surface',\n value: 9,\n space: 'srgb',\n },\n // Stronger brand text for HOVERED selected outline/clear labels and LINK\n // hover. Same anchor + preferred tone as `accent-text-soft`, but a higher\n // `contrast: { wcag: [6, 7] }` floor against `accent-selected-fill` so it\n // reads as a clear step up from the soft rest color while staying saturated\n // (a bare `AAA`/`7` floor over-darkens light and desaturates dark). The HC\n // pair keeps it at/above the soft variant (which auto-promotes AA→AAA in HC).\n // `mode: 'auto'` (default) keeps dark-mode text readable on dark surfaces.\n 'accent-text': {\n base: 'accent-selected-fill',\n tone: '-49',\n saturation: 1,\n contrast: [6, 11],\n },\n // Rest brand text for selected outline/clear labels and LINK base color.\n // Anchored to `accent-selected-fill` with `contrast: 'AA'` — the measured\n // floor for every BASE state of those Item types (surface / outline /\n // outline-2 / clear selected fills). Sits visibly less prominent than\n // `accent-text` (lighter in light, darker in dark) so the rest→hover\n // intensify is real.\n 'accent-text-soft': {\n base: 'accent-selected-fill',\n tone: '-49',\n saturation: 1,\n contrast: ['AA', 'AAA'],\n },\n 'accent-icon': {\n base: 'surface',\n tone: '-38',\n saturation: 0.9375,\n },\n\n // Brand-tinted disabled chip + label for PRIMARY-style buttons (solid brand\n // fill). The chip is scheme-symmetric (`mode: 'fixed'`) so the muted state\n // reads the same weight in light/dark/HC; saturation is bumped so it stays\n // identifiable as a muted brand color.\n //\n // The label rides the extreme away from the chip (`tone: 'max'`, ~cr 1.7):\n // deliberately faint, so it reads as disabled rather than as live text.\n // `'max'` is the authored intent — it was temporarily hand-approximated as a\n // relative `tone: '+15'` with `autoFlip: false`, because Glaze < 1.2.0\n // re-mapped the extreme through the dark tone window, compressing the\n // base-to-extreme span and dropping the dark label's contrast. Glaze 1.2.0\n // (tenphi/glaze#82) instead replays the light scheme's base→extreme tone\n // shift against the base's resolved dark tone — same-signed under\n // `mode: 'fixed'` — so `'max'` holds its intended separation in every scheme\n // and the approximation is no longer needed. Inherited per theme.\n //\n // The special theme keeps its own relative `+18` pair: its `surface` is a\n // fixed dark tone, so an extreme there would resolve to white and read as\n // live text rather than disabled.\n 'accent-disabled-surface': {\n base: 'surface',\n tone: '-13',\n saturation: 0.5,\n mode: 'fixed',\n },\n 'accent-disabled-surface-text': {\n base: 'accent-disabled-surface',\n tone: 'max',\n saturation: 0.4,\n mode: 'fixed',\n },\n\n // ---- Loading-animation cube faces ----\n // Decorative gradient steps from `surface` to a saturated mid-tone. Tone\n // deltas are chosen directly on the contrast-uniform scale; no contrast prop\n // is needed for a non-text decorative element.\n 'loading-face-1': {\n base: 'surface',\n tone: '-2',\n saturation: 0.3,\n inherit: false,\n },\n 'loading-face-2': {\n base: 'surface',\n tone: '-9',\n saturation: 0.62,\n inherit: false,\n },\n 'loading-face-3': {\n base: 'surface',\n tone: '-21',\n saturation: 0.66,\n inherit: false,\n },\n\n // ---- Shadows (default-only) ----\n 'shadow-sm': {\n type: 'shadow',\n bg: 'surface',\n fg: 'surface-text',\n intensity: 5,\n inherit: false,\n },\n 'shadow-md': {\n type: 'shadow',\n bg: 'surface',\n fg: 'surface-text',\n intensity: 10,\n inherit: false,\n },\n 'shadow-lg': {\n type: 'shadow',\n bg: 'surface',\n fg: 'surface-text',\n intensity: 15,\n inherit: false,\n },\n\n // Backdrop overlay (translucent)\n overlay: { tone: 10, opacity: 0.5, inherit: false, hue: baseHue },\n });\n\n // --------------------------------------------------------------------------\n // Colored themes\n // --------------------------------------------------------------------------\n //\n // `primary` is the brand theme: it shares both the accent hue and the palette\n // seed saturation with `default`, and differs only in carrying a tinted surface.\n // Each status theme adds its own hue on top.\n const primaryTheme = defaultTheme.extend({\n colors: TINTED_SURFACE_OVERRIDE,\n });\n const successTheme = defaultTheme.extend({\n hue: themes.success.hue,\n saturation: themes.success.saturation,\n colors: TINTED_SURFACE_OVERRIDE,\n });\n const dangerTheme = defaultTheme.extend({\n hue: themes.danger.hue,\n saturation: themes.danger.saturation,\n colors: TINTED_SURFACE_OVERRIDE,\n });\n const warningTheme = defaultTheme.extend({\n hue: themes.warning.hue,\n saturation: themes.warning.saturation,\n colors: TINTED_SURFACE_OVERRIDE,\n });\n const noteTheme = defaultTheme.extend({\n hue: themes.note.hue,\n saturation: themes.note.saturation,\n colors: TINTED_SURFACE_OVERRIDE,\n });\n\n // --------------------------------------------------------------------------\n // Special theme (fixed-mode, NOT inherited from the default theme)\n // --------------------------------------------------------------------------\n //\n // Standalone theme for `special`-variant components (hero CTAs, banners, etc.)\n // that intentionally sit on a dark surface regardless of the active scheme.\n //\n // Every token here is `mode: 'fixed'` so the resolved value is identical in\n // light, dark, and high-contrast. The shape is purpose-built (not a full\n // mirror of the default theme) — only what `SPECIAL_*_STYLES` in\n // `src/data/item-themes.ts` consumes is emitted. It follows the *primary*\n // seed, since it is the brand-on-dark theme.\n //\n // Token rundown:\n // - `surface` — dark L≈12 backdrop (same value as `#surface-inverse`).\n // - `accent-surface` / `accent-surface-2` / `accent-surface-3` —\n // brand PRIMARY fill ramp (default → hover → pressed). Mirrors the\n // `#primary-accent-surface` / `-2` / `-3` ramp on the colored themes so\n // `SPECIAL_PRIMARY_STYLES.fill` can use the same shape.\n // - `accent-surface-hover` — legacy alias kept around for the\n // `#special-hover` color shortcut in `src/tokens/colors.ts`. Item\n // themes themselves no longer reference it.\n // - `accent-surface-text` — fixed white (= built-in `#white`), exposed\n // for explicit references.\n // - `accent-text` — dark brand foreground readable on white. Used as\n // CLEAR-variant text on the always-white pill, and as the\n // pressed/focused border on the brand primary fill. Matches the\n // legacy `#fixed-primary-text` alias (= `#primary-accent-surface-hover`).\n // - `accent-disabled-surface` / `accent-disabled-surface-text` —\n // brand-tinted disabled chip + label, positioned with relative tone\n // deltas against the fixed dark `surface` so the disabled state is\n // scheme-symmetric.\n\n const specialTheme = glaze(hue, saturation, instanceConfig);\n\n specialTheme.colors({\n surface: { tone: 12, saturation: 0.475, mode: 'fixed' },\n\n 'accent-surface-text': { tone: 100, mode: 'fixed' },\n 'accent-surface': {\n base: 'accent-surface-text',\n tone: '-49',\n contrast: ['AA', 'AAA'],\n mode: 'fixed',\n },\n 'accent-surface-2': {\n base: 'accent-surface-text',\n tone: '-52',\n contrast: ['AA', 'AAA'],\n mode: 'fixed',\n },\n 'accent-surface-3': {\n base: 'accent-surface-text',\n tone: '-55',\n contrast: ['AA', 'AAA'],\n mode: 'fixed',\n },\n 'accent-surface-border': {\n base: 'accent-surface',\n tone: '+13',\n mode: 'fixed',\n },\n 'accent-surface-hover': {\n base: 'accent-surface-text',\n tone: '-58',\n contrast: ['AA', 'AAA'],\n mode: 'fixed',\n },\n 'accent-text': {\n base: 'accent-surface-text',\n tone: '-58',\n contrast: ['AA', 'AAA'],\n mode: 'fixed',\n },\n\n 'accent-disabled-surface': {\n base: 'surface',\n tone: '+4',\n saturation: 0.5,\n mode: 'fixed',\n },\n 'accent-disabled-surface-text': {\n base: 'accent-disabled-surface',\n tone: '+18',\n saturation: 0.4,\n mode: 'fixed',\n },\n });\n\n // --------------------------------------------------------------------------\n // Palette composition\n // --------------------------------------------------------------------------\n //\n // `purple` is the legacy alias for `primary` and resolves to identical tokens\n // (same theme instance, different prefix → no token-value collision).\n //\n // `default` is emitted with an empty prefix (custom map in `getPaletteTokens`),\n // so its tokens appear unprefixed (`#surface`, `#border`, …). All other themes\n // are prefixed with `<themeName>-`.\n return {\n palette: glaze.palette({\n default: defaultTheme,\n primary: primaryTheme,\n purple: primaryTheme,\n success: successTheme,\n danger: dangerTheme,\n warning: warningTheme,\n note: noteTheme,\n special: specialTheme,\n }),\n // Kept out of the palette on purpose: it has to emit `code-*` unprefixed, and\n // its mirrored `surface` would collide with the default theme's.\n codeTheme: buildCodeTheme(config, codeInstanceConfig),\n };\n}\n\n// ============================================================================\n// Tasty-formatted token export\n// ============================================================================\n\nconst TOKEN_PREFIXES = {\n default: '',\n primary: 'primary-',\n purple: 'purple-',\n success: 'success-',\n danger: 'danger-',\n warning: 'warning-',\n note: 'note-',\n special: 'special-',\n};\n\nlet paletteCache: GlazePalette | null = null;\nlet codeThemeCache: GlazeTheme | null = null;\nlet paletteTokensCache: Styles | null = null;\nlet cachedVersion = -1;\n\n/**\n * Whether *we* are the ones holding a manual level in Glaze's global config.\n *\n * `contrastLevel` is the one palette option that has to be global: a global\n * level pins `modes.highContrast: false` so no high-contrast tier is emitted at\n * all (which is the point — a manual level already carries the preference),\n * whereas a per-instance level would leave the tier in place and report its own\n * values there. `palette.tasty({ modes })` cannot override that either.\n *\n * Being global means it is shared with the host app, so we only write it when\n * asked. A host that sets its own `glaze.configure({ contrastLevel })` and never\n * touches `setPaletteConfig({ contrastLevel })` keeps its level — without this\n * flag we would silently reset it to `'auto'` on the first token read.\n */\nlet ownsContrastLevel = false;\n\nfunction applyContrastLevel(contrastLevel: number | 'auto') {\n // Nothing to do: we hold no level, and the config does not ask for one.\n if (contrastLevel === 'auto' && !ownsContrastLevel) return;\n\n // Always explicit — `configure()` never clears a field by omission, so\n // returning to `'auto'` has to say so.\n glaze.configure({ contrastLevel });\n ownsContrastLevel = contrastLevel !== 'auto';\n}\n\nfunction refresh() {\n const version = getPaletteVersion();\n\n if (paletteTokensCache && cachedVersion === version) return;\n\n const config = getPaletteConfig();\n\n applyContrastLevel(config.contrastLevel);\n\n const built = buildPalette(config);\n\n paletteCache = built.palette;\n paletteTokensCache = {\n ...built.palette.tasty({ prefix: TOKEN_PREFIXES, format: 'oklch' }),\n ...pickCodeTokens(built.codeTheme.tasty({ format: 'oklch' })),\n } as Styles;\n codeThemeCache = built.codeTheme;\n cachedVersion = version;\n}\n\n/**\n * Resolve Glaze palette tokens against the current palette config.\n *\n * Memoized against the config version (see `./palette-config.ts`), so repeated\n * reads are free and `setPaletteConfig()` invalidates them. Resolution is\n * deferred rather than done at module import, so host apps can call\n * `setPaletteConfig(...)` / `glaze.configure(...)` after importing\n * `@cube-dev/ui-kit` and still affect the first paint.\n *\n * Keys use `#name` syntax; values are state maps:\n * '#surface': { '': 'oklch(...)', '@dark': 'oklch(...)', '@hc': 'oklch(...)' }\n */\nexport function getPaletteTokens(): Styles {\n refresh();\n\n return paletteTokensCache!;\n}\n\n/** The live `GlazePalette`. Rebuilt whenever the palette config changes. */\nexport function getPalette(): GlazePalette {\n refresh();\n\n return paletteCache!;\n}\n\n/**\n * The live theme behind the `code-*` tokens. Separate from {@link getPalette}\n * because it carries its own saturation seed — see {@link CODE_COLORS}.\n */\nexport function getCodeTheme(): GlazeTheme {\n refresh();\n\n return codeThemeCache!;\n}\n\n// ============================================================================\n// One-variant render (for previewing a palette on a region)\n// ============================================================================\n\nconst VARIANT_KEY = {\n 'light:false': 'light',\n 'light:true': 'lightContrast',\n 'dark:false': 'dark',\n 'dark:true': 'darkContrast',\n} as const;\n\n/**\n * Single-entry memo: all four variants of the last config rendered.\n *\n * Keyed on the palette version as well as the config, because the config is not\n * the only input — `buildPalette` also reads Glaze's own global config\n * (`darkTone`, `darkDesaturation`, the state map). A host that drives Glaze\n * directly and then calls `invalidatePaletteTokens()` bumps the version without\n * touching the config, and the region previews have to follow the document.\n */\nlet renderKey: string | null = null;\nlet renderVariants: Record<string, Record<string, string>> = {};\n\n/**\n * Resolve one scheme variant of a palette to flat, literal color values.\n *\n * Unlike {@link getPaletteTokens}, which emits state maps (`@dark` / `@hc`) for\n * the whole document, this collapses the palette to the single variant you ask\n * for. That is what makes a **region** preview possible: applied through a tasty\n * `tokens` prop, the values override the inherited ones for that subtree only, so\n * a dark or high-contrast theme can be shown inside a light page.\n *\n * Prefer `renderColorTokens()` from `./colors` unless you specifically want the\n * palette without the legacy aliases.\n */\nexport function renderPaletteTokens(\n options: RenderPaletteOptions = {},\n): Tokens {\n const { scheme = 'light', highContrast = false, ...config } = options;\n const resolved = resolvePaletteConfig(config);\n const key = `${getPaletteVersion()}:${JSON.stringify(resolved)}`;\n\n if (renderKey !== key) {\n // Force the *global* level to `'auto'` for the duration of the export.\n // Glaze suppresses high-contrast output whenever a global level is set, and\n // that check reads the global config — so without this, a preview's variants\n // would depend on whatever contrast mode the surrounding app happens to be\n // in. The preview's own level rides on the theme instances instead\n // (`isolateContrastLevel`), so the values stay correct. Restored in `finally`;\n // resolution is synchronous, so nothing can observe the window.\n const previousLevel = glaze.getConfig().contrastLevel;\n\n try {\n glaze.configure({ contrastLevel: 'auto' });\n\n const built = buildPalette(resolved, { isolateContrastLevel: true });\n const modes = { dark: true, highContrast: true };\n const themed = built.palette.tokens({\n prefix: TOKEN_PREFIXES,\n format: 'oklch',\n modes,\n });\n const code = built.codeTheme.tokens({ format: 'oklch', modes });\n\n // Built into a local and published together, so a throw part-way through\n // cannot leave a half-filled map sitting under the previous key.\n const variants: typeof renderVariants = {};\n\n for (const name of Object.keys(themed)) {\n variants[name] = {\n ...themed[name],\n ...pickCodeTokens(code[name] ?? {}),\n };\n }\n\n renderVariants = variants;\n renderKey = key;\n } finally {\n glaze.configure({ contrastLevel: previousLevel });\n }\n }\n\n const variant = VARIANT_KEY[`${scheme}:${highContrast}`];\n // A manual `contrastLevel` leaves no separate high-contrast tier — Glaze\n // mirrors the contrast variants onto the normal ones — so asking for\n // `highContrast` there correctly yields the same colors.\n const flat = renderVariants[variant] ?? renderVariants[scheme];\n const out: Tokens = {};\n\n for (const name of Object.keys(flat)) out[`#${name}`] = flat[name];\n\n return out;\n}\n\n/**\n * Lazy proxy of {@link getPaletteTokens}. Prefer `getPaletteTokens()` in new\n * code. Property / enumeration access always reflects the current palette\n * config.\n */\nexport const PALETTE_TOKENS: Styles = lazyStyles(getPaletteTokens);\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"palette.js","names":[],"sources":["../../src/tokens/palette.ts"],"sourcesContent":["import { glaze } from '@tenphi/glaze';\n\nimport { lazyStyles } from './lazy-styles';\nimport {\n getPaletteConfig,\n getPaletteVersion,\n resolvePaletteConfig,\n SURFACE_SATURATION_SHARE,\n} from './palette-config';\n\nimport type {\n ColorMap,\n GlazeConfigOverride,\n GlazePalette,\n GlazeTheme,\n} from '@tenphi/glaze';\nimport type { Styles, Tokens } from '@tenphi/tasty';\nimport type { PaletteConfig, ResolvedPaletteConfig } from './palette-config';\n\n/** Which resolved scheme variant {@link renderPaletteTokens} should return. */\nexport interface RenderPaletteOptions extends PaletteConfig {\n /** Color scheme to resolve. Default: `'light'`. */\n scheme?: 'light' | 'dark';\n /** Resolve the high-contrast variant of that scheme. Default: `false`. */\n highContrast?: boolean;\n}\n\n/**\n * Glaze-generated color palette for the Cube UI Kit.\n *\n * Produces light, dark, and high-contrast color variants from a single\n * source of truth. Every color token is emitted as a tasty state map:\n *\n * '#surface': { '': 'oklch(...)', '@dark': 'oklch(...)', '@hc': 'oklch(...)' }\n *\n * The `@dark` and `@hc` state aliases are wired up globally in\n * `src/components/Root.tsx` (see `setGlobalPredefinedStates`).\n *\n * This module owns the *recipe* — which colors exist and how each one is\n * positioned relative to its base. The *seeds* it is built from (hue,\n * saturation, pastel, contrast level) live in `./palette-config.ts` and are\n * tunable at runtime; `buildPalette()` below is a pure function of them.\n */\n\n// ============================================================================\n// Recipe constants\n// ============================================================================\n\n// Relative tone ramp from a white surface.\n// Tone is a contrast-uniform 0–100 scale (OKHST). A relative tone delta of -N\n// yields a fixed WCAG contrast step against the base regardless of where the\n// base sits on the scale. These constants form the primary text ramp; the\n// surface-2 / surface-3 variants reuse the same absolute targets via a small\n// offset because their bases are shifted down from `surface`.\nconst TEXT_TONE = -98; // relative tone delta from white surface (~cr 21)\nconst TEXT_SOFT_TONE = -72; // relative tone delta from white surface (~cr 9)\nconst TEXT_SOFT2_TONE = -52; // relative tone delta from white surface (~cr 4.5)\nconst SURFACE_2_TEXT_OFFSET = 2;\nconst SURFACE_3_TEXT_OFFSET = 4;\n\n// Syntax highlighting keeps its own fixed hue reference (see the `code-*` block\n// below). This is the kit's default brand hue, frozen as a literal: string\n// literals were historically purple because the brand is, but they must not\n// follow a re-seeded brand hue — a green brand would collide `code-string` with\n// `code-number` (156°) and make strings and numbers indistinguishable.\nconst CODE_STRING_HUE = 280.3;\n\n/**\n * Saturation factor of the neutral `surface`.\n *\n * Shared with the code theme, which mirrors `surface` to solve its contrast floors\n * against the real page background — the two must not drift apart. Shared with the\n * config too, which needs it to work out the share of the accent zone's chroma the\n * chrome takes when no `baseColor` names one outright; it lives there because the\n * config cannot import from here, and is re-exported under this name because that is\n * what the recipe calls it.\n */\nconst SURFACE_SATURATION = SURFACE_SATURATION_SHARE;\n\nconst TINTED_SURFACE_SATURATION = 0.2;\nconst TINTED_SURFACE_TONE_OFFSET = 2;\n\n/**\n * How far `surfaceMode: 'tinted'` moves the neutral ramp off the end of the tone\n * scale.\n *\n * Small on purpose. Two tones is below the threshold where a page reads as\n * \"grey\" rather than \"white\", and it is not lightness this buys: chroma needs\n * distance from the extreme to exist at all, so at tone 100 a light surface is\n * white whatever saturation it asks for. Two tones is the cheapest room in which\n * the base hue becomes visible.\n *\n * Everything under `surface` is positioned relative to it, so the shift carries\n * the whole ladder — and the text ramp's contrast floors re-solve against the new\n * background instead of drifting.\n */\nconst TINTED_SURFACE_TONE_SHIFT = 2;\n\n/** Tone of the neutral `surface`, per {@link ResolvedPaletteConfig.surfaceMode}. */\nfunction surfaceTone(config: ResolvedPaletteConfig): number {\n return config.surfaceMode === 'tinted'\n ? 100 - TINTED_SURFACE_TONE_SHIFT\n : 100;\n}\n\n/**\n * Tone of a TINTED `surface` — a status theme's, or a runtime tint's —\n * as `[light, highContrast]`.\n *\n * A tinted surface is a banner sitting *on* the page, so its tone is authored as\n * an offset from the page's rather than as an absolute. Under\n * `surfaceMode: 'tinted'` the page itself moves down to 98, which is exactly where\n * these used to sit: a `note` banner would come out the same tone as the surface\n * behind it and stop reading as a banner at all. Anchoring both on\n * {@link surfaceTone} keeps the separation the offset was chosen for.\n *\n * The text ramps on these themes are relative (`base: 'surface'`), so they follow\n * on their own — only the absolute tone needs the anchor.\n */\nfunction tintedSurfaceTone(config: ResolvedPaletteConfig): [number, number] {\n const page = surfaceTone(config);\n\n return [\n page - TINTED_SURFACE_TONE_OFFSET,\n page - TINTED_SURFACE_TONE_OFFSET * 2,\n ];\n}\n\n/**\n * Rescale the base-zone saturation factors onto the base zone's own seed.\n *\n * Every color's `saturation` is a 0–1 factor of its **theme's** seed, and the\n * neutral family shares a theme instance with the accent one — it has to, since\n * `accent-surface` is positioned against `surface`. A separate base seed therefore\n * cannot be a second theme; it arrives as a scale over the authored factors.\n *\n * The scale is anchored on `surface`: dividing by `SURFACE_SATURATION` turns each\n * factor into its share *of the surface's tint*, and multiplying by\n * `baseSaturation / saturation` re-expresses that share against the base seed.\n * `surface` therefore lands on exactly `baseSaturation` on the 0–100 scale, and\n * every sibling keeps its proportion to it. At the shipped\n * `baseSaturation = saturation × 0.12` the scale is `1` and nothing moves.\n *\n * Clamped because Glaze reads the factor as 0–1, which is also why the proportions\n * converge at the top: `surface-inverse` (the highest at `0.475`) saturates first,\n * around `baseSaturation: 25`.\n *\n * A palette seed of `0` leaves no chroma for any factor to scale, so the base zone\n * is grey there whatever it asks for — the ceiling belongs to the theme instance,\n * not to this scale.\n */\nfunction baseSaturationScale(config: ResolvedPaletteConfig): number {\n return config.saturation > 0\n ? config.baseSaturation / (SURFACE_SATURATION * config.saturation)\n : 0;\n}\n\n/**\n * Contrast floors for a pinned brand color: `[normal, highContrast]`.\n *\n * `3` is WCAG's non-text floor — enough that the button reads as a shape against the\n * page, and low enough that most brands clear it untouched. It is a FLOOR and not a\n * target: a brand already at 5:1 or 17:1 is emitted exactly as given. Lower would let a\n * fill vanish into the page; the shipped `['AA','AAA']` is too high to survive a light\n * brand at all (it crushes `#FFD400` from tone 88 to 50).\n *\n * The high-contrast entry stays at AAA regardless. Fidelity to a requested color is a\n * preference; the high-contrast tier is not — it exists for users who cannot read the\n * normal one, and it is selected by `prefers-contrast: more` or an explicit\n * `data-contrast=\"high\"`, so anyone seeing it has asked for separation over brand.\n * Note the pair also means an unreachable HC target is a real possibility for a very\n * light brand, and Glaze pins it to the nearest tone and warns rather than failing.\n */\nconst ACCENT_FILL_CONTRAST: [number, number] = [3, 7];\n\n/**\n * Floors for the two brand TEXT tokens: rest, then hover.\n *\n * The normal entries relax so a vivid brand can be the actual link color. The\n * high-contrast entries do not — same reasoning as {@link ACCENT_FILL_CONTRAST} — and\n * they stay one step apart so the rest→hover intensify survives the tier that needs it\n * most. A single shared HC number would collapse the pair onto one color: both would\n * simply solve to it.\n *\n * The hover's `9` is measured, not chosen for roundness. It is the highest target\n * reachable across `#7A4DBF` `#EF4444` `#0EA5E9` `#22C55E` `#FFD400` `#111827` in both\n * high-contrast schemes, and it holds a ~2.0 gap over the rest color in every one. The\n * shipped `11` is not usable here: 11:1 from a fully saturated hue against a chromatic\n * `accent-selected-fill` is unreachable, and `#FFD400` in dark high contrast pins to\n * pure black — a hover link *less* readable than its rest state, at 2.23 against 7.07.\n * The shipped palette can afford 11 because its fill is a desaturated mix; a pinned\n * brand color is not.\n */\nconst ACCENT_TEXT_CONTRAST: [number, number] = [3, 7];\nconst ACCENT_TEXT_HOVER_CONTRAST: [number, number] = [4.5, 9];\n\n/**\n * Tone steps of the brand fill ramp, measured from `accent-surface`.\n *\n * They reproduce the white-anchored `-49 / -52 / -55 / -58` ladder exactly once the\n * fill is pinned, because those four deltas share an anchor and differ by 3 / 6 / 9.\n */\nconst ACCENT_RAMP = {\n surface2: '-3',\n surface3: '-6',\n hover: '-9',\n} as const;\n\n/**\n * How far the hover brand text sits past the rest one, in tone.\n *\n * Both are pinned to the caller's tone otherwise, and a pair at the same tone behind\n * the same floor resolves to one color — which would silently delete the rest→hover\n * intensify that `accent-text` exists for. Tone is contrast-uniform, so one step is\n * one step in either scheme.\n */\nconst ACCENT_TEXT_HOVER_STEP = 6;\n\n/**\n * The caller's brand color, or `null` for the shipped derivation.\n *\n * Carries the literal — which is what Glaze's `from` consumes — alongside its tone,\n * because {@link ACCENT_TEXT_HOVER_STEP} needs the number to compute a step past it.\n */\ntype AccentSeed = { color: string; tone: number } | null;\n\n/**\n * Opaque stand-in for the BASE selected fill used by outline / outline-2 / clear Item\n * types (`#surface|#surface-2|#surface-3` + `#accent-surface.09`).\n *\n * Anchors the `accent-text*` contrast. `value: 9` matches the `.09` alpha overlay;\n * `space: 'srgb'` approximates CSS two-layer compositing. Inherited so colored themes\n * re-resolve against their own `surface` + `accent-surface` (default `surface-2` /\n * `surface-3` are `inherit: false` and can't be the mix base). Primary's tinted\n * `surface` makes this slightly harder than default clear-selected, covering\n * outline / outline-2 selected fills as well.\n *\n * The same in both accent arrangements — it is defined by its two ends, and both of\n * those move with the seed on their own.\n */\nconst ACCENT_SELECTED_FILL: ColorMap = {\n 'accent-selected-fill': {\n type: 'mix',\n base: 'surface',\n target: 'accent-surface',\n value: 9,\n space: 'srgb',\n },\n};\n\n/**\n * Syntax highlighting for `PrismCode`, as its own theme.\n *\n * A small palette of *adaptive* colored tokens. Each one is anchored to `surface`\n * with a relative tone plus an `['AA','AAA']` readability floor, so it stays legible\n * in light, dark and high contrast. Hues mirror the long-standing PrismCode\n * reference (pink keywords / pink functions / purple strings / green numbers / gray\n * comments); `code-attribute` keeps cyan for HTML attribute names, CSS properties\n * and selectors, while HTML/XML tag names reuse `code-keyword`. Diff insertion and\n * deletion reuse the `success-*` / `danger-*` ramps instead.\n *\n * Three things are deliberately static here. Every hue is an absolute literal, so a\n * re-seeded brand cannot rotate the syntax palette — a green brand would otherwise\n * collide `code-string` with `code-number` (156°). These factors are relative to\n * the *code* theme's own seed (`themes.code.saturation`), not the palette-level one,\n * so tuning the app's saturation cannot wash out a code block. And `pastel` is held\n * off here whatever the palette does, for the same reason: it lowers the chroma\n * ceiling hard enough to take `code-keyword` from ~0.19 to ~0.07, which is the\n * difference between distinguishable syntax and mud. Between them, these mean the\n * emitted `code-*` values are a function of the code saturation alone.\n *\n * That separate seed is the only reason these live outside the default theme: a\n * theme colour can never exceed its own seed, and four of these sit at factor `1.0`,\n * so they could not hold their chroma inside a default theme seeded below 80.\n */\nconst CODE_COLORS: ColorMap = {\n 'code-comment': {\n base: 'surface',\n hue: 280,\n saturation: 0.1,\n tone: '-50',\n contrast: ['AA', 'AAA'],\n },\n 'code-punctuation': {\n base: 'surface',\n hue: 348,\n saturation: 0.4,\n tone: '-50',\n contrast: ['AA', 'AAA'],\n },\n 'code-keyword': {\n base: 'surface',\n hue: 348,\n saturation: 1,\n tone: '-54',\n contrast: ['AA', 'AAA'],\n },\n 'code-string': {\n base: 'surface',\n hue: CODE_STRING_HUE,\n saturation: 1,\n tone: '-50',\n contrast: ['AA', 'AAA'],\n },\n 'code-number': {\n base: 'surface',\n hue: 156,\n saturation: 0.9,\n tone: '-50',\n contrast: ['AA', 'AAA'],\n },\n 'code-function': {\n base: 'surface',\n hue: 348,\n saturation: 1,\n tone: '-54',\n contrast: ['AA', 'AAA'],\n },\n 'code-attribute': {\n base: 'surface',\n hue: 200,\n saturation: 1,\n tone: '-50',\n contrast: ['AA', 'AAA'],\n },\n};\n\n/**\n * Build the standalone theme the `code-*` tokens live in.\n *\n * Its seed is the code saturation, so {@link CODE_COLORS} keeps its authored factors\n * verbatim and resolves identically at any palette saturation. The mirrored `surface`\n * is an implementation detail — it exists only as the contrast base, and is filtered\n * out of the emitted tokens by {@link pickCodeTokens}.\n *\n * `instanceConfig` arrives with `pastel` pinned off, so the mirror is non-pastel too\n * even when the app is. Harmless: at saturation factor 0.12 the pastel ceiling moves\n * the mirror's chroma and leaves its tone — the axis every `code-*` contrast floor is\n * solved against — bit-identical.\n */\nfunction buildCodeTheme(\n config: ResolvedPaletteConfig,\n instanceConfig: GlazeConfigOverride | undefined,\n): GlazeTheme {\n const codeSaturation = config.themes.code.saturation;\n const theme = glaze(config.hue, codeSaturation, instanceConfig);\n\n // Re-express the default theme's `surface` as a factor of the *code* seed, so it\n // resolves to the same colour the code actually sits on.\n //\n // The BASE seed, not the palette one: the real `surface` takes its chroma from\n // the base zone, and a mirror that tracked the palette seed would solve every\n // syntax contrast floor against a background the page does not have. `surface`\n // lands on exactly `baseSaturation` on the 0–100 scale, so the ratio of the two\n // seeds *is* the factor — there is no `SURFACE_SATURATION` left to apply.\n let mirrorFactor = config.baseSaturation / codeSaturation;\n\n if (mirrorFactor > 1) {\n // Glaze would clamp this silently and then solve every contrast floor against a\n // background the page does not have, so say so.\n //\n // Closer to reach than it used to be: a `baseColor` can push `baseSaturation` to\n // `MAX_BASE_SATURATION`, so any code saturation under 50 now trips it where it\n // previously took a `baseSaturation` above 80. `Slate` sits at 55 — a five-point\n // margin — so treat that number as load-bearing when tuning the preset.\n //\n // Deliberately NOT deduped once-per-process. It fires per token-cache miss, so a\n // drag over a misconfigured pair is noisy — but the flag would also have to\n // survive `resetPaletteConfig`, which is what a caller does to get back to a\n // config that warns again legitimately. The narrow noise is the better trade.\n // eslint-disable-next-line no-console\n console.warn(\n `[cube-ui-kit] themes.code.saturation (${codeSaturation}) is too low for ` +\n `baseSaturation ${config.baseSaturation}: the mirrored code surface would ` +\n `need a factor of ${mirrorFactor.toFixed(3)}. Clamped to 1; raise the code ` +\n `saturation to keep syntax contrast accurate.`,\n );\n mirrorFactor = 1;\n }\n\n theme.colors({\n // Tone as well as chroma: under `surfaceMode: 'tinted'` the page moved two\n // tones off the extreme, and the mirror exists to be the page.\n surface: { tone: surfaceTone(config), saturation: mirrorFactor },\n ...CODE_COLORS,\n });\n\n return theme;\n}\n\n/** What {@link buildPalette} produces: the themed palette plus the code theme. */\ninterface BuiltPalette {\n palette: GlazePalette;\n codeTheme: GlazeTheme;\n}\n\n/** Drop the mirrored `surface`, keeping only the `code-*` tokens. */\nfunction pickCodeTokens<T>(tokens: Record<string, T>): Record<string, T> {\n const out: Record<string, T> = {};\n\n for (const name of Object.keys(tokens)) {\n if (name.startsWith('code-') || name.startsWith('#code-')) {\n out[name] = tokens[name];\n }\n }\n\n return out;\n}\n\n// ============================================================================\n// Global Glaze configuration\n// ============================================================================\n\nglaze.configure({\n states: {\n dark: '@dark',\n highContrast: '@hc',\n },\n modes: {\n dark: true,\n highContrast: true,\n },\n darkTone: [14, 95],\n darkDesaturation: 0,\n});\n\n/**\n * The config-free half of a colored theme's overrides — everything anchored to\n * the theme's own `surface` with a *relative* tone, so it follows wherever\n * {@link tintedSurfaceTone} puts that surface.\n *\n * - `border` — bumped saturation so OUTLINE-variant borders pick up the theme\n * hue (used by `#<theme>-border` in `item-themes.ts`). Mirrors the\n * default-theme `border` shape (`base: 'surface'`, tone window) but with\n * higher saturation. Glaze's `extend({ colors })` redefines each listed color\n * from scratch, so we restate the full definition here.\n */\nconst TINTED_SURFACE_RAMP: ColorMap = {\n border: {\n base: 'surface',\n tone: ['-10', '-30'],\n saturation: 0.3,\n },\n 'surface-text': {\n base: 'surface',\n tone: `${TEXT_TONE - TINTED_SURFACE_TONE_OFFSET}`,\n saturation: 0.25,\n contrast: ['AA', 'AAA'],\n },\n 'surface-text-soft': {\n base: 'surface',\n tone: `${TEXT_SOFT_TONE - TINTED_SURFACE_TONE_OFFSET}`,\n saturation: 0.25,\n contrast: ['AA', 'AAA'],\n },\n 'surface-text-soft-2': {\n base: 'surface',\n tone: `${TEXT_SOFT2_TONE - TINTED_SURFACE_TONE_OFFSET}`,\n saturation: 0.25,\n contrast: ['AA', 'AAA'],\n },\n};\n\n/**\n * Per-colored-theme overrides on top of the default theme: a `surface` bumped in\n * saturation so the banner background is visibly tinted, plus\n * {@link TINTED_SURFACE_RAMP}.\n *\n * A function of the config because the surface's tone is — see\n * {@link tintedSurfaceTone}.\n */\nfunction tintedSurfaceOverride(config: ResolvedPaletteConfig): ColorMap {\n return {\n surface: {\n tone: tintedSurfaceTone(config),\n saturation: TINTED_SURFACE_SATURATION,\n },\n ...TINTED_SURFACE_RAMP,\n };\n}\n\n/**\n * A tinted surface, a banding step, and text guaranteed to read on both.\n *\n * The recipe behind {@link getColorTheme} in `./color-theme.ts`, which builds\n * one-off themes at runtime from an arbitrary hue. It lives here so it shares\n * `TINTED_SURFACE_SATURATION`, the tone offsets and the text ramp with\n * {@link tintedSurfaceOverride} above rather than forking them — a runtime tint\n * and a built-in theme's `surface` should be the same colour for the same hue,\n * which also means both have to follow the page when `surfaceMode` moves it.\n *\n * Three colours, because that is what banded, readable table column needs:\n * `surface` for even rows, `surface-2` one tone step down for odd rows and\n * pinned totals, and `surface-2-text`.\n *\n * The text is anchored to `surface-2`, not `surface`. `surface-2` has the lower\n * contrast headroom in BOTH schemes — a darker background under dark text in\n * light, a lighter one under light text in dark — so solving the floor there\n * clears it on both bands. The neutral ramp's own `surface-2-text` is shaped the\n * same way for the same reason.\n */\nexport function tintRecipe(config: ResolvedPaletteConfig): ColorMap {\n return {\n surface: {\n tone: tintedSurfaceTone(config),\n saturation: TINTED_SURFACE_SATURATION,\n },\n 'surface-2': {\n base: 'surface',\n // Mirrors the neutral ramp's step from `surface` to `surface-2`: enough to\n // read as banding down a column, not enough to read as two colours.\n tone: ['-2', '-4'],\n saturation: TINTED_SURFACE_SATURATION,\n },\n 'surface-2-text': {\n base: 'surface-2',\n tone: `${TEXT_TONE - TINTED_SURFACE_TONE_OFFSET - SURFACE_2_TEXT_OFFSET}`,\n saturation: 0.25,\n // The whole point: Glaze binary-searches the tone per scheme until the floor\n // is met, so a caller cannot persist an unreadable pair.\n contrast: ['AA', 'AAA'],\n },\n /**\n * The softer step, for a tinted column HEADER.\n *\n * A neutral header is deliberately muted (`HeadRow` publishes `#dark-03`), so\n * a tinted one taking the full-strength body text read markedly darker than\n * the headers either side of it — measured at 16:1 against their 4.9:1. This\n * keeps the two consistent, and the `AA` floor still applies.\n */\n 'surface-2-text-soft': {\n base: 'surface-2',\n tone: `${TEXT_SOFT_TONE - TINTED_SURFACE_TONE_OFFSET - SURFACE_2_TEXT_OFFSET}`,\n saturation: 0.25,\n contrast: ['AA', 'AAA'],\n },\n };\n}\n\n// ============================================================================\n// The accent system\n// ============================================================================\n\n/**\n * The brand family, in one of two arrangements.\n *\n * **`null`** — the shipped one, verbatim. Every fill hangs off a fixed white\n * `accent-surface-text` at a relative tone delta behind an `['AA','AAA']` floor, and\n * the text pair hangs off `accent-selected-fill` at `-49`. Those floors are\n * load-bearing rather than decorative: relaxing them moves the shipped `accent-text`\n * light tone from 38.76 to 48.63 and the `accent-surface` high-contrast tone from\n * 36.08 to 51.00. Nothing on this path may change — `palette.test.ts` snapshots it.\n *\n * **A color** — the caller handed us one, and the job is to render *that*. Glaze's\n * `from` takes the value directly: it supplies the hue, the tone, and an absolute\n * saturation that does not answer to the theme seed, and it reproduces the value\n * exactly in the light/normal-contrast variant. The floors drop to\n * {@link ACCENT_FILL_CONTRAST} on top, because anchored the shipped way every accent\n * lands at roughly tone 50 whatever went in, and a 4.5 floor then crushes anything\n * light besides.\n *\n * Two details worth keeping straight:\n *\n * - **The ramp carries no floor.** Re-anchored onto the fill, an `['AA','AAA']` floor\n * is measured against the *fill* rather than white and collapses all three steps to\n * near-black. A plain tone step is what the relationship actually is.\n * - **The text pair stays `mode: 'auto'`.** Link text has to invert on a dark page, so\n * exactness belongs to the fill; the text is a brand-toned companion of it.\n */\nfunction accentFillColors(accent: AccentSeed): ColorMap {\n if (accent == null) {\n return {\n // ---- Accent system (theme-aware, inherited by colored themes) ----\n // Everything here is anchored to a fixed white \"accent-surface-text\" via\n // `mode: 'fixed'` + relative tone deltas, so accent colors stay visually\n // consistent across light/dark/high-contrast schemes (the brand color does\n // not flip). The solid fills are white-text-on-brand backgrounds, so they\n // keep an `['AA','AAA']` contrast floor even though the chosen tone deltas\n // already exceed it. This leaves room for a future low-contrast scale.\n 'accent-surface-text': { tone: 100, mode: 'fixed' },\n 'accent-surface': {\n base: 'accent-surface-text',\n tone: '-49',\n contrast: ['AA', 'AAA'],\n mode: 'fixed',\n },\n 'accent-surface-2': {\n base: 'accent-surface-text',\n tone: '-52',\n contrast: ['AA', 'AAA'],\n mode: 'fixed',\n },\n 'accent-surface-3': {\n base: 'accent-surface-text',\n tone: '-55',\n contrast: ['AA', 'AAA'],\n mode: 'fixed',\n },\n // Hover variant of `accent-surface` — a *fixed*-mode darker shade used as\n // the hover fill for solid PRIMARY-type buttons. Anchored to the same\n // accent-surface-text so it stays in the same hue family. The relative tone\n // lands a few steps darker than the pressed state in both schemes.\n 'accent-surface-hover': {\n base: 'accent-surface-text',\n tone: '-58',\n contrast: ['AA', 'AAA'],\n mode: 'fixed',\n },\n // Border for accent surfaces — a small relative tone step away from the\n // brand fill so it stays in the brand hue family and does not flip in dark\n // mode. No contrast prop needed; the delta is chosen directly on the tone\n // scale.\n 'accent-surface-border': {\n base: 'accent-surface',\n tone: '+13',\n mode: 'fixed',\n },\n };\n }\n\n return {\n // Still a hard white root, and still the PRIMARY label: every `type=\"primary\"`\n // item in `src/data/item-themes.ts` writes `#white` directly. That is exactly what\n // ACCENT_FILL_CONTRAST protects — the fill is held far enough off the page that a\n // white label keeps working on it.\n 'accent-surface-text': { tone: 100, mode: 'fixed' },\n 'accent-surface': {\n from: accent.color,\n base: 'surface',\n contrast: ACCENT_FILL_CONTRAST,\n mode: 'fixed',\n },\n 'accent-surface-2': {\n base: 'accent-surface',\n tone: ACCENT_RAMP.surface2,\n mode: 'fixed',\n },\n 'accent-surface-3': {\n base: 'accent-surface',\n tone: ACCENT_RAMP.surface3,\n mode: 'fixed',\n },\n 'accent-surface-hover': {\n base: 'accent-surface',\n tone: ACCENT_RAMP.hover,\n mode: 'fixed',\n },\n // `'+13'` overshoots 100 on a light brand and `autoFlip` mirrors it to `-13`,\n // which is the right answer either way: a border on a light fill has to be the\n // darker of the two (`#FFD400` → `#d3af00`).\n 'accent-surface-border': {\n base: 'accent-surface',\n tone: '+13',\n mode: 'fixed',\n },\n };\n}\n\n/**\n * The brand FOREGROUNDS — text on a neutral surface, and the icon.\n *\n * Split from {@link accentFillColors} because the two have different audiences: the\n * fill ramp is shared with the standalone `special` theme, which builds its own\n * purpose-made subset and must not gain tokens it does not consume. Only the default\n * theme (and the colored themes that inherit from it) takes these.\n *\n * These stay `mode: 'auto'` in both arrangements — a link has to invert on a dark page,\n * so exactness belongs to the fill and these are its brand-toned companions.\n */\nfunction accentTextColors(accent: AccentSeed): ColorMap {\n if (accent == null) {\n return {\n ...ACCENT_SELECTED_FILL,\n // Stronger brand text for HOVERED selected outline/clear labels and LINK\n // hover. Same anchor + preferred tone as `accent-text-soft`, but a higher\n // `contrast: [6, 11]` floor against `accent-selected-fill` so it reads as a\n // clear step up from the soft rest color while staying saturated (a bare\n // `AAA`/`7` floor over-darkens light and desaturates dark). The HC pair keeps\n // it at/above the soft variant (which auto-promotes AA→AAA in HC).\n // `mode: 'auto'` (default) keeps dark-mode text readable on dark surfaces.\n 'accent-text': {\n base: 'accent-selected-fill',\n tone: '-49',\n saturation: 1,\n contrast: [6, 11],\n },\n // Rest brand text for selected outline/clear labels and LINK base color.\n // Anchored to `accent-selected-fill` with `contrast: 'AA'` — the measured\n // floor for every BASE state of those Item types (surface / outline /\n // outline-2 / clear selected fills). Sits visibly less prominent than\n // `accent-text` (lighter in light, darker in dark) so the rest→hover\n // intensify is real.\n 'accent-text-soft': {\n base: 'accent-selected-fill',\n tone: '-49',\n saturation: 1,\n contrast: ['AA', 'AAA'],\n },\n 'accent-icon': {\n base: 'surface',\n tone: '-38',\n saturation: 0.9375,\n },\n };\n }\n\n return {\n ...ACCENT_SELECTED_FILL,\n // The rest link color IS the brand, which is the visible payoff of a color seed;\n // the hover one steps past it so the intensify survives. See\n // ACCENT_TEXT_HOVER_STEP.\n // The hover text is the one place the derived NUMBER is still needed: `from`\n // carries the tone, but a step past it has to be computed.\n 'accent-text': {\n from: accent.color,\n base: 'accent-selected-fill',\n tone: Math.max(0, accent.tone - ACCENT_TEXT_HOVER_STEP),\n contrast: ACCENT_TEXT_HOVER_CONTRAST,\n },\n 'accent-text-soft': {\n from: accent.color,\n base: 'accent-selected-fill',\n contrast: ACCENT_TEXT_CONTRAST,\n },\n 'accent-icon': {\n from: accent.color,\n base: 'surface',\n contrast: ACCENT_TEXT_CONTRAST,\n },\n };\n}\n\n/** Every accent token the default theme carries — fills, foregrounds, and the mix. */\nfunction accentColors(accent: AccentSeed): ColorMap {\n return {\n ...accentFillColors(accent),\n ...accentTextColors(accent),\n };\n}\n\n// ============================================================================\n// Palette construction\n// ============================================================================\n\n/**\n * Build the full palette from a resolved config.\n *\n * Pure: it reads nothing but its argument (and the global Glaze config, which\n * the caller sets first), so re-running it with the same config yields the same\n * tokens. Theme instances are immutable with respect to their hue / saturation\n * seed and a `GlazePalette` has no mutation API, so re-seeding means rebuilding.\n */\nfunction buildPalette(\n config: ResolvedPaletteConfig,\n options: {\n /**\n * Carry `contrastLevel` on the theme instances instead of relying on the\n * global Glaze config. Used when rendering a palette the app is not running,\n * so a preview cannot disturb the live one. The resolved values are the same\n * either way; only which scheme variants get *emitted* differs, and callers\n * that isolate pick their variant explicitly.\n */\n isolateContrastLevel?: boolean;\n } = {},\n): BuiltPalette {\n const {\n hue,\n baseHue,\n saturation,\n accentColor,\n accentTone,\n pastel,\n themes,\n contrastLevel,\n } = config;\n\n const accent: AccentSeed =\n accentColor !== null && accentTone !== null\n ? { color: accentColor, tone: accentTone }\n : null;\n\n // The base zone's tone anchor and its own chroma share, applied to every color\n // that carries `hue: baseHue` below — that prop is the boundary of the zone.\n const baseTone = surfaceTone(config);\n const baseScale = baseSaturationScale(config);\n const baseChroma = (factor: number) => Math.min(1, factor * baseScale);\n\n // The one override the code theme shares with the rest of the palette.\n const sharedOverrides: GlazeConfigOverride = options.isolateContrastLevel\n ? { contrastLevel }\n : {};\n\n // `pastel` is instance-level in Glaze (not settable via `glaze.configure`).\n // Setting it on the two root themes is enough: `extend({ config })` merges\n // with the parent's override, so the derived themes inherit it. When it is\n // off we omit the field entirely rather than pass `false` — the two are\n // equivalent, and omitting keeps the default output provably untouched.\n const overrides: GlazeConfigOverride = {\n ...sharedOverrides,\n ...(pastel ? { pastel: true } : null),\n };\n const instanceConfig: GlazeConfigOverride | undefined = Object.keys(overrides)\n .length\n ? overrides\n : undefined;\n\n // `pastel` deliberately does *not* reach the code theme: syntax colors answer\n // to `themes.code.saturation` and nothing else. Pinned to `false` rather than\n // omitted — the same value Glaze defaults to, but here it is the point of the\n // override, not an absence. See {@link buildCodeTheme}.\n const codeInstanceConfig: GlazeConfigOverride = {\n ...sharedOverrides,\n pastel: false,\n };\n\n // --------------------------------------------------------------------------\n // Default theme (neutral, primary in palette → exported unprefixed)\n // --------------------------------------------------------------------------\n\n const defaultTheme = glaze(hue, saturation, instanceConfig);\n\n defaultTheme.colors({\n // ---- Surfaces (neutral, very low saturation) ----\n surface: {\n tone: baseTone,\n saturation: baseChroma(SURFACE_SATURATION),\n hue: baseHue,\n },\n 'surface-2': {\n hue: baseHue,\n base: 'surface',\n tone: ['-2', '-4'],\n saturation: baseChroma(0.1),\n inherit: false,\n },\n 'surface-3': {\n hue: baseHue,\n base: 'surface',\n tone: ['-4', '-8'],\n saturation: baseChroma(0.1),\n inherit: false,\n },\n 'surface-4': {\n hue: baseHue,\n base: 'surface',\n tone: ['-6', '-12'],\n saturation: baseChroma(0.1),\n inherit: false,\n },\n\n // ---- Text on surfaces ----\n // Tone is the contrast-uniform OKHST axis, so a relative tone delta directly\n // encodes a WCAG contrast step. `surface-text` sits at tone 2 (a -98 delta\n // from white), giving the same near-black appearance as the legacy `#dark`.\n // We still keep an `['AA','AAA']` contrast floor on every text-on-surface\n // color so a future low-contrast scale can shift the ramp down without ever\n // breaking readability.\n 'surface-text': {\n hue: baseHue,\n base: 'surface',\n tone: `${TEXT_TONE - 2}`,\n saturation: baseChroma(0.2),\n contrast: ['AA', 'AAA'],\n },\n 'surface-text-soft': {\n hue: baseHue,\n base: 'surface',\n tone: `${TEXT_SOFT_TONE - 2}`,\n saturation: baseChroma(0.2),\n contrast: ['AA', 'AAA'],\n inherit: false,\n },\n 'surface-text-soft-2': {\n hue: baseHue,\n base: 'surface',\n tone: `${TEXT_SOFT2_TONE - 2}`,\n saturation: baseChroma(0.2),\n contrast: ['AA', 'AAA'],\n inherit: false,\n },\n 'surface-2-text': {\n hue: baseHue,\n base: 'surface-2',\n tone: `${TEXT_TONE + SURFACE_2_TEXT_OFFSET}`,\n saturation: baseChroma(0.2),\n contrast: ['AA', 'AAA'],\n inherit: false,\n },\n 'surface-2-text-soft': {\n hue: baseHue,\n base: 'surface-2',\n tone: `${TEXT_SOFT_TONE + SURFACE_2_TEXT_OFFSET}`,\n saturation: baseChroma(0.2),\n contrast: ['AA', 'AAA'],\n inherit: false,\n },\n 'surface-3-text': {\n hue: baseHue,\n base: 'surface-3',\n tone: `${TEXT_TONE + SURFACE_3_TEXT_OFFSET}`,\n saturation: baseChroma(0.2),\n contrast: ['AA', 'AAA'],\n inherit: false,\n },\n 'surface-3-text-soft': {\n hue: baseHue,\n base: 'surface-3',\n tone: `${TEXT_SOFT_TONE + SURFACE_3_TEXT_OFFSET}`,\n saturation: baseChroma(0.2),\n contrast: ['AA', 'AAA'],\n inherit: false,\n },\n\n // ---- Other neutral UI primitives (default-only) ----\n border: {\n hue: baseHue,\n base: 'surface',\n tone: ['-10', '-30'],\n saturation: baseChroma(0.175),\n },\n placeholder: {\n hue: baseHue,\n base: 'surface',\n tone: '-33',\n saturation: baseChroma(0.175),\n inherit: false,\n },\n focus: {\n base: 'surface',\n tone: '-29',\n saturation: 0.8625,\n inherit: false,\n },\n disabled: {\n tone: 80.8,\n saturation: 0.4,\n inherit: false,\n },\n // Disabled fill chip + text — both adaptive (mode 'auto') and positioned\n // with relative tone deltas against `surface` so the disabled state has the\n // same perceived intensity in light, dark, and high-contrast schemes. No\n // numeric contrast prop is needed: tone is already on a WCAG-uniform scale.\n //\n // Tone deltas reproduce the legacy palette's disabled appearance exactly:\n // the chip sits ~cr 1.11 vs `surface` (a faint greyed pill for\n // OUTLINE/SECONDARY/item disabled states) and the label ~cr 2.02 vs\n // `surface` — intentionally sub-AA so it reads as disabled while staying the\n // same softness clear/link disabled labels had before. PRIMARY-style buttons\n // use the brand-tinted `accent-disabled-*` variants below instead. Both\n // tokens stay default-only (`inherit: false`) — colored themes inherit their\n // own disabled chip via the accent variants.\n 'disabled-surface': {\n hue: baseHue,\n base: 'surface',\n tone: '-3.5',\n saturation: baseChroma(0.2),\n inherit: false,\n },\n 'disabled-surface-text': {\n base: 'surface',\n tone: '-23',\n saturation: 0.3,\n inherit: false,\n },\n\n // Fixed-mode \"always dark\" surface for elements that intentionally stay\n // inverted regardless of scheme (tooltips, code blocks, popovers with their\n // own dark theme, etc.). `mode: 'fixed'` bypasses the dark-scheme inversion\n // so the color reads as a dark surface in light, dark, and high-contrast.\n // Pair with `#white` (built-in) for foreground text.\n 'surface-inverse': {\n hue: baseHue,\n tone: 12,\n saturation: baseChroma(0.475),\n mode: 'fixed',\n inherit: false,\n },\n\n // ---- Accent system (theme-aware, inherited by colored themes) ----\n // Two arrangements, one per seeding mode — see `accentColors`.\n ...accentColors(accent),\n\n // Brand-tinted disabled chip + label for PRIMARY-style buttons (solid brand\n // fill). The chip is scheme-symmetric (`mode: 'fixed'`) so the muted state\n // reads the same weight in light/dark/HC; saturation is bumped so it stays\n // identifiable as a muted brand color.\n //\n // The label rides the extreme away from the chip (`tone: 'max'`, ~cr 1.7):\n // deliberately faint, so it reads as disabled rather than as live text.\n // `'max'` is the authored intent — it was temporarily hand-approximated as a\n // relative `tone: '+15'` with `autoFlip: false`, because Glaze < 1.2.0\n // re-mapped the extreme through the dark tone window, compressing the\n // base-to-extreme span and dropping the dark label's contrast. Glaze 1.2.0\n // (tenphi/glaze#82) instead replays the light scheme's base→extreme tone\n // shift against the base's resolved dark tone — same-signed under\n // `mode: 'fixed'` — so `'max'` holds its intended separation in every scheme\n // and the approximation is no longer needed. Inherited per theme.\n //\n // The special theme keeps its own relative `+18` pair: its `surface` is a\n // fixed dark tone, so an extreme there would resolve to white and read as\n // live text rather than disabled.\n 'accent-disabled-surface': {\n base: 'surface',\n tone: '-13',\n saturation: 0.5,\n mode: 'fixed',\n },\n 'accent-disabled-surface-text': {\n base: 'accent-disabled-surface',\n tone: 'max',\n saturation: 0.4,\n mode: 'fixed',\n },\n\n // ---- Loading-animation cube faces ----\n // Decorative gradient steps from `surface` to a saturated mid-tone. Tone\n // deltas are chosen directly on the contrast-uniform scale; no contrast prop\n // is needed for a non-text decorative element.\n 'loading-face-1': {\n base: 'surface',\n tone: '-2',\n saturation: 0.3,\n inherit: false,\n },\n 'loading-face-2': {\n base: 'surface',\n tone: '-9',\n saturation: 0.62,\n inherit: false,\n },\n 'loading-face-3': {\n base: 'surface',\n tone: '-21',\n saturation: 0.66,\n inherit: false,\n },\n\n // ---- Shadows (default-only) ----\n 'shadow-sm': {\n type: 'shadow',\n bg: 'surface',\n fg: 'surface-text',\n intensity: 5,\n inherit: false,\n },\n 'shadow-md': {\n type: 'shadow',\n bg: 'surface',\n fg: 'surface-text',\n intensity: 10,\n inherit: false,\n },\n 'shadow-lg': {\n type: 'shadow',\n bg: 'surface',\n fg: 'surface-text',\n intensity: 15,\n inherit: false,\n },\n\n // Backdrop overlay (translucent)\n overlay: { tone: 10, opacity: 0.5, inherit: false, hue: baseHue },\n });\n\n // --------------------------------------------------------------------------\n // Colored themes\n // --------------------------------------------------------------------------\n //\n // `primary` is the brand theme: it shares both the accent hue and the palette\n // seed saturation with `default`, and differs only in carrying a tinted surface.\n // Each status theme adds its own hue on top.\n const tintedSurface = tintedSurfaceOverride(config);\n const primaryTheme = defaultTheme.extend({\n colors: tintedSurface,\n });\n\n // A status theme takes the ACCENT COLOR'S TONE back out.\n //\n // The tone is the brand's, and only the brand's. Inherited, a light brand would put\n // `#danger-accent-surface` at tone 88 in a red hue — a pale pink danger button, which\n // is not a danger button. Status themes carry a *meaning* their hue exists to signal,\n // so they keep the white-anchored derivation that lands every hue at a comparable\n // weight. `extend({ colors })` redefines each listed color from scratch, so restating\n // the null arrangement is enough to undo it.\n //\n // With no accent color this is the tinted-surface override itself, so the\n // shipped palette is provably untouched.\n const statusColors: ColorMap =\n accent == null\n ? tintedSurface\n : { ...tintedSurface, ...accentColors(null) };\n\n const successTheme = defaultTheme.extend({\n hue: themes.success.hue,\n saturation: themes.success.saturation,\n colors: statusColors,\n });\n const dangerTheme = defaultTheme.extend({\n hue: themes.danger.hue,\n saturation: themes.danger.saturation,\n colors: statusColors,\n });\n const warningTheme = defaultTheme.extend({\n hue: themes.warning.hue,\n saturation: themes.warning.saturation,\n colors: statusColors,\n });\n const noteTheme = defaultTheme.extend({\n hue: themes.note.hue,\n saturation: themes.note.saturation,\n colors: statusColors,\n });\n\n // --------------------------------------------------------------------------\n // Special theme (fixed-mode, NOT inherited from the default theme)\n // --------------------------------------------------------------------------\n //\n // Standalone theme for `special`-variant components (hero CTAs, banners, etc.)\n // that intentionally sit on a dark surface regardless of the active scheme.\n //\n // Every token here is `mode: 'fixed'` so the resolved value is identical in\n // light, dark, and high-contrast. The shape is purpose-built (not a full\n // mirror of the default theme) — only what `SPECIAL_*_STYLES` in\n // `src/data/item-themes.ts` consumes is emitted. It follows the *primary*\n // seed, since it is the brand-on-dark theme.\n //\n // Token rundown:\n // - `surface` — dark L≈12 backdrop (same value as `#surface-inverse`).\n // - `accent-surface` / `accent-surface-2` / `accent-surface-3` —\n // brand PRIMARY fill ramp (default → hover → pressed). Mirrors the\n // `#primary-accent-surface` / `-2` / `-3` ramp on the colored themes so\n // `SPECIAL_PRIMARY_STYLES.fill` can use the same shape.\n // - `accent-surface-hover` — legacy alias kept around for the\n // `#special-hover` color shortcut in `src/tokens/colors.ts`. Item\n // themes themselves no longer reference it.\n // - `accent-surface-text` — fixed white (= built-in `#white`), exposed\n // for explicit references.\n // - `accent-text` — dark brand foreground readable on white. Used as\n // CLEAR-variant text on the always-white pill, and as the\n // pressed/focused border on the brand primary fill. Matches the\n // legacy `#fixed-primary-text` alias (= `#primary-accent-surface-hover`).\n // - `accent-disabled-surface` / `accent-disabled-surface-text` —\n // brand-tinted disabled chip + label, positioned with relative tone\n // deltas against the fixed dark `surface` so the disabled state is\n // scheme-symmetric.\n\n const specialTheme = glaze(hue, saturation, instanceConfig);\n\n specialTheme.colors({\n surface: { tone: 12, saturation: 0.475, mode: 'fixed' },\n\n // The same fill ramp as the default theme, and for the same reason: this IS the\n // brand CTA — `SPECIAL_PRIMARY_STYLES.fill` mirrors `#primary-accent-surface` — so\n // leaving it on the white-anchored derivation would give a yellow brand a\n // dark-purple hero button.\n //\n // Only the fills: `accent-selected-fill`, `accent-text-soft` and `accent-icon` are\n // not part of this theme's purpose-built shape, and adding them would grow the\n // emitted token set.\n ...accentFillColors(accent),\n\n // Special's `accent-text` is \"dark brand, readable on a WHITE pill\" (the CLEAR\n // selected fill) — not on `surface`, which here is the fixed dark backdrop. It\n // stays anchored to `accent-surface-text`, which is a hard white root in both\n // arrangements, so the `-58` delta keeps its meaning either way.\n 'accent-text': {\n base: 'accent-surface-text',\n tone: '-58',\n contrast: ['AA', 'AAA'],\n mode: 'fixed',\n },\n\n 'accent-disabled-surface': {\n base: 'surface',\n tone: '+4',\n saturation: 0.5,\n mode: 'fixed',\n },\n 'accent-disabled-surface-text': {\n base: 'accent-disabled-surface',\n tone: '+18',\n saturation: 0.4,\n mode: 'fixed',\n },\n });\n\n // --------------------------------------------------------------------------\n // Palette composition\n // --------------------------------------------------------------------------\n //\n // `purple` is the legacy alias for `primary` and resolves to identical tokens\n // (same theme instance, different prefix → no token-value collision).\n //\n // `default` is emitted with an empty prefix (custom map in `getPaletteTokens`),\n // so its tokens appear unprefixed (`#surface`, `#border`, …). All other themes\n // are prefixed with `<themeName>-`.\n return {\n palette: glaze.palette({\n default: defaultTheme,\n primary: primaryTheme,\n purple: primaryTheme,\n success: successTheme,\n danger: dangerTheme,\n warning: warningTheme,\n note: noteTheme,\n special: specialTheme,\n }),\n // Kept out of the palette on purpose: it has to emit `code-*` unprefixed, and\n // its mirrored `surface` would collide with the default theme's.\n codeTheme: buildCodeTheme(config, codeInstanceConfig),\n };\n}\n\n// ============================================================================\n// Tasty-formatted token export\n// ============================================================================\n\nconst TOKEN_PREFIXES = {\n default: '',\n primary: 'primary-',\n purple: 'purple-',\n success: 'success-',\n danger: 'danger-',\n warning: 'warning-',\n note: 'note-',\n special: 'special-',\n};\n\nlet paletteCache: GlazePalette | null = null;\nlet codeThemeCache: GlazeTheme | null = null;\nlet paletteTokensCache: Styles | null = null;\nlet cachedVersion = -1;\n\n/**\n * Whether *we* are the ones holding a manual level in Glaze's global config.\n *\n * `contrastLevel` is the one palette option that has to be global: a global\n * level pins `modes.highContrast: false` so no high-contrast tier is emitted at\n * all (which is the point — a manual level already carries the preference),\n * whereas a per-instance level would leave the tier in place and report its own\n * values there. `palette.tasty({ modes })` cannot override that either.\n *\n * Being global means it is shared with the host app, so we only write it when\n * asked. A host that sets its own `glaze.configure({ contrastLevel })` and never\n * touches `setPaletteConfig({ contrastLevel })` keeps its level — without this\n * flag we would silently reset it to `'auto'` on the first token read.\n */\nlet ownsContrastLevel = false;\n\nfunction applyContrastLevel(contrastLevel: number | 'auto') {\n // Nothing to do: we hold no level, and the config does not ask for one.\n if (contrastLevel === 'auto' && !ownsContrastLevel) return;\n\n // Always explicit — `configure()` never clears a field by omission, so\n // returning to `'auto'` has to say so.\n glaze.configure({ contrastLevel });\n ownsContrastLevel = contrastLevel !== 'auto';\n}\n\nfunction refresh() {\n const version = getPaletteVersion();\n\n if (paletteTokensCache && cachedVersion === version) return;\n\n const config = getPaletteConfig();\n\n applyContrastLevel(config.contrastLevel);\n\n const built = buildPalette(config);\n\n paletteCache = built.palette;\n paletteTokensCache = {\n ...built.palette.tasty({ prefix: TOKEN_PREFIXES, format: 'oklch' }),\n ...pickCodeTokens(built.codeTheme.tasty({ format: 'oklch' })),\n } as Styles;\n codeThemeCache = built.codeTheme;\n cachedVersion = version;\n}\n\n/**\n * Resolve Glaze palette tokens against the current palette config.\n *\n * Memoized against the config version (see `./palette-config.ts`), so repeated\n * reads are free and `setPaletteConfig()` invalidates them. Resolution is\n * deferred rather than done at module import, so host apps can call\n * `setPaletteConfig(...)` / `glaze.configure(...)` after importing\n * `@cube-dev/ui-kit` and still affect the first paint.\n *\n * Keys use `#name` syntax; values are state maps:\n * '#surface': { '': 'oklch(...)', '@dark': 'oklch(...)', '@hc': 'oklch(...)' }\n */\nexport function getPaletteTokens(): Styles {\n refresh();\n\n return paletteTokensCache!;\n}\n\n/** The live `GlazePalette`. Rebuilt whenever the palette config changes. */\nexport function getPalette(): GlazePalette {\n refresh();\n\n return paletteCache!;\n}\n\n/**\n * The live theme behind the `code-*` tokens. Separate from {@link getPalette}\n * because it carries its own saturation seed — see {@link CODE_COLORS}.\n */\nexport function getCodeTheme(): GlazeTheme {\n refresh();\n\n return codeThemeCache!;\n}\n\n// ============================================================================\n// One-variant render (for previewing a palette on a region)\n// ============================================================================\n\nconst VARIANT_KEY = {\n 'light:false': 'light',\n 'light:true': 'lightContrast',\n 'dark:false': 'dark',\n 'dark:true': 'darkContrast',\n} as const;\n\n/**\n * Single-entry memo: all four variants of the last config rendered.\n *\n * Keyed on the palette version as well as the config, because the config is not\n * the only input — `buildPalette` also reads Glaze's own global config\n * (`darkTone`, `darkDesaturation`, the state map). A host that drives Glaze\n * directly and then calls `invalidatePaletteTokens()` bumps the version without\n * touching the config, and the region previews have to follow the document.\n */\nlet renderKey: string | null = null;\nlet renderVariants: Record<string, Record<string, string>> = {};\n\n/**\n * Resolve one scheme variant of a palette to flat, literal color values.\n *\n * Unlike {@link getPaletteTokens}, which emits state maps (`@dark` / `@hc`) for\n * the whole document, this collapses the palette to the single variant you ask\n * for. That is what makes a **region** preview possible: applied through a tasty\n * `tokens` prop, the values override the inherited ones for that subtree only, so\n * a dark or high-contrast theme can be shown inside a light page.\n *\n * Prefer `renderColorTokens()` from `./colors` unless you specifically want the\n * palette without the legacy aliases.\n */\nexport function renderPaletteTokens(\n options: RenderPaletteOptions = {},\n): Tokens {\n const { scheme = 'light', highContrast = false, ...config } = options;\n const resolved = resolvePaletteConfig(config);\n const key = `${getPaletteVersion()}:${JSON.stringify(resolved)}`;\n\n if (renderKey !== key) {\n // Force the *global* level to `'auto'` for the duration of the export.\n // Glaze suppresses high-contrast output whenever a global level is set, and\n // that check reads the global config — so without this, a preview's variants\n // would depend on whatever contrast mode the surrounding app happens to be\n // in. The preview's own level rides on the theme instances instead\n // (`isolateContrastLevel`), so the values stay correct. Restored in `finally`;\n // resolution is synchronous, so nothing can observe the window.\n const previousLevel = glaze.getConfig().contrastLevel;\n\n try {\n glaze.configure({ contrastLevel: 'auto' });\n\n const built = buildPalette(resolved, { isolateContrastLevel: true });\n const modes = { dark: true, highContrast: true };\n const themed = built.palette.tokens({\n prefix: TOKEN_PREFIXES,\n format: 'oklch',\n modes,\n });\n const code = built.codeTheme.tokens({ format: 'oklch', modes });\n\n // Built into a local and published together, so a throw part-way through\n // cannot leave a half-filled map sitting under the previous key.\n const variants: typeof renderVariants = {};\n\n for (const name of Object.keys(themed)) {\n variants[name] = {\n ...themed[name],\n ...pickCodeTokens(code[name] ?? {}),\n };\n }\n\n renderVariants = variants;\n renderKey = key;\n } finally {\n glaze.configure({ contrastLevel: previousLevel });\n }\n }\n\n const variant = VARIANT_KEY[`${scheme}:${highContrast}`];\n // The fallback is for `contrastLevel: 100` only. There the normal variants\n // already *are* the high-contrast ones, so Glaze emits a single light/dark set\n // rather than duplicating it — and `highContrast` correctly resolves to the same\n // colors. At every other level the contrast variants are present and genuinely\n // escalated, so the fallback is not taken.\n const flat = renderVariants[variant] ?? renderVariants[scheme];\n const out: Tokens = {};\n\n for (const name of Object.keys(flat)) out[`#${name}`] = flat[name];\n\n return out;\n}\n\n/**\n * Lazy proxy of {@link getPaletteTokens}. Prefer `getPaletteTokens()` in new\n * code. Property / enumeration access always reflects the current palette\n * config.\n */\nexport const PALETTE_TOKENS: Styles = lazyStyles(getPaletteTokens);\n"],"mappings":"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"}
|
package/dist/tokens/shadows.js
CHANGED
package/dist/tokens/sizes.js
CHANGED
package/dist/tokens/spacing.js
CHANGED
package/dist/utils/is-dev-env.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-dcbc0fb | Cube Dev Team */
|
|
2
2
|
//#region src/utils/is-dev-env.ts
|
|
3
3
|
function isDevEnv() {
|
|
4
4
|
if (typeof window !== "undefined" && window.localStorage) try {
|
package/dist/utils/modules.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-dcbc0fb | Cube Dev Team */
|
|
2
2
|
//#region src/utils/modules.ts
|
|
3
3
|
function extractModule(promise) {
|
|
4
4
|
return promise.then((module) => module.default || module);
|
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.0.0-canary-
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-dcbc0fb | 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.0.0-canary-
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-dcbc0fb | Cube Dev Team */
|
|
2
2
|
//#region src/utils/react/chain.ts
|
|
3
3
|
/**
|
|
4
4
|
* Calls all functions in the order they were chained with the same arguments.
|
|
@@ -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-dcbc0fb | Cube Dev Team */
|
|
2
2
|
//#region src/utils/react/disabledProps.ts
|
|
3
3
|
/**
|
|
4
4
|
* Tags where `disabled` is a real HTML attribute. Browsers refuse to dispatch
|
|
@@ -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-dcbc0fb | Cube Dev Team */
|
|
2
2
|
//#region src/utils/react/forwardRefWithGenerics.tsx
|
|
3
3
|
/**
|
|
4
4
|
* A helper for creating forwardRef components with generic types.
|
|
@@ -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-dcbc0fb | 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.0.0-canary-
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-dcbc0fb | Cube Dev Team */
|
|
2
2
|
//#region src/utils/react/mapProps.ts
|
|
3
3
|
/** Converts AriaButtonProps to CubeButtonProps */
|
|
4
4
|
function ariaToCubeButtonProps(props) {
|
|
@@ -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-dcbc0fb | Cube Dev Team */
|
|
2
2
|
import { chain } from "./chain.js";
|
|
3
3
|
import { mergeIds } from "./useId.js";
|
|
4
4
|
import { mergeStyles } from "@tenphi/tasty";
|
|
@@ -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-dcbc0fb | 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,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-dcbc0fb | Cube Dev Team */
|
|
2
2
|
import { useLayoutEffect as useLayoutEffect$1 } from "./useLayoutEffect.js";
|
|
3
3
|
import { useCallback, useRef, useState } from "react";
|
|
4
4
|
|
|
@@ -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-dcbc0fb | Cube Dev Team */
|
|
2
2
|
import { createSharedStore } from "./sharedStore.js";
|
|
3
3
|
import { useEffect } from "react";
|
|
4
4
|
import { useFocusVisible } from "react-aria";
|
|
@@ -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-dcbc0fb | 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.0.0-canary-
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-dcbc0fb | 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";
|
|
@@ -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-dcbc0fb | Cube Dev Team */
|
|
2
2
|
import { useEvent } from "../../_internal/hooks/use-event.js";
|
|
3
3
|
import { useCallback, useSyncExternalStore } from "react";
|
|
4
4
|
|
|
@@ -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-dcbc0fb | Cube Dev Team */
|
|
2
2
|
import { EventBusContext, useEventBus } from "./useEventBus.js";
|
|
3
3
|
import { useCallback, useContext, useEffect, useRef } from "react";
|
|
4
4
|
|
package/dist/utils/selection.js
CHANGED
package/dist/utils/styles.js
CHANGED
package/dist/utils/tree.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-dcbc0fb | Cube Dev Team */
|
|
2
2
|
//#region src/utils/tree.ts
|
|
3
3
|
function toFlatTree(tree, includingFolders) {
|
|
4
4
|
return tree.reduce((result, node) => {
|