prime-ui-kit 0.19.0 → 0.20.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.
Files changed (85) hide show
  1. package/README.md +1 -1
  2. package/dist/chunks/{chunk-RZNGLELR.js → chunk-3PY52JP3.js} +1603 -1609
  3. package/dist/chunks/{chunk-ZTZ2ML2B.js → chunk-4KONMO7Z.js} +1 -1
  4. package/dist/chunks/{chunk-WYCTXD63.js → chunk-W6EGTNG6.js} +3553 -2882
  5. package/dist/color-picker.js +2 -2
  6. package/dist/components/data-table/ColumnsMenu.d.ts +34 -8
  7. package/dist/components/data-table/DataTable.d.ts +31 -5
  8. package/dist/components/data-table/DataTableColumnsMenu.d.ts +45 -0
  9. package/dist/components/data-table/Head.d.ts +14 -8
  10. package/dist/components/data-table/Row.d.ts +8 -8
  11. package/dist/components/data-table/StateRows.d.ts +5 -5
  12. package/dist/components/data-table/columnOrder.d.ts +14 -0
  13. package/dist/components/data-table/reorder.d.ts +15 -5
  14. package/dist/components/data-table/types.d.ts +5 -0
  15. package/dist/components/data-table/useFrozenColumns.d.ts +6 -2
  16. package/dist/components/datepicker/DatepickerPanel.d.ts +1 -1
  17. package/dist/components/dnd/Dnd.d.ts +9 -5
  18. package/dist/components/dnd/inPlaceRow.d.ts +7 -0
  19. package/dist/components/dnd/useDragSource.d.ts +2 -0
  20. package/dist/components/dnd/useSortableList.d.ts +5 -0
  21. package/dist/components/field-list/FieldList.d.ts +34 -12
  22. package/dist/components/gantt/Gantt.d.ts +1 -1
  23. package/dist/components/index.d.ts +2 -0
  24. package/dist/components/scroll-container/ScrollContainer.d.ts +1 -1
  25. package/dist/index.css +1 -1
  26. package/dist/index.js +4 -2
  27. package/dist/internal/ToolRow.d.ts +23 -0
  28. package/dist/internal/fieldCell.d.ts +0 -6
  29. package/dist/layout/page/Page.d.ts +7 -7
  30. package/dist/skill/anti-slop.md +43 -12
  31. package/dist/skill/api-contract.md +1 -1
  32. package/dist/skill/cheatsheet.md +7 -3
  33. package/dist/skill/checklist.md +4 -1
  34. package/dist/skill/choosing.md +1 -0
  35. package/dist/skill/components.md +1 -1
  36. package/dist/skill/composition.md +137 -20
  37. package/dist/skill/reference/components/data-table/COMPONENT.md +101 -40
  38. package/dist/skill/reference/components/data-table/examples/column-order.tsx +152 -0
  39. package/dist/skill/reference/components/data-table/examples/columns-visibility.tsx +20 -11
  40. package/dist/skill/reference/components/data-table/examples/controlled.tsx +32 -17
  41. package/dist/skill/reference/components/data-table/examples/examples.module.css +14 -36
  42. package/dist/skill/reference/components/data-table/examples/narrow.tsx +24 -11
  43. package/dist/skill/reference/components/data-table/examples/reorder.tsx +24 -2
  44. package/dist/skill/reference/components/data-table/examples/selection.tsx +13 -18
  45. package/dist/skill/reference/components/data-table/examples/server.tsx +45 -31
  46. package/dist/skill/reference/components/data-table/examples/toolbar.tsx +5 -12
  47. package/dist/skill/reference/components/datepicker/COMPONENT.md +2 -2
  48. package/dist/skill/reference/components/dnd/COMPONENT.md +9 -4
  49. package/dist/skill/reference/components/dnd/examples/table-columns.tsx +75 -0
  50. package/dist/skill/reference/components/field-list/COMPONENT.md +70 -43
  51. package/dist/skill/reference/components/field-list/examples/narrow.tsx +108 -33
  52. package/dist/skill/reference/components/field-list/examples/reorder.tsx +1 -1
  53. package/dist/skill/reference/components/field-list/examples/row-menu.tsx +71 -0
  54. package/dist/skill/reference/components/field-list/examples/screen.tsx +2 -1
  55. package/dist/skill/reference/components/field-list/examples/variants.tsx +51 -0
  56. package/dist/skill/reference/components/gantt/COMPONENT.md +4 -4
  57. package/dist/skill/reference/components/scroll-container/COMPONENT.md +1 -1
  58. package/dist/skill/reference/components/smart-filter/COMPONENT.md +2 -2
  59. package/dist/skill/reference/layout/page/COMPONENT.md +8 -5
  60. package/dist/skill/responsive.md +10 -8
  61. package/dist/tokens/semantic.d.ts +1 -1
  62. package/package.json +1 -1
  63. package/src/components/data-table/COMPONENT.md +101 -40
  64. package/src/components/data-table/examples/column-order.tsx +152 -0
  65. package/src/components/data-table/examples/columns-visibility.tsx +20 -11
  66. package/src/components/data-table/examples/controlled.tsx +32 -17
  67. package/src/components/data-table/examples/examples.module.css +14 -36
  68. package/src/components/data-table/examples/narrow.tsx +24 -11
  69. package/src/components/data-table/examples/reorder.tsx +24 -2
  70. package/src/components/data-table/examples/selection.tsx +13 -18
  71. package/src/components/data-table/examples/server.tsx +45 -31
  72. package/src/components/data-table/examples/toolbar.tsx +5 -12
  73. package/src/components/datepicker/COMPONENT.md +2 -2
  74. package/src/components/dnd/COMPONENT.md +9 -4
  75. package/src/components/dnd/examples/table-columns.tsx +75 -0
  76. package/src/components/field-list/COMPONENT.md +70 -43
  77. package/src/components/field-list/examples/narrow.tsx +108 -33
  78. package/src/components/field-list/examples/reorder.tsx +1 -1
  79. package/src/components/field-list/examples/row-menu.tsx +71 -0
  80. package/src/components/field-list/examples/screen.tsx +2 -1
  81. package/src/components/field-list/examples/variants.tsx +51 -0
  82. package/src/components/gantt/COMPONENT.md +4 -4
  83. package/src/components/scroll-container/COMPONENT.md +1 -1
  84. package/src/components/smart-filter/COMPONENT.md +2 -2
  85. package/src/layout/page/COMPONENT.md +8 -5
