@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.
@@ -7132,6 +7132,10 @@
7132
7132
  "description": "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`.",
7133
7133
  "name": "bar-end-negative"
7134
7134
  },
7135
+ {
7136
+ "description": "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`.",
7137
+ "name": "bar-negative"
7138
+ },
7135
7139
  {
7136
7140
  "description": "The far stop of a bar's gradient, where one is used.",
7137
7141
  "name": "bar-wash-end"
@@ -31988,9 +31992,34 @@
31988
31992
  "kind": "javascript-module",
31989
31993
  "path": "src/code-block/root/code-block-root.ts",
31990
31994
  "declarations": [
31995
+ {
31996
+ "kind": "function",
31997
+ "name": "registerHighlighter",
31998
+ "return": {
31999
+ "type": {
32000
+ "text": "void"
32001
+ }
32002
+ },
32003
+ "parameters": [
32004
+ {
32005
+ "name": "highlighter",
32006
+ "type": {
32007
+ "text": "CodeBlockHighlighter | undefined"
32008
+ }
32009
+ },
32010
+ {
32011
+ "name": "sheet",
32012
+ "optional": true,
32013
+ "type": {
32014
+ "text": "CSSResult"
32015
+ }
32016
+ }
32017
+ ],
32018
+ "description": "Gives every Code Block of both tiers a highlighter, for the blocks that set\nno `highlight` of their own, and the sheet that colors what it returns.\n\n**Opt-in, so a page that shows plain code carries no grammar.** Code Block\nships none: a grammar is the larger part of any highlighter, and a block\nthat registers one for every page makes every page pay for it. A page that\nwants color imports one entry that calls this, such as\n`@fusion.dev/helix-sandbox/code-block`, which reads `css`, `html`, `js`,\n`jsx`, `sh`, `ts` and `tsx` with the sandbox's Lezer grammars and colors\nthem from the `--helix-color-syntax-*` tokens.\n\nA block's own `highlight` wins over this. Blocks already on the page draw\nagain with it, and every block built after has it. `undefined` takes it\naway again."
32019
+ },
31991
32020
  {
31992
32021
  "kind": "class",
31993
- "description": "Renders a `<pre><code>` pair: `pre` keeps the whitespace, and `code` marks it\nas code. Long lines scroll inside the block and do not wrap, because a line\nbreak can be significant in code.\n\nA copy button is on by default. Set `no-copy` to remove it. The button copies\nthe slotted text, so there is no second copy of the code to keep in sync.\n\nFor a fragment of code inside a sentence, use `Code`.\n\nSet `line-numbers` to number the lines in a gutter beside the code, hidden\nfrom the accessibility tree and left out of a copy. Set `mark-lines` to\nmark lines a reader should look at, such as `2, 4-6`: the block draws a\nband behind each run, placed where the lines are laid out, so it follows a\nhighlighter's markup and lines that wrap. `added-lines` and\n`removed-lines` mark lines the same way as inserted and deleted, as\nExpressive Code's `ins` and `del` do, in code that is not a diff. The bands\nare drawn and hidden from screen readers, so say in the text around the\nblock what a marked line means. Set `wrap` to wrap long lines\nrather than scroll them; a gutter then numbers each line where it starts.\nSet `wrappable` for a button in the header that turns `wrap` on and off,\npressed while the lines wrap.\n\nThe header holds the name, the `actions` slot, and the copy button. Slot a\ncontrol into `actions`, such as a button that sets `wrap` or one that opens\nthe code in an editor, and the block draws a header for it even with no\nname. `copy-icon` and `copied-icon` replace the copy button's two icons. Set `highlight` to a\nfunction that turns the code into highlighted markup, such as one wrapping\nShiki or Prism, and the block draws what it returns; it is handed the\nblock's `language`, so one function serves every block. The code stays in\nthe slot, so the copy button and the page's own text are the code as\nwritten.\n\nSet `expandable` on a block whose height is capped, such as by\n`--code-block-max-block-size`, and a button under it shows every line and\nthen fewer again, as a docs site's long example does. The button is drawn\nonly while the cap hides something, says whether the block is expanded with\n`aria-expanded`, names the block it opens with `aria-controls`, and the block\ncarries `:state(expanded)` while it is.\n\nSet `diff` to show a change. Put a unified diff, the output of `git diff` or\n`diff -u`, in the same slot, and the block draws the lines it added and\nremoved. The block never computes a diff itself. Line numbers come from the\nhunk headers and are hidden from the accessibility tree. Changed lines are\n`<ins>` and `<del>` with the `+` and `-` kept as text, so the change does not\ndepend on color. Where a removed line is paired with the added line that\nreplaced it, the words each does not share with the other are the `changed`\npart, so the eye goes to what changed within the line. Each file in the patch is its own block under its own name,\nand its copy button copies the new version of the file. `variant=\"split\"`\nshows the old version beside the new, each removal opposite its replacement.\n`context-lines` folds each long run of unchanged lines, keeping that many\nbeside each change, behind a button that shows them and hides them again,\nas a code host draws a diff written with more context than a reader needs.\n\n**A block that scrolls is a tab stop.** While its lines run past its width or\nits cap, the scroller is a region named for the block, such as \"Code,\napp.ts\", that Tab reaches, so a keyboard scrolls it with the arrow keys in\nevery browser. Chromium and Firefox make a scrolling box focusable on their\nown, and Safari does not. A block that fits is no stop at all.\n\n**The code the block draws is marked untranslated**, `translate=\"no\"` on\nits `<pre>`, so a page translator leaves highlighted lines and a diff as\nwritten. Code in the slot takes its translation mode from the element, which\nwrites nothing onto itself, so set `translate=\"no\"` on the element to keep a\ntranslator off plain code too.\n\nOn the server, the slot renders as ordinary code, so a diff first appears as\nthe patch text in a `<pre>`. The client makes the same first render, which\nkeeps hydration clean, and draws the diff once it can read the content. Diff\nmode is experimental. The rest of the family is stable.\n\n**Several blocks are files**, one shown at a time under a row of tabs, as\nSandbox shows its source panes. Put Code Blocks in the default slot of a\nCode Block, and each is a file named on its tab by its `label` or, without\none, its `language`. `file` holds the name of the file shown. The tabs are a\ntab list: the arrow keys move to a tab and show its file, the two swapping\non a right-to-left page, and Home and End go to the first and the last.\nChoosing one sends `helix-before-change` with the file's name, which you can\ncancel, and `change` once `file` holds it. The files not shown carry\n`hidden`, and the one shown draws no name of its own, its tab naming it. One\nblock draws no tabs. A server cannot see the blocks inside, so the client\ndraws the tabs once it upgrades.",
32022
+ "description": "Renders a `<pre><code>` pair: `pre` keeps the whitespace, and `code` marks it\nas code. Long lines scroll inside the block and do not wrap, because a line\nbreak can be significant in code.\n\nA copy button is on by default. Set `no-copy` to remove it. The button copies\nthe slotted text, so there is no second copy of the code to keep in sync.\n\nFor a fragment of code inside a sentence, use `Code`.\n\nSet `line-numbers` to number the lines in a gutter beside the code, hidden\nfrom the accessibility tree and left out of a copy. Set `mark-lines` to\nmark lines a reader should look at, such as `2, 4-6`: the block draws a\nband behind each run, placed where the lines are laid out, so it follows a\nhighlighter's markup and lines that wrap. `added-lines` and\n`removed-lines` mark lines the same way as inserted and deleted, as\nExpressive Code's `ins` and `del` do, in code that is not a diff. The bands\nare drawn and hidden from screen readers, so say in the text around the\nblock what a marked line means. Set `wrap` to wrap long lines\nrather than scroll them; a gutter then numbers each line where it starts.\nSet `wrappable` for a button in the header that turns `wrap` on and off,\npressed while the lines wrap.\n\nThe header holds the name, the `actions` slot, and the copy button. Slot a\ncontrol into `actions`, such as a button that sets `wrap` or one that opens\nthe code in an editor, and the block draws a header for it even with no\nname. `copy-icon` and `copied-icon` replace the copy button's two icons. Set `highlight` to a\nfunction that turns the code into highlighted markup, such as one wrapping\nShiki or Prism, and the block draws what it returns; it is handed the\nblock's `language`, so one function serves every block. The code stays in\nthe slot, so the copy button and the page's own text are the code as\nwritten.\n\n**Code Block ships no grammar**, so plain code costs you no parser. To color\ncode without a highlighter of your own, import one more entry beside the\nblock's. It colors every block by its `language` (`css`, `html`, `js`,\n`jsx`, `sh`, `ts`, or `tsx`) with the Lezer grammars of the sandbox's\neditor, in the editor's colors:\n\n```js\nimport '@fusion.dev/helix/code-block'\nimport '@fusion.dev/helix-sandbox/code-block'\n```\n\nThat entry calls `registerHighlighter`, which you can also call yourself to\ngive every block one highlighter of your own.\n\nSet `expandable` on a block whose height is capped, such as by\n`--code-block-max-block-size`, and a button under it shows every line and\nthen fewer again, as a docs site's long example does. The button is drawn\nonly while the cap hides something, says whether the block is expanded with\n`aria-expanded`, names the block it opens with `aria-controls`, and the block\ncarries `:state(expanded)` while it is.\n\nSet `diff` to show a change. Put a unified diff, the output of `git diff` or\n`diff -u`, in the same slot, and the block draws the lines it added and\nremoved. The block never computes a diff itself. Line numbers come from the\nhunk headers and are hidden from the accessibility tree. Changed lines are\n`<ins>` and `<del>` with the `+` and `-` kept as text, so the change does not\ndepend on color. Where a removed line is paired with the added line that\nreplaced it, the words each does not share with the other are the `changed`\npart, so the eye goes to what changed within the line. Each file in the patch is its own block under its own name,\nand its copy button copies the new version of the file. `variant=\"split\"`\nshows the old version beside the new, each removal opposite its replacement.\n`context-lines` folds each long run of unchanged lines, keeping that many\nbeside each change, behind a button that shows them and hides them again,\nas a code host draws a diff written with more context than a reader needs.\n\n**A block that scrolls is a tab stop.** While its lines run past its width or\nits cap, the scroller is a region named for the block, such as \"Code,\napp.ts\", that Tab reaches, so a keyboard scrolls it with the arrow keys in\nevery browser. Chromium and Firefox make a scrolling box focusable on their\nown, and Safari does not. A block that fits is no stop at all.\n\n**The code the block draws is marked untranslated**, `translate=\"no\"` on\nits `<pre>`, so a page translator leaves highlighted lines and a diff as\nwritten. Code in the slot takes its translation mode from the element, which\nwrites nothing onto itself, so set `translate=\"no\"` on the element to keep a\ntranslator off plain code too.\n\nOn the server, the slot renders as ordinary code, so a diff first appears as\nthe patch text in a `<pre>`. The client makes the same first render, which\nkeeps hydration clean, and draws the diff once it can read the content. Diff\nmode is experimental. The rest of the family is stable.\n\n**Several blocks are files**, one shown at a time under a row of tabs, as\nSandbox shows its source panes. Put Code Blocks in the default slot of a\nCode Block, and each is a file named on its tab by its `label` or, without\none, its `language`. `file` holds the name of the file shown. The tabs are a\ntab list: the arrow keys move to a tab and show its file, the two swapping\non a right-to-left page, and Home and End go to the first and the last.\nChoosing one sends `helix-before-change` with the file's name, which you can\ncancel, and `change` once `file` holds it. The files not shown carry\n`hidden`, and the one shown draws no name of its own, its tab naming it. One\nblock draws no tabs. A server cannot see the blocks inside, so the client\ndraws the tabs once it upgrades.",
31994
32023
  "name": "HelixHeadlessCodeBlock",
31995
32024
  "cssProperties": [
31996
32025
  {
@@ -32397,7 +32426,7 @@
32397
32426
  "type": {
32398
32427
  "text": "(code: string, language: string) => string | undefined"
32399
32428
  },
32400
- "description": "Turns the code into highlighted markup, which the block draws in place of\nthe plain text.\n\nCalled with the code as written and the block's `language`, and returning\nHTML, such as the output of Shiki's `codeToHtml` or Prism's `highlight`.\nOne function serves every block on a page, each block saying its own\nlanguage:\n\n```js\nfor (const block of document.querySelectorAll('helix-code-block')) {\n block.highlight = (code, lang) => codeToHtml(code, { lang, theme: 'github-light' })\n}\n```\n\n**The markup is drawn as given**, so it has to escape the code it was\nhanded, which those highlighters do. A `<pre>` and `<code>` around the\nwhole of it, which Shiki writes, are taken off, so the lines sit level\nwith the gutter's numbers and the block keeps one tab stop. The code stays\nin the slot, so the copy button copies it as written and a reader without\nthe script still has it. Not called on a server, which has no code to\nread, nor for a diff."
32429
+ "description": "Turns the code into highlighted markup, which the block draws in place of\nthe plain text.\n\nCalled with the code as written and the block's `language`, and returning\nHTML, such as the output of Shiki's `codeToHtml` or Prism's `highlight`.\nOne function serves every block on a page, each block saying its own\nlanguage:\n\n```js\nfor (const block of document.querySelectorAll('helix-code-block')) {\n block.highlight = (code, lang) => codeToHtml(code, { lang, theme: 'github-light' })\n}\n```\n\n**The markup is drawn as given**, so it has to escape the code it was\nhanded, which those highlighters do. A `<pre>` and `<code>` around the\nwhole of it, which Shiki writes, are taken off, so the lines sit level\nwith the gutter's numbers and the block keeps one tab stop. The code stays\nin the slot, so the copy button copies it as written and a reader without\nthe script still has it. Not called on a server, which has no code to\nread, nor for a diff.\n\nAbsent, the block draws with the highlighter `registerHighlighter` gave\nevery block, where an entry such as `@fusion.dev/helix-sandbox/code-block`\nregistered one, and plain otherwise."
32401
32430
  },
32402
32431
  {
32403
32432
  "kind": "field",
@@ -33788,6 +33817,14 @@
33788
33817
  }
33789
33818
  ],
33790
33819
  "exports": [
33820
+ {
33821
+ "kind": "js",
33822
+ "name": "registerHighlighter",
33823
+ "declaration": {
33824
+ "name": "registerHighlighter",
33825
+ "module": "src/code-block/root/code-block-root.ts"
33826
+ }
33827
+ },
33791
33828
  {
33792
33829
  "kind": "js",
33793
33830
  "name": "HelixHeadlessCodeBlock",
@@ -80378,7 +80415,7 @@
80378
80415
  },
80379
80416
  "privacy": "private",
80380
80417
  "default": "-1",
80381
- "description": "Where a range taken in with Shift starts: the cell last pressed, or none."
80418
+ "description": "Where a range taken in with Shift starts: the row of the table whose cell\nwas last pressed, or none.\n\n**The row, and not the cell's place among those drawn.** A narrow strip\ndraws the newest whole columns, so a resize that drops or adds a column\nmoves every cell's place, and an anchor kept as a place started the next\nrange on another day."
80382
80419
  },
80383
80420
  {
80384
80421
  "kind": "field",
@@ -80586,6 +80623,16 @@
80586
80623
  "description": "The readings actually drawn, newest kept.\n\nThe tail rather than the head: a status strip that drops the newest days to\nkeep the oldest is answering a question nobody asked.",
80587
80624
  "readonly": true
80588
80625
  },
80626
+ {
80627
+ "kind": "field",
80628
+ "name": "dropped",
80629
+ "type": {
80630
+ "text": "number"
80631
+ },
80632
+ "privacy": "private",
80633
+ "description": "How many of the oldest rows a narrow strip leaves undrawn.",
80634
+ "readonly": true
80635
+ },
80589
80636
  {
80590
80637
  "kind": "field",
80591
80638
  "name": "readings",
@@ -85781,6 +85828,14 @@
85781
85828
  "module": "src/megamenu/index.js"
85782
85829
  }
85783
85830
  },
85831
+ {
85832
+ "kind": "js",
85833
+ "name": "*",
85834
+ "declaration": {
85835
+ "name": "*",
85836
+ "module": "src/menu/filter/index.js"
85837
+ }
85838
+ },
85784
85839
  {
85785
85840
  "kind": "js",
85786
85841
  "name": "*",
@@ -111666,6 +111721,392 @@
111666
111721
  }
111667
111722
  ]
111668
111723
  },
