@fusion.dev/helix-headless 0.53.2 → 0.53.4

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/types/vue.d.ts CHANGED
@@ -270,9 +270,9 @@ hydration, or diffed by a framework, it comes back holding whatever the
270
270
  last reader did rather than what the author wrote. `:state(open)` carries
271
271
  the resolved state for stylesheets, which is what the mirror is for. */
272
272
  open?: (HelixHeadlessAccordionItem["open"]) | undefined;
273
- /** Initial open state for uncontrolled use, where nothing declared one. */
273
+ /** Whether the markup declared it open. Ignored once `open` is written. */
274
274
  "default-open"?: (HelixHeadlessAccordionItem["defaultOpen"]) | undefined;
275
- /** Initial open state for uncontrolled use, where nothing declared one. */
275
+ /** Whether the markup declared it open. Ignored once `open` is written. */
276
276
  defaultOpen?: (HelixHeadlessAccordionItem["defaultOpen"]) | undefined;
277
277
  };
278
278
 
@@ -922,12 +922,11 @@ export type HelixHeadlessCarouselVueProps = {
922
922
  autoplay?: (HelixHeadlessCarousel["autoplay"]) | undefined;
923
923
  /** The slide in view, counted from zero.
924
924
 
925
- Reading gives the real slide, in either mode. Writing sets it, the way a
926
- script assigning to a native control does. Which mode the carousel is in is
927
- read once, at the first update, from whether anything had declared an
928
- `index` by then: declared, and the consumer owns it and the carousel only
929
- announces where it would have gone; not declared, and the carousel owns it
930
- and `default-index` says where it starts.
925
+ Reading gives the real slide. Writing always applies, the way a script
926
+ assigning to a native control does, and is a seed and a correction rather
927
+ than a claim of ownership: a consumer who wants the decision refuses the
928
+ `helix-select`. `default-index` is where the carousel starts until
929
+ something moves it.
931
930
 
932
931
  The same contract the four mixins carry, written out here rather than
933
932
  extracted, because a slide is addressed by position and every one of those
@@ -1383,9 +1382,9 @@ Not reflected: the attribute is the consumer's input and stays as they
1383
1382
  wrote it, and `:state(checked)` carries the resolved state for
1384
1383
  stylesheets. */
1385
1384
  checked?: (HelixHeadlessCheckbox["checked"]) | undefined;
1386
- /** Initial checked state for uncontrolled use, where nothing declared one. */
1385
+ /** Whether the markup declared it checked, which is where a reset returns to. */
1387
1386
  "default-checked"?: (HelixHeadlessCheckbox["defaultChecked"]) | undefined;
1388
- /** Initial checked state for uncontrolled use, where nothing declared one. */
1387
+ /** Whether the markup declared it checked, which is where a reset returns to. */
1389
1388
  defaultChecked?: (HelixHeadlessCheckbox["defaultChecked"]) | undefined;
1390
1389
  /** What is wrong, in the reader's words rather than the browser's. */
1391
1390
  feedback?: (HelixHeadlessCheckbox["feedback"]) | undefined;
@@ -1573,9 +1572,9 @@ hydration, or diffed by a framework, it comes back holding whatever the
1573
1572
  last reader did rather than what the author wrote. `:state(open)` carries
1574
1573
  the resolved state for stylesheets, which is what the mirror is for. */
1575
1574
  open?: (HelixHeadlessColorInput["open"]) | undefined;
1576
- /** Initial open state for uncontrolled use, where nothing declared one. */
1575
+ /** Whether the markup declared it open. Ignored once `open` is written. */
1577
1576
  "default-open"?: (HelixHeadlessColorInput["defaultOpen"]) | undefined;
1578
- /** Initial open state for uncontrolled use, where nothing declared one. */
1577
+ /** Whether the markup declared it open. Ignored once `open` is written. */
1579
1578
  defaultOpen?: (HelixHeadlessColorInput["defaultOpen"]) | undefined;
1580
1579
  /** The value the markup declared, which is where a reset returns to. */
1581
1580
  "default-value"?: (HelixHeadlessColorInput["defaultValue"]) | undefined;
@@ -1947,9 +1946,9 @@ hydration, or diffed by a framework, it comes back holding whatever the
1947
1946
  last reader did rather than what the author wrote. `:state(open)` carries
1948
1947
  the resolved state for stylesheets, which is what the mirror is for. */
1949
1948
  open?: (HelixHeadlessCombobox["open"]) | undefined;
1950
- /** Initial open state for uncontrolled use, where nothing declared one. */
1949
+ /** Whether the markup declared it open. Ignored once `open` is written. */
1951
1950
  "default-open"?: (HelixHeadlessCombobox["defaultOpen"]) | undefined;
1952
- /** Initial open state for uncontrolled use, where nothing declared one. */
1951
+ /** Whether the markup declared it open. Ignored once `open` is written. */
1953
1952
  defaultOpen?: (HelixHeadlessCombobox["defaultOpen"]) | undefined;
1954
1953
  /** What the control is called once everything is showing. */
1955
1954
  "collapse-label"?: (HelixHeadlessCombobox["collapseLabel"]) | undefined;
@@ -2081,9 +2080,9 @@ hydration, or diffed by a framework, it comes back holding whatever the
2081
2080
  last reader did rather than what the author wrote. `:state(open)` carries
2082
2081
  the resolved state for stylesheets, which is what the mirror is for. */
2083
2082
  open?: (HelixHeadlessCommand["open"]) | undefined;
2084
- /** Initial open state for uncontrolled use, where nothing declared one. */
2083
+ /** Whether the markup declared it open. Ignored once `open` is written. */
2085
2084
  "default-open"?: (HelixHeadlessCommand["defaultOpen"]) | undefined;
2086
- /** Initial open state for uncontrolled use, where nothing declared one. */
2085
+ /** Whether the markup declared it open. Ignored once `open` is written. */
2087
2086
  defaultOpen?: (HelixHeadlessCommand["defaultOpen"]) | undefined;
2088
2087
  };
