@fusion.dev/helix-headless 0.152.0 → 0.154.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/custom-elements.json +1143 -62
  2. package/dist/area-chart/root/area-chart-root.d.ts +16 -1
  3. package/dist/area-chart/root/area-chart-root.js +3 -3
  4. package/dist/badge/root/badge-root.d.ts +15 -2
  5. package/dist/badge/root/badge-root.js +20 -3
  6. package/dist/bar-chart/root/bar-chart-root.d.ts +16 -1
  7. package/dist/bar-chart/root/bar-chart-root.js +3 -3
  8. package/dist/card/root/card-root.d.ts +31 -11
  9. package/dist/card/root/card-root.js +25 -11
  10. package/dist/code/root/code-root.d.ts +7 -0
  11. package/dist/code/root/code-root.js +1 -1
  12. package/dist/code-block/root/code-block-root.d.ts +37 -1
  13. package/dist/code-block/root/code-block-root.js +38 -5
  14. package/dist/empty/root/empty-root.d.ts +19 -1
  15. package/dist/empty/root/empty-root.js +13 -4
  16. package/dist/heatmap/root/heatmap-root.d.ts +3 -0
  17. package/dist/heatmap/root/heatmap-root.js +2 -8
  18. package/dist/icon/fetch.d.ts +20 -0
  19. package/dist/icon/fetch.js +70 -0
  20. package/dist/icon/root/icon-root.d.ts +27 -5
  21. package/dist/icon/root/icon-root.js +41 -17
  22. package/dist/line-chart/root/line-chart-root.d.ts +16 -1
  23. package/dist/line-chart/root/line-chart-root.js +3 -3
  24. package/dist/loader/root/loader-root.d.ts +5 -0
  25. package/dist/progress/root/progress-root.d.ts +16 -1
  26. package/dist/progress/root/progress-root.js +12 -4
  27. package/dist/quote/root/quote-root.d.ts +17 -1
  28. package/dist/quote/root/quote-root.js +15 -2
  29. package/dist/scatter-chart/root/scatter-chart-root.d.ts +16 -1
  30. package/dist/scatter-chart/root/scatter-chart-root.js +3 -3
  31. package/dist/skeleton/root/skeleton-root.d.ts +7 -0
  32. package/dist/skeleton/root/skeleton-root.js +4 -1
  33. package/dist/stat/group/stat-group.d.ts +23 -4
  34. package/dist/stat/group/stat-group.js +13 -1
  35. package/dist/stat/root/stat-root.d.ts +46 -1
  36. package/dist/stat/root/stat-root.js +29 -5
  37. package/lint.json +1 -1
  38. package/package.json +5 -5
  39. package/types/jsx.d.ts +1434 -62
  40. package/types/vue.d.ts +297 -24
  41. package/types/words.d.ts +69 -0
package/types/vue.d.ts CHANGED
@@ -663,6 +663,25 @@ them, and the tooltip and the table hold every reading. */
663
663
  Absent draws none: bands read as a composition need no numbers beside
664
664
  them, and the tooltip and the table hold every reading. */
665
665
  valueAxis?: (HelixHeadlessAreaChart["valueAxis"]) | undefined;
666
+ /** The words shown in place of the drawing when the table has no readings,
667
+ and the fallback of the `empty` slot. */
668
+ "empty-text"?: (HelixHeadlessAreaChart["emptyText"]) | undefined;
669
+ /** The words shown in place of the drawing when the table has no readings,
670
+ and the fallback of the `empty` slot. */
671
+ emptyText?: (HelixHeadlessAreaChart["emptyText"]) | undefined;
672
+ /** Whether the readings are still on their way. The chart shows
673
+ `loading-text` in place of an empty drawing until it has readings.
674
+
675
+ Reflected, so a stylesheet can treat the chart while it waits. A chart
676
+ that already has readings keeps drawing them, so a refresh does not
677
+ blank it. */
678
+ loading?: (HelixHeadlessAreaChart["loading"]) | undefined;
679
+ /** The words shown in place of the drawing while `loading` is set and
680
+ there are no readings yet, and the fallback of the `loading` slot. */
681
+ "loading-text"?: (HelixHeadlessAreaChart["loadingText"]) | undefined;
682
+ /** The words shown in place of the drawing while `loading` is set and
683
+ there are no readings yet, and the fallback of the `loading` slot. */
684
+ loadingText?: (HelixHeadlessAreaChart["loadingText"]) | undefined;
666
685
  /** The id of the table to read.
667
686
 
668
687
  Names a table in the same tree, so a chart inside another component's
@@ -699,6 +718,29 @@ Set it to the words of the page's language, such as `{position} von
699
718
  {count}`, or to nothing to say no position. A slice or a series a
700
719
  legend hid is not counted. */
701
720
  positionLabel?: (HelixHeadlessAreaChart["positionLabel"]) | undefined;
721
+ /** The readings as data, in the shape of a table, where the page has no
722
+ table to point `for` at. `for` wins where both are set.
723
+
724
+ ```js
725
+ chart.data = {
726
+ caption: 'Sessions by channel',
727
+ columns: ['Month', 'Direct', 'Referral'],
728
+ rows: [['Jan', 10, 4], ['Feb', 20, 8]],
729
+ }
730
+ ```
731
+
732
+ The first column holds each row's label and every column after it a
733
+ series, as in a table. A cell is a number, words, `null` for a blank,
734
+ or `{ value, text }` for a number shown as words, such as `$128k`. A
735
+ number is shown in `locale`.
736
+
737
+ **A table is still the better source where the page can show one**:
738
+ it reads with no script and before hydration, and a reader can sort and
739
+ copy it. Data is drawn on the client only, so a server serves the
740
+ frame, and the summary, the keys and the readout are then the whole of
741
+ what a screen reader is given. Set a new object to redraw: the chart
742
+ does not look inside the one it has. */
743
+ data?: (HelixHeadlessAreaChart["data"]) | undefined;
702
744
  };
703
745
 
704
746
  export type HelixHeadlessAreaChartVueEvents = {
@@ -1001,6 +1043,25 @@ bottom of bars under `orientation="horizontal"`.
1001
1043
  Absent draws none with one scale, since bars compared with each other need
1002
1044
  no numbers. With `secondary` both scales are drawn whatever this says. */
1003
1045
  valueAxis?: (HelixHeadlessBarChart["valueAxis"]) | undefined;
1046
+ /** The words shown in place of the drawing when the table has no readings,
1047
+ and the fallback of the `empty` slot. */
1048
+ "empty-text"?: (HelixHeadlessBarChart["emptyText"]) | undefined;
1049
+ /** The words shown in place of the drawing when the table has no readings,
1050
+ and the fallback of the `empty` slot. */
1051
+ emptyText?: (HelixHeadlessBarChart["emptyText"]) | undefined;
1052
+ /** Whether the readings are still on their way. The chart shows
1053
+ `loading-text` in place of an empty drawing until it has readings.
1054
+
1055
+ Reflected, so a stylesheet can treat the chart while it waits. A chart
1056
+ that already has readings keeps drawing them, so a refresh does not
1057
+ blank it. */
1058
+ loading?: (HelixHeadlessBarChart["loading"]) | undefined;
1059
+ /** The words shown in place of the drawing while `loading` is set and
1060
+ there are no readings yet, and the fallback of the `loading` slot. */
1061
+ "loading-text"?: (HelixHeadlessBarChart["loadingText"]) | undefined;
1062
+ /** The words shown in place of the drawing while `loading` is set and
1063
+ there are no readings yet, and the fallback of the `loading` slot. */
1064
+ loadingText?: (HelixHeadlessBarChart["loadingText"]) | undefined;
1004
1065
  /** The id of the table to read.
1005
1066
 
1006
1067
  Names a table in the same tree, so a chart inside another component's
@@ -1037,6 +1098,29 @@ Set it to the words of the page's language, such as `{position} von
1037
1098
  {count}`, or to nothing to say no position. A slice or a series a
1038
1099
  legend hid is not counted. */
1039
1100
  positionLabel?: (HelixHeadlessBarChart["positionLabel"]) | undefined;
1101
+ /** The readings as data, in the shape of a table, where the page has no
1102
+ table to point `for` at. `for` wins where both are set.
1103
+
1104
+ ```js
1105
+ chart.data = {
1106
+ caption: 'Sessions by channel',
1107
+ columns: ['Month', 'Direct', 'Referral'],
1108
+ rows: [['Jan', 10, 4], ['Feb', 20, 8]],
1109
+ }
1110
+ ```
1111
+
1112
+ The first column holds each row's label and every column after it a
1113
+ series, as in a table. A cell is a number, words, `null` for a blank,
1114
+ or `{ value, text }` for a number shown as words, such as `$128k`. A
1115
+ number is shown in `locale`.
1116
+
1117
+ **A table is still the better source where the page can show one**:
1118
+ it reads with no script and before hydration, and a reader can sort and
1119
+ copy it. Data is drawn on the client only, so a server serves the
1120
+ frame, and the summary, the keys and the readout are then the whole of
1121
+ what a screen reader is given. Set a new object to redraw: the chart
1122
+ does not look inside the one it has. */
1123
+ data?: (HelixHeadlessBarChart["data"]) | undefined;
1040
1124
  };