111724
+ {
111725
+ "kind": "javascript-module",
111726
+ "path": "src/menu/filter/index.ts",
111727
+ "declarations": [],
111728
+ "exports": [
111729
+ {
111730
+ "kind": "js",
111731
+ "name": "filterMenu",
111732
+ "declaration": {
111733
+ "name": "filterMenu",
111734
+ "module": "./menu-filter.js"
111735
+ }
111736
+ },
111737
+ {
111738
+ "kind": "js",
111739
+ "name": "MenuFilterController",
111740
+ "declaration": {
111741
+ "name": "MenuFilterController",
111742
+ "module": "./menu-filter.js"
111743
+ }
111744
+ }
111745
+ ]
111746
+ },
111747
+ {
111748
+ "kind": "javascript-module",
111749
+ "path": "src/menu/filter/menu-filter.ts",
111750
+ "declarations": [
111751
+ {
111752
+ "kind": "function",
111753
+ "name": "drawFilter",
111754
+ "return": {
111755
+ "type": {
111756
+ "text": "TemplateResult"
111757
+ }
111758
+ },
111759
+ "parameters": [
111760
+ {
111761
+ "name": "host",
111762
+ "type": {
111763
+ "text": "HelixHeadlessMenu"
111764
+ }
111765
+ },
111766
+ {
111767
+ "name": "rows",
111768
+ "type": {
111769
+ "text": "TemplateResult"
111770
+ }
111771
+ },
111772
+ {
111773
+ "name": "busy",
111774
+ "type": {
111775
+ "text": "string | typeof nothing"
111776
+ }
111777
+ },
111778
+ {
111779
+ "name": "onInput",
111780
+ "type": {
111781
+ "text": "(event: Event) => void"
111782
+ }
111783
+ }
111784
+ ],
111785
+ "description": "The field and then the `menu`: a menu holds menu items and nothing else, so\nthe field stands beside it, as React Aria's `Autocomplete` puts its search\nfield beside its menu. The menu calls it through its filter, so the parts it\nwrites are the menu's."
111786
+ },
111787
+ {
111788
+ "kind": "class",
111789
+ "description": "Narrows a `filterable` menu's rows as the reader types in a field above\nthem, with focus staying in the field and the highlight moving through the\nrows that are left.\n\n**Its own entry**, `@fusion.dev/helix-headless/menu/filter`, so a menu that\nnever filters carries none of this. Importing the entry gives every menu of\nthe tier one, and `filterable` turns it on. Menu's description says what a\nreader gets; this is the part of it the menu does not hold:\n\n- the field and the `menu` after it, which the menu draws in its surface\n- which rows the filter keeps, and the words each matched, marked\n- the keys the field answers: Up and Down move the highlight, Enter presses\n the highlighted row, and Escape clears the filter before it closes\n- `helix-filter`, sent as the text changes, which a listener cancels to\n keep every row showing\n- how many rows are kept, or `no-results-text`, said in the live region\n\nThe styled tier's entry hands in the sheet that draws the field, which the\nmenu adopts while it filters.",
111790
+ "name": "MenuFilterController",
111791
+ "members": [
111792
+ {
111793
+ "kind": "field",
111794
+ "name": "host",
111795
+ "type": {
111796
+ "text": "HelixHeadlessMenu"
111797
+ },
111798
+ "privacy": "private",
111799
+ "readonly": true,
111800
+ "default": "host"
111801
+ },
111802
+ {
111803
+ "kind": "field",
111804
+ "name": "inside",
111805
+ "type": {
111806
+ "text": "Inside"
111807
+ },
111808
+ "privacy": "private",
111809
+ "readonly": true,
111810
+ "description": "The same menu, read through what it keeps to itself."
111811
+ },
111812
+ {
111813
+ "kind": "field",
111814
+ "name": "sheet",
111815
+ "type": {
111816
+ "text": "CSSResult | undefined"
111817
+ },
111818
+ "description": "The sheet the menu adopts while it filters, from the styled tier.",
111819
+ "default": "sheet"
111820
+ },
111821
+ {
111822
+ "kind": "field",
111823
+ "name": "highlighted",
111824
+ "type": {
111825
+ "text": "Row | undefined"
111826
+ },
111827
+ "description": "The row the keys reached while focus stays in the field."
111828
+ },
111829
+ {
111830
+ "kind": "field",
111831
+ "name": "page",
111832
+ "type": {
111833
+ "text": "Row | null"
111834
+ },
111835
+ "privacy": "private",
111836
+ "default": "null",
111837
+ "description": "The submenu the filter narrows, or null for the top page."
111838
+ },
111839
+ {
111840
+ "kind": "field",
111841
+ "name": "refused",
111842
+ "type": {
111843
+ "text": "string | undefined"
111844
+ },
111845
+ "privacy": "private",
111846
+ "description": "The filter a listener refused, which narrows nothing."
111847
+ },
111848
+ {
111849
+ "kind": "field",
111850
+ "name": "seen",
111851
+ "type": {
111852
+ "text": "string"
111853
+ },
111854
+ "privacy": "private",
111855
+ "default": "''",
111856
+ "description": "The filter the last update saw, so a change moves a highlight it hid."
111857
+ },
111858
+ {
111859
+ "kind": "method",
111860
+ "name": "hostConnected",
111861
+ "return": {
111862
+ "type": {
111863
+ "text": "void"
111864
+ }
111865
+ }
111866
+ },
111867
+ {
111868
+ "kind": "method",
111869
+ "name": "hostDisconnected",
111870
+ "return": {
111871
+ "type": {
111872
+ "text": "void"
111873
+ }
111874
+ }
111875
+ },
111876
+ {
111877
+ "kind": "field",
111878
+ "name": "field",
111879
+ "type": {
111880
+ "text": "HTMLInputElement | null"
111881
+ },
111882
+ "description": "The field, while it is drawn.",
111883
+ "readonly": true
111884
+ },
111885
+ {
111886
+ "kind": "field",
111887
+ "name": "filtering",
111888
+ "type": {
111889
+ "text": "boolean"
111890
+ },
111891
+ "description": "Whether the filter is narrowing the rows.",
111892
+ "readonly": true
111893
+ },
111894
+ {
111895
+ "kind": "method",
111896
+ "name": "kept",
111897
+ "return": {
111898
+ "type": {
111899
+ "text": "boolean"
111900
+ }
111901
+ },
111902
+ "parameters": [
111903
+ {
111904
+ "name": "row",
111905
+ "type": {
111906
+ "text": "Row"
111907
+ }
111908
+ }
111909
+ ],
111910
+ "description": "Whether the filter keeps a row: one of another page, or one whose words it matches."
111911
+ },
111912
+ {
111913
+ "kind": "field",
111914
+ "name": "keptRows",
111915
+ "type": {
111916
+ "text": "Row[]"
111917
+ },
111918
+ "privacy": "private",
111919
+ "description": "The rows of the page the filter narrows that it keeps.",
111920
+ "readonly": true
111921
+ },
111922
+ {
111923
+ "kind": "method",
111924
+ "name": "request",
111925
+ "return": {
111926
+ "type": {
111927
+ "text": "void"
111928
+ }
111929
+ },
111930
+ "parameters": [
111931
+ {
111932
+ "name": "value",
111933
+ "type": {
111934
+ "text": "string"
111935
+ }
111936
+ }
111937
+ ],
111938
+ "description": "Asks to filter by new text, which the field and `filter` then hold. A\nrefusal keeps every row showing, for a page that narrows them itself."
111939
+ },
111940
+ {
111941
+ "kind": "method",
111942
+ "name": "by",
111943
+ "privacy": "private",
111944
+ "return": {
111945
+ "type": {
111946
+ "text": "void"
111947
+ }
111948
+ },
111949
+ "parameters": [
111950
+ {
111951
+ "name": "value",
111952
+ "type": {
111953
+ "text": "string"
111954
+ }
111955
+ }
111956
+ ],
111957
+ "description": "Filters by what the reader typed, and highlights the first row kept."
111958
+ },
111959
+ {
111960
+ "kind": "method",
111961
+ "name": "highlight",
111962
+ "return": {
111963
+ "type": {
111964
+ "text": "void"
111965
+ }
111966
+ },
111967
+ "parameters": [
111968
+ {
111969
+ "name": "row",
111970
+ "type": {
111971
+ "text": "Row | undefined"
111972
+ }
111973
+ }
111974
+ ],
111975
+ "description": "Puts the highlight on a row, which the field names with\n`aria-activedescendant`. An element reference, because the field is in\nthe menu's shadow root and the row in the tree around it, the one\ndirection a reference crosses."
111976
+ },
111977
+ {
111978
+ "kind": "method",
111979
+ "name": "keydown",
111980
+ "return": {
111981
+ "type": {
111982
+ "text": "boolean"
111983
+ }
111984
+ },
111985
+ "parameters": [
111986
+ {
111987
+ "name": "event",
111988
+ "type": {
111989
+ "text": "KeyboardEvent"
111990
+ }
111991
+ },
111992
+ {
111993
+ "name": "items",
111994
+ "type": {
111995
+ "text": "Row[]"
111996
+ }
111997
+ },
111998
+ {
111999
+ "name": "at",
112000
+ "type": {
112001
+ "text": "number"
112002
+ }
112003
+ }
112004
+ ],
112005
+ "description": "Answers a key the field takes, and returns whether it did: Up and Down\nmove the highlight through the rows kept, Enter presses the highlighted\nrow, and Escape over text empties the filter, the next one going back or\nclosing."
112006
+ },
112007
+ {
112008
+ "kind": "field",
112009
+ "name": "handleMouseDown",
112010
+ "privacy": "private",
112011
+ "readonly": true,
112012
+ "description": "Keeps focus in the field through a press on a row or the way back, as\nReact Aria's virtual focus does: the press still chooses."
112013
+ },
112014
+ {
112015
+ "kind": "field",
112016
+ "name": "handleInput",
112017
+ "privacy": "private",
112018
+ "readonly": true
112019
+ },
112020
+ {
112021
+ "kind": "method",
112022
+ "name": "status",
112023
+ "return": {
112024
+ "type": {
112025
+ "text": "TemplateResult | undefined"
112026
+ }
112027
+ },
112028
+ "description": "What a filter that keeps no rows shows, or nothing where it keeps some.\n\nIt sets what the live region says as well: `no-results-text` where the\nfilter keeps no rows, and how many it keeps where it keeps some, as React\nAria and Web Awesome say the count. Only \"No matches\" was said before\nthat, so a filter that kept forty rows and one that kept one sounded the\nsame."
112029
+ },
112030
+ {
112031
+ "kind": "method",
112032
+ "name": "drawFilter",
112033
+ "return": {
112034
+ "type": {
112035
+ "text": "TemplateResult"
112036
+ }
112037
+ },
112038
+ "parameters": [
112039
+ {
112040
+ "name": "rows",
112041
+ "type": {
112042
+ "text": "TemplateResult"
112043
+ }
112044
+ },
112045
+ {
112046
+ "name": "busy",
112047
+ "type": {
112048
+ "text": "string | typeof nothing"
112049
+ }
112050
+ }
112051
+ ],
112052
+ "description": "The field and then the `menu`, for the menu to draw in its surface. See `drawFilter`."
112053
+ }
112054
+ ],
112055
+ "helix": {}
112056
+ },
112057
+ {
112058
+ "kind": "function",
112059
+ "name": "filterMenu",
112060
+ "return": {
112061
+ "type": {
112062
+ "text": "void"
112063
+ }
112064
+ },
112065
+ "parameters": [
112066
+ {
112067
+ "name": "element",
112068
+ "type": {
112069
+ "text": "typeof HelixHeadlessMenu"
112070
+ }
112071
+ },
112072
+ {
112073
+ "name": "sheet",
112074
+ "optional": true,
112075
+ "type": {
112076
+ "text": "CSSResult"
112077
+ }
112078
+ }
112079
+ ],
112080
+ "description": "Gives every menu of a class a `MenuFilterController`, which `filterable`\nturns on.\n\nThe entries call it for their own tier's class: the headless entry for\n`HelixHeadlessMenu`, and the styled one for `HelixMenu`, with the sheet that\ndraws the field. **Menus already on the page are given one too**, and drawn\nagain, so a page that imports the menu and then this entry gets the field."
112081
+ }
112082
+ ],
112083
+ "exports": [
112084
+ {
112085
+ "kind": "js",
112086
+ "name": "drawFilter",
112087
+ "declaration": {
112088
+ "name": "drawFilter",
112089
+ "module": "src/menu/filter/menu-filter.ts"
112090
+ }
112091
+ },
112092
+ {
112093
+ "kind": "js",
112094
+ "name": "MenuFilterController",
112095
+ "declaration": {
112096
+ "name": "MenuFilterController",
112097
+ "module": "src/menu/filter/menu-filter.ts"
112098
+ }
112099
+ },
112100
+ {
112101
+ "kind": "js",
112102
+ "name": "filterMenu",
112103
+ "declaration": {
112104
+ "name": "filterMenu",
112105
+ "module": "src/menu/filter/menu-filter.ts"
112106
+ }
112107
+ }
112108
+ ]
112109
+ },
111669
112110
  {
111670
112111
  "kind": "javascript-module",
111671
112112
  "path": "src/menu/index.ts",
@@ -112722,7 +113163,7 @@
112722
113163
  "declarations": [
112723
113164
  {
112724
113165
  "kind": "class",
112725
- "description": "The trigger is slotted and stays your own element, as with the tooltip. The\nmenu renders its surface in the top layer with the popover API, so an\nancestor with `overflow: hidden` does not clip it and it needs no `z-index`.\n\nSlot a `helix-button` or `helix-icon-button` as the trigger, and the menu\ntells it that it opens a menu and whether the menu is open, inside its own\nshadow root. On a plain element, such as a `<button>`, the menu writes\n`aria-haspopup=\"menu\"` and `aria-expanded`, from a frame after its own first\nrender, so a server's markup is never changed while a framework hydrates it.\nIt never writes `aria-expanded` where you wrote it yourself.\n\nSubmenus drill down by default. A submenu replaces the panel's content, and a\nback row returns to the previous page. One panel stays inside a narrow\nwindow, and works on touch screens, which have no hover. Focus follows a\nmouse resting on a row in either mode, and a drilled page is a `menu` named\nby the row that opened it.\n\n**`submenus=\"flyout\"` opens each submenu in a panel of its own beside its\nrow**, as React Aria's `SubmenuTrigger` and Radix's `Sub` do. Resting the\npointer on the row opens it, and a pointer crossing toward the open panel\nover the rows between keeps it open, as Radix's grace area does. Right Arrow\nopens a row's submenu on its first row, and Left Arrow or Escape closes it\nand returns focus to the row, the two arrows swapping on a right-to-left\npage. The row says `aria-expanded`, and the panel is a `menu` named by the\nrow.\n\nThe root holds which page is open, because only one page shows at a time. It\nsets this on items as a property, never as an attribute. An attribute written\nonto your element after it upgrades causes a hydration mismatch.\n\nGroup rows under a heading with `Menu.Section`, which is a `group` named by\nits heading. Between runs of rows, a `<helix-divider>` is a separator a\nscreen reader announces.\n\nKeys: Enter, Space or Down Arrow on the trigger opens the menu on its first\nrow, and Up Arrow on its last. In the menu, Up and Down Arrow move between\nrows, Home and End go to the first and the last, a typed letter moves to\nthe next row whose name starts with it, Enter and Space choose (Space on a\nchoice row changes it and leaves the menu open), Right Arrow\nopens a row's submenu and Left Arrow goes back, the two swapping on a\nright-to-left page. Left Arrow on the top page does nothing. Escape closes\nthe menu and returns focus to the trigger. Tab closes it and moves on.\n\nWhile it is open, the surface carries the trigger's width as\n`--floating-anchor-inline-size` and the room left below it as\n`--floating-available-block-size`, as Radix's dropdown menu publishes its\ntrigger's width, for a menu as wide as its trigger:\n`helix-menu::part(surface) { min-inline-size: var(--floating-anchor-inline-size) }`.\n\n**The choices in one place.** `checkedValues` holds the values of the rows\nthat are checked, anywhere in the menu, and setting it checks exactly\nthose rows, as React Aria's `selectedKeys` does. `change` is sent on the\nmenu when a reader's choice changes it.\n\nWith `context`, the trigger is an area and the menu is its context menu: a\nright-click, a long press, Shift+F10 or the menu key over the area opens it\nat the pointer, or at the area's corner from the keyboard, as Radix's context\nmenu does. A press on the area does not open it, and closing it returns focus\nto where it was. A touch or a pen held still on the area opens it too, on\nevery browser, since iOS sends no `contextmenu` for one.\n\n**A trigger with its own action.** With `open-on=\"long-press\"`, a press on\nthe trigger is the trigger's own, and a press held for half a second opens\nthe menu, as React Aria's `trigger=\"longPress\"` does. Alt+Down or Alt+Up\nopens it from the keyboard, and the trigger is described by\n`long-press-label`, which says so.\n\n**A filter field.** With `filterable`, the menu opens with focus in a field\nabove its rows, and typing narrows the rows of the page the keys move in,\nas React Aria's `Autocomplete` around a `Menu` does. A row is kept where its\nwords hold the filter, in any case, or where `filterMatch` says so. Each\npage starts unfiltered, and the filter is cleared as the menu closes. Where\ntyping keeps no row, the menu shows `no-results-text`. Focus stays in the\nfield: Up and Down Arrow move the highlight through the rows that are left,\nEnter chooses the highlighted row, Right Arrow opens its submenu, Left Arrow\non a submenu goes back, and Escape clears the filter and then closes the\nmenu. A screen reader hears how many rows the filter keeps\n(`results-label`). Home, End and the other keys move the caret and type. The field names\nthe highlighted row with `aria-activedescendant`, and the rows are a `menu`\nafter the field. Cancel `helix-filter` to keep every row\nshowing and narrow the rows yourself, such as by replacing them with rows\nfrom a server.",
113166
+ "description": "The trigger is slotted and stays your own element, as with the tooltip. The\nmenu renders its surface in the top layer with the popover API, so an\nancestor with `overflow: hidden` does not clip it and it needs no `z-index`.\n\nSlot a `helix-button` or `helix-icon-button` as the trigger, and the menu\ntells it that it opens a menu and whether the menu is open, inside its own\nshadow root. On a plain element, such as a `<button>`, the menu writes\n`aria-haspopup=\"menu\"` and `aria-expanded`, from a frame after its own first\nrender, so a server's markup is never changed while a framework hydrates it.\nIt never writes `aria-expanded` where you wrote it yourself.\n\nSubmenus drill down by default. A submenu replaces the panel's content, and a\nback row returns to the previous page. One panel stays inside a narrow\nwindow, and works on touch screens, which have no hover. Focus follows a\nmouse resting on a row in either mode, and a drilled page is a `menu` named\nby the row that opened it.\n\n**`submenus=\"flyout\"` opens each submenu in a panel of its own beside its\nrow**, as React Aria's `SubmenuTrigger` and Radix's `Sub` do. Resting the\npointer on the row opens it, and a pointer crossing toward the open panel\nover the rows between keeps it open, as Radix's grace area does. Right Arrow\nopens a row's submenu on its first row, and Left Arrow or Escape closes it\nand returns focus to the row, the two arrows swapping on a right-to-left\npage. The row says `aria-expanded`, and the panel is a `menu` named by the\nrow.\n\nThe root holds which page is open, because only one page shows at a time. It\nsets this on items as a property, never as an attribute. An attribute written\nonto your element after it upgrades causes a hydration mismatch.\n\nGroup rows under a heading with `Menu.Section`, which is a `group` named by\nits heading. Between runs of rows, a `<helix-divider>` is a separator a\nscreen reader announces.\n\nKeys: Enter, Space or Down Arrow on the trigger opens the menu on its first\nrow, and Up Arrow on its last. In the menu, Up and Down Arrow move between\nrows, Home and End go to the first and the last, a typed letter moves to\nthe next row whose name starts with it, Enter and Space choose (Space on a\nchoice row changes it and leaves the menu open), Right Arrow\nopens a row's submenu and Left Arrow goes back, the two swapping on a\nright-to-left page. Left Arrow on the top page does nothing. Escape closes\nthe menu and returns focus to the trigger. Tab closes it and moves on.\n\nWhile it is open, the surface carries the trigger's width as\n`--floating-anchor-inline-size` and the room left below it as\n`--floating-available-block-size`, as Radix's dropdown menu publishes its\ntrigger's width, for a menu as wide as its trigger:\n`helix-menu::part(surface) { min-inline-size: var(--floating-anchor-inline-size) }`.\n\n**The choices in one place.** `checkedValues` holds the values of the rows\nthat are checked, anywhere in the menu, and setting it checks exactly\nthose rows, as React Aria's `selectedKeys` does. `change` is sent on the\nmenu when a reader's choice changes it.\n\nWith `context`, the trigger is an area and the menu is its context menu: a\nright-click, a long press, Shift+F10 or the menu key over the area opens it\nat the pointer, or at the area's corner from the keyboard, as Radix's context\nmenu does. A press on the area does not open it, and closing it returns focus\nto where it was. A touch or a pen held still on the area opens it too, on\nevery browser, since iOS sends no `contextmenu` for one.\n\n**A trigger with its own action.** With `open-on=\"long-press\"`, a press on\nthe trigger is the trigger's own, and a press held for half a second opens\nthe menu, as React Aria's `trigger=\"longPress\"` does. Alt+Down or Alt+Up\nopens it from the keyboard, and the trigger is described by\n`long-press-label`, which says so.\n\n**A filter field** is a separate import, `@fusion.dev/helix/menu/filter`, so\na menu that never filters carries none of its code:\n\n```js\nimport '@fusion.dev/helix/menu'\nimport '@fusion.dev/helix/menu/filter'\n```\n\nWith it imported and `filterable` set, the menu opens with focus in a field\nabove its rows, and typing narrows the rows of the page the keys move in,\nas React Aria's `Autocomplete` around a `Menu` does. A row is kept where its\nwords hold the filter, in any case, or where `filterMatch` says so. Each\npage starts unfiltered, and the filter is cleared as the menu closes. Where\ntyping keeps no row, the menu shows `no-results-text`. Focus stays in the\nfield: Up and Down Arrow move the highlight through the rows that are left,\nEnter chooses the highlighted row, Right Arrow opens its submenu, Left Arrow\non a submenu goes back, and Escape clears the filter and then closes the\nmenu. A screen reader hears how many rows the filter keeps\n(`results-label`). Home, End and the other keys move the caret and type. The field names\nthe highlighted row with `aria-activedescendant`, and the rows are a `menu`\nafter the field. Cancel `helix-filter` to keep every row\nshowing and narrow the rows yourself, such as by replacing them with rows\nfrom a server.",
112726
113167
  "name": "HelixHeadlessMenu",
112727
113168
  "cssProperties": [
112728
113169
  {
@@ -112889,7 +113330,7 @@
112889
113330
  "text": "boolean"
112890
113331
  },
112891
113332
  "default": "false",
112892
- "description": "Whether the menu shows a field above its rows that narrows them as the\nreader types, with focus staying in the field.",
113333
+ "description": "Whether the menu shows a field above its rows that narrows them as the\nreader types, with focus staying in the field, once\n`@fusion.dev/helix/menu/filter` (or `@fusion.dev/helix-headless/menu/filter`)\nis imported. Without that import it does nothing, so a menu that never\nfilters carries none of the filter's code, and a development build says\nwhich import is missing.",
112893
113334
  "attribute": "filterable"
112894
113335
  },
112895
113336
  {
@@ -113244,41 +113685,21 @@
113244
113685
  },
113245
113686
  {
113246
113687
  "kind": "field",
113247
- "name": "field",
113248
- "type": {
113249
- "text": "HTMLInputElement | null"
113250
- },
113251
- "privacy": "private",
113252
- "description": "The filter field, with `filterable`.",
113253
- "readonly": true
113254
- },
113255
- {
113256
- "kind": "field",
113257
- "name": "filterPage",
113258
- "type": {
113259
- "text": "HelixHeadlessMenuItem | null"
113260
- },
113261
- "privacy": "private",
113262
- "default": "null",
113263
- "description": "The submenu the filter narrows, or null for the top page."
113264
- },
113265
- {
113266
- "kind": "field",
113267
- "name": "refused",
113688
+ "name": "filterer",
113268
113689
  "type": {
113269
- "text": "string | undefined"
113690
+ "text": "MenuFilterController | undefined"
113270
113691
  },
113271
113692
  "privacy": "private",
113272
- "description": "The filter a listener refused, which narrows nothing."
113693
+ "description": "The filter `menu/filter` gives this menu, which `filterable` turns on.\n\nDeclared and never initialized, because the entry sets it from the\nconstructor Lit runs initializers in, which is before this class's own\nfields: an initializer here would set it back to `undefined`."
113273
113694
  },
113274
113695
  {
113275
113696
  "kind": "field",
113276
- "name": "filtering",
113697
+ "name": "filters",
113277
113698
  "type": {
113278
- "text": "boolean"
113699
+ "text": "MenuFilterController | undefined"
113279
113700
  },
113280
113701
  "privacy": "private",
113281
- "description": "Whether the filter is narrowing the rows.",
113702
+ "description": "The filter, while `filterable` is set and `menu/filter` is imported.",
113282
113703
  "readonly": true
113283
113704
  },
113284
113705
  {
@@ -113298,7 +113719,7 @@
113298
113719
  }
113299
113720
  }
113300
113721
  ],
113301
- "description": "Whether the filter keeps a row: one of another page, or one whose words it matches."
113722
+ "description": "Whether the filter keeps a row, which every row is without one."
113302
113723
  },