2089
2088
 
@@ -2649,9 +2648,9 @@ hydration, or diffed by a framework, it comes back holding whatever the
2649
2648
  last reader did rather than what the author wrote. `:state(open)` carries
2650
2649
  the resolved state for stylesheets, which is what the mirror is for. */
2651
2650
  open?: (HelixHeadlessDateInput["open"]) | undefined;
2652
- /** Initial open state for uncontrolled use, where nothing declared one. */
2651
+ /** Whether the markup declared it open. Ignored once `open` is written. */
2653
2652
  "default-open"?: (HelixHeadlessDateInput["defaultOpen"]) | undefined;
2654
- /** Initial open state for uncontrolled use, where nothing declared one. */
2653
+ /** Whether the markup declared it open. Ignored once `open` is written. */
2655
2654
  defaultOpen?: (HelixHeadlessDateInput["defaultOpen"]) | undefined;
2656
2655
  /** What the control is called once everything is showing. */
2657
2656
  "collapse-label"?: (HelixHeadlessDateInput["collapseLabel"]) | undefined;
@@ -3004,9 +3003,9 @@ hydration, or diffed by a framework, it comes back holding whatever the
3004
3003
  last reader did rather than what the author wrote. `:state(open)` carries
3005
3004
  the resolved state for stylesheets, which is what the mirror is for. */
3006
3005
  open?: (HelixHeadlessDialog["open"]) | undefined;
3007
- /** Initial open state for uncontrolled use, where nothing declared one. */
3006
+ /** Whether the markup declared it open. Ignored once `open` is written. */
3008
3007
  "default-open"?: (HelixHeadlessDialog["defaultOpen"]) | undefined;
3009
- /** Initial open state for uncontrolled use, where nothing declared one. */
3008
+ /** Whether the markup declared it open. Ignored once `open` is written. */
3010
3009
  defaultOpen?: (HelixHeadlessDialog["defaultOpen"]) | undefined;
3011
3010
  /** What the dialog closed with, the way `<dialog>` reports it.
3012
3011
 
@@ -3077,7 +3076,7 @@ thickness decides is arithmetic done here and published as
3077
3076
  `--donut-chart-stroke`, which is a number a rule can do sums with where the
3078
3077
  word is not. Reflected, it wrote a value onto every host a script had set
3079
3078
  it on for nothing to read. `sweep` beside it is the converse and reflects,
3080
- because three rules select on it. */
3079
+ because the styled sheet selects on it. */
3081
3080
  hole?: (HelixHeadlessDonutChart["hole"]) | undefined;
3082
3081
  /** How much of the circle the whole occupies.
3083
3082
 
@@ -3188,9 +3187,9 @@ hydration, or diffed by a framework, it comes back holding whatever the
3188
3187
  last reader did rather than what the author wrote. `:state(open)` carries
3189
3188
  the resolved state for stylesheets, which is what the mirror is for. */
3190
3189
  open?: (HelixHeadlessDrawer["open"]) | undefined;
3191
- /** Initial open state for uncontrolled use, where nothing declared one. */
3190
+ /** Whether the markup declared it open. Ignored once `open` is written. */
3192
3191
  "default-open"?: (HelixHeadlessDrawer["defaultOpen"]) | undefined;
3193
- /** Initial open state for uncontrolled use, where nothing declared one. */
3192
+ /** Whether the markup declared it open. Ignored once `open` is written. */
3194
3193
  defaultOpen?: (HelixHeadlessDrawer["defaultOpen"]) | undefined;
3195
3194
  /** What the dialog closed with, the way `<dialog>` reports it.
3196
3195
 
@@ -3606,9 +3605,9 @@ hydration, or diffed by a framework, it comes back holding whatever the
3606
3605
  last reader did rather than what the author wrote. `:state(open)` carries
3607
3606
  the resolved state for stylesheets, which is what the mirror is for. */
3608
3607
  open?: (HelixHeadlessFilterInput["open"]) | undefined;
