@fusion.dev/helix-headless 0.182.2 → 0.184.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.182.2",
4
+ "version": "0.184.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.182.2",
53
- "@fusion.dev/helix-icons": "0.182.2",
52
+ "@fusion.dev/helix-core": "0.184.0",
53
+ "@fusion.dev/helix-icons": "0.184.0",
54
54
  "tslib": "^2.8.1",
55
55
  "uqr": "^0.1.3"
56
56
  },
57
57
  "devDependencies": {
58
- "@fusion.dev/helix-cem": "0.182.2",
59
- "@fusion.dev/helix-testing": "0.182.2",
58
+ "@fusion.dev/helix-cem": "0.184.0",
59
+ "@fusion.dev/helix-testing": "0.184.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;
@@ -21529,7 +21537,11 @@ Cleared as the menu closes and as a submenu opens or closes, so each page
21529
21537
  starts with every row showing. */
21530
21538
  filter?: (HelixHeadlessMenu["filter"]) | undefined;
21531
21539
  /** Whether the menu shows a field above its rows that narrows them as the
21532
- reader types, with focus staying in the field. */
21540
+ reader types, with focus staying in the field, once
21541
+ `@fusion.dev/helix/menu/filter` (or `@fusion.dev/helix-headless/menu/filter`)
21542
+ is imported. Without that import it does nothing, so a menu that never
21543
+ filters carries none of the filter's code, and a development build says
21544
+ which import is missing. */
21533
21545
  filterable?: (HelixHeadlessMenu["filterable"]) | undefined;
21534
21546
  /** The filter field's name and placeholder. */
21535
21547
  "filter-label"?: (HelixHeadlessMenu["filterLabel"]) | undefined;
@@ -21667,7 +21679,11 @@ Cleared as the menu closes and as a submenu opens or closes, so each page
21667
21679
  starts with every row showing. */
21668
21680
  "prop:filter"?: (HelixHeadlessMenu["filter"]) | undefined;
21669
21681
  /** Whether the menu shows a field above its rows that narrows them as the
21670
- reader types, with focus staying in the field. */
21682
+ reader types, with focus staying in the field, once
21683
+ `@fusion.dev/helix/menu/filter` (or `@fusion.dev/helix-headless/menu/filter`)
21684
+ is imported. Without that import it does nothing, so a menu that never
21685
+ filters carries none of the filter's code, and a development build says
21686
+ which import is missing. */
21671
21687
  "prop:filterable"?: (HelixHeadlessMenu["filterable"]) | undefined;
21672
21688
  /** The filter field's name and placeholder. */
21673
21689
  "attr:filter-label"?: (HelixHeadlessMenu["filterLabel"]) | undefined;
@@ -31763,6 +31779,12 @@ number, and both are carried as one comma-separated value, which is what a
31763
31779
  form submits. `TimePicker` carries the longer note on the interaction and
31764
31780
  on why a wheel cannot do either. */
31765
31781
  mode?: (HelixHeadlessTimeInput["mode"]) | undefined;
31782
+ /** The words on the list's button that chooses the current time, drawn with
31783
+ `show-now`. */
31784
+ "now-label"?: (HelixHeadlessTimeInput["nowLabel"]) | undefined;
31785
+ /** The words on the list's button that chooses the current time, drawn with
31786
+ `show-now`. */
31787
+ nowLabel?: (HelixHeadlessTimeInput["nowLabel"]) | undefined;
31766
31788
  /** Placeholder text shown before a time is entered. */
31767
31789
  placeholder?: (HelixHeadlessTimeInput["placeholder"]) | undefined;
31768
31790
  /** The message shown when a range holds more than two times.
@@ -31803,6 +31825,14 @@ removes rather than as "Remove" said once per time. */
31803
31825
  may give them, the field writes them, and the list's `step` counts seconds.
31804
31826
  See Time Picker's `seconds`. */
31805
31827
  seconds?: (HelixHeadlessTimeInput["seconds"]) | undefined;
31828
+ /** Draws a button under the times in the list that chooses the current time,
31829
+ moved to the nearest time on offer. See Time Picker's `show-now`. Its words
31830
+ are `now-label`. */
31831
+ "show-now"?: (HelixHeadlessTimeInput["showNow"]) | undefined;
31832
+ /** Draws a button under the times in the list that chooses the current time,
31833
+ moved to the nearest time on offer. See Time Picker's `show-now`. Its words
31834
+ are `now-label`. */
31835
+ showNow?: (HelixHeadlessTimeInput["showNow"]) | undefined;
31806
31836
  /** How far apart the offered times are, in minutes, or in seconds with
31807
31837
  `seconds`. */
31808
31838
  step?: (HelixHeadlessTimeInput["step"]) | undefined;
@@ -32171,6 +32201,12 @@ number, and both are carried as one comma-separated value, which is what a
32171
32201
  form submits. `TimePicker` carries the longer note on the interaction and
32172
32202
  on why a wheel cannot do either. */
32173
32203
  "prop:mode"?: (HelixHeadlessTimeInput["mode"]) | undefined;
32204
+ /** The words on the list's button that chooses the current time, drawn with
32205
+ `show-now`. */
32206
+ "attr:now-label"?: (HelixHeadlessTimeInput["nowLabel"]) | undefined;
32207
+ /** The words on the list's button that chooses the current time, drawn with
32208
+ `show-now`. */
32209
+ "prop:nowLabel"?: (HelixHeadlessTimeInput["nowLabel"]) | undefined;
32174
32210
  /** Placeholder text shown before a time is entered. */
32175
32211
  "prop:placeholder"?: (HelixHeadlessTimeInput["placeholder"]) | undefined;
32176
32212
  /** The message shown when a range holds more than two times.
@@ -32211,6 +32247,14 @@ removes rather than as "Remove" said once per time. */
32211
32247
  may give them, the field writes them, and the list's `step` counts seconds.
32212
32248
  See Time Picker's `seconds`. */
32213
32249
  "prop:seconds"?: (HelixHeadlessTimeInput["seconds"]) | undefined;
32250
+ /** Draws a button under the times in the list that chooses the current time,
32251
+ moved to the nearest time on offer. See Time Picker's `show-now`. Its words
32252
+ are `now-label`. */
32253
+ "bool:show-now"?: (HelixHeadlessTimeInput["showNow"]) | undefined;
32254
+ /** Draws a button under the times in the list that chooses the current time,
32255
+ moved to the nearest time on offer. See Time Picker's `show-now`. Its words
32256
+ are `now-label`. */
32257
+ "prop:showNow"?: (HelixHeadlessTimeInput["showNow"]) | undefined;
32214
32258
  /** How far apart the offered times are, in minutes, or in seconds with
32215
32259
  `seconds`. */
32216
32260
  "prop:step"?: (HelixHeadlessTimeInput["step"]) | undefined;
@@ -36982,6 +37026,13 @@ are rendered at a time.
36982
37026
  An `aria-label` or `aria-labelledby` on the host names the list too, and
36983
37027
  wins over this. */
36984
37028
  label?: (HelixHeadlessVirtualList["label"]) | undefined;
37029
+ /** How items of more than one column are laid out. `grid`, the default, puts
37030
+ them in lines of equal columns. `waterfall` puts each item, in the order
37031
+ of the set, under the column that ends highest, as a wall of photos of
37032
+ different heights is: `columns`, or `min-column-width`, says how many
37033
+ columns. Rows of a waterfall are measured, and Up and Down move along a
37034
+ column. */
37035
+ layout?: (HelixHeadlessVirtualList["layout"]) | undefined;
36985
37036
  /** Marks the list as busy fetching more items, and draws a row after the last
36986
37037
  item that says so.
36987
37038
 
@@ -37014,14 +37065,15 @@ follows the box as it resizes, which `columns` then does not decide. */
37014
37065
  /** Which way the list runs. `horizontal` lays the items out along a line
37015
37066
  and scrolls it sideways: Left and Right move between items, the other
37016
37067
  way round on a right-to-left page, and `estimate` is an item's width. A
37017
- grid always runs down. */
37068
+ grid and a waterfall always run down. */
37018
37069
  orientation?: (HelixHeadlessVirtualList["orientation"]) | undefined;
37019
37070
  /** Lets a reader move items, once `@fusion.dev/helix/virtual-list/reorder`
37020
37071
  (or `@fusion.dev/helix-headless/virtual-list/reorder`) is imported: Alt
37021
37072
  with an arrow moves the row the keys are on, and a pointer drags a row.
37022
37073
  The list moves no item itself: you move your `items` on `helix-reorder`.
37023
37074
  Without that import it does nothing, so a list that never moves items
37024
- carries none of the code. A list of one column, without sections. */
37075
+ carries none of the code. A list of one column, without sections or a
37076
+ waterfall. */
37025
37077
  reorderable?: (HelixHeadlessVirtualList["reorderable"]) | undefined;
37026
37078
  /** The field of each item that names its section, as a key or a path of
37027
37079
  keys. Set, the items are drawn in sections: a header, then the items, in
@@ -37150,6 +37202,13 @@ are rendered at a time.
37150
37202
  An `aria-label` or `aria-labelledby` on the host names the list too, and
37151
37203
  wins over this. */
37152
37204
  "prop:label"?: (HelixHeadlessVirtualList["label"]) | undefined;
37205
+ /** How items of more than one column are laid out. `grid`, the default, puts
37206
+ them in lines of equal columns. `waterfall` puts each item, in the order
37207
+ of the set, under the column that ends highest, as a wall of photos of
37208
+ different heights is: `columns`, or `min-column-width`, says how many
37209
+ columns. Rows of a waterfall are measured, and Up and Down move along a
37210
+ column. */
37211
+ "prop:layout"?: (HelixHeadlessVirtualList["layout"]) | undefined;
37153
37212
  /** Marks the list as busy fetching more items, and draws a row after the last
37154
37213
  item that says so.
37155
37214
 
@@ -37182,14 +37241,15 @@ follows the box as it resizes, which `columns` then does not decide. */
37182
37241
  /** Which way the list runs. `horizontal` lays the items out along a line
37183
37242
  and scrolls it sideways: Left and Right move between items, the other
37184
37243
  way round on a right-to-left page, and `estimate` is an item's width. A
37185
- grid always runs down. */
37244
+ grid and a waterfall always run down. */
37186
37245
  "prop:orientation"?: (HelixHeadlessVirtualList["orientation"]) | undefined;
37187
37246
  /** Lets a reader move items, once `@fusion.dev/helix/virtual-list/reorder`
37188
37247
  (or `@fusion.dev/helix-headless/virtual-list/reorder`) is imported: Alt
37189
37248
  with an arrow moves the row the keys are on, and a pointer drags a row.
37190
37249
  The list moves no item itself: you move your `items` on `helix-reorder`.
37191
37250
  Without that import it does nothing, so a list that never moves items
37192
- carries none of the code. A list of one column, without sections. */
37251
+ carries none of the code. A list of one column, without sections or a
37252
+ waterfall. */
37193
37253
  "prop:reorderable"?: (HelixHeadlessVirtualList["reorderable"]) | undefined;
37194
37254
  /** The field of each item that names its section, as a key or a path of
37195
37255
  keys. Set, the items are drawn in sections: a header, then the items, in
@@ -38870,6 +38930,7 @@ export type CustomElements = {
38870
38930
  * - `bar`: One column. Under `stacked`, one segment of a category's column.
38871
38931
  * - `bar-end`: The bar at a column's far end, the end away from zero, which is the end to round. A column standing alone is its own far end. Under `stacked`, the last positive segment above zero and the last negative one below it. Its `data-end` is `positive` or `negative`. A blank or a zero is never the end. Set together with `bar`.
38872
38932
  * - `bar-end-negative`: A far end below zero, whose far end is its bottom, or its inline start when the bars run across. Set together with `bar-end`.
38933
+ * - `bar-negative`: A bar below zero, standing alone or any segment of a stack below it, whose base is its top, or its inline end when the bars run across. Set together with `bar`.
38873
38934
  * - `bar-wash-end`: The far stop of a bar's gradient, where one is used.
38874
38935
  * - `bar-wash-start`: The stop of a bar's gradient at its base.
38875
38936
  * - `baseline`: The line the columns stand on.
@@ -42110,6 +42171,20 @@ export type CustomElements = {
42110
42171
  * the slot, so the copy button and the page's own text are the code as
42111
42172
  * written.
42112
42173
  *
42174
+ * **Code Block ships no grammar**, so plain code costs you no parser. To color
42175
+ * code without a highlighter of your own, import one more entry beside the
42176
+ * block's. It colors every block by its `language` (`css`, `html`, `js`,
42177
+ * `jsx`, `sh`, `ts`, or `tsx`) with the Lezer grammars of the sandbox's
42178
+ * editor, in the editor's colors:
42179
+ *
42180
+ * ```js
42181
+ * import '@fusion.dev/helix/code-block'
42182
+ * import '@fusion.dev/helix-sandbox/code-block'
42183
+ * ```
42184
+ *
42185
+ * That entry calls `registerHighlighter`, which you can also call yourself to
42186
+ * give every block one highlighter of your own.
42187
+ *
42113
42188
  * Set `expandable` on a block whose height is capped, such as by
42114
42189
  * `--code-block-max-block-size`, and a button under it shows every line and
42115
42190
  * then fewer again, as a docs site's long example does. The button is drawn
@@ -42282,7 +42357,11 @@ export type CustomElements = {
42282
42357
  * with the gutter's numbers and the block keeps one tab stop. The code stays
42283
42358
  * in the slot, so the copy button copies it as written and a reader without
42284
42359
  * the script still has it. Not called on a server, which has no code to
42285
- * read, nor for a diff. (property only)
42360
+ * read, nor for a diff.
42361
+ *
42362
+ * Absent, the block draws with the highlighter `registerHighlighter` gave
42363
+ * every block, where an entry such as `@fusion.dev/helix-sandbox/code-block`
42364
+ * registered one, and plain otherwise. (property only)
42286
42365
  * - `whenSettled`: Resolves a frame after the first update, when transitions are switched on.
42287
42366
  *
42288
42367
  * **Named `whenSettled` because `settled` is taken four times over**, by
@@ -53647,7 +53726,15 @@ export type CustomElements = {
53647
53726
  * opens it from the keyboard, and the trigger is described by
53648
53727
  * `long-press-label`, which says so.
53649
53728
  *
53650
- * **A filter field.** With `filterable`, the menu opens with focus in a field
53729
+ * **A filter field** is a separate import, `@fusion.dev/helix/menu/filter`, so
53730
+ * a menu that never filters carries none of its code:
53731
+ *
53732
+ * ```js
53733
+ * import '@fusion.dev/helix/menu'
53734
+ * import '@fusion.dev/helix/menu/filter'
53735
+ * ```
53736
+ *
53737
+ * With it imported and `filterable` set, the menu opens with focus in a field
53651
53738
  * above its rows, and typing narrows the rows of the page the keys move in,
53652
53739
  * as React Aria's `Autocomplete` around a `Menu` does. A row is kept where its
53653
53740
  * words hold the filter, in any case, or where `filterMatch` says so. Each
@@ -53680,7 +53767,11 @@ export type CustomElements = {
53680
53767
  * Cleared as the menu closes and as a submenu opens or closes, so each page
53681
53768
  * starts with every row showing.
53682
53769
  * - `filterable`: Whether the menu shows a field above its rows that narrows them as the
53683
- * reader types, with focus staying in the field.
53770
+ * reader types, with focus staying in the field, once
53771
+ * `@fusion.dev/helix/menu/filter` (or `@fusion.dev/helix-headless/menu/filter`)
53772
+ * is imported. Without that import it does nothing, so a menu that never
53773
+ * filters carries none of the filter's code, and a development build says
53774
+ * which import is missing.
53684
53775
  * - `filter-label`/`filterLabel`: The filter field's name and placeholder.
53685
53776
  * - `label`: Accessible name for the surface.
53686
53777
  *
@@ -62667,6 +62758,8 @@ export type CustomElements = {
62667
62758
  * number, and both are carried as one comma-separated value, which is what a
62668
62759
  * form submits. `TimePicker` carries the longer note on the interaction and
62669
62760
  * on why a wheel cannot do either.
62761
+ * - `now-label`/`nowLabel`: The words on the list's button that chooses the current time, drawn with
62762
+ * `show-now`.
62670
62763
  * - `placeholder`: Placeholder text shown before a time is entered.
62671
62764
  * - `range-length-message`/`rangeLengthMessage`: The message shown when a range holds more than two times.
62672
62765
  *
@@ -62684,6 +62777,9 @@ export type CustomElements = {
62684
62777
  * - `seconds`: Whether times carry their seconds: the value is `HH:mm:ss`, a typed time
62685
62778
  * may give them, the field writes them, and the list's `step` counts seconds.
62686
62779
  * See Time Picker's `seconds`.
62780
+ * - `show-now`/`showNow`: Draws a button under the times in the list that chooses the current time,
62781
+ * moved to the nearest time on offer. See Time Picker's `show-now`. Its words
62782
+ * are `now-label`.
62687
62783
  * - `step`: How far apart the offered times are, in minutes, or in seconds with
62688
62784
  * `seconds`.
62689
62785
  * - `time-style`/`timeStyle`: Whether the field shows the time in the local style or as the value
@@ -66680,6 +66776,32 @@ export type CustomElements = {
66680
66776
  * smallest item size, and follows the box as it resizes. `gap` spaces the rows, and the columns
66681
66777
  * of a grid, by a number of pixels the list counts in each row's place.
66682
66778
  *
66779
+ * A grid without `selection-mode` is a grid to a reader, as the APG's grid
66780
+ * and React Aria's grid list are: the box is a `grid` with `aria-rowcount`
66781
+ * and `aria-colcount`, each line drawn is a `row` with `aria-rowindex`, and
66782
+ * each item a `gridcell` with `aria-colindex`. Each line is a slot of the
66783
+ * list's own, so your rows stay its children: give an item one element. With
66784
+ * `selection-mode` it stays a list box of options, as React Aria's list box
66785
+ * in a grid layout does.
66786
+ *
66787
+ * **A waterfall.** `layout="waterfall"` puts each item, in the order of the
66788
+ * set, under the column that ends highest so far, the leftmost of a tie, as a
66789
+ * wall of photos of different heights is, and as React Aria's waterfall
66790
+ * layout and TanStack Virtual's lanes do. `columns`, or `min-column-width`,
66791
+ * says how many columns. Every item is measured, at the width of its column,
66792
+ * and placed at its column and its height, so items of any height leave no
66793
+ * holes. The list draws the items that reach into the box, and the item
66794
+ * holding focus. A reader hears a list, or a list box, in the order of the
66795
+ * set, which is also the order Tab and a screen reader's own keys take.
66796
+ *
66797
+ * In a waterfall, Down and Up move along the column to the next or the
66798
+ * previous item in it, Right and Left move to the next or the previous
66799
+ * column, to the item there that sits beside this one the most, or the
66800
+ * nearest above where none does, and Page Down and Page Up move a box down
66801
+ * or up the column. Home and End go to the first and the last item of the
66802
+ * set, and Shift with a key takes in the items between in the order of the
66803
+ * set.
66804
+ *
66683
66805
  * **Across.** `orientation="horizontal"` lays the items out along a line and
66684
66806
  * scrolls it sideways, as a strip of cards does, windowed the same way:
66685
66807
  * `estimate` is then an item's width, and the box needs an inline size.
@@ -66698,10 +66820,11 @@ export type CustomElements = {
66698
66820
  *
66699
66821
  * | Key | What it does |
66700
66822
  * |---|---|
66701
- * | Down, Up | Moves to the next or the previous item, or in a grid to the item in the same column on the next or the previous line. |
66702
- * | Right, Left | In a grid, moves to the next or the previous item along the line, the other way round on a right-to-left page. In a list that runs across, moves to the next or the previous item the same way, and Down and Up are left to the row. |
66703
- * | Home, End | Moves to the first or the last item. |
66704
- * | Page Down, Page Up | Moves by the number of items, or of lines in a grid, on screen. |
66823
+ * | Down, Up | Moves to the next or the previous item, or in a grid to the item in the same column on the next or the previous line, or in a waterfall to the next or the previous item down the same column. |
66824
+ * | Right, Left | In a grid, moves to the next or the previous item along the line, the other way round on a right-to-left page. In a waterfall, moves to the item beside in the next or the previous column. In a list that runs across, moves to the next or the previous item the same way, and Down and Up are left to the row. |
66825
+ * | Home, End | Moves to the first or the last item. In a grid without `selection-mode`, to the first or the last item of the line. |
66826
+ * | Control or Command with Home or End | In a grid without `selection-mode`, moves to the first or the last item. |
66827
+ * | Page Down, Page Up | Moves by the number of items, or of lines in a grid, on screen, or in a waterfall a box down or up the column. |
66705
66828
  * | A letter or a word | Moves to the next item whose text starts with what you typed. |
66706
66829
  * | Escape | Lets go of every chosen item, in a list with `selection-mode`. |
66707
66830
  * | Alt with Up or Down | In a `reorderable` list, moves the item a place. Alt with Home or End moves it to either end. |
@@ -66716,8 +66839,9 @@ export type CustomElements = {
66716
66839
  * or the item itself when it is a string or a number.
66717
66840
  *
66718
66841
  * Each row says its place in the whole set with `aria-posinset` and
66719
- * `aria-setsize`, so a screen reader says "4,000 of 10,000". The row holding
66720
- * focus stays drawn when it scrolls out.
66842
+ * `aria-setsize`, so a screen reader says "4,000 of 10,000", and each cell of
66843
+ * a grid its line and its column. The row holding focus stays drawn when it
66844
+ * scrolls out.
66721
66845
  *
66722
66846
  * **Selecting.** `selection-mode` makes the list a list box a reader chooses
66723
66847
  * from: `single` selects one item and `multiple` any number. Space or a press
@@ -66825,6 +66949,12 @@ export type CustomElements = {
66825
66949
  *
66826
66950
  * An `aria-label` or `aria-labelledby` on the host names the list too, and
66827
66951
  * wins over this.
66952
+ * - `layout`: How items of more than one column are laid out. `grid`, the default, puts
66953
+ * them in lines of equal columns. `waterfall` puts each item, in the order
66954
+ * of the set, under the column that ends highest, as a wall of photos of
66955
+ * different heights is: `columns`, or `min-column-width`, says how many
66956
+ * columns. Rows of a waterfall are measured, and Up and Down move along a
66957
+ * column.
66828
66958
  * - `loading`: Marks the list as busy fetching more items, and draws a row after the last
66829
66959
  * item that says so.
66830
66960
  *
@@ -66847,13 +66977,14 @@ export type CustomElements = {
66847
66977
  * - `orientation`: Which way the list runs. `horizontal` lays the items out along a line
66848
66978
  * and scrolls it sideways: Left and Right move between items, the other
66849
66979
  * way round on a right-to-left page, and `estimate` is an item's width. A
66850
- * grid always runs down.
66980
+ * grid and a waterfall always run down.
66851
66981
  * - `reorderable`: Lets a reader move items, once `@fusion.dev/helix/virtual-list/reorder`
66852
66982
  * (or `@fusion.dev/helix-headless/virtual-list/reorder`) is imported: Alt
66853
66983
  * with an arrow moves the row the keys are on, and a pointer drags a row.
66854
66984
  * The list moves no item itself: you move your `items` on `helix-reorder`.
66855
66985
  * Without that import it does nothing, so a list that never moves items
66856
- * carries none of the code. A list of one column, without sections.
66986
+ * carries none of the code. A list of one column, without sections or a
66987
+ * waterfall.
66857
66988
  * - `section-field`/`sectionField`: The field of each item that names its section, as a key or a path of
66858
66989
  * keys. Set, the items are drawn in sections: a header, then the items, in
66859
66990
  * an element with the `group` role that the header names. A section starts
@@ -68575,6 +68706,7 @@ export type CustomElementsSolidJs = {
68575
68706
  * - `bar`: One column. Under `stacked`, one segment of a category's column.
68576
68707
  * - `bar-end`: The bar at a column's far end, the end away from zero, which is the end to round. A column standing alone is its own far end. Under `stacked`, the last positive segment above zero and the last negative one below it. Its `data-end` is `positive` or `negative`. A blank or a zero is never the end. Set together with `bar`.
68577
68708
  * - `bar-end-negative`: A far end below zero, whose far end is its bottom, or its inline start when the bars run across. Set together with `bar-end`.
68709
+ * - `bar-negative`: A bar below zero, standing alone or any segment of a stack below it, whose base is its top, or its inline end when the bars run across. Set together with `bar`.
68578
68710
  * - `bar-wash-end`: The far stop of a bar's gradient, where one is used.
68579
68711
  * - `bar-wash-start`: The stop of a bar's gradient at its base.
68580
68712
  * - `baseline`: The line the columns stand on.
@@ -71848,6 +71980,20 @@ export type CustomElementsSolidJs = {
71848
71980
  * the slot, so the copy button and the page's own text are the code as
71849
71981
  * written.
71850
71982
  *
71983
+ * **Code Block ships no grammar**, so plain code costs you no parser. To color
71984
+ * code without a highlighter of your own, import one more entry beside the
71985
+ * block's. It colors every block by its `language` (`css`, `html`, `js`,
71986
+ * `jsx`, `sh`, `ts`, or `tsx`) with the Lezer grammars of the sandbox's
71987
+ * editor, in the editor's colors:
71988
+ *
71989
+ * ```js
71990
+ * import '@fusion.dev/helix/code-block'
71991
+ * import '@fusion.dev/helix-sandbox/code-block'
71992
+ * ```
71993
+ *
71994
+ * That entry calls `registerHighlighter`, which you can also call yourself to
71995
+ * give every block one highlighter of your own.
71996
+ *
71851
71997
  * Set `expandable` on a block whose height is capped, such as by
71852
71998
  * `--code-block-max-block-size`, and a button under it shows every line and
71853
71999
  * then fewer again, as a docs site's long example does. The button is drawn
@@ -72020,7 +72166,11 @@ export type CustomElementsSolidJs = {
72020
72166
  * with the gutter's numbers and the block keeps one tab stop. The code stays
72021
72167
  * in the slot, so the copy button copies it as written and a reader without
72022
72168
  * the script still has it. Not called on a server, which has no code to
72023
- * read, nor for a diff. (property only)
72169
+ * read, nor for a diff.
72170
+ *
72171
+ * Absent, the block draws with the highlighter `registerHighlighter` gave
72172
+ * every block, where an entry such as `@fusion.dev/helix-sandbox/code-block`
72173
+ * registered one, and plain otherwise. (property only)
72024
72174
  * - `whenSettled`: Resolves a frame after the first update, when transitions are switched on.
72025
72175
  *
72026
72176
  * **Named `whenSettled` because `settled` is taken four times over**, by
@@ -83505,7 +83655,15 @@ export type CustomElementsSolidJs = {
83505
83655
  * opens it from the keyboard, and the trigger is described by
83506
83656
  * `long-press-label`, which says so.
83507
83657
  *
83508
- * **A filter field.** With `filterable`, the menu opens with focus in a field
83658
+ * **A filter field** is a separate import, `@fusion.dev/helix/menu/filter`, so
83659
+ * a menu that never filters carries none of its code:
83660
+ *
83661
+ * ```js
83662
+ * import '@fusion.dev/helix/menu'
83663
+ * import '@fusion.dev/helix/menu/filter'
83664
+ * ```
83665
+ *
83666
+ * With it imported and `filterable` set, the menu opens with focus in a field
83509
83667
  * above its rows, and typing narrows the rows of the page the keys move in,
83510
83668
  * as React Aria's `Autocomplete` around a `Menu` does. A row is kept where its
83511
83669
  * words hold the filter, in any case, or where `filterMatch` says so. Each
@@ -83538,7 +83696,11 @@ export type CustomElementsSolidJs = {
83538
83696
  * Cleared as the menu closes and as a submenu opens or closes, so each page
83539
83697
  * starts with every row showing.
83540
83698
  * - `filterable`: Whether the menu shows a field above its rows that narrows them as the
83541
- * reader types, with focus staying in the field.
83699
+ * reader types, with focus staying in the field, once
83700
+ * `@fusion.dev/helix/menu/filter` (or `@fusion.dev/helix-headless/menu/filter`)
83701
+ * is imported. Without that import it does nothing, so a menu that never
83702
+ * filters carries none of the filter's code, and a development build says
83703
+ * which import is missing.
83542
83704
  * - `filter-label`/`filterLabel`: The filter field's name and placeholder.
83543
83705
  * - `label`: Accessible name for the surface.
83544
83706
  *
@@ -92639,6 +92801,8 @@ export type CustomElementsSolidJs = {
92639
92801
  * number, and both are carried as one comma-separated value, which is what a
92640
92802
  * form submits. `TimePicker` carries the longer note on the interaction and
92641
92803
  * on why a wheel cannot do either.
92804
+ * - `now-label`/`nowLabel`: The words on the list's button that chooses the current time, drawn with
92805
+ * `show-now`.
92642
92806
  * - `placeholder`: Placeholder text shown before a time is entered.
92643
92807
  * - `range-length-message`/`rangeLengthMessage`: The message shown when a range holds more than two times.
92644
92808
  *
@@ -92656,6 +92820,9 @@ export type CustomElementsSolidJs = {
92656
92820
  * - `seconds`: Whether times carry their seconds: the value is `HH:mm:ss`, a typed time
92657
92821
  * may give them, the field writes them, and the list's `step` counts seconds.
92658
92822
  * See Time Picker's `seconds`.
92823
+ * - `show-now`/`showNow`: Draws a button under the times in the list that chooses the current time,
92824
+ * moved to the nearest time on offer. See Time Picker's `show-now`. Its words
92825
+ * are `now-label`.
92659
92826
  * - `step`: How far apart the offered times are, in minutes, or in seconds with
92660
92827
  * `seconds`.
92661
92828
  * - `time-style`/`timeStyle`: Whether the field shows the time in the local style or as the value
@@ -96698,6 +96865,32 @@ export type CustomElementsSolidJs = {
96698
96865
  * smallest item size, and follows the box as it resizes. `gap` spaces the rows, and the columns
96699
96866
  * of a grid, by a number of pixels the list counts in each row's place.
96700
96867
  *
96868
+ * A grid without `selection-mode` is a grid to a reader, as the APG's grid
96869
+ * and React Aria's grid list are: the box is a `grid` with `aria-rowcount`
96870
+ * and `aria-colcount`, each line drawn is a `row` with `aria-rowindex`, and
96871
+ * each item a `gridcell` with `aria-colindex`. Each line is a slot of the
96872
+ * list's own, so your rows stay its children: give an item one element. With
96873
+ * `selection-mode` it stays a list box of options, as React Aria's list box
96874
+ * in a grid layout does.
96875
+ *
96876
+ * **A waterfall.** `layout="waterfall"` puts each item, in the order of the
96877
+ * set, under the column that ends highest so far, the leftmost of a tie, as a
96878
+ * wall of photos of different heights is, and as React Aria's waterfall
96879
+ * layout and TanStack Virtual's lanes do. `columns`, or `min-column-width`,
96880
+ * says how many columns. Every item is measured, at the width of its column,
96881
+ * and placed at its column and its height, so items of any height leave no
96882
+ * holes. The list draws the items that reach into the box, and the item
96883
+ * holding focus. A reader hears a list, or a list box, in the order of the
96884
+ * set, which is also the order Tab and a screen reader's own keys take.
96885
+ *
96886
+ * In a waterfall, Down and Up move along the column to the next or the
96887
+ * previous item in it, Right and Left move to the next or the previous
96888
+ * column, to the item there that sits beside this one the most, or the
96889
+ * nearest above where none does, and Page Down and Page Up move a box down
96890
+ * or up the column. Home and End go to the first and the last item of the
96891
+ * set, and Shift with a key takes in the items between in the order of the
96892
+ * set.
96893
+ *
96701
96894
  * **Across.** `orientation="horizontal"` lays the items out along a line and
96702
96895
  * scrolls it sideways, as a strip of cards does, windowed the same way:
96703
96896
  * `estimate` is then an item's width, and the box needs an inline size.
@@ -96716,10 +96909,11 @@ export type CustomElementsSolidJs = {
96716
96909
  *
96717
96910
  * | Key | What it does |
96718
96911
  * |---|---|
96719
- * | Down, Up | Moves to the next or the previous item, or in a grid to the item in the same column on the next or the previous line. |
96720
- * | Right, Left | In a grid, moves to the next or the previous item along the line, the other way round on a right-to-left page. In a list that runs across, moves to the next or the previous item the same way, and Down and Up are left to the row. |
96721
- * | Home, End | Moves to the first or the last item. |
96722
- * | Page Down, Page Up | Moves by the number of items, or of lines in a grid, on screen. |
96912
+ * | Down, Up | Moves to the next or the previous item, or in a grid to the item in the same column on the next or the previous line, or in a waterfall to the next or the previous item down the same column. |
96913
+ * | Right, Left | In a grid, moves to the next or the previous item along the line, the other way round on a right-to-left page. In a waterfall, moves to the item beside in the next or the previous column. In a list that runs across, moves to the next or the previous item the same way, and Down and Up are left to the row. |
96914
+ * | Home, End | Moves to the first or the last item. In a grid without `selection-mode`, to the first or the last item of the line. |
96915
+ * | Control or Command with Home or End | In a grid without `selection-mode`, moves to the first or the last item. |
96916
+ * | Page Down, Page Up | Moves by the number of items, or of lines in a grid, on screen, or in a waterfall a box down or up the column. |
96723
96917
  * | A letter or a word | Moves to the next item whose text starts with what you typed. |
96724
96918
  * | Escape | Lets go of every chosen item, in a list with `selection-mode`. |
96725
96919
  * | Alt with Up or Down | In a `reorderable` list, moves the item a place. Alt with Home or End moves it to either end. |
@@ -96734,8 +96928,9 @@ export type CustomElementsSolidJs = {
96734
96928
  * or the item itself when it is a string or a number.
96735
96929
  *
96736
96930
  * Each row says its place in the whole set with `aria-posinset` and
96737
- * `aria-setsize`, so a screen reader says "4,000 of 10,000". The row holding
96738
- * focus stays drawn when it scrolls out.
96931
+ * `aria-setsize`, so a screen reader says "4,000 of 10,000", and each cell of
96932
+ * a grid its line and its column. The row holding focus stays drawn when it
96933
+ * scrolls out.
96739
96934
  *
96740
96935
  * **Selecting.** `selection-mode` makes the list a list box a reader chooses
96741
96936
  * from: `single` selects one item and `multiple` any number. Space or a press
@@ -96843,6 +97038,12 @@ export type CustomElementsSolidJs = {
96843
97038
  *
96844
97039
  * An `aria-label` or `aria-labelledby` on the host names the list too, and
96845
97040
  * wins over this.
97041
+ * - `layout`: How items of more than one column are laid out. `grid`, the default, puts
97042
+ * them in lines of equal columns. `waterfall` puts each item, in the order
97043
+ * of the set, under the column that ends highest, as a wall of photos of
97044
+ * different heights is: `columns`, or `min-column-width`, says how many
97045
+ * columns. Rows of a waterfall are measured, and Up and Down move along a
97046
+ * column.
96846
97047
  * - `loading`: Marks the list as busy fetching more items, and draws a row after the last
96847
97048
  * item that says so.
96848
97049
  *
@@ -96865,13 +97066,14 @@ export type CustomElementsSolidJs = {
96865
97066
  * - `orientation`: Which way the list runs. `horizontal` lays the items out along a line
96866
97067
  * and scrolls it sideways: Left and Right move between items, the other
96867
97068
  * way round on a right-to-left page, and `estimate` is an item's width. A
96868
- * grid always runs down.
97069
+ * grid and a waterfall always run down.
96869
97070
  * - `reorderable`: Lets a reader move items, once `@fusion.dev/helix/virtual-list/reorder`
96870
97071
  * (or `@fusion.dev/helix-headless/virtual-list/reorder`) is imported: Alt
96871
97072
  * with an arrow moves the row the keys are on, and a pointer drags a row.
96872
97073
  * The list moves no item itself: you move your `items` on `helix-reorder`.
96873
97074
  * Without that import it does nothing, so a list that never moves items
96874
- * carries none of the code. A list of one column, without sections.
97075
+ * carries none of the code. A list of one column, without sections or a
97076
+ * waterfall.
96875
97077
  * - `section-field`/`sectionField`: The field of each item that names its section, as a key or a path of
96876
97078
  * keys. Set, the items are drawn in sections: a header, then the items, in
96877
97079
  * an element with the `group` role that the header names. A section starts