@cube-dev/ui-kit 0.155.0 → 0.156.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 +64 -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 +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.d.ts +10 -1
- package/dist/components/actions/CommandMenu/CommandMenu.js +4 -3
- package/dist/components/actions/CommandMenu/CommandMenu.js.map +1 -1
- package/dist/components/actions/CommandMenu/styled.js +1 -1
- package/dist/components/actions/ItemAction/ItemAction.js +1 -1
- package/dist/components/actions/ItemActionContext.js +1 -1
- package/dist/components/actions/ItemButton/ItemButton.js +1 -1
- package/dist/components/actions/Link/Link.js +1 -1
- package/dist/components/actions/Menu/Menu.js +1 -1
- package/dist/components/actions/Menu/MenuItem.js +1 -1
- package/dist/components/actions/Menu/MenuSection.js +1 -1
- package/dist/components/actions/Menu/MenuTrigger.js +1 -1
- package/dist/components/actions/Menu/SubMenuTrigger.js +1 -1
- package/dist/components/actions/Menu/SubmenuTriggerContext.js +1 -1
- package/dist/components/actions/Menu/context.js +1 -1
- package/dist/components/actions/Menu/styled.js +1 -1
- package/dist/components/actions/index.js +1 -1
- package/dist/components/actions/use-action.js +1 -1
- package/dist/components/actions/use-anchored-menu.js +1 -1
- package/dist/components/actions/use-context-menu.js +1 -1
- package/dist/components/content/ActiveZone/ActiveZone.js +1 -1
- package/dist/components/content/Alert/Alert.js +1 -1
- package/dist/components/content/Alert/use-alert.js +1 -1
- package/dist/components/content/Avatar/Avatar.js +1 -1
- package/dist/components/content/Badge/Badge.js +1 -1
- package/dist/components/content/Card/Card.js +1 -1
- package/dist/components/content/Content.js +1 -1
- package/dist/components/content/CopyPasteBlock/CopyPasteBlock.js +1 -1
- package/dist/components/content/CopySnippet/CopySnippet.js +1 -1
- package/dist/components/content/Disclosure/Disclosure.js +1 -1
- package/dist/components/content/Divider.js +1 -1
- package/dist/components/content/Footer.js +1 -1
- package/dist/components/content/Header.js +1 -1
- package/dist/components/content/HotKeys/HotKeys.js +1 -1
- package/dist/components/content/InfoBadge/InfoBadge.js +1 -1
- package/dist/components/content/InlineInput/InlineInput.js +1 -1
- package/dist/components/content/Item/Item.js +1 -1
- package/dist/components/content/ItemBadge/ItemBadge.js +1 -1
- package/dist/components/content/ItemCard/ItemCard.js +1 -1
- package/dist/components/content/Layout/GridLayout.js +1 -1
- package/dist/components/content/Layout/Layout.js +1 -1
- package/dist/components/content/Layout/LayoutBlock.js +1 -1
- package/dist/components/content/Layout/LayoutCenter.js +1 -1
- package/dist/components/content/Layout/LayoutContainer.js +1 -1
- package/dist/components/content/Layout/LayoutContent.js +1 -1
- package/dist/components/content/Layout/LayoutContext.js +1 -1
- package/dist/components/content/Layout/LayoutFlex.js +1 -1
- package/dist/components/content/Layout/LayoutFooter.js +1 -1
- package/dist/components/content/Layout/LayoutGrid.js +1 -1
- package/dist/components/content/Layout/LayoutHeader.js +1 -1
- package/dist/components/content/Layout/LayoutPane.js +1 -1
- package/dist/components/content/Layout/LayoutPanel.js +1 -1
- package/dist/components/content/Layout/LayoutPanelHeader.js +1 -1
- package/dist/components/content/Layout/LayoutToolbar.js +1 -1
- package/dist/components/content/Layout/hooks/useTinyScrollbar.js +1 -1
- package/dist/components/content/Layout/index.js +1 -1
- package/dist/components/content/Layout/utils.js +1 -1
- package/dist/components/content/Paragraph.js +1 -1
- package/dist/components/content/Placeholder/Placeholder.js +1 -1
- package/dist/components/content/PrismCode/PrismCode.js +1 -1
- package/dist/components/content/PrismCode/prismSetup.js +1 -1
- package/dist/components/content/PrismDiffCode/PrismDiffCode.js +1 -1
- package/dist/components/content/Result/Result.js +1 -1
- package/dist/components/content/Skeleton/Skeleton.js +1 -1
- package/dist/components/content/Tag/Tag.js +1 -1
- package/dist/components/content/Text.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/ColorPicker/ColorPicker.d.ts +67 -0
- package/dist/components/fields/ColorPicker/ColorPicker.js +240 -0
- package/dist/components/fields/ColorPicker/ColorPicker.js.map +1 -0
- package/dist/components/fields/ColorPicker/ColorPickerPanel.js +149 -0
- package/dist/components/fields/ColorPicker/ColorPickerPanel.js.map +1 -0
- package/dist/components/fields/ColorPicker/channels.d.ts +13 -0
- package/dist/components/fields/ColorPicker/channels.js +194 -0
- package/dist/components/fields/ColorPicker/channels.js.map +1 -0
- package/dist/components/fields/ColorPicker/color.d.ts +15 -0
- package/dist/components/fields/ColorPicker/color.js +282 -0
- package/dist/components/fields/ColorPicker/color.js.map +1 -0
- package/dist/components/fields/ColorPicker/index.d.ts +4 -0
- 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.d.ts +3 -3
- package/dist/components/fields/FilterListBox/FilterListBox.js +7 -6
- package/dist/components/fields/FilterListBox/FilterListBox.js.map +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/fields/index.d.ts +4 -0
- 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.d.ts +55 -1
- package/dist/components/layout/Board/Board.js +278 -75
- 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.d.ts +16 -0
- package/dist/components/layout/Board/Widget.js +6 -3
- package/dist/components/layout/Board/Widget.js.map +1 -1
- package/dist/components/layout/Board/WidgetHost.js +81 -14
- 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-context.js.map +1 -1
- package/dist/components/layout/Board/board-store.js +2 -2
- package/dist/components/layout/Board/board-store.js.map +1 -1
- package/dist/components/layout/Board/grid-core/calculate.js +1 -1
- package/dist/components/layout/Board/grid-core/collision.js +1 -1
- package/dist/components/layout/Board/grid-core/compactors.js +1 -1
- package/dist/components/layout/Board/grid-core/constraints.js +1 -1
- package/dist/components/layout/Board/grid-core/group-move.js +132 -0
- package/dist/components/layout/Board/grid-core/group-move.js.map +1 -0
- 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.d.ts +2 -1
- package/dist/components/layout/Board/index.js +2 -2
- package/dist/components/layout/Board/index.js.map +1 -1
- package/dist/components/layout/Board/responsive-utils.js +1 -1
- package/dist/components/layout/Board/use-board-layout.js +17 -12
- package/dist/components/layout/Board/use-board-layout.js.map +1 -1
- package/dist/components/layout/Board/use-board-registry.js +139 -20
- package/dist/components/layout/Board/use-board-registry.js.map +1 -1
- package/dist/components/layout/Board/use-board-select-modifier-key.js +24 -0
- package/dist/components/layout/Board/use-board-select-modifier-key.js.map +1 -0
- package/dist/components/layout/Board/use-board-selection.d.ts +8 -0
- package/dist/components/layout/Board/use-board-selection.js +113 -0
- package/dist/components/layout/Board/use-board-selection.js.map +1 -0
- 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/PeriodCalendar.js +1 -1
- package/dist/components/other/Calendar/RangeCalendar.js +1 -1
- package/dist/components/other/CubeLogo/CubeLogo.js +1 -1
- package/dist/components/overlays/AlertDialog/AlertDialog.js +1 -1
- package/dist/components/overlays/AlertDialog/AlertDialogApiProvider.js +1 -1
- package/dist/components/overlays/AlertDialog/AlertDialogZone.js +1 -1
- package/dist/components/overlays/Dialog/Dialog.js +1 -1
- package/dist/components/overlays/Dialog/DialogContainer.js +1 -1
- package/dist/components/overlays/Dialog/DialogForm.js +1 -1
- package/dist/components/overlays/Dialog/DialogTrigger.js +1 -1
- package/dist/components/overlays/Dialog/context.js +1 -1
- package/dist/components/overlays/Dialog/use-dialog-container.js +1 -1
- package/dist/components/overlays/Modal/Modal.js +1 -1
- package/dist/components/overlays/Modal/OpenTransitionContext.js +1 -1
- package/dist/components/overlays/Modal/Overlay.js +1 -1
- package/dist/components/overlays/Modal/Popover.js +1 -1
- package/dist/components/overlays/Modal/Tray.js +1 -1
- package/dist/components/overlays/Modal/Underlay.js +1 -1
- package/dist/components/overlays/Notifications/Notification.js +1 -1
- package/dist/components/overlays/Notifications/NotificationAction.js +1 -1
- package/dist/components/overlays/Notifications/NotificationCard.js +1 -1
- package/dist/components/overlays/Notifications/NotificationContext.js +1 -1
- package/dist/components/overlays/Notifications/NotificationItem.js +1 -1
- package/dist/components/overlays/Notifications/OverlayContainer.js +1 -1
- package/dist/components/overlays/Notifications/OverlayProvider.js +1 -1
- package/dist/components/overlays/Notifications/PersistentNotificationsList.js +1 -1
- package/dist/components/overlays/Notifications/dismissed-storage.js +1 -1
- package/dist/components/overlays/Notifications/format-relative-time.js +1 -1
- package/dist/components/overlays/Notifications/index.js +1 -1
- package/dist/components/overlays/Notifications/use-notification-state.js +1 -1
- package/dist/components/overlays/Notifications/use-notifications.js +1 -1
- package/dist/components/overlays/Notifications/use-overlay-timers.js +1 -1
- package/dist/components/overlays/Notifications/use-persistent-notifications.js +1 -1
- package/dist/components/overlays/Notifications/use-persistent-state.js +1 -1
- package/dist/components/overlays/Notifications/use-toast-state.js +1 -1
- package/dist/components/overlays/Toast/ToastItem.js +1 -1
- package/dist/components/overlays/Toast/index.js +1 -1
- package/dist/components/overlays/Toast/useProgressToast.js +1 -1
- package/dist/components/overlays/Toast/useToast.js +1 -1
- package/dist/components/overlays/Tooltip/Tooltip.js +1 -1
- package/dist/components/overlays/Tooltip/TooltipProvider.js +1 -1
- package/dist/components/overlays/Tooltip/TooltipTrigger.js +1 -1
- package/dist/components/overlays/Tooltip/context.js +1 -1
- package/dist/components/portal/Portal.js +1 -1
- package/dist/components/portal/PortalProvider.js +1 -1
- package/dist/components/portal/usePortal.js +1 -1
- package/dist/components/shared/DraggableCollection.js +1 -1
- package/dist/components/shared/InvalidIcon.js +1 -1
- package/dist/components/shared/ValidIcon.js +1 -1
- package/dist/components/status/LoadingAnimation/LoadingAnimation.js +1 -1
- package/dist/components/status/Spin/Cube.js +1 -1
- package/dist/components/status/Spin/InternalSpinner.js +1 -1
- package/dist/components/status/Spin/Spin.js +1 -1
- package/dist/components/status/Spin/SpinsContainer.js +1 -1
- package/dist/data/item-themes.js +1 -1
- package/dist/data/themes.js +1 -1
- package/dist/eslint-plugin/defaults.generated.js +9 -1
- package/dist/eslint-plugin/defaults.generated.js.map +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 +9 -1
- package/dist/i18n/locales/en-US/uikit.js +9 -1
- package/dist/i18n/locales/en-US/uikit.json.d.ts +9 -1
- package/dist/i18n/locales/es-ES/uikit.js +9 -1
- package/dist/i18n/locales/es-MX/uikit.js +9 -1
- package/dist/i18n/locales/fr-FR/uikit.js +9 -1
- package/dist/i18n/locales/it-IT/uikit.js +9 -1
- package/dist/i18n/locales/ja-JP/uikit.js +9 -1
- package/dist/i18n/locales/nb-NO/uikit.js +9 -1
- package/dist/i18n/locales/pt-BR/uikit.js +9 -1
- package/dist/i18n/locales/pt-PT/uikit.js +9 -1
- package/dist/i18n/locales/sv-SE/uikit.js +9 -1
- package/dist/i18n/locales/vi-VN/uikit.js +9 -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/PipetteIcon.d.ts +12 -0
- package/dist/icons/PipetteIcon.js +11 -0
- package/dist/icons/PipetteIcon.js.map +1 -0
- 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/index.d.ts +1 -0
- package/dist/icons/wrap-icon.js +1 -1
- package/dist/index.d.ts +7 -2
- package/dist/index.js +13 -8
- 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.js +1 -1
- package/dist/tokens/index.js +1 -1
- package/dist/tokens/layout.js +1 -1
- package/dist/tokens/lazy-styles.js +1 -1
- package/dist/tokens/palette-config.js +1 -1
- package/dist/tokens/palette.js +1 -1
- package/dist/tokens/shadows.js +1 -1
- package/dist/tokens/sizes.js +1 -1
- package/dist/tokens/spacing.js +1 -1
- package/dist/tokens/typography.js +1 -1
- package/dist/utils/ResizeSensor.js +1 -1
- package/dist/utils/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/components/fields/ColorPicker.md +271 -0
- package/docs/components/layout/Board.md +154 -6
- package/package.json +1 -1
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
# ColorPicker
|
|
2
|
+
|
|
3
|
+
An input for a single color. It reads and writes color **text** — hex, `rgb()`,
|
|
4
|
+
`hsl()`, `okhsl()`, `okhst()` and `oklch()` — shows the current color as a
|
|
5
|
+
swatch, and opens a popover where the color can be dialed in on three
|
|
6
|
+
perceptual axes.
|
|
7
|
+
|
|
8
|
+
Every conversion goes through [Glaze](https://github.com/tenphi/glaze), so the
|
|
9
|
+
canonical value the picker holds is OKHSL: bounded on every channel, and always
|
|
10
|
+
inside the sRGB gamut. That is what makes an out-of-gamut state impossible and
|
|
11
|
+
lets the same value be re-serialized into any of the supported notations without
|
|
12
|
+
drift.
|
|
13
|
+
|
|
14
|
+
## When to Use
|
|
15
|
+
|
|
16
|
+
- Theme and branding forms — a seed color, an accent, a chart series color
|
|
17
|
+
- Anywhere a color has to be typed *or* explored, rather than chosen from a
|
|
18
|
+
fixed palette
|
|
19
|
+
- When the stored format matters (a design token file wants `oklch()`, a legacy
|
|
20
|
+
API wants hex) and the input has to guarantee it
|
|
21
|
+
|
|
22
|
+
Reach for a `RadioGroup` or `Picker` of swatches instead when the choice is
|
|
23
|
+
limited to a handful of approved colors.
|
|
24
|
+
|
|
25
|
+
## Component
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
### Properties
|
|
30
|
+
|
|
31
|
+
- **`value`** `string | null` — The selected color (controlled)
|
|
32
|
+
- **`defaultValue`** `string | null` — The selected color (uncontrolled)
|
|
33
|
+
- **`onChange`** `(value: string | null) => void` — Fired with the color string, or `null` when the field is cleared
|
|
34
|
+
- **`format`** `'hex' | 'rgb' | 'hsl' | 'okhsl' | 'okhst' | 'oklch'` (default: `hex`) — Notation the value is written in, and the one `forced` mode displays
|
|
35
|
+
- **`formatMode`** `'forced' | 'derive' | 'free'` (default: `forced`) — How strictly the input text is tied to `format`
|
|
36
|
+
- **`defaultSpace`** `'hst' | 'lch' | 'rgb'` (default: `hst`) — Color concept the popover opens with
|
|
37
|
+
- **`placeholder`** `string` (default: `Pick a color`) — Text shown while the field is empty
|
|
38
|
+
- **`size`** `'small' | 'medium' | 'large' | (string & {})` (default: `medium`) — Input size
|
|
39
|
+
- **`isOpen`** `boolean` — Whether the popover is open (controlled)
|
|
40
|
+
- **`defaultOpen`** `boolean` (default: `false`) — Whether the popover is open initially
|
|
41
|
+
- **`onOpenChange`** `(isOpen: boolean) => void` — Fired when the popover opens or closes
|
|
42
|
+
- **`shouldFlip`** `boolean` (default: `true`) — Whether the popover may flip to the other side of the input
|
|
43
|
+
- **`onFocus`** `(event: FocusEvent) => void` — Fired when the text input receives focus
|
|
44
|
+
- **`onBlur`** `(event: FocusEvent) => void` — Fired when the text input loses focus
|
|
45
|
+
|
|
46
|
+
Named CSS colors (`red`, `rebeccapurple`) are **not** accepted — they are not a
|
|
47
|
+
color space, and Glaze does not resolve them either. Alpha is parsed but
|
|
48
|
+
dropped: the value is always opaque.
|
|
49
|
+
|
|
50
|
+
Focusing the field selects the whole value, so a pasted color replaces it
|
|
51
|
+
outright. The string is the unit of editing here: a single channel is tuned with
|
|
52
|
+
the sliders rather than by hand-editing one number inside `oklch(…)`. Clicking a
|
|
53
|
+
field that already has focus positions the caret as usual, so the text stays
|
|
54
|
+
editable by hand.
|
|
55
|
+
|
|
56
|
+
### Base Properties
|
|
57
|
+
|
|
58
|
+
Supports [Base properties](../../BaseProperties.md)
|
|
59
|
+
|
|
60
|
+
### Field Properties
|
|
61
|
+
|
|
62
|
+
Supports all [Field properties](../../FieldProperties.md)
|
|
63
|
+
|
|
64
|
+
### Styling Properties
|
|
65
|
+
|
|
66
|
+
#### styles
|
|
67
|
+
|
|
68
|
+
Customizes the input wrapper — the element that owns the border, fill and size.
|
|
69
|
+
|
|
70
|
+
**Sub-elements:**
|
|
71
|
+
|
|
72
|
+
- `Prefix` — the container holding the color swatch
|
|
73
|
+
- `Suffix` — the container holding the validation state, then the popover trigger
|
|
74
|
+
- `InputIcon` — the swatch slot
|
|
75
|
+
- `State` — the validation / loading indicator
|
|
76
|
+
|
|
77
|
+
#### inputStyles
|
|
78
|
+
|
|
79
|
+
Customizes the `<input>` element itself.
|
|
80
|
+
|
|
81
|
+
#### triggerStyles
|
|
82
|
+
|
|
83
|
+
Customizes the popover trigger button.
|
|
84
|
+
|
|
85
|
+
#### swatchStyles
|
|
86
|
+
|
|
87
|
+
Customizes the color swatch shown inside the input.
|
|
88
|
+
|
|
89
|
+
### Style Properties
|
|
90
|
+
|
|
91
|
+
These properties allow direct style application without using the `styles` prop:
|
|
92
|
+
|
|
93
|
+
- **Base:** `display`, `font`, `preset`, `hide`, `whiteSpace`, `opacity`, `transition`
|
|
94
|
+
- **Position:** `gridArea`, `order`, `gridColumn`, `gridRow`, `placeSelf`, `alignSelf`, `justifySelf`, `zIndex`, `margin`, `inset`, `position`, `scrollMargin`
|
|
95
|
+
- **Dimension:** `width`, `height`, `flexBasis`, `flexGrow`, `flexShrink`, `flex`
|
|
96
|
+
- **Block:** `border`, `radius`, `shadow`, `outline`, `padding`, `paddingInline`, `paddingBlock`, `overflow`, `scrollbar`, `textAlign`
|
|
97
|
+
- **Color:** `color`, `fill`, `fade`, `image`
|
|
98
|
+
|
|
99
|
+
### Modifiers
|
|
100
|
+
|
|
101
|
+
The `mods` property accepts the following modifiers you can override:
|
|
102
|
+
|
|
103
|
+
| Modifier | Type | Description |
|
|
104
|
+
| ---------- | --------- | ------------------------------------------------- |
|
|
105
|
+
| `focused` | `boolean` | The text input has focus |
|
|
106
|
+
| `hovered` | `boolean` | The pointer is over the input |
|
|
107
|
+
| `disabled` | `boolean` | The picker is disabled |
|
|
108
|
+
| `valid` | `boolean` | The field is in the valid state |
|
|
109
|
+
| `invalid` | `boolean` | The field is in the invalid state |
|
|
110
|
+
| `prefix` | `boolean` | A prefix (the swatch) is rendered |
|
|
111
|
+
| `suffix` | `boolean` | A suffix (the trigger) is rendered |
|
|
112
|
+
|
|
113
|
+
The swatch carries its own `empty` modifier while there is no color to show.
|
|
114
|
+
|
|
115
|
+
## Format modes
|
|
116
|
+
|
|
117
|
+
The three modes differ in how much freedom the *text* gets. The value is always
|
|
118
|
+
a real color in every one of them.
|
|
119
|
+
|
|
120
|
+
| Mode | Text | Value |
|
|
121
|
+
| -------- | ----------------------------------- | ---------------------------------------------------- |
|
|
122
|
+
| `forced` | Rewritten in `format` on blur/Enter | Always written in `format` |
|
|
123
|
+
| `derive` | Left exactly as typed | Normalized in the notation the text is written in |
|
|
124
|
+
| `free` | Left exactly as typed | The text itself, verbatim |
|
|
125
|
+
|
|
126
|
+
In every mode an entry that is not a color is rejected: the previous valid color
|
|
127
|
+
stays the value while it is being typed, and the text snaps back to it on blur.
|
|
128
|
+
Emptying the field is not an error — it commits `null`.
|
|
129
|
+
|
|
130
|
+
```jsx
|
|
131
|
+
// A design-token form that must store OKLCH
|
|
132
|
+
<ColorPicker label="Accent" format="oklch" onChange={setAccent} />
|
|
133
|
+
|
|
134
|
+
// A CSS editor: keep whatever the author wrote, but guarantee it parses
|
|
135
|
+
<ColorPicker label="Color" formatMode="free" onChange={setCss} />
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
## Color spaces
|
|
139
|
+
|
|
140
|
+
The popover edits one canonical color through three sets of axes:
|
|
141
|
+
|
|
142
|
+
| Space | Axes | Good for |
|
|
143
|
+
| ----- | ----------------------------- | ----------------------------------------------------- |
|
|
144
|
+
| `hst` | Hue, Saturation, Tone (OKHST) | Building ramps — equal tone steps read as equal steps |
|
|
145
|
+
| `lch` | Lightness, Chroma, Hue (OKLCH)| Matching a value from a design-token file |
|
|
146
|
+
| `rgb` | Red, Green, Blue | Matching a value from a legacy palette or a screenshot|
|
|
147
|
+
|
|
148
|
+
Each of these opens on its own space; the switcher inside the popover moves
|
|
149
|
+
between them at any time.
|
|
150
|
+
|
|
151
|
+
`H` means the same angle in HST and LCH, so the hue strip is identical in both.
|
|
152
|
+
The chroma slider is bounded by the sRGB gamut at the current lightness and hue,
|
|
153
|
+
which is why its range changes as `L` moves.
|
|
154
|
+
|
|
155
|
+
## Examples
|
|
156
|
+
|
|
157
|
+
### Basic usage
|
|
158
|
+
|
|
159
|
+
```jsx
|
|
160
|
+
<ColorPicker label="Brand color" defaultValue="#7a4dbf" />
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
### Controlled
|
|
164
|
+
|
|
165
|
+
```jsx
|
|
166
|
+
const [color, setColor] = useState('#7a4dbf');
|
|
167
|
+
|
|
168
|
+
<ColorPicker label="Brand color" value={color} onChange={setColor} />;
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
### Inside a form
|
|
172
|
+
|
|
173
|
+
```jsx
|
|
174
|
+
<Form onSubmit={onSubmit}>
|
|
175
|
+
<ColorPicker
|
|
176
|
+
name="accent"
|
|
177
|
+
label="Accent color"
|
|
178
|
+
format="oklch"
|
|
179
|
+
rules={[{ required: true, message: 'Pick an accent color' }]}
|
|
180
|
+
/>
|
|
181
|
+
</Form>
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
### Opening on a specific space
|
|
185
|
+
|
|
186
|
+
```jsx
|
|
187
|
+
<ColorPicker label="Series color" defaultSpace="rgb" defaultValue="#26fcb2" />
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
### Using the value as a style
|
|
191
|
+
|
|
192
|
+
Because the emitted value is a plain color string, it can go straight into a
|
|
193
|
+
tasty style — including the `okhsl()` and `okhst()` notations, which tasty
|
|
194
|
+
parses natively.
|
|
195
|
+
|
|
196
|
+
```jsx
|
|
197
|
+
const [color, setColor] = useState('okhst(264 80% 60%)');
|
|
198
|
+
|
|
199
|
+
<>
|
|
200
|
+
<ColorPicker label="Fill" format="okhst" value={color} onChange={setColor} />
|
|
201
|
+
<Block fill={color} height="10x" radius="1r" />
|
|
202
|
+
</>;
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
## Accessibility
|
|
206
|
+
|
|
207
|
+
### Keyboard Navigation
|
|
208
|
+
|
|
209
|
+
- `Tab` — moves focus to the text input, then to the popover trigger
|
|
210
|
+
- `Enter` — commits and normalizes the typed color without leaving the field
|
|
211
|
+
- `Space` / `Enter` on the trigger — opens the popover
|
|
212
|
+
- `Escape` — closes the popover
|
|
213
|
+
- `Left` / `Right`, `Home` / `End` on a channel slider — moves that channel
|
|
214
|
+
- `Left` / `Right` on the space switcher — moves between HST, LCH and RGB
|
|
215
|
+
|
|
216
|
+
### Screen Reader Support
|
|
217
|
+
|
|
218
|
+
- The text input announces as a textbox with the field's label
|
|
219
|
+
- The trigger announces as "Open the color picker"
|
|
220
|
+
- The popover announces as a dialog named "Color picker"
|
|
221
|
+
- Each channel slider sits in a group named after its axis (`Hue`,
|
|
222
|
+
`Saturation`, `Tone`, `Lightness`, `Chroma`, `Red`, `Green`, `Blue`)
|
|
223
|
+
- The swatch is decorative and is not announced — the text carries the value
|
|
224
|
+
|
|
225
|
+
### ARIA Properties
|
|
226
|
+
|
|
227
|
+
- `aria-label` — names the field when there is no visible label
|
|
228
|
+
- `aria-describedby` — wired to the field description by the form system
|
|
229
|
+
|
|
230
|
+
## Best Practices
|
|
231
|
+
|
|
232
|
+
1. **Do**: name the field, so the text input is announced meaningfully
|
|
233
|
+
|
|
234
|
+
```jsx
|
|
235
|
+
<ColorPicker label="Brand color" />
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
2. **Don't**: rely on the swatch alone to convey the value
|
|
239
|
+
|
|
240
|
+
```jsx
|
|
241
|
+
<ColorPicker aria-label="" />
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
3. **Do**: pick the `format` your backend stores, and leave `formatMode` at
|
|
245
|
+
`forced` so the two can never disagree.
|
|
246
|
+
|
|
247
|
+
4. **Don't**: use `free` mode when the value is later parsed by something
|
|
248
|
+
stricter than a browser — the text is passed through as written.
|
|
249
|
+
|
|
250
|
+
## Integration with Forms
|
|
251
|
+
|
|
252
|
+
This component supports all
|
|
253
|
+
[Field properties](../../FieldProperties.md) when used
|
|
254
|
+
within a Form. The field value is the color string, and clearing the input
|
|
255
|
+
stores `null`, which makes `required` rules behave as expected.
|
|
256
|
+
|
|
257
|
+
## Suggested Improvements
|
|
258
|
+
|
|
259
|
+
- An eyedropper that samples a pixel from the page, where
|
|
260
|
+
[`EyeDropper`](https://developer.mozilla.org/en-US/docs/Web/API/EyeDropper) is
|
|
261
|
+
available
|
|
262
|
+
- Optional alpha support, which the canonical value currently drops
|
|
263
|
+
- A row of recent or preset swatches inside the popover
|
|
264
|
+
- Editable numeric inputs next to each channel slider, for exact entry without
|
|
265
|
+
going through the text field
|
|
266
|
+
|
|
267
|
+
## Related Components
|
|
268
|
+
|
|
269
|
+
- [HueSlider](./HueSlider.md) — just the hue axis, when only a hue is needed
|
|
270
|
+
- [Slider](./Slider.md) — the primitive each channel is built from
|
|
271
|
+
- [TextInput](./TextInput.md) — the input chrome this component reuses
|
|
@@ -32,6 +32,16 @@ clipped by an ancestor's `overflow: hidden`.
|
|
|
32
32
|
widget is placed exactly where you drop it and its neighbours are never pushed
|
|
33
33
|
or swapped; without `allowOverlap` a drop onto an occupied cell is blocked, and
|
|
34
34
|
with `allowOverlap` widgets may stack for a fully free canvas.
|
|
35
|
+
- **Selection** — off by default. Pressing a widget selects it and arms a drag
|
|
36
|
+
of the selection: selecting and grabbing are one gesture, so move the pointer
|
|
37
|
+
and it drags, stay still and it was just a selection. <kbd>Shift</kbd> (or
|
|
38
|
+
<kbd>Cmd</kbd>/<kbd>Ctrl</kbd>) toggles a widget's membership. Keys are layout
|
|
39
|
+
item ids, scoped to a single board, and always reported in layout order.
|
|
40
|
+
- **Selection is focus-like** — it tracks what the user is working with, and
|
|
41
|
+
touching anything else moves it on: pressing another widget makes *that* the
|
|
42
|
+
selection, pressing a control inside a widget drops it, and so does focus
|
|
43
|
+
leaving the board. With `'multiple'`, pressing an already-selected widget
|
|
44
|
+
keeps the selection so a drag moves the whole block.
|
|
35
45
|
|
|
36
46
|
## Properties
|
|
37
47
|
|
|
@@ -58,6 +68,13 @@ clipped by an ancestor's `overflow: hidden`.
|
|
|
58
68
|
- **`dragHandle`** `string` — CSS selector for the only elements from which a pointer drag may start. Can be overridden per widget.
|
|
59
69
|
- **`showGridLines`** `boolean | 'drag'` (default: `false`) — Show grid lines behind the widgets. `true` always, `'drag'` only while a widget is being dragged or resized. A nested board that does not set this inherits an enabled ancestor's grid lines, showing its own while a drag is in progress.
|
|
60
70
|
- **`isAligned`** `boolean` (default: `false`) — Align a nested board with its ancestor `Board`'s layout. Only takes effect when the board is nested inside another `Board`'s widget. When set, every cell matches the parent's cell size exactly: the board inherits the parent's column pitch (deriving its own column count from its measured width so cells stay parent-sized as the container is resized) and uses the parent's row height verbatim. It never shrinks rows to fit — pair it with an `isAutoHeight` container so the widget grows to fit its rows at that height. `cols`/`rowHeight` then act as fallbacks used only until the parent metrics resolve.
|
|
71
|
+
- **`selectionMode`** `'none' | 'single' | 'multiple'` (default: `'none'`) — Whether widgets can be selected, and how many at a time. `'multiple'` also enables the marquee and rigid group movement.
|
|
72
|
+
- **`selectedKeys`** `string[]` — Controlled selection. Keys are layout item ids (`LayoutItem.i`).
|
|
73
|
+
- **`defaultSelectedKeys`** `string[]` — Initial selection for uncontrolled usage.
|
|
74
|
+
- **`onSelectionChange`** `(keys: string[]) => void` — Called when the selection changes. Keys are deduped and returned in the board's layout order, never in click order.
|
|
75
|
+
- **`selectionCancel`** `string` (default: `BOARD_SELECTION_CANCEL`) — CSS selector marking interactive descendants. A press on one never selects and never starts a drag, so the control keeps its own click *and* its native focus; it also drops the selection, since interacting with a widget's content means the user has moved on. On a selectable board this doubles as the drag guard, so form controls stay usable without also configuring `dragCancel`. The default covers native form controls, links, and the common ARIA widget roles, plus `[data-no-select]` as an escape hatch. Pass `''` to disable the guard. Can be overridden per widget.
|
|
76
|
+
- **`allowMarqueeSelection`** `boolean` (default: `selectionMode === 'multiple'`) — Draw a rubber-band selection when a drag starts on empty board space. A press on a widget selects and drags instead, so the lasso owns empty canvas only. Hold <kbd>Shift</kbd> or <kbd>Cmd</kbd>/<kbd>Ctrl</kbd> to add to the existing selection rather than replacing it.
|
|
77
|
+
- **`onWidgetsDelete`** `(keys: string[]) => void` — Called when <kbd>Delete</kbd>/<kbd>Backspace</kbd> is pressed with a non-empty selection and focus is not in an editable field. **Board never mutates the layout itself** — removing the widgets is yours to do, which is what lets you make it undoable. Board only handles these keys when this handler is set.
|
|
61
78
|
- **`constraints`** `LayoutConstraint[]` — Grid/item layout constraints.
|
|
62
79
|
- **`width`** `number` — Explicit width (disables measurement; useful for SSR/tests).
|
|
63
80
|
- **`widgetProps`** `Partial<Board.Widget props>` — Default props applied to every widget this board hosts (per-widget `Board.Widget` props override these). Use it to add a card border to every widget (`widgetProps={{ isCard: true }}`) or set shared `styles`/sizing defaults without repeating them on each widget.
|
|
@@ -82,6 +99,16 @@ clipped by an ancestor's `overflow: hidden`.
|
|
|
82
99
|
- **`isAutoHeight`** `boolean` (default: `false`) — Grow this widget's height in its board to fit its content (only ever increases, never shrinks). Pair it with a nested `Board isAligned` so the container expands until the inner board's rows fit at the parent's row height. It also pins the widget's resize floor: you cannot drag the widget shorter than the height its content currently needs.
|
|
83
100
|
- **`dragCancel`** `string` — Override the board's `dragCancel` selector for this widget.
|
|
84
101
|
- **`dragHandle`** `string` — Override the board's `dragHandle` selector for this widget.
|
|
102
|
+
- **`isSelectable`** `boolean` — Disable selection for this widget while the board's `selectionMode` is on.
|
|
103
|
+
- **`selectionCancel`** `string` — Override the board's `selectionCancel` selector for this widget.
|
|
104
|
+
- **`aria-label`** `string` — Accessible name for the widget. Falls back to `qa`, then the layout item id — both developer-facing, so set this whenever the widget is user-visible. Also what the selection announcement reads out.
|
|
105
|
+
|
|
106
|
+
A widget clips its content to its grid cell, card or not — otherwise a nested
|
|
107
|
+
board with more rows than currently fit, or a mid-drag reflow, would paint over
|
|
108
|
+
its neighbours. The cost is that a descendant's `outline` is cropped at the edge
|
|
109
|
+
(an outline is clipped by an *ancestor's* overflow, not its own), so a widget
|
|
110
|
+
whose content must paint outside — a control drawing its own active ring — sets
|
|
111
|
+
`overflow="visible"`, or draws the ring inset with a negative `outlineOffset`.
|
|
85
112
|
|
|
86
113
|
### Board.Provider
|
|
87
114
|
|
|
@@ -119,6 +146,48 @@ container's measured width, mirroring react-grid-layout's `Responsive` +
|
|
|
119
146
|
A breakpoint with no layout is synthesized from the nearest available one,
|
|
120
147
|
corrected into bounds and compacted for the target column count.
|
|
121
148
|
|
|
149
|
+
### Modifiers
|
|
150
|
+
|
|
151
|
+
Every widget host exposes these as `data-*` attributes, and any style map passed
|
|
152
|
+
through `widgetProps.styles` or a per-widget `styles` resolves against them.
|
|
153
|
+
|
|
154
|
+
- **`selected`** — the widget is in the board's selection.
|
|
155
|
+
- **`card`** — the widget draws a card border (`isCard`).
|
|
156
|
+
- **`draggable`** — the widget can be dragged and no drag is in flight.
|
|
157
|
+
- **`drag`** — the widget is being dragged.
|
|
158
|
+
- **`floating`** — this is the clone floating in the drag overlay.
|
|
159
|
+
- **`resizing`** — the widget is being resized.
|
|
160
|
+
- **`static`** — the layout item is `static`.
|
|
161
|
+
- **`hovered`**, **`focus-visible`** — pointer and keyboard-focus states.
|
|
162
|
+
- **`settled`** — the board has painted its widgets once, so position changes animate.
|
|
163
|
+
|
|
164
|
+
Selection is an *edge* treatment — a `#primary-border` border plus a `#primary`
|
|
165
|
+
ring — because it reads as a focus-like state rather than a fill. `outline` stays
|
|
166
|
+
reserved for the real focus ring, which is what keeps the two legible together:
|
|
167
|
+
they use different tokens and the focus outline sits one border-width further
|
|
168
|
+
out. To restyle it, override the same keys:
|
|
169
|
+
|
|
170
|
+
```jsx
|
|
171
|
+
<Board
|
|
172
|
+
selectionMode="multiple"
|
|
173
|
+
widgetProps={{
|
|
174
|
+
styles: {
|
|
175
|
+
border: { '': true, selected: '#note-border' },
|
|
176
|
+
shadow: { '': false, selected: '0 0 0 1bw #note' },
|
|
177
|
+
},
|
|
178
|
+
}}
|
|
179
|
+
/>
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
### Data attributes
|
|
183
|
+
|
|
184
|
+
Supported hooks for tests, E2E, and building your own selection overlay:
|
|
185
|
+
|
|
186
|
+
- **`data-board-id`** on the board element — the board's `id`.
|
|
187
|
+
- **`data-board-widget-host`** on every widget host — presence only, "this is a widget host".
|
|
188
|
+
- **`data-board-widget-id`** on every widget host — which widget.
|
|
189
|
+
- **`data-selected`** on a selected host.
|
|
190
|
+
|
|
122
191
|
### Base Properties
|
|
123
192
|
|
|
124
193
|
Supports [Base properties](../../BaseProperties.md).
|
|
@@ -221,14 +290,76 @@ mounted so the tab a widget is dragged out of (and the board owning the in-fligh
|
|
|
221
290
|
drag) is not unmounted mid-gesture. Spring-loading works with mouse and pen;
|
|
222
291
|
touch drags capture the pointer, so they do not trigger it.
|
|
223
292
|
|
|
293
|
+
### Selection
|
|
294
|
+
|
|
295
|
+
Click to select, Shift/Cmd/Ctrl-click to add or remove, and drag from empty board
|
|
296
|
+
Press a widget to select it, <kbd>Shift</kbd>-press to add or remove one, and
|
|
297
|
+
drag from empty board space to lasso. Because the press both selects and arms the
|
|
298
|
+
drag, grabbing a widget you have not selected simply makes it the selection and
|
|
299
|
+
moves it; grabbing one that *is* selected moves the whole block rigidly — keeping
|
|
300
|
+
its shape horizontally, clamping against the grid edge as a unit rather than
|
|
301
|
+
collapsing, and committing once.
|
|
302
|
+
|
|
303
|
+
A group reflows exactly like a single widget: it is compacted by the same rules,
|
|
304
|
+
so on a `vertical` board it can no more be parked in empty space than one widget
|
|
305
|
+
can, and the widgets around it close the gap in the same frame. Under
|
|
306
|
+
`compact="free"` (or `null`) nothing compacts, so the block stays precisely where
|
|
307
|
+
it was dropped.
|
|
308
|
+
|
|
309
|
+
### Interactive content keeps its clicks
|
|
310
|
+
|
|
311
|
+
### Controlled selection and deleting widgets
|
|
312
|
+
|
|
313
|
+
### Restyling the selection
|
|
314
|
+
|
|
224
315
|
## Accessibility
|
|
225
316
|
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
317
|
+
### Keyboard Navigation
|
|
318
|
+
|
|
319
|
+
| Key | Action |
|
|
320
|
+
| --- | --- |
|
|
321
|
+
| <kbd>Tab</kbd> | Move focus to the next widget. |
|
|
322
|
+
| <kbd>Arrow</kbd> keys | Move the focused widget one cell. With a selection, moves the whole selection. |
|
|
323
|
+
| <kbd>Space</kbd> | Toggle the focused widget's selection (`selectionMode` only). |
|
|
324
|
+
| <kbd>Shift</kbd> / <kbd>Cmd</kbd> / <kbd>Ctrl</kbd> + press | Add or remove a widget from the selection. |
|
|
325
|
+
| <kbd>Escape</kbd> | Clear the selection. |
|
|
326
|
+
| <kbd>Delete</kbd> / <kbd>Backspace</kbd> | Request deletion of the selection via `onWidgetsDelete`. |
|
|
327
|
+
|
|
328
|
+
Arrow keys and <kbd>Space</kbd> only act when the widget host **itself** is
|
|
329
|
+
focused, never when focus is inside a nested control, so an `input`,
|
|
330
|
+
`textarea`, or `button` inside a widget keeps every key it needs. Board's own
|
|
331
|
+
keys are handled on the board element rather than on `document`, and are only
|
|
332
|
+
consumed when they actually do something — an <kbd>Escape</kbd> with nothing
|
|
333
|
+
selected still reaches an ancestor Dialog, and <kbd>Backspace</kbd> stays
|
|
334
|
+
available for text editing and browser-back.
|
|
335
|
+
|
|
336
|
+
Every draggable or selectable widget is its own tab stop. Roving tabindex would
|
|
337
|
+
be an improvement on a large board, but arrow keys are already claimed for
|
|
338
|
+
movement, so it needs a navigation key set of its own — see below.
|
|
339
|
+
|
|
340
|
+
### Screen Reader Support
|
|
341
|
+
|
|
342
|
+
Each widget host is a `group` with an accessible name, taken from
|
|
343
|
+
`aria-label`, then `qa`, then the layout item id — set `aria-label` on any
|
|
344
|
+
user-visible widget, since the other two are developer-facing. Draggable widgets
|
|
345
|
+
carry a localized `aria-roledescription`, and selectable ones advertise
|
|
346
|
+
`aria-keyshortcuts="Space"`.
|
|
347
|
+
|
|
348
|
+
Selection state is conveyed two ways: a selected widget is described as
|
|
349
|
+
"Selected" via `aria-describedby`, and every selection change is announced
|
|
350
|
+
through a polite live region owned by the board ("Revenue selected", "3 widgets
|
|
351
|
+
selected", "Selection cleared"). A marquee announces once, on release — not once
|
|
352
|
+
per pointer frame.
|
|
353
|
+
|
|
354
|
+
### ARIA Properties
|
|
355
|
+
|
|
356
|
+
Board deliberately does **not** use a collection role. `aria-selected` is only
|
|
357
|
+
valid on `option`, `gridcell`, `row`, `treeitem` and friends, and every one of
|
|
358
|
+
those requires presentational children — but a Board widget hosts arbitrary
|
|
359
|
+
interactive content (nested boards, tabs, inputs), and a `grid`'s keyboard model
|
|
360
|
+
would fight `useMove`'s arrow keys. Rather than ship ARIA that lies about the
|
|
361
|
+
structure, selection is exposed through the name, description, and live region
|
|
362
|
+
described above. Set `aria-label` on your widgets and this reads correctly.
|
|
232
363
|
|
|
233
364
|
## Not yet supported
|
|
234
365
|
|
|
@@ -240,6 +371,23 @@ touch drags capture the pointer, so they do not trigger it.
|
|
|
240
371
|
placeholder, and new `onDrop`/`droppingItem` props). Add widgets
|
|
241
372
|
programmatically (render a new `Board.Widget` and add its layout item), or drag
|
|
242
373
|
between boards with `Board.Provider`.
|
|
374
|
+
- **Cross-board group transfer** — a group drag never leaves its source board.
|
|
375
|
+
Cross-board transfer is single-item throughout (`WidgetTransferInfo`, the
|
|
376
|
+
carried preview, the free-slot fallback), and landing a group on a board with a
|
|
377
|
+
different column count has no obvious right answer. Degrading to a
|
|
378
|
+
single-widget transfer would silently split a selection the user made, so the
|
|
379
|
+
gesture is confined instead. Drag widgets across one at a time.
|
|
380
|
+
- **Collection ARIA semantics** — `role="grid"`/`option`, `aria-selected` and
|
|
381
|
+
`aria-multiselectable`, for the reason above.
|
|
382
|
+
- **Roving tabindex** — needs a widget-navigation key set that does not collide
|
|
383
|
+
with `useMove`'s arrow keys.
|
|
384
|
+
- **<kbd>Cmd/Ctrl</kbd>+<kbd>A</kbd>** — select all.
|
|
385
|
+
- **Cross-board marquee and cross-board selection** — selection is per board; a
|
|
386
|
+
`Board.Provider` shares drag, not selection.
|
|
387
|
+
- **Windows High Contrast Mode** — no component in the kit styles for
|
|
388
|
+
`forced-colors` yet. The selected state uses a tint, a border *and* an extra
|
|
389
|
+
ring, so it does not rely on hue alone, but a full forced-colors pass is a
|
|
390
|
+
system-wide change.
|
|
243
391
|
|
|
244
392
|
## Attribution
|
|
245
393
|
|