@@ -25,7 +25,7 @@ import { Gantt, type GanttBar, type GanttDates, type GanttScale } from "prime-ui
25
25
  ## Anatomy
26
26
  ```
27
27
  Gantt surface (layer of the ladder), size container
28
- ├─ toolbar your `toolbar` content · «Сегодня» · zoom (SegmentedControl)
28
+ ├─ toolbar the kit's tool row: your `toolbar` content (the free room) · «Сегодня» · zoom (SegmentedControl)
29
29
  └─ viewport ScrollContainer, both axes, own scroll only
30
30
  └─ role="grid"
31
31
  ├─ head row (sticky) corner (sticky) · axis: top tier (months / years) over bottom tier (days / weeks / months), today chip
@@ -62,7 +62,7 @@ Gantt surface (layer of the ladder), size container
62
62
  | `readOnly` | `boolean` | `false` | No moving, resizing or creating; bars still select and show their dates. |
63
63
  | `loading` | `boolean` | `false` | Without rows — skeleton rows in the chart's geometry and a status for screen readers; with rows they stay and the grid is `aria-busy`. |
64
64
  | `empty` | `ReactNode` | — | Empty-state content when `rows` is empty; a string goes into a compact `EmptyPage`. Defaults to `labels.empty`. |
65
- | `toolbar` | `ReactNode` | — | Content at the start of the toolbar (title, filters, a primary action); the zoom and «Сегодня» sit at its end. |
65
+ | `toolbar` | `ReactNode` | — | Content at the start of the toolbar (title, a legend, filters), kept together in the free room; «Сегодня» and the zoom keep their width at its end, and on a narrow chart they take the next line, the zoom filling it. |
66
66
  | `scrollHeight` | `number \| "fill"` | — | Max height of the viewport in px, so the header sticks while rows scroll; `"fill"` — the chart takes its flex / grid parent's height. |
67
67
  | `onItemOpen` | `(bar: Bar, row: Row) => void` | — | A bar was activated (click, Enter, Space): open its record. A drag never opens it. |
68
68
  | `onBarChange` | `(dates: GanttDates, bar: Bar, row: Row) => void \| Promise<void>` | — | New dates of a bar after a drag or an editing key — update your data. A returned Promise keeps the bar busy at the new dates; a rejection glides it back. Without it bars cannot be edited. |
@@ -151,7 +151,7 @@ A `tone` wins over `color`. Say the status in the label too, never only by color
151
151
  - Editing precision: a move, a resize and a drawing snap to whole days at every zoom (at the month zoom a day is 4 px, so the snap holds a day until the pointer clearly leaves it); hold Alt to snap to the zoom's week or month. A bar is at least one day long: a resize past the opposite edge stops there and never flips. On touch a finger held on a bar picks it up, then it drags like a pointer.
152
152
  - Creating: on empty space the cursor is a crosshair and, on pointer devices, the cell under it is washed with a «+». Drag across a row to draw a range in days, double-click (or long-press on touch) for one unit of the zoom; a drag after the long press draws days. While drawing, a ghost with a dates and duration tooltip follows the pointer. Without `onBarCreate` (or with `readOnly`) nothing can be created and empty space shows no create cursor. Near the edges of the axis a drag, a resize and a drawing scroll the chart.
153
153
  - Tooltip: the bar's title, then its dates · duration · progress; `renderBarTooltip` adds lines under them (a client, planned hours) and never replaces them — the dates are what the bar means on the axis, and the same tooltip shows the new dates while dragging.
154
- - A legend of bar colours goes in `toolbar`: a row of `Badge.Root color` + `Badge.Dot` with the category name, one per hue the bars use; the toolbar wraps it. Say the category in the bar label or the tooltip too, never only by colour.
154
+ - A legend of bar colours goes in `toolbar`: a row of `Badge.Root color` + `Badge.Dot` with the category name, one per hue the bars use; the toolbar keeps it together in the free room and wraps it, «Сегодня» and the zoom at the end (on a narrow chart on the next line, the zoom filling it). Say the category in the bar label or the tooltip too, never only by colour.
155
155
  - The default axis covers every bar and today with a unit of room on both sides; pass `range` for a fixed period.
156
156
  - The chart opens with today a third into the view; «Сегодня» and the arrow keys scroll only the chart's scroller, never the page.
157
157
  - A row grows by a lane for every overlapping bar: lanes are packed greedily by start date.
@@ -237,5 +237,5 @@ A `tone` wins over `color`. Say the status in the label too, never only by color
237
237
  - Expecting the page to scroll to today → «Сегодня» scrolls only the chart.
238
238
 
239
239
  ## Related
240
- - **Built from:** [ScrollContainer](../scroll-container/COMPONENT.md), [Tooltip](../tooltip/COMPONENT.md), [SegmentedControl](../segmented-control/COMPONENT.md), [Button](../button/COMPONENT.md), [Skeleton](../skeleton/COMPONENT.md), [EmptyPage](../empty-page/COMPONENT.md), [Spinner](../spinner/COMPONENT.md), Icon (`action.add` in the create cue), [VisuallyHidden](../visually-hidden/COMPONENT.md)
240
+ - **Built from:** [ScrollContainer](../scroll-container/COMPONENT.md), [Tooltip](../tooltip/COMPONENT.md), [SegmentedControl](../segmented-control/COMPONENT.md), [Button](../button/COMPONENT.md), [Skeleton](../skeleton/COMPONENT.md), [EmptyPage](../empty-page/COMPONENT.md), [Spinner](../spinner/COMPONENT.md), Icon (`action.add` in the create cue), [VisuallyHidden](../visually-hidden/COMPONENT.md); `ToolRow` (the toolbar, as the DataTable `toolbar`) with [SmartFilter](../smart-filter/COMPONENT.md), [Input](../input/COMPONENT.md) and [Typography](../typography/COMPONENT.md) (what grows in the tool row), [SegmentedControl](../segmented-control/COMPONENT.md), [Datepicker](../datepicker/COMPONENT.md) and [Select](../select/COMPONENT.md) (what fills a short line; the first two get `fullWidth`)
241
241
  - **See also:** [Timeline](../timeline/COMPONENT.md), [DataTable](../data-table/COMPONENT.md), [Kanban](../kanban/COMPONENT.md), [Datepicker](../datepicker/COMPONENT.md), [Avatar](../avatar/COMPONENT.md)
@@ -48,7 +48,7 @@ ScrollContainer <div> (or the `as` tag); thin scrollbar, soft hidden edges
48
48
  | `anchor` | `"start" \| "end"` | `"start"` | `end` — a chat or a log: opens at the end and follows new content while the person is at the end; scrolled away, the view holds still. |
49
49
  | `onReachStart` | `() => void \| Promise<void>` | — | Fires within 120 px of the start, once per approach: load older content. A returned promise blocks repeats and sets `aria-busy`; content added above keeps the view. |
50
50
  | `onReachEnd` | `() => void \| Promise<void>` | — | The scroll position came within 120 px of the end: load the next page. Same once-per-approach and promise rules as `onReachStart`. |
51
- | `overscrollBehavior` | `"auto" \| "contain" \| "none"` | `"contain"` | CSS `overscroll-behavior`; `contain` stops scroll chaining into the page. |
51
+ | `overscrollBehavior` | `"auto" \| "contain" \| "none"` | `"contain"` | CSS `overscroll-behavior` along the region's own axes; `contain` stops scroll chaining into the page, a scroll across them still reaches the region around. |
52
52
  | `as` | `"div" \| "main" \| "aside" \| "section" \| "nav" \| "article" \| "pre"` | `"div"` | Root element; a landmark tag when the region is one, `pre` for preformatted text (CodeBlock). |
53
53
  | `…rest` | `HTMLAttributes<HTMLElement>` | — | `children`, `className` (height, padding), `aria-label`, `tabIndex`, `role`, event handlers and the other attributes. |
54
54
 
@@ -173,7 +173,7 @@ same height and type.
173
173
  - Values and chips wrap with `--prime-space-2` gaps; «Сбросить все» is pushed to the end. The chips row rises in with the first filter and closes up in place with the last (`partPresence`).
174
174
  - Option groups stack `--prime-space-3` apart, a caption `--prime-space-1` above each group's values. A range row holds two equal Inputs with a dash between them, centred on the field label.
175
175
  - While typing a search a range row stays only when its field name matches.
176
- - The root draws nothing: its host places Toolbar and Chips. In a page bar the Toolbar goes in `Page.Tools` and the Chips in `Page.Chips`, with `SmartFilter.Root` around `Page.Root`; outside a page a host stacks them (a `Card.Body`, a form column).
176
+ - The root draws nothing: its host places Toolbar and Chips, next to what they filter. A table among other blocks (KPI cards, a chart) takes them in its own tools row — the DataTable `toolbar` (the Toolbar) and `toolbarChips` (the Chips), with `SmartFilter.Root` around the DataTable. A page that is one list takes them in its bar — the Toolbar in `Page.Tools`, the Chips in `Page.Chips`, with `SmartFilter.Root` around `Page.Root`. Elsewhere a host stacks them (a `Card.Body`, a form column).
177
177
 
178
178
  ## Accessibility
179
179
 
@@ -252,4 +252,4 @@ same height and type.
252
252
 
253
253
  ## Related
254
254
  - **Built from:** [Button](../button/COMPONENT.md), [Badge](../badge/COMPONENT.md), [Input](../input/COMPONENT.md), [Datepicker](../datepicker/COMPONENT.md), [Popover](../popover/COMPONENT.md), [Divider](../divider/COMPONENT.md), [Kbd](../kbd/COMPONENT.md), [EmptyPage](../empty-page/COMPONENT.md), [LinkButton](../link-button/COMPONENT.md), [Typography](../typography/COMPONENT.md), Icon (`action.search`, `action.filter`, `action.add`, `nav.chevronDown`), [VisuallyHidden](../visually-hidden/COMPONENT.md)
255
- - **See also:** [Page](../../layout/page/COMPONENT.md) (`Page.Tools`, `Page.Chips`), [TagSelect](../tag-select/COMPONENT.md), [DataTable](../data-table/COMPONENT.md)
255
+ - **See also:** [Page](../../layout/page/COMPONENT.md) (`Page.Tools`, `Page.Chips`), [TagSelect](../tag-select/COMPONENT.md), [DataTable](../data-table/COMPONENT.md) (`toolbar`, `toolbarChips`)
@@ -8,6 +8,7 @@
8
8
  ## When to use
9
9
  - Every route rendered inside `AppShell.Main`: the app is navigation and the page, and the page carries its own top (`Page.TopBar`), title (`Page.Title`, the `<h1>`) and body.
10
10
  - A work screen (a list, a board, a chat, a schedule): `Page.TopBar` with the title (`Page.Heading`), the page's tools (`Page.Tools`: sections, search and filter, view), all its buttons (`Page.Actions`) and the active filters (`Page.Chips`).
11
+ - A filter stands next to what it filters. `Page.Tools` holds what acts on the whole page: sections, the view, a period that drives several blocks (the KPI cards and the table). The search, filter, chips and column chooser of a page that is one list stay there too — the list is the page. On a page that holds more than its table (KPI cards, a chart), they belong to the table's own tools row (DataTable `toolbar` + `toolbarChips`), not the bar.
11
12
  - A document page (settings, a long form, help) or an overview (a dashboard): `Page.Header` in the flow — the large title and its buttons — and `Page.TopBar collapse`, which repeats the title once it scrolls away and keeps the path and the buttons in reach.
12
13
  - A nested record: a `Breadcrumb` path in `Page.Heading`; in the bar the title reads as its last level.
13
14
  - A text page held to a reading measure (`maxWidth="readable"`), a wide dashboard capped at the content width (`maxWidth="wide"`).
@@ -42,7 +43,7 @@ Page.Root the page column (<div>); maxWidth, fill, labe
42
43
  │ │ ├─ Breadcrumb.Root the path; the heading draws one chevron after it
43
44
  │ │ ├─ Page.Title <h1>, title-m, the path's last level, truncates
44
45
  │ │ └─ Page.Description <p>, muted caption under the whole line, truncates
45
- │ ├─ Page.Tools the page's controls in the order written, one wrapper each
46
+ │ ├─ Page.Tools what acts on the whole page, in the order written: the one tool row (as the DataTable toolbar)
46
47
  │ │ ├─ SegmentedControl.Root sections, view (fullWidth unless set)
47
48
  │ │ ├─ SmartFilter.Toolbar search and filter: grows first on a line of its own
48
49
  │ │ ├─ Datepicker.Root a period (fullWidth unless set)
@@ -121,7 +122,7 @@ Page.Root the page column (<div>); maxWidth, fill, labe
121
122
  | `…rest` | `HTMLAttributes<HTMLParagraphElement>` | — | `children`, `className` and the other paragraph attributes. |
122
123
 
123
124
  ### Page.Tools
124
- `ref` → `HTMLDivElement`. The page's tools in the order written: sections, `SmartFilter.Toolbar`, view. On a line of their own a search grows first, the rest share the line: a `SegmentedControl.Root` and a `Datepicker.Root` are `fullWidth` unless set. Named, a `group`.
125
+ `ref` → `HTMLDivElement`. What acts on the whole page: sections, a shared period, view; the search of a one-list page. The tool row of the DataTable `toolbar`: a search takes the free room, the rest keep their width at the end. Named, a `group`.
125
126
 
126
127
  | Prop | Type | Default | Description |
127
128
  |---|---|---|---|
@@ -244,7 +245,7 @@ One plan, chosen from the natural widths of the groups (`data-plan` on the bar's
244
245
  | Step | Looks like | Use when | Default |
245
246
  |---|---|---|---|
246
247
  | `one` | `[Heading 1fr][Tools][Actions]` on one line | everything fits | yes |
247
- | `below` | the tools on a line of their own under the heading and the actions, filling it: a search (`SmartFilter.Toolbar`, `Input.Root`) grows first, switchers and fields (`SegmentedControl.Root`, `Datepicker.Root`, a Select) share the rest and wrap when one line is not enough | heading + tools + actions do not fit | |
248
+ | `below` | the tools on a line of their own under the heading and the actions — the one tool row, as the DataTable `toolbar`: a search (`SmartFilter.Toolbar`, `Input.Root`) takes the free room, switchers, pickers and buttons keep their width at the end; under 36rem the search takes a line of its own and a `SegmentedControl.Root` / `Datepicker.Root` / Select fills the line it stands on | heading + tools + actions do not fit | |
248
249
  | `icons-secondary` | as `below`; secondary Buttons with a `Button.Icon` show only the icon, the label is their name and their tooltip | heading + actions still do not fit | |
249
250
  | `icons` | the primary Button gives way to its icon too | still too wide | |
250
251
  | `fold` | the secondary Buttons fold into «⋯» (`labels.more`); the primary stays | still too wide, and «⋯» is narrower than their icons (a single secondary keeps its icon); past it a Breadcrumb path folds into «…»; if the path and the title still do not share the line, the heading stacks: the path on its own line over the title, the title and the description wrapping (`data-heading="stack"`); a heading without a path truncates | |
@@ -290,6 +291,7 @@ A wide cell (`span` 7–11) written next to a narrow one (`span` 4–5) is a pai
290
291
  ## Layout & spacing
291
292
  - The edge air comes from the host: `AppShell.Main` sets `--page-gutter` (the page gutter, 16 → 24 → 32) and `--page-top` (24 → 32 from 1024px); `Page.Root` pads itself with them. Outside a host the page brings no air. The page resets both for what it holds, so a page nested in it starts clean.
292
293
  - `Page.TopBar` steps out of the gutter to the panel's edges and keeps the gutter inside; padding 12 above (or the top safe-area inset) and below; what follows starts 24 under its controls (header → body; the bar's own 12 counts in). The first line is as high as the Sidebar brand row (control m + 8), so the two read as one line. Groups 16 apart on a line, lines 12 apart; tools 8 apart; buttons 8 apart.
294
+ - `Page.Tools` and `Page.Chips` are the kit's one tool row and chips line (`ToolRow`), the same as the DataTable `toolbar` and `toolbarChips`: the bar only places them. On the first line every tool keeps its natural width; on a line of their own they take the line and lay out from its width (container `prime-tool-row`), never from the window.
293
295
  - In the bar only the heading's column gives (`minmax(0, 1fr)`): the tools and the actions keep their width. The heading keeps its natural width until every button step is taken; then a heading with a path stacks (the path over the title, the title and the description wrapping), so no level is cut to a fragment; a heading without a path truncates its title.
294
296
  - The plan is measured, never chosen by breakpoints: the bar lays itself out from its own width.
295
297
  - Header (flow) → Body 24; blocks inside Body 24; a `Page.Section` 40 from its neighbours (the body's 24 + 16); tile → tile in a Grid 16 on both axes; section heading → content 16, heading → description 4; flow Title → Description 8; heading → Actions 24 side by side, 16 once they wrap below.
@@ -358,6 +360,7 @@ A wide cell (`span` 7–11) written next to a narrow one (`span` 4–5) is a pai
358
360
  - Buttons without an icon in a crowded bar → they cannot give way to an icon; give each `Button.Root` a `Button.Icon` beside its label.
359
361
  - Two places for buttons (some beside the title, the primary among the tools) → every button of the page goes into the one `Page.Actions`, the primary last.
360
362
  - `SmartFilter.Root` inside the bar, around `Page.Tools` → it holds no DOM; wrap it around `Page.Root` so its Toolbar (in `Page.Tools`) and its Chips (in `Page.Chips`) share it.
363
+ - A table's search, filter, chips or «Колонки» in `Page.Tools` / `Page.Chips` above KPI cards or a chart they do not filter → they read as filters of the whole page; move them into the table's `toolbar` / `toolbarChips`. The bar keeps the title, a period that drives every block, sections and the primary action.
361
364
  - `Page.Header` inside `Page.TopBar` → the bar takes `Page.Heading` and `Page.Actions` directly; `Page.Header` is the flow's document header.
362
365
  - A hand-made menu button for the phone Sidebar → the bar draws it while the Sidebar is off-canvas.
363
366
  - Hiding buttons with media queries on a phone → `Page.Actions` in the bar collapses and folds them by measured width.
@@ -371,5 +374,5 @@ A wide cell (`span` 7–11) written next to a narrow one (`span` 4–5) is a pai
371
374
  - Tiles of a row cut to 6 + 6 so a mid-width grid keeps no hole → write the 8 and the 4 next to each other; the grid pairs them as 2/3 + 1/3.
372
375
 
373
376
  ## Related
374
- - **Built from:** [AppShell](../app-shell/COMPONENT.md) (the navigation the menu button opens), [Breadcrumb](../../components/breadcrumb/COMPONENT.md) (the path the heading places), [Button](../../components/button/COMPONENT.md) (the menu button, «⋯», `Page.BackButton`; the icon-only label hook), [Dropdown](../../components/dropdown/COMPONENT.md) (folded buttons), [Tooltip](../../components/tooltip/COMPONENT.md) (the label of an icon-only button), [SegmentedControl](../../components/segmented-control/COMPONENT.md) and [Datepicker](../../components/datepicker/COMPONENT.md) (`fullWidth` in `Page.Tools`), [SmartFilter](../../components/smart-filter/COMPONENT.md) and [Input](../../components/input/COMPONENT.md) (the search that grows first in `Page.Tools`), [Crossfade](../../components/crossfade/COMPONENT.md) (a `Page.Cell` child gets `fill`), [Skeleton](../../components/skeleton/COMPONENT.md) (the line of data while it loads), [ConfirmDialog](../../components/confirm-dialog/COMPONENT.md) (the confirm of `Page.Guard`), Icon (`nav.menu`, `nav.chevronRight`, `action.more`, `nav.chevronLeft`)
375
- - **See also:** [Sidebar](../sidebar/COMPONENT.md), [BottomNav](../bottom-nav/COMPONENT.md), [Select](../../components/select/COMPONENT.md), [Card](../../components/card/COMPONENT.md), [ChartFrame](../../components/chart-frame/COMPONENT.md), [List](../../components/list/COMPONENT.md), [EmptyPage](../../components/empty-page/COMPONENT.md), [Drawer](../../components/drawer/COMPONENT.md), [VisuallyHidden](../../components/visually-hidden/COMPONENT.md)
377
+ - **Built from:** [AppShell](../app-shell/COMPONENT.md) (the navigation the menu button opens), [Breadcrumb](../../components/breadcrumb/COMPONENT.md) (the path the heading places), [Button](../../components/button/COMPONENT.md) (the menu button, «⋯», `Page.BackButton`; the icon-only label hook), [Dropdown](../../components/dropdown/COMPONENT.md) (folded buttons), [Tooltip](../../components/tooltip/COMPONENT.md) (the label of an icon-only button), `ToolRow` (`Page.Tools` and `Page.Chips`: the kit's one tool row and chips line) with [SmartFilter](../../components/smart-filter/COMPONENT.md), [Input](../../components/input/COMPONENT.md) and [Typography](../../components/typography/COMPONENT.md) (what grows in the tool row), [SegmentedControl](../../components/segmented-control/COMPONENT.md), [Datepicker](../../components/datepicker/COMPONENT.md) and [Select](../../components/select/COMPONENT.md) (what fills a short line; the first two get `fullWidth`), [Crossfade](../../components/crossfade/COMPONENT.md) (a `Page.Cell` child gets `fill`), [Skeleton](../../components/skeleton/COMPONENT.md) (the line of data while it loads), [ConfirmDialog](../../components/confirm-dialog/COMPONENT.md) (the confirm of `Page.Guard`), Icon (`nav.menu`, `nav.chevronRight`, `action.more`, `nav.chevronLeft`)
378
+ - **See also:** [DataTable](../../components/data-table/COMPONENT.md) (`toolbar`, `toolbarChips`), [Sidebar](../sidebar/COMPONENT.md), [BottomNav](../bottom-nav/COMPONENT.md), [Select](../../components/select/COMPONENT.md), [Card](../../components/card/COMPONENT.md), [ChartFrame](../../components/chart-frame/COMPONENT.md), [List](../../components/list/COMPONENT.md), [EmptyPage](../../components/empty-page/COMPONENT.md), [Drawer](../../components/drawer/COMPONENT.md), [VisuallyHidden](../../components/visually-hidden/COMPONENT.md)