1041
1125
 
1042
1126
  export type HelixHeadlessBarChartVueEvents = {
@@ -2079,10 +2163,6 @@ twice what this says once.
2079
2163
  Reflected and undefaulted, so a card that has not asked reads as a card
2080
2164
  with no attribute on it and the stylesheet only describes the departure. */
2081
2165
  mediaPlacement?: (HelixHeadlessCard["mediaPlacement"]) | undefined;
2082
- /** */
2083
- "aria-labelledby"?: unknown;
2084
- /** */
2085
- "aria-label"?: unknown;
2086
2166
  };
2087
2167
 
2088
2168
  export type HelixHeadlessCardVueEvents = {};
@@ -2899,6 +2979,22 @@ export type HelixHeadlessCheckboxVueEvents = {
2899
2979
  };
2900
2980
 
2901
2981
  export type HelixHeadlessCodeBlockVueProps = {
2982
+ /** The name of a block that scrolls, which is a tab stop while it does.
2983
+
2984
+ Where the block has a name, the scroller says it too, such as "Code,
2985
+ app.ts", as `code-name-label` puts it. */
2986
+ "code-label"?: (HelixHeadlessCodeBlock["codeLabel"]) | undefined;
2987
+ /** The name of a block that scrolls, which is a tab stop while it does.
2988
+
2989
+ Where the block has a name, the scroller says it too, such as "Code,
2990
+ app.ts", as `code-name-label` puts it. */
2991
+ codeLabel?: (HelixHeadlessCodeBlock["codeLabel"]) | undefined;
2992
+ /** The name of a block that scrolls, where the block has a name. `{code}` is
2993
+ `code-label` and `{name}` the block's name. */
2994
+ "code-name-label"?: (HelixHeadlessCodeBlock["codeNameLabel"]) | undefined;
2995
+ /** The name of a block that scrolls, where the block has a name. `{code}` is
2996
+ `code-label` and `{name}` the block's name. */
2997
+ codeNameLabel?: (HelixHeadlessCodeBlock["codeNameLabel"]) | undefined;
2902
2998
  /** The expand button's words while the block shows every line. */
2903
2999
  "collapse-label"?: (HelixHeadlessCodeBlock["collapseLabel"]) | undefined;
2904
3000
  /** The expand button's words while the block shows every line. */
@@ -5748,6 +5844,29 @@ Set it to the words of the page's language, such as `{position} von
5748
5844
  {count}`, or to nothing to say no position. A slice or a series a
5749
5845
  legend hid is not counted. */
5750
5846
  positionLabel?: (HelixHeadlessDonutChart["positionLabel"]) | undefined;
5847
+ /** The readings as data, in the shape of a table, where the page has no
5848
+ table to point `for` at. `for` wins where both are set.
5849
+
5850
+ ```js
5851
+ chart.data = {
5852
+ caption: 'Sessions by channel',
5853
+ columns: ['Month', 'Direct', 'Referral'],
5854
+ rows: [['Jan', 10, 4], ['Feb', 20, 8]],
5855
+ }
5856
+ ```
5857
+
5858
+ The first column holds each row's label and every column after it a
5859
+ series, as in a table. A cell is a number, words, `null` for a blank,
5860
+ or `{ value, text }` for a number shown as words, such as `$128k`. A
5861
+ number is shown in `locale`.
5862
+
5863
+ **A table is still the better source where the page can show one**:
5864
+ it reads with no script and before hydration, and a reader can sort and
5865
+ copy it. Data is drawn on the client only, so a server serves the
5866
+ frame, and the summary, the keys and the readout are then the whole of
5867
+ what a screen reader is given. Set a new object to redraw: the chart
5868
+ does not look inside the one it has. */
5869
+ data?: (HelixHeadlessDonutChart["data"]) | undefined;
5751
5870
  };
5752
5871
 
5753
5872
  export type HelixHeadlessDonutChartVueEvents = {};
@@ -7175,6 +7294,29 @@ Set it to the words of the page's language, such as `{position} von
7175
7294
  {count}`, or to nothing to say no position. A slice or a series a
7176
7295
  legend hid is not counted. */
7177
7296
  positionLabel?: (HelixHeadlessHeatmap["positionLabel"]) | undefined;
7297
+ /** The readings as data, in the shape of a table, where the page has no
7298
+ table to point `for` at. `for` wins where both are set.
7299
+
7300
+ ```js
7301
+ chart.data = {
7302
+ caption: 'Sessions by channel',
7303
+ columns: ['Month', 'Direct', 'Referral'],
7304
+ rows: [['Jan', 10, 4], ['Feb', 20, 8]],
7305
+ }
7306
+ ```
7307
+
7308
+ The first column holds each row's label and every column after it a
7309
+ series, as in a table. A cell is a number, words, `null` for a blank,
7310
+ or `{ value, text }` for a number shown as words, such as `$128k`. A
7311
+ number is shown in `locale`.
7312
+
7313
+ **A table is still the better source where the page can show one**:
7314
+ it reads with no script and before hydration, and a reader can sort and
7315
+ copy it. Data is drawn on the client only, so a server serves the
7316
+ frame, and the summary, the keys and the readout are then the whole of
7317
+ what a screen reader is given. Set a new object to redraw: the chart
7318
+ does not look inside the one it has. */
7319
+ data?: (HelixHeadlessHeatmap["data"]) | undefined;
7178
7320
  };
7179
7321
 
7180
7322
  export type HelixHeadlessHeatmapVueEvents = {
@@ -7408,6 +7550,11 @@ the value instead.
7408
7550
  A name written `prefix:name` asks the library registered under that
7409
7551
  prefix. */
7410
7552
  name?: (HelixHeadlessIcon["name"]) | undefined;
7553
+ /** The URL of an SVG file to draw, fetched once a page and drawn in
7554
+ `currentColor` where the file does not color its shapes.
7555
+
7556
+ Wins over `name`; `icon` wins over both. Absent draws `name`. */
7557
+ src?: (HelixHeadlessIcon["src"]) | undefined;
7411
7558
  /** The icon to draw, as an object you import.
7412
7559
 
7413
7560
  **The scalable door, and the one this library uses internally.** An icon is
@@ -7424,9 +7571,9 @@ for. Set both and this wins, the value being the more specific statement. */
7424
7571
  };
7425
7572
 
7426
7573
  export type HelixHeadlessIconVueEvents = {
7427
- /** `name` matches no registered icon and no library answers it, so nothing is drawn. */
7574
+ /** `name` matches no registered icon and no library answers it, or `src` is no SVG, so nothing is drawn. */
7428
7575
  error: HelixHeadlessIconElementEvent;
7429
- /** A glyph a library gave later for `name` is drawn. */
7576
+ /** A glyph a library gave later for `name`, or the file at `src`, is drawn. */
7430
7577
  load: HelixHeadlessIconElementEvent;
7431
7578
  };
7432
7579
 
@@ -8247,6 +8394,25 @@ Set it where the distance from nothing is the point rather than the shape,
8247
8394
  and accept that a series which never approaches zero becomes a flat rule
8248
8395
  near the top of the box. */
8249
8396
  zero?: (HelixHeadlessLineChart["zero"]) | undefined;
8397
+ /** The words shown in place of the drawing when the table has no readings,
8398
+ and the fallback of the `empty` slot. */
8399
+ "empty-text"?: (HelixHeadlessLineChart["emptyText"]) | undefined;
8400
+ /** The words shown in place of the drawing when the table has no readings,
8401
+ and the fallback of the `empty` slot. */
8402
+ emptyText?: (HelixHeadlessLineChart["emptyText"]) | undefined;
8403
+ /** Whether the readings are still on their way. The chart shows
8404
+ `loading-text` in place of an empty drawing until it has readings.
8405
+
8406
+ Reflected, so a stylesheet can treat the chart while it waits. A chart
8407
+ that already has readings keeps drawing them, so a refresh does not
8408
+ blank it. */
8409
+ loading?: (HelixHeadlessLineChart["loading"]) | undefined;
8410
+ /** The words shown in place of the drawing while `loading` is set and
8411
+ there are no readings yet, and the fallback of the `loading` slot. */
8412
+ "loading-text"?: (HelixHeadlessLineChart["loadingText"]) | undefined;
8413
+ /** The words shown in place of the drawing while `loading` is set and
8414
+ there are no readings yet, and the fallback of the `loading` slot. */
8415
+ loadingText?: (HelixHeadlessLineChart["loadingText"]) | undefined;
8250
8416
  /** The id of the table to read.
8251
8417
 
8252
8418
  Names a table in the same tree, so a chart inside another component's
@@ -8283,6 +8449,29 @@ Set it to the words of the page's language, such as `{position} von
8283
8449
  {count}`, or to nothing to say no position. A slice or a series a
8284
8450
  legend hid is not counted. */
8285
8451
  positionLabel?: (HelixHeadlessLineChart["positionLabel"]) | undefined;
8452
+ /** The readings as data, in the shape of a table, where the page has no
8453
+ table to point `for` at. `for` wins where both are set.
8454
+
8455
+ ```js
8456
+ chart.data = {
8457
+ caption: 'Sessions by channel',
8458
+ columns: ['Month', 'Direct', 'Referral'],
8459
+ rows: [['Jan', 10, 4], ['Feb', 20, 8]],
8460
+ }
8461
+ ```
8462
+
8463
+ The first column holds each row's label and every column after it a
8464
+ series, as in a table. A cell is a number, words, `null` for a blank,
8465
+ or `{ value, text }` for a number shown as words, such as `$128k`. A
8466
+ number is shown in `locale`.
8467
+
8468
+ **A table is still the better source where the page can show one**:
8469
+ it reads with no script and before hydration, and a reader can sort and
8470
+ copy it. Data is drawn on the client only, so a server serves the
8471
+ frame, and the summary, the keys and the readout are then the whole of
8472
+ what a screen reader is given. Set a new object to redraw: the chart
8473
+ does not look inside the one it has. */
8474
+ data?: (HelixHeadlessLineChart["data"]) | undefined;
8286
8475
  };
8287
8476
 
8288
8477
  export type HelixHeadlessLineChartVueEvents = {
@@ -11443,7 +11632,8 @@ decimals. Written as JSON in the attribute.
11443
11632
 
11444
11633
  A `percent` style writes the share of the range, and any other the value
11445
11634
  itself, so the example says "18 GB". Absent is a whole percentage. The
11446
- words are announced as well as shown. `value-text` still wins. */
11635
+ words are announced whether or not `show-value` shows them. `value-text`
11636
+ still wins. */
11447
11637
  "format-options"?: (HelixHeadlessProgress["formatOptions"]) | undefined;
11448
11638
  /** `Intl.NumberFormat` options the reading is written with, as React Aria's
11449
11639
  Meter and ProgressBar take them: a unit, a currency, or a number of
@@ -11455,7 +11645,8 @@ decimals. Written as JSON in the attribute.
11455
11645
 
11456
11646
  A `percent` style writes the share of the range, and any other the value
11457
11647
  itself, so the example says "18 GB". Absent is a whole percentage. The
11458
- words are announced as well as shown. `value-text` still wins. */
11648
+ words are announced whether or not `show-value` shows them. `value-text`
11649
+ still wins. */
11459
11650
  formatOptions?: (HelixHeadlessProgress["formatOptions"]) | undefined;
11460
11651
  /** Whether the length of the task is unknown. The bar then shows activity
11461
11652
  without a value.
@@ -11610,6 +11801,20 @@ export type HelixHeadlessQrCodeVueEvents = {
11610
11801
  export type HelixHeadlessQuoteVueProps = {
11611
11802
  /** URL identifying where the quotation came from. */
11612
11803
  cite?: (HelixHeadlessQuote["cite"]) | undefined;
11804
+ /** Whether to leave the quotation marks off, for a quotation set where the
11805
+ page draws its own.
11806
+
11807
+ Negative, because the marks are on by default and a boolean attribute is
11808
+ true whenever it is present. Reflected, because a stylesheet takes the
11809
+ marks off on it. */
11810
+ "no-marks"?: (HelixHeadlessQuote["noMarks"]) | undefined;
11811
+ /** Whether to leave the quotation marks off, for a quotation set where the
11812
+ page draws its own.
11813
+
11814
+ Negative, because the marks are on by default and a boolean attribute is
11815
+ true whenever it is present. Reflected, because a stylesheet takes the
11816
+ marks off on it. */
11817
+ noMarks?: (HelixHeadlessQuote["noMarks"]) | undefined;
11613
11818
  };
11614
11819
 
11615
11820
  export type HelixHeadlessQuoteVueEvents = {};
@@ -12088,6 +12293,25 @@ Absent draws none. A series with fewer than two points, or with every
12088
12293
  point at one measure across, has no line to draw. The summary already
12089
12294
  gives each series' correlation, which says how near the points are to it. */
12090
12295
  trend?: (HelixHeadlessScatterChart["trend"]) | undefined;
12296
+ /** The words shown in place of the drawing when the table has no readings,
12297
+ and the fallback of the `empty` slot. */
12298
+ "empty-text"?: (HelixHeadlessScatterChart["emptyText"]) | undefined;
12299
+ /** The words shown in place of the drawing when the table has no readings,
12300
+ and the fallback of the `empty` slot. */
12301
+ emptyText?: (HelixHeadlessScatterChart["emptyText"]) | undefined;
12302
+ /** Whether the readings are still on their way. The chart shows
12303
+ `loading-text` in place of an empty drawing until it has readings.
12304
+
12305
+ Reflected, so a stylesheet can treat the chart while it waits. A chart
12306
+ that already has readings keeps drawing them, so a refresh does not
12307
+ blank it. */
12308
+ loading?: (HelixHeadlessScatterChart["loading"]) | undefined;
12309
+ /** The words shown in place of the drawing while `loading` is set and
12310
+ there are no readings yet, and the fallback of the `loading` slot. */
12311
+ "loading-text"?: (HelixHeadlessScatterChart["loadingText"]) | undefined;
12312
+ /** The words shown in place of the drawing while `loading` is set and
12313
+ there are no readings yet, and the fallback of the `loading` slot. */
12314
+ loadingText?: (HelixHeadlessScatterChart["loadingText"]) | undefined;
12091
12315
  /** The id of the table to read.
12092
12316
 
12093
12317
  Names a table in the same tree, so a chart inside another component's
@@ -12124,6 +12348,29 @@ Set it to the words of the page's language, such as `{position} von
12124
12348
  {count}`, or to nothing to say no position. A slice or a series a
12125
12349
  legend hid is not counted. */
12126
12350
  positionLabel?: (HelixHeadlessScatterChart["positionLabel"]) | undefined;
12351
+ /** The readings as data, in the shape of a table, where the page has no
12352
+ table to point `for` at. `for` wins where both are set.
12353
+
12354
+ ```js
12355
+ chart.data = {
12356
+ caption: 'Sessions by channel',
12357
+ columns: ['Month', 'Direct', 'Referral'],
12358
+ rows: [['Jan', 10, 4], ['Feb', 20, 8]],
12359
+ }
12360
+ ```
12361
+
12362
+ The first column holds each row's label and every column after it a
12363
+ series, as in a table. A cell is a number, words, `null` for a blank,
12364
+ or `{ value, text }` for a number shown as words, such as `$128k`. A
12365
+ number is shown in `locale`.
12366
+
12367
+ **A table is still the better source where the page can show one**:
12368
+ it reads with no script and before hydration, and a reader can sort and
12369
+ copy it. Data is drawn on the client only, so a server serves the
12370
+ frame, and the summary, the keys and the readout are then the whole of
12371
+ what a screen reader is given. Set a new object to redraw: the chart
12372
+ does not look inside the one it has. */
12373
+ data?: (HelixHeadlessScatterChart["data"]) | undefined;
12127
12374
  };
12128
12375
 
12129
12376
  export type HelixHeadlessScatterChartVueEvents = {
@@ -13029,7 +13276,10 @@ export type HelixHeadlessSplitterVueEvents = {
13029
13276
  };
13030
13277
 
13031
13278
  export type HelixHeadlessStatGroupVueProps = {
13032
- /** Accessible name for the group. */
13279
+ /** Accessible name for the group, which makes it a group.
13280
+
13281
+ Absent leaves the stats with no group around them, unless `aria-label` or
13282
+ `aria-labelledby` names it. */
13033
13283
  label?: (HelixHeadlessStatGroup["label"]) | undefined;
13034
13284
  };
13035
13285
 
@@ -13062,6 +13312,29 @@ reports a hydration mismatch. The absent attribute is the column, which the
13062
13312
  stylesheet reads as the base case, and the server spec asserts the host
13063
13313
  carries nothing nobody wrote. */
13064
13314
  direction?: (HelixHeadlessStat["direction"]) | undefined;
13315
+ /** `Intl.NumberFormat` options `value` is written with, such as
13316
+ `{"notation":"compact"}` for `1.2M` or `{"style":"percent"}` for `98%`,
13317
+ written as JSON in the attribute.
13318
+
13319
+ Absent writes the number as the locale writes any number. */
13320
+ "format-options"?: (HelixHeadlessStat["formatOptions"]) | undefined;
13321
+ /** `Intl.NumberFormat` options `value` is written with, such as
13322
+ `{"notation":"compact"}` for `1.2M` or `{"style":"percent"}` for `98%`,
13323
+ written as JSON in the attribute.
13324
+
13325
+ Absent writes the number as the locale writes any number. */
13326
+ formatOptions?: (HelixHeadlessStat["formatOptions"]) | undefined;
13327
+ /** The locale `value` is written in, such as `de` for `1.234.567`.
13328
+
13329
+ Absent reads the nearest `lang`, then the runtime's own. Set it on a page
13330
+ rendered on a server, so the server and the browser write the figure
13331
+ alike. */
13332
+ locale?: (HelixHeadlessStat["locale"]) | undefined;
13333
+ /** The figure as a number, written with `format-options` in `locale` in
13334
+ place of a slotted value.
13335
+
13336
+ Absent leaves the figure to the slot. */
13337
+ value?: (HelixHeadlessStat["value"]) | undefined;
13065
13338
  };
13066
13339
 
13067
13340
  export type HelixHeadlessStatVueEvents = {};
@@ -16846,7 +17119,7 @@ export interface WcToolkitVueGlobalComponents {
16846
17119
  HelixHeadlessAppHeaderVueProps,
16847
17120
  HelixHeadlessAppHeaderVueEvents
16848
17121
  >;
16849
- /** Shows how a total is made up. Each numeric column of the table is a part, the parts add up to the total at each reading, and the top edge is that total. The thickness of a band is that part's amount. Use 'LineChart' with 'area' to show how each series moved: it fills each series from the floor separately, so the fills overlap. Use this chart to show the composition: it stacks the series. **The value axis always starts at zero**, as in 'BarChart', because a band's thickness is its value. For the same reason there is no streamgraph mode, which moves the baseline. To show how the composition changed, set 'share'. Band edges are straight between readings by default. A smoothed curve through one sum can dip below the curve through the sum beneath it, which draws a part as less than zero. Other curves: - 'curve="smooth"': for a stack read as an overall shape. - 'curve="step"': holds each reading and jumps at the midpoint, so stacked edges stay in order, as with 'straight'. Use it for a quantity that changes at a moment, such as a headcount or a price. 'share' draws each reading as 100 percent, so the top edge is flat and the bands show each part's share. Use it to see which part grew. The default shows whether the total grew. 'overlap' draws every band from zero, one in front of another, so each part's own amount is its height: the first column is in front. Use it to compare the parts with each other; the scale then fits the largest part rather than the total. 'value-axis' draws the scale's numbers beside the plot, at the levels 'gridlines' rules: amounts in 'locale', or percentages under 'share'. The drawing is hidden from screen readers. The text summary gives the latest reading's total and each part's share of it, and the table beside the chart has every number. **The plot is read by key.** It takes focus, named by 'label' or the caption. The left and right arrows move from reading to reading, Home and End go to the first and the last, and the up and down arrows move among the series of a reading. The tooltip follows, the 'live' part says the reading in words, and Escape puts the tooltip away. Every numeric column is a part, so leave a total column out of the table the chart reads, or it is counted twice. A negative reading is drawn as zero. **A tap shows the reading under it**, and keeps it until a tap lands elsewhere. 'helix-reading-change' says each move of the reading, by pointer, tap or key, and 'helix-reading-press' says a reading was clicked, tapped, or pressed with Enter or Space, for a page that opens what a reading stands for. */
17122
+ /** Shows how a total is made up. Each numeric column of the table is a part, the parts add up to the total at each reading, and the top edge is that total. The thickness of a band is that part's amount. Use 'LineChart' with 'area' to show how each series moved: it fills each series from the floor separately, so the fills overlap. Use this chart to show the composition: it stacks the series. **The value axis always starts at zero**, as in 'BarChart', because a band's thickness is its value. For the same reason there is no streamgraph mode, which moves the baseline. To show how the composition changed, set 'share'. Band edges are straight between readings by default. A smoothed curve through one sum can dip below the curve through the sum beneath it, which draws a part as less than zero. Other curves: - 'curve="smooth"': for a stack read as an overall shape. - 'curve="step"': holds each reading and jumps at the midpoint, so stacked edges stay in order, as with 'straight'. Use it for a quantity that changes at a moment, such as a headcount or a price. 'share' draws each reading as 100 percent, so the top edge is flat and the bands show each part's share. Use it to see which part grew. The default shows whether the total grew. 'overlap' draws every band from zero, one in front of another, so each part's own amount is its height: the first column is in front. Use it to compare the parts with each other; the scale then fits the largest part rather than the total. 'value-axis' draws the scale's numbers beside the plot, at the levels 'gridlines' rules: amounts in 'locale', or percentages under 'share'. The drawing is hidden from screen readers. The text summary gives the latest reading's total and each part's share of it, and the table beside the chart has every number. **The plot is read by key.** It takes focus, named by 'label' or the caption. The left and right arrows move from reading to reading, Home and End go to the first and the last, and the up and down arrows move among the series of a reading. The tooltip follows, the 'live' part says the reading in words, and Escape puts the tooltip away. Every numeric column is a part, so leave a total column out of the table the chart reads, or it is counted twice. A negative reading is drawn as zero. **A tap shows the reading under it**, and keeps it until a tap lands elsewhere. 'helix-reading-change' says each move of the reading, by pointer, tap or key, and 'helix-reading-press' says a reading was clicked, tapped, or pressed with Enter or Space, for a page that opens what a reading stands for. **'data' takes the readings as data** where the page has no table to point 'for' at, in a table's shape: the column headings, then one row per reading with its label first. A table is still the better source where the page can show one, since it reads before any script runs. **A chart with nothing to draw says so.** A table with no readings shows 'empty-text', "No readings", in the plot, and 'loading' shows 'loading-text' there until readings arrive. The 'empty' and 'loading' slots take markup in their place, such as a link to add the first reading. */
16850
17123
  "helix-headless-area-chart": DefineCustomElement<
16851
17124
  HelixHeadlessAreaChart,
16852
17125
  HelixHeadlessAreaChartVueProps,
@@ -16864,13 +17137,13 @@ export interface WcToolkitVueGlobalComponents {
16864
17137
  HelixHeadlessAvatarVueProps,
16865
17138
  HelixHeadlessAvatarVueEvents
16866
17139
  >;
16867
- /** Badge wraps the element it decorates and pins an indicator to its corner, so the wrapped element keeps its place in the layout. What the indicator shows depends on 'value': - A 'value' of zero shows no indicator. - No 'value' shows a dot. - Any other value shows the value. Above 'max', the indicator shows '{max}+', so its width stays the same as the count grows. 'format-options' writes a count with 'Intl.NumberFormat', in 'locale': 'format-options='{"notation":"compact"}'' shows 1,200 as '1.2K'. Absent, the count is shown as it was given. A count is announced from its own text, and 'label' replaces that with a fuller name, such as '4 unread'. A dot needs a 'label'. Without one, the dot is a colored circle that screen readers do not announce. **A badge wrapped around a control describes it.** The control is the first element in the badge that takes focus, and its description is the badge's words, so focusing '<helix-badge value="8" label="{count} unread"><button>Inbox </button></helix-badge>' announces "Inbox, button, 8 unread", current as the count changes. A control that already has a description keeps its own. The count is also a status of its own, read when it changes. **Put the badge inside the control to have its count read with the control's name**, as Web Awesome and Shoelace do: '<button>Inbox <helix-badge value="8" label="8 unread"></helix-badge></button>' is the button "Inbox 8 unread", and stays current as the count changes. The styled tier's 'placement="inline"' draws the mark in the line for that case. */
17140
+ /** Badge wraps the element it decorates and pins an indicator to its corner, so the wrapped element keeps its place in the layout. What the indicator shows depends on 'value': - A 'value' of zero shows no indicator. - No 'value' shows a dot. - Any other value shows the value. Above 'max', the indicator shows '{max}+', so its width stays the same as the count grows. 'format-options' writes a count with 'Intl.NumberFormat', in 'locale': 'format-options='{"notation":"compact"}'' shows 1,200 as '1.2K'. Absent, the count is shown as it was given. A count is announced from its own text, and 'label' replaces that with a fuller name, such as '4 unread'. A dot needs a 'label'. Without one, the dot is a colored circle that screen readers do not announce. **A badge wrapped around a control describes it.** The control is the first element in the badge that takes focus, and its description is the badge's words, so focusing '<helix-badge value="8" label="{count} unread"><button>Inbox </button></helix-badge>' announces "Inbox, button, 8 unread", current as the count changes. A control that already has a description keeps its own. The count is also a status of its own, read when it changes. **Put the badge inside the control to have its count read with the control's name**, as Web Awesome and Shoelace do: '<button>Inbox <helix-badge value="8" label="8 unread"></helix-badge></button>' is the button "Inbox 8 unread", and stays current as the count changes. The styled tier's 'placement="inline"' draws the mark in the line for that case. **An icon goes inside the mark** through the 'icon' slot, before the count, as Web Awesome's badge takes one at its start. With no 'value' the icon is the whole mark, such as a check on an avatar, drawn where the dot would be. The icon is hidden from screen readers: the count and 'label' are what the mark says. */
16868
17141
  "helix-headless-badge": DefineCustomElement<
16869
17142
  HelixHeadlessBadge,
16870
17143
  HelixHeadlessBadgeVueProps,
16871
17144
  HelixHeadlessBadgeVueEvents
16872
17145
  >;
16873
- /** Every bar is measured from zero, and no property changes the baseline, because a bar's length is its value. To show the differences between values, use a line chart. The labels are HTML beside the drawing. An '<svg>' that fills its box scales the text inside it: the same 'font-size' renders at 10px in a narrow chart and 43px in a wide one, and SVG has no setting that keeps text at one size the way 'vector-effect' does for strokes. The table is the accessible representation, and the drawing is hidden from screen readers, so they get the numbers themselves. The 'summary' part names the chart, from 'label' or the table's caption, and gives each series' highest reading. **The plot is read by key.** It takes focus, named by 'label' or the caption. The arrows along the categories move from one to the next, which is left and right for columns and up and down for 'orientation="horizontal"'. Home and End go to the first and the last, and the other pair of arrows moves among the series of a category. The tooltip follows, the 'live' part says the reading in words, and Escape puts the tooltip away. The component writes the custom properties below with numbers it computes, and the stylesheet that draws the chart reads them. Do not set them yourself. **A tap shows the reading under it**, and keeps it until a tap lands elsewhere. 'helix-reading-change' says each move of the reading, by pointer, tap or key, and 'helix-reading-press' says a reading was clicked, tapped, or pressed with Enter or Space, for a page that opens what a reading stands for. */
17146
+ /** Every bar is measured from zero, and no property changes the baseline, because a bar's length is its value. To show the differences between values, use a line chart. The labels are HTML beside the drawing. An '<svg>' that fills its box scales the text inside it: the same 'font-size' renders at 10px in a narrow chart and 43px in a wide one, and SVG has no setting that keeps text at one size the way 'vector-effect' does for strokes. The table is the accessible representation, and the drawing is hidden from screen readers, so they get the numbers themselves. The 'summary' part names the chart, from 'label' or the table's caption, and gives each series' highest reading. **The plot is read by key.** It takes focus, named by 'label' or the caption. The arrows along the categories move from one to the next, which is left and right for columns and up and down for 'orientation="horizontal"'. Home and End go to the first and the last, and the other pair of arrows moves among the series of a category. The tooltip follows, the 'live' part says the reading in words, and Escape puts the tooltip away. The component writes the custom properties below with numbers it computes, and the stylesheet that draws the chart reads them. Do not set them yourself. **A tap shows the reading under it**, and keeps it until a tap lands elsewhere. 'helix-reading-change' says each move of the reading, by pointer, tap or key, and 'helix-reading-press' says a reading was clicked, tapped, or pressed with Enter or Space, for a page that opens what a reading stands for. **'data' takes the readings as data** where the page has no table to point 'for' at, in a table's shape: the column headings, then one row per reading with its label first. A table is still the better source where the page can show one, since it reads before any script runs. **A chart with nothing to draw says so.** A table with no readings shows 'empty-text', "No readings", in the plot, and 'loading' shows 'loading-text' there until readings arrive. The 'empty' and 'loading' slots take markup in their place, such as a link to add the first reading. */
16874
17147
  "helix-headless-bar-chart": DefineCustomElement<
16875
17148
  HelixHeadlessBarChart,
16876
17149
  HelixHeadlessBarChartVueProps,
@@ -16930,7 +17203,7 @@ export interface WcToolkitVueGlobalComponents {
16930
17203
  HelixHeadlessCanvasVueProps,
16931
17204
  HelixHeadlessCanvasVueEvents
16932
17205
  >;
16933
- /** The header, body, and footer regions are slots, because they have no state, behavior, or API of their own. You bring your own markup, so a title can be a real '<h2>'. The host is the surface. The element itself takes the border, the radius, and the grid, so you style 'Card' directly and there is no wrapper part to reach through with '::part'. Name the card with 'label', as a Stat Group is named, or with 'aria-label' or 'aria-labelledby'. These are the only names that work with server rendering, because reading a title from the light DOM needs a DOM, and the server has none. 'label' is set through 'ElementInternals', so it writes no attribute onto the card. **A named card is a group**, so a reader entering it hears its name; an unnamed one has no role, since a group with no name only adds "group" to what a reader says. Each region's slot is a part of the same name, 'body' for the main content, as Web Awesome's card names its regions. A slot draws no box, so a part passes inherited properties to what is slotted, and a page wanting a box there gives it one with 'display'. 'header-actions' and 'footer-actions' hold controls at the end of the header's and the footer's line, as Web Awesome's card does. While one holds something, its line is a 'header-row' or 'footer-row' part; otherwise there is no wrapper and every region is a bare slot. A server cannot see slotted content, so served actions sit on their own line until the script runs. **The card says which regions it holds**, as ':state(has-media)', ':state(has-header)' and ':state(has-footer)', so a sheet can draw a card with a header differently, as Web Awesome's 'with-header' does, with no attribute written onto the card. Read in the browser, so a served card carries none until the script runs. */
17206
+ /** The header, body, and footer regions are slots, because they have no state, behavior, or API of their own. You bring your own markup, so a title can be a real '<h2>'. The host is the surface. The element itself takes the border, the radius, and the grid, so you style 'Card' directly and there is no wrapper part to reach through with '::part'. Name the card with 'label', as a Stat Group is named, or with 'aria-label' or 'aria-labelledby'. 'label' is set through 'ElementInternals', so it writes no attribute onto the card. **A named card is a group**, so a reader entering it hears its name; an unnamed one has no role, since a group with no name only adds "group" to what a reader says. **With none of those, a heading in 'header' names the card**, such as the '<h2>' of its title, by reference, so the name follows the heading's words. Reading a heading needs a DOM, so a served card is named by it once the script runs; 'label', 'aria-label' and 'aria-labelledby' are the names a server writes. Each region's slot is a part of the same name, 'body' for the main content, as Web Awesome's card names its regions. A slot draws no box, so a part passes inherited properties to what is slotted, and a page wanting a box there gives it one with 'display'. 'header-actions' and 'footer-actions' hold controls at the end of the header's and the footer's line, as Web Awesome's card does. While one holds something, its line is a 'header-row' or 'footer-row' part; otherwise there is no wrapper and every region is a bare slot. A server cannot see slotted content, so a served card has no row; the styled tier sets served actions at the end of their line from the stylesheet alone, so they do not move when the script runs. **The card says which regions it holds**, as ':state(has-media)', ':state(has-header)' and ':state(has-footer)', so a sheet can draw a card with a header differently, as Web Awesome's 'with-header' does, with no attribute written onto the card. Read in the browser, so a served card carries none until the script runs. */
16934
17207
  "helix-headless-card": DefineCustomElement<
16935
17208
  HelixHeadlessCard,
16936
17209
  HelixHeadlessCardVueProps,
@@ -16972,13 +17245,13 @@ export interface WcToolkitVueGlobalComponents {
16972
17245
  HelixHeadlessCheckboxVueProps,
16973
17246
  HelixHeadlessCheckboxVueEvents
16974
17247
  >;
16975
- /** Renders a '<pre><code>' pair: 'pre' keeps the whitespace, and 'code' marks it as code. Long lines scroll inside the block and do not wrap, because a line break can be significant in code. A copy button is on by default. Set 'no-copy' to remove it. The button copies the slotted text, so there is no second copy of the code to keep in sync. For a fragment of code inside a sentence, use 'Code'. Set 'line-numbers' to number the lines in a gutter beside the code, hidden from the accessibility tree and left out of a copy. Set 'highlight' to a function that turns the code into highlighted markup, such as one wrapping Shiki or Prism, and the block draws what it returns; it is handed the block's 'language', so one function serves every block. The code stays in the slot, so the copy button and the page's own text are the code as written. Set 'expandable' on a block whose height is capped, such as by '--code-block-max-block-size', and a button under it shows every line and then fewer again, as a docs site's long example does. The button is drawn only while the cap hides something, says whether the block is expanded with 'aria-expanded', names the block it opens with 'aria-controls', and the block carries ':state(expanded)' while it is. Set 'diff' to show a change. Put a unified diff, the output of 'git diff' or 'diff -u', in the same slot, and the block draws the lines it added and removed. The block never computes a diff itself. Line numbers come from the hunk headers and are hidden from the accessibility tree. Changed lines are '<ins>' and '<del>' with the '+' and '-' kept as text, so the change does not depend on color. Each file in the patch is its own block under its own name, and its copy button copies the new version of the file. 'variant="split"' shows the old version beside the new, each removal opposite its replacement. On the server, the slot renders as ordinary code, so a diff first appears as the patch text in a '<pre>'. The client makes the same first render, which keeps hydration clean, and draws the diff once it can read the content. Diff mode is experimental. The rest of the family is stable. */
17248
+ /** Renders a '<pre><code>' pair: 'pre' keeps the whitespace, and 'code' marks it as code. Long lines scroll inside the block and do not wrap, because a line break can be significant in code. A copy button is on by default. Set 'no-copy' to remove it. The button copies the slotted text, so there is no second copy of the code to keep in sync. For a fragment of code inside a sentence, use 'Code'. Set 'line-numbers' to number the lines in a gutter beside the code, hidden from the accessibility tree and left out of a copy. Set 'highlight' to a function that turns the code into highlighted markup, such as one wrapping Shiki or Prism, and the block draws what it returns; it is handed the block's 'language', so one function serves every block. The code stays in the slot, so the copy button and the page's own text are the code as written. Set 'expandable' on a block whose height is capped, such as by '--code-block-max-block-size', and a button under it shows every line and then fewer again, as a docs site's long example does. The button is drawn only while the cap hides something, says whether the block is expanded with 'aria-expanded', names the block it opens with 'aria-controls', and the block carries ':state(expanded)' while it is. Set 'diff' to show a change. Put a unified diff, the output of 'git diff' or 'diff -u', in the same slot, and the block draws the lines it added and removed. The block never computes a diff itself. Line numbers come from the hunk headers and are hidden from the accessibility tree. Changed lines are '<ins>' and '<del>' with the '+' and '-' kept as text, so the change does not depend on color. Each file in the patch is its own block under its own name, and its copy button copies the new version of the file. 'variant="split"' shows the old version beside the new, each removal opposite its replacement. **A block that scrolls is a tab stop.** While its lines run past its width or its cap, the scroller is a region named for the block, such as "Code, app.ts", that Tab reaches, so a keyboard scrolls it with the arrow keys in every browser. Chromium and Firefox make a scrolling box focusable on their own, and Safari does not. A block that fits is no stop at all. **The code the block draws is marked untranslated**, 'translate="no"' on its '<pre>', so a page translator leaves highlighted lines and a diff as written. Code in the slot takes its translation mode from the element, which writes nothing onto itself, so set 'translate="no"' on the element to keep a translator off plain code too. On the server, the slot renders as ordinary code, so a diff first appears as the patch text in a '<pre>'. The client makes the same first render, which keeps hydration clean, and draws the diff once it can read the content. Diff mode is experimental. The rest of the family is stable. */
16976
17249
  "helix-headless-code-block": DefineCustomElement<
16977
17250
  HelixHeadlessCodeBlock,
16978
17251
  HelixHeadlessCodeBlockVueProps,
16979
17252
  HelixHeadlessCodeBlockVueEvents
16980
17253
  >;
16981
- /** Renders a real '<code>' element, which marks the text as code for translation tools and document search. A styled span carries no such meaning, and a screen reader announces nothing about it. 'Code' is inline only and never scrolls. For a block of code with its own box, its own overflow, and copying, use 'CodeBlock', which is a separate family. */
17254
+ /** Renders a real '<code>' element, which marks the text as code for translation tools and document search. A styled span carries no such meaning, and a screen reader announces nothing about it. **Set 'translate="no"' on the element to keep a page translator off the code.** A translator that rewrites prose would also rewrite an identifier. The slotted text takes its translation mode from the element, its parent in the page, and the element writes nothing onto itself, so the attribute is yours to set. The '<code>' inside carries 'translate="no"' for anything the element draws itself. 'Code' is inline only and never scrolls. For a block of code with its own box, its own overflow, and copying, use 'CodeBlock', which is a separate family. */
16982
17255
  "helix-headless-code": DefineCustomElement<
16983
17256
  HelixHeadlessCode,
16984
17257
  HelixHeadlessCodeVueProps,
@@ -17080,7 +17353,7 @@ export interface WcToolkitVueGlobalComponents {
17080
17353
  HelixHeadlessDrilldownVueProps,
17081
17354
  HelixHeadlessDrilldownVueEvents
17082
17355
  >;
17083
- /** Shows what would be in a region and the one action that would fill it, so an empty region does not look like one that failed to load. The message is announced, because an empty view often replaces content that was loading, and the announcement tells a screen reader user that the search returned nothing. It is announced from a status region of its own, which is rendered empty and filled a frame after the view appears. Screen readers read a region that arrives with its text already in it inconsistently. For the seven seconds the region holds its copy, the heading and the message are hidden from screen readers, so the words are in the page once. Every region is a bare slot. There is no 'empty-state-heading' or 'empty-state-actions' element: assign your own heading and actions to the slots. **Or give the heading as words.** 'heading' draws them in a 'heading' part that is a heading at 'heading-level', 3 where it is not set, so a page rendering from data or on a server gets a heading a reader finds in the outline without writing the element. A heading slotted in replaces it. **Whatever is slotted into 'heading' is read as a heading.** An element that is no heading, such as a '<span>' or a '<p>', is set inside the 'heading' part at 'heading-level', so a screen reader still finds it in the outline. A heading element, or an element holding one, keeps its own level. A server cannot see the slotted element, so a served '<span>' becomes a heading once the script runs. */
17356
+ /** Shows what would be in a region and the one action that would fill it, so an empty region does not look like one that failed to load. The message is announced, because an empty view often replaces content that was loading, and the announcement tells a screen reader user that the search returned nothing. It is announced from a status region of its own, which is rendered empty and filled a frame after the view appears. Screen readers read a region that arrives with its text already in it inconsistently. For the seven seconds the region holds its copy, the heading and the message are hidden from screen readers, so the words are in the page once. Every region is a bare slot. There is no 'empty-state-heading' or 'empty-state-actions' element: assign your own heading and actions to the slots. The icon, the message and the actions slots are parts of the same names, as Card's regions are. A slot draws no box, so a part passes inherited properties, such as color and font, to what is slotted, and a page wanting a box there gives it one with 'display', such as a row of actions with 'display: flex'. **The view says which regions it holds**, as ':state(has-icon)' and ':state(has-actions)', so a sheet can space a view with no icon or no actions differently. Read in the browser, so a served view carries neither until the script runs. **Or give the heading as words.** 'heading' draws them in a 'heading' part that is a heading at 'heading-level', 3 where it is not set, so a page rendering from data or on a server gets a heading a reader finds in the outline without writing the element. A heading slotted in replaces it. **Whatever is slotted into 'heading' is read as a heading.** An element that is no heading, such as a '<span>' or a '<p>', is set inside the 'heading' part at 'heading-level', so a screen reader still finds it in the outline. A heading element, or an element holding one, keeps its own level. A server cannot see the slotted element, so a served '<span>' becomes a heading once the script runs. */
17084
17357
  "helix-headless-empty": DefineCustomElement<
17085
17358
  HelixHeadlessEmpty,
17086
17359
  HelixHeadlessEmptyVueProps,
@@ -17146,7 +17419,7 @@ export interface WcToolkitVueGlobalComponents {
17146
17419
  HelixHeadlessIconButtonVueProps,
17147
17420
  HelixHeadlessIconButtonVueEvents
17148
17421
  >;
17149
- /** The icons are Phosphor, drawn on a 256 box at stroke-width 16. Each glyph renders its full inner markup, because most icons are several elements, each with its own stroke and fill. The markup is generated at build time from SVG files in this repository and never comes from user input, so rendering it with 'unsafeSVG' is safe. The '<svg>' carries 'fill="currentColor"'. The generator keeps only the inner markup, and Phosphor sets its fill on the root tag that the generator discards. Without it, the 65 solid glyphs fall back to black and disappear on a dark background. Shapes that set their own 'fill' or 'stroke' are unaffected. **A name is looked up in a registry.** The family's entry registers the whole set, so any name in it draws. The element's own entry, '@fusion.dev/helix-headless/icon/root', registers none: a page that imports it and calls 'registerIcons' with the glyphs it names ships those and no others. 'registerIconLibrary' resolves names under a prefix of your own, such as 'lucide:camera', at once or later, and the element fires 'load' when a glyph that came later is drawn. A glyph registered after the element rendered is drawn then. A name with no match renders nothing, and the element fires 'error', so a typo in a name can be heard. It waits until the page has loaded and painted first, so a library a later module registers is not taken for a typo. An icon is decorative by default and hidden from assistive technology. Set 'label' only when the icon is the only carrier of meaning, such as in a button with no text. An 'aria-label' on the element works too: the element is then an image with that name. **A decorative icon that is all a control holds is reported.** In a development build, a button or a link whose only content is an icon with no 'label', and which has no name of its own, warns 'missing-name' once, through the runtime channel every Helix warning uses. */
17422
+ /** The icons are Phosphor, drawn on a 256 box at stroke-width 16. Each glyph renders its full inner markup, because most icons are several elements, each with its own stroke and fill. The markup is generated at build time from SVG files in this repository and never comes from user input, so rendering it with 'unsafeSVG' is safe. The '<svg>' carries 'fill="currentColor"'. The generator keeps only the inner markup, and Phosphor sets its fill on the root tag that the generator discards. Without it, the 65 solid glyphs fall back to black and disappear on a dark background. Shapes that set their own 'fill' or 'stroke' are unaffected. **A name is looked up in a registry.** The family's entry registers the whole set, so any name in it draws. The element's own entry, '@fusion.dev/helix-headless/icon/root', registers none: a page that imports it and calls 'registerIcons' with the glyphs it names ships those and no others. 'registerIconLibrary' resolves names under a prefix of your own, such as 'lucide:camera', at once or later, and the element fires 'load' when a glyph that came later is drawn. A glyph registered after the element rendered is drawn then. **Or point 'src' at an SVG file**, such as 'src="/icons/rocket.svg"', and the element fetches it and draws its shapes in 'currentColor' where the file does not color them. A file is fetched once a page, however many icons name it, and 'load' fires when it is drawn. Scripts, event handlers and 'javascript:' links in the file are taken out before it is drawn. A server fetches nothing, so a served icon with a 'src' is drawn once the script runs. A name with no match, or a 'src' that is no SVG, renders nothing, and the element fires 'error', so a typo in a name can be heard. It waits until the page has loaded and painted first, so a library a later module registers is not taken for a typo. An icon is decorative by default and hidden from assistive technology. Set 'label' only when the icon is the only carrier of meaning, such as in a button with no text. An 'aria-label' on the element works too: the element is then an image with that name. **A decorative icon that is all a control holds is reported.** In a development build, a button or a link whose only content is an icon with no 'label', and which has no name of its own, warns 'missing-name' once, through the runtime channel every Helix warning uses. */
17150
17423
  "helix-headless-icon": DefineCustomElement<
17151
17424
  HelixHeadlessIcon,
17152
17425
  HelixHeadlessIconVueProps,
@@ -17188,7 +17461,7 @@ export interface WcToolkitVueGlobalComponents {
17188
17461
  HelixHeadlessLightboxVueProps,
17189
17462
  HelixHeadlessLightboxVueEvents
17190
17463
  >;
17191
- /** A line chart shows the shape of each series: where the readings went. The scale covers the range of the data. Including zero in the range of a series that moves between 980 and 1020 would flatten the line into a rule across the top of the box. 'BarChart' always starts at zero, because a bar's length is its value. Set 'zero' when the distance from zero is the point. Every series shares one scale, as in the bar chart. 'dashed' names the series drawn as a dashed line, such as a forecast or a target beside the readings: 'dashed="Forecast"'. Each takes a 'line-dashed' part beside 'line'. 'area' fills each series down to the floor on its own, so the fills overlap. For a total made of parts, use 'Area Chart', which stacks the series so the top edge is the total and each band is a share. The labels are HTML beside the drawing, as in 'BarChart'. Text inside an '<svg>' that fills its box scales with the box, so the same 'font-size' can render at 10px in a narrow chart and 43px in a wide one. 'value-axis' draws the scale's numbers beside the plot, at the levels 'gridlines' rules, written in 'locale'. The table is the accessible representation, and the drawing is hidden from screen readers, who get the numbers. The 'summary' part names the chart, from 'label' or the table's caption, and gives each series' latest reading. **The plot is read by key.** It takes focus, named by 'label' or the caption. The left and right arrows move from reading to reading, Home and End go to the first and the last, and the up and down arrows move among the series of a reading. The tooltip follows, the 'live' part says the reading in words, and Escape puts the tooltip away. **A tap shows the reading under it**, and keeps it until a tap lands elsewhere. 'helix-reading-change' says each move of the reading, by pointer, tap or key, and 'helix-reading-press' says a reading was clicked, tapped, or pressed with Enter or Space, for a page that opens what a reading stands for. */
17464
+ /** A line chart shows the shape of each series: where the readings went. The scale covers the range of the data. Including zero in the range of a series that moves between 980 and 1020 would flatten the line into a rule across the top of the box. 'BarChart' always starts at zero, because a bar's length is its value. Set 'zero' when the distance from zero is the point. Every series shares one scale, as in the bar chart. 'dashed' names the series drawn as a dashed line, such as a forecast or a target beside the readings: 'dashed="Forecast"'. Each takes a 'line-dashed' part beside 'line'. 'area' fills each series down to the floor on its own, so the fills overlap. For a total made of parts, use 'Area Chart', which stacks the series so the top edge is the total and each band is a share. The labels are HTML beside the drawing, as in 'BarChart'. Text inside an '<svg>' that fills its box scales with the box, so the same 'font-size' can render at 10px in a narrow chart and 43px in a wide one. 'value-axis' draws the scale's numbers beside the plot, at the levels 'gridlines' rules, written in 'locale'. The table is the accessible representation, and the drawing is hidden from screen readers, who get the numbers. The 'summary' part names the chart, from 'label' or the table's caption, and gives each series' latest reading. **The plot is read by key.** It takes focus, named by 'label' or the caption. The left and right arrows move from reading to reading, Home and End go to the first and the last, and the up and down arrows move among the series of a reading. The tooltip follows, the 'live' part says the reading in words, and Escape puts the tooltip away. **A tap shows the reading under it**, and keeps it until a tap lands elsewhere. 'helix-reading-change' says each move of the reading, by pointer, tap or key, and 'helix-reading-press' says a reading was clicked, tapped, or pressed with Enter or Space, for a page that opens what a reading stands for. **'data' takes the readings as data** where the page has no table to point 'for' at, in a table's shape: the column headings, then one row per reading with its label first. A table is still the better source where the page can show one, since it reads before any script runs. **A chart with nothing to draw says so.** A table with no readings shows 'empty-text', "No readings", in the plot, and 'loading' shows 'loading-text' there until readings arrive. The 'empty' and 'loading' slots take markup in their place, such as a link to add the first reading. */
17192
17465
  "helix-headless-line-chart": DefineCustomElement<
17193
17466
  HelixHeadlessLineChart,
17194
17467
  HelixHeadlessLineChartVueProps,
@@ -17212,7 +17485,7 @@ export interface WcToolkitVueGlobalComponents {
17212
17485
  HelixHeadlessListboxVueProps,
17213
17486
  HelixHeadlessListboxVueEvents
17214
17487
  >;
17215
- /** Draws two concentric circles: a track and a moving arc. The track shows the arc as a proportion of a whole, and costs one element. **The center is a slot, empty by default.** Put your logo there once, where your app wraps the loader. When nothing is slotted, nothing extra is rendered. Slotted content does not rotate. Only the arc moves, so a logo stays readable. The role is set on the host through 'ElementInternals'. A 'role' in the shadow root would leave the host itself without a role in the light DOM, and a 'role' attribute on the host would be missing from React server-rendered markup. **'for' names the region being loaded**, and the loader sets 'aria-busy="true"' on it for as long as the loader is on the page, so a screen reader waits for the region rather than reading it half filled. Two loaders in one region hold it busy until the last one leaves. A region drawn after the loader is marked when it arrives. **'delay' keeps a quick load from flashing a loader.** The loader stays hidden, and silent, for that many milliseconds, and appears only if the work is still going. While it waits it carries ':state(waiting)'. */
17488
+ /** Draws two concentric circles: a track and a moving arc. The track shows the arc as a proportion of a whole, and costs one element. **For work whose length is known, use 'Progress' with 'shape="ring"'.** It draws the same ring filled to the value, says the value as a progress bar does, and says when the work is complete. A loader claims no proportion, so it takes no value. **The center is a slot, empty by default.** Put your logo there once, where your app wraps the loader. When nothing is slotted, nothing extra is rendered. Slotted content does not rotate. Only the arc moves, so a logo stays readable. The role is set on the host through 'ElementInternals'. A 'role' in the shadow root would leave the host itself without a role in the light DOM, and a 'role' attribute on the host would be missing from React server-rendered markup. **'for' names the region being loaded**, and the loader sets 'aria-busy="true"' on it for as long as the loader is on the page, so a screen reader waits for the region rather than reading it half filled. Two loaders in one region hold it busy until the last one leaves. A region drawn after the loader is marked when it arrives. **'delay' keeps a quick load from flashing a loader.** The loader stays hidden, and silent, for that many milliseconds, and appears only if the work is still going. While it waits it carries ':state(waiting)'. */
17216
17489
  "helix-headless-loader": DefineCustomElement<
17217
17490
  HelixHeadlessLoader,
17218
17491
  HelixHeadlessLoaderVueProps,
@@ -17404,7 +17677,7 @@ export interface WcToolkitVueGlobalComponents {
17404
17677
  HelixHeadlessPopoverVueProps,
17405
17678
  HelixHeadlessPopoverVueEvents
17406
17679
  >;
17407
- /** Determinate by default. Set 'indeterminate' for a task whose total is not known yet. Use 'Loader' for a short wait or one with no place of its own on the page. The indeterminate bar runs a segment across the track and does not fill, so it shows that work is happening without claiming a proportion. 'aria-valuenow' is omitted in that state, which is the platform's signal for the same thing. The fill is a fraction of the track, written as a custom property. **Reaching 'max' is said and sent.** When the value arrives at 'max' from below, the bar says 'complete-label', "Complete" by default, in a polite 'live' region and sends 'helix-complete', so a reader hears that the work is done and a page can move on. A bar that starts full says nothing, and an empty 'complete-label' keeps it quiet. The 'complete' custom state is set while the bar is full. */
17680
+ /** Determinate by default. Set 'indeterminate' for a task whose total is not known yet. Use 'Loader' for a short wait or one with no place of its own on the page. The indeterminate bar runs a segment across the track and does not fill, so it shows that work is happening without claiming a proportion. 'aria-valuenow' is omitted in that state, which is the platform's signal for the same thing. The fill is a fraction of the track, written as a custom property. **The reading is said in the words the bar would show**: a whole percentage of the range in 'locale', the reading 'format-options' writes, or 'value-text', as 'aria-valuetext' beside the number. **Words set in the default slot are drawn on the bar**, or in the middle of a ring, such as '62%' or '3 of 8', and are what the bar says as its reading where 'value-text' is not set. While there are any, the bar carries ':state(content)', so a sheet can make room for them. **Reaching 'max' is said and sent.** When the value arrives at 'max' from below, the bar says 'complete-label', "Complete" by default, in a polite 'live' region and sends 'helix-complete', so a reader hears that the work is done and a page can move on. A bar that starts full says nothing, and an empty 'complete-label' keeps it quiet. The 'complete' custom state is set while the bar is full. */
17408
17681
  "helix-headless-progress": DefineCustomElement<
17409
17682
  HelixHeadlessProgress,
17410
17683
  HelixHeadlessProgressVueProps,
@@ -17416,7 +17689,7 @@ export interface WcToolkitVueGlobalComponents {
17416
17689
  HelixHeadlessQrCodeVueProps,
17417
17690
  HelixHeadlessQrCodeVueEvents
17418
17691
  >;
17419
- /** Renders a real '<q>', so the browser supplies the quotation marks. It inserts the correct marks for the document's language and nests them correctly when one quotation sits inside another. Do not type quotation marks into the content: one that starts or ends with a typed mark warns once, with the runtime kind 'typed-marks'. A quotation in a language other than the page's takes 'lang' on the element, and its marks follow it: 'lang="de"' sets „…“ and 'lang="fr"' «…» inside an English page. For a passage set off from the surrounding text, use a blockquote. */
17692
+ /** Renders a real '<q>', so the browser supplies the quotation marks. It inserts the correct marks for the document's language and nests them correctly when one quotation sits inside another. Do not type quotation marks into the content: one that starts or ends with a typed mark warns once, with the runtime kind 'typed-marks'. A quotation in a language other than the page's takes 'lang' on the element, and its marks follow it: 'lang="de"' sets „…“ and 'lang="fr"' «…» inside an English page. **'no-marks' leaves the marks off**, for a quotation set where the page draws its own, such as a pull quote with a large decorative mark beside it or a table of sayings. The quotation still counts toward nesting, so a quote inside it takes the inner marks it would have had. Text with marks typed into it raises no warning under 'no-marks'. For a passage set off from the surrounding text, use a blockquote. */
17420
17693
  "helix-headless-quote": DefineCustomElement<
17421
17694
  HelixHeadlessQuote,
17422
17695
  HelixHeadlessQuoteVueProps,
@@ -17440,7 +17713,7 @@ export interface WcToolkitVueGlobalComponents {
17440
17713
  HelixHeadlessRatingVueProps,
17441
17714
  HelixHeadlessRatingVueEvents
17442
17715
  >;
17443
- /** A scatter chart shows how two measures relate. The table's first numeric column is measured across, every other numeric column is measured up, and each row is one point. A table of countries with an income column and a life expectancy column draws one point for each country. Each additional numeric column is another series, in its own color. Both axes are labeled, because both positions are values. The ticks sit at round numbers, and the range extends to them. 'trend' draws each series' line of best fit, by least squares, across the plot in the series' color. **'size-by' names a third measure, drawn as each point's size**, as a bubble chart does: 'size-by="Population"' takes that column out of the series and gives each point an area in proportion to its row's number there. The tooltip and the table still say the number. The summary gives each series' correlation coefficient and its number of points. The table has every number, and the drawing is hidden from screen readers. **The plot is read by key.** It takes focus, named by 'label' or the caption. The left and right arrows move from row to row in the table's order, Home and End go to the first and the last, and the up and down arrows move among the series of a row. The tooltip sits on that point, the 'live' part says the row in words, and Escape puts the tooltip away. Each point is a '<span>' placed by percentage over the drawing, as 'LineChart' places its end points, so points stay round when the drawing stretches. The plot runs left to right in every text direction, as a number line does. The plot, its axes, and the axis names sit in a 'plane' part with 'dir="ltr"'. The axis names carry 'dir="auto"', so a name in Arabic or Hebrew reads in its own direction. The summary and the tooltip bubble follow the page's direction. **A tap shows the reading under it**, and keeps it until a tap lands elsewhere. 'helix-reading-change' says each move of the reading, by pointer, tap or key, and 'helix-reading-press' says a reading was clicked, tapped, or pressed with Enter or Space, for a page that opens what a reading stands for. */
17716
+ /** A scatter chart shows how two measures relate. The table's first numeric column is measured across, every other numeric column is measured up, and each row is one point. A table of countries with an income column and a life expectancy column draws one point for each country. Each additional numeric column is another series, in its own color. Both axes are labeled, because both positions are values. The ticks sit at round numbers, and the range extends to them. 'trend' draws each series' line of best fit, by least squares, across the plot in the series' color. **'size-by' names a third measure, drawn as each point's size**, as a bubble chart does: 'size-by="Population"' takes that column out of the series and gives each point an area in proportion to its row's number there. The tooltip and the table still say the number. The summary gives each series' correlation coefficient and its number of points. The table has every number, and the drawing is hidden from screen readers. **The plot is read by key.** It takes focus, named by 'label' or the caption. The left and right arrows move from row to row in the table's order, Home and End go to the first and the last, and the up and down arrows move among the series of a row. The tooltip sits on that point, the 'live' part says the row in words, and Escape puts the tooltip away. Each point is a '<span>' placed by percentage over the drawing, as 'LineChart' places its end points, so points stay round when the drawing stretches. The plot runs left to right in every text direction, as a number line does. The plot, its axes, and the axis names sit in a 'plane' part with 'dir="ltr"'. The axis names carry 'dir="auto"', so a name in Arabic or Hebrew reads in its own direction. The summary and the tooltip bubble follow the page's direction. **A tap shows the reading under it**, and keeps it until a tap lands elsewhere. 'helix-reading-change' says each move of the reading, by pointer, tap or key, and 'helix-reading-press' says a reading was clicked, tapped, or pressed with Enter or Space, for a page that opens what a reading stands for. **'data' takes the readings as data** where the page has no table to point 'for' at, in a table's shape: the column headings, then one row per reading with its label first. A table is still the better source where the page can show one, since it reads before any script runs. **A chart with nothing to draw says so.** A table with no readings shows 'empty-text', "No readings", in the plot, and 'loading' shows 'loading-text' there until readings arrive. The 'empty' and 'loading' slots take markup in their place, such as a link to add the first reading. */
17444
17717
  "helix-headless-scatter-chart": DefineCustomElement<
17445
17718
  HelixHeadlessScatterChart,
17446
17719
  HelixHeadlessScatterChartVueProps,
@@ -17506,13 +17779,13 @@ export interface WcToolkitVueGlobalComponents {
17506
17779
  HelixHeadlessSplitterVueProps,
17507
17780
  HelixHeadlessSplitterVueEvents
17508
17781
  >;
17509
- /** Screen readers announce the stats as a group. The figures are read together and their order has no meaning, so the group does not announce positions such as "1 of 4". */
17782
+ /** **A named group is a group**, so a screen reader announces the stats together under its name, such as "Usage, group". Name it with 'label', 'aria-label' or 'aria-labelledby'. An unnamed one has no role, since a group with no name only adds "group" to what a reader says, as an unnamed Card has none. The figures are read together and their order has no meaning, so the group does not announce positions such as "1 of 4". */
17510
17783
  "helix-headless-stat-group": DefineCustomElement<
17511
17784
  HelixHeadlessStatGroup,
17512
17785
  HelixHeadlessStatGroupVueProps,
17513
17786
  HelixHeadlessStatGroupVueEvents
17514
17787
  >;
17515
- /** The label comes first in the markup and the value after it, so a screen reader reads what the figure counts before the number. Visually, the number stands out either way. Both are bare slots. An element that assigned itself a slot on connect would add an attribute after upgrade, which markup rendered on the server by React does not have. **A stat with a label is a group named by it**, so a reader moving through a dashboard hears "Revenue, group" and then the figure, its unit and its trend as one reading, rather than a run of loose words. The role and the name are set through 'ElementInternals' once the label is known, which writes no attribute; a stat with no label has no role. Put a 'Trend' in the 'trend' slot to have it read inside the group, after the figure it qualifies. */
17788
+ /** The label comes first in the markup and the value after it, so a screen reader reads what the figure counts before the number. Visually, the number stands out either way. Both are bare slots. An element that assigned itself a slot on connect would add an attribute after upgrade, which markup rendered on the server by React does not have. **A stat with a label is a group named by it**, so a reader moving through a dashboard hears "Revenue, group" and then the figure, its unit and its trend as one reading, rather than a run of loose words. The role and the name are set through 'ElementInternals' once the label is known, which writes no attribute; a stat with no label has no role. Put a 'Trend' in the 'trend' slot to have it read inside the group, after the figure it qualifies. **Or give the figure as a number.** 'value' is written with 'Intl.NumberFormat', in 'locale' and with 'format-options', so 'value="1234567" format-options='{"notation":"compact"}'' shows '1.2M', and a server writes it as the browser does. A number in 'value' takes the place of a slotted figure. **Each slot is a part of the same name**, and 'value' for the figure, so a page reaches the label, the unit and the trend from outside. A slot draws no box, so a part passes inherited properties to what is slotted. **The stat says which pieces it holds**, as ':state(has-label)', ':state(has-unit)' and ':state(has-trend)', read in the browser, so a served stat carries none until the script runs. */
17516
17789
  "helix-headless-stat": DefineCustomElement<
17517
17790
  HelixHeadlessStat,
17518
17791
  HelixHeadlessStatVueProps,