3609
- /** Initial open state for uncontrolled use, where nothing declared one. */
3608
+ /** Whether the markup declared it open. Ignored once `open` is written. */
3610
3609
  "default-open"?: (HelixHeadlessFilterInput["defaultOpen"]) | undefined;
3611
- /** Initial open state for uncontrolled use, where nothing declared one. */
3610
+ /** Whether the markup declared it open. Ignored once `open` is written. */
3612
3611
  defaultOpen?: (HelixHeadlessFilterInput["defaultOpen"]) | undefined;
3613
3612
  /** What the control is called once everything is showing. */
3614
3613
  "collapse-label"?: (HelixHeadlessFilterInput["collapseLabel"]) | undefined;
@@ -4763,9 +4762,9 @@ hydration, or diffed by a framework, it comes back holding whatever the
4763
4762
  last reader did rather than what the author wrote. `:state(open)` carries
4764
4763
  the resolved state for stylesheets, which is what the mirror is for. */
4765
4764
  open?: (HelixHeadlessMegamenu["open"]) | undefined;
4766
- /** Initial open state for uncontrolled use, where nothing declared one. */
4765
+ /** Whether the markup declared it open. Ignored once `open` is written. */
4767
4766
  "default-open"?: (HelixHeadlessMegamenu["defaultOpen"]) | undefined;
4768
- /** Initial open state for uncontrolled use, where nothing declared one. */
4767
+ /** Whether the markup declared it open. Ignored once `open` is written. */
4769
4768
  defaultOpen?: (HelixHeadlessMegamenu["defaultOpen"]) | undefined;
4770
4769
  };
4771
4770
 
@@ -4921,9 +4920,9 @@ hydration, or diffed by a framework, it comes back holding whatever the
4921
4920
  last reader did rather than what the author wrote. `:state(open)` carries
4922
4921
  the resolved state for stylesheets, which is what the mirror is for. */
4923
4922
  open?: (HelixHeadlessMenu["open"]) | undefined;
4924
- /** Initial open state for uncontrolled use, where nothing declared one. */
4923
+ /** Whether the markup declared it open. Ignored once `open` is written. */
4925
4924
  "default-open"?: (HelixHeadlessMenu["defaultOpen"]) | undefined;
4926
- /** Initial open state for uncontrolled use, where nothing declared one. */
4925
+ /** Whether the markup declared it open. Ignored once `open` is written. */
4927
4926
  defaultOpen?: (HelixHeadlessMenu["defaultOpen"]) | undefined;
4928
4927
  };
4929
4928
 
@@ -5084,9 +5083,9 @@ hydration, or diffed by a framework, it comes back holding whatever the
5084
5083
  last reader did rather than what the author wrote. `:state(open)` carries
5085
5084
  the resolved state for stylesheets, which is what the mirror is for. */
5086
5085
  open?: (HelixHeadlessNotificationGroup["open"]) | undefined;
5087
- /** Initial open state for uncontrolled use, where nothing declared one. */
5086
+ /** Whether the markup declared it open. Ignored once `open` is written. */
5088
5087
  "default-open"?: (HelixHeadlessNotificationGroup["defaultOpen"]) | undefined;
5089
- /** Initial open state for uncontrolled use, where nothing declared one. */
5088
+ /** Whether the markup declared it open. Ignored once `open` is written. */
5090
5089
  defaultOpen?: (HelixHeadlessNotificationGroup["defaultOpen"]) | undefined;
5091
5090
  };
5092
5091
 
@@ -5437,11 +5436,10 @@ Written by the listbox. */
5437
5436
  /** A second destination for this row, taken with the modifier held.
5438
5437
 
5439
5438
  **An attribute rather than a second row, which is the whole point.** A
5440
- palette of eighty-eight components that offered each of them a reference
5441
- page and a sandbox as separate entries would be a palette of a hundred and
5442
- seventy-six, and one earns its keep by getting a reader to one thing in
5443
- three keystrokes. The row already carries the first destination, so the
5444
- second belongs beside it.
5439
+ palette that offered every component a reference page and a sandbox as
5440
+ separate entries would be twice as long, and one earns its keep by getting
5441
+ a reader to one thing in three keystrokes. The row already carries the
5442
+ first destination, so the second belongs beside it.
5445
5443
 
5446
5444
  Declared here and acted on by whatever owns the list, the same division
5447
5445
  selection already uses: an option says what it is and the listbox decides
@@ -5956,9 +5954,9 @@ hydration, or diffed by a framework, it comes back holding whatever the
5956
5954
  last reader did rather than what the author wrote. `:state(open)` carries
5957
5955
  the resolved state for stylesheets, which is what the mirror is for. */
5958
5956
  open?: (HelixHeadlessPopover["open"]) | undefined;
5959
- /** Initial open state for uncontrolled use, where nothing declared one. */
5957
+ /** Whether the markup declared it open. Ignored once `open` is written. */
5960
5958
  "default-open"?: (HelixHeadlessPopover["defaultOpen"]) | undefined;