113303
113724
  {
113304
113725
  "kind": "method",
@@ -113317,41 +113738,7 @@
113317
113738
  }
113318
113739
  }
113319
113740
  ],
113320
- "description": "Asks to filter by new text, which the field and `filter` then hold. A\nrefusal keeps every row showing, for a page that narrows them itself."
113321
- },
113322
- {
113323
- "kind": "field",
113324
- "name": "handleFilterInput",
113325
- "privacy": "private",
113326
- "readonly": true
113327
- },
113328
- {
113329
- "kind": "method",
113330
- "name": "filterBy",
113331
- "privacy": "private",
113332
- "return": {
113333
- "type": {
113334
- "text": "void"
113335
- }
113336
- },
113337
- "parameters": [
113338
- {
113339
- "name": "value",
113340
- "type": {
113341
- "text": "string"
113342
- }
113343
- }
113344
- ],
113345
- "description": "Filters by what the reader typed, and highlights the first row kept."
113346
- },
113347
- {
113348
- "kind": "field",
113349
- "name": "highlighted",
113350
- "type": {
113351
- "text": "HelixHeadlessMenuItem | undefined"
113352
- },
113353
- "privacy": "private",
113354
- "description": "The row the keys reached while focus stays in the filter field."
113741
+ "description": "Asks to filter by new text. See `MenuFilterController.request`."
113355
113742
  },
