@cueplusplus/ui 0.5.0 → 0.7.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 (69) hide show
  1. package/CHANGELOG.md +53 -0
  2. package/dist/chrome/_drag.js +59 -0
  3. package/dist/chrome/_status-bar-item.js +85 -0
  4. package/dist/chrome/_status-bar.d.ts +15 -0
  5. package/dist/chrome/_status-bar.js +171 -0
  6. package/dist/chrome/app-shell.d.ts +69 -1
  7. package/dist/chrome/app-shell.js +38 -11
  8. package/dist/chrome/index.d.ts +3 -2
  9. package/dist/chrome/status-bar.d.ts +87 -4
  10. package/dist/chrome/status-bar.js +80 -16
  11. package/dist/chrome/title-bar.d.ts +11 -1
  12. package/dist/chrome/title-bar.js +1 -3
  13. package/dist/date/_segments.js +15 -4
  14. package/dist/forms/_chassis.d.ts +104 -4
  15. package/dist/forms/_chassis.js +104 -4
  16. package/dist/forms/input-group.d.ts +8 -3
  17. package/dist/forms/input-group.js +8 -3
  18. package/dist/forms/number-field.d.ts +3 -2
  19. package/dist/forms/number-field.js +3 -2
  20. package/dist/index.d.ts +8 -3
  21. package/dist/index.js +5 -1
  22. package/dist/instruments/_data-row.d.ts +68 -0
  23. package/dist/instruments/_data-row.js +139 -0
  24. package/dist/instruments/data-row.d.ts +94 -0
  25. package/dist/instruments/data-row.js +151 -0
  26. package/dist/instruments/data-tree.d.ts +126 -0
  27. package/dist/instruments/data-tree.js +303 -0
  28. package/dist/instruments/index.d.ts +6 -2
  29. package/dist/instruments/index.js +5 -1
  30. package/dist/instruments/ledger.d.ts +105 -0
  31. package/dist/instruments/ledger.js +114 -0
  32. package/dist/instruments/table.d.ts +108 -2
  33. package/dist/instruments/table.js +165 -39
  34. package/dist/theming/_presets.js +3 -3
  35. package/manifest/components/app-shell.json +45 -4
  36. package/manifest/components/autocomplete.json +2 -0
  37. package/manifest/components/color-field.json +2 -0
  38. package/manifest/components/color-picker.json +2 -0
  39. package/manifest/components/combobox.json +2 -0
  40. package/manifest/components/composer.json +2 -0
  41. package/manifest/components/data-row.json +208 -0
  42. package/manifest/components/data-tree.json +151 -0
  43. package/manifest/components/date-field.json +2 -0
  44. package/manifest/components/date-picker.json +2 -0
  45. package/manifest/components/date-range-picker.json +2 -0
  46. package/manifest/components/env-var-input.json +2 -0
  47. package/manifest/components/input-group.json +4 -2
  48. package/manifest/components/input.json +3 -1
  49. package/manifest/components/ledger.json +187 -0
  50. package/manifest/components/multi-select.json +2 -0
  51. package/manifest/components/musical-time-input.json +2 -0
  52. package/manifest/components/number-field.json +3 -1
  53. package/manifest/components/otp-field.json +2 -0
  54. package/manifest/components/password-input.json +2 -0
  55. package/manifest/components/scrub-input.json +2 -0
  56. package/manifest/components/search-input.json +2 -0
  57. package/manifest/components/select.json +1 -0
  58. package/manifest/components/status-bar.json +146 -12
  59. package/manifest/components/table-scroll-region.json +6 -0
  60. package/manifest/components/table.json +113 -5
  61. package/manifest/components/tags-input.json +2 -0
  62. package/manifest/components/textarea.json +3 -1
  63. package/manifest/components/time-field.json +2 -0
  64. package/manifest/components/title-bar.json +1 -1
  65. package/manifest/components/toggle-group.json +2 -0
  66. package/manifest/components/toggle.json +2 -0
  67. package/manifest/manifest.json +72 -33
  68. package/manifest/tokens.json +1 -1
  69. package/package.json +2 -2
@@ -5,7 +5,7 @@
5
5
  "importPath": "@cueplusplus/ui",
6
6
  "peerDependencies": [],
7
7
  "clientOnly": false,
8
- "description": "The canonical console table: hairlines, mono figures, no zebra striping.\n\nSemantic `<table>` markup throughout — a grid of divs loses row/column\nannouncement, and a console table is exactly the place a screen reader user\nneeds it. Zebra rows are deliberately absent: at console density the stripes\nare thicker than the data.\n\nStatic markup — no `\"use client\"`. Compose it with `Panel` for the rim.\nUse {@link TableScrollRegion} only when the table can exceed its container.",
8
+ "description": "The canonical console table: hairlines, mono figures, no zebra striping.\n\nSemantic `<table>` markup throughout — a grid of divs loses row/column\nannouncement, and a console table is exactly the place a screen reader user\nneeds it. Zebra rows are deliberately absent: at console density the stripes\nare thicker than the data.\n\nStatic markup — no `\"use client\"`. Compose it with `Panel` for the rim.\nUse {@link TableScrollRegion} only when the table can exceed its container.\n\nFor a grouped list, the table stays *one* table: `Table.Head sticky` docks the\ncolumn names, and one `Table.Body` per group opens with a `Table.GroupRow`\ndivider — so the columns are named once and scan straight through every group\nboundary. Rows may hold `DataRow` slots, and `DataRow.Actions` reveals inside\na cell on hover and on selection exactly as it does in a `Ledger` row — on\nfocus too, once the row holds something focusable outside the track, which a\n`<tr>` never is by itself. See {@link TableRowProps.interactive}.",
9
9
  "props": [],
10
10
  "typeReferences": [],
