@cube-dev/ui-kit 0.149.2 → 0.151.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/CHANGELOG.md +51 -0
- 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 +7 -7
- package/dist/components/GlobalStyles.js.map +1 -1
- package/dist/components/GridProvider.js +1 -1
- package/dist/components/HiddenInput.js +1 -1
- package/dist/components/Root.js +1 -1
- package/dist/components/actions/Action/Action.js +1 -1
- package/dist/components/actions/Banner/Banner.js +1 -1
- package/dist/components/actions/Button/Button.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-action.js.map +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 +5 -1
- package/dist/components/content/CopySnippet/CopySnippet.js.map +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 +6 -2
- package/dist/components/content/PrismCode/PrismCode.js.map +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 +7 -7
- package/dist/components/content/Text.js +1 -1
- package/dist/components/content/TextItem/TextItem.js +1 -1
- package/dist/components/content/Title.js +1 -1
- package/dist/components/content/Tree/Tree.js +1 -1
- package/dist/components/content/Tree/TreeNode.js +1 -1
- package/dist/components/content/Tree/styled.js +1 -1
- package/dist/components/content/Tree/tree-index.js +1 -1
- package/dist/components/content/Tree/use-checkbox-tree.js +1 -1
- package/dist/components/content/Tree/use-load-data.js +1 -1
- package/dist/components/content/highlightText.js +1 -1
- package/dist/components/content/use-auto-tooltip.js +1 -1
- package/dist/components/fields/Checkbox/Checkbox.js +1 -1
- package/dist/components/fields/Checkbox/CheckboxGroup.js +1 -1
- package/dist/components/fields/Checkbox/context.js +1 -1
- package/dist/components/fields/ComboBox/ComboBox.js +1 -1
- package/dist/components/fields/CommandTextArea/CommandTextArea.js +1 -1
- package/dist/components/fields/CommandTextArea/caretPosition.js +1 -1
- package/dist/components/fields/CommandTextArea/useCaretAnchor.js +1 -1
- package/dist/components/fields/DatePicker/DateInput.js +1 -1
- package/dist/components/fields/DatePicker/DateInputBase.js +1 -1
- package/dist/components/fields/DatePicker/DatePicker.js +1 -1
- package/dist/components/fields/DatePicker/DatePickerButton.js +1 -1
- package/dist/components/fields/DatePicker/DatePickerElement.js +1 -1
- package/dist/components/fields/DatePicker/DatePickerInput.js +1 -1
- package/dist/components/fields/DatePicker/DatePickerSegment.js +1 -1
- package/dist/components/fields/DatePicker/DateRangePicker.js +1 -1
- package/dist/components/fields/DatePicker/DateRangeSeparatedPicker.js +1 -1
- package/dist/components/fields/DatePicker/TimeInput.js +1 -1
- package/dist/components/fields/DatePicker/parseDate.js +1 -1
- package/dist/components/fields/DatePicker/props.js +1 -1
- package/dist/components/fields/DatePicker/utils.js +1 -1
- package/dist/components/fields/FileInput/FileInput.js +1 -1
- package/dist/components/fields/FilterListBox/FilterListBox.js +1 -1
- package/dist/components/fields/FilterPicker/FilterPicker.js +1 -1
- package/dist/components/fields/Input/Input.js +1 -1
- package/dist/components/fields/ListBox/DraggableListBox.js +1 -1
- package/dist/components/fields/ListBox/ListBox.js +1 -1
- package/dist/components/fields/ListBoxPopover/ListBoxPopover.js +1 -1
- package/dist/components/fields/ListBoxPopover/listNavigation.js +1 -1
- package/dist/components/fields/ListBoxPopover/useCompositeFocus.js +1 -1
- package/dist/components/fields/NumberInput/NumberInput.js +1 -1
- package/dist/components/fields/NumberInput/StepButton.js +1 -1
- package/dist/components/fields/PasswordInput/PasswordInput.js +1 -1
- package/dist/components/fields/Picker/Picker.js +1 -1
- package/dist/components/fields/RadioGroup/Radio.js +1 -1
- package/dist/components/fields/RadioGroup/RadioGroup.js +1 -1
- package/dist/components/fields/RadioGroup/context.js +1 -1
- package/dist/components/fields/SearchComboBox/SearchComboBox.js +1 -1
- package/dist/components/fields/SearchInput/SearchInput.js +1 -1
- package/dist/components/fields/Select/Select.js +1 -1
- package/dist/components/fields/Slider/Gradation.js +1 -1
- package/dist/components/fields/Slider/HueSlider.js +1 -1
- package/dist/components/fields/Slider/RangeSlider.js +1 -1
- package/dist/components/fields/Slider/Slider.js +1 -1
- package/dist/components/fields/Slider/SliderBase.js +1 -1
- package/dist/components/fields/Slider/SliderThumb.js +1 -1
- package/dist/components/fields/Slider/SliderTrack.js +1 -1
- package/dist/components/fields/Slider/elements.js +1 -1
- package/dist/components/fields/Slider/index.js +1 -1
- package/dist/components/fields/Switch/Switch.js +1 -1
- package/dist/components/fields/TextArea/TextArea.js +1 -1
- package/dist/components/fields/TextInput/TextInput.js +1 -1
- package/dist/components/fields/TextInput/TextInputBase.js +1 -1
- package/dist/components/fields/TextInputMapper/TextInputMapper.js +1 -1
- package/dist/components/form/FieldWrapper/FieldWrapper.js +1 -1
- package/dist/components/form/Form/Field.js +1 -1
- package/dist/components/form/Form/Form.js +1 -1
- package/dist/components/form/Form/ResetButton/ResetButton.js +1 -1
- package/dist/components/form/Form/SubmitButton/SubmitButton.js +1 -1
- package/dist/components/form/Form/SubmitError.js +1 -1
- package/dist/components/form/Form/index.js +1 -1
- package/dist/components/form/Form/use-field/use-field-props.js +1 -1
- package/dist/components/form/Form/use-field/use-field.js +1 -1
- package/dist/components/form/Form/use-form.js +1 -1
- package/dist/components/form/Form/validation.js +1 -1
- package/dist/components/form/Label.js +1 -1
- package/dist/components/form/validation/ValidationIndicator.js +1 -1
- package/dist/components/form/validation/resolve-validation-props.js +1 -1
- package/dist/components/form/validation/use-validation-props.js +1 -1
- package/dist/components/form/wrapper.js +1 -1
- package/dist/components/helpers/DisplayTransition/DisplayTransition.js +1 -1
- package/dist/components/helpers/IconSwitch/IconSwitch.js +1 -1
- package/dist/components/layout/Board/Board.js +1 -1
- package/dist/components/layout/Board/BoardProvider.js +1 -1
- package/dist/components/layout/Board/BoardResponsive.js +1 -1
- package/dist/components/layout/Board/Widget.js +1 -1
- package/dist/components/layout/Board/WidgetHost.js +1 -1
- package/dist/components/layout/Board/board-context.js +1 -1
- package/dist/components/layout/Board/board-store.js +1 -1
- package/dist/components/layout/Board/grid-core/calculate.js +1 -1
- package/dist/components/layout/Board/grid-core/collision.js +1 -1
- package/dist/components/layout/Board/grid-core/compactors.js +1 -1
- package/dist/components/layout/Board/grid-core/constraints.js +1 -1
- package/dist/components/layout/Board/grid-core/layout.js +1 -1
- package/dist/components/layout/Board/grid-core/sort.js +1 -1
- package/dist/components/layout/Board/index.js +1 -1
- package/dist/components/layout/Board/responsive-utils.js +1 -1
- package/dist/components/layout/Board/use-board-layout.js +1 -1
- package/dist/components/layout/Board/use-board-registry.js +1 -1
- package/dist/components/layout/Flex.js +1 -1
- package/dist/components/layout/Flow.js +1 -1
- package/dist/components/layout/Grid.js +1 -1
- package/dist/components/layout/Panel.js +1 -1
- package/dist/components/layout/Prefix.js +1 -1
- package/dist/components/layout/ResizablePanel.js +1 -1
- package/dist/components/layout/Space.js +1 -1
- package/dist/components/layout/Suffix.js +1 -1
- package/dist/components/navigation/Tabs/DraggableTabList.js +1 -1
- package/dist/components/navigation/Tabs/TabButton.js +1 -1
- package/dist/components/navigation/Tabs/TabDropIndicator.js +1 -1
- package/dist/components/navigation/Tabs/TabPanel.js +1 -1
- package/dist/components/navigation/Tabs/TabPicker.js +1 -1
- package/dist/components/navigation/Tabs/Tabs.js +1 -1
- package/dist/components/navigation/Tabs/TabsAction.js +1 -1
- package/dist/components/navigation/Tabs/TabsContext.js +1 -1
- package/dist/components/navigation/Tabs/popover-placement.js +1 -1
- package/dist/components/navigation/Tabs/styled.js +1 -1
- package/dist/components/navigation/Tabs/types.js +1 -1
- package/dist/components/navigation/Tabs/use-tab-editing.js +1 -1
- package/dist/components/navigation/Tabs/use-tab-indicator.js +1 -1
- package/dist/components/organisms/FileTabs/FileTabs.js +1 -1
- package/dist/components/organisms/StatsCard/StatsCard.js +1 -1
- package/dist/components/other/Calendar/Calendar.js +1 -1
- package/dist/components/other/Calendar/CalendarCell.js +1 -1
- package/dist/components/other/Calendar/CalendarGrid.js +1 -1
- package/dist/components/other/Calendar/RangeCalendar.js +1 -1
- package/dist/components/other/CubeLogo/CubeLogo.d.ts +10 -0
- package/dist/components/other/CubeLogo/CubeLogo.js +120 -0
- package/dist/components/other/CubeLogo/CubeLogo.js.map +1 -0
- package/dist/components/overlays/AlertDialog/AlertDialog.js +1 -1
- package/dist/components/overlays/AlertDialog/AlertDialogApiProvider.js +1 -1
- package/dist/components/overlays/AlertDialog/AlertDialogZone.js +1 -1
- package/dist/components/overlays/Dialog/Dialog.js +1 -1
- package/dist/components/overlays/Dialog/DialogContainer.js +1 -1
- package/dist/components/overlays/Dialog/DialogForm.js +1 -1
- package/dist/components/overlays/Dialog/DialogTrigger.js +1 -1
- package/dist/components/overlays/Dialog/context.js +1 -1
- package/dist/components/overlays/Dialog/use-dialog-container.js +1 -1
- package/dist/components/overlays/Modal/Modal.js +1 -1
- package/dist/components/overlays/Modal/OpenTransitionContext.js +1 -1
- package/dist/components/overlays/Modal/Overlay.js +1 -1
- package/dist/components/overlays/Modal/Popover.js +1 -1
- package/dist/components/overlays/Modal/Tray.js +1 -1
- package/dist/components/overlays/Modal/Underlay.js +1 -1
- package/dist/components/overlays/Notifications/Notification.js +1 -1
- package/dist/components/overlays/Notifications/NotificationAction.js +1 -1
- package/dist/components/overlays/Notifications/NotificationCard.js +1 -1
- package/dist/components/overlays/Notifications/NotificationContext.js +1 -1
- package/dist/components/overlays/Notifications/NotificationItem.js +1 -1
- package/dist/components/overlays/Notifications/OverlayContainer.js +1 -1
- package/dist/components/overlays/Notifications/OverlayProvider.js +1 -1
- package/dist/components/overlays/Notifications/PersistentNotificationsList.js +1 -1
- package/dist/components/overlays/Notifications/dismissed-storage.js +1 -1
- package/dist/components/overlays/Notifications/format-relative-time.js +1 -1
- package/dist/components/overlays/Notifications/index.js +1 -1
- package/dist/components/overlays/Notifications/use-notification-state.js +1 -1
- package/dist/components/overlays/Notifications/use-notifications.js +1 -1
- package/dist/components/overlays/Notifications/use-overlay-timers.js +1 -1
- package/dist/components/overlays/Notifications/use-persistent-notifications.js +1 -1
- package/dist/components/overlays/Notifications/use-persistent-state.js +1 -1
- package/dist/components/overlays/Notifications/use-toast-state.js +1 -1
- package/dist/components/overlays/Toast/ToastItem.js +1 -1
- package/dist/components/overlays/Toast/index.js +1 -1
- package/dist/components/overlays/Toast/useProgressToast.js +1 -1
- package/dist/components/overlays/Toast/useToast.js +1 -1
- package/dist/components/overlays/Tooltip/Tooltip.js +1 -1
- package/dist/components/overlays/Tooltip/TooltipProvider.js +1 -1
- package/dist/components/overlays/Tooltip/TooltipTrigger.js +1 -1
- package/dist/components/overlays/Tooltip/context.js +1 -1
- package/dist/components/portal/Portal.js +1 -1
- package/dist/components/portal/PortalProvider.js +1 -1
- package/dist/components/portal/usePortal.js +1 -1
- package/dist/components/shared/DraggableCollection.js +1 -1
- package/dist/components/shared/InvalidIcon.js +1 -1
- package/dist/components/shared/ValidIcon.js +1 -1
- package/dist/components/status/LoadingAnimation/LoadingAnimation.js +1 -1
- package/dist/components/status/Spin/Cube.js +1 -1
- package/dist/components/status/Spin/InternalSpinner.js +1 -1
- package/dist/components/status/Spin/Spin.js +1 -1
- package/dist/components/status/Spin/SpinsContainer.js +1 -1
- package/dist/data/item-themes.js +5 -3
- package/dist/data/item-themes.js.map +1 -1
- package/dist/data/themes.js +1 -1
- package/dist/i18n/I18nProvider.js +1 -1
- package/dist/i18n/createFormatter.js +1 -1
- package/dist/i18n/index.js +1 -1
- package/dist/i18n/instance.js +1 -1
- package/dist/i18n/locales/de-DE/uikit.js +1 -1
- package/dist/i18n/locales/en-US/uikit.js +1 -1
- package/dist/i18n/locales/es-ES/uikit.js +1 -1
- package/dist/i18n/locales/es-MX/uikit.js +1 -1
- package/dist/i18n/locales/fr-FR/uikit.js +1 -1
- package/dist/i18n/locales/it-IT/uikit.js +1 -1
- package/dist/i18n/locales/ja-JP/uikit.js +1 -1
- package/dist/i18n/locales/nb-NO/uikit.js +1 -1
- package/dist/i18n/locales/pt-BR/uikit.js +1 -1
- package/dist/i18n/locales/pt-PT/uikit.js +1 -1
- package/dist/i18n/locales/sv-SE/uikit.js +1 -1
- package/dist/i18n/locales/vi-VN/uikit.js +1 -1
- package/dist/i18n/locales.js +1 -1
- package/dist/i18n/useFormatter.js +1 -1
- package/dist/i18n/useI18n.js +1 -1
- package/dist/icons/AdjustmentsHorizontalIcon.js +1 -1
- package/dist/icons/AdjustmentsIcon.js +1 -1
- package/dist/icons/AiIcon.js +1 -1
- package/dist/icons/AreaChartIcon.js +1 -1
- package/dist/icons/BackwardIcon.js +1 -1
- package/dist/icons/BarChartIcon.js +1 -1
- package/dist/icons/BellFilledIcon.js +1 -1
- package/dist/icons/BellIcon.js +1 -1
- package/dist/icons/BooleanIcon.js +1 -1
- package/dist/icons/CalendarEditIcon.js +1 -1
- package/dist/icons/CalendarIcon.js +1 -1
- package/dist/icons/CaretDownIcon.js +1 -1
- package/dist/icons/CaretUpIcon.js +1 -1
- package/dist/icons/ChartAreaStackedIcon.js +1 -1
- package/dist/icons/ChartAreaStackedPercentageIcon.js +1 -1
- package/dist/icons/ChartBarGroupedHorizontalIcon.js +1 -1
- package/dist/icons/ChartBarGroupedIcon.js +1 -1
- package/dist/icons/ChartBarHorizontalIcon.js +1 -1
- package/dist/icons/ChartBarLineIcon.js +1 -1
- package/dist/icons/ChartBarStackedHorizontalIcon.js +1 -1
- package/dist/icons/ChartBarStackedIcon.js +1 -1
- package/dist/icons/ChartBarStackedPercentageHorizontalIcon.js +1 -1
- package/dist/icons/ChartBarStackedPercentageIcon.js +1 -1
- package/dist/icons/ChartBoxPlot2Icon.js +1 -1
- package/dist/icons/ChartBoxPlotIcon.js +1 -1
- package/dist/icons/ChartBubbleIcon.js +1 -1
- package/dist/icons/ChartDonut2Icon.js +1 -1
- package/dist/icons/ChartFunnelIcon.js +1 -1
- package/dist/icons/ChartHeatmapIcon.js +1 -1
- package/dist/icons/ChartKPIIcon.js +1 -1
- package/dist/icons/ChartPie2Icon.js +1 -1
- package/dist/icons/ChartScatterIcon.js +1 -1
- package/dist/icons/CheckCircleFilledIcon.js +1 -1
- package/dist/icons/CheckCircleIcon.js +1 -1
- package/dist/icons/CheckIcon.js +1 -1
- package/dist/icons/CircleFilledIcon.js +1 -1
- package/dist/icons/ClearIcon.js +1 -1
- package/dist/icons/CloseCircleFilledIcon.js +1 -1
- package/dist/icons/CloseCircleIcon.js +1 -1
- package/dist/icons/CloseIcon.js +1 -1
- package/dist/icons/CodeIcon.js +1 -1
- package/dist/icons/ColumnTotalIcon.js +1 -1
- package/dist/icons/CopyIcon.js +1 -1
- package/dist/icons/CountIcon.js +1 -1
- package/dist/icons/CubeIcon.js +1 -1
- package/dist/icons/CubePauseIcon.js +1 -1
- package/dist/icons/CubePlayIcon.js +1 -1
- package/dist/icons/CurrencyDollarIcon.js +1 -1
- package/dist/icons/DangerIcon.js +1 -1
- package/dist/icons/DashboardIcon.js +1 -1
- package/dist/icons/DatabaseIcon.js +1 -1
- package/dist/icons/DecimalDecreaseIcon.js +1 -1
- package/dist/icons/DecimalIncreaseIcon.js +1 -1
- package/dist/icons/DirectionIcon.js +1 -1
- package/dist/icons/DonutIcon.js +1 -1
- package/dist/icons/DownIcon.js +1 -1
- package/dist/icons/EditIcon.js +1 -1
- package/dist/icons/ExclamationCircleFilledIcon.js +1 -1
- package/dist/icons/ExclamationCircleIcon.js +1 -1
- package/dist/icons/ExclamationIcon.js +1 -1
- package/dist/icons/EyeIcon.js +1 -1
- package/dist/icons/EyeInvisibleIcon.js +1 -1
- package/dist/icons/FilterIcon.js +1 -1
- package/dist/icons/FolderFilledIcon.js +1 -1
- package/dist/icons/FolderIcon.js +1 -1
- package/dist/icons/FolderOpenFilledIcon.js +1 -1
- package/dist/icons/FolderOpenIcon.js +1 -1
- package/dist/icons/ForwardIcon.js +1 -1
- package/dist/icons/GripVerticalIcon.js +1 -1
- package/dist/icons/HierarchyIcon.js +1 -1
- package/dist/icons/HierarchyOpenIcon.js +1 -1
- package/dist/icons/Icon.js +1 -1
- package/dist/icons/InfoCircleIcon.js +1 -1
- package/dist/icons/InfoIcon.js +1 -1
- package/dist/icons/KeyIcon.js +1 -1
- package/dist/icons/LeftIcon.js +1 -1
- package/dist/icons/LineChartIcon.js +1 -1
- package/dist/icons/LoadingIcon.js +1 -1
- package/dist/icons/LockFilledIcon.js +1 -1
- package/dist/icons/LockIcon.js +1 -1
- package/dist/icons/MoreIcon.js +1 -1
- package/dist/icons/NotAllowedIcon.js +1 -1
- package/dist/icons/Number123Icon.js +1 -1
- package/dist/icons/NumberIcon.js +1 -1
- package/dist/icons/PauseCircleFilledIcon.js +1 -1
- package/dist/icons/PauseCircleIcon.js +1 -1
- package/dist/icons/PauseIcon.js +1 -1
- package/dist/icons/PercentageIcon.js +1 -1
- package/dist/icons/PieChartIcon.js +1 -1
- package/dist/icons/PlayCircleIcon.js +1 -1
- package/dist/icons/PlayIcon.js +1 -1
- package/dist/icons/PlusIcon.js +1 -1
- package/dist/icons/ProgressBarIcon.js +1 -1
- package/dist/icons/ReloadIcon.js +1 -1
- package/dist/icons/ReportIcon.js +1 -1
- package/dist/icons/ReturnIcon.js +1 -1
- package/dist/icons/RightIcon.js +1 -1
- package/dist/icons/RowTotalsIcon.js +1 -1
- package/dist/icons/SchemeIcon.js +1 -1
- package/dist/icons/SearchIcon.js +1 -1
- package/dist/icons/SemanticQueryIcon.js +1 -1
- package/dist/icons/SettingsIcon.js +1 -1
- package/dist/icons/ShieldFilledIcon.js +1 -1
- package/dist/icons/ShieldIcon.js +1 -1
- package/dist/icons/SlashIcon.js +1 -1
- package/dist/icons/SparklesIcon.js +1 -1
- package/dist/icons/SqlIcon.js +1 -1
- package/dist/icons/StatsIcon.js +1 -1
- package/dist/icons/StopIcon.js +1 -1
- package/dist/icons/StringIcon.js +1 -1
- package/dist/icons/SubtotalsIcon.js +1 -1
- package/dist/icons/SwitchIcon.js +1 -1
- package/dist/icons/TableIcon.js +1 -1
- package/dist/icons/ThumbsDownIcon.js +1 -1
- package/dist/icons/ThumbsUpIcon.js +1 -1
- package/dist/icons/ThunderboltCrossedIcon.js +1 -1
- package/dist/icons/ThunderboltFilledIcon.js +1 -1
- package/dist/icons/ThunderboltIcon.js +1 -1
- package/dist/icons/TimeIcon.js +1 -1
- package/dist/icons/TrashIcon.js +1 -1
- package/dist/icons/UnlockIcon.js +1 -1
- package/dist/icons/UpIcon.js +1 -1
- package/dist/icons/UserGroupIcon.js +1 -1
- package/dist/icons/UserIcon.js +1 -1
- package/dist/icons/UserLockIcon.js +1 -1
- package/dist/icons/ViewIcon.js +1 -1
- package/dist/icons/WarningFilledIcon.js +1 -1
- package/dist/icons/WarningIcon.js +1 -1
- package/dist/icons/wrap-icon.js +1 -1
- package/dist/index.d.ts +6 -5
- package/dist/index.js +6 -5
- package/dist/index.js.map +1 -1
- package/dist/provider.js +1 -1
- package/dist/providers/TrackingProvider.js +1 -1
- package/dist/providers/navigationAdapter.default.js +1 -1
- package/dist/tokens/base.js +1 -1
- package/dist/tokens/colors.d.ts +2 -7
- package/dist/tokens/colors.js +16 -7
- package/dist/tokens/colors.js.map +1 -1
- package/dist/tokens/index.d.ts +5 -17
- package/dist/tokens/index.js +23 -13
- package/dist/tokens/index.js.map +1 -1
- package/dist/tokens/layout.js +1 -1
- package/dist/tokens/lazy-styles.js +33 -0
- package/dist/tokens/lazy-styles.js.map +1 -0
- package/dist/tokens/palette.d.ts +15 -0
- package/dist/tokens/palette.js +166 -123
- 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.d.ts +1 -0
- package/dist/tokens/typography.js +29 -1
- package/dist/tokens/typography.js.map +1 -1
- package/dist/utils/ResizeSensor.js +1 -1
- package/dist/utils/is-dev-env.js +1 -1
- package/dist/utils/modules.js +1 -1
- package/dist/utils/promise.js +1 -1
- package/dist/utils/raf.js +1 -1
- package/dist/utils/random.js +1 -1
- package/dist/utils/range.js +1 -1
- package/dist/utils/react/RenderCache.js +1 -1
- package/dist/utils/react/Slots.js +1 -1
- package/dist/utils/react/chain.js +1 -1
- package/dist/utils/react/forwardRefWithGenerics.js +1 -1
- package/dist/utils/react/index.js +1 -1
- package/dist/utils/react/interactions.js +1 -1
- package/dist/utils/react/isTextOnly.js +1 -1
- package/dist/utils/react/mapProps.js +1 -1
- package/dist/utils/react/mergeProps.js +1 -1
- package/dist/utils/react/nullableValue.js +1 -1
- package/dist/utils/react/resolveIcon.js +1 -1
- package/dist/utils/react/sharedStore.js +1 -1
- package/dist/utils/react/useCombinedRefs.js +1 -1
- package/dist/utils/react/useControlledFocusVisible.js +1 -1
- package/dist/utils/react/useEventBus.js +1 -1
- package/dist/utils/react/useId.js +1 -1
- package/dist/utils/react/useIsDarwin.js +1 -1
- package/dist/utils/react/useKeySymbols.js +1 -1
- package/dist/utils/react/useLayoutEffect.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/Colors.md +77 -0
- package/docs/Typography.md +1 -1
- package/docs/Usage.md +10 -0
- package/docs/components/content/CopySnippet.md +1 -1
- package/docs/components/content/PrismCode.md +1 -0
- package/docs/components/other/CubeLogo.md +58 -0
- package/docs/glaze/api.md +1033 -414
- package/docs/glaze/methodology.md +536 -208
- package/docs/glaze/migration.md +127 -49
- package/docs/glaze/okhst.md +190 -0
- package/package.json +2 -2
- package/dist/components/other/CloudLogo/CloudLogo.d.ts +0 -11
- package/dist/components/other/CloudLogo/CloudLogo.js +0 -110
- package/dist/components/other/CloudLogo/CloudLogo.js.map +0 -1
- package/docs/components/other/CloudLogo.md +0 -45
|
@@ -1,336 +1,664 @@
|
|
|
1
1
|
# Methodology
|
|
2
2
|
|
|
3
|
-
A practical
|
|
3
|
+
A practical way to design a Glaze palette without fighting dark mode. Start from
|
|
4
|
+
tone relationships, add contrast only where a role needs a readable floor, and
|
|
5
|
+
let `extend()` carry the same decisions across status hues.
|
|
4
6
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
The default theme is what most components consume — its tokens are emitted unprefixed (`#surface`, `#border`). Colored themes are scoped to status surfaces and accent variants, emitted with a theme-name prefix (`#success-surface`, `#danger-accent-surface`).
|
|
10
|
-
|
|
11
|
-
You design the default theme once, and `extend()` propagates that design across every status hue.
|
|
12
|
-
|
|
13
|
-
Every color definition has an **`inherit`** flag (default: `true`) controlling whether it flows into child themes via `extend()`. Set `inherit: false` to scope a color to its parent theme only — this is how sibling themes stay lean, carrying only the tokens they actually need.
|
|
7
|
+
For the full API surface, see [api.md](api.md). For the Glaze color-model
|
|
8
|
+
overview, see [okhst.md](okhst.md); the derivation lives in the
|
|
9
|
+
[canonical OKHST specification](https://github.com/tenphi/okhst).
|
|
14
10
|
|
|
15
|
-
##
|
|
11
|
+
## The mental model
|
|
16
12
|
|
|
17
|
-
|
|
13
|
+
Glaze palettes work best as one default neutral theme plus a few colored sibling
|
|
14
|
+
themes:
|
|
15
|
+
|
|
16
|
+
- `default` owns the neutral system most components consume: `#surface`,
|
|
17
|
+
`#surface-text`, `#border`, `#disabled-surface`, and so on.
|
|
18
|
+
- Status themes (`success`, `danger`, `warning`, `note`, ...) are created with
|
|
19
|
+
`extend()`. They swap the hue and keep only the inherited tokens that should
|
|
20
|
+
become status-aware.
|
|
21
|
+
- `inherit: false` keeps a token local to the parent theme. Use it for neutral
|
|
22
|
+
ladders, shadows, code colors, overlays, and anything that should not be
|
|
23
|
+
repeated for every status hue.
|
|
24
|
+
|
|
25
|
+
The main simplification is OKHST tone. Dark mode is a single inversion
|
|
26
|
+
(`100 - t`) plus a scheme tone window, so a relative **tone delta** stays
|
|
27
|
+
anchored to its base in every scheme. A token authored as `tone: '-4'` remains
|
|
28
|
+
the same kind of visual step in light and dark. The step is exactly
|
|
29
|
+
contrast-even for neutrals and approximate for chromatic colors; add a
|
|
30
|
+
`contrast` floor when the measured result matters.
|
|
31
|
+
|
|
32
|
+
Use `glaze.color()` instead of a theme when you need one standalone color or
|
|
33
|
+
one base/dependent pair and do not need a named palette. The same tone,
|
|
34
|
+
adaptation, and contrast rules apply; see
|
|
35
|
+
[Standalone color tokens](api.md#standalone-color-tokens).
|
|
36
|
+
|
|
37
|
+
## Implementation workflow
|
|
38
|
+
|
|
39
|
+
Build in dependency order so every decision has a clear base:
|
|
40
|
+
|
|
41
|
+
1. Configure the output schemes and application states once.
|
|
42
|
+
2. Choose the default theme's hue and saturation seed.
|
|
43
|
+
3. Define root surfaces with absolute tones.
|
|
44
|
+
4. Add dependent surfaces, text, borders, and icons with tone deltas.
|
|
45
|
+
5. Add contrast floors only to roles that need measured readability or
|
|
46
|
+
recognizability.
|
|
47
|
+
6. Choose adaptation per color: `auto`, `fixed`, or `static`.
|
|
48
|
+
7. Add explicit HC pairs where high contrast should increase separation.
|
|
49
|
+
8. Mark default-only tokens `inherit: false`, then extend the shared
|
|
50
|
+
definitions into status themes.
|
|
51
|
+
9. Compose and export the palette in the shape your application consumes.
|
|
52
|
+
10. Verify complete screens in all emitted scheme variants.
|
|
53
|
+
|
|
54
|
+
The sections below follow this order and build one palette incrementally.
|
|
55
|
+
|
|
56
|
+
## Authoring decisions
|
|
57
|
+
|
|
58
|
+
Use this order when defining a token:
|
|
59
|
+
|
|
60
|
+
1. Pick the base it visually belongs to.
|
|
61
|
+
2. Use an absolute numeric `tone` for independent placement. Use a signed
|
|
62
|
+
**tone delta** (`'+N'` / `'-N'`) for distance from a base: surface ladders,
|
|
63
|
+
soft chips, disabled states, hover ramps, and similar relationships.
|
|
64
|
+
3. Add `contrast` only when readability or recognizability needs a measured
|
|
65
|
+
floor.
|
|
66
|
+
4. Prefer APCA presets for content-like colors when perceptual readability is
|
|
67
|
+
the design goal:
|
|
68
|
+
`contrast: { apca: 'content' }` or
|
|
69
|
+
`contrast: { apca: ['content', 'body'] }`.
|
|
70
|
+
5. Use WCAG numbers or presets when compatibility, policy, or migration
|
|
71
|
+
requires a WCAG ratio:
|
|
72
|
+
`contrast: 4.5`, `contrast: 'AAA'`, or `contrast: { wcag: [4.5, 7] }`.
|
|
73
|
+
6. Let token names infer APCA roles. Names ending in `text`, `label`, `border`,
|
|
74
|
+
`surface`, `fill`, `bg`, and similar aliases already tell Glaze which side is
|
|
75
|
+
foreground or background. Set `role` only when a name is ambiguous.
|
|
76
|
+
7. Add high-contrast pairs only where HC should intentionally tighten:
|
|
77
|
+
text/content contrast, border tone, shadow intensity, mix value, or similar.
|
|
78
|
+
|
|
79
|
+
### Choosing adaptation mode
|
|
80
|
+
|
|
81
|
+
| Mode | Choose it when |
|
|
82
|
+
| ---------------- | --------------------------------------------------------------------------------------------------------------------------- |
|
|
83
|
+
| `auto` (default) | The color should exchange light/dark positions through dark tone inversion. Typical for surfaces, text, borders, and icons. |
|
|
84
|
+
| `fixed` | A brand fill, status banner, or inverse surface should stay on the authored side of the tone scale. |
|
|
85
|
+
| `static` | The exact authored tone and saturation must render in every scheme, without tone-window mapping or dark desaturation. |
|
|
86
|
+
|
|
87
|
+
Dark tone inversion is controlled by `mode`; it is unrelated to `autoFlip`.
|
|
88
|
+
`autoFlip` only allows an overshooting tone delta or an unsuccessful contrast
|
|
89
|
+
direction to reverse around its base.
|
|
90
|
+
|
|
91
|
+
### Root or dependent?
|
|
92
|
+
|
|
93
|
+
- Use a root color when its tone has meaning on its own: the page surface, a
|
|
94
|
+
fixed brand anchor, or a scheme extreme.
|
|
95
|
+
- Use a dependent color when its purpose exists relative to another token:
|
|
96
|
+
text on a surface, a border around a fill, or a tint of an accent.
|
|
97
|
+
- Setting `base` with an absolute tone is valid when the color needs a contrast
|
|
98
|
+
relationship but not a tone delta. The absolute position is resolved
|
|
99
|
+
independently; `contrast` acts as a safety floor.
|
|
100
|
+
|
|
101
|
+
## Seed and configure
|
|
102
|
+
|
|
103
|
+
Keep hue decisions named and configure output modes once:
|
|
18
104
|
|
|
19
105
|
```ts
|
|
20
|
-
|
|
106
|
+
import { glaze } from '@tenphi/glaze';
|
|
107
|
+
|
|
108
|
+
const PURPLE_HUE = 280.3;
|
|
21
109
|
const SUCCESS_HUE = 156.9;
|
|
22
|
-
const DANGER_HUE
|
|
110
|
+
const DANGER_HUE = 23.1;
|
|
23
111
|
const WARNING_HUE = 84.3;
|
|
24
|
-
const NOTE_HUE
|
|
112
|
+
const NOTE_HUE = 302.3;
|
|
25
113
|
|
|
26
114
|
const SEED_SATURATION = 80;
|
|
115
|
+
|
|
116
|
+
glaze.configure({
|
|
117
|
+
states: { dark: '@dark', highContrast: '@hc' },
|
|
118
|
+
modes: { dark: true, highContrast: true },
|
|
119
|
+
});
|
|
27
120
|
```
|
|
28
121
|
|
|
29
|
-
|
|
122
|
+
Per-color `saturation` is a factor of the theme seed, not an absolute
|
|
123
|
+
saturation. With `SEED_SATURATION = 80`, `saturation: 0.25` means one quarter of
|
|
124
|
+
that seed.
|
|
30
125
|
|
|
31
|
-
|
|
126
|
+
### When dark needs its own chroma
|
|
32
127
|
|
|
33
|
-
|
|
128
|
+
Dark schemes get a flat `darkDesaturation` haircut (10% by default), which is
|
|
129
|
+
enough for most palettes. Reach for a second seed only when dark is wrong in a
|
|
130
|
+
way a uniform reduction cannot fix — a hue that reads muddy against dark
|
|
131
|
+
surfaces, or an accent that stays gaudy no matter how much you dial the global
|
|
132
|
+
knob:
|
|
34
133
|
|
|
35
134
|
```ts
|
|
36
|
-
glaze
|
|
37
|
-
|
|
38
|
-
|
|
135
|
+
const primary = glaze({
|
|
136
|
+
hue: PURPLE_HUE,
|
|
137
|
+
saturation: SEED_SATURATION,
|
|
138
|
+
darkHue: PURPLE_HUE - 12, // cooler purple on dark surfaces
|
|
139
|
+
darkSaturation: 62, // calmer than a 10% haircut would give
|
|
39
140
|
});
|
|
40
141
|
```
|
|
41
142
|
|
|
42
|
-
|
|
143
|
+
An explicit `darkSaturation` replaces `darkDesaturation` rather than stacking
|
|
144
|
+
with it, so the number you write is the number you get. Prefer tuning the seed
|
|
145
|
+
over per-color `darkHue` / `darkSaturation`: one seed keeps the palette
|
|
146
|
+
coherent, while scattered per-color dark overrides drift apart as the palette
|
|
147
|
+
grows. Save the per-color form for the one or two tokens that genuinely need it.
|
|
43
148
|
|
|
44
|
-
## Naming
|
|
149
|
+
## Naming
|
|
45
150
|
|
|
46
|
-
|
|
151
|
+
Prefer purpose first and variant last:
|
|
47
152
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
| Brand-tinted disabled | `accent-disabled-surface`, `accent-disabled-surface-text` |
|
|
59
|
-
| Code syntax highlighting | `code-comment`, `code-keyword`, `code-string`, `code-number`, … |
|
|
60
|
-
| Loading animation | `loading-face-1`, `loading-face-2`, `loading-face-3` |
|
|
61
|
-
| Shadows | `shadow-sm`, `shadow-md`, `shadow-lg` |
|
|
62
|
-
| Backdrop | `overlay` |
|
|
153
|
+
- Surfaces: `surface`, `surface-2`, `surface-3`.
|
|
154
|
+
- Foregrounds: `surface-text`, `surface-text-soft`, `surface-text-soft-2`.
|
|
155
|
+
- Structure: `border`, `divider`, `outline`, `placeholder`, `focus`.
|
|
156
|
+
- Fills: `accent-surface`, `accent-surface-2`,
|
|
157
|
+
`accent-surface-hover`.
|
|
158
|
+
- Foregrounds on neutral surfaces: `accent-text`, `accent-text-soft`,
|
|
159
|
+
`accent-icon`.
|
|
160
|
+
- Disabled states: `disabled-surface`, `disabled-surface-text`,
|
|
161
|
+
`accent-disabled-surface`, `accent-disabled-surface-text`.
|
|
162
|
+
- Effects: `shadow-sm`, `shadow-md`, `shadow-lg`, `overlay`, `hover`, `tint`.
|
|
63
163
|
|
|
64
|
-
|
|
164
|
+
These names are not only readable. They also help APCA role inference pick the
|
|
165
|
+
right polarity. For example, `button-text` is foreground, `input-bg` is a
|
|
166
|
+
surface, and `card-outline` is a border.
|
|
65
167
|
|
|
66
|
-
##
|
|
168
|
+
## Build the default theme
|
|
67
169
|
|
|
68
|
-
|
|
170
|
+
Start with the surface family. It is mostly tone, with small saturation changes
|
|
171
|
+
to keep the ladder visually coherent:
|
|
69
172
|
|
|
70
173
|
```ts
|
|
174
|
+
const defaultTheme = glaze(PURPLE_HUE, SEED_SATURATION);
|
|
175
|
+
|
|
71
176
|
defaultTheme.colors({
|
|
72
|
-
surface:
|
|
73
|
-
'surface-2': {
|
|
74
|
-
|
|
177
|
+
surface: { tone: 100, saturation: 0.11 },
|
|
178
|
+
'surface-2': {
|
|
179
|
+
base: 'surface',
|
|
180
|
+
tone: '-2',
|
|
181
|
+
saturation: 0.15,
|
|
182
|
+
inherit: false,
|
|
183
|
+
},
|
|
184
|
+
'surface-3': {
|
|
185
|
+
base: 'surface',
|
|
186
|
+
tone: '-4',
|
|
187
|
+
saturation: 0.19,
|
|
188
|
+
inherit: false,
|
|
189
|
+
},
|
|
75
190
|
});
|
|
76
191
|
```
|
|
77
192
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
193
|
+
Because each tone delta re-anchors to the resolved surface in every scheme,
|
|
194
|
+
these small relative offsets are enough to define the ladder. There is no
|
|
195
|
+
separate dark-mode curve to tune.
|
|
81
196
|
|
|
82
|
-
|
|
197
|
+
### Text and borders
|
|
83
198
|
|
|
84
|
-
|
|
199
|
+
Use a hard edge tone for maximum-prominence text, and APCA floors for softer
|
|
200
|
+
content:
|
|
85
201
|
|
|
86
202
|
```ts
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
'surface
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
},
|
|
203
|
+
defaultTheme.colors({
|
|
204
|
+
'surface-text': {
|
|
205
|
+
base: 'surface',
|
|
206
|
+
tone: 2,
|
|
207
|
+
saturation: 0.475,
|
|
208
|
+
},
|
|
209
|
+
'surface-text-soft': {
|
|
210
|
+
base: 'surface',
|
|
211
|
+
tone: '-1',
|
|
212
|
+
saturation: 0.375,
|
|
213
|
+
contrast: { apca: ['content', 'body'] },
|
|
214
|
+
inherit: false,
|
|
215
|
+
},
|
|
216
|
+
'surface-text-soft-2': {
|
|
217
|
+
base: 'surface',
|
|
218
|
+
tone: '-1',
|
|
219
|
+
saturation: 0.24,
|
|
220
|
+
contrast: { apca: ['large', 'content'] },
|
|
221
|
+
inherit: false,
|
|
222
|
+
},
|
|
223
|
+
border: {
|
|
224
|
+
base: 'surface',
|
|
225
|
+
tone: ['-10', '-20'],
|
|
226
|
+
saturation: 0.175,
|
|
227
|
+
inherit: false,
|
|
228
|
+
},
|
|
229
|
+
});
|
|
98
230
|
```
|
|
99
231
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
232
|
+
`surface-text` uses an absolute `tone: 2` despite having a base: it is
|
|
233
|
+
intentionally edge-anchored, and the base records the relationship used by
|
|
234
|
+
role inference. The soft variants use a `-1` tone delta as the preferred
|
|
235
|
+
direction and APCA as the readable floor. `border` uses an HC tone-delta pair
|
|
236
|
+
because borders usually need a larger visible step in high contrast.
|
|
105
237
|
|
|
106
|
-
|
|
238
|
+
Repeat the same pattern for `surface-2` and `surface-3` only if components need
|
|
239
|
+
text directly on those surfaces.
|
|
107
240
|
|
|
108
|
-
|
|
241
|
+
### Neutral utility tokens
|
|
109
242
|
|
|
110
|
-
|
|
243
|
+
Keep neutral-only primitives local to the default theme:
|
|
111
244
|
|
|
112
245
|
```ts
|
|
113
|
-
|
|
114
|
-
placeholder: {
|
|
115
|
-
|
|
116
|
-
|
|
246
|
+
defaultTheme.colors({
|
|
247
|
+
placeholder: {
|
|
248
|
+
base: 'surface',
|
|
249
|
+
tone: 67,
|
|
250
|
+
saturation: 0.175,
|
|
251
|
+
inherit: false,
|
|
252
|
+
},
|
|
253
|
+
focus: {
|
|
254
|
+
base: 'surface',
|
|
255
|
+
tone: 71,
|
|
256
|
+
saturation: 0.8625,
|
|
257
|
+
inherit: false,
|
|
258
|
+
},
|
|
259
|
+
disabled: {
|
|
260
|
+
tone: 80.8,
|
|
261
|
+
saturation: 0.4,
|
|
262
|
+
inherit: false,
|
|
263
|
+
},
|
|
264
|
+
});
|
|
117
265
|
```
|
|
118
266
|
|
|
119
|
-
|
|
267
|
+
Absolute tones are fine for primitives whose job is visual placement rather than
|
|
268
|
+
a strict relationship to a specific surface.
|
|
120
269
|
|
|
121
|
-
##
|
|
270
|
+
## Chips and disabled states
|
|
122
271
|
|
|
123
|
-
|
|
272
|
+
For subtle fills, tone is usually clearer than contrast:
|
|
124
273
|
|
|
125
274
|
```ts
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
275
|
+
defaultTheme.colors({
|
|
276
|
+
'disabled-surface': {
|
|
277
|
+
base: 'surface',
|
|
278
|
+
tone: '-3',
|
|
279
|
+
saturation: 0.2,
|
|
280
|
+
inherit: false,
|
|
281
|
+
},
|
|
282
|
+
'disabled-surface-text': {
|
|
283
|
+
base: 'disabled-surface',
|
|
284
|
+
tone: '+18',
|
|
285
|
+
saturation: 0.3,
|
|
286
|
+
autoFlip: false,
|
|
287
|
+
inherit: false,
|
|
288
|
+
},
|
|
289
|
+
});
|
|
134
290
|
```
|
|
135
291
|
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
292
|
+
This says exactly what the pair should do: the chip sits a small tone delta off
|
|
293
|
+
the page, and the label sits a muted delta from the chip. `autoFlip: false`
|
|
294
|
+
keeps the label on the authored side when the delta reaches the edge.
|
|
139
295
|
|
|
140
|
-
|
|
296
|
+
Use contrast instead when the chip must hit an explicit accessibility floor:
|
|
141
297
|
|
|
142
298
|
```ts
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
299
|
+
defaultTheme.colors({
|
|
300
|
+
'disabled-surface-text': {
|
|
301
|
+
base: 'disabled-surface',
|
|
302
|
+
tone: '+1',
|
|
303
|
+
saturation: 0.3,
|
|
304
|
+
contrast: { apca: 'non-text' },
|
|
305
|
+
inherit: false,
|
|
306
|
+
},
|
|
307
|
+
});
|
|
146
308
|
```
|
|
147
309
|
|
|
148
|
-
|
|
310
|
+
When a token needs the scheme extreme, use `tone: 'min'` or `tone: 'max'`
|
|
311
|
+
directly. Avoid large magic numbers or fake contrast floors just to push a color
|
|
312
|
+
to the edge.
|
|
149
313
|
|
|
150
|
-
|
|
314
|
+
Pair the extreme with a `base` when the gap between the two has to survive the
|
|
315
|
+
scheme switch. Glaze then replays the light-scheme tone shift against the
|
|
316
|
+
resolved dark base instead of re-mapping the extreme through the dark window,
|
|
317
|
+
so a knockout on a surface keeps the same contrast in both schemes.
|
|
151
318
|
|
|
152
|
-
|
|
319
|
+
## Fixed surfaces and accent fills
|
|
153
320
|
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
The load-bearing trick. Define a single fixed white anchor `accent-surface-text`, then derive every accent surface from it with a small relative lightness offset and a numeric contrast under `mode: 'fixed'`:
|
|
321
|
+
Use `mode: 'fixed'` when the authored color should stay recognizable across
|
|
322
|
+
schemes.
|
|
157
323
|
|
|
158
324
|
```ts
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
325
|
+
defaultTheme.colors({
|
|
326
|
+
'surface-inverse': {
|
|
327
|
+
tone: 12,
|
|
328
|
+
saturation: 0.475,
|
|
329
|
+
mode: 'fixed',
|
|
330
|
+
inherit: false,
|
|
331
|
+
},
|
|
332
|
+
|
|
333
|
+
'accent-surface-text': {
|
|
334
|
+
tone: 100,
|
|
335
|
+
mode: 'fixed',
|
|
336
|
+
},
|
|
337
|
+
'accent-surface': {
|
|
338
|
+
base: 'accent-surface-text',
|
|
339
|
+
tone: '-1',
|
|
340
|
+
contrast: { apca: ['content', 'body'] },
|
|
341
|
+
mode: 'fixed',
|
|
342
|
+
},
|
|
343
|
+
'accent-surface-2': {
|
|
344
|
+
base: 'accent-surface-text',
|
|
345
|
+
tone: '-1',
|
|
346
|
+
contrast: { apca: [65, 80] },
|
|
347
|
+
mode: 'fixed',
|
|
348
|
+
},
|
|
349
|
+
'accent-surface-hover': {
|
|
350
|
+
base: 'accent-surface-text',
|
|
351
|
+
tone: '-1',
|
|
352
|
+
contrast: { apca: ['body', 'preferred'] },
|
|
353
|
+
mode: 'fixed',
|
|
354
|
+
},
|
|
355
|
+
});
|
|
165
356
|
```
|
|
166
357
|
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
- **`mode: 'fixed'` keeps the brand recognizable.** Without it, the dark-scheme Möbius inversion would turn the brand fill into a lightness-inverted counterpart that may no longer read as the intended brand surface. Fixed maps lightness linearly into the dark window, so a `L=52` brand color resolves to ~L=51.6 in dark mode — still recognizably the same color.
|
|
171
|
-
- **Numeric contrasts, not presets.** `'AA'` / `'AAA'` would let the solver push the color far away from its anchor in dark schemes, breaking the relationship between `accent-surface` and its neighbors. Numeric ratios make the darkening between `accent-surface` (4.5/7), `-2` (4.8/7.5), `-3` (5.2/8), and `-hover` (6/8.5) a tight, designed sequence — a stepped gradient rather than four solver-generated outliers.
|
|
172
|
-
|
|
173
|
-
The hover variant is a dedicated *fixed* token. Reusing `accent-text` (which is `mode: 'auto'` and inverts direction in dark) would break the hover feel.
|
|
358
|
+
The accent fill family is a fixed chain against a fixed text anchor. The names
|
|
359
|
+
infer `surface` and `text` roles, so APCA gets the right polarity without extra
|
|
360
|
+
fields.
|
|
174
361
|
|
|
175
362
|
## Adaptive accent foregrounds
|
|
176
363
|
|
|
177
|
-
|
|
364
|
+
Brand foregrounds that sit on neutral surfaces should stay adaptive:
|
|
178
365
|
|
|
179
366
|
```ts
|
|
180
|
-
|
|
181
|
-
'accent-text
|
|
182
|
-
|
|
367
|
+
defaultTheme.colors({
|
|
368
|
+
'accent-text': {
|
|
369
|
+
base: 'surface',
|
|
370
|
+
tone: '-1',
|
|
371
|
+
saturation: 1,
|
|
372
|
+
contrast: { apca: ['content', 'body'] },
|
|
373
|
+
},
|
|
374
|
+
'accent-text-soft': {
|
|
375
|
+
base: 'surface',
|
|
376
|
+
tone: '-1',
|
|
377
|
+
saturation: 1,
|
|
378
|
+
contrast: { apca: ['large', 'content'] },
|
|
379
|
+
},
|
|
380
|
+
'accent-icon': {
|
|
381
|
+
base: 'surface',
|
|
382
|
+
tone: '-1',
|
|
383
|
+
saturation: 0.9375,
|
|
384
|
+
contrast: { apca: ['non-text', 'large'] },
|
|
385
|
+
},
|
|
386
|
+
});
|
|
183
387
|
```
|
|
184
388
|
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
389
|
+
Anchor these to `surface`, not to `accent-surface`. Their real job is to remain
|
|
390
|
+
readable on neutral UI, so `mode: 'auto'` and a surface base are the right
|
|
391
|
+
defaults.
|
|
188
392
|
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
Mirrors the neutral disabled pair from above but with higher saturation so the chip reads as a *muted brand color* rather than fully neutral grey:
|
|
393
|
+
Brand-tinted disabled states can usually be pure tone:
|
|
192
394
|
|
|
193
395
|
```ts
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
396
|
+
defaultTheme.colors({
|
|
397
|
+
'accent-disabled-surface': {
|
|
398
|
+
base: 'surface',
|
|
399
|
+
tone: '+3',
|
|
400
|
+
saturation: 0.5,
|
|
401
|
+
},
|
|
402
|
+
'accent-disabled-surface-text': {
|
|
403
|
+
base: 'accent-disabled-surface',
|
|
404
|
+
tone: '+18',
|
|
405
|
+
saturation: 0.4,
|
|
406
|
+
autoFlip: false,
|
|
407
|
+
},
|
|
408
|
+
});
|
|
202
409
|
```
|
|
203
410
|
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
411
|
+
These are inherited, so status themes automatically get
|
|
412
|
+
`success-accent-disabled-surface`, `danger-accent-disabled-surface`, and the
|
|
413
|
+
matching text tokens.
|
|
207
414
|
|
|
208
|
-
##
|
|
415
|
+
## Special-purpose colors
|
|
209
416
|
|
|
210
|
-
|
|
417
|
+
Use absolute `hue` overrides for tokens that should come from another hue family
|
|
418
|
+
but keep the same adaptation behavior:
|
|
211
419
|
|
|
212
420
|
```ts
|
|
213
|
-
|
|
214
|
-
'code-
|
|
215
|
-
|
|
216
|
-
|
|
421
|
+
defaultTheme.colors({
|
|
422
|
+
'code-comment': {
|
|
423
|
+
base: 'surface',
|
|
424
|
+
hue: 280,
|
|
425
|
+
saturation: 0.1,
|
|
426
|
+
tone: '-1',
|
|
427
|
+
contrast: { apca: ['large', 'content'] },
|
|
428
|
+
inherit: false,
|
|
429
|
+
},
|
|
430
|
+
'code-keyword': {
|
|
431
|
+
base: 'surface',
|
|
432
|
+
hue: 348,
|
|
433
|
+
saturation: 1,
|
|
434
|
+
tone: '-1',
|
|
435
|
+
contrast: { apca: ['content', 'body'] },
|
|
436
|
+
inherit: false,
|
|
437
|
+
},
|
|
438
|
+
'code-string': {
|
|
439
|
+
base: 'surface',
|
|
440
|
+
hue: SUCCESS_HUE,
|
|
441
|
+
saturation: 1,
|
|
442
|
+
tone: '-1',
|
|
443
|
+
contrast: { apca: ['large', 'content'] },
|
|
444
|
+
inherit: false,
|
|
445
|
+
},
|
|
446
|
+
});
|
|
217
447
|
```
|
|
218
448
|
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
## Loading-animation faces
|
|
222
|
-
|
|
223
|
-
A 3-step ramp using *absolute* lightnesses with high saturation factors and tight numeric contrasts:
|
|
449
|
+
Use small tone ramps for decorative motion:
|
|
224
450
|
|
|
225
451
|
```ts
|
|
226
|
-
|
|
227
|
-
'loading-face-
|
|
228
|
-
|
|
452
|
+
defaultTheme.colors({
|
|
453
|
+
'loading-face-1': {
|
|
454
|
+
base: 'surface',
|
|
455
|
+
tone: 98,
|
|
456
|
+
saturation: 0.3,
|
|
457
|
+
inherit: false,
|
|
458
|
+
},
|
|
459
|
+
'loading-face-2': {
|
|
460
|
+
base: 'surface',
|
|
461
|
+
tone: 91,
|
|
462
|
+
saturation: 0.62,
|
|
463
|
+
inherit: false,
|
|
464
|
+
},
|
|
465
|
+
'loading-face-3': {
|
|
466
|
+
base: 'surface',
|
|
467
|
+
tone: 79,
|
|
468
|
+
saturation: 0.66,
|
|
469
|
+
inherit: false,
|
|
470
|
+
},
|
|
471
|
+
});
|
|
229
472
|
```
|
|
230
473
|
|
|
231
|
-
|
|
474
|
+
Since tone steps now invert consistently across schemes, the same ramp keeps its
|
|
475
|
+
spacing in light and dark without involving the contrast solver. Use an HC tone
|
|
476
|
+
pair only when the animation should become more pronounced in high contrast.
|
|
232
477
|
|
|
233
|
-
##
|
|
478
|
+
## Effects
|
|
234
479
|
|
|
235
|
-
|
|
480
|
+
Define one neutral shadow system:
|
|
236
481
|
|
|
237
482
|
```ts
|
|
238
|
-
|
|
239
|
-
'shadow-
|
|
240
|
-
|
|
483
|
+
defaultTheme.colors({
|
|
484
|
+
'shadow-sm': {
|
|
485
|
+
type: 'shadow',
|
|
486
|
+
bg: 'surface',
|
|
487
|
+
fg: 'surface-text',
|
|
488
|
+
intensity: 5,
|
|
489
|
+
inherit: false,
|
|
490
|
+
},
|
|
491
|
+
'shadow-md': {
|
|
492
|
+
type: 'shadow',
|
|
493
|
+
bg: 'surface',
|
|
494
|
+
fg: 'surface-text',
|
|
495
|
+
intensity: [10, 20],
|
|
496
|
+
inherit: false,
|
|
497
|
+
},
|
|
498
|
+
'shadow-lg': {
|
|
499
|
+
type: 'shadow',
|
|
500
|
+
bg: 'surface',
|
|
501
|
+
fg: 'surface-text',
|
|
502
|
+
intensity: [15, 30],
|
|
503
|
+
inherit: false,
|
|
504
|
+
},
|
|
505
|
+
});
|
|
241
506
|
```
|
|
242
507
|
|
|
243
|
-
Including `fg`
|
|
244
|
-
|
|
245
|
-
For HC, pass `intensity: [normal, hc]` (e.g. `[10, 20]`) to deepen shadows in high-contrast mode. The full algorithm and tuning knobs are in [api.md → Shadows](api.md#shadows).
|
|
508
|
+
Including `fg` lets shadow strength follow the resolved foreground/background
|
|
509
|
+
gap. Use an HC pair for shadows that should deepen in high contrast.
|
|
246
510
|
|
|
247
|
-
|
|
511
|
+
Use `opacity` for one fixed-alpha color:
|
|
248
512
|
|
|
249
513
|
```ts
|
|
250
|
-
|
|
514
|
+
defaultTheme.colors({
|
|
515
|
+
overlay: { tone: 10, opacity: 0.5, inherit: false },
|
|
516
|
+
});
|
|
251
517
|
```
|
|
252
518
|
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
## Mixes for hover / tint
|
|
256
|
-
|
|
257
|
-
Reach for mix tokens when you want one color to "tint through" another:
|
|
519
|
+
Use mixes when one color should tint through another:
|
|
258
520
|
|
|
259
521
|
```ts
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
522
|
+
defaultTheme.colors({
|
|
523
|
+
hover: {
|
|
524
|
+
type: 'mix',
|
|
525
|
+
base: 'surface',
|
|
526
|
+
target: 'accent-surface',
|
|
527
|
+
value: 8,
|
|
528
|
+
blend: 'transparent',
|
|
529
|
+
},
|
|
530
|
+
tint: {
|
|
531
|
+
type: 'mix',
|
|
532
|
+
base: 'surface',
|
|
533
|
+
target: 'accent-surface',
|
|
534
|
+
value: 20,
|
|
535
|
+
},
|
|
536
|
+
});
|
|
270
537
|
```
|
|
271
538
|
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
539
|
+
Transparent mixes are good for hover overlays. Opaque mixes are good for solid
|
|
540
|
+
tints. Opaque mixes default to perceptual OKHSL interpolation; choose `srgb`
|
|
541
|
+
when matching channel compositing matters. Transparent mixes always composite
|
|
542
|
+
in linear sRGB. Mix colors can also use `contrast`; the solver adjusts the
|
|
543
|
+
value or opacity to hit the floor. See [Mix colors](api.md#mix-colors).
|
|
276
544
|
|
|
277
|
-
##
|
|
545
|
+
## Extend into status themes
|
|
278
546
|
|
|
279
|
-
|
|
547
|
+
Once the default theme is shaped, create colored siblings by replacing hue and
|
|
548
|
+
overriding only the root surface that should become visibly tinted:
|
|
280
549
|
|
|
281
550
|
```ts
|
|
282
|
-
const TINTED_SURFACE_OVERRIDE
|
|
283
|
-
surface: {
|
|
551
|
+
const TINTED_SURFACE_OVERRIDE = {
|
|
552
|
+
surface: { tone: 96, saturation: 0.8 },
|
|
284
553
|
};
|
|
285
554
|
|
|
286
|
-
const primaryTheme = defaultTheme.extend({
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
const
|
|
290
|
-
|
|
555
|
+
const primaryTheme = defaultTheme.extend({
|
|
556
|
+
colors: TINTED_SURFACE_OVERRIDE,
|
|
557
|
+
});
|
|
558
|
+
const successTheme = defaultTheme.extend({
|
|
559
|
+
hue: SUCCESS_HUE,
|
|
560
|
+
colors: TINTED_SURFACE_OVERRIDE,
|
|
561
|
+
});
|
|
562
|
+
const dangerTheme = defaultTheme.extend({
|
|
563
|
+
hue: DANGER_HUE,
|
|
564
|
+
colors: TINTED_SURFACE_OVERRIDE,
|
|
565
|
+
});
|
|
566
|
+
const warningTheme = defaultTheme.extend({
|
|
567
|
+
hue: WARNING_HUE,
|
|
568
|
+
colors: TINTED_SURFACE_OVERRIDE,
|
|
569
|
+
});
|
|
570
|
+
const noteTheme = defaultTheme.extend({
|
|
571
|
+
hue: NOTE_HUE,
|
|
572
|
+
colors: TINTED_SURFACE_OVERRIDE,
|
|
573
|
+
});
|
|
291
574
|
```
|
|
292
575
|
|
|
293
|
-
|
|
576
|
+
The inherited accent and disabled tokens now resolve in each status hue. Tokens
|
|
577
|
+
marked `inherit: false` stay default-only, so sibling themes remain small.
|
|
294
578
|
|
|
295
|
-
|
|
579
|
+
## Export the palette
|
|
296
580
|
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
Compose all themes into a palette so they can be exported as one token set:
|
|
581
|
+
Compose the themes once:
|
|
300
582
|
|
|
301
583
|
```ts
|
|
302
584
|
const palette = glaze.palette({
|
|
303
585
|
default: defaultTheme,
|
|
304
586
|
primary: primaryTheme,
|
|
305
587
|
success: successTheme,
|
|
306
|
-
danger:
|
|
588
|
+
danger: dangerTheme,
|
|
307
589
|
warning: warningTheme,
|
|
308
|
-
note:
|
|
590
|
+
note: noteTheme,
|
|
309
591
|
});
|
|
310
592
|
```
|
|
311
593
|
|
|
312
|
-
The
|
|
594
|
+
The usual export shape is default unprefixed and status themes prefixed:
|
|
595
|
+
|
|
596
|
+
```ts
|
|
597
|
+
const prefix = {
|
|
598
|
+
default: '',
|
|
599
|
+
primary: 'primary-',
|
|
600
|
+
success: 'success-',
|
|
601
|
+
danger: 'danger-',
|
|
602
|
+
warning: 'warning-',
|
|
603
|
+
note: 'note-',
|
|
604
|
+
};
|
|
605
|
+
|
|
606
|
+
palette.tasty({ prefix });
|
|
607
|
+
```
|
|
608
|
+
|
|
609
|
+
An explicit prefix map is the clearest choice when the palette has a neutral
|
|
610
|
+
`default` theme. The separate palette `primary` option serves another pattern:
|
|
611
|
+
it duplicates one named theme without a prefix while retaining its prefixed
|
|
612
|
+
tokens. Do not combine the two accidentally; choose the token namespace your
|
|
613
|
+
components expect.
|
|
614
|
+
|
|
615
|
+
The palette design is independent of the exporter:
|
|
616
|
+
|
|
617
|
+
```ts
|
|
618
|
+
palette.tokens({ prefix }); // JavaScript maps, native oklch by default
|
|
619
|
+
palette.css({ prefix }); // CSS custom-property declarations
|
|
620
|
+
palette.dtcg({ prefix }); // one design-token tree per scheme
|
|
621
|
+
palette.tailwind({ prefix }); // Tailwind CSS v4 theme
|
|
622
|
+
```
|
|
623
|
+
|
|
624
|
+
Use `palette.tasty({ prefix })` for [Tasty](https://tasty.style) state bindings. See
|
|
625
|
+
[migration.md](migration.md#choosing-an-export) for output shapes, application
|
|
626
|
+
wiring, and the `primary` alias pattern.
|
|
627
|
+
|
|
628
|
+
## High contrast
|
|
313
629
|
|
|
314
|
-
|
|
630
|
+
High contrast is not a separate palette. Any value that accepts an HC pair can
|
|
631
|
+
tighten the HC variant: `tone`, `contrast`, shadow `intensity`, and mix `value`.
|
|
315
632
|
|
|
316
|
-
|
|
633
|
+
Use HC pairs where users should actually get more separation:
|
|
317
634
|
|
|
318
|
-
- Text
|
|
319
|
-
-
|
|
320
|
-
-
|
|
321
|
-
-
|
|
322
|
-
-
|
|
635
|
+
- Text/content contrast: `{ apca: ['content', 'body'] }`.
|
|
636
|
+
- Accent fills: `{ apca: ['content', 'body'] }` or stronger.
|
|
637
|
+
- Borders: `tone: ['-10', '-20']`.
|
|
638
|
+
- Shadows: `intensity: [10, 20]`.
|
|
639
|
+
- Decorative ramps that must stay perceivable.
|
|
323
640
|
|
|
324
|
-
In HC
|
|
641
|
+
In HC variants, Glaze bypasses the normal tone window and uses the full
|
|
642
|
+
`[0, 100]` range. Edge tones can reach the edge; contrast floors have more room
|
|
643
|
+
to solve.
|
|
325
644
|
|
|
326
|
-
##
|
|
645
|
+
## Checklist
|
|
327
646
|
|
|
328
647
|
Before shipping a palette, verify:
|
|
329
648
|
|
|
330
|
-
-
|
|
331
|
-
-
|
|
332
|
-
-
|
|
333
|
-
|
|
334
|
-
-
|
|
335
|
-
-
|
|
336
|
-
|
|
649
|
+
- Text, icon, and content tokens either have APCA/WCAG contrast or are
|
|
650
|
+
deliberately edge-anchored.
|
|
651
|
+
- Accent fills use `mode: 'fixed'`; accent foregrounds on neutral UI stay
|
|
652
|
+
`mode: 'auto'` and are based on `surface`.
|
|
653
|
+
- Ambiguous APCA tokens have an explicit `role`; obvious names rely on inference.
|
|
654
|
+
- Low-stakes visual relationships use tone deltas instead of fake contrast
|
|
655
|
+
floors.
|
|
656
|
+
- `inherit: false` is set on default-only tokens so status themes stay focused.
|
|
657
|
+
- HC pairs exist where high contrast should visibly tighten.
|
|
658
|
+
- `glaze.configure({ states, modes })` matches the states registered in the app.
|
|
659
|
+
- Every emitted scheme (`light`, `dark`, `lightContrast`, `darkContrast`) has
|
|
660
|
+
been reviewed on complete screens, not only in a token grid.
|
|
661
|
+
- Rendered WCAG/APCA results have been checked for chromatic foreground/base
|
|
662
|
+
pairs that carry accessibility requirements.
|
|
663
|
+
- Resolution emits no unexplained unreachable-contrast or token-collision
|
|
664
|
+
warnings.
|