113356
113743
  {
113357
113744
  "kind": "method",
@@ -113370,7 +113757,7 @@
113370
113757
  }
113371
113758
  }
113372
113759
  ],
113373
- "description": "Moves the reader to a row: focus, or with `filterable` the highlight,\nwhich the field names with `aria-activedescendant`. An element reference,\nbecause the field is in this shadow root and the row in the tree around\nit, the one direction a reference crosses."
113760
+ "description": "Moves the reader to a row: focus, or with a filter the highlight, focus\nstaying in the filter field."
113374
113761
  },
113375
113762
  {
113376
113763
  "kind": "field",
@@ -113616,13 +114003,6 @@
113616
114003
  "readonly": true,
113617
114004
  "description": "A press on the trigger starting: the start of a held one under\n`open-on=\"long-press\"`, or a touch or a pen held on a context menu's area."
113618
114005
  },
113619
- {
113620
- "kind": "field",
113621
- "name": "handleMouseDown",
113622
- "privacy": "private",
113623
- "readonly": true,
113624
- "description": "Keeps focus in the filter field through a press on a row or the way\nback, as React Aria's virtual focus does: the press still chooses."
113625
- },
113626
114006
  {
113627
114007
  "kind": "field",
113628
114008
  "name": "handlePointerMove",
@@ -114559,7 +114939,7 @@
114559
114939
  "text": "boolean"
114560
114940
  },