5961
- /** Initial open state for uncontrolled use, where nothing declared one. */
5959
+ /** Whether the markup declared it open. Ignored once `open` is written. */
5962
5960
  defaultOpen?: (HelixHeadlessPopover["defaultOpen"]) | undefined;
5963
5961
  };
5964
5962
 
@@ -6495,9 +6493,9 @@ hydration, or diffed by a framework, it comes back holding whatever the
6495
6493
  last reader did rather than what the author wrote. `:state(open)` carries
6496
6494
  the resolved state for stylesheets, which is what the mirror is for. */
6497
6495
  open?: (HelixHeadlessSelect["open"]) | undefined;
6498
- /** Initial open state for uncontrolled use, where nothing declared one. */
6496
+ /** Whether the markup declared it open. Ignored once `open` is written. */
6499
6497
  "default-open"?: (HelixHeadlessSelect["defaultOpen"]) | undefined;
6500
- /** Initial open state for uncontrolled use, where nothing declared one. */
6498
+ /** Whether the markup declared it open. Ignored once `open` is written. */
6501
6499
  defaultOpen?: (HelixHeadlessSelect["defaultOpen"]) | undefined;
6502
6500
  /** The value the markup declared, which is where a reset returns to. */
6503
6501
  "default-value"?: (HelixHeadlessSelect["defaultValue"]) | undefined;
@@ -6842,9 +6840,9 @@ hydration, or diffed by a framework, it comes back holding whatever the
6842
6840
  last reader did rather than what the author wrote. `:state(open)` carries
6843
6841
  the resolved state for stylesheets, which is what the mirror is for. */
6844
6842
  open?: (HelixHeadlessSpeedDial["open"]) | undefined;
6845
- /** Initial open state for uncontrolled use, where nothing declared one. */
6843
+ /** Whether the markup declared it open. Ignored once `open` is written. */
6846
6844
  "default-open"?: (HelixHeadlessSpeedDial["defaultOpen"]) | undefined;
6847
- /** Initial open state for uncontrolled use, where nothing declared one. */
6845
+ /** Whether the markup declared it open. Ignored once `open` is written. */
6848
6846
  defaultOpen?: (HelixHeadlessSpeedDial["defaultOpen"]) | undefined;
6849
6847
  };
6850
6848
 
@@ -7061,11 +7059,11 @@ Writing always applies, so `<helix-tabs active="one">` starts on that
7061
7059
  tab, and `default-active` is how markup says where to start without
7062
7060
  naming the current one. */
7063
7061
  active?: (HelixHeadlessSteps["active"]) | undefined;
7064
- /** Initial item for uncontrolled use.
7062
+ /** Which item the markup declared current.
7065
7063
 
7066
7064
  Ignored once `active` is written. */
7067
7065
  "default-active"?: (HelixHeadlessSteps["defaultActive"]) | undefined;
7068
- /** Initial item for uncontrolled use.
7066
+ /** Which item the markup declared current.
7069
7067
 
7070
7068
  Ignored once `active` is written. */
7071
7069
  defaultActive?: (HelixHeadlessSteps["defaultActive"]) | undefined;
@@ -7126,9 +7124,9 @@ Not reflected: the attribute is the consumer's input and stays as they
7126
7124
  wrote it, and `:state(checked)` carries the resolved state for
7127
7125
  stylesheets. */
7128
7126
  checked?: (HelixHeadlessSwitch["checked"]) | undefined;
7129
- /** Initial checked state for uncontrolled use, where nothing declared one. */
7127
+ /** Whether the markup declared it checked, which is where a reset returns to. */
7130
7128
  "default-checked"?: (HelixHeadlessSwitch["defaultChecked"]) | undefined;
7131
- /** Initial checked state for uncontrolled use, where nothing declared one. */
7129
+ /** Whether the markup declared it checked, which is where a reset returns to. */
7132
7130
  defaultChecked?: (HelixHeadlessSwitch["defaultChecked"]) | undefined;
7133
7131
  /** What is wrong, in the reader's words rather than the browser's. */
7134
7132
  feedback?: (HelixHeadlessSwitch["feedback"]) | undefined;
@@ -7416,11 +7414,11 @@ Writing always applies, so `<helix-tabs active="one">` starts on that
7416
7414
  tab, and `default-active` is how markup says where to start without
7417
7415
  naming the current one. */
7418
7416
  active?: (HelixHeadlessTabs["active"]) | undefined;
7419
- /** Initial item for uncontrolled use.
7417
+ /** Which item the markup declared current.
7420
7418
 
7421
7419
  Ignored once `active` is written. */
7422
7420
  "default-active"?: (HelixHeadlessTabs["defaultActive"]) | undefined;
7423
- /** Initial item for uncontrolled use.
7421
+ /** Which item the markup declared current.
7424
7422
 
7425
7423
  Ignored once `active` is written. */
