@fusion.dev/helix-headless 0.183.0 → 0.185.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/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@fusion.dev/helix-headless",
3
3
  "description": "Headless component tier. Structure, accessibility, state, and form participation. No styling.",
4
- "version": "0.183.0",
4
+ "version": "0.185.0",
5
5
  "license": "MIT",
6
6
  "author": "Ross Sheppard <ross.sheppard@fusion.dev>",
7
7
  "repository": {
@@ -49,14 +49,14 @@
49
49
  },
50
50
  "bugs": "https://github.com/project-fusion/fusion/issues",
51
51
  "dependencies": {
52
- "@fusion.dev/helix-core": "0.183.0",
53
- "@fusion.dev/helix-icons": "0.183.0",
52
+ "@fusion.dev/helix-core": "0.185.0",
53
+ "@fusion.dev/helix-icons": "0.185.0",
54
54
  "tslib": "^2.8.1",
55
55
  "uqr": "^0.1.3"
56
56
  },
57
57
  "devDependencies": {
58
- "@fusion.dev/helix-cem": "0.183.0",
59
- "@fusion.dev/helix-testing": "0.183.0",
58
+ "@fusion.dev/helix-cem": "0.185.0",
59
+ "@fusion.dev/helix-testing": "0.185.0",
60
60
  "@fusion.dev/scripts": "0.0.0-dev",
61
61
  "@happy-dom/global-registrator": "^20.14.5",
62
62
  "@lit-labs/ssr": "^4.1.0",
package/types/jsx.d.ts CHANGED
@@ -6392,7 +6392,11 @@ whole of it, which Shiki writes, are taken off, so the lines sit level
6392
6392
  with the gutter's numbers and the block keeps one tab stop. The code stays
6393
6393
  in the slot, so the copy button copies it as written and a reader without
6394
6394
  the script still has it. Not called on a server, which has no code to
6395
- read, nor for a diff. */
6395
+ read, nor for a diff.
6396
+
6397
+ Absent, the block draws with the highlighter `registerHighlighter` gave
6398
+ every block, where an entry such as `@fusion.dev/helix-sandbox/code-block`
6399
+ registered one, and plain otherwise. */
6396
6400
  highlight?: (HelixHeadlessCodeBlock["highlight"]) | undefined;
6397
6401
 
6398
6402
  /** A file tab showed its file, whose name `file` now holds. */
@@ -6634,7 +6638,11 @@ whole of it, which Shiki writes, are taken off, so the lines sit level
6634
6638
  with the gutter's numbers and the block keeps one tab stop. The code stays
6635
6639
  in the slot, so the copy button copies it as written and a reader without
6636
6640
  the script still has it. Not called on a server, which has no code to
6637
- read, nor for a diff. */
6641
+ read, nor for a diff.
6642
+
6643
+ Absent, the block draws with the highlighter `registerHighlighter` gave
6644
+ every block, where an entry such as `@fusion.dev/helix-sandbox/code-block`
6645
+ registered one, and plain otherwise. */
6638
6646
  "prop:highlight"?: (HelixHeadlessCodeBlock["highlight"]) | undefined;
6639
6647
  /** A file tab showed its file, whose name `file` now holds. */
6640
6648
  "on:change"?: ((e: HelixHeadlessCodeBlockElementEvent) => void) | undefined;
@@ -9420,6 +9428,16 @@ and the grid becomes a tree grid.
9420
9428
  Reflected, because the styled tier indents a tree grid's row headers by
9421
9429
  it. No default, so a table that sets none writes nothing onto its host. */
9422
9430
  childField?: (HelixHeadlessDataTable["childField"]) | undefined;
9431
+ /** The column tracks, as a grid track list such as `2fr 1fr max-content`,
9432
+ dealt out one track to a column in the order the columns are written. A
9433
+ column's own `width` wins in its place, and a column it does not reach
9434
+ takes the track a column with no `width` takes.
9435
+
9436
+ **The one track list a server can send.** A server rendering this element
9437
+ has no columns to read a `width` from, and neither has a stylesheet laying
9438
+ out the rows a page served before the table upgrades, so a table sized here
9439
+ lays those rows out at the widths it draws. */
9440
+ columns?: (HelixHeadlessDataTable["columns"]) | undefined;
9423
9441
  /** The keys of the rows open at the start, separated by commas. Used until
9424
9442
  `expanded` is set. */
9425
9443
  "default-expanded"?: (HelixHeadlessDataTable["defaultExpanded"]) | undefined;
@@ -9853,6 +9871,16 @@ and the grid becomes a tree grid.
9853
9871
  Reflected, because the styled tier indents a tree grid's row headers by
9854
9872
  it. No default, so a table that sets none writes nothing onto its host. */
9855
9873
  "prop:childField"?: (HelixHeadlessDataTable["childField"]) | undefined;
9874
+ /** The column tracks, as a grid track list such as `2fr 1fr max-content`,
9875
+ dealt out one track to a column in the order the columns are written. A
9876
+ column's own `width` wins in its place, and a column it does not reach
9877
+ takes the track a column with no `width` takes.
9878
+
9879
+ **The one track list a server can send.** A server rendering this element
9880
+ has no columns to read a `width` from, and neither has a stylesheet laying
9881
+ out the rows a page served before the table upgrades, so a table sized here
9882
+ lays those rows out at the widths it draws. */
9883
+ "prop:columns"?: (HelixHeadlessDataTable["columns"]) | undefined;
9856
9884
  /** The keys of the rows open at the start, separated by commas. Used until
9857
9885
  `expanded` is set. */
9858
9886
  "attr:default-expanded"?: (HelixHeadlessDataTable["defaultExpanded"]) | undefined;
@@ -21529,7 +21557,11 @@ Cleared as the menu closes and as a submenu opens or closes, so each page
21529
21557
  starts with every row showing. */
21530
21558
  filter?: (HelixHeadlessMenu["filter"]) | undefined;
21531
21559
  /** Whether the menu shows a field above its rows that narrows them as the
21532
- reader types, with focus staying in the field. */
21560
+ reader types, with focus staying in the field, once
21561
+ `@fusion.dev/helix/menu/filter` (or `@fusion.dev/helix-headless/menu/filter`)
21562
+ is imported. Without that import it does nothing, so a menu that never
21563
+ filters carries none of the filter's code, and a development build says
21564
+ which import is missing. */
21533
21565
  filterable?: (HelixHeadlessMenu["filterable"]) | undefined;
21534
21566
  /** The filter field's name and placeholder. */
21535
21567
  "filter-label"?: (HelixHeadlessMenu["filterLabel"]) | undefined;
@@ -21667,7 +21699,11 @@ Cleared as the menu closes and as a submenu opens or closes, so each page
21667
21699
  starts with every row showing. */
21668
21700
  "prop:filter"?: (HelixHeadlessMenu["filter"]) | undefined;
21669
21701
  /** Whether the menu shows a field above its rows that narrows them as the
21670
- reader types, with focus staying in the field. */
21702
+ reader types, with focus staying in the field, once
21703
+ `@fusion.dev/helix/menu/filter` (or `@fusion.dev/helix-headless/menu/filter`)
21704
+ is imported. Without that import it does nothing, so a menu that never
21705
+ filters carries none of the filter's code, and a development build says
21706
+ which import is missing. */
21671
21707
  "prop:filterable"?: (HelixHeadlessMenu["filterable"]) | undefined;
21672
21708
  /** The filter field's name and placeholder. */
21673
21709
  "attr:filter-label"?: (HelixHeadlessMenu["filterLabel"]) | undefined;
@@ -30116,13 +30152,11 @@ and each column may say otherwise.
30116
30152
  **It is also the only track list a server can send.** The shim has no tree
30117
30153
  to walk, so a render there knows of no columns and this attribute is the
30118
30154
  whole answer: a table given one lays its grid out in the first paint, and a
30119
- table sized only by its columns is one track wide until it upgrades.
30155
+ table sized only by its columns takes, until it upgrades, a track for each
30156
+ column at the width a column with no `width` takes (`helix.css`).
30120
30157
 
30121
- **Data Table has none of this, and should not.** Its columns are its schema
30122
- rather than an option, so there is always a column to write a `width` on
30123
- and a list here would be a second way to say what that says. This table's
30124
- cells are markup, and a table written as rows of cells with no column
30125
- declared in it has nowhere else to be sized from. */
30158
+ Data Table takes the same list, for the same reason: a data table that
30159
+ serves its first page as rows is laid out by it before it upgrades. */
30126
30160
  columns?: (HelixHeadlessTable["columns"]) | undefined;
30127
30161
  /** The keys of the rows whose rows are shown at the start, separated by
30128
30162
  commas. Used until `expanded` is set. */
@@ -30381,13 +30415,11 @@ and each column may say otherwise.
30381
30415
  **It is also the only track list a server can send.** The shim has no tree
30382
30416
  to walk, so a render there knows of no columns and this attribute is the
30383
30417
  whole answer: a table given one lays its grid out in the first paint, and a
30384
- table sized only by its columns is one track wide until it upgrades.
30418
+ table sized only by its columns takes, until it upgrades, a track for each
30419
+ column at the width a column with no `width` takes (`helix.css`).
30385
30420
 
30386
- **Data Table has none of this, and should not.** Its columns are its schema
30387
- rather than an option, so there is always a column to write a `width` on
30388
- and a list here would be a second way to say what that says. This table's
30389
- cells are markup, and a table written as rows of cells with no column
30390
- declared in it has nowhere else to be sized from. */
30421
+ Data Table takes the same list, for the same reason: a data table that
30422
+ serves its first page as rows is laid out by it before it upgrades. */
30391
30423
  "prop:columns"?: (HelixHeadlessTable["columns"]) | undefined;
30392
30424
  /** The keys of the rows whose rows are shown at the start, separated by
30393
30425
  commas. Used until `expanded` is set. */
@@ -31763,6 +31795,12 @@ number, and both are carried as one comma-separated value, which is what a
31763
31795
  form submits. `TimePicker` carries the longer note on the interaction and
31764
31796
  on why a wheel cannot do either. */
31765
31797
  mode?: (HelixHeadlessTimeInput["mode"]) | undefined;
31798
+ /** The words on the list's button that chooses the current time, drawn with
31799
+ `show-now`. */
31800
+ "now-label"?: (HelixHeadlessTimeInput["nowLabel"]) | undefined;
31801
+ /** The words on the list's button that chooses the current time, drawn with
31802
+ `show-now`. */
31803
+ nowLabel?: (HelixHeadlessTimeInput["nowLabel"]) | undefined;
31766
31804
  /** Placeholder text shown before a time is entered. */
31767
31805
  placeholder?: (HelixHeadlessTimeInput["placeholder"]) | undefined;
31768
31806
  /** The message shown when a range holds more than two times.
@@ -31803,6 +31841,14 @@ removes rather than as "Remove" said once per time. */
31803
31841
  may give them, the field writes them, and the list's `step` counts seconds.
31804
31842
  See Time Picker's `seconds`. */
31805
31843
  seconds?: (HelixHeadlessTimeInput["seconds"]) | undefined;
31844
+ /** Draws a button under the times in the list that chooses the current time,
31845
+ moved to the nearest time on offer. See Time Picker's `show-now`. Its words
31846
+ are `now-label`. */
31847
+ "show-now"?: (HelixHeadlessTimeInput["showNow"]) | undefined;
31848
+ /** Draws a button under the times in the list that chooses the current time,
31849
+ moved to the nearest time on offer. See Time Picker's `show-now`. Its words
31850
+ are `now-label`. */
31851
+ showNow?: (HelixHeadlessTimeInput["showNow"]) | undefined;
31806
31852
  /** How far apart the offered times are, in minutes, or in seconds with
31807
31853
  `seconds`. */
31808
31854
  step?: (HelixHeadlessTimeInput["step"]) | undefined;
@@ -32171,6 +32217,12 @@ number, and both are carried as one comma-separated value, which is what a
32171
32217
  form submits. `TimePicker` carries the longer note on the interaction and
32172
32218
  on why a wheel cannot do either. */
32173
32219
  "prop:mode"?: (HelixHeadlessTimeInput["mode"]) | undefined;
32220
+ /** The words on the list's button that chooses the current time, drawn with
32221
+ `show-now`. */
32222
+ "attr:now-label"?: (HelixHeadlessTimeInput["nowLabel"]) | undefined;
32223
+ /** The words on the list's button that chooses the current time, drawn with
32224
+ `show-now`. */
32225
+ "prop:nowLabel"?: (HelixHeadlessTimeInput["nowLabel"]) | undefined;
32174
32226
  /** Placeholder text shown before a time is entered. */
32175
32227
  "prop:placeholder"?: (HelixHeadlessTimeInput["placeholder"]) | undefined;
32176
32228
  /** The message shown when a range holds more than two times.
@@ -32211,6 +32263,14 @@ removes rather than as "Remove" said once per time. */
32211
32263
  may give them, the field writes them, and the list's `step` counts seconds.
32212
32264
  See Time Picker's `seconds`. */
32213
32265
  "prop:seconds"?: (HelixHeadlessTimeInput["seconds"]) | undefined;
32266
+ /** Draws a button under the times in the list that chooses the current time,
32267
+ moved to the nearest time on offer. See Time Picker's `show-now`. Its words
32268
+ are `now-label`. */
32269
+ "bool:show-now"?: (HelixHeadlessTimeInput["showNow"]) | undefined;
32270
+ /** Draws a button under the times in the list that chooses the current time,
32271
+ moved to the nearest time on offer. See Time Picker's `show-now`. Its words
32272
+ are `now-label`. */
32273
+ "prop:showNow"?: (HelixHeadlessTimeInput["showNow"]) | undefined;
32214
32274
  /** How far apart the offered times are, in minutes, or in seconds with
32215
32275
  `seconds`. */
32216
32276
  "prop:step"?: (HelixHeadlessTimeInput["step"]) | undefined;
@@ -42127,6 +42187,20 @@ export type CustomElements = {
42127
42187
  * the slot, so the copy button and the page's own text are the code as
42128
42188
  * written.
42129
42189
  *
42190
+ * **Code Block ships no grammar**, so plain code costs you no parser. To color
42191
+ * code without a highlighter of your own, import one more entry beside the
42192
+ * block's. It colors every block by its `language` (`css`, `html`, `js`,
42193
+ * `jsx`, `sh`, `ts`, or `tsx`) with the Lezer grammars of the sandbox's
42194
+ * editor, in the editor's colors:
42195
+ *
42196
+ * ```js
42197
+ * import '@fusion.dev/helix/code-block'
42198
+ * import '@fusion.dev/helix-sandbox/code-block'
42199
+ * ```
42200
+ *
42201
+ * That entry calls `registerHighlighter`, which you can also call yourself to
42202
+ * give every block one highlighter of your own.
42203
+ *
42130
42204
  * Set `expandable` on a block whose height is capped, such as by
42131
42205
  * `--code-block-max-block-size`, and a button under it shows every line and
42132
42206
  * then fewer again, as a docs site's long example does. The button is drawn
@@ -42299,7 +42373,11 @@ export type CustomElements = {
42299
42373
  * with the gutter's numbers and the block keeps one tab stop. The code stays
42300
42374
  * in the slot, so the copy button copies it as written and a reader without
42301
42375
  * the script still has it. Not called on a server, which has no code to
42302
- * read, nor for a diff. (property only)
42376
+ * read, nor for a diff.
42377
+ *
42378
+ * Absent, the block draws with the highlighter `registerHighlighter` gave
42379
+ * every block, where an entry such as `@fusion.dev/helix-sandbox/code-block`
42380
+ * registered one, and plain otherwise. (property only)
42303
42381
  * - `whenSettled`: Resolves a frame after the first update, when transitions are switched on.
42304
42382
  *
42305
42383
  * **Named `whenSettled` because `settled` is taken four times over**, by
@@ -44328,11 +44406,12 @@ export type CustomElements = {
44328
44406
  * `csv()` returns the result as text: every row that passes the filter, in the
44329
44407
  * order and the columns on screen. Saving the file is up to you.
44330
44408
  *
44331
- * `DataTable` has no `columns` attribute. Each `TableColumn` is part of the
44332
- * schema, so you size a column with its own `width`. `Table` has `columns`
44333
- * because its cells are markup you write and it can have no columns at all.
44334
- * Written on `DataTable`, `columns` has no effect, so watch for it when you
44335
- * move a table from `Table` to `DataTable`.
44409
+ * Size a column with its own `width`, or every column at once with `columns`,
44410
+ * a track list dealt out one track to a column in the order they are written,
44411
+ * as `Table` deals it. A column's `width` wins in its place. **A table that
44412
+ * serves its first page takes its widths from `columns`**: a server and a
44413
+ * stylesheet can read the table's own attributes and not its columns', so the
44414
+ * served rows are laid out at the widths the table draws.
44336
44415
  *
44337
44416
  * **The columns are an import of their own.** A column is the Table family's
44338
44417
  * `TableColumn`, which the data table does not register, so a page that writes
@@ -44358,6 +44437,15 @@ export type CustomElements = {
44358
44437
  *
44359
44438
  * Reflected, because the styled tier indents a tree grid's row headers by
44360
44439
  * it. No default, so a table that sets none writes nothing onto its host.
44440
+ * - `columns`: The column tracks, as a grid track list such as `2fr 1fr max-content`,
44441
+ * dealt out one track to a column in the order the columns are written. A
44442
+ * column's own `width` wins in its place, and a column it does not reach
44443
+ * takes the track a column with no `width` takes.
44444
+ *
44445
+ * **The one track list a server can send.** A server rendering this element
44446
+ * has no columns to read a `width` from, and neither has a stylesheet laying
44447
+ * out the rows a page served before the table upgrades, so a table sized here
44448
+ * lays those rows out at the widths it draws.
44361
44449
  * - `default-expanded`/`defaultExpanded`: The keys of the rows open at the start, separated by commas. Used until
44362
44450
  * `expanded` is set.
44363
44451
  * - `default-filter`/`defaultFilter`: The starting search query, used until `filter` is set.
@@ -53664,7 +53752,15 @@ export type CustomElements = {
53664
53752
  * opens it from the keyboard, and the trigger is described by
53665
53753
  * `long-press-label`, which says so.
53666
53754
  *
53667
- * **A filter field.** With `filterable`, the menu opens with focus in a field
53755
+ * **A filter field** is a separate import, `@fusion.dev/helix/menu/filter`, so
53756
+ * a menu that never filters carries none of its code:
53757
+ *
53758
+ * ```js
53759
+ * import '@fusion.dev/helix/menu'
53760
+ * import '@fusion.dev/helix/menu/filter'
53761
+ * ```
53762
+ *
53763
+ * With it imported and `filterable` set, the menu opens with focus in a field
53668
53764
  * above its rows, and typing narrows the rows of the page the keys move in,
53669
53765
  * as React Aria's `Autocomplete` around a `Menu` does. A row is kept where its
53670
53766
  * words hold the filter, in any case, or where `filterMatch` says so. Each
@@ -53697,7 +53793,11 @@ export type CustomElements = {
53697
53793
  * Cleared as the menu closes and as a submenu opens or closes, so each page
53698
53794
  * starts with every row showing.
53699
53795
  * - `filterable`: Whether the menu shows a field above its rows that narrows them as the
53700
- * reader types, with focus staying in the field.
53796
+ * reader types, with focus staying in the field, once
53797
+ * `@fusion.dev/helix/menu/filter` (or `@fusion.dev/helix-headless/menu/filter`)
53798
+ * is imported. Without that import it does nothing, so a menu that never
53799
+ * filters carries none of the filter's code, and a development build says
53800
+ * which import is missing.
53701
53801
  * - `filter-label`/`filterLabel`: The filter field's name and placeholder.
53702
53802
  * - `label`: Accessible name for the surface.
53703
53803
  *
@@ -61338,13 +61438,11 @@ export type CustomElements = {
61338
61438
  * **It is also the only track list a server can send.** The shim has no tree
61339
61439
  * to walk, so a render there knows of no columns and this attribute is the
61340
61440
  * whole answer: a table given one lays its grid out in the first paint, and a
61341
- * table sized only by its columns is one track wide until it upgrades.
61441
+ * table sized only by its columns takes, until it upgrades, a track for each
61442
+ * column at the width a column with no `width` takes (`helix.css`).
61342
61443
  *
61343
- * **Data Table has none of this, and should not.** Its columns are its schema
61344
- * rather than an option, so there is always a column to write a `width` on
61345
- * and a list here would be a second way to say what that says. This table's
61346
- * cells are markup, and a table written as rows of cells with no column
61347
- * declared in it has nowhere else to be sized from.
61444
+ * Data Table takes the same list, for the same reason: a data table that
61445
+ * serves its first page as rows is laid out by it before it upgrades.
61348
61446
  * - `default-expanded`/`defaultExpanded`: The keys of the rows whose rows are shown at the start, separated by
61349
61447
  * commas. Used until `expanded` is set.
61350
61448
  * - `default-selected`/`defaultSelected`: The keys selected at the start, separated by commas. Used until `selected`
@@ -62684,6 +62782,8 @@ export type CustomElements = {
62684
62782
  * number, and both are carried as one comma-separated value, which is what a
62685
62783
  * form submits. `TimePicker` carries the longer note on the interaction and
62686
62784
  * on why a wheel cannot do either.
62785
+ * - `now-label`/`nowLabel`: The words on the list's button that chooses the current time, drawn with
62786
+ * `show-now`.
62687
62787
  * - `placeholder`: Placeholder text shown before a time is entered.
62688
62788
  * - `range-length-message`/`rangeLengthMessage`: The message shown when a range holds more than two times.
62689
62789
  *
@@ -62701,6 +62801,9 @@ export type CustomElements = {
62701
62801
  * - `seconds`: Whether times carry their seconds: the value is `HH:mm:ss`, a typed time
62702
62802
  * may give them, the field writes them, and the list's `step` counts seconds.
62703
62803
  * See Time Picker's `seconds`.
62804
+ * - `show-now`/`showNow`: Draws a button under the times in the list that chooses the current time,
62805
+ * moved to the nearest time on offer. See Time Picker's `show-now`. Its words
62806
+ * are `now-label`.
62704
62807
  * - `step`: How far apart the offered times are, in minutes, or in seconds with
62705
62808
  * `seconds`.
62706
62809
  * - `time-style`/`timeStyle`: Whether the field shows the time in the local style or as the value
@@ -71901,6 +72004,20 @@ export type CustomElementsSolidJs = {
71901
72004
  * the slot, so the copy button and the page's own text are the code as
71902
72005
  * written.
71903
72006
  *
72007
+ * **Code Block ships no grammar**, so plain code costs you no parser. To color
72008
+ * code without a highlighter of your own, import one more entry beside the
72009
+ * block's. It colors every block by its `language` (`css`, `html`, `js`,
72010
+ * `jsx`, `sh`, `ts`, or `tsx`) with the Lezer grammars of the sandbox's
72011
+ * editor, in the editor's colors:
72012
+ *
72013
+ * ```js
72014
+ * import '@fusion.dev/helix/code-block'
72015
+ * import '@fusion.dev/helix-sandbox/code-block'
72016
+ * ```
72017
+ *
72018
+ * That entry calls `registerHighlighter`, which you can also call yourself to
72019
+ * give every block one highlighter of your own.
72020
+ *
71904
72021
  * Set `expandable` on a block whose height is capped, such as by
71905
72022
  * `--code-block-max-block-size`, and a button under it shows every line and
71906
72023
  * then fewer again, as a docs site's long example does. The button is drawn
@@ -72073,7 +72190,11 @@ export type CustomElementsSolidJs = {
72073
72190
  * with the gutter's numbers and the block keeps one tab stop. The code stays
72074
72191
  * in the slot, so the copy button copies it as written and a reader without
72075
72192
  * the script still has it. Not called on a server, which has no code to
72076
- * read, nor for a diff. (property only)
72193
+ * read, nor for a diff.
72194
+ *
72195
+ * Absent, the block draws with the highlighter `registerHighlighter` gave
72196
+ * every block, where an entry such as `@fusion.dev/helix-sandbox/code-block`
72197
+ * registered one, and plain otherwise. (property only)
72077
72198
  * - `whenSettled`: Resolves a frame after the first update, when transitions are switched on.
72078
72199
  *
72079
72200
  * **Named `whenSettled` because `settled` is taken four times over**, by
@@ -74117,11 +74238,12 @@ export type CustomElementsSolidJs = {
74117
74238
  * `csv()` returns the result as text: every row that passes the filter, in the
74118
74239
  * order and the columns on screen. Saving the file is up to you.
74119
74240
  *
74120
- * `DataTable` has no `columns` attribute. Each `TableColumn` is part of the
74121
- * schema, so you size a column with its own `width`. `Table` has `columns`
74122
- * because its cells are markup you write and it can have no columns at all.
74123
- * Written on `DataTable`, `columns` has no effect, so watch for it when you
74124
- * move a table from `Table` to `DataTable`.
74241
+ * Size a column with its own `width`, or every column at once with `columns`,
74242
+ * a track list dealt out one track to a column in the order they are written,
74243
+ * as `Table` deals it. A column's `width` wins in its place. **A table that
74244
+ * serves its first page takes its widths from `columns`**: a server and a
74245
+ * stylesheet can read the table's own attributes and not its columns', so the
74246
+ * served rows are laid out at the widths the table draws.
74125
74247
  *
74126
74248
  * **The columns are an import of their own.** A column is the Table family's
74127
74249
  * `TableColumn`, which the data table does not register, so a page that writes
@@ -74147,6 +74269,15 @@ export type CustomElementsSolidJs = {
74147
74269
  *
74148
74270
  * Reflected, because the styled tier indents a tree grid's row headers by
74149
74271
  * it. No default, so a table that sets none writes nothing onto its host.
74272
+ * - `columns`: The column tracks, as a grid track list such as `2fr 1fr max-content`,
74273
+ * dealt out one track to a column in the order the columns are written. A
74274
+ * column's own `width` wins in its place, and a column it does not reach
74275
+ * takes the track a column with no `width` takes.
74276
+ *
74277
+ * **The one track list a server can send.** A server rendering this element
74278
+ * has no columns to read a `width` from, and neither has a stylesheet laying
74279
+ * out the rows a page served before the table upgrades, so a table sized here
74280
+ * lays those rows out at the widths it draws.
74150
74281
  * - `default-expanded`/`defaultExpanded`: The keys of the rows open at the start, separated by commas. Used until
74151
74282
  * `expanded` is set.
74152
74283
  * - `default-filter`/`defaultFilter`: The starting search query, used until `filter` is set.
@@ -83558,7 +83689,15 @@ export type CustomElementsSolidJs = {
83558
83689
  * opens it from the keyboard, and the trigger is described by
83559
83690
  * `long-press-label`, which says so.
83560
83691
  *
83561
- * **A filter field.** With `filterable`, the menu opens with focus in a field
83692
+ * **A filter field** is a separate import, `@fusion.dev/helix/menu/filter`, so
83693
+ * a menu that never filters carries none of its code:
83694
+ *
83695
+ * ```js
83696
+ * import '@fusion.dev/helix/menu'
83697
+ * import '@fusion.dev/helix/menu/filter'
83698
+ * ```
83699
+ *
83700
+ * With it imported and `filterable` set, the menu opens with focus in a field
83562
83701
  * above its rows, and typing narrows the rows of the page the keys move in,
83563
83702
  * as React Aria's `Autocomplete` around a `Menu` does. A row is kept where its
83564
83703
  * words hold the filter, in any case, or where `filterMatch` says so. Each
@@ -83591,7 +83730,11 @@ export type CustomElementsSolidJs = {
83591
83730
  * Cleared as the menu closes and as a submenu opens or closes, so each page
83592
83731
  * starts with every row showing.
83593
83732
  * - `filterable`: Whether the menu shows a field above its rows that narrows them as the
83594
- * reader types, with focus staying in the field.
83733
+ * reader types, with focus staying in the field, once
83734
+ * `@fusion.dev/helix/menu/filter` (or `@fusion.dev/helix-headless/menu/filter`)
83735
+ * is imported. Without that import it does nothing, so a menu that never
83736
+ * filters carries none of the filter's code, and a development build says
83737
+ * which import is missing.
83595
83738
  * - `filter-label`/`filterLabel`: The filter field's name and placeholder.
83596
83739
  * - `label`: Accessible name for the surface.
83597
83740
  *
@@ -91322,13 +91465,11 @@ export type CustomElementsSolidJs = {
91322
91465
  * **It is also the only track list a server can send.** The shim has no tree
91323
91466
  * to walk, so a render there knows of no columns and this attribute is the
91324
91467
  * whole answer: a table given one lays its grid out in the first paint, and a
91325
- * table sized only by its columns is one track wide until it upgrades.
91468
+ * table sized only by its columns takes, until it upgrades, a track for each
91469
+ * column at the width a column with no `width` takes (`helix.css`).
91326
91470
  *
91327
- * **Data Table has none of this, and should not.** Its columns are its schema
91328
- * rather than an option, so there is always a column to write a `width` on
91329
- * and a list here would be a second way to say what that says. This table's
91330
- * cells are markup, and a table written as rows of cells with no column
91331
- * declared in it has nowhere else to be sized from.
91471
+ * Data Table takes the same list, for the same reason: a data table that
91472
+ * serves its first page as rows is laid out by it before it upgrades.
91332
91473
  * - `default-expanded`/`defaultExpanded`: The keys of the rows whose rows are shown at the start, separated by
91333
91474
  * commas. Used until `expanded` is set.
91334
91475
  * - `default-selected`/`defaultSelected`: The keys selected at the start, separated by commas. Used until `selected`
@@ -92692,6 +92833,8 @@ export type CustomElementsSolidJs = {
92692
92833
  * number, and both are carried as one comma-separated value, which is what a
92693
92834
  * form submits. `TimePicker` carries the longer note on the interaction and
92694
92835
  * on why a wheel cannot do either.
92836
+ * - `now-label`/`nowLabel`: The words on the list's button that chooses the current time, drawn with
92837
+ * `show-now`.
92695
92838
  * - `placeholder`: Placeholder text shown before a time is entered.
92696
92839
  * - `range-length-message`/`rangeLengthMessage`: The message shown when a range holds more than two times.
92697
92840
  *
@@ -92709,6 +92852,9 @@ export type CustomElementsSolidJs = {
92709
92852
  * - `seconds`: Whether times carry their seconds: the value is `HH:mm:ss`, a typed time
92710
92853
  * may give them, the field writes them, and the list's `step` counts seconds.
92711
92854
  * See Time Picker's `seconds`.
92855
+ * - `show-now`/`showNow`: Draws a button under the times in the list that chooses the current time,
92856
+ * moved to the nearest time on offer. See Time Picker's `show-now`. Its words
92857
+ * are `now-label`.
92712
92858
  * - `step`: How far apart the offered times are, in minutes, or in seconds with
92713
92859
  * `seconds`.
92714
92860
  * - `time-style`/`timeStyle`: Whether the field shows the time in the local style or as the value