114561
114941
  "default": "false",
114562
- "description": "Whether the menu shows a field above its rows that narrows them as the\nreader types, with focus staying in the field.",
114942
+ "description": "Whether the menu shows a field above its rows that narrows them as the\nreader types, with focus staying in the field, once\n`@fusion.dev/helix/menu/filter` (or `@fusion.dev/helix-headless/menu/filter`)\nis imported. Without that import it does nothing, so a menu that never\nfilters carries none of the filter's code, and a development build says\nwhich import is missing.",
114563
114943
  "fieldName": "filterable"
114564
114944
  },
114565
114945
  {
@@ -172604,6 +172984,19 @@
172604
172984
  "attribute": "mode",
172605
172985
  "reflects": true
172606
172986
  },
172987
+ {
172988
+ "kind": "field",
172989
+ "name": "nowLabel",
172990
+ "type": {
172991
+ "text": "string"
172992
+ },
172993
+ "default": "'Now'",
172994
+ "description": "The words on the list's button that chooses the current time, drawn with\n`show-now`.",
172995
+ "attribute": "now-label",
172996
+ "helix": {
172997
+ "words": true
172998
+ }
172999
+ },
172607
173000
  {
172608
173001
  "kind": "field",
172609
173002
  "name": "placeholder",
@@ -172679,6 +173072,16 @@
172679
173072
  "description": "Whether times carry their seconds: the value is `HH:mm:ss`, a typed time\nmay give them, the field writes them, and the list's `step` counts seconds.\nSee Time Picker's `seconds`.",
172680
173073
  "attribute": "seconds"
172681
173074
  },
173075
+ {
173076
+ "kind": "field",
173077
+ "name": "showNow",
173078
+ "type": {
173079
+ "text": "boolean"
173080
+ },
173081
+ "default": "false",
173082
+ "description": "Draws a button under the times in the list that chooses the current time,\nmoved to the nearest time on offer. See Time Picker's `show-now`. Its words\nare `now-label`.",
173083
+ "attribute": "show-now"
173084
+ },
172682
173085
  {
172683
173086
  "kind": "field",
172684
173087
  "name": "step",
@@ -175896,6 +176299,15 @@
175896
176299
  "description": "How many times the field holds at once.\n\nAbsent is one. `range` holds a start and an end, `multiple` holds any\nnumber, and both are carried as one comma-separated value, which is what a\nform submits. `TimePicker` carries the longer note on the interaction and\non why a wheel cannot do either.",
175897
176300
  "fieldName": "mode"
175898
176301
  },