11
11
  "subcomponents": [
@@ -13,6 +13,7 @@
13
13
  "Header",
14
14
  "Body",
15
15
  "Row",
16
+ "GroupRow",
16
17
  "Head",
17
18
  "Cell",
18
19
  "Caption"
@@ -48,16 +49,83 @@
48
49
  {
49
50
  "name": "Row",
50
51
  "usage": "Table.Row",
51
- "description": "One row, separated by a hairline underneath — dropped on the last row so the\ntable never draws a rule against the panel rim it sits in. In a `<thead>` the\n\"last row\" is the header row itself, so the header's own bottom border (on\nthe cells) is the only rule there and the two can never stack into 2px.",
52
- "props": [],
52
+ "description": "One row, separated by a hairline underneath — dropped on the last row so the\ntable never draws a rule against the panel rim it sits in. In a `<thead>` the\n\"last row\" is the header row itself, so the header's own bottom border (on\nthe cells) is the only rule there and the two can never stack into 2px.\n\nEvery row carries the `group/data-row` name unconditionally. It paints\nnothing by itself, and it is what lets a `DataRow.Actions` cluster inside a\n`Table.Cell` reveal on hover, on focus and on selection with no second\nimplementation of that idiom for the table — the whole point of the three\nidioms sharing one row anatomy.\n\n**The focus half of that reveal is the caller's to supply here.** A `<tr>` is\nnot focusable and this component does not make it one — a tab stop on every\nrow of a long table is a tab stop a keyboard user has to walk past hundreds\nof times, which is the reason `Ledger` rows opt in individually. So the\nreveal-on-focus only happens if the row *contains* something focusable\noutside the hidden track: a link on the row's name, a checkbox in the leading\ncell, any real control. Without one, `:focus-within` can never fire — content\ninside a `visibility: hidden` subtree cannot be focused, so the track cannot\nbootstrap its own reveal — and a hidden action cluster is then reachable by\npointer only, which is a WCAG 2.1.1 failure the screen gives no sign of. A\ntable whose only per-row controls live in a hidden track wants either a\nfocusable cell beside it or an always-visible cluster.\n\nA caller who instead makes the *row* focusable — a `tabIndex` plus\n{@link activateRowFromClick } and {@link activateRowFromKeyDown }, which is the\nshape a row that opens a drawer takes — gets the focus ring from\n{@link TableRowProps.interactive} and needs to draw nothing of its own.\n\nThe selected tint is the row's, not the cell's: a `background` on the `<tr>`\nshows through every cell in it, so the fill cannot end up ragged where one\ncell sets a ground of its own.",
53
+ "props": [
54
+ {
55
+ "name": "interactive",
56
+ "type": "boolean",
57
+ "required": false,
58
+ "defaultValue": "false",
59
+ "description": "The row responds to a pointer and to focus: the row-hover wash, a pointer\ncursor across the whole row, and an inset focus ring. Defaults to `false`.\n\nOpt-in rather than automatic, because a table of figures nobody can click\nthat lit up under the pointer would be promising an interaction it does not\nhave. Wiring the row up to actually do something — a click handler, a\nkeyboard path to the same thing — stays the caller's job; this is the paint.\n\n**The focus ring ships with it, because the caller's half is what makes the\nrow focusable.** A `<tr>` cannot take focus on its own, so the moment a\ncaller gives one a `tabIndex` to run\n{@link activateRowFromKeyDown } against, a keyboard user can reach and\nactivate a row that shows nothing — a WCAG 2.4.7 failure the pointer user\nnever sees. The ring is *inset* (`-outline-offset-2`), the same ruling as\n`Row` and `DataRow.Root`: these tables live in clipped panes and scroll\nregions, where an outset ring on the first or last row is cut off by the\npane's own rim. `outline-solid` rides along with every `outline-<n>` here\nbecause Tailwind v4 leaves `--tw-outline-style` unset otherwise and the\nring never paints — `test/focus-ring.test.ts` is what keeps the pair\ntogether."
60
+ },
61
+ {
62
+ "name": "selected",
63
+ "type": "boolean",
64
+ "required": false,
65
+ "defaultValue": "false",
66
+ "description": "Draw the row as picked out of the table. Defaults to `false`.\n\nSets `data-selected`, which is what the tint and the hover-revealed\n`DataRow.Actions` inside the row both key off — so a hand-written\n`<tr data-selected>` in a data-driven body gets exactly the same treatment."
67
+ }
68
+ ],
53
69
  "typeReferences": [
54
70
  "React.ComponentPropsWithoutRef<\"tr\">"
55
71
  ]
56
72
  },
73
+ {
74
+ "name": "GroupRow",
75
+ "usage": "Table.GroupRow",
76
+ "description": "A group divider inside one continuous table.\n\nThe whole point is that it is *inside*: a grouped list drawn as one table per\ngroup names its columns once per group, so a reader scanning a column\ntop-to-bottom crosses a fresh header band at every boundary and a screen\nreader announces four tables where there is one dataset. So the table stays\none `<table>` with one `<thead>`, and each group is its own `<tbody>` — which\nis valid HTML, keeps the group's rows together, and gives the divider a row\ngroup to be the header of.\n\nThat last part is why the cell is a `<th scope=\"rowgroup\">` rather than a\nstyled `<td>`: `rowgroup` scope is exactly the statement \"this heading names\nthe rows of this `<tbody>`\", and it leaves the column headers' associations\nuntouched. A `<td colSpan>` divider is invisible to assistive technology as a\nheading, and a `<th scope=\"col\">` one would quietly re-scope the columns.\n\nNo `aria-expanded` here, and no toggle: groups in a table divide, they do not\nfold. A hierarchy that folds is `DataTree`, whose treeitem rows own their own\nexpansion — and if a table genuinely needs to fold rows, the pattern is a real\n`<button aria-expanded aria-controls>` inside this cell, never the row itself.\n\nThe divider can also be a real heading — see {@link * TableGroupRowProps.headingLevel}, which is how a page whose heading outline\nhas to survive a switch between the ledger, table and tree idioms keeps the\nsame `h2`/`h3` structure in all three.",
77
+ "props": [
78
+ {
79
+ "name": "span",
80
+ "type": "number",
81
+ "required": true,
82
+ "defaultValue": null,
83
+ "description": "How many columns the divider spans. Required: it must equal the table's\ncolumn count, or the group's cell stops covering the row and the columns\nbelow it shift by one."
84
+ },
85
+ {
86
+ "name": "label",
87
+ "type": "ReactNode",
88
+ "required": true,
89
+ "defaultValue": null,
90
+ "description": "What the group is called."
91
+ },
92
+ {
93
+ "name": "headingLevel",
94
+ "type": "4 | 2 | 3 | 5 | 6",
95
+ "required": false,
96
+ "defaultValue": null,
97
+ "description": "Make the label slot a real heading element. Defaults to `undefined` — no\nheading, and the label stays the `<span>` it has always been.\n\n**Set this rather than passing a heading as `label`.** The label slot wraps\nwhatever it is given, so an `<h2>` handed in as `label` lands *inside* a\n`<span>` — which renders, and exposes the heading, and does not validate: a\n`<span>` is phrasing content and may not contain a heading. With this prop\nthe wrapper *is* the heading (`<h2 data-slot=\"table-group-label\">`), so\nthere is nothing to nest.\n\nA heading inside a `<th>` is valid — `<th>` takes flow content — and it is\nuseful: a screen-reader user navigates a long grouped table by heading, and\nwithout one the group names are reachable only by walking the rows. The\n`scope=\"rowgroup\"` association is untouched either way; this adds the\ndivider to the document outline, it does not change what the cell heads.\n\nLevels run `2`–`6` because the outline has to describe the real nesting of\nthe page the table sits in, not the table's own idea of itself — the same\nruling as {@link LedgerTierProps.headingLevel }. There is no `1`: a group\ndivider is never the title of the document."
98
+ },
99
+ {
100
+ "name": "count",
101
+ "type": "number",
102
+ "required": false,
103
+ "defaultValue": null,
104
+ "description": "How many rows the group holds, printed beside its name."
105
+ },
106
+ {
107
+ "name": "sticky",
108
+ "type": "boolean",
109
+ "required": false,
110
+ "defaultValue": "false",
111
+ "description": "Dock the divider under the header band while the group's rows scroll past.\nDefaults to `false`.\n\nThe offset is the custom property `--cue-table-group-top` (default `0`):\nhow far down the divider docks is the rendered height of the sticky header\nabove it, which depends on the density and type the caller configured. Set\nit on the table — `className=\"[--cue-table-group-top:2rem]\"` — rather than\nmeasuring at runtime."
112
+ },
113
+ {
114
+ "name": "className",
115
+ "type": "string",
116
+ "required": false,
117
+ "defaultValue": null,
118
+ "description": "Classes for the divider's *cell*, not its row.\n\nThe `<tr>` paints nothing — the ground, the type and the sticky offset all\nlive on the `<th>` that spans it, and a background on the row would sit\nbehind the cell's own. Every other prop, and the ref, go to the row."
119
+ }
120
+ ],
121
+ "typeReferences": [
122
+ "Omit<React.ComponentPropsWithoutRef<\"tr\">, \"children\">"
123
+ ]
124
+ },
57
125
  {
58
126
  "name": "Head",
59
127
  "usage": "Table.Head",
60
- "description": "A column heading: the same mono uppercase label as `SectionHeader` and\n`Eyebrow`, on the raised surface so the band reads as chrome rather than as\nthe first row of data.",
128
+ "description": "A column heading: the same mono uppercase label as `SectionHeader` and\n`Eyebrow`, on the raised surface so the band reads as chrome rather than as\nthe first row of data.\n\n**Sticky swaps the bottom border for an inset shadow.** `Table.Root` collapses\nits borders, and a collapsed border belongs to the table's shared grid rather\nthan to the cell — so when a cell detaches to stay at the top of the scroll\ncontainer, its rule stays behind with the rows and the stuck band appears to\nlose its edge. An inset `box-shadow` is a paint effect on the cell itself, so\nit travels with it. The alternative — putting the whole table on\n`border-separate` — would change the geometry of every table in the library\nto fix one that scrolls.\n\nThe opaque `bg-surface-1` is not decoration either: a transparent sticky cell\nis a sticky cell you read the rows through. A caller who wants the header on\nthe page's own ground can pass `className=\"bg-bg\"` — what it must not pass is\nnothing.",
61
129
  "props": [
62
130
  {
63
131
  "name": "numeric",
@@ -65,6 +133,13 @@
65
133
  "required": false,
66
134
  "defaultValue": "false",
67
135
  "description": "Right-align this column and set it in tabular figures."
136
+ },
137
+ {
138
+ "name": "sticky",
139
+ "type": "boolean",
140
+ "required": false,
141
+ "defaultValue": "false",
142
+ "description": "Dock the header band to the top of the scroll container while the rows\nscroll under it. Defaults to `false`.\n\nSet it on the cells, not on the `<tr>`: sticky on a table row is honoured\ninconsistently across engines, and the cell is the reliable baseline\neverywhere."
68
143
  }
69
144
  ],
70
145
  "typeReferences": [
@@ -102,19 +177,30 @@
102
177
  "defaultVariants": {},
103
178
  "tokensUsed": [
104
179
  "--cue-accent",
180
+ "--cue-accent-soft",
181
+ "--cue-bg",
105
182
  "--cue-border",
106
183
  "--cue-fg",
107
184
  "--cue-fg-subtle",
108
185
  "--cue-font-mono",
186
+ "--cue-hair-strong",
109
187
  "--cue-pad-row-x",
110
188
  "--cue-pad-row-y",
189
+ "--cue-row-hover",
190
+ "--cue-space-2",
111
191
  "--cue-space-3",
112
192
  "--cue-surface-1",
193
+ "--cue-table-group-top",
113
194
  "--cue-text-label",
114
195
  "--cue-text-ui"
115
196
  ],
116
197
  "summary": "The semantic table: mono uppercase headers, hairline rows, tabular numerals.",
117
198
  "examples": [
199
+ {
200
+ "title": "A grouped table whose groups are h3s",
201
+ "code": "{groups.map((group) => (\n <Table.Body key={group.id}>\n <Table.GroupRow span={2} headingLevel={3} label={group.label} count={group.rows.length} />\n {group.rows.map((device) => (\n <Table.Row key={device.id}>\n <Table.Cell>{device.name}</Table.Cell>\n <Table.Cell numeric>{device.latency}</Table.Cell>\n </Table.Row>\n ))}\n </Table.Body>\n))}",
202
+ "language": "tsx"
203
+ },
118
204
  {
119
205
  "title": "Usage",
120
206
  "code": "<Table.Root>\n <Table.Header>\n <Table.Row>\n <Table.Head>Fixture</Table.Head>\n <Table.Head numeric>Address</Table.Head>\n </Table.Row>\n </Table.Header>\n <Table.Body>\n <Table.Row>\n <Table.Cell>Par 64</Table.Cell>\n <Table.Cell numeric>001</Table.Cell>\n </Table.Row>\n </Table.Body>\n</Table.Root>",
@@ -137,7 +223,9 @@
137
223
  ],
138
224
  "commonMistakes": [
139
225
  "Leaving out `Table.Caption`, which is what names the table for a screen reader.",
140
- "Wrapping cells in a `Row`. The table has its own row part."
226
+ "Wrapping cells in a `Row`. The table has its own row part.",
227
+ "Giving a row a `tabIndex` to make it activatable and then drawing no focus indicator. `Table.Row interactive` ships the inset focus ring along with the hover wash, so mark the row `interactive` rather than hand-rolling `focus-visible` classes on it.",
228
+ "Passing an `<h2>` as `Table.GroupRow`'s `label` to get a heading. The label slot wraps what it is given, so the heading lands inside a `<span>` — which renders, and does not validate. Set `headingLevel` and the wrapper becomes the heading."
141
229
  ],
142
230
  "specimens": [
143
231
  {
@@ -150,6 +238,26 @@
150
238
  "code": "<Panel className=\"w-full\">\n <TableScrollRegion aria-label=\"Cue list table\">\n <Table.Root>\n <Table.Caption>Cue list</Table.Caption>\n <Table.Header>\n <Table.Row>\n <Table.Head numeric>#</Table.Head>\n <Table.Head>Label</Table.Head>\n <Table.Head numeric>Fade</Table.Head>\n <Table.Head>Follow</Table.Head>\n <Table.Head numeric>Level</Table.Head>\n </Table.Row>\n </Table.Header>\n <Table.Body>\n {CUES.map((cue) => (\n <Table.Row key={cue.id}>\n <Table.Cell numeric>{cue.id}</Table.Cell>\n <Table.Cell>{cue.label}</Table.Cell>\n <Table.Cell numeric>{cue.time}</Table.Cell>\n <Table.Cell>{cue.follow}</Table.Cell>\n <Table.Cell numeric>{cue.level}%</Table.Cell>\n </Table.Row>\n ))}\n </Table.Body>\n </Table.Root>\n </TableScrollRegion>\n</Panel>",
151
239
  "note": "The canonical console table inside its named horizontal scroll region: hairline rows, mono headers, and `numeric` cells that are right-aligned and tabular.",
152
240
  "interaction": "the scroll region is keyboard-focusable. Sorting, filtering and paging come from the DataTable recipe below."
241
+ },
242
+ {
243
+ "title": "Table — grouped",
244
+ "group": "instruments",
245
+ "components": [
246
+ "Table"
247
+ ],
248
+ "code": "<Panel className=\"w-full\">\n <div className=\"max-h-[18rem] overflow-y-auto [--cue-table-group-top:1.75rem]\">\n <Table.Root>\n <Table.Caption>Patch, one table, two row groups.</Table.Caption>\n <Table.Header>\n <Table.Row>\n <Table.Head sticky>Device</Table.Head>\n <Table.Head sticky>Detail</Table.Head>\n <Table.Head sticky numeric>\n Latency\n </Table.Head>\n <Table.Head sticky className=\"sr-only\">\n Actions\n </Table.Head>\n </Table.Row>\n </Table.Header>\n {PATCH_GROUPS.map((group) => (\n <Table.Body key={group.id}>\n <Table.GroupRow\n span={4}\n label={group.label}\n count={group.rows.length}\n sticky\n />\n {group.rows.map((device) => (\n <Table.Row key={device.id} interactive>\n {/* The name is a link, and that is load-bearing rather\n than decorative. A `<tr>` is not focusable, so\n without a real control somewhere outside the hidden\n action track nothing in the row can take focus,\n `:focus-within` never fires, and the Copy and\n Actions buttons are reachable by pointer only —\n visible to a mouse user, invisible to Tab. The\n ledger and the tree get this for free because their\n rows are focusable themselves; the table has to be\n given it. */}\n <Table.Cell>\n <Link href={`#patch-${device.id}`}>{device.name}</Link>\n </Table.Cell>\n <Table.Cell className=\"text-fg-muted\">{device.detail}</Table.Cell>\n <Table.Cell numeric>{device.latency}</Table.Cell>\n {/* The action column's width is a sum of the tokens it\n holds — two small controls, the gap between them and\n the cell's own padding on each side — so it stays\n right whatever the density does to any of them. */}\n <Table.Cell className=\"w-[calc(2_*_var(--cue-control-sm)_+_var(--cue-space-1)_+_2_*_var(--cue-pad-row-x))]\">\n <DataRow.Actions>\n <CopyButton\n value={device.id}\n size=\"sm\"\n className=\"w-control-sm px-0\"\n />\n <IconButton\n icon={MoreVertical}\n size=\"sm\"\n aria-label={`Actions for ${device.name}`}\n />\n </DataRow.Actions>\n </Table.Cell>\n </Table.Row>\n ))}\n </Table.Body>\n ))}\n </Table.Root>\n </div>\n</Panel>",
249
+ "note": "The same rows as one continuous table: `Table.Head sticky` docks the column names, and one `Table.Body` per group opens with a `Table.GroupRow` divider — a `th` with `scope='rowgroup'`, so the columns are named once and scan straight through every boundary.",
250
+ "interaction": "rows marked `interactive` take the row-hover wash across the whole row; `selected` tints it and reveals the action track. Tab reaches each row through its name link, which is what lets `:focus-within` reveal the track at all — a `tr` cannot take focus, so a table row whose only controls are in the hidden cluster would be pointer-only."
251
+ },
252
+ {
253
+ "title": "Table — group dividers as headings",
254
+ "group": "instruments",
255
+ "components": [
256
+ "Table"
257
+ ],
258
+ "code": "<Panel className=\"w-full\">\n <Table.Root>\n <Table.Caption>Patch, grouped into the page's outline.</Table.Caption>\n <Table.Header>\n <Table.Row>\n <Table.Head>Device</Table.Head>\n <Table.Head numeric>Latency</Table.Head>\n </Table.Row>\n </Table.Header>\n {PATCH_GROUPS.map((group) => (\n <Table.Body key={group.id}>\n <Table.GroupRow\n span={2}\n headingLevel={3}\n label={group.label}\n count={group.rows.length}\n />\n {group.rows.map((device) => (\n <Table.Row key={device.id}>\n <Table.Cell>{device.name}</Table.Cell>\n <Table.Cell numeric>{device.latency}</Table.Cell>\n </Table.Row>\n ))}\n </Table.Body>\n ))}\n </Table.Root>\n</Panel>",
259
+ "note": "`headingLevel` makes the divider's label slot a real `h3` instead of a `span`, so a grouped table joins the page's heading outline and a screen-reader user can jump between groups by heading. It is the prop to reach for rather than passing an `<h3>` as `label`: the label slot wraps what it is given, so a heading handed in that way lands inside a `<span>`, which may not contain one. The heading sits in the same `<th scope='rowgroup'>` as before — valid, because a `<th>` takes flow content — and wears the same type as the span form, so the level is in the outline and never in the design.",
260
+ "interaction": "none. Navigate by heading in a screen reader to hear the group names as an outline."
153
261
  }
154
262
  ]
155
263
  }
@@ -137,6 +137,7 @@
137
137
  "--cue-accent-soft",
138
138
  "--cue-border",
139
139
  "--cue-border-overlay",
140
+ "--cue-border-strong",
140
141
  "--cue-chip-h",
141
142
  "--cue-control-lg",
142
143
  "--cue-control-md",
@@ -145,6 +146,7 @@
145
146
  "--cue-fg",
146
147
  "--cue-fg-muted",
147
148
  "--cue-fg-subtle",
149
+ "--cue-focus",
148
150
  "--cue-font-mono",
149
151
  "--cue-icon-sm",
150
152
  "--cue-radius-control",
@@ -32,12 +32,14 @@
32
32
  "tokensUsed": [
33
33
  "--cue-accent",
34
34
  "--cue-border",
35
+ "--cue-border-strong",
35
36
  "--cue-control-lg",
36
37
  "--cue-control-md",
37
38
  "--cue-control-sm",
38
39
  "--cue-danger",
39
40
  "--cue-fg",
40
41
  "--cue-fg-subtle",
42
+ "--cue-focus",
41
43
  "--cue-font-mono",
42
44
  "--cue-radius-control",
43
45
  "--cue-space-3",
@@ -69,7 +71,7 @@
69
71
  ],
70
72
  "code": "<div className=\"grid w-full gap-(--cue-space-5) lg:grid-cols-3\">\n <Textarea aria-label=\"Cue notes\" rows={3} defaultValue={\"House to half.\\nHold for VO.\"} />\n <Textarea aria-label=\"Empty notes\" rows={3} placeholder=\"Notes for the operator\" />\n <Textarea aria-label=\"Disabled notes\" rows={3} defaultValue=\"Read-only\" disabled />\n</div>",
71
73
  "note": "The same chassis, grown to a block.",
72
- "interaction": "same rim and ring as Input."
74
+ "interaction": "same rim and ring as Input: one flush focus-colour ring, no outer halo."
73
75
  }
74
76
  ],
75
77
  "todo": true
@@ -35,12 +35,14 @@
35
35
  "--cue-accent",
36
36
  "--cue-accent-fg",
37
37
  "--cue-border",
38
+ "--cue-border-strong",
38
39
  "--cue-control-lg",
39
40
  "--cue-control-md",
40
41
  "--cue-control-sm",
41
42
  "--cue-danger",
42
43
  "--cue-fg",
43
44
  "--cue-fg-subtle",
45
+ "--cue-focus",
44
46
  "--cue-font-mono",
45
47
  "--cue-radius-control",
46
48
  "--cue-space-1",
@@ -12,7 +12,7 @@
12
12
  "type": "boolean",
13
13
  "required": false,
14
14
  "defaultValue": "false",
15
- "description": "Make the bar a window drag handle.\n\nEmits `data-tauri-drag-region` (Tauri reads the attribute) *and* the\n`app-region: drag` CSS property (Electron and Chromium read that), because\nthe same component ships into both shells and neither one recognises the\nother's contract. The interactive clusters are carved back out with\n`app-region: no-drag`, or the buttons in the bar would only ever move the\nwindow instead of firing."
15
+ "description": "Make the bar a window drag handle.\n\nEmits `data-tauri-drag-region` (Tauri reads the attribute) *and* the\n`app-region: drag` CSS property (Electron and Chromium read that), because\nthe same component ships into both shells and neither one recognises the\nother's contract. The interactive clusters are carved back out with\n`app-region: no-drag`, or the buttons in the bar would only ever move the\nwindow instead of firing. Both halves of that contract live in\n`./_drag.ts`, which `AppShell.Bar` emits from as well — the two bars are\ndraggable the same way or they are not draggable the same way.\n\nDouble-click-to-maximise is not wired here. Tauri's own injected script\nalready provides it on any drag region, cancel-by-dragging-away on macOS\nincluded; Electron provides nothing, and an Electron app has to listen for\n`dblclick` and toggle the window itself. Neither is a decision a component\nin a design system can make on the window's behalf.\n\nDefaults to `false`."
16
16
  },