7426
7424
  defaultActive?: (HelixHeadlessTabs["defaultActive"]) | undefined;
@@ -7752,9 +7750,9 @@ hydration, or diffed by a framework, it comes back holding whatever the
7752
7750
  last reader did rather than what the author wrote. `:state(open)` carries
7753
7751
  the resolved state for stylesheets, which is what the mirror is for. */
7754
7752
  open?: (HelixHeadlessTimeInput["open"]) | undefined;
7755
- /** Initial open state for uncontrolled use, where nothing declared one. */
7753
+ /** Whether the markup declared it open. Ignored once `open` is written. */
7756
7754
  "default-open"?: (HelixHeadlessTimeInput["defaultOpen"]) | undefined;
7757
- /** Initial open state for uncontrolled use, where nothing declared one. */
7755
+ /** Whether the markup declared it open. Ignored once `open` is written. */
7758
7756
  defaultOpen?: (HelixHeadlessTimeInput["defaultOpen"]) | undefined;
7759
7757
  /** What the control is called once everything is showing. */
7760
7758
  "collapse-label"?: (HelixHeadlessTimeInput["collapseLabel"]) | undefined;
@@ -8405,9 +8403,9 @@ hydration, or diffed by a framework, it comes back holding whatever the
8405
8403
  last reader did rather than what the author wrote. `:state(open)` carries
8406
8404
  the resolved state for stylesheets, which is what the mirror is for. */
8407
8405
  open?: (HelixHeadlessTooltip["open"]) | undefined;
8408
- /** Initial open state for uncontrolled use, where nothing declared one. */
8406
+ /** Whether the markup declared it open. Ignored once `open` is written. */
8409
8407
  "default-open"?: (HelixHeadlessTooltip["defaultOpen"]) | undefined;
8410
- /** Initial open state for uncontrolled use, where nothing declared one. */
8408
+ /** Whether the markup declared it open. Ignored once `open` is written. */
8411
8409
  defaultOpen?: (HelixHeadlessTooltip["defaultOpen"]) | undefined;
8412
8410
  };
8413
8411
 
@@ -8596,9 +8594,9 @@ hydration, or diffed by a framework, it comes back holding whatever the
8596
8594
  last reader did rather than what the author wrote. `:state(open)` carries
8597
8595
  the resolved state for stylesheets, which is what the mirror is for. */
8598
8596
  open?: (HelixHeadlessTreeItem["open"]) | undefined;
8599
- /** Initial open state for uncontrolled use, where nothing declared one. */
8597
+ /** Whether the markup declared it open. Ignored once `open` is written. */
8600
8598
  "default-open"?: (HelixHeadlessTreeItem["defaultOpen"]) | undefined;
8601
- /** Initial open state for uncontrolled use, where nothing declared one. */
8599
+ /** Whether the markup declared it open. Ignored once `open` is written. */
8602
8600
  defaultOpen?: (HelixHeadlessTreeItem["defaultOpen"]) | undefined;
8603
8601
  /** Depth from the root, counted by the tree so indentation needs no CSS nesting.
8604
8602
 
@@ -8708,11 +8706,11 @@ Writing always applies, so `<helix-tabs active="one">` starts on that
8708
8706
  tab, and `default-active` is how markup says where to start without
8709
8707
  naming the current one. */
8710
8708
  active?: (HelixHeadlessTree["active"]) | undefined;
8711
- /** Initial item for uncontrolled use.
8709
+ /** Which item the markup declared current.
8712
8710
 
8713
8711
  Ignored once `active` is written. */
8714
8712
  "default-active"?: (HelixHeadlessTree["defaultActive"]) | undefined;
8715
- /** Initial item for uncontrolled use.
8713
+ /** Which item the markup declared current.
8716
8714
 
8717
8715
  Ignored once `active` is written. */
8718
8716
  defaultActive?: (HelixHeadlessTree["defaultActive"]) | undefined;
@@ -8836,11 +8834,11 @@ Writing always applies, so `<helix-tabs active="one">` starts on that
8836
8834
  tab, and `default-active` is how markup says where to start without
8837
8835
  naming the current one. */
8838
8836
  active?: (HelixHeadlessVideoPlaylist["active"]) | undefined;
8839
- /** Initial item for uncontrolled use.
8837
+ /** Which item the markup declared current.
8840
8838
 
8841
8839
  Ignored once `active` is written. */
8842
8840
  "default-active"?: (HelixHeadlessVideoPlaylist["defaultActive"]) | undefined;
8843
- /** Initial item for uncontrolled use.
8841
+ /** Which item the markup declared current.
8844
8842
 
8845
8843
  Ignored once `active` is written. */
8846
8844
  defaultActive?: (HelixHeadlessVideoPlaylist["defaultActive"]) | undefined;