176302
+ {
176303
+ "name": "now-label",
176304
+ "type": {
176305
+ "text": "string"
176306
+ },
176307
+ "default": "'Now'",
176308
+ "description": "The words on the list's button that chooses the current time, drawn with\n`show-now`.",
176309
+ "fieldName": "nowLabel"
176310
+ },
175899
176311
  {
175900
176312
  "name": "placeholder",
175901
176313
  "type": {
@@ -175950,6 +176362,15 @@
175950
176362
  "description": "Whether times carry their seconds: the value is `HH:mm:ss`, a typed time\nmay give them, the field writes them, and the list's `step` counts seconds.\nSee Time Picker's `seconds`.",
175951
176363
  "fieldName": "seconds"
175952
176364
  },
176365
+ {
176366
+ "name": "show-now",
176367
+ "type": {
176368
+ "text": "boolean"
176369
+ },
176370
+ "default": "false",
176371
+ "description": "Draws a button under the times in the list that chooses the current time,\nmoved to the nearest time on offer. See Time Picker's `show-now`. Its words\nare `now-label`.",
176372
+ "fieldName": "showNow"
176373
+ },
175953
176374
  {
175954
176375
  "name": "step",
175955
176376
  "type": {
@@ -200068,7 +200489,7 @@
200068
200489
  "declarations": [
200069
200490
  {
200070
200491
  "kind": "class",
200071
- "description": "The items arrive as data, in one of two ways:\n\n- `items` takes an array. A framework sets it as a property, and React\n hydration keeps it.\n- `for` names a `<script type=\"application/json\">` that holds an array, which\n a server sends as markup.\n\nEach item is drawn into a row in one of two ways:\n\n- `renderItem` is a function from an item and its index to the row's\n content: a Lit template, a string, or a DOM node.\n- A `<template>` child defines one row. `data-field=\"name\"` fills an element\n with the item's `name` as text, and `data-field-href=\"url\"` writes the\n item's `url` into `href`, the same for any attribute. A field may be a path\n of keys, such as `author.name`.\n\nRows are your markup in the light DOM, so your stylesheet styles them.\n\n**A grid.** `columns` lays the items out that many to a line, as a grid of\nequal columns, and windows the set a line at a time, as React Aria's grid\nlayout does. Each item draws one element, a cell of the grid, and\n`estimate` is the height of a line. `min-column-width` lays out as many\ncolumns as fit the box instead, as React Aria's grid layout does with its\nsmallest item size, and follows the box as it resizes. `gap` spaces the rows, and the columns\nof a grid, by a number of pixels the list counts in each row's place.\n\n**Across.** `orientation=\"horizontal\"` lays the items out along a line and\nscrolls it sideways, as a strip of cards does, windowed the same way:\n`estimate` is then an item's width, and the box needs an inline size.\n\n**Sections.** `section-field` names the field of each item that says which\nsection it is in, and the list draws a header before each section's items,\nas React Aria's list box sections do. Each section is an element with the\n`group` role, named by its header, which is its first child and carries\n`data-header`, so your stylesheet styles it, such as with `position:\nsticky`. A section starts wherever the field changes, so give the items in\norder. The window counts the headers with the items, and a section the\nwindow starts inside is drawn with its header. `renderSection` draws a\nheader of your own.\n\n**Keyboard.** The list is one tab stop.\n\n| Key | What it does |\n|---|---|\n| 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. |\n| 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. |\n| Home, End | Moves to the first or the last item. |\n| Page Down, Page Up | Moves by the number of items, or of lines in a grid, on screen. |\n| A letter or a word | Moves to the next item whose text starts with what you typed. |\n| Escape | Lets go of every chosen item, in a list with `selection-mode`. |\n| Alt with Up or Down | In a `reorderable` list, moves the item a place. Alt with Home or End moves it to either end. |\n| Tab | Moves into the focused row's own links and buttons, then out of the list. |\n\nAn item that is not drawn is scrolled into view and focused, so a keyboard\nreaches the whole set. The row a reader last focused keeps the tab stop and\nstays drawn when it scrolls away, so Tab and Shift+Tab come back to it, as\nReact Aria's collections do. In a list nobody has focused yet, the stop\nmoves to the first row on screen. Typing matches each item's\n`text-field`, which is the first `data-field` of the row template by default,\nor the item itself when it is a string or a number.\n\nEach row says its place in the whole set with `aria-posinset` and\n`aria-setsize`, so a screen reader says \"4,000 of 10,000\". The row holding\nfocus stays drawn when it scrolls out.\n\n**Selecting.** `selection-mode` makes the list a list box a reader chooses\nfrom: `single` selects one item and `multiple` any number. Space or a press\nselects an item, Shift with Space, an arrow, Home, End or a press takes in\nthe items from the last one chosen, and Control or Command with A selects\nthem all, in `multiple`. Escape lets go of every chosen item, and keeps the\nkey from the dialog or menu around the list while there was something to\nlet go of. `value` holds the chosen items' keys, separated by commas, in\nthe order of the set: `key-field` names each item's key, and a string or a\nnumber item is its own key. A change asks with `helix-before-change` and\ntells with `change`. Each row is an `option` marked `aria-selected`, so a\nrow's own links and buttons are not reached there: keep those to a list\nwithout `selection-mode`.\n\n`selection-behavior=\"replace\"` selects the item pressed alone, as a file\nlist does, and the arrow keys carry the selection with them. Control or\nCommand with a press or with Space adds or takes out one item, and with an\narrow moves without selecting.\n\n**Disabled items.** `disabled-keys` names items by their keys, separated by\ncommas. Their rows carry `aria-disabled`, the keys and typing pass over\nthem, and a press, Space, or Control with A does not select them.\n\n**Rows a stylesheet can tell apart.** A chosen row carries `data-selected`,\na disabled one `data-disabled`, as React Aria's rows do, and the row the\nkeys are on, which holds the tab stop, `data-active`, whether or not the\nlist has focus.\n\n**Loading more.** `helix-range-change` fires as the items on screen change,\nand `range` holds them. `helix-load-more` fires once a reader is within one\nscreen of the end, once for each length of the set: add to `items` and it can\nfire again. While you fetch, set `loading`: the list is busy, and a row after\nthe last item says \"Loading more\" (`loading-label`, or your own content in\nthe `loading` slot). `scrollToIndex` takes a reader to an item.\n\n**Moving items** is a separate import, `@fusion.dev/helix/virtual-list/reorder`,\nas React Aria's drag and drop is. With it imported, `reorderable` lets a\nreader move items in a list of one column without sections:\n\n- Alt with Up or Down moves the item the keys are on a place, and Alt with\n Home or End to either end, as the APG's rearrangeable listbox does.\n- A pointer drags a whole row. A press that does not travel is still a\n press. The list scrolls near an edge, and an item far down a long set is\n reached by dragging to the edge.\n- A drop sends `helix-before-reorder`, which you can refuse, and then\n `helix-reorder`, whose `keys` hold every item's key in the new order.\n **You move the items**: set `items` to them in that order. The keys stay\n on the item that moved.\n- Each move is said in a region screen readers announce. The row being\n dragged carries `data-dragging`, and the row a drop would land beside\n `data-drop-before` or `data-drop-after`.\n\n**An empty list.** Set `empty-label`, or put your own content in the `empty`\nslot, for a row shown when there are no items and none are loading, such as\n\"No messages yet\" and a link to write one. Without either, an empty list\nshows nothing, since a list whose items have not arrived yet has not said\nit has none.\n\nThe list takes the `empty` state while it has read its items and holds none,\nand the `loading` state while `loading` is set, so your stylesheet can\nchange the box around it for either. A list with no name is reported once\nin a development build. Name it with `label` or `aria-label`.\n\n**Row height.** Rows are placed by `estimate` until they are drawn. Then the\nlist reads the drawn rows' height once and places every row by it, so a\nwrong estimate still reaches the last item. Set `measured` for rows of\ndifferent heights. Once the list draws rows of different heights, such as\nrows that wrap on a narrow screen, it places each row by its own height\nwhether `measured` is set or not.\n\nThe list follows its source. A new `items` array, an edit to the script's\ntext, or a script replaced under the same id draws the new rows. A row that\nstays in view keeps its element as the list scrolls.\n\nThe viewport scrolls on this tier. It carries `data-scroller`, and `core`\nships `[data-scroller] { overflow: auto }` into every shadow root, so\n`scrollTop` works with no stylesheet. You still need to set a block size.",
200492
+ "description": "The items arrive as data, in one of two ways:\n\n- `items` takes an array. A framework sets it as a property, and React\n hydration keeps it.\n- `for` names a `<script type=\"application/json\">` that holds an array, which\n a server sends as markup.\n\nEach item is drawn into a row in one of two ways:\n\n- `renderItem` is a function from an item and its index to the row's\n content: a Lit template, a string, or a DOM node.\n- A `<template>` child defines one row. `data-field=\"name\"` fills an element\n with the item's `name` as text, and `data-field-href=\"url\"` writes the\n item's `url` into `href`, the same for any attribute. A field may be a path\n of keys, such as `author.name`.\n\nRows are your markup in the light DOM, so your stylesheet styles them.\n\n**A grid.** `columns` lays the items out that many to a line, as a grid of\nequal columns, and windows the set a line at a time, as React Aria's grid\nlayout does. Each item draws one element, a cell of the grid, and\n`estimate` is the height of a line. `min-column-width` lays out as many\ncolumns as fit the box instead, as React Aria's grid layout does with its\nsmallest item size, and follows the box as it resizes. `gap` spaces the rows, and the columns\nof a grid, by a number of pixels the list counts in each row's place.\n\nA grid without `selection-mode` is a grid to a reader, as the APG's grid\nand React Aria's grid list are: the box is a `grid` with `aria-rowcount`\nand `aria-colcount`, each line drawn is a `row` with `aria-rowindex`, and\neach item a `gridcell` with `aria-colindex`. Each line is a slot of the\nlist's own, so your rows stay its children: give an item one element. With\n`selection-mode` it stays a list box of options, as React Aria's list box\nin a grid layout does.\n\n**A waterfall.** `layout=\"waterfall\"` puts each item, in the order of the\nset, under the column that ends highest so far, the leftmost of a tie, as a\nwall of photos of different heights is, and as React Aria's waterfall\nlayout and TanStack Virtual's lanes do. `columns`, or `min-column-width`,\nsays how many columns. Every item is measured, at the width of its column,\nand placed at its column and its height, so items of any height leave no\nholes. The list draws the items that reach into the box, and the item\nholding focus. A reader hears a list, or a list box, in the order of the\nset, which is also the order Tab and a screen reader's own keys take.\n\nIn a waterfall, Down and Up move along the column to the next or the\nprevious item in it, Right and Left move to the next or the previous\ncolumn, to the item there that sits beside this one the most, or the\nnearest above where none does, and Page Down and Page Up move a box down\nor up the column. Home and End go to the first and the last item of the\nset, and Shift with a key takes in the items between in the order of the\nset.\n\n**Across.** `orientation=\"horizontal\"` lays the items out along a line and\nscrolls it sideways, as a strip of cards does, windowed the same way:\n`estimate` is then an item's width, and the box needs an inline size.\n\n**Sections.** `section-field` names the field of each item that says which\nsection it is in, and the list draws a header before each section's items,\nas React Aria's list box sections do. Each section is an element with the\n`group` role, named by its header, which is its first child and carries\n`data-header`, so your stylesheet styles it, such as with `position:\nsticky`. A section starts wherever the field changes, so give the items in\norder. The window counts the headers with the items, and a section the\nwindow starts inside is drawn with its header. `renderSection` draws a\nheader of your own.\n\n**Keyboard.** The list is one tab stop.\n\n| Key | What it does |\n|---|---|\n| 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. |\n| 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. |\n| 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. |\n| Control or Command with Home or End | In a grid without `selection-mode`, moves to the first or the last item. |\n| 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. |\n| A letter or a word | Moves to the next item whose text starts with what you typed. |\n| Escape | Lets go of every chosen item, in a list with `selection-mode`. |\n| Alt with Up or Down | In a `reorderable` list, moves the item a place. Alt with Home or End moves it to either end. |\n| Tab | Moves into the focused row's own links and buttons, then out of the list. |\n\nAn item that is not drawn is scrolled into view and focused, so a keyboard\nreaches the whole set. The row a reader last focused keeps the tab stop and\nstays drawn when it scrolls away, so Tab and Shift+Tab come back to it, as\nReact Aria's collections do. In a list nobody has focused yet, the stop\nmoves to the first row on screen. Typing matches each item's\n`text-field`, which is the first `data-field` of the row template by default,\nor the item itself when it is a string or a number.\n\nEach row says its place in the whole set with `aria-posinset` and\n`aria-setsize`, so a screen reader says \"4,000 of 10,000\", and each cell of\na grid its line and its column. The row holding focus stays drawn when it\nscrolls out.\n\n**Selecting.** `selection-mode` makes the list a list box a reader chooses\nfrom: `single` selects one item and `multiple` any number. Space or a press\nselects an item, Shift with Space, an arrow, Home, End or a press takes in\nthe items from the last one chosen, and Control or Command with A selects\nthem all, in `multiple`. Escape lets go of every chosen item, and keeps the\nkey from the dialog or menu around the list while there was something to\nlet go of. `value` holds the chosen items' keys, separated by commas, in\nthe order of the set: `key-field` names each item's key, and a string or a\nnumber item is its own key. A change asks with `helix-before-change` and\ntells with `change`. Each row is an `option` marked `aria-selected`, so a\nrow's own links and buttons are not reached there: keep those to a list\nwithout `selection-mode`.\n\n`selection-behavior=\"replace\"` selects the item pressed alone, as a file\nlist does, and the arrow keys carry the selection with them. Control or\nCommand with a press or with Space adds or takes out one item, and with an\narrow moves without selecting.\n\n**Disabled items.** `disabled-keys` names items by their keys, separated by\ncommas. Their rows carry `aria-disabled`, the keys and typing pass over\nthem, and a press, Space, or Control with A does not select them.\n\n**Rows a stylesheet can tell apart.** A chosen row carries `data-selected`,\na disabled one `data-disabled`, as React Aria's rows do, and the row the\nkeys are on, which holds the tab stop, `data-active`, whether or not the\nlist has focus.\n\n**Loading more.** `helix-range-change` fires as the items on screen change,\nand `range` holds them. `helix-load-more` fires once a reader is within one\nscreen of the end, once for each length of the set: add to `items` and it can\nfire again. While you fetch, set `loading`: the list is busy, and a row after\nthe last item says \"Loading more\" (`loading-label`, or your own content in\nthe `loading` slot). `scrollToIndex` takes a reader to an item.\n\n**Moving items** is a separate import, `@fusion.dev/helix/virtual-list/reorder`,\nas React Aria's drag and drop is. With it imported, `reorderable` lets a\nreader move items in a list of one column without sections:\n\n- Alt with Up or Down moves the item the keys are on a place, and Alt with\n Home or End to either end, as the APG's rearrangeable listbox does.\n- A pointer drags a whole row. A press that does not travel is still a\n press. The list scrolls near an edge, and an item far down a long set is\n reached by dragging to the edge.\n- A drop sends `helix-before-reorder`, which you can refuse, and then\n `helix-reorder`, whose `keys` hold every item's key in the new order.\n **You move the items**: set `items` to them in that order. The keys stay\n on the item that moved.\n- Each move is said in a region screen readers announce. The row being\n dragged carries `data-dragging`, and the row a drop would land beside\n `data-drop-before` or `data-drop-after`.\n\n**An empty list.** Set `empty-label`, or put your own content in the `empty`\nslot, for a row shown when there are no items and none are loading, such as\n\"No messages yet\" and a link to write one. Without either, an empty list\nshows nothing, since a list whose items have not arrived yet has not said\nit has none.\n\nThe list takes the `empty` state while it has read its items and holds none,\nand the `loading` state while `loading` is set, so your stylesheet can\nchange the box around it for either. A list with no name is reported once\nin a development build. Name it with `label` or `aria-label`.\n\n**Row height.** Rows are placed by `estimate` until they are drawn. Then the\nlist reads the drawn rows' height once and places every row by it, so a\nwrong estimate still reaches the last item. Set `measured` for rows of\ndifferent heights. Once the list draws rows of different heights, such as\nrows that wrap on a narrow screen, it places each row by its own height\nwhether `measured` is set or not.\n\nThe list follows its source. A new `items` array, an edit to the script's\ntext, or a script replaced under the same id draws the new rows. A row that\nstays in view keeps its element as the list scrolls.\n\nThe viewport scrolls on this tier. It carries `data-scroller`, and `core`\nships `[data-scroller] { overflow: auto }` into every shadow root, so\n`scrollTop` works with no stylesheet. You still need to set a block size.",
200072
200493
  "name": "HelixHeadlessVirtualList",
200073
200494
  "cssParts": [
200074
200495
  {
@@ -200220,6 +200641,16 @@
200220
200641
  "description": "The list's name, read by screen readers, because only some of its rows\nare rendered at a time.\n\nAn `aria-label` or `aria-labelledby` on the host names the list too, and\nwins over this.",
200221
200642
  "attribute": "label"
200222
200643
  },
200644
+ {
200645
+ "kind": "field",
200646
+ "name": "layout",
200647
+ "type": {
200648
+ "text": "'grid' | 'waterfall'"
200649
+ },
200650
+ "default": "'grid'",
200651
+ "description": "How items of more than one column are laid out. `grid`, the default, puts\nthem in lines of equal columns. `waterfall` puts each item, in the order\nof the set, under the column that ends highest, as a wall of photos of\ndifferent heights is: `columns`, or `min-column-width`, says how many\ncolumns. Rows of a waterfall are measured, and Up and Down move along a\ncolumn.",
200652
+ "attribute": "layout"
200653
+ },
200223
200654
  {
200224
200655
  "kind": "field",
200225
200656
  "name": "loading",
@@ -200270,7 +200701,7 @@
200270
200701
  "text": "'horizontal' | 'vertical'"
200271
200702
  },
200272
200703
  "default": "'vertical'",
200273
- "description": "Which way the list runs. `horizontal` lays the items out along a line\nand scrolls it sideways: Left and Right move between items, the other\nway round on a right-to-left page, and `estimate` is an item's width. A\ngrid always runs down.",
200704
+ "description": "Which way the list runs. `horizontal` lays the items out along a line\nand scrolls it sideways: Left and Right move between items, the other\nway round on a right-to-left page, and `estimate` is an item's width. A\ngrid and a waterfall always run down.",
200274
200705
  "attribute": "orientation"
200275
200706
  },
200276
200707
  {
@@ -200296,7 +200727,7 @@
200296
200727
  "text": "boolean"
200297
200728
  },
200298
200729
  "default": "false",
200299
- "description": "Lets a reader move items, once `@fusion.dev/helix/virtual-list/reorder`\n(or `@fusion.dev/helix-headless/virtual-list/reorder`) is imported: Alt\nwith an arrow moves the row the keys are on, and a pointer drags a row.\nThe list moves no item itself: you move your `items` on `helix-reorder`.\nWithout that import it does nothing, so a list that never moves items\ncarries none of the code. A list of one column, without sections.",
200730
+ "description": "Lets a reader move items, once `@fusion.dev/helix/virtual-list/reorder`\n(or `@fusion.dev/helix-headless/virtual-list/reorder`) is imported: Alt\nwith an arrow moves the row the keys are on, and a pointer drags a row.\nThe list moves no item itself: you move your `items` on `helix-reorder`.\nWithout that import it does nothing, so a list that never moves items\ncarries none of the code. A list of one column, without sections or a\nwaterfall.",
200300
200731
  "attribute": "reorderable"
200301
200732
  },
200302
200733
  {
@@ -200481,7 +200912,7 @@
200481
200912
  "name": "virtualize",
200482
200913
  "privacy": "private",
200483
200914
  "readonly": true,
200484
- "default": "new VirtualizeController(this, { container: () => this.partNamed('viewport'), count: () => this.sections ? this.data.length + this.sections.starts.length : Math.ceil(this.data.length / this.across), estimate: () => this.estimate, gap: () => this.space, horizontal: () => this.horizontal, measured: () => this.measured, rows: () => this.lines(), })"
200915
+ "default": "new VirtualizeController(this, { container: () => this.partNamed('viewport'), count: () => this.sections ? this.data.length + this.sections.starts.length : Math.ceil(this.data.length / this.across), estimate: () => this.estimate, gap: () => this.space, horizontal: () => this.horizontal, measured: () => this.measured, rows: () => this.lines(), waterfall: () => { this.lanes.lanes = this.columnCount return this.waterfall ? this.lanes : undefined }, })"
200485
200916
  },
200486
200917
  {
200487
200918
  "kind": "field",
@@ -200502,6 +200933,34 @@
200502
200933
  "description": "The gap in pixels, none where it is not a positive number.",
200503
200934
  "readonly": true
200504
200935
  },
200936
+ {
200937
+ "kind": "field",
200938
+ "name": "lanes",
200939
+ "privacy": "private",
200940
+ "readonly": true,
200941
+ "default": "new Waterfall()",
200942
+ "description": "Where each item of a waterfall stands, which the controller places."
200943
+ },
200944
+ {
200945
+ "kind": "field",
200946
+ "name": "waterfall",
200947
+ "type": {
200948
+ "text": "boolean"
200949
+ },
200950
+ "privacy": "private",
200951
+ "description": "Whether the items are laid out as a waterfall, each down a column.",
200952
+ "readonly": true
200953
+ },
200954
+ {
200955
+ "kind": "field",
200956
+ "name": "lined",
200957
+ "type": {
200958
+ "text": "boolean"
200959
+ },
200960
+ "privacy": "private",
200961
+ "description": "Whether the list is a grid a reader reads, and not a list box: lines of\ncolumns with no `selection-mode`, which are `grid`, `row` and `gridcell`\nto a reader, as the APG's grid and React Aria's grid list are.",
200962
+ "readonly": true
200963
+ },
200505
200964
  {
200506
200965
  "kind": "field",
200507
200966
  "name": "across",
@@ -200509,7 +200968,17 @@
200509
200968
  "text": "number"
200510
200969
  },
200511
200970
  "privacy": "private",
200512
- "description": "How many items a line holds: as many as fit at `min-column-width` where\nit is set and the box has a width, and `columns` otherwise, at least one.",
200971
+ "description": "How many items a line holds, which a waterfall draws one at a time: its\ncolumns are not lines.",
200972
+ "readonly": true
200973
+ },
200974
+ {
200975
+ "kind": "field",
200976
+ "name": "columnCount",
200977
+ "type": {
200978
+ "text": "number"
200979
+ },
200980
+ "privacy": "private",
200981
+ "description": "How many columns there are: as many as fit at `min-column-width` where\nit is set and the box has a width, and `columns` otherwise, at least one.",
200513
200982
  "readonly": true
200514
200983
  },
200515
200984
  {
@@ -200535,11 +201004,11 @@
200535
201004
  "kind": "field",
200536
201005
  "name": "measuredAcross",
200537
201006
  "type": {
200538
- "text": "number"
201007
+ "text": "number | string"
200539
201008
  },
200540
201009
  "privacy": "private",
200541
201010
  "default": "1",
200542
- "description": "The items to a line the measurements were taken at."
201011
+ "description": "The items to a line the measurements were taken at, or a waterfall's columns and width."
200543
201012
  },
200544
201013
  {
200545
201014
  "kind": "method",
@@ -200550,7 +201019,7 @@
200550
201019
  "text": "void"
200551
201020
  }
200552
201021
  },
200553
- "description": "Watches the box for its width while `min-column-width` asks for it."
201022
+ "description": "Watches the box for its width while `min-column-width` asks for it, or a\nwaterfall, whose items are as tall as their width makes them."
200554
201023
  },
200555
201024
  {
200556
201025
  "kind": "method",
@@ -200597,7 +201066,7 @@
200597
201066
  "text": "boolean"
200598
201067
  },
200599
201068
  "privacy": "private",
200600
- "description": "Whether the list runs across, which a grid never does.",
201069
+ "description": "Whether the list runs across, which a grid and a waterfall never do.",
200601
201070
  "readonly": true
200602
201071
  },