17
17
  {
18
18
  "name": "center",
@@ -60,12 +60,14 @@
60
60
  "tokensUsed": [
61
61
  "--cue-accent",
62
62
  "--cue-border",
63
+ "--cue-border-strong",
63
64
  "--cue-control-lg",
64
65
  "--cue-control-md",
65
66
  "--cue-control-sm",
66
67
  "--cue-danger",
67
68
  "--cue-fg",
68
69
  "--cue-fg-subtle",
70
+ "--cue-focus",
69
71
  "--cue-font-mono",
70
72
  "--cue-radius-control",
71
73
  "--cue-space-1",
@@ -60,6 +60,7 @@
60
60
  "--cue-accent",
61
61
  "--cue-accent-soft",
62
62
  "--cue-border",
63
+ "--cue-border-strong",
63
64
  "--cue-control-lg",
64
65
  "--cue-control-md",
65
66
  "--cue-control-sm",
@@ -67,6 +68,7 @@
67
68
  "--cue-fg",
68
69
  "--cue-fg-muted",
69
70
  "--cue-fg-subtle",
71
+ "--cue-focus",
70
72
  "--cue-font-mono",
71
73
  "--cue-icon-md",
72
74
  "--cue-icon-sm",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
3
  "library": "@cueplusplus/ui",
4
- "version": "0.5.0",
4
+ "version": "0.7.0",
5
5
  "generatedAt": "1970-01-01T00:00:00.000Z",
6
6
  "themes": [
7
7
  "cue",
@@ -29,7 +29,7 @@
29
29
  ],
30
30
  "tokens": {
31
31
  "path": "./tokens.json",
32
- "sha256": "6836c983064e9e35eb26caff3366f2b19e19233646c3ffe47bca084b121b3e9b"
32
+ "sha256": "6672f3007cb48503b465985501b881b7d5144816bc716d4350e7d9bd7b7c566e"
33
33
  },
34
34
  "systemApis": [
35
35
  {
@@ -303,7 +303,7 @@
303
303
  "mdUrl": "/docs/components/composer.md",
304
304
  "jsonUrl": "/r/components/composer.json",
305
305
  "path": "./components/composer.json",
306
- "sha256": "cd6b79f2a23c7ec973d5e22a3ab01ea82d813495ac26e52354a2c3aa3435a78e"
306
+ "sha256": "623c6c99e1a4890d582e5bb2f3c1fbf6ec42fcb8383e51cad360ac935d875a88"
307
307
  },
308
308
  {
309
309
  "name": "DelegationCard",
@@ -368,7 +368,7 @@
368
368
  "mdUrl": "/docs/components/app-shell.md",
369
369
  "jsonUrl": "/r/components/app-shell.json",
370
370
  "path": "./components/app-shell.json",
371
- "sha256": "bbf75533291274d02f1815b2e7b8b325febc009557c524376b71ccf67f282eba"
371
+ "sha256": "5ac38bfecf8b97b77fa5692d84e2dd4eab3a46a1e3e42578ea17fbc7c3fa7ccc"
372
372
  },
373
373
  {
374
374
  "name": "EmptyState",
@@ -544,13 +544,13 @@
544
544
  "slug": "status-bar",
545
545
  "group": "chrome",
546
546
  "importPath": "@cueplusplus/ui",
547
- "summary": "The quiet strip along the bottom of a window.",
548
- "status": "todo-docs",
547
+ "summary": "The quiet strip along the bottom of a window: readings by default, controls where the reading is worth clicking.",
548
+ "status": "stable",
549
549
  "url": "/docs/components/status-bar",
550
550
  "mdUrl": "/docs/components/status-bar.md",
551
551
  "jsonUrl": "/r/components/status-bar.json",
552
552
  "path": "./components/status-bar.json",
553
- "sha256": "d729d1e5de4a80e5e2075453bc540b3857b3f02b1d564442d58f2e6fcbefebc0"
553
+ "sha256": "c38c69a055f044328a1d40e0f9cf6f0cc6635a648a2cf0f7f9ed719423e60653"
554
554
  },
555
555
  {
556
556
  "name": "Tabs",
@@ -576,7 +576,7 @@
576
576
  "mdUrl": "/docs/components/title-bar.md",
577
577
  "jsonUrl": "/r/components/title-bar.json",
578
578
  "path": "./components/title-bar.json",
579
- "sha256": "f664e5beaff9318cbe78f6a09a9e897f1329a1d17c1efae141640b9222d6c615"
579
+ "sha256": "f32f134785d92bc35a6184f30495329b315f9329fe3c9331fbce0fc3415b1a61"
580
580
  },
581
581
  {
582
582
  "name": "Toolbar",
@@ -641,7 +641,7 @@
641
641
  "mdUrl": "/docs/components/color-field.md",
642
642
  "jsonUrl": "/r/components/color-field.json",
643
643
  "path": "./components/color-field.json",
644
- "sha256": "86ed08ae41e70abf87e1d679d850f6b4596450b7b495911d5fcb2a25967b9644"
644
+ "sha256": "1bc8a5cd4904e5a6ae383e9252ecfee51cb0e895db185af05f66b56660045749"
645
645
  },
646
646
  {
647
647
  "name": "ColorPicker",
@@ -654,7 +654,7 @@
654
654
  "mdUrl": "/docs/components/color-picker.md",
655
655
  "jsonUrl": "/r/components/color-picker.json",
656
656
  "path": "./components/color-picker.json",
657
- "sha256": "4e70121389acccc23a68df2e14892f3c22bb7dff0df845740fcdbe180f2ac771"
657
+ "sha256": "948344684ed4f1c869d67347e77dd6353373db63f250b1fe9b8c1a9f2300f53b"
658
658
  },
659
659
  {
660
660
  "name": "ColorSlider",
@@ -784,7 +784,7 @@
784
784
  "mdUrl": "/docs/components/date-field.md",
785
785
  "jsonUrl": "/r/components/date-field.json",
786
786
  "path": "./components/date-field.json",
787
- "sha256": "250d6c1815cae1660bf10bc8c76c9157854abff5ecc7dc3f82413ac48c68a950"
787
+ "sha256": "8b27007d07f8d8b9383a1454032d80ca9b5b066fca55f2fbfeed559c7270b1d4"
788
788
  },
789
789
  {
790
790
  "name": "DatePicker",
@@ -797,7 +797,7 @@
797
797
  "mdUrl": "/docs/components/date-picker.md",
798
798
  "jsonUrl": "/r/components/date-picker.json",
799
799
  "path": "./components/date-picker.json",
800
- "sha256": "afce0ceaa0e3df02731c2ecd2db2a92a2785bbff1d790e8700ba3192ef145db4"
800
+ "sha256": "0956a1fbb0c6704b81d03617ecce78b61338c3683e7ebe1f2cc08cc9b45f77dc"
801
801
  },
802
802
  {
803
803
  "name": "DateRangePicker",
@@ -810,7 +810,7 @@
810
810
  "mdUrl": "/docs/components/date-range-picker.md",
811
811
  "jsonUrl": "/r/components/date-range-picker.json",
812
812
  "path": "./components/date-range-picker.json",
813
- "sha256": "18322058c069f18a98d289be0492700a46b391818543a31af9a60bbcd20e58a8"
813
+ "sha256": "f4462db91f5beb8240d76e20c87989e1109f950ad00369a12a0470871890ff1f"
814
814
  },
815
815
  {
816
816
  "name": "TimeField",
@@ -823,7 +823,7 @@
823
823
  "mdUrl": "/docs/components/time-field.md",
824
824
  "jsonUrl": "/r/components/time-field.json",
825
825
  "path": "./components/time-field.json",
826
- "sha256": "804e1c46696baed0689e0aabdbedbaf2d8e0958d78c4d39e8e254ba709993b6a"
826
+ "sha256": "f47da2f4616ca30765cde2779a3ebb3cdb5271d65b7d27c0c6f951902ec9b4c6"
827
827
  },
828
828
  {
829
829
  "name": "ChannelMatrix",
@@ -2929,7 +2929,7 @@
2929
2929
  "mdUrl": "/docs/components/autocomplete.md",
2930
2930
  "jsonUrl": "/r/components/autocomplete.json",
2931
2931
  "path": "./components/autocomplete.json",
2932
- "sha256": "f92500062e1d5f35b88e0a8d743f56f7624cb3ddb9917e058565ef076482c573"
2932
+ "sha256": "ea4bae3ea2882d400feb446c1b3b5da9ef65746fdcf746e0c7151ab660587e2a"
2933
2933
  },
2934
2934
  {
2935
2935
  "name": "ButtonGroup",
@@ -2981,7 +2981,7 @@
2981
2981
  "mdUrl": "/docs/components/combobox.md",
2982
2982
  "jsonUrl": "/r/components/combobox.json",
2983
2983
  "path": "./components/combobox.json",
2984
- "sha256": "2473819b0a3e68845cea78345fb20668d98593d067d87327f10828b17803d986"
2984
+ "sha256": "f2a675181d222c35fbab5584629f1635863ec27ccd90930b23288250c03d6021"
2985
2985
  },
2986
2986
  {
2987
2987
  "name": "EnvVarInput",
@@ -2994,7 +2994,7 @@
2994
2994
  "mdUrl": "/docs/components/env-var-input.md",
2995
2995
  "jsonUrl": "/r/components/env-var-input.json",
2996
2996
  "path": "./components/env-var-input.json",
2997
- "sha256": "75d21eb0ddd90a77a92b2d88ad447a01b2455aabd367044bc9965cec5a96ab2d"
2997
+ "sha256": "92d5cc93d0ec6d36b485e3d4c118f0c805f620accb17f506d34c1a451e59bdd7"
2998
2998
  },
2999
2999
  {
3000
3000
  "name": "Field",
@@ -3072,7 +3072,7 @@
3072
3072
  "mdUrl": "/docs/components/input.md",
3073
3073
  "jsonUrl": "/r/components/input.json",
3074
3074
  "path": "./components/input.json",
3075
- "sha256": "70cf627df733c15f0729431e1809d81cd81aec14e013bc6bed852d06f7e6c777"
3075
+ "sha256": "7731053809b13c537a42bde4cbb356ed7cd839a1630262e8bfecf4be38b90d21"
3076
3076
  },
3077
3077
  {
3078
3078
  "name": "InputGroup",
@@ -3085,7 +3085,7 @@
3085
3085
  "mdUrl": "/docs/components/input-group.md",
3086
3086
  "jsonUrl": "/r/components/input-group.json",
3087
3087
  "path": "./components/input-group.json",
3088
- "sha256": "63244ca5ef6493f5a854ca210327681355b37ab143b3f154ed22e3bb38472853"
3088
+ "sha256": "e349576731ad72f2a60892eb37df2bc451e63be404e08656c4a61cd61ace3e8d"
3089
3089
  },
3090
3090
  {
3091
3091
  "name": "MultiSelect",
@@ -3098,7 +3098,7 @@
3098
3098
  "mdUrl": "/docs/components/multi-select.md",
3099
3099
  "jsonUrl": "/r/components/multi-select.json",
3100
3100
  "path": "./components/multi-select.json",
3101
- "sha256": "de04f17b173eb2ab4413b23a705c3fa36e3af06145a5302ec830b56e74e8fb93"
3101
+ "sha256": "272814fcd0984c97896635b34c47151a9bf189345de0c3b116768a025fb636b5"
3102
3102
  },
3103
3103
  {
3104
3104
  "name": "NumberField",
@@ -3111,7 +3111,7 @@
3111
3111
  "mdUrl": "/docs/components/number-field.md",
3112
3112
  "jsonUrl": "/r/components/number-field.json",
3113
3113
  "path": "./components/number-field.json",
3114
- "sha256": "fae91aab74e82bba4728c56d2824810ae2269d095da1d14c9a07123c3e75af12"
3114
+ "sha256": "a475135cc03488bbe5b70188b0b992596b2eff69720245d9e8d679fd571c0196"
3115
3115
  },
3116
3116
  {
3117
3117
  "name": "OTPField",
@@ -3124,7 +3124,7 @@
3124
3124
  "mdUrl": "/docs/components/otp-field.md",
3125
3125
  "jsonUrl": "/r/components/otp-field.json",
3126
3126
  "path": "./components/otp-field.json",
3127
- "sha256": "66df23bc408cbf14e32c9a8b86cbd51bbf4af4dcf1580d32f9586fb53b26c0f5"
3127
+ "sha256": "d8e1868d8ab9082abf894c1dfb1efb2c4c5826011949453ae77c7ca8985fcdd0"
3128
3128
  },
3129
3129
  {
3130
3130
  "name": "PasswordInput",
@@ -3137,7 +3137,7 @@
3137
3137
  "mdUrl": "/docs/components/password-input.md",
3138
3138
  "jsonUrl": "/r/components/password-input.json",
3139
3139
  "path": "./components/password-input.json",
3140
- "sha256": "d5e3b06f972a8861eb97638e3121da9b9c047d1045c9b3295519f07eea176bd1"
3140
+ "sha256": "8d103f07b5b04db5c7b0c3eadedaba6b1fe4fd20ce19404906ed4161ba07ba9b"
3141
3141
  },
3142
3142
  {
3143
3143
  "name": "Radio",
@@ -3189,7 +3189,7 @@
3189
3189
  "mdUrl": "/docs/components/scrub-input.md",
3190
3190
  "jsonUrl": "/r/components/scrub-input.json",
3191
3191
  "path": "./components/scrub-input.json",
3192
- "sha256": "9cad5bb1635640db6d42a2526782aa3c67493789518d36ef674a7f2426b63a3c"
3192
+ "sha256": "9267ef1f1662b1b727f92b14d848b76eea83c5532396fada5636d510f0afc6b7"
3193
3193
  },
3194
3194
  {
3195
3195
  "name": "SearchInput",
@@ -3202,7 +3202,7 @@
3202
3202
  "mdUrl": "/docs/components/search-input.md",
3203
3203
  "jsonUrl": "/r/components/search-input.json",
3204
3204
  "path": "./components/search-input.json",
3205
- "sha256": "845c791e8e421e00c3dc5f649ae24d1cf8363a88153648d44fee724e5a49f99f"
3205
+ "sha256": "f16f2996ee7aab2ea26cc18a51b1a557c691c71200485488b1eb4a0a3f66a9ec"
3206
3206
  },
3207
3207
  {
3208
3208
  "name": "Select",
@@ -3215,7 +3215,7 @@
3215
3215
  "mdUrl": "/docs/components/select.md",
3216
3216
  "jsonUrl": "/r/components/select.json",
3217
3217
  "path": "./components/select.json",
3218
- "sha256": "d7a580b81ac52f5d152eb1bbe436994540f9444fde54ee8fc54fef0d7e660189"
3218
+ "sha256": "0d8c07afb4a31810fc2ed2f71c54410d6ab71be1a6ede22ef89cbc585295280e"
3219
3219
  },
3220
3220
  {
3221
3221
  "name": "Slider",
@@ -3254,7 +3254,7 @@
3254
3254
  "mdUrl": "/docs/components/tags-input.md",
3255
3255
  "jsonUrl": "/r/components/tags-input.json",
3256
3256
  "path": "./components/tags-input.json",
3257
- "sha256": "84dc92b1e08e604e47d53a729c5b0f0da7ee66e84beb00ea568ac65ae739a7a4"
3257
+ "sha256": "20601065198f7d1bca6ccd8c8b3755026d91813a221b80e7890474c4a25ffcf3"
3258
3258
  },
3259
3259
  {
3260
3260
  "name": "Textarea",
@@ -3267,7 +3267,7 @@
3267
3267
  "mdUrl": "/docs/components/textarea.md",
3268
3268
  "jsonUrl": "/r/components/textarea.json",
3269
3269
  "path": "./components/textarea.json",
3270
- "sha256": "f4a1bf66af3ca9861de843efcec07f86d9c646f850a4ef1d6c6b92e974c1c15b"
3270
+ "sha256": "f4257e5c1373fbeee9f6318b8d876c667ddf4091ff8d30c4bcedf68ba1374d54"
3271
3271
  },
3272
3272
  {
3273
3273
  "name": "Toggle",
@@ -3280,7 +3280,7 @@
3280
3280
  "mdUrl": "/docs/components/toggle.md",
3281
3281
  "jsonUrl": "/r/components/toggle.json",
3282
3282
  "path": "./components/toggle.json",
3283
- "sha256": "68325d1f2f139d360008fbcb07b6375fc7999322694d7c37dee3a29cef832c19"
3283
+ "sha256": "96cd056624eda0716275bb1f38d8ae9275b805df44232bd75e59a22b9167b538"
3284
3284
  },
3285
3285
  {
3286
3286
  "name": "ToggleGroup",
@@ -3293,7 +3293,7 @@
3293
3293
  "mdUrl": "/docs/components/toggle-group.md",
3294
3294
  "jsonUrl": "/r/components/toggle-group.json",
3295
3295
  "path": "./components/toggle-group.json",
3296
- "sha256": "a786ebfcb986782d408821e738f607ed38428daeab3695b01ce8b996f53b763e"
3296
+ "sha256": "5d7b3e75bef4c67ced26f9442cd4ded01a1388536779f6de6a694a40324e958d"
3297
3297
  },
3298
3298
  {
3299
3299
  "name": "AudienceIcon",
@@ -3451,6 +3451,19 @@
3451
3451
  "path": "./components/copy-button.json",
3452
3452
  "sha256": "6221a1a4515991c7b83a87e16d26ec0b71698889129d5324b66f2f34c743c79c"
3453
3453
  },
3454
+ {
3455
+ "name": "DataRow",
3456
+ "slug": "data-row",
3457
+ "group": "instruments",
3458
+ "importPath": "@cueplusplus/ui",
3459
+ "summary": "The dense list row: six slots, a hover-revealed action track, and columns the caller declares.",
3460
+ "status": "stable",
3461
+ "url": "/docs/components/data-row",
3462
+ "mdUrl": "/docs/components/data-row.md",
3463
+ "jsonUrl": "/r/components/data-row.json",
3464
+ "path": "./components/data-row.json",
3465
+ "sha256": "2d9d18bea0dfbd9ae65527639e1a2238a5de80aa82fe69ae4f3ff18f1c296c65"
3466
+ },
3454
3467
  {
3455
3468
  "name": "DataTablePagination",
3456
3469
  "slug": "data-table-pagination",
@@ -3477,6 +3490,19 @@
3477
3490
  "path": "./components/data-table-toolbar.json",
3478
3491
  "sha256": "9b463d77c030e3aab10758f97d0aac791f989666eb4f66f12e30effc420a776d"
3479
3492
  },
3493
+ {
3494
+ "name": "DataTree",
3495
+ "slug": "data-tree",
3496
+ "group": "instruments",
3497
+ "importPath": "@cueplusplus/ui",
3498
+ "summary": "A hierarchy of multi-column rows under real `role=\"tree\"` semantics, with CSS depth guides.",
3499
+ "status": "stable",
3500
+ "url": "/docs/components/data-tree",
3501
+ "mdUrl": "/docs/components/data-tree.md",
3502
+ "jsonUrl": "/r/components/data-tree.json",
3503
+ "path": "./components/data-tree.json",
3504
+ "sha256": "33244c5faf277716152a605c28726b0be0fb110f1bafa8b0b84f8a00a9315b55"
3505
+ },
3480
3506
  {
3481
3507
  "name": "GroupBar",
3482
3508
  "slug": "group-bar",
@@ -3490,6 +3516,19 @@
3490
3516
  "path": "./components/group-bar.json",
3491
3517
  "sha256": "2b8155fc7b46836f3f0a25cb8a023da7228c124d5f5b209ae8136fd575aeb3f6"
3492
3518
  },
3519
+ {
3520
+ "name": "Ledger",
3521
+ "slug": "ledger",
3522
+ "group": "instruments",
3523
+ "importPath": "@cueplusplus/ui",
3524
+ "summary": "Grouped dense rows under sticky tier headings and gutter slugs, with no disclosure anywhere.",
3525
+ "status": "stable",
3526
+ "url": "/docs/components/ledger",
3527
+ "mdUrl": "/docs/components/ledger.md",
3528
+ "jsonUrl": "/r/components/ledger.json",
3529
+ "path": "./components/ledger.json",
3530
+ "sha256": "129b47da8898b856d150ae7c6901e1e5340cabacd15457b860aa03e80139c388"
3531
+ },
3493
3532
  {
3494
3533
  "name": "LogViewer",
3495
3534
  "slug": "log-viewer",
@@ -3592,7 +3631,7 @@
3592
3631
  "mdUrl": "/docs/components/table.md",
3593
3632
  "jsonUrl": "/r/components/table.json",
3594
3633
  "path": "./components/table.json",
3595
- "sha256": "ac8adb61bd9de2e96a88cdf18e57d72a2f1d998f147fae69d045d48a363dd09a"
3634
+ "sha256": "b4e6132a0cae4618117d374b3f9e0d5496d1b92128a1295d70337637261ad30d"
3596
3635
  },
3597
3636
  {
3598
3637
  "name": "TableScrollRegion",
@@ -3605,7 +3644,7 @@
3605
3644
  "mdUrl": "/docs/components/table-scroll-region.md",
3606
3645
  "jsonUrl": "/r/components/table-scroll-region.json",
3607
3646
  "path": "./components/table-scroll-region.json",
3608
- "sha256": "731161fd205e0ba36c8cb23f3008ee6a37633232657a70f5b6af02e5db5f3a5a"
3647
+ "sha256": "fd8777365fd35362ea273a1bf17ccd028f56c9f9d7c18d211f0587514c9a9f8c"
3609
3648
  },
3610
3649
  {
3611
3650
  "name": "TerminalFrame",
@@ -3878,7 +3917,7 @@
3878
3917
  "mdUrl": "/docs/components/musical-time-input.md",
3879
3918
  "jsonUrl": "/r/components/musical-time-input.json",
3880
3919
  "path": "./components/musical-time-input.json",
3881
- "sha256": "165526c38500f36f64bbed3ed16e45cb2a5b8c9d6651a98e52b5e4e648eb89d6"
3920
+ "sha256": "3a7282c75cb40530a1ff7d5742b24b810cd833810b9f2032c9c3a4d65538f077"
3882
3921
  },
3883
3922
  {
3884
3923
  "name": "PianoKeyboard",