@cube-dev/ui-kit 0.169.1 → 0.170.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/README.md +1 -1
- package/dist/CHANGELOG.md +18 -0
- package/dist/README.md +1 -1
- package/dist/_internal/hooks/use-chained-callback.js +1 -1
- package/dist/_internal/hooks/use-debounced-value.js +1 -1
- package/dist/_internal/hooks/use-deprecation-warning.js +1 -1
- package/dist/_internal/hooks/use-event.js +1 -1
- package/dist/_internal/hooks/use-is-first-render.js +1 -1
- package/dist/_internal/hooks/use-sync-ref.js +1 -1
- package/dist/_internal/hooks/use-timer/timer.js +1 -1
- package/dist/_internal/hooks/use-timer/use-timer.js +1 -1
- package/dist/_internal/hooks/use-warn.js +1 -1
- package/dist/components/Block.js +1 -1
- package/dist/components/CollectionItem.js +1 -1
- package/dist/components/GlobalStyles.js +5 -5
- 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 +3 -5
- 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/Banner/Banner.js.map +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/Menu/styled.js.map +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.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 +2 -2
- package/dist/components/data/TableBase/column-tint.js.map +1 -1
- package/dist/components/data/TableBase/row-menu.js +1 -1
- package/dist/components/data/TableBase/styled.js +1 -1
- package/dist/components/data/TableBase/table-tree.js +1 -1
- package/dist/components/data/TableBase/types.d.ts +3 -3
- package/dist/components/data/TableBase/types.js +1 -1
- package/dist/components/data/TableBase/types.js.map +1 -1
- package/dist/components/data/TableBase/use-cell-selection.js +0 -0
- package/dist/components/data/TableBase/use-column-order.js +1 -1
- package/dist/components/data/TableBase/use-container-width.js +1 -1
- package/dist/components/data/TableBase/use-row-move-animation.js +1 -1
- package/dist/components/data/TableBase/use-scrollability.js +1 -1
- package/dist/components/data/TableBase/use-table-columns.js +1 -1
- package/dist/components/data/TableBase/use-table-search.js +1 -1
- package/dist/components/data/TableBase/use-table-selection.js +1 -1
- package/dist/components/data/TableBase/use-table-sort.js +1 -1
- package/dist/components/data/TableBase/use-table-sorts.js +1 -1
- package/dist/components/data/TableBase/use-table-storage.js +1 -1
- package/dist/components/data/TableBase/use-table-tree-state.js +1 -1
- package/dist/components/fields/Checkbox/Checkbox.js +1 -1
- package/dist/components/fields/Checkbox/Checkbox.js.map +1 -1
- package/dist/components/fields/Checkbox/CheckboxGroup.js +1 -1
- package/dist/components/fields/Checkbox/context.js +1 -1
- package/dist/components/fields/ColorInput/ColorInput.js +1 -1
- package/dist/components/fields/ColorPicker/ColorPicker.js +1 -1
- package/dist/components/fields/ColorSwatch/ColorSwatch.js +1 -1
- package/dist/components/fields/ColorSwatchGroup/ColorSwatchGroup.js +2 -2
- package/dist/components/fields/ColorSwatchGroup/ColorSwatchGroup.js.map +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/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/Select/Select.js.map +1 -1
- package/dist/components/fields/Slider/Gradation.js +1 -1
- package/dist/components/fields/Slider/HueSlider.js +1 -1
- package/dist/components/fields/Slider/RangeSlider.js +1 -1
- package/dist/components/fields/Slider/Slider.js +1 -1
- package/dist/components/fields/Slider/SliderBase.js +1 -1
- package/dist/components/fields/Slider/SliderThumb.js +1 -1
- package/dist/components/fields/Slider/SliderTrack.js +1 -1
- package/dist/components/fields/Slider/elements.js +1 -1
- package/dist/components/fields/Slider/index.js +1 -1
- package/dist/components/fields/Switch/Switch.js +1 -1
- package/dist/components/fields/TextArea/TextArea.js +1 -1
- package/dist/components/fields/TextInput/TextInput.js +1 -1
- package/dist/components/fields/TextInput/TextInputBase.js +1 -1
- package/dist/components/fields/TextInput/useAutoSizeTextArea.js +1 -1
- package/dist/components/fields/TextInputMapper/TextInputMapper.js +1 -1
- package/dist/components/fields/color/ColorPanel.js +1 -1
- package/dist/components/fields/color/channels.js +1 -1
- package/dist/components/fields/color/color.js +2 -2
- package/dist/components/fields/color/color.js.map +1 -1
- package/dist/components/fields/color/context.js +1 -1
- package/dist/components/form/FieldWrapper/FieldWrapper.js +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 +2 -1
- package/dist/components/layout/Board/Board.js.map +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 +42 -7
- package/dist/components/layout/Board/WidgetHost.js.map +1 -1
- package/dist/components/layout/Board/board-context.js +1 -1
- package/dist/components/layout/Board/board-store.js +1 -1
- package/dist/components/layout/Board/grid-core/calculate.js +1 -1
- package/dist/components/layout/Board/grid-core/collision-modes.js +1 -1
- package/dist/components/layout/Board/grid-core/collision.js +1 -1
- package/dist/components/layout/Board/grid-core/compactors.js +1 -1
- package/dist/components/layout/Board/grid-core/constraints.js +1 -1
- package/dist/components/layout/Board/grid-core/group-move.js +1 -1
- package/dist/components/layout/Board/grid-core/layout.js +1 -1
- package/dist/components/layout/Board/grid-core/placement.js +1 -1
- package/dist/components/layout/Board/grid-core/sort.js +1 -1
- package/dist/components/layout/Board/index.js +1 -1
- package/dist/components/layout/Board/responsive-utils.js +1 -1
- package/dist/components/layout/Board/use-board-layout.js +1 -1
- package/dist/components/layout/Board/use-board-registry.js +1 -1
- package/dist/components/layout/Board/use-board-select-modifier-key.js +1 -1
- package/dist/components/layout/Board/use-board-selection.js +1 -1
- package/dist/components/layout/Flex.js +1 -1
- package/dist/components/layout/Flow.js +1 -1
- package/dist/components/layout/Grid.js +1 -1
- package/dist/components/layout/Panel.js +1 -1
- package/dist/components/layout/Prefix.js +1 -1
- package/dist/components/layout/ResizablePanel.js +1 -1
- package/dist/components/layout/Space.js +1 -1
- package/dist/components/layout/Suffix.js +1 -1
- package/dist/components/navigation/Pagination/Pagination.js +1 -1
- package/dist/components/navigation/Pagination/use-pagination.js +1 -1
- package/dist/components/navigation/Tabs/DraggableTabList.js +1 -1
- package/dist/components/navigation/Tabs/TabButton.js +1 -1
- package/dist/components/navigation/Tabs/TabDropIndicator.js +1 -1
- package/dist/components/navigation/Tabs/TabPanel.js +1 -1
- package/dist/components/navigation/Tabs/TabPicker.js +1 -1
- package/dist/components/navigation/Tabs/Tabs.js +1 -1
- package/dist/components/navigation/Tabs/TabsAction.js +1 -1
- package/dist/components/navigation/Tabs/TabsContext.js +1 -1
- package/dist/components/navigation/Tabs/popover-placement.js +1 -1
- package/dist/components/navigation/Tabs/styled.js +1 -1
- package/dist/components/navigation/Tabs/types.js +1 -1
- package/dist/components/navigation/Tabs/use-tab-editing.js +1 -1
- package/dist/components/navigation/Tabs/use-tab-indicator.js +1 -1
- package/dist/components/organisms/StatsCard/StatsCard.js +1 -1
- package/dist/components/other/Calendar/Calendar.js +1 -1
- package/dist/components/other/Calendar/CalendarCell.js +1 -1
- package/dist/components/other/Calendar/CalendarGrid.js +1 -1
- package/dist/components/other/Calendar/CalendarHeader.js +1 -1
- package/dist/components/other/Calendar/CalendarPanel.js +1 -1
- package/dist/components/other/Calendar/PeriodCalendar.js +1 -1
- package/dist/components/other/Calendar/PeriodGrid.js +1 -1
- package/dist/components/other/Calendar/RangeCalendar.js +1 -1
- package/dist/components/other/Calendar/styled.js +1 -1
- package/dist/components/other/CubeLogo/CubeLogo.d.ts +2 -2
- package/dist/components/other/CubeLogo/CubeLogo.js +12 -12
- package/dist/components/other/CubeLogo/CubeLogo.js.map +1 -1
- package/dist/components/other/NoDataIcon/NoDataIcon.js +1 -1
- package/dist/components/overlays/AlertDialog/AlertDialog.js +1 -1
- package/dist/components/overlays/AlertDialog/AlertDialogApiProvider.js +1 -1
- package/dist/components/overlays/AlertDialog/AlertDialogZone.js +1 -1
- package/dist/components/overlays/Dialog/Dialog.js +1 -1
- package/dist/components/overlays/Dialog/DialogContainer.js +1 -1
- package/dist/components/overlays/Dialog/DialogForm.js +1 -1
- package/dist/components/overlays/Dialog/DialogTrigger.js +1 -1
- package/dist/components/overlays/Dialog/context.js +1 -1
- package/dist/components/overlays/Dialog/use-dialog-container.js +1 -1
- package/dist/components/overlays/Modal/Modal.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/Tooltip.js.map +1 -1
- package/dist/components/overlays/Tooltip/TooltipProvider.js +1 -1
- package/dist/components/overlays/Tooltip/TooltipTrigger.js +1 -1
- package/dist/components/overlays/Tooltip/context.js +1 -1
- package/dist/components/portal/Portal.js +1 -1
- package/dist/components/portal/PortalProvider.js +1 -1
- package/dist/components/portal/usePortal.js +1 -1
- package/dist/components/shared/DraggableCollection.js +1 -1
- package/dist/components/shared/InvalidIcon.js +1 -1
- package/dist/components/shared/ValidIcon.js +1 -1
- package/dist/components/status/LoadingAnimation/LoadingAnimation.js +1 -1
- package/dist/components/status/Spin/Cube.js +1 -1
- package/dist/components/status/Spin/InternalSpinner.js +1 -1
- package/dist/components/status/Spin/Spin.js +1 -1
- package/dist/components/status/Spin/SpinsContainer.js +1 -1
- package/dist/data/item-themes.js +1 -1
- package/dist/data/item-themes.js.map +1 -1
- package/dist/data/themes.js +1 -1
- package/dist/data/themes.js.map +1 -1
- package/dist/eslint-plugin/defaults.generated.js +1 -1
- package/dist/eslint-plugin/index.js +1 -1
- package/dist/eslint-plugin/rules/no-redundant-default-prop.js +1 -1
- package/dist/i18n/I18nProvider.js +1 -1
- package/dist/i18n/createFormatter.js +1 -1
- package/dist/i18n/index.js +1 -1
- package/dist/i18n/instance.js +1 -1
- package/dist/i18n/locales/de-DE/uikit.js +1 -1
- package/dist/i18n/locales/en-US/uikit.js +1 -1
- package/dist/i18n/locales/es-ES/uikit.js +1 -1
- package/dist/i18n/locales/es-MX/uikit.js +1 -1
- package/dist/i18n/locales/fr-FR/uikit.js +1 -1
- package/dist/i18n/locales/it-IT/uikit.js +1 -1
- package/dist/i18n/locales/ja-JP/uikit.js +1 -1
- package/dist/i18n/locales/nb-NO/uikit.js +1 -1
- package/dist/i18n/locales/pt-BR/uikit.js +1 -1
- package/dist/i18n/locales/pt-PT/uikit.js +1 -1
- package/dist/i18n/locales/sv-SE/uikit.js +1 -1
- package/dist/i18n/locales/vi-VN/uikit.js +1 -1
- package/dist/i18n/locales.js +1 -1
- package/dist/i18n/useFormatter.js +1 -1
- package/dist/i18n/useI18n.js +1 -1
- package/dist/icons/AdjustmentsHorizontalIcon.js +1 -1
- package/dist/icons/AdjustmentsIcon.js +1 -1
- package/dist/icons/AiIcon.js +1 -1
- package/dist/icons/AreaChartIcon.js +1 -1
- package/dist/icons/ArrowNarrowDownIcon.js +1 -1
- package/dist/icons/ArrowNarrowUpIcon.js +1 -1
- package/dist/icons/BackwardIcon.js +1 -1
- package/dist/icons/BarChartIcon.js +1 -1
- package/dist/icons/BellFilledIcon.js +1 -1
- package/dist/icons/BellIcon.js +1 -1
- package/dist/icons/BooleanIcon.js +1 -1
- package/dist/icons/CalendarEditIcon.js +1 -1
- package/dist/icons/CalendarIcon.js +1 -1
- package/dist/icons/CaretDownIcon.js +1 -1
- package/dist/icons/CaretUpIcon.js +1 -1
- package/dist/icons/ChartAreaStackedIcon.js +1 -1
- package/dist/icons/ChartAreaStackedPercentageIcon.js +1 -1
- package/dist/icons/ChartBarGroupedHorizontalIcon.js +1 -1
- package/dist/icons/ChartBarGroupedIcon.js +1 -1
- package/dist/icons/ChartBarHorizontalIcon.js +1 -1
- package/dist/icons/ChartBarLineIcon.js +1 -1
- package/dist/icons/ChartBarStackedHorizontalIcon.js +1 -1
- package/dist/icons/ChartBarStackedIcon.js +1 -1
- package/dist/icons/ChartBarStackedPercentageHorizontalIcon.js +1 -1
- package/dist/icons/ChartBarStackedPercentageIcon.js +1 -1
- package/dist/icons/ChartBoxPlot2Icon.js +1 -1
- package/dist/icons/ChartBoxPlotIcon.js +1 -1
- package/dist/icons/ChartBubbleIcon.js +1 -1
- package/dist/icons/ChartDonut2Icon.js +1 -1
- package/dist/icons/ChartFunnelIcon.js +1 -1
- package/dist/icons/ChartHeatmapIcon.js +1 -1
- package/dist/icons/ChartKPIIcon.js +1 -1
- package/dist/icons/ChartPie2Icon.js +1 -1
- package/dist/icons/ChartScatterIcon.js +1 -1
- package/dist/icons/CheckCircleFilledIcon.js +1 -1
- package/dist/icons/CheckCircleIcon.js +1 -1
- package/dist/icons/CheckIcon.js +1 -1
- package/dist/icons/CircleFilledIcon.js +1 -1
- package/dist/icons/ClearIcon.js +1 -1
- package/dist/icons/CloseCircleFilledIcon.js +1 -1
- package/dist/icons/CloseCircleIcon.js +1 -1
- package/dist/icons/CloseIcon.js +1 -1
- package/dist/icons/CodeIcon.js +1 -1
- package/dist/icons/ColumnTotalIcon.js +1 -1
- package/dist/icons/CopyIcon.js +1 -1
- package/dist/icons/CountIcon.js +1 -1
- package/dist/icons/CubeIcon.js +1 -1
- package/dist/icons/CubePauseIcon.js +1 -1
- package/dist/icons/CubePlayIcon.js +1 -1
- package/dist/icons/CurrencyDollarIcon.js +1 -1
- package/dist/icons/DangerIcon.js +1 -1
- package/dist/icons/DashboardIcon.js +1 -1
- package/dist/icons/DatabaseIcon.js +1 -1
- package/dist/icons/DecimalDecreaseIcon.js +1 -1
- package/dist/icons/DecimalIncreaseIcon.js +1 -1
- package/dist/icons/DirectionIcon.js +1 -1
- package/dist/icons/DonutIcon.js +1 -1
- package/dist/icons/DownIcon.js +1 -1
- package/dist/icons/EditIcon.js +1 -1
- package/dist/icons/ExclamationCircleFilledIcon.js +1 -1
- package/dist/icons/ExclamationCircleIcon.js +1 -1
- package/dist/icons/ExclamationIcon.js +1 -1
- package/dist/icons/EyeIcon.js +1 -1
- package/dist/icons/EyeInvisibleIcon.js +1 -1
- package/dist/icons/FilterIcon.js +1 -1
- package/dist/icons/FolderFilledIcon.js +1 -1
- package/dist/icons/FolderIcon.js +1 -1
- package/dist/icons/FolderOpenFilledIcon.js +1 -1
- package/dist/icons/FolderOpenIcon.js +1 -1
- package/dist/icons/ForwardIcon.js +1 -1
- package/dist/icons/GripVerticalIcon.js +1 -1
- package/dist/icons/HierarchyIcon.js +1 -1
- package/dist/icons/HierarchyOpenIcon.js +1 -1
- package/dist/icons/Icon.js +1 -1
- package/dist/icons/InfoCircleIcon.js +1 -1
- package/dist/icons/InfoIcon.js +1 -1
- package/dist/icons/KeyIcon.js +1 -1
- package/dist/icons/LeftIcon.js +1 -1
- package/dist/icons/LineChartIcon.js +1 -1
- package/dist/icons/LoadingIcon.js +1 -1
- package/dist/icons/LockFilledIcon.js +1 -1
- package/dist/icons/LockIcon.js +1 -1
- package/dist/icons/MoreIcon.js +1 -1
- package/dist/icons/NotAllowedIcon.js +1 -1
- package/dist/icons/Number123Icon.js +1 -1
- package/dist/icons/NumberIcon.js +1 -1
- package/dist/icons/PauseCircleFilledIcon.js +1 -1
- package/dist/icons/PauseCircleIcon.js +1 -1
- package/dist/icons/PauseIcon.js +1 -1
- package/dist/icons/PercentageIcon.js +1 -1
- package/dist/icons/PieChartIcon.js +1 -1
- package/dist/icons/PipetteIcon.js +1 -1
- package/dist/icons/PlayCircleIcon.js +1 -1
- package/dist/icons/PlayIcon.js +1 -1
- package/dist/icons/PlusIcon.js +1 -1
- package/dist/icons/ProgressBarIcon.js +1 -1
- package/dist/icons/ReloadIcon.js +1 -1
- package/dist/icons/ReportIcon.js +1 -1
- package/dist/icons/ReturnIcon.js +1 -1
- package/dist/icons/RightIcon.js +1 -1
- package/dist/icons/RowTotalsIcon.js +1 -1
- package/dist/icons/SchemeIcon.js +1 -1
- package/dist/icons/SearchIcon.js +1 -1
- package/dist/icons/SemanticQueryIcon.js +1 -1
- package/dist/icons/SettingsIcon.js +1 -1
- package/dist/icons/ShieldFilledIcon.js +1 -1
- package/dist/icons/ShieldIcon.js +1 -1
- package/dist/icons/SlashIcon.js +1 -1
- package/dist/icons/SparklesIcon.js +1 -1
- package/dist/icons/SqlIcon.js +1 -1
- package/dist/icons/StatsIcon.js +1 -1
- package/dist/icons/StopIcon.js +1 -1
- package/dist/icons/StringIcon.js +1 -1
- package/dist/icons/SubtotalsIcon.js +1 -1
- package/dist/icons/SwitchIcon.js +1 -1
- package/dist/icons/TableIcon.js +1 -1
- package/dist/icons/ThumbsDownIcon.js +1 -1
- package/dist/icons/ThumbsUpIcon.js +1 -1
- package/dist/icons/ThunderboltCrossedIcon.js +1 -1
- package/dist/icons/ThunderboltFilledIcon.js +1 -1
- package/dist/icons/ThunderboltIcon.js +1 -1
- package/dist/icons/TimeIcon.js +1 -1
- package/dist/icons/TrashIcon.js +1 -1
- package/dist/icons/UnlockIcon.js +1 -1
- package/dist/icons/UpIcon.js +1 -1
- package/dist/icons/UserGroupIcon.js +1 -1
- package/dist/icons/UserIcon.js +1 -1
- package/dist/icons/UserLockIcon.js +1 -1
- package/dist/icons/ViewIcon.js +1 -1
- package/dist/icons/WarningFilledIcon.js +1 -1
- package/dist/icons/WarningIcon.js +1 -1
- package/dist/icons/wrap-icon.js +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/probe/canonicalize.js +1 -1
- package/dist/probe/css.js +1 -1
- package/dist/probe/index.js +1 -1
- package/dist/provider.js +1 -1
- package/dist/providers/TrackingProvider.js +1 -1
- package/dist/providers/navigationAdapter.default.js +1 -1
- package/dist/tokens/all-tokens.js +1 -1
- package/dist/tokens/base.js +1 -1
- package/dist/tokens/color-seed.js +1 -1
- package/dist/tokens/color-theme.d.ts +2 -2
- package/dist/tokens/color-theme.js +2 -2
- package/dist/tokens/color-theme.js.map +1 -1
- package/dist/tokens/colors.d.ts +3 -3
- package/dist/tokens/colors.js +4 -4
- package/dist/tokens/colors.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 +1 -1
- package/dist/tokens/palette-config.js +1 -1
- package/dist/tokens/palette-config.js.map +1 -1
- package/dist/tokens/palette.d.ts +5 -5
- package/dist/tokens/palette.js +11 -11
- package/dist/tokens/palette.js.map +1 -1
- package/dist/tokens/resolve.d.ts +1 -1
- package/dist/tokens/resolve.js +12 -31
- package/dist/tokens/resolve.js.map +1 -1
- package/dist/tokens/shadows.d.ts +1 -1
- package/dist/tokens/shadows.js +2 -2
- package/dist/tokens/shadows.js.map +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/index.d.ts +1 -0
- 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.d.ts +1 -0
- package/dist/utils/react/index.js +2 -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/useSchema.d.ts +58 -0
- package/dist/utils/react/useSchema.js +182 -0
- package/dist/utils/react/useSchema.js.map +1 -0
- 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 +2 -2
- package/docs/Introduction.md +1 -1
- package/docs/Theming.md +29 -12
- package/docs/Usage.md +28 -11
- package/docs/components/content/ItemCard.md +1 -1
- package/docs/components/content/PrismCode.md +2 -2
- package/docs/components/data/DataTable.md +1 -1
- package/docs/components/fields/Picker.md +1 -1
- package/docs/components/layout/Board.md +147 -36
- package/docs/components/organisms/StatsCard.md +1 -1
- package/docs/components/other/CubeLogo.md +9 -9
- package/docs/components/overlays/Tooltip.md +2 -2
- package/docs/components/overlays/TooltipProvider.md +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.170.0 | Cube Dev Team */
|
|
2
|
+
import { useSyncExternalStore } from "react";
|
|
3
|
+
|
|
4
|
+
//#region src/utils/react/useSchema.ts
|
|
5
|
+
/**
|
|
6
|
+
* The ambient viewing conditions — the color schema and the contrast tier the
|
|
7
|
+
* document is showing right now.
|
|
8
|
+
*
|
|
9
|
+
* This module is the single owner of the definition: it builds the `@dark` /
|
|
10
|
+
* `@hc` predefined states that `src/components/Root.tsx` registers with tasty,
|
|
11
|
+
* *and* it answers the same question in JS. One definition, two readers, so the
|
|
12
|
+
* CSS and the JS answers cannot drift apart.
|
|
13
|
+
*
|
|
14
|
+
* **For styling, do not use this.** `{ '': light, '@dark': dark, '@hc': hc }` is
|
|
15
|
+
* the answer, and branching styles in JS gives up the conditionality that lets a
|
|
16
|
+
* schema flip repaint without a re-render. Two cases the state map cannot serve:
|
|
17
|
+
*
|
|
18
|
+
* 1. **Surfaces the stylesheet does not reach** — a Vega spec, a CodeMirror or
|
|
19
|
+
* Monaco theme, a third-party iframe. They take values, not CSS, so `@dark`
|
|
20
|
+
* never applies and the branch has to happen in JS.
|
|
21
|
+
* 2. **Control state that is not styling** — seeding or labelling a control from
|
|
22
|
+
* the ambient condition, e.g. a Light/Dark or Normal/High-contrast preview
|
|
23
|
+
* selector that starts on whatever the page is already showing.
|
|
24
|
+
*
|
|
25
|
+
* Root-level only, and deliberately not a generic state reader: tasty's state
|
|
26
|
+
* vocabulary mixes element-local states (`hovered`, `pressed`, `disabled`) with
|
|
27
|
+
* ambient ones (`@media(…)`, `@root(…)`), and only the ambient half is
|
|
28
|
+
* answerable without an element. Evaluating the state language in JS would mean
|
|
29
|
+
* a second implementation of the state algebra to keep in agreement with the CSS
|
|
30
|
+
* one, for a question almost every caller asks about the root anyway.
|
|
31
|
+
*/
|
|
32
|
+
/**
|
|
33
|
+
* The `data-*` attribute names the opt-in uses, and the media queries it falls
|
|
34
|
+
* back to. `@root(schema=dark)` compiles to `:root[data-schema="dark"]`, hence
|
|
35
|
+
* the `data-` prefix on the DOM side and the bare key on the tasty side.
|
|
36
|
+
*/
|
|
37
|
+
const SCHEMA_KEY = "schema";
|
|
38
|
+
const CONTRAST_KEY = "contrast";
|
|
39
|
+
const SCHEMA_ATTR = `data-${SCHEMA_KEY}`;
|
|
40
|
+
const CONTRAST_ATTR = `data-${CONTRAST_KEY}`;
|
|
41
|
+
const DARK_QUERY = "(prefers-color-scheme: dark)";
|
|
42
|
+
const HIGH_CONTRAST_QUERY = "(prefers-contrast: more)";
|
|
43
|
+
/**
|
|
44
|
+
* The `@dark` / `@hc` state aliases, in tasty's DSL — registered globally by
|
|
45
|
+
* `<Root>` via `setGlobalPredefinedStates()`.
|
|
46
|
+
*
|
|
47
|
+
* The attribute opt-in wins over the system preference, and the fallback is
|
|
48
|
+
* gated on the attribute being *absent* (`!@root(schema)`) rather than on it
|
|
49
|
+
* being some other value — so `<html data-schema="light">` stays light inside a
|
|
50
|
+
* dark OS, which is the whole point of an opt-in. {@link resolveSchema} and
|
|
51
|
+
* {@link resolveHighContrast} read the same way.
|
|
52
|
+
*/
|
|
53
|
+
const AMBIENT_PREDEFINED_STATES = {
|
|
54
|
+
"@dark": `@root(${SCHEMA_KEY}=dark) | (!@root(${SCHEMA_KEY}) & @media${DARK_QUERY})`,
|
|
55
|
+
"@hc": `@root(${CONTRAST_KEY}=high) | (!@root(${CONTRAST_KEY}) & @media${HIGH_CONTRAST_QUERY})`
|
|
56
|
+
};
|
|
57
|
+
/**
|
|
58
|
+
* `matchMedia` is called per read rather than cached, so a test that stubs it
|
|
59
|
+
* takes effect immediately. Missing (older jsdom, non-DOM runtimes) reads as
|
|
60
|
+
* "no preference", which lands on the light / normal-contrast defaults.
|
|
61
|
+
*/
|
|
62
|
+
function mediaMatches(query) {
|
|
63
|
+
return typeof window !== "undefined" && typeof window.matchMedia === "function" ? window.matchMedia(query).matches : false;
|
|
64
|
+
}
|
|
65
|
+
function rootAttribute(name) {
|
|
66
|
+
return typeof document === "undefined" ? null : document.documentElement.getAttribute(name);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* The document's current color schema, read once — the JS answer to `@dark`.
|
|
70
|
+
*
|
|
71
|
+
* Outside React (a chart spec built in a module, an editor theme registered at
|
|
72
|
+
* import time). In React use {@link useSchema}, which also re-renders on change.
|
|
73
|
+
* Returns `'light'` with no DOM.
|
|
74
|
+
*/
|
|
75
|
+
function resolveSchema() {
|
|
76
|
+
const attribute = rootAttribute(SCHEMA_ATTR);
|
|
77
|
+
if (attribute !== null) return attribute === "dark" ? "dark" : "light";
|
|
78
|
+
return mediaMatches(DARK_QUERY) ? "dark" : "light";
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Whether the document is showing the high-contrast tier, read once — the JS
|
|
82
|
+
* answer to `@hc`.
|
|
83
|
+
*
|
|
84
|
+
* Note this is an *ambient* condition, not the theme's `contrastLevel`: the
|
|
85
|
+
* level is a `PaletteConfig` seed the app supplies (read it with
|
|
86
|
+
* `getPaletteConfig()`), while this is the tier the viewer asked for.
|
|
87
|
+
* Returns `false` with no DOM.
|
|
88
|
+
*/
|
|
89
|
+
function resolveHighContrast() {
|
|
90
|
+
const attribute = rootAttribute(CONTRAST_ATTR);
|
|
91
|
+
if (attribute !== null) return attribute === "high";
|
|
92
|
+
return mediaMatches(HIGH_CONTRAST_QUERY);
|
|
93
|
+
}
|
|
94
|
+
const listeners = /* @__PURE__ */ new Set();
|
|
95
|
+
let stopWatching = null;
|
|
96
|
+
function notify() {
|
|
97
|
+
listeners.forEach((listener) => listener());
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Both inputs have to be watched, because either can decide the answer: the
|
|
101
|
+
* attribute when the opt-in is set, the media query otherwise — an attribute flip
|
|
102
|
+
* is invisible to `matchMedia` and a system flip is invisible to a
|
|
103
|
+
* `MutationObserver`. One observer and one pair of query listeners are shared by
|
|
104
|
+
* every subscriber, and torn down when the last one leaves.
|
|
105
|
+
*/
|
|
106
|
+
function startWatching() {
|
|
107
|
+
if (typeof document === "undefined") return () => {};
|
|
108
|
+
const teardowns = [];
|
|
109
|
+
if (typeof window !== "undefined" && typeof window.matchMedia === "function") for (const query of [DARK_QUERY, HIGH_CONTRAST_QUERY]) {
|
|
110
|
+
const list = window.matchMedia(query);
|
|
111
|
+
if (typeof list?.addEventListener !== "function") continue;
|
|
112
|
+
list.addEventListener("change", notify);
|
|
113
|
+
teardowns.push(() => list.removeEventListener("change", notify));
|
|
114
|
+
}
|
|
115
|
+
if (typeof MutationObserver === "function" && document.documentElement) {
|
|
116
|
+
const observer = new MutationObserver(notify);
|
|
117
|
+
observer.observe(document.documentElement, {
|
|
118
|
+
attributes: true,
|
|
119
|
+
attributeFilter: [SCHEMA_ATTR, CONTRAST_ATTR]
|
|
120
|
+
});
|
|
121
|
+
teardowns.push(() => observer.disconnect());
|
|
122
|
+
}
|
|
123
|
+
return () => teardowns.forEach((teardown) => teardown());
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Subscribe to ambient condition changes — either the schema or the contrast
|
|
127
|
+
* tier. Returns an unsubscribe function.
|
|
128
|
+
*
|
|
129
|
+
* The listener takes no argument: re-read with {@link resolveSchema} /
|
|
130
|
+
* {@link resolveHighContrast}, which is what the hooks below do. For non-React
|
|
131
|
+
* consumers that own a surface the stylesheet cannot reach — re-theming a Monaco
|
|
132
|
+
* instance, re-rendering a chart.
|
|
133
|
+
*/
|
|
134
|
+
function subscribeSchema(listener) {
|
|
135
|
+
listeners.add(listener);
|
|
136
|
+
if (!stopWatching) stopWatching = startWatching();
|
|
137
|
+
return () => {
|
|
138
|
+
listeners.delete(listener);
|
|
139
|
+
if (!listeners.size && stopWatching) {
|
|
140
|
+
stopWatching();
|
|
141
|
+
stopWatching = null;
|
|
142
|
+
}
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Snapshots are primitives, so React bails out on an unchanged value and no
|
|
147
|
+
* memoization is needed — a contrast change re-runs a `useSchema()` reader's
|
|
148
|
+
* `getSnapshot` and stops there.
|
|
149
|
+
*/
|
|
150
|
+
const getServerSchema = () => "light";
|
|
151
|
+
const getServerHighContrast = () => false;
|
|
152
|
+
/**
|
|
153
|
+
* The document's color schema, kept live — `'light'` or `'dark'`.
|
|
154
|
+
*
|
|
155
|
+
* ```tsx
|
|
156
|
+
* const schema = useSchema();
|
|
157
|
+
*
|
|
158
|
+
* <VegaChart spec={useMemo(() => buildSpec(schema), [schema])} />;
|
|
159
|
+
* ```
|
|
160
|
+
*
|
|
161
|
+
* Follows both the `<html data-schema>` opt-in and `prefers-color-scheme`,
|
|
162
|
+
* exactly as the `@dark` state does. Under SSR it renders `'light'` and
|
|
163
|
+
* re-renders with the real value after hydration.
|
|
164
|
+
*/
|
|
165
|
+
function useSchema() {
|
|
166
|
+
return useSyncExternalStore(subscribeSchema, resolveSchema, getServerSchema);
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Whether the document is showing the high-contrast tier, kept live — the hook
|
|
170
|
+
* form of {@link resolveHighContrast}, following `<html data-contrast>` and
|
|
171
|
+
* `prefers-contrast` exactly as the `@hc` state does.
|
|
172
|
+
*
|
|
173
|
+
* Under SSR it renders `false` and re-renders with the real value after
|
|
174
|
+
* hydration.
|
|
175
|
+
*/
|
|
176
|
+
function useHighContrast() {
|
|
177
|
+
return useSyncExternalStore(subscribeSchema, resolveHighContrast, getServerHighContrast);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
//#endregion
|
|
181
|
+
export { AMBIENT_PREDEFINED_STATES, resolveHighContrast, resolveSchema, subscribeSchema, useHighContrast, useSchema };
|
|
182
|
+
//# sourceMappingURL=useSchema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useSchema.js","names":[],"sources":["../../../src/utils/react/useSchema.ts"],"sourcesContent":["import { useSyncExternalStore } from 'react';\n\n/**\n * The ambient viewing conditions — the color schema and the contrast tier the\n * document is showing right now.\n *\n * This module is the single owner of the definition: it builds the `@dark` /\n * `@hc` predefined states that `src/components/Root.tsx` registers with tasty,\n * *and* it answers the same question in JS. One definition, two readers, so the\n * CSS and the JS answers cannot drift apart.\n *\n * **For styling, do not use this.** `{ '': light, '@dark': dark, '@hc': hc }` is\n * the answer, and branching styles in JS gives up the conditionality that lets a\n * schema flip repaint without a re-render. Two cases the state map cannot serve:\n *\n * 1. **Surfaces the stylesheet does not reach** — a Vega spec, a CodeMirror or\n * Monaco theme, a third-party iframe. They take values, not CSS, so `@dark`\n * never applies and the branch has to happen in JS.\n * 2. **Control state that is not styling** — seeding or labelling a control from\n * the ambient condition, e.g. a Light/Dark or Normal/High-contrast preview\n * selector that starts on whatever the page is already showing.\n *\n * Root-level only, and deliberately not a generic state reader: tasty's state\n * vocabulary mixes element-local states (`hovered`, `pressed`, `disabled`) with\n * ambient ones (`@media(…)`, `@root(…)`), and only the ambient half is\n * answerable without an element. Evaluating the state language in JS would mean\n * a second implementation of the state algebra to keep in agreement with the CSS\n * one, for a question almost every caller asks about the root anyway.\n */\n\n// ============================================================================\n// The definition\n// ============================================================================\n\n/**\n * The `data-*` attribute names the opt-in uses, and the media queries it falls\n * back to. `@root(schema=dark)` compiles to `:root[data-schema=\"dark\"]`, hence\n * the `data-` prefix on the DOM side and the bare key on the tasty side.\n */\nconst SCHEMA_KEY = 'schema';\nconst CONTRAST_KEY = 'contrast';\nconst SCHEMA_ATTR = `data-${SCHEMA_KEY}`;\nconst CONTRAST_ATTR = `data-${CONTRAST_KEY}`;\nconst DARK_QUERY = '(prefers-color-scheme: dark)';\nconst HIGH_CONTRAST_QUERY = '(prefers-contrast: more)';\n\n/**\n * The `@dark` / `@hc` state aliases, in tasty's DSL — registered globally by\n * `<Root>` via `setGlobalPredefinedStates()`.\n *\n * The attribute opt-in wins over the system preference, and the fallback is\n * gated on the attribute being *absent* (`!@root(schema)`) rather than on it\n * being some other value — so `<html data-schema=\"light\">` stays light inside a\n * dark OS, which is the whole point of an opt-in. {@link resolveSchema} and\n * {@link resolveHighContrast} read the same way.\n */\nexport const AMBIENT_PREDEFINED_STATES = {\n '@dark': `@root(${SCHEMA_KEY}=dark) | (!@root(${SCHEMA_KEY}) & @media${DARK_QUERY})`,\n '@hc': `@root(${CONTRAST_KEY}=high) | (!@root(${CONTRAST_KEY}) & @media${HIGH_CONTRAST_QUERY})`,\n} as const;\n\n/** The color schema the document resolves to — the two arms of the `@dark` state. */\nexport type ColorSchema = 'light' | 'dark';\n\n// ============================================================================\n// Reading\n// ============================================================================\n\n/**\n * `matchMedia` is called per read rather than cached, so a test that stubs it\n * takes effect immediately. Missing (older jsdom, non-DOM runtimes) reads as\n * \"no preference\", which lands on the light / normal-contrast defaults.\n */\nfunction mediaMatches(query: string): boolean {\n return typeof window !== 'undefined' &&\n typeof window.matchMedia === 'function'\n ? window.matchMedia(query).matches\n : false;\n}\n\nfunction rootAttribute(name: string): string | null {\n return typeof document === 'undefined'\n ? null\n : document.documentElement.getAttribute(name);\n}\n\n/**\n * The document's current color schema, read once — the JS answer to `@dark`.\n *\n * Outside React (a chart spec built in a module, an editor theme registered at\n * import time). In React use {@link useSchema}, which also re-renders on change.\n * Returns `'light'` with no DOM.\n */\nexport function resolveSchema(): ColorSchema {\n const attribute = rootAttribute(SCHEMA_ATTR);\n\n if (attribute !== null) {\n return attribute === 'dark' ? 'dark' : 'light';\n }\n\n return mediaMatches(DARK_QUERY) ? 'dark' : 'light';\n}\n\n/**\n * Whether the document is showing the high-contrast tier, read once — the JS\n * answer to `@hc`.\n *\n * Note this is an *ambient* condition, not the theme's `contrastLevel`: the\n * level is a `PaletteConfig` seed the app supplies (read it with\n * `getPaletteConfig()`), while this is the tier the viewer asked for.\n * Returns `false` with no DOM.\n */\nexport function resolveHighContrast(): boolean {\n const attribute = rootAttribute(CONTRAST_ATTR);\n\n if (attribute !== null) {\n return attribute === 'high';\n }\n\n return mediaMatches(HIGH_CONTRAST_QUERY);\n}\n\n// ============================================================================\n// Watching\n// ============================================================================\n\nconst listeners = new Set<() => void>();\n\nlet stopWatching: (() => void) | null = null;\n\nfunction notify() {\n listeners.forEach((listener) => listener());\n}\n\n/**\n * Both inputs have to be watched, because either can decide the answer: the\n * attribute when the opt-in is set, the media query otherwise — an attribute flip\n * is invisible to `matchMedia` and a system flip is invisible to a\n * `MutationObserver`. One observer and one pair of query listeners are shared by\n * every subscriber, and torn down when the last one leaves.\n */\nfunction startWatching(): () => void {\n if (typeof document === 'undefined') {\n return () => {};\n }\n\n const teardowns: (() => void)[] = [];\n\n // Guarded rather than assumed: jsdom ships neither `matchMedia` nor a\n // `MediaQueryList` in every version, and a consumer's unit tests are exactly\n // where a hook like this gets mounted. Losing one source of change is a stale\n // value; throwing is a broken render.\n if (\n typeof window !== 'undefined' &&\n typeof window.matchMedia === 'function'\n ) {\n for (const query of [DARK_QUERY, HIGH_CONTRAST_QUERY]) {\n const list = window.matchMedia(query);\n\n if (typeof list?.addEventListener !== 'function') continue;\n\n list.addEventListener('change', notify);\n teardowns.push(() => list.removeEventListener('change', notify));\n }\n }\n\n if (typeof MutationObserver === 'function' && document.documentElement) {\n const observer = new MutationObserver(notify);\n\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: [SCHEMA_ATTR, CONTRAST_ATTR],\n });\n\n teardowns.push(() => observer.disconnect());\n }\n\n return () => teardowns.forEach((teardown) => teardown());\n}\n\n/**\n * Subscribe to ambient condition changes — either the schema or the contrast\n * tier. Returns an unsubscribe function.\n *\n * The listener takes no argument: re-read with {@link resolveSchema} /\n * {@link resolveHighContrast}, which is what the hooks below do. For non-React\n * consumers that own a surface the stylesheet cannot reach — re-theming a Monaco\n * instance, re-rendering a chart.\n */\nexport function subscribeSchema(listener: () => void): () => void {\n listeners.add(listener);\n\n if (!stopWatching) {\n stopWatching = startWatching();\n }\n\n return () => {\n listeners.delete(listener);\n\n if (!listeners.size && stopWatching) {\n stopWatching();\n stopWatching = null;\n }\n };\n}\n\n// ============================================================================\n// React bindings\n// ============================================================================\n\n/**\n * Snapshots are primitives, so React bails out on an unchanged value and no\n * memoization is needed — a contrast change re-runs a `useSchema()` reader's\n * `getSnapshot` and stops there.\n */\nconst getServerSchema = (): ColorSchema => 'light';\nconst getServerHighContrast = () => false;\n\n/**\n * The document's color schema, kept live — `'light'` or `'dark'`.\n *\n * ```tsx\n * const schema = useSchema();\n *\n * <VegaChart spec={useMemo(() => buildSpec(schema), [schema])} />;\n * ```\n *\n * Follows both the `<html data-schema>` opt-in and `prefers-color-scheme`,\n * exactly as the `@dark` state does. Under SSR it renders `'light'` and\n * re-renders with the real value after hydration.\n */\nexport function useSchema(): ColorSchema {\n return useSyncExternalStore(subscribeSchema, resolveSchema, getServerSchema);\n}\n\n/**\n * Whether the document is showing the high-contrast tier, kept live — the hook\n * form of {@link resolveHighContrast}, following `<html data-contrast>` and\n * `prefers-contrast` exactly as the `@hc` state does.\n *\n * Under SSR it renders `false` and re-renders with the real value after\n * hydration.\n */\nexport function useHighContrast(): boolean {\n return useSyncExternalStore(\n subscribeSchema,\n resolveHighContrast,\n getServerHighContrast,\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuCA,MAAM,aAAa;AACnB,MAAM,eAAe;AACrB,MAAM,cAAc,QAAQ;AAC5B,MAAM,gBAAgB,QAAQ;AAC9B,MAAM,aAAa;AACnB,MAAM,sBAAsB;;;;;;;;;;;AAY5B,MAAa,4BAA4B;CACvC,SAAS,SAAS,WAAW,mBAAmB,WAAW,YAAY,WAAW;CAClF,OAAO,SAAS,aAAa,mBAAmB,aAAa,YAAY,oBAAoB;CAC9F;;;;;;AAcD,SAAS,aAAa,OAAwB;AAC5C,QAAO,OAAO,WAAW,eACvB,OAAO,OAAO,eAAe,aAC3B,OAAO,WAAW,MAAM,CAAC,UACzB;;AAGN,SAAS,cAAc,MAA6B;AAClD,QAAO,OAAO,aAAa,cACvB,OACA,SAAS,gBAAgB,aAAa,KAAK;;;;;;;;;AAUjD,SAAgB,gBAA6B;CAC3C,MAAM,YAAY,cAAc,YAAY;AAE5C,KAAI,cAAc,KAChB,QAAO,cAAc,SAAS,SAAS;AAGzC,QAAO,aAAa,WAAW,GAAG,SAAS;;;;;;;;;;;AAY7C,SAAgB,sBAA+B;CAC7C,MAAM,YAAY,cAAc,cAAc;AAE9C,KAAI,cAAc,KAChB,QAAO,cAAc;AAGvB,QAAO,aAAa,oBAAoB;;AAO1C,MAAM,4BAAY,IAAI,KAAiB;AAEvC,IAAI,eAAoC;AAExC,SAAS,SAAS;AAChB,WAAU,SAAS,aAAa,UAAU,CAAC;;;;;;;;;AAU7C,SAAS,gBAA4B;AACnC,KAAI,OAAO,aAAa,YACtB,cAAa;CAGf,MAAM,YAA4B,EAAE;AAMpC,KACE,OAAO,WAAW,eAClB,OAAO,OAAO,eAAe,WAE7B,MAAK,MAAM,SAAS,CAAC,YAAY,oBAAoB,EAAE;EACrD,MAAM,OAAO,OAAO,WAAW,MAAM;AAErC,MAAI,OAAO,MAAM,qBAAqB,WAAY;AAElD,OAAK,iBAAiB,UAAU,OAAO;AACvC,YAAU,WAAW,KAAK,oBAAoB,UAAU,OAAO,CAAC;;AAIpE,KAAI,OAAO,qBAAqB,cAAc,SAAS,iBAAiB;EACtE,MAAM,WAAW,IAAI,iBAAiB,OAAO;AAE7C,WAAS,QAAQ,SAAS,iBAAiB;GACzC,YAAY;GACZ,iBAAiB,CAAC,aAAa,cAAc;GAC9C,CAAC;AAEF,YAAU,WAAW,SAAS,YAAY,CAAC;;AAG7C,cAAa,UAAU,SAAS,aAAa,UAAU,CAAC;;;;;;;;;;;AAY1D,SAAgB,gBAAgB,UAAkC;AAChE,WAAU,IAAI,SAAS;AAEvB,KAAI,CAAC,aACH,gBAAe,eAAe;AAGhC,cAAa;AACX,YAAU,OAAO,SAAS;AAE1B,MAAI,CAAC,UAAU,QAAQ,cAAc;AACnC,iBAAc;AACd,kBAAe;;;;;;;;;AAcrB,MAAM,wBAAqC;AAC3C,MAAM,8BAA8B;;;;;;;;;;;;;;AAepC,SAAgB,YAAyB;AACvC,QAAO,qBAAqB,iBAAiB,eAAe,gBAAgB;;;;;;;;;;AAW9E,SAAgB,kBAA2B;AACzC,QAAO,qBACL,iBACA,qBACA,sBACD"}
|
package/dist/utils/selection.js
CHANGED
package/dist/utils/styles.js
CHANGED
package/dist/utils/tree.js
CHANGED
package/dist/utils/warnings.js
CHANGED
package/dist/version.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.170.0 | Cube Dev Team */
|
|
2
2
|
//#region src/version.ts
|
|
3
|
-
const VERSION = "0.
|
|
3
|
+
const VERSION = "0.170.0";
|
|
4
4
|
const TASTY_VERSION = "3.3.1";
|
|
5
5
|
if (typeof window !== "undefined") {
|
|
6
6
|
const version = VERSION;
|
package/docs/Colors.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Colors
|
|
2
2
|
|
|
3
|
-
Cube UI Kit color tokens are generated by Glaze from a shared OKHST palette. Every adaptive token includes light, dark, and high-contrast variants. Change the active
|
|
3
|
+
Cube UI Kit color tokens are generated by Glaze from a shared OKHST palette. Every adaptive token includes light, dark, and high-contrast variants. Change the active schema in the Storybook toolbar to review each example.
|
|
4
4
|
|
|
5
5
|
The colors shown here come from the default seeds. Those seeds — brand hue, saturation, per-status hues — are tunable at runtime; see [Theming](./Theming.md) for a live playground.
|
|
6
6
|
|
|
@@ -50,7 +50,7 @@ Syntax tokens are calibrated as a group against `#surface`. Use the semantic tok
|
|
|
50
50
|
|
|
51
51
|
## Borders and shadows
|
|
52
52
|
|
|
53
|
-
Borders use the `1bw` design-system width. Shadow geometry comes from `src/tokens/shadows.ts`; the `#shadow-sm`, `#shadow-md`, and `#shadow-lg` colors adapt with the active
|
|
53
|
+
Borders use the `1bw` design-system width. Shadow geometry comes from `src/tokens/shadows.ts`; the `#shadow-sm`, `#shadow-md`, and `#shadow-lg` colors adapt with the active schema.
|
|
54
54
|
|
|
55
55
|
## Scope
|
|
56
56
|
|
package/docs/Introduction.md
CHANGED
|
@@ -17,7 +17,7 @@ Cube UI Kit is built on two independent open-source projects:
|
|
|
17
17
|
- [Tasty](https://tasty.style) is the declarative styling engine. It turns token-aware style objects, responsive values, and component states into conflict-free CSS.
|
|
18
18
|
- [Glaze](https://github.com/tenphi/glaze) generates the semantic color palette. A small set of brand and status seeds resolves into light, dark, and high-contrast token sets.
|
|
19
19
|
|
|
20
|
-
Use the [Theme Builder](/story/getting-started-theming--theme-builder) to tune a palette and preview the result across
|
|
20
|
+
Use the [Theme Builder](/story/getting-started-theming--theme-builder) to tune a palette and preview the result across schemas and contrast levels.
|
|
21
21
|
|
|
22
22
|
## Get started
|
|
23
23
|
|
package/docs/Theming.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Theming
|
|
2
2
|
|
|
3
|
-
The whole palette is generated by [Glaze](https://github.com/tenphi/glaze) from a handful of seeds, one per **zone**: the accent, the base, and each of the four status themes. Those seeds are tunable at runtime — change one and every token re-resolves, in light, dark, and high-contrast
|
|
3
|
+
The whole palette is generated by [Glaze](https://github.com/tenphi/glaze) from a handful of seeds, one per **zone**: the accent, the base, and each of the four status themes. Those seeds are tunable at runtime — change one and every token re-resolves, in light, dark, and high-contrast schemas at once.
|
|
4
4
|
|
|
5
5
|
Every zone takes the same seed, and it comes in two forms: a **color**, which is usually what you actually have, or the **numbers** behind one. Never both — a zone is seeded one way or the other. See [One seed, two ways to spell it](#one-seed-two-ways-to-spell-it).
|
|
6
6
|
|
|
@@ -133,7 +133,7 @@ First, **exactness is scoped to the light, normal-contrast variant.** That is th
|
|
|
133
133
|
|
|
134
134
|
Sizing those two the same is a mistake worth naming, because this palette made it. In light `surface` **is** white, so one measurement is both constraints at once and Lc 45 looks right for the pair. In dark the page is near-black and the same number becomes a demand that a filled shape reach text contrast against it — which nothing in the palette meets, the shipped fill included. Since a floor can only lighten, the surplus flattened the dark half of the tone axis onto a single value: every brand darker than the floor came out the same colour. The page floor is now sized for a shape and the label is guaranteed separately, by a cap on the seed's tone.
|
|
135
135
|
|
|
136
|
-
They are APCA rather than WCAG on purpose. A single WCAG ratio means two different things depending on the
|
|
136
|
+
They are APCA rather than WCAG on purpose. A single WCAG ratio means two different things depending on the schema: measured across twelve hues, a fill sitting exactly at 3:1 comes out at Lc 56 in light but only Lc 23 in dark. That is why light brands kept getting crushed while dark ones sailed through the same rule. **A consequence to state plainly: the emitted fill can sit below WCAG 3:1.** `#0EA5E9` renders at 2.77:1 against a white page and is correct there — the Lc is the guarantee, not the ratio.
|
|
137
137
|
|
|
138
138
|
High contrast does **not** escalate the page floor. It is a request for separation over brand, but not for separation from the page: the same fill carries the label, and driving it off the page drives the label off it. The shipped ladder makes the same trade and lands the other side of it, ending up with _less_ page separation in high contrast than in normal, because it darkens the fill toward its label. What does escalate is the label cap, which searches the high-contrast variants too.
|
|
139
139
|
|
|
@@ -173,7 +173,7 @@ setPaletteConfig({ surfaceMode: 'tinted', base: { saturation: 25 } });
|
|
|
173
173
|
|
|
174
174
|
Two tones is not a lightness change you would name — it is _room_. Everything below `surface` is positioned relative to it, so the ladder, the borders and the text ramp all follow, and the text's `['AA','AAA']` floors re-solve against the new background rather than drifting. The `code-*` family follows too: its mirrored `surface` exists to be the page, so it tracks both the tone and the base seed.
|
|
175
175
|
|
|
176
|
-
**The tinted surfaces move with it.** A status theme's `surface` — and a runtime tint's, from `getColorTheme()` — is authored as an offset from the page's rather than as an absolute tone, and that offset is exactly the two tones `tinted` shifts by. Anchored absolutely they would land on the page's own new tone and a `note` banner would stop reading as a banner at all; anchored to the page they keep the separation the offset was chosen for, in both
|
|
176
|
+
**The tinted surfaces move with it.** A status theme's `surface` — and a runtime tint's, from `getColorTheme()` — is authored as an offset from the page's rather than as an absolute tone, and that offset is exactly the two tones `tinted` shifts by. Anchored absolutely they would land on the page's own new tone and a `note` banner would stop reading as a banner at all; anchored to the page they keep the separation the offset was chosen for, in both schemas. They also pick up a little more chroma there, being further from the extreme — so `tinted` makes a status surface easier to see, not harder.
|
|
177
177
|
|
|
178
178
|
The tint stays subtle by construction. Near white the sRGB gamut has very little chroma to give, so `tinted` buys a surface that reads as warm or cool rather than one that reads as colored — which is the whole ask. For a genuinely colored panel, reach for a status theme's `surface` instead.
|
|
179
179
|
|
|
@@ -331,7 +331,7 @@ The preview deliberately shows all three surface levels with their own text ramp
|
|
|
331
331
|
|
|
332
332
|
## Previewing a theme in a region
|
|
333
333
|
|
|
334
|
-
`setPaletteConfig()` re-themes the whole document, which is no use for a theme picker — you want several themes visible at once, or a dark preview inside a light page. `renderColorTokens()` does that: it resolves the palette for **one** config and **one**
|
|
334
|
+
`setPaletteConfig()` re-themes the whole document, which is no use for a theme picker — you want several themes visible at once, or a dark preview inside a light page. `renderColorTokens()` does that: it resolves the palette for **one** config and **one** schema and returns flat literal values, ready to apply to a subtree through a tasty `tokens` prop.
|
|
335
335
|
|
|
336
336
|
```tsx
|
|
337
337
|
import { renderColorTokens, tasty } from '@cube-dev/ui-kit';
|
|
@@ -339,20 +339,20 @@ import { renderColorTokens, tasty } from '@cube-dev/ui-kit';
|
|
|
339
339
|
const Region = tasty({ styles: { fill: '#surface', color: '#surface-text' } });
|
|
340
340
|
|
|
341
341
|
const preview = useMemo(
|
|
342
|
-
() => renderColorTokens({ accent: { hue: 210 },
|
|
342
|
+
() => renderColorTokens({ accent: { hue: 210 }, schema: 'dark' }),
|
|
343
343
|
[],
|
|
344
344
|
);
|
|
345
345
|
|
|
346
346
|
<Region tokens={preview}>…everything in here renders in that theme…</Region>;
|
|
347
347
|
```
|
|
348
348
|
|
|
349
|
-
The reason this needs its own API: the document palette emits **state maps** (`{ '': …, '@dark': …, '@hc': … }`), so a page can only ever show one
|
|
349
|
+
The reason this needs its own API: the document palette emits **state maps** (`{ '': …, '@dark': …, '@hc': … }`), so a page can only ever show one schema at a time — that is what `@dark` means. Collapsing the palette to a chosen schema removes the conditionality, so several themes can coexist.
|
|
350
350
|
|
|
351
351
|
| Option | Meaning |
|
|
352
352
|
| --- | --- |
|
|
353
|
-
| every `PaletteConfig` field | merged over the **current** config, so `{
|
|
354
|
-
| `
|
|
355
|
-
| `highContrast` | resolve that
|
|
353
|
+
| every `PaletteConfig` field | merged over the **current** config, so `{ schema: 'dark' }` previews the active theme in dark |
|
|
354
|
+
| `schema` | `'light'` (default) or `'dark'` |
|
|
355
|
+
| `highContrast` | resolve that schema's high-contrast variant. Default `false` |
|
|
356
356
|
|
|
357
357
|
Nothing is applied globally — the live palette and the stored config are untouched, so previews are safe to render anywhere.
|
|
358
358
|
|
|
@@ -360,10 +360,10 @@ Note the one place the merge/replace split matters: this call **layers** over th
|
|
|
360
360
|
|
|
361
361
|
Notes:
|
|
362
362
|
|
|
363
|
-
- Real components work inside a region. Every color in the kit compiles to a CSS custom property, so overriding those properties on one element re-colors its whole subtree with no
|
|
363
|
+
- Real components work inside a region. Every color in the kit compiles to a CSS custom property, so overriding those properties on one element re-colors its whole subtree with no schema attribute and no second `<Root>`.
|
|
364
364
|
- The legacy aliases come along **by reference** (`'#dark': '#surface-text'`), and so do the shadow tokens and scrollbar colors, whose values embed a palette color. Tasty re-declares them on the region so each `var()` resolves against the region's own values; resolving them up front would freeze them to the outer theme instead.
|
|
365
365
|
- Typography, spacing, sizes and layout are **not** included — nothing in their values references a color, so the region inherits them from `<Root>`.
|
|
366
|
-
- `contrastLevel` works per region, so the whole 0–100 ramp can be shown at once — something a document cannot do, since it is only ever at one level. Level `0` reproduces the normal tier and `100` the high-contrast tier exactly, in both
|
|
366
|
+
- `contrastLevel` works per region, so the whole 0–100 ramp can be shown at once — something a document cannot do, since it is only ever at one level. Level `0` reproduces the normal tier and `100` the high-contrast tier exactly, in both schemas. `highContrast: true` still returns the genuine high-contrast resolution at any level below `100`, because the level moves the baseline and the tier escalates from where `'auto'` would put it; at `100` the two coincide and it returns the same colors as the normal variant. Note that tokens carrying a contrast _floor_ (most text) can sit still over part of the ramp — the floor is solved, not approximated, so the value only moves once the interpolated target does. Tokens positioned by a plain tone pair, like `#border`, step at every level.
|
|
367
367
|
- Resolving a palette costs a few milliseconds. The last config is memoized, but `useMemo` on the caller side if you drive it from state.
|
|
368
368
|
|
|
369
369
|
`renderPaletteTokens()` is the same thing without the aliases and companion tokens, if you want only the Glaze palette.
|
|
@@ -395,6 +395,23 @@ subscribePaletteConfig(() => {
|
|
|
395
395
|
|
|
396
396
|
`getPaletteConfig()` always returns the fully resolved form, so `getPaletteConfig().themes.danger.saturation` is a number even if nobody ever set it. `DEFAULT_PALETTE_CONFIG` is the shipped baseline in the same shape.
|
|
397
397
|
|
|
398
|
+
## Reading the ambient schema
|
|
399
|
+
|
|
400
|
+
The palette config is what the app _asked for_; the schema and contrast tier are what the viewer is _seeing_ — `<html data-schema>` / `prefers-color-scheme`, and `<html data-contrast>` / `prefers-contrast`. They are not part of the config, so `getPaletteConfig()` says nothing about them:
|
|
401
|
+
|
|
402
|
+
```tsx
|
|
403
|
+
import { useHighContrast, useSchema } from '@cube-dev/ui-kit';
|
|
404
|
+
|
|
405
|
+
const schema = useSchema(); // 'light' | 'dark'
|
|
406
|
+
const isHighContrast = useHighContrast(); // boolean
|
|
407
|
+
```
|
|
408
|
+
|
|
409
|
+
Both resolve exactly as the `@dark` / `@hc` states do — attribute opt-in first, media query only when the attribute is absent — and re-render when either input changes. Outside React: `resolveSchema()`, `resolveHighContrast()` and `subscribeSchema(listener)`, which fires on a change to either condition.
|
|
410
|
+
|
|
411
|
+
Reach for these only where CSS cannot go. Styling belongs in a state map (`{ '': …, '@dark': …, '@hc': … }`), which repaints on a schema flip with no re-render at all. What the states cannot reach is a surface that takes values rather than CSS — a Vega spec, a CodeMirror or Monaco theme, an iframe — or a control whose value _is_ the condition, like the Light/Dark and Normal/High-contrast selectors over the [theme builder](#theme-builder).
|
|
412
|
+
|
|
413
|
+
Note the distinction from `contrastLevel`: the level is a config seed the app supplies and can read back, while high contrast is a viewing condition the document is in. They also pair up — `renderColorTokens({ schema, highContrast })` takes both, so a region can be previewed in the conditions the page is actually showing.
|
|
414
|
+
|
|
398
415
|
## `<Root palette>`
|
|
399
416
|
|
|
400
417
|
`<Root>` accepts the same config as a prop, applied during render so the first paint is already correct:
|
|
@@ -420,7 +437,7 @@ This is a convenience wrapper over `setPaletteConfig()`, not a separate scope. *
|
|
|
420
437
|
|
|
421
438
|
It also owns the accent's `saturation` outright — pinned to `100`, so a number passed _explicitly alongside_ it is inert and warned about (a number passed on its own turns pastel off instead). And it caps a color seed short of itself: the ceiling sits below where a saturated color lands, so `#EF4444` resolves to `#c47069`. Both are visible in the [Theme builder](#theme-builder), the first as a disabled slider and the second as the requested/resolved chips.
|
|
422
439
|
|
|
423
|
-
**Re-seeding costs about 10 ms.** Rebuilding the eight themes and re-solving ~156 tokens across four
|
|
440
|
+
**Re-seeding costs about 10 ms.** Rebuilding the eight themes and re-solving ~156 tokens across four schema variants is not free, though it is inside a frame. A manual `contrastLevel` costs the same — it runs the same four passes — except at level `100`, which skips the two high-contrast ones because the normal pass already produced those values. Setting the config to a value it already holds is free — it does not even bump the version. If you are driving it from a slider, let the input coalesce to frames (a pointer-driven `onChange` already does) rather than writing on every event.
|
|
424
441
|
|
|
425
442
|
**If you call Glaze directly, tell the kit.** `glaze.configure({ darkTone })` and friends invalidate Glaze's own caches, but the kit's token maps are memoized against the palette config version:
|
|
426
443
|
|
package/docs/Usage.md
CHANGED
|
@@ -69,7 +69,7 @@ Defined in `src/tokens/sizes.ts`. Used for component heights and icon sizes.
|
|
|
69
69
|
|
|
70
70
|
## Shadow Tokens
|
|
71
71
|
|
|
72
|
-
Defined in `src/tokens/shadows.ts`. Shadow colors (`#shadow-sm`, `#shadow-md`, `#shadow-lg`) are generated by Glaze and adapt automatically to dark / high-contrast
|
|
72
|
+
Defined in `src/tokens/shadows.ts`. Shadow colors (`#shadow-sm`, `#shadow-md`, `#shadow-lg`) are generated by Glaze and adapt automatically to dark / high-contrast schemas.
|
|
73
73
|
|
|
74
74
|
| Token | Value |
|
|
75
75
|
| ---------------- | ------------------------- |
|
|
@@ -92,26 +92,41 @@ Defined in `src/tokens/layout.ts`.
|
|
|
92
92
|
|
|
93
93
|
All color tokens use `#name` syntax in styles. Opacity variants use `#name.NN` (e.g. `#surface-text.06` for 6% opacity).
|
|
94
94
|
|
|
95
|
-
The palette is generated by [`@tenphi/glaze`](https://github.com/tenphi/glaze) (see `src/tokens/palette.ts`). Every color token is emitted as a state map with `light`, `@dark`, and `@hc` (high-contrast) variants, so the entire UI Kit adapts to dark / high-contrast
|
|
95
|
+
The palette is generated by [`@tenphi/glaze`](https://github.com/tenphi/glaze) (see `src/tokens/palette.ts`). Every color token is emitted as a state map with `light`, `@dark`, and `@hc` (high-contrast) variants, so the entire UI Kit adapts to dark / high-contrast schemas automatically.
|
|
96
96
|
|
|
97
97
|
The seeds it is generated from — brand hue, saturation, per-status hues, `pastel`, `contrastLevel` — are tunable at runtime. See [Theming](./Theming.md).
|
|
98
98
|
|
|
99
|
-
### Color
|
|
99
|
+
### Color Schemas
|
|
100
100
|
|
|
101
101
|
The `@dark` and `@hc` predefined states are wired up in `src/components/Root.tsx` to support both an attribute opt-in and the user's system preference:
|
|
102
102
|
|
|
103
103
|
```html
|
|
104
|
-
<!-- Force dark
|
|
104
|
+
<!-- Force dark schema -->
|
|
105
105
|
<html data-schema="dark">
|
|
106
106
|
|
|
107
|
-
<!-- Force high-contrast
|
|
107
|
+
<!-- Force high-contrast schema -->
|
|
108
108
|
<html data-contrast="high">
|
|
109
109
|
|
|
110
110
|
<!-- Both can be combined -->
|
|
111
111
|
<html data-schema="dark" data-contrast="high">
|
|
112
112
|
```
|
|
113
113
|
|
|
114
|
-
When the attribute is absent, the
|
|
114
|
+
When the attribute is absent, the schema falls back to `@media (prefers-color-scheme: dark)` and `@media (prefers-contrast: more)`.
|
|
115
|
+
|
|
116
|
+
#### Reading the schema from JS
|
|
117
|
+
|
|
118
|
+
For styling, use the state map — `{ '': light, '@dark': dark, '@hc': hc }`. Two cases it cannot serve: a surface the stylesheet never reaches (a Vega spec, a CodeMirror / Monaco theme, an iframe), and a control whose value _is_ the ambient condition (a Light/Dark preview selector). For those, read the same two conditions from JS:
|
|
119
|
+
|
|
120
|
+
```tsx
|
|
121
|
+
import { useHighContrast, useSchema } from '@cube-dev/ui-kit';
|
|
122
|
+
|
|
123
|
+
const schema = useSchema(); // 'light' | 'dark' — the JS answer to `@dark`
|
|
124
|
+
const isHighContrast = useHighContrast(); // boolean — the JS answer to `@hc`
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
Both follow the attribute opt-in first and the media query second, exactly as the states do, and re-render when either changes. Outside React: `resolveSchema()`, `resolveHighContrast()` and `subscribeSchema(listener)` (fires on either condition; re-read in the listener). This is the conditions half of the gap [`resolveTokenValue()`](#resolving-tokens-outside-css) closes for token _values_.
|
|
128
|
+
|
|
129
|
+
Root-level only — there is no element-scoped or generic state reader, on purpose. Tasty's state vocabulary mixes element-local states (`hovered`, `pressed`, `disabled`) with ambient ones (`@media(…)`, `@root(…)`), and only the ambient half is answerable without an element.
|
|
115
130
|
|
|
116
131
|
### Surface & Text Vocabulary
|
|
117
132
|
|
|
@@ -154,7 +169,7 @@ Tokens a **container** sets to steer a component that cannot resolve the color o
|
|
|
154
169
|
|
|
155
170
|
```jsx
|
|
156
171
|
<Block fill="#fixed-dark" color="#white" styles={{ '#current-fill': '#fixed-dark' }}>
|
|
157
|
-
<Button theme="current" type="primary">Legible in both
|
|
172
|
+
<Button theme="current" type="primary">Legible in both schemas</Button>
|
|
158
173
|
</Block>
|
|
159
174
|
```
|
|
160
175
|
|
|
@@ -162,7 +177,7 @@ Setting it moves the label, the icon slots and the chip's rim together. It also
|
|
|
162
177
|
|
|
163
178
|
### Accent System
|
|
164
179
|
|
|
165
|
-
Each themed color (default, primary, success, danger, warning, note) provides an `accent-*` family anchored to a fixed white "accent surface text". These tokens stay recognizable across
|
|
180
|
+
Each themed color (default, primary, success, danger, warning, note) provides an `accent-*` family anchored to a fixed white "accent surface text". These tokens stay recognizable across schemas (used for branded buttons, CTAs, etc.):
|
|
166
181
|
|
|
167
182
|
| Token (default theme; prefixed in others) | Role |
|
|
168
183
|
| --- | --- |
|
|
@@ -203,10 +218,10 @@ resetPaletteConfig();
|
|
|
203
218
|
|
|
204
219
|
Also available: `getPaletteConfig()`, `subscribePaletteConfig()`, the `usePaletteConfig()` hook, a `<Root palette={…}>` prop, `DEFAULT_PALETTE_CONFIG`, and `invalidatePaletteTokens()` for when you drive `glaze.configure(...)` yourself after mount. The palette is process-global — one palette per process, not per tree or per request.
|
|
205
220
|
|
|
206
|
-
To theme a _region_ instead of the document — a theme preview, or a dark panel inside a light page — use `renderColorTokens()`. It resolves one config and one
|
|
221
|
+
To theme a _region_ instead of the document — a theme preview, or a dark panel inside a light page — use `renderColorTokens()`. It resolves one config and one schema to flat values you apply via a `tokens` prop, without touching the live palette:
|
|
207
222
|
|
|
208
223
|
```tsx
|
|
209
|
-
<Block tokens={renderColorTokens({ accent: { hue: 210 },
|
|
224
|
+
<Block tokens={renderColorTokens({ accent: { hue: 210 }, schema: 'dark' })} fill="#surface">
|
|
210
225
|
…
|
|
211
226
|
</Block>
|
|
212
227
|
```
|
|
@@ -325,7 +340,9 @@ resolveTokenValues(['#surface', '#surface-text', '#border']); // keyed by the to
|
|
|
325
340
|
resolvePresetValues('s3'); // { fontFamily: 'ui-monospace, …', fontSize: '14px', lineHeight: '20px', … }
|
|
326
341
|
```
|
|
327
342
|
|
|
328
|
-
`useTokenValue()`, `useTokenValues()` and `usePresetValues()` are the same three readers as hooks, re-resolved whenever the palette is re-seeded or the
|
|
343
|
+
`useTokenValue()`, `useTokenValues()` and `usePresetValues()` are the same three readers as hooks, re-resolved whenever the palette is re-seeded or the schema / contrast tier flips. The object `useTokenValues()` returns keeps its identity while the values do, so it is safe as a dependency of the theme object built from it.
|
|
344
|
+
|
|
345
|
+
These resolve token _values_. For the ambient _conditions_ themselves — which schema and contrast tier the document is in — see [Reading the schema from JS](#reading-the-schema-from-js).
|
|
329
346
|
|
|
330
347
|
So these helpers do not inspect the value. They read `$tokens-applied`, a marker the token block declares alongside the tokens, which answers the question that matters — _are the kit's tokens in effect on this element?_ Off that surface every read returns `null` (or `fallback`) and warns once in development; on it, the computed value is taken as the truth.
|
|
331
348
|
|
|
@@ -55,7 +55,7 @@ Inherits all styling from `Item`. See [Item documentation](./Item.md) for sub-el
|
|
|
55
55
|
|
|
56
56
|
### Themes
|
|
57
57
|
|
|
58
|
-
Use the `theme` prop to apply a semantic color
|
|
58
|
+
Use the `theme` prop to apply a semantic color schema:
|
|
59
59
|
|
|
60
60
|
- `default` — Standard card appearance
|
|
61
61
|
- `success` — Green theme for positive outcomes
|
|
@@ -28,7 +28,7 @@ Supports [Base properties](../../BaseProperties.md).
|
|
|
28
28
|
|
|
29
29
|
## Theme
|
|
30
30
|
|
|
31
|
-
Syntax colors are driven by a dedicated,
|
|
31
|
+
Syntax colors are driven by a dedicated, schema-aware palette of `code-*` tokens. Each token uses a different hue so token classes stay visually separable, and every token meets at least **WCAG AA (4.5:1)** contrast against `#surface` in light, dark, and high-contrast schemas (AAA in HC).
|
|
32
32
|
|
|
33
33
|
| Token | Hue | Used for |
|
|
34
34
|
| --- | --- | --- |
|
|
@@ -40,7 +40,7 @@ Syntax colors are driven by a dedicated, scheme-aware palette of `code-*` tokens
|
|
|
40
40
|
| `#code-function` | pink | functions, class names, regex, variables |
|
|
41
41
|
| `#code-attribute` | cyan | attribute names, properties, selectors, built-ins, keys |
|
|
42
42
|
|
|
43
|
-
Diff insertion (`+`) and deletion (`-`) intentionally re-use the existing `#success-*` / `#danger-*` ramps — both the line background tint and the foreground color adapt to the active
|
|
43
|
+
Diff insertion (`+`) and deletion (`-`) intentionally re-use the existing `#success-*` / `#danger-*` ramps — both the line background tint and the foreground color adapt to the active schema.
|
|
44
44
|
|
|
45
45
|
## Examples
|
|
46
46
|
|
|
@@ -371,7 +371,7 @@ A stale order is safe: keys for columns that no longer exist are ignored, and a
|
|
|
371
371
|
|
|
372
372
|
`column.color` tints a whole column — header, cells and pinned totals. It takes a palette theme name, any CSS color, a `{ hue, saturation }` seed, or a `{ fill, text }` pair for full manual control.
|
|
373
373
|
|
|
374
|
-
Every form but the last is _derived_: only the hue and saturation are kept, and the tone ramp plus an AA/AAA text floor are re-solved for light, dark and high-contrast. A column cannot end up unreadable in a
|
|
374
|
+
Every form but the last is _derived_: only the hue and saturation are kept, and the tone ramp plus an AA/AAA text floor are re-solved for light, dark and high-contrast. A column cannot end up unreadable in a schema nobody checked.
|
|
375
375
|
|
|
376
376
|
```tsx
|
|
377
377
|
const columns = [
|
|
@@ -310,7 +310,7 @@ The trigger button supports various visual styles via the `type` prop:
|
|
|
310
310
|
|
|
311
311
|
### Trigger Button Themes
|
|
312
312
|
|
|
313
|
-
Control the color
|
|
313
|
+
Control the color schema with the `theme` prop:
|
|
314
314
|
|
|
315
315
|
- **`default`** — Standard theme (default)
|
|
316
316
|
- **`danger`** — Red/destructive color (also applied automatically when `isInvalid` is set)
|