200603
201072
  {
@@ -200861,6 +201330,43 @@
200861
201330
  "readonly": true,
200862
201331
  "description": "Moves between items with the keys `stepIndex` names.\n\nOnly from a row itself. A key pressed in a row's own link, button or field\nis that control's, so a field in a row keeps its arrows."
200863
201332
  },
201333
+ {
201334
+ "kind": "method",
201335
+ "name": "inWaterfall",
201336
+ "privacy": "private",
201337
+ "return": {
201338
+ "type": {
201339
+ "text": "number | undefined"
201340
+ }
201341
+ },
201342
+ "parameters": [
201343
+ {
201344
+ "name": "key",
201345
+ "type": {
201346
+ "text": "string"
201347
+ }
201348
+ },
201349
+ {
201350
+ "name": "at",
201351
+ "type": {
201352
+ "text": "number"
201353
+ }
201354
+ },
201355
+ {
201356
+ "name": "count",
201357
+ "type": {
201358
+ "text": "number"
201359
+ }
201360
+ },
201361
+ {
201362
+ "name": "forward",
201363
+ "type": {
201364
+ "text": "string"
201365
+ }
201366
+ }
201367
+ ],
201368
+ "description": "Where a key goes in a waterfall, through the columns `Waterfall.step`\nreads: along the column for Down, Up, Page Down and Page Up, and to the\nitem beside in the next column or the one before for the keys along the\nline, the other way round on a right-to-left page. Past a disabled item,\non the same way."
201369
+ },
200864
201370
  {
200865
201371
  "kind": "method",
200866
201372
  "name": "keyAt",
@@ -201052,7 +201558,7 @@
201052
201558
  }