@@ -9437,7 +9435,7 @@ export interface WcToolkitVueGlobalComponents {
9437
9435
  HelixHeadlessCopyButtonVueProps,
9438
9436
  HelixHeadlessCopyButtonVueEvents
9439
9437
  >;
9440
- /** **The schema is markup and the data is a property.** Columns are declared as 'TableColumn' children, because a schema is small and something a reader should see in the HTML; rows are handed over as an array, because a table that draws ten thousand elements cannot window them. '''html <helix-headless-data-table .rows=${rows} sort="name:asc" page-size="20"> <helix-headless-table-column field="name" sortable>Name</helix-headless-table-column> <helix-headless-table-column field="size" align="end" sortable .cell=${bytes}>Size</helix-headless-table-column> </helix-headless-data-table> ''' 'Table' takes rows as markup and is the right component for a table of twelve things a person wrote out. **Sort and filter apply to the whole set, never the page.** Sorting the drawn window is correct on the first screen and wrong on every other one. **The cell values do not server-render.** The headings do, and the row elements do, but reading a cell needs the columns, and the columns are markup children Lit SSR does not hand this element. So a crawler sees a table of the right shape with nothing in it. That is the cost of the first paragraph: use 'Table' where the served HTML has to carry the values. **'selectable' adds a column of checkboxes, keyed on 'row-key'.** A row is selected by its identity rather than its position, so a selection survives a sort, a filter and a page. 'selected' is the chosen keys, comma separated, the shape Listbox uses for a multiple choice, and like 'sort' it is controlled when set and seeded by 'default-selected'. The box in the heading selects every row in the result, across pages, and shows a dash while only some are chosen. Choosing one of many, rather than several, is opening a row, and that is a link or a button in a cell rather than a selection. **A reader can size and order the columns.** 'resizable' on a column puts a separator on its edge; 'reorderable' on the table puts a grip on each heading that has a 'field', moved by dragging or with the arrow keys. The order lands in 'order' as fields, and the consumer's own markup is never rewritten: the table assigns the headings to its header in that order instead. **'csv()' hands back the result as text**: every row the filter lets through, in the order on screen, in the columns on screen. Saving it is the page's business, the same as any other file. **There is no 'columns' attribute here, and Table has one.** The difference is what a column is in each: here it is the schema, so a table without one has nothing to read a row with, and every column is a place to write a 'width'. A Table holds cells a consumer wrote and can be written with no column at all, so its 'columns' is where such a table is sized from. Written on this element the attribute is inert, which is the trap worth knowing when moving between the two. */
9438
+ /** **The schema is markup and the data is a property.** Columns are declared as 'TableColumn' children, because a schema is small and something a reader should see in the HTML; rows are handed over as an array, because a table that draws ten thousand elements cannot window them. '''html <helix-headless-data-table .rows=${rows} sort="name:asc" page-size="20"> <helix-headless-table-column field="name" sortable>Name</helix-headless-table-column> <helix-headless-table-column field="size" align="end" sortable .cell=${bytes}>Size</helix-headless-table-column> </helix-headless-data-table> ''' 'Table' takes rows as markup and is the right component for a table of twelve things a person wrote out. **Sort and filter apply to the whole set, never the page.** Sorting the drawn window is correct on the first screen and wrong on every other one. **The cell values do not server-render.** The headings do, and the row elements do, but reading a cell needs the columns, and the columns are markup children Lit SSR does not hand this element. So a crawler sees a table of the right shape with nothing in it. That is the cost of the first paragraph: use 'Table' where the served HTML has to carry the values. **'selectable' adds a column of checkboxes, keyed on 'row-key'.** A row is selected by its identity rather than its position, so a selection survives a sort, a filter and a page. 'selected' is the chosen keys, comma separated, the shape Listbox uses for a multiple choice, and like 'sort' writing it applies while 'default-selected' is what the markup declared. The box in the heading selects every row in the result, across pages, and shows a dash while only some are chosen. Choosing one of many, rather than several, is opening a row, and that is a link or a button in a cell rather than a selection. **A reader can size and order the columns.** 'resizable' on a column puts a separator on its edge; 'reorderable' on the table puts a grip on each heading that has a 'field', moved by dragging or with the arrow keys. The order lands in 'order' as fields, and the consumer's own markup is never rewritten: the table assigns the headings to its header in that order instead. **'csv()' hands back the result as text**: every row the filter lets through, in the order on screen, in the columns on screen. Saving it is the page's business, the same as any other file. **There is no 'columns' attribute here, and Table has one.** The difference is what a column is in each: here it is the schema, so a table without one has nothing to read a row with, and every column is a place to write a 'width'. A Table holds cells a consumer wrote and can be written with no column at all, so its 'columns' is where such a table is sized from. Written on this element the attribute is inert, which is the trap worth knowing when moving between the two. */
9441
9439
  "helix-headless-data-table": DefineCustomElement<
9442
9440
  HelixHeadlessDataTable,
9443
9441
  HelixHeadlessDataTableVueProps,
@@ -9539,7 +9537,7 @@ export interface WcToolkitVueGlobalComponents {
9539
9537
  HelixHeadlessFilterOperatorVueProps,
9540
9538
  HelixHeadlessFilterOperatorVueEvents
9541
9539
  >;
9542
- /** **The tokens are the consumer's own elements, slotted.** What a filter narrows by belongs to the consumer's model rather than to this element: a facet with a prefix, a saved query, a range. So they are slotted rather than rendered from a list of strings, and removing one is a request this element makes rather than a change it applies. Combobox is the other way round, and that is the difference between the two: its tokens are a view of a selection it owns, drawn from options it was handed. **'value' is the text being typed, not the tokens**, which is what makes this a field a consumer can listen to. Every keystroke announces 'input' with the text on the element, so a table narrows as the reader types. The tokens need no reporting back, being markup the consumer already holds. Backspace on an empty field asks the last token to go, through the same 'helix-dismiss' its own remove control fires, so a consumer who handled the pointer has already handled the keyboard. **It reads what was declared, and nothing that was not.** Write 'FilterField's (usually inside the 'FilterMenu' slotted into 'start', so the picker and the text work off one set), and Enter reads the box against them: 'disposition:refunded,settled' and '-disposition:refunded' announce 'helix-facet', exactly as ticking those values in the picker would, and the text they were read from goes. Everything else stays where it was typed, so 'refund tuesday disposition:settled' is a filter and a search at once. 'grammar.ts' carries the whole rule and is worth reading before relying on it; the short version is that Helix owns the punctuation and the consumer owns every word in it. A field with no 'FilterField' in it parses nothing, which is the behavior this had before it could. **A field whose values cannot be listed belongs here rather than in the picker.** 'assignee:ada' is a filter and nobody wants to enumerate every name in the company, but a menu page for it would have nothing on it to press. Written directly inside this element it is read by the grammar and never offered as a page: unslotted, so nothing draws it, which is the same trick 'FilterField' already plays on its own children. **It can suggest what to type next, and deciding what to suggest is still the consumer's.** Slot options into 'suggestions' and the field shows them, moves through them with the arrows, and lets Enter press one; the option fires its own 'helix-select' and the consumer decides what choosing meant. Keys before a colon and values after it are the same panel with different contents, and 'readFilterText' is exported for a consumer narrowing that panel against what a reader has half typed. **The panel opens when there is something in it and closes when there is not**, rather than on a choice. A reader who picks a key wants its values next, and closing on the choice would shut the panel between two renders. Use 'selectionStart' and 'setSelectionRange' to write a completion back and put the caret after it, or the next parse reads the wrong term. **Three things here have three different owners, and only one of them is a controlled property.** 'value' is the text, and it is uncontrolled by default: the reader types, the element applies it, and 'input' says so. **Writing 'value' does not take that over.** It is a seed and a correction, so a consumer who sets it and then expects the field to hold still will watch the next keystroke overwrite them. Ownership is taken by refusing 'helix-before-change' and writing the value you want, which is the same shape every field in this library uses and is worth saying out loud here because the property looks like React's. 'default-value' seeds the field without claiming anything. 'open' is the suggestions panel, and it is the ordinary controlled pair: refuse 'helix-before-open' or 'helix-before-close' to take the decision, and 'default-open' to seed it. The tokens are neither, because they are not state. They are the consumer's own elements in a slot, so there is nothing for this to own and nothing to report back: a token goes when the consumer removes it from their markup, having been asked by 'helix-dismiss'. **A 'FilterChip' naming a declared field is asked differently**, and it has to be: the picker holds what is ticked, so a chip that removed itself without telling it left the value ticked in a list nobody could see was wrong. That dismissal is answered as the field being filtered by nothing, so it arrives as 'helix-facet' like every other change and the chip goes because the filter went. */
9540
+ /** **The tokens are the consumer's own elements, slotted.** What a filter narrows by belongs to the consumer's model rather than to this element: a facet with a prefix, a saved query, a range. So they are slotted rather than rendered from a list of strings, and removing one is a request this element makes rather than a change it applies. Combobox is the other way round, and that is the difference between the two: its tokens are a view of a selection it owns, drawn from options it was handed. **'value' is the text being typed, not the tokens**, which is what makes this a field a consumer can listen to. Every keystroke announces 'input' with the text on the element, so a table narrows as the reader types. The tokens need no reporting back, being markup the consumer already holds. Backspace on an empty field asks the last token to go, through the same 'helix-dismiss' its own remove control fires, so a consumer who handled the pointer has already handled the keyboard. **It reads what was declared, and nothing that was not.** Write 'FilterField's (usually inside the 'FilterMenu' slotted into 'start', so the picker and the text work off one set), and Enter reads the box against them: 'disposition:refunded,settled' and '-disposition:refunded' announce 'helix-facet', exactly as ticking those values in the picker would, and the text they were read from goes. Everything else stays where it was typed, so 'refund tuesday disposition:settled' is a filter and a search at once. 'grammar.ts' carries the whole rule and is worth reading before relying on it; the short version is that Helix owns the punctuation and the consumer owns every word in it. A field with no 'FilterField' in it parses nothing, which is the behavior this had before it could. **A field whose values cannot be listed belongs here rather than in the picker.** 'assignee:ada' is a filter and nobody wants to enumerate every name in the company, but a menu page for it would have nothing on it to press. Written directly inside this element it is read by the grammar and never offered as a page: unslotted, so nothing draws it, which is the same trick 'FilterField' already plays on its own children. **It can suggest what to type next, and deciding what to suggest is still the consumer's.** Slot options into 'suggestions' and the field shows them, moves through them with the arrows, and lets Enter press one; the option fires its own 'helix-select' and the consumer decides what choosing meant. Keys before a colon and values after it are the same panel with different contents, and 'readFilterText' is exported for a consumer narrowing that panel against what a reader has half typed. **The panel opens when there is something in it and closes when there is not**, rather than on a choice. A reader who picks a key wants its values next, and closing on the choice would shut the panel between two renders. Use 'selectionStart' and 'setSelectionRange' to write a completion back and put the caret after it, or the next parse reads the wrong term. **Three things here have three different owners.** 'value' is the text: the reader types, the element applies it, and 'input' says so. **Writing 'value' does not take that over.** It is a seed and a correction, so a consumer who sets it and then expects the field to hold still will watch the next keystroke overwrite them. Ownership is taken by refusing 'helix-before-change' and writing the value you want, which is the same shape every field in this library uses and is worth saying out loud here because the property looks like React's. 'default-value' seeds the field without claiming anything. 'open' is the suggestions panel, and it is the ordinary pair: refuse 'helix-before-open' or 'helix-before-close' to take the decision, and 'default-open' to seed it. The tokens are neither, because they are not state. They are the consumer's own elements in a slot, so there is nothing for this to own and nothing to report back: a token goes when the consumer removes it from their markup, having been asked by 'helix-dismiss'. **A 'FilterChip' naming a declared field is asked differently**, and it has to be: the picker holds what is ticked, so a chip that removed itself without telling it left the value ticked in a list nobody could see was wrong. That dismissal is answered as the field being filtered by nothing, so it arrives as 'helix-facet' like every other change and the chip goes because the filter went. */
9543
9541
  "helix-headless-filter-input": DefineCustomElement<
9544
9542
  HelixHeadlessFilterInput,
9545
9543
  HelixHeadlessFilterInputVueProps,
@@ -9707,7 +9705,7 @@ export interface WcToolkitVueGlobalComponents {
9707
9705
  HelixHeadlessPaginationVueProps,
9708
9706
  HelixHeadlessPaginationVueEvents
9709
9707
  >;
9710
- /** Its own element beside 'Pagination' rather than a slot inside it, for the reason 'Pagination.Summary' is: a footer's direction and order are the consumer's, and a control that can only sit at one end of one row has taken that decision for them. **'Select', not a native '<select>'.** Two dropdowns identical closed and different open meet each other in the same footer as a table's filters. The caret is 'Select''s rather than a color literal baked into a data URI, because a background image cannot read 'currentColor', and the label is a real '<label for>' against the trigger's own id. **The label sits on the row, not above it.** 'Select''s host is a column, and an outer-tree rule beats a ':host' rule, so turning it into a row needs no property on 'Select' and nothing written into the consumer's markup. **An empty 'sizes' renders nothing**, rather than falling back to the built-in list, which would be a component overruling a consumer who said "none". Same rule as 'Pagination' over a single page, and reported the same way, through 'ElementInternals.states' rather than an attribute the server never wrote. 'value' is the controlled property and 'default-value' seeds one this owns. Changing it announces 'helix-before-change'; re-querying and moving back to page one is the consumer's, because only they know whether the reader's position should survive it. */
9708
+ /** Its own element beside 'Pagination' rather than a slot inside it, for the reason 'Pagination.Summary' is: a footer's direction and order are the consumer's, and a control that can only sit at one end of one row has taken that decision for them. **'Select', not a native '<select>'.** Two dropdowns identical closed and different open meet each other in the same footer as a table's filters. The caret is 'Select''s rather than a color literal baked into a data URI, because a background image cannot read 'currentColor', and the label is a real '<label for>' against the trigger's own id. **The label sits on the row, not above it.** 'Select''s host is a column, and an outer-tree rule beats a ':host' rule, so turning it into a row needs no property on 'Select' and nothing written into the consumer's markup. **An empty 'sizes' renders nothing**, rather than falling back to the built-in list, which would be a component overruling a consumer who said "none". Same rule as 'Pagination' over a single page, and reported the same way, through 'ElementInternals.states' rather than an attribute the server never wrote. 'value' is the size the control holds and 'default-value' is what the markup declared. Changing it announces 'helix-before-change'; re-querying and moving back to page one is the consumer's, because only they know whether the reader's position should survive it. */
9711
9709
  "helix-headless-pagination-size": DefineCustomElement<
9712
9710
  HelixHeadlessPaginationSize,
9713
9711
  HelixHeadlessPaginationSizeVueProps,