Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 0 additions & 7 deletions .changeset/add-color-picker.md

This file was deleted.

55 changes: 0 additions & 55 deletions .changeset/board-selection-and-group-move.md

This file was deleted.

5 changes: 0 additions & 5 deletions .changeset/fix-collection-item-types.md

This file was deleted.

64 changes: 64 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,69 @@
# @cube-dev/ui-kit

## 0.156.0

### Minor Changes

- [#1287](https://github.com/cube-js/cube-ui-kit/pull/1287) [`946f6b85`](https://github.com/cube-js/cube-ui-kit/commit/946f6b8570acd63d97d9e9ba8ebf91459e315e48) Thanks [@tenphi](https://github.com/tenphi)! - Add `ColorPicker` — a form-attachable color input. The field shows the current color as a swatch, accepts hex, `rgb()`, `hsl()`, `okhsl()`, `okhst()` and `oklch()` text, and opens a popover where the color can be tuned on three axes: HST (OKHST hue/saturation/tone), LCH (OKLCH lightness/chroma/hue) or RGB. Every conversion runs through Glaze, so the value is always a real, in-gamut color.

`formatMode` controls how the text relates to the value: `forced` (default) rewrites the text in `format`, `derive` keeps the notation the user typed but normalizes the value, and `free` passes the text through verbatim after verifying it parses. Also adds a `PipetteIcon`.

- [#1286](https://github.com/cube-js/cube-ui-kit/pull/1286) [`272a9e9b`](https://github.com/cube-js/cube-ui-kit/commit/272a9e9bc424b8b09be268640ff81be016540c9a) Thanks [@tenphi](https://github.com/tenphi)! - Add widget selection and rigid group movement to `Board`.

Set `selectionMode="single" | "multiple"` and read the selection with
`selectedKeys` / `defaultSelectedKeys` / `onSelectionChange` (keys are layout item
ids, always returned in layout order).

Pressing a widget selects it on pointer-down and arms a drag of the selection —
selecting and grabbing are one gesture, so move the pointer and it drags, stay
still and it was only a selection. <kbd>Shift</kbd> (or <kbd>Cmd</kbd>/
<kbd>Ctrl</kbd>) toggles membership, dragging from empty canvas lassos
(`allowMarqueeSelection`), <kbd>Space</kbd> toggles the focused widget, and
<kbd>Escape</kbd> clears.

Selection behaves like focus: it tracks what the user is working with and moves on
as soon as they touch something else — pressing another widget makes that the
selection, and pressing an interactive control inside a widget or moving focus off
the board drops it entirely.

With `"multiple"`, dragging any selected widget moves the whole selection as a
rigid block that reflows by the board's own rules — the same compaction a single
widget gets, so a group can never be parked in empty space on a `vertical` board
and the widgets around it close the gap in the same frame. Every widget travels by the same delta, the group clamps against the
grid edge as a unit instead of collapsing into it, a frame that cannot be placed
is rejected outright rather than partially applied, and the move commits through a
single `onLayoutChange`. Arrow keys move the group too. `BoardInteractionInfo`
gains `items`, `oldItems` and `placeholders` describing the whole gesture; the
existing `item` / `oldItem` / `placeholder` fields are unchanged, and a board with
no selection behaves exactly as before.

The `selectionCancel` selector (board- or widget-level, defaulting to the exported
`BOARD_SELECTION_CANCEL`) marks interactive descendants; `[data-no-select]` opts
out a custom control. On a selectable board it also gates dragging, which fixes a
long-standing trap: `useMove`'s pointer-down calls `preventDefault()`, so without
a `dragCancel` an `input` inside a widget could not be focused or typed into.
Selected widgets are drawn with a `#primary-border` border and a `#primary` ring —
an edge treatment rather than a fill, since selection reads as a focus-like state;
`outline` stays reserved for the real focus ring. Widgets get a `selected`
modifier you can restyle through `widgetProps.styles`.

`onWidgetsDelete` reports a <kbd>Delete</kbd>/<kbd>Backspace</kbd> press with a
non-empty selection. Board never mutates the layout itself, so removal stays
yours to implement and to make undoable.

Accessibility: widget hosts are now `role="group"` with an accessible name from
the new `Board.Widget` `aria-label` prop (falling back to `qa`, then the layout
id). `aria-roledescription` is now localized rather than hardcoded English — it
was previously also invalid, sitting on a role-less element. Selected widgets are
described as "Selected", and selection changes are announced through a polite live
region.

Widget hosts also expose `data-board-widget-id` and `data-selected`.

### Patch Changes

- [#1284](https://github.com/cube-js/cube-ui-kit/pull/1284) [`fc517477`](https://github.com/cube-js/cube-ui-kit/commit/fc5174777e4d330d5d4be98cf5547daa038dc9f0) Thanks [@tenphi](https://github.com/tenphi)! - Fix the types of `FilterListBox.Item` and `CommandMenu.Item`. Both were declared as React Stately's bare `Item`, so `Item` props such as `icon`, `rightIcon`, `description`, `hotkeys` and `actions` were rejected by TypeScript even though they worked at runtime. They now use `CollectionItem`, matching `ListBox.Item`, `Menu.Item` and the other collection components.

## 0.155.0

### Minor Changes
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@cube-dev/ui-kit",
"version": "0.155.0",
"version": "0.156.0",
"type": "module",
"description": "UIKit for Cube Projects",
"repository": {
Expand Down