201053
201559
  }
201054
201560
  ],
201055
- "description": "Writes a row's role, and whether it is chosen in a list that selects:\n`option` with `aria-selected` there, and `listitem` otherwise, and\n`aria-disabled` on an item `disabled-keys` names. Every pass,\nsince a choice changes no row's content.\n\n`data-selected` and `data-disabled` say the same to a stylesheet, as\nReact Aria's rows do, so one rule reads the same in either kind of list."
201561
+ "description": "Writes a row's role, and whether it is chosen in a list that selects:\n`option` with `aria-selected` there, `gridcell` in a grid, and `listitem`\notherwise, and `aria-disabled` on an item `disabled-keys` names. Every\npass, since a choice changes no row's content.\n\nIts place too: `aria-posinset` and `aria-setsize` in a list, and in a\ngrid its column, with the line's `row` given by the slot it is drawn in.\n\n`data-selected` and `data-disabled` say the same to a stylesheet, as\nReact Aria's rows do, so one rule reads the same in either kind of list."
201056
201562
  },
201057
201563
  {
201058
201564
  "kind": "method",
@@ -201077,7 +201583,7 @@
201077
201583
  }
201078
201584
  }
201079
201585
  ],
201080
- "description": "Writes a row's place in the set."
201586
+ "description": "Writes which item a row drew, for the controller to measure it against:\nthe real index, the same one `aria-posinset` carries one higher.\n\n`mark` writes the place a reader hears from it, the real index and the\nreal total, not the position in the window. A reader arrowing through\nthis should hear where they are in the set."
201081
201587
  },
201082
201588
  {
201083
201589
  "kind": "method",
@@ -201149,6 +201655,26 @@
201149
201655
  "privacy": "private",
201150
201656
  "description": "The sections the rows were last placed in."
201151
201657
  },
201658
+ {
201659
+ "kind": "field",
201660
+ "name": "placedWaterfall",
201661
+ "type": {
201662
+ "text": "boolean"
201663
+ },
201664
+ "privacy": "private",
201665
+ "default": "false",
201666
+ "description": "Whether the rows were last placed in a waterfall."
201667
+ },
201668
+ {
201669
+ "kind": "field",
201670
+ "name": "drawnLines",
201671
+ "type": {
201672
+ "text": "number[]"
201673
+ },
201674
+ "privacy": "private",
201675
+ "default": "[]",
201676
+ "description": "The lines of a grid drawn on the last pass, each a `row` the render draws a slot in."
201677
+ },
201152
201678
  {
201153
201679
  "kind": "field",
201154
201680
  "name": "headedBy",
@@ -201676,6 +202202,15 @@
201676
202202
  "description": "The list's name, read by screen readers, because only some of its rows\nare rendered at a time.\n\nAn `aria-label` or `aria-labelledby` on the host names the list too, and\nwins over this.",
201677
202203
  "fieldName": "label"
201678
202204
  },
202205
+ {
202206
+ "name": "layout",
202207
+ "type": {
202208
+ "text": "'grid' | 'waterfall'"
202209
+ },
202210
+ "default": "'grid'",
202211
+ "description": "How items of more than one column are laid out. `grid`, the default, puts\nthem in lines of equal columns. `waterfall` puts each item, in the order\nof the set, under the column that ends highest, as a wall of photos of\ndifferent heights is: `columns`, or `min-column-width`, says how many\ncolumns. Rows of a waterfall are measured, and Up and Down move along a\ncolumn.",
202212
+ "fieldName": "layout"
202213
+ },
201679
202214
  {
201680
202215
  "name": "loading",
201681
202216
  "type": {
@@ -201718,7 +202253,7 @@
201718
202253
  "text": "'horizontal' | 'vertical'"
201719
202254
  },
201720
202255
  "default": "'vertical'",
201721
- "description": "Which way the list runs. `horizontal` lays the items out along a line\nand scrolls it sideways: Left and Right move between items, the other\nway round on a right-to-left page, and `estimate` is an item's width. A\ngrid always runs down.",
202256
+ "description": "Which way the list runs. `horizontal` lays the items out along a line\nand scrolls it sideways: Left and Right move between items, the other\nway round on a right-to-left page, and `estimate` is an item's width. A\ngrid and a waterfall always run down.",
201722
202257
  "fieldName": "orientation"
201723
202258
  },
201724
202259
  {
@@ -201727,7 +202262,7 @@
201727
202262
  "text": "boolean"
201728
202263
  },
201729
202264
  "default": "false",
201730
- "description": "Lets a reader move items, once `@fusion.dev/helix/virtual-list/reorder`\n(or `@fusion.dev/helix-headless/virtual-list/reorder`) is imported: Alt\nwith an arrow moves the row the keys are on, and a pointer drags a row.\nThe list moves no item itself: you move your `items` on `helix-reorder`.\nWithout that import it does nothing, so a list that never moves items\ncarries none of the code. A list of one column, without sections.",
202265
+ "description": "Lets a reader move items, once `@fusion.dev/helix/virtual-list/reorder`\n(or `@fusion.dev/helix-headless/virtual-list/reorder`) is imported: Alt\nwith an arrow moves the row the keys are on, and a pointer drags a row.\nThe list moves no item itself: you move your `items` on `helix-reorder`.\nWithout that import it does nothing, so a list that never moves items\ncarries none of the code. A list of one column, without sections or a\nwaterfall.",
201731
202266
  "fieldName": "reorderable"
201732
202267
  },
201733
202268
  {
@@ -202020,6 +202555,6 @@
202020
202555
  ],
202021
202556
  "helix": {
202022
202557
  "package": "@fusion.dev/helix-headless",
202023
- "version": "0.182.2"
202558
+ "version": "0.184.0"
202024
202559
  }
202025
202560
  }