@fusion.dev/helix-headless 0.176.1 → 0.177.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 (39) hide show
  1. package/custom-elements.json +610 -696
  2. package/dist/area-chart/root/area-chart-root.d.ts +18 -1
  3. package/dist/area-chart/root/area-chart-root.js +2 -2
  4. package/dist/avatar/root/avatar-root.d.ts +1 -1
  5. package/dist/avatar/root/avatar-root.js +1 -1
  6. package/dist/bar-chart/root/bar-chart-root.d.ts +19 -1
  7. package/dist/bar-chart/root/bar-chart-root.js +2 -2
  8. package/dist/canvas/node/canvas-node.js +1 -1
  9. package/dist/canvas/root/canvas-root.d.ts +5 -1
  10. package/dist/canvas/root/canvas-root.js +9 -1
  11. package/dist/donut-chart/root/donut-chart-root.d.ts +37 -2
  12. package/dist/donut-chart/root/donut-chart-root.js +22 -8
  13. package/dist/element-events.generated.js +2 -0
  14. package/dist/graph/root/graph-root.d.ts +28 -3
  15. package/dist/graph/root/graph-root.js +38 -3
  16. package/dist/heatmap/root/heatmap-root.d.ts +28 -5
  17. package/dist/heatmap/root/heatmap-root.js +7 -2
  18. package/dist/line-chart/root/line-chart-root.d.ts +18 -1
  19. package/dist/line-chart/root/line-chart-root.js +2 -2
  20. package/dist/loader/root/loader-root.d.ts +15 -0
  21. package/dist/loader/root/loader-root.js +28 -6
  22. package/dist/rating/root/rating-root.d.ts +2 -1
  23. package/dist/rating/root/rating-root.js +8 -2
  24. package/dist/scatter-chart/root/scatter-chart-root.d.ts +29 -6
  25. package/dist/scatter-chart/root/scatter-chart-root.js +18 -3
  26. package/dist/select/root/select-root.d.ts +4 -1
  27. package/dist/select/root/select-root.js +1 -0
  28. package/dist/sparkline/root/sparkline-root.d.ts +29 -4
  29. package/dist/sparkline/root/sparkline-root.js +8 -1
  30. package/dist/tag/group/tag-group.d.ts +4 -3
  31. package/dist/tag/group/tag-group.js +6 -5
  32. package/dist/tag/root/tag-root.js +2 -1
  33. package/dist/tree/item/tree-item.d.ts +4 -4
  34. package/dist/tree/item/tree-item.js +5 -1
  35. package/lint.json +1 -1
  36. package/package.json +5 -5
  37. package/types/jsx.d.ts +532 -364
  38. package/types/vue.d.ts +86 -19
  39. package/types/words.d.ts +22 -0
package/types/vue.d.ts CHANGED
@@ -6360,6 +6360,18 @@ Unset is horizontal, or across the toolbar the divider sits in. */
6360
6360
 
6361
6361
  export type HelixHeadlessDividerVueEvents = {};
6362
6362
 
6363
+ /** `HelixHeadlessDonutChart` component event */
6364
+ export type HelixHeadlessDonutChartElementEvent<E = Event> = TypedEvent<
6365
+ HelixHeadlessDonutChart,
6366
+ E
6367
+ >;
6368
+ /** `helix-reading-change` event type */
6369
+ export type HelixHeadlessDonutChartHelixReadingChangeElementEvent =
6370
+ HelixHeadlessDonutChartElementEvent<HelixReadingChangeEvent>;
6371
+ /** `helix-reading-press` event type */
6372
+ export type HelixHeadlessDonutChartHelixReadingPressElementEvent =
6373
+ HelixHeadlessDonutChartElementEvent<HelixReadingPressEvent>;
6374
+
6363
6375
  export type HelixHeadlessDonutChartVueProps = {
6364
6376
  /** The size of the hole in the middle of the ring.
6365
6377
 
@@ -6425,6 +6437,25 @@ rotation that puts the first slice at nine o'clock, the aspect ratio of a
6425
6437
  box that is no longer square, and where the middle sits once the bottom of
6426
6438
  the circle is not drawn. */
6427
6439
  sweep?: (HelixHeadlessDonutChart["sweep"]) | undefined;
6440
+ /** The words shown in place of the drawing when the table has no readings,
6441
+ and the fallback of the `empty` slot. */
6442
+ "empty-text"?: (HelixHeadlessDonutChart["emptyText"]) | undefined;
6443
+ /** The words shown in place of the drawing when the table has no readings,
6444
+ and the fallback of the `empty` slot. */
6445
+ emptyText?: (HelixHeadlessDonutChart["emptyText"]) | undefined;
6446
+ /** Whether the readings are still on their way. The chart shows
6447
+ `loading-text` in place of an empty drawing until it has readings.
6448
+
6449
+ Reflected, so a stylesheet can treat the chart while it waits. A chart
6450
+ that already has readings keeps drawing them, so a refresh does not
6451
+ blank it. */
6452
+ loading?: (HelixHeadlessDonutChart["loading"]) | undefined;
6453
+ /** The words shown in place of the drawing while `loading` is set and
6454
+ there are no readings yet, and the fallback of the `loading` slot. */
6455
+ "loading-text"?: (HelixHeadlessDonutChart["loadingText"]) | undefined;
6456
+ /** The words shown in place of the drawing while `loading` is set and
6457
+ there are no readings yet, and the fallback of the `loading` slot. */
6458
+ loadingText?: (HelixHeadlessDonutChart["loadingText"]) | undefined;
6428
6459
  /** The id of the table to read.
6429
6460
 
6430
6461
  Names a table in the same tree, so a chart inside another component's
@@ -6486,7 +6517,12 @@ does not look inside the one it has. */
6486
6517
  data?: (HelixHeadlessDonutChart["data"]) | undefined;
6487
6518
  };
6488
6519
 
6489
- export type HelixHeadlessDonutChartVueEvents = {};
6520
+ export type HelixHeadlessDonutChartVueEvents = {
6521
+ /** The slice shown moved, or was put away: `index` is the slice's row, or `-1` for none, with its `label` and the `pointerType` that moved it. */
6522
+ "helix-reading-change": HelixHeadlessDonutChartHelixReadingChangeElementEvent;
6523
+ /** A slice was clicked, tapped, or pressed with Enter or Space, with the same detail as `helix-reading-change`. */
6524
+ "helix-reading-press": HelixHeadlessDonutChartHelixReadingPressElementEvent;
6525
+ };
6490
6526
 
6491
6527
  /** `HelixHeadlessDrawer` component event */
6492
6528
  export type HelixHeadlessDrawerElementEvent<E = Event> = TypedEvent<
@@ -7692,6 +7728,14 @@ own, since the fallback name is the same word. Empty leaves the role. */
7692
7728
  "selected-label"?: (HelixHeadlessGraph["selectedLabel"]) | undefined;
7693
7729
  /** How the selected note is described in the list. */
7694
7730
  selectedLabel?: (HelixHeadlessGraph["selectedLabel"]) | undefined;
7731
+ /** What screen readers hear after a reader selects a note, in the list or in
7732
+ the drawing, with `{note}` for its name and `{count}` for how many notes
7733
+ the list then holds, written with `count-label`. */
7734
+ "selection-label"?: (HelixHeadlessGraph["selectionLabel"]) | undefined;
7735
+ /** What screen readers hear after a reader selects a note, in the list or in
7736
+ the drawing, with `{note}` for its name and `{count}` for how many notes
7737
+ the list then holds, written with `count-label`. */
7738
+ selectionLabel?: (HelixHeadlessGraph["selectionLabel"]) | undefined;
7695
7739
  /** The hint shown when one finger swipes over the graph with `gestures="cooperative"`. */
7696
7740
  "two-finger-hint-label"?: (HelixHeadlessGraph["twoFingerHintLabel"]) | undefined;
7697
7741
  /** The hint shown when one finger swipes over the graph with `gestures="cooperative"`. */
@@ -8044,8 +8088,9 @@ no order in it. */
8044
8088
  /** The name the `overview` gives the total of the readings drawn,
8045
8089
  `{totalLabel}` in `overview-label`. */
8046
8090
  totalLabel?: (HelixHeadlessHeatmap["totalLabel"]) | undefined;
8047
- /** The selected cells, by the names their rows have in the table, such as
8048
- `2026-06-11`, separated by commas.
8091
+ /** The selected cells, separated by commas: each by the date its row's
8092
+ header carries in a `<time datetime>`, such as `2026-06-11`, or by the
8093
+ header's words where it carries none.
8049
8094
 
8050
8095
  Set it to start with cells selected. Written by a press or a key under
8051
8096
  `selection-mode`. */
@@ -9862,6 +9907,10 @@ loader is on the page.
9862
9907
  Names an element in the same tree. In React it arrives as a property, the
9863
9908
  way `Tooltip.for` does. */
9864
9909
  for?: (HelixHeadlessLoader["for"]) | undefined;
9910
+ /** Whether no work is in progress. The loader draws nothing of its own, has
9911
+ no role, and marks no region busy, and what is in the `content` slot
9912
+ shows. Clearing it starts `delay` again. */
9913
+ idle?: (HelixHeadlessLoader["idle"]) | undefined;
9865
9914
  /** The loader's name, announced by screen readers while the work is in
9866
9915
  progress. */
9867
9916
  label?: (HelixHeadlessLoader["label"]) | undefined;
@@ -14213,6 +14262,18 @@ export type HelixHeadlessSliderVueEvents = {
14213
14262
  input: HelixHeadlessSliderElementEvent;
14214
14263
  };
14215
14264
 
14265
+ /** `HelixHeadlessSparkline` component event */
14266
+ export type HelixHeadlessSparklineElementEvent<E = Event> = TypedEvent<
14267
+ HelixHeadlessSparkline,
14268
+ E
14269
+ >;
14270
+ /** `helix-reading-change` event type */
14271
+ export type HelixHeadlessSparklineHelixReadingChangeElementEvent =
14272
+ HelixHeadlessSparklineElementEvent<HelixReadingChangeEvent>;
14273
+ /** `helix-reading-press` event type */
14274
+ export type HelixHeadlessSparklineHelixReadingPressElementEvent =
14275
+ HelixHeadlessSparklineElementEvent<HelixReadingPressEvent>;
14276
+
14216
14277
  export type HelixHeadlessSparklineVueProps = {
14217
14278
  /** How the line is drawn from one reading to the next.
14218
14279
 
@@ -14340,7 +14401,12 @@ not. */
14340
14401
  values?: (HelixHeadlessSparkline["values"]) | undefined;
14341
14402
  };
14342
14403
 
14343
- export type HelixHeadlessSparklineVueEvents = {};
14404
+ export type HelixHeadlessSparklineVueEvents = {
14405
+ /** The reading shown moved, or was put away: `index` is the reading, or `-1` for none, with its row's `label` from a table and the `pointerType` that moved it. */
14406
+ "helix-reading-change": HelixHeadlessSparklineHelixReadingChangeElementEvent;
14407
+ /** A reading was clicked, tapped, or pressed with Enter or Space, with the same detail as `helix-reading-change`. */
14408
+ "helix-reading-press": HelixHeadlessSparklineHelixReadingPressElementEvent;
14409
+ };
14344
14410
 
14345
14411
  export type HelixHeadlessSpeedDialGroupVueProps = {
14346
14412
  /** The group's name, drawn above its actions and read by screen readers. */
@@ -15766,8 +15832,9 @@ Absent selects nothing, and the tags carry no selected state at all. */
15766
15832
 
15767
15833
  Absent selects nothing, and the tags carry no selected state at all. */
15768
15834
  selectionMode?: (HelixHeadlessTagGroup["selectionMode"]) | undefined;
15769
- /** The selected tags' values, separated by commas, since a value may hold a
15770
- space.
15835
+ /** The selected tags' values, separated by commas with no space, as Toggle
15836
+ Group and Table write theirs, since a value may hold a space. A value
15837
+ written with a space after each comma is read the same way.
15771
15838
 
15772
15839
  Set it to start with tags selected. A tag's value is its `value`, or its
15773
15840
  words where it has none. */
@@ -19125,7 +19192,7 @@ export interface WcToolkitVueGlobalComponents {
19125
19192
  HelixHeadlessAppHeaderVueProps,
19126
19193
  HelixHeadlessAppHeaderVueEvents
19127
19194
  >;
19128
- /** 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. */
19195
+ /** 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. **Keyboard.** The plot is one tab stop. | Key | What it does | |---|---| | Tab | Moves focus to the plot and shows the first reading. | | Right, Left | Moves to the next or the previous reading. On a right-to-left page, Left moves to the next. | | Down, Up | Moves among the series of the reading. With one series, moves to the next or the previous reading. | | Home, End | Moves to the first or the last reading. | | Page Down, Page Up | Moves a tenth of the readings on or back. | | Enter, Space | Presses the reading shown, which sends 'helix-reading-press'. | | Escape | Puts the reading and its tooltip away. | */
19129
19196
  "helix-headless-area-chart": DefineCustomElement<
19130
19197
  HelixHeadlessAreaChart,
19131
19198
  HelixHeadlessAreaChartVueProps,
@@ -19149,7 +19216,7 @@ export interface WcToolkitVueGlobalComponents {
19149
19216
  HelixHeadlessBadgeVueProps,
19150
19217
  HelixHeadlessBadgeVueEvents
19151
19218
  >;
19152
- /** 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. */
19219
+ /** 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. **Keyboard.** The plot is one tab stop. | Key | What it does | |---|---| | Tab | Moves focus to the plot and shows the first reading. | | Right, Left | Moves to the next or the previous reading. On a right-to-left page, Left moves to the next. | | Down, Up | Moves among the series of the reading. With one series, moves to the next or the previous reading. | | Down, Up under 'orientation="horizontal"' | Moves to the next or the previous reading, and Right and Left move among the series. | | Home, End | Moves to the first or the last reading. | | Page Down, Page Up | Moves a tenth of the readings on or back. | | Enter, Space | Presses the reading shown, which sends 'helix-reading-press'. | | Escape | Puts the reading and its tooltip away. | */
19153
19220
  "helix-headless-bar-chart": DefineCustomElement<
19154
19221
  HelixHeadlessBarChart,
19155
19222
  HelixHeadlessBarChartVueProps,
@@ -19203,7 +19270,7 @@ export interface WcToolkitVueGlobalComponents {
19203
19270
  HelixHeadlessCanvasNodeVueProps,
19204
19271
  HelixHeadlessCanvasNodeVueEvents
19205
19272
  >;
19206
- /** A board of cards and connectors, drawn by Helix. On a canvas every position is data that someone placed, so drawing is arithmetic over rectangles with no layout to compute. 'Map' takes a slotted map, because another renderer draws its tiles. The format is [JSON Canvas](https://jsoncanvas.org), an open format. Each node has an 'x', 'y', 'width', 'height', and a type. Each edge names the two nodes it joins and the sides it leaves and arrives on. A card belongs to a group when it sits inside the group's bounds. The cards are text in the DOM, so a screen reader can read them. The family adds a reading order and states each card's connections as text. 'order' sets the reading order: - 'spatial' bands the cards into rows. - 'edges' follows the arrows, starting from the cards that nothing points to. **Cards move by default.** The board writes the new 'x' and 'y' onto the card, the way an input writes its own value, and dispatches two events: - 'helix-before-move' for every step. Cancel it to hold the positions in your own state and apply them yourself. - 'helix-move' once the move is finished. A resize dispatches the same pair with a size. Set 'readonly' on the board to keep every card in place, such as on a published board. Set 'readonly' on one card or connection to keep only that one in place. Set 'snap' to a length in the document's units, such as '32', and a card that is moved or resized lands on a multiple of it. Carrying a card, a corner, a connection, or the selection box near the edge of the board moves the board under it, so a card can be taken to a place off screen in one drag. A connection let go within 20 pixels of a card arrives at it. A double click on the empty board zooms in about that point, and Shift with a double click zooms out. Keyboard behavior: - One card holds the board's tab stop. - The arrow keys move through the cards in reading order. The card you land on scrolls into view, and its connections are announced with it. - The card you land on is selected. Control or Command with an arrow key, Home, or End moves without changing the selection, and Space adds the card to the selection or takes it out, so you can select cards that are not next to each other. - Shift with an arrow key moves the card: by 16 units, or to the next multiple of 'snap' where it is set. Alt with an arrow key resizes it from its bottom right corner the same way. - The connections leaving a card are stops of their own, straight after it. Enter on one moves to the card it arrives at. - What a key changes that a reader cannot see is said: where a card moved to, its new size, how many cards are selected, and the zoom. A selected card or connection says so when a reader arrives on it. - Control or Command with C copies the selected cards, and the connections between them, as a JSON Canvas document in text, which another board or an app that reads the format takes. - Control or Command with V pastes a JSON Canvas document: the board adds its cards and connections, a step down and to the right of any card they would sit on, and selects them. It asks with 'helix-before-paste' first. A page that renders its cards from its own state cancels it and adds the detail's document to that state, through 'fromJsonCanvas'. 'paste()' does the same from a script. - Control or Command with Z undoes the last move or resize the board made, and with Shift, or Control with Y, makes it again. 'undo()' and 'redo()' do the same from a script. Each asks with 'helix-before-move' and tells with 'helix-move', as a move does, so a board that holds its positions in your state is undone through your state. **'arrange()' moves every card so that none overlaps another**, in layers that follow the arrows, or in a grid on a board with no connections. The cards glide for as long as the board's own transition, and 'undo()' puts them back. Every drag also works with clicks, as WCAG 2.5.7 requires for a pointer that cannot hold a button down. Click a selected card's move handle, a corner, a card's connection point, or the end of a selected connection to pick it up. It follows the pointer with no button held, and the next click puts it down where a drag would have. On touch, the next tap sets where it lands. Escape, or a press outside the board, puts it back. So a finger connects two cards with three taps: the card, one of its points, and the card to connect to. Connecting and removing dispatch requests, and your code applies them: - Drawing from a card's handle to another card, or pressing C on one card and Enter on another, dispatches 'helix-connect'. - Delete on a card or a connection dispatches 'helix-remove'. The event names every connection that removing the card would leave without an end. Once your page removes what Delete asked for, focus moves to the next stop, to the one before where it was the last, and to the board where none is left. A focused card your page removes for its own reasons hands focus on the same way, unless the reader has already moved focus somewhere else. The board applies a move itself, because the card already exists. A connection is a new element, and React discards an element the board adds to its markup on the next render, so you write the connection. **'edgeRoute' draws the connections' lines your own way**: a function from where a line leaves and arrives, and the sides it does, to its SVG path, for a route such as one that bends around the cards between. What it returns is the line drawn, the line pressed and focused, and the one an arrowhead sits at the end of. Nothing back draws the board's own. Add 'minimap' to 'controls' for a picture of the whole board in a corner: each card as a box, and a frame around what is on screen. A press or a drag on it brings that place to the middle of the view. It is for a pointer, and a screen reader skips it: the arrow keys and 'show()' reach every card. Cards and connections are 'helix-canvas-node' and 'helix-canvas-edge' elements, so they are in the served markup whichever renderer wrote them. The library fetches nothing, and an array passed to an element is missing from the first paint of a server-rendered React page. 'fromJsonCanvas' turns a JSON Canvas document into their props, and 'toJsonCanvas()' writes a board back out. */
19273
+ /** A board of cards and connectors, drawn by Helix. On a canvas every position is data that someone placed, so drawing is arithmetic over rectangles with no layout to compute. 'Map' takes a slotted map, because another renderer draws its tiles. The format is [JSON Canvas](https://jsoncanvas.org), an open format. Each node has an 'x', 'y', 'width', 'height', and a type. Each edge names the two nodes it joins and the sides it leaves and arrives on. A card belongs to a group when it sits inside the group's bounds. The cards are text in the DOM, so a screen reader can read them. The family adds a reading order and states each card's connections as text. 'order' sets the reading order: - 'spatial' bands the cards into rows. - 'edges' follows the arrows, starting from the cards that nothing points to. **Cards move by default.** The board writes the new 'x' and 'y' onto the card, the way an input writes its own value, and dispatches two events: - 'helix-before-move' for every step. Cancel it to hold the positions in your own state and apply them yourself. - 'helix-move' once the move is finished. A resize dispatches the same pair with a size. Set 'readonly' on the board to keep every card in place, such as on a published board. Set 'readonly' on one card or connection to keep only that one in place. Set 'snap' to a length in the document's units, such as '32', and a card that is moved or resized lands on a multiple of it. Carrying a card, a corner, a connection, or the selection box near the edge of the board moves the board under it, so a card can be taken to a place off screen in one drag. A connection let go within 20 pixels of a card arrives at it. A double click on the empty board zooms in about that point, and Shift with a double click zooms out. Keyboard behavior: - One card holds the board's tab stop, and the board itself leaves the tab order while a card can hold it. Escape on a card goes back out to the board, where the arrow keys pan it. - Plus and minus zoom the board, on the board and on a card or a connection. - The arrow keys move through the cards in reading order. The card you land on scrolls into view, and its connections are announced with it. - The card you land on is selected. Control or Command with an arrow key, Home, or End moves without changing the selection, and Space adds the card to the selection or takes it out, so you can select cards that are not next to each other. - Shift with an arrow key moves the card: by 16 units, or to the next multiple of 'snap' where it is set. Alt with an arrow key resizes it from its bottom right corner the same way. - The connections leaving a card are stops of their own, straight after it. Enter on one moves to the card it arrives at. - What a key changes that a reader cannot see is said: where a card moved to, its new size, how many cards are selected, and the zoom. A selected card or connection says so when a reader arrives on it. - Control or Command with C copies the selected cards, and the connections between them, as a JSON Canvas document in text, which another board or an app that reads the format takes. - Control or Command with V pastes a JSON Canvas document: the board adds its cards and connections, a step down and to the right of any card they would sit on, and selects them. It asks with 'helix-before-paste' first. A page that renders its cards from its own state cancels it and adds the detail's document to that state, through 'fromJsonCanvas'. 'paste()' does the same from a script. - Control or Command with Z undoes the last move or resize the board made, and with Shift, or Control with Y, makes it again. 'undo()' and 'redo()' do the same from a script. Each asks with 'helix-before-move' and tells with 'helix-move', as a move does, so a board that holds its positions in your state is undone through your state. **'arrange()' moves every card so that none overlaps another**, in layers that follow the arrows, or in a grid on a board with no connections. The cards glide for as long as the board's own transition, and 'undo()' puts them back. Every drag also works with clicks, as WCAG 2.5.7 requires for a pointer that cannot hold a button down. Click a selected card's move handle, a corner, a card's connection point, or the end of a selected connection to pick it up. It follows the pointer with no button held, and the next click puts it down where a drag would have. On touch, the next tap sets where it lands. Escape, or a press outside the board, puts it back. So a finger connects two cards with three taps: the card, one of its points, and the card to connect to. Connecting and removing dispatch requests, and your code applies them: - Drawing from a card's handle to another card, or pressing C on one card and Enter on another, dispatches 'helix-connect'. - Delete on a card or a connection dispatches 'helix-remove'. The event names every connection that removing the card would leave without an end. Once your page removes what Delete asked for, focus moves to the next stop, to the one before where it was the last, and to the board where none is left. A focused card your page removes for its own reasons hands focus on the same way, unless the reader has already moved focus somewhere else. The board applies a move itself, because the card already exists. A connection is a new element, and React discards an element the board adds to its markup on the next render, so you write the connection. **'edgeRoute' draws the connections' lines your own way**: a function from where a line leaves and arrives, and the sides it does, to its SVG path, for a route such as one that bends around the cards between. What it returns is the line drawn, the line pressed and focused, and the one an arrowhead sits at the end of. Nothing back draws the board's own. Add 'minimap' to 'controls' for a picture of the whole board in a corner: each card as a box, and a frame around what is on screen. A press or a drag on it brings that place to the middle of the view. It is for a pointer, and a screen reader skips it: the arrow keys and 'show()' reach every card. Cards and connections are 'helix-canvas-node' and 'helix-canvas-edge' elements, so they are in the served markup whichever renderer wrote them. The library fetches nothing, and an array passed to an element is missing from the first paint of a server-rendered React page. 'fromJsonCanvas' turns a JSON Canvas document into their props, and 'toJsonCanvas()' writes a board back out. */
19207
19274
  "helix-headless-canvas": DefineCustomElement<
19208
19275
  HelixHeadlessCanvas,
19209
19276
  HelixHeadlessCanvasVueProps,
@@ -19335,7 +19402,7 @@ export interface WcToolkitVueGlobalComponents {
19335
19402
  HelixHeadlessDividerVueProps,
19336
19403
  HelixHeadlessDividerVueEvents
19337
19404
  >;
19338
- /** A donut chart divides one whole into parts, so the component reads one column. **The first column of numbers is the series, and each row is a slice.** Other Helix charts take one column per series. **Negative values are skipped.** An arc cannot show a negative number, so those rows are left out and the total is the sum of the remaining rows. The ring is hidden from screen readers. The 'summary' part names the chart, from 'label' or the table's caption, and gives each slice's share, and the table beside the chart has every amount. **The ring is read by key.** The plot takes focus, named by 'label' or the caption. Every arrow moves from slice to slice, the right and down arrows to the next, and Home and End go to the first and the last. The tooltip follows, the 'live' part says the slice in words, and Escape puts the tooltip away. */
19405
+ /** A donut chart divides one whole into parts, so the component reads one column. **The first column of numbers is the series, and each row is a slice.** Other Helix charts take one column per series. **Negative values are skipped.** An arc cannot show a negative number, so those rows are left out and the total is the sum of the remaining rows. The ring is hidden from screen readers. The 'summary' part names the chart, from 'label' or the table's caption, and gives each slice's share, and the table beside the chart has every amount. **The ring is read by key.** The plot takes focus, named by 'label' or the caption. Every arrow moves from slice to slice, the right and down arrows to the next, and Home and End go to the first and the last. The tooltip follows, the 'live' part says the slice in words, and Escape puts the tooltip away. **A tap shows the slice under it**, and keeps it until a tap lands elsewhere. 'helix-reading-change' says each move of the slice shown, by pointer, tap or key, and 'helix-reading-press' says a slice was clicked, tapped, or pressed with Enter or Space, for a page that opens what a slice stands for. 'index' is the slice's row in the table. **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. **Keyboard.** The plot is one tab stop. | Key | What it does | |---|---| | Tab | Moves focus to the plot and shows the first slice. | | Any arrow | Right and Down move to the next slice, Left and Up to the previous. On a right-to-left page, Left moves to the next. | | Home, End | Moves to the first or the last slice. | | Enter, Space | Presses the slice shown, which sends 'helix-reading-press'. | | Escape | Puts the slice and its tooltip away. | */
19339
19406
  "helix-headless-donut-chart": DefineCustomElement<
19340
19407
  HelixHeadlessDonutChart,
19341
19408
  HelixHeadlessDonutChartVueProps,
@@ -19407,13 +19474,13 @@ export interface WcToolkitVueGlobalComponents {
19407
19474
  HelixHeadlessFormatDateVueProps,
19408
19475
  HelixHeadlessFormatDateVueEvents
19409
19476
  >;
19410
- /** Helix draws no graph. A force layout of thousands of notes is physics and WebGL, which a renderer such as Sigma.js does. Put the renderer's box in the frame, and 'connectGraph' from '@fusion.dev/helix-graph' draws 'nodes' and 'links' in it and keeps it in step with the frame. What the frame adds is what a drawing of a graph cannot do: a list of every note beside it, which is the graph for a screen reader and a quick way to find a note for anyone. The selected note comes first, then the notes it links to and from, then every other note, and the search field narrows it. Selecting a note in the list or in the drawing is the same selection. Set 'depth' to show the local graph: only the notes within that many links of the selected one. Set 'legend' to name the groups over the drawing, each a button that shows or hides its notes. 'hiddenGroups' holds the groups turned off, and the list holds only what the drawing shows. 'nodes' and 'links' are properties, never markup: a graph of ten thousand notes as ten thousand elements would cost what the renderer exists to save. The list draws only the rows in view. The list scrolls on this tier. It carries 'data-scroller', and 'core' ships '[data-scroller] { overflow: auto }' into every shadow root. You still need to set a block size on the list, or it grows to hold every row. */
19477
+ /** Helix draws no graph. A force layout of thousands of notes is physics and WebGL, which a renderer such as Sigma.js does. Put the renderer's box in the frame, and 'connectGraph' from '@fusion.dev/helix-graph' draws 'nodes' and 'links' in it and keeps it in step with the frame. What the frame adds is what a drawing of a graph cannot do: a list of every note beside it, which is the graph for a screen reader and a quick way to find a note for anyone. The selected note comes first, then the notes it links to and from, then every other note, and the search field narrows it. Selecting a note in the list or in the drawing is the same selection. Set 'depth' to show the local graph: only the notes within that many links of the selected one. Set 'legend' to name the groups over the drawing, each a button that shows or hides its notes. 'hiddenGroups' holds the groups turned off, and the list holds only what the drawing shows. The legend is a toolbar and one tab stop: the arrow keys, Home, End and a group's first letters move between its buttons, and Space or Enter presses one. 'nodes' and 'links' are properties, never markup: a graph of ten thousand notes as ten thousand elements would cost what the renderer exists to save. The list draws only the rows in view. The list scrolls on this tier. It carries 'data-scroller', and 'core' ships '[data-scroller] { overflow: auto }' into every shadow root. You still need to set a block size on the list, or it grows to hold every row. */
19411
19478
  "helix-headless-graph": DefineCustomElement<
19412
19479
  HelixHeadlessGraph,
19413
19480
  HelixHeadlessGraphVueProps,
19414
19481
  HelixHeadlessGraphVueEvents
19415
19482
  >;
19416
- /** A grid of cells, each colored by a tone. 'rows="1"' makes a status strip, and 'rows="7"' makes a contribution graph. GitHub's contribution graph uses five discrete levels, which a set of tones covers. Color in a heatmap is per cell. In every other Helix chart, color is per series, so ninety differently colored cells would need ninety series. **The data is a real '<table>' named by 'for'**, as in every Helix chart, and the table is the accessible representation. Hide it with 'data-hidden-visually', and screen readers still read it. A cell takes its tone from its own 'data-tone', or from 'thresholds' and 'tones' applied to its value. 'data-tone' wins, so when you already know a day was degraded, you can set the tone directly. **The headless tier does not resolve tone names.** A tone named 'success' writes '--heatmap-tone: var(--heatmap-tone-success)', and the styled tier or your own stylesheet defines that property. The headless tier does not use 'var(--helix-color-*)'. **The strip is read by key.** It takes focus once it has cells. The up and down arrows move a cell, the left and right arrows move a column, which is a week with 'rows="7"', and Home and End go to the first and the last. The tooltip follows, the 'live' part says the cell's row in words, and Escape puts the tooltip away. PageUp and PageDown move a month, to the same day, where each row's header carries its date as a '<time datetime>', and four columns otherwise, which is four weeks with 'rows="7"'. **The strip describes itself.** The 'overview' part says the busiest reading and the total of the readings drawn, "Busiest: 11 Jun, 12; Total 84", and the strip is described by it, as every chart is by its summary. Hide it visually. The 'summary' slot is still yours, for words of your own. **'selection-mode' lets a reader select cells**: 'single' one at a time and 'multiple' any number. Space, Enter or a press selects the cell the keys or the pointer rest on, or lets it go, and under 'multiple' Shift with an arrow, Home, End, PageUp or PageDown takes in every cell from the last one pressed to where the key went. 'value' holds the selected days, by the names their rows have in the table, separated by commas. A change asks with 'helix-before-change' and tells with 'change', and the 'selection' part says how many are selected, in 'selection-label'. */
19483
+ /** A grid of cells, each colored by a tone. 'rows="1"' makes a status strip, and 'rows="7"' makes a contribution graph. GitHub's contribution graph uses five discrete levels, which a set of tones covers. Color in a heatmap is per cell. In every other Helix chart, color is per series, so ninety differently colored cells would need ninety series. **The data is a real '<table>' named by 'for'**, as in every Helix chart, and the table is the accessible representation. Hide it with 'data-hidden-visually', and screen readers still read it. A cell takes its tone from its own 'data-tone', or from 'thresholds' and 'tones' applied to its value. 'data-tone' wins, so when you already know a day was degraded, you can set the tone directly. **The headless tier does not resolve tone names.** A tone named 'success' writes '--heatmap-tone: var(--heatmap-tone-success)', and the styled tier or your own stylesheet defines that property. The headless tier does not use 'var(--helix-color-*)'. **The strip is read by key.** It takes focus once it has cells. The up and down arrows move a cell, the left and right arrows move a column, which is a week with 'rows="7"', and Home and End go to the first and the last. The tooltip follows, the 'live' part says the cell's row in words, and Escape puts the tooltip away. PageUp and PageDown move a month, to the same day, where each row's header carries its date as a '<time datetime>', and four columns otherwise, which is four weeks with 'rows="7"'. **The strip describes itself.** The 'overview' part says the busiest reading and the total of the readings drawn, "Busiest: 11 Jun, 12; Total 84", and the strip is described by it, as every chart is by its summary. Hide it visually. The 'summary' slot is still yours, for words of your own. **'selection-mode' lets a reader select cells**: 'single' one at a time and 'multiple' any number. Space, Enter or a press selects the cell the keys or the pointer rest on, or lets it go, and under 'multiple' Shift with an arrow, Home, End, PageUp or PageDown takes in every cell from the last one pressed to where the key went. 'value' holds the selected days, separated by commas: each by its row's '<time datetime>', such as '2026-06-11', or by its row's name where the row carries no date. A change asks with 'helix-before-change' and tells with 'change', and the 'selection' part says how many are selected, in 'selection-label'. **Keyboard.** The strip is one tab stop once it has cells. | Key | What it does | |---|---| | Tab | Moves focus to the strip and shows the first cell. | | Down, Up | Moves to the next or the previous cell. | | Right, Left | Moves a column on or back, a week with 'rows="7"'. On a right-to-left page, Left moves on. | | Home, End | Moves to the first or the last cell. | | Page Down, Page Up | Moves a month on or back where the rows carry dates, and four columns otherwise. | | Enter, Space | Selects the cell, or lets it go, under 'selection-mode'. | | Shift with an arrow, Home, End, Page Up or Page Down | Selects every cell from the last one pressed to where the key went, under 'selection-mode="multiple"'. | | Escape | Puts the cell's tooltip away. | */
19417
19484
  "helix-headless-heatmap": DefineCustomElement<
19418
19485
  HelixHeadlessHeatmap,
19419
19486
  HelixHeadlessHeatmapVueProps,
@@ -19467,7 +19534,7 @@ export interface WcToolkitVueGlobalComponents {
19467
19534
  HelixHeadlessLightboxVueProps,
19468
19535
  HelixHeadlessLightboxVueEvents
19469
19536
  >;
19470
- /** 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. */
19537
+ /** 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. **Keyboard.** The plot is one tab stop. | Key | What it does | |---|---| | Tab | Moves focus to the plot and shows the first reading. | | Right, Left | Moves to the next or the previous reading. On a right-to-left page, Left moves to the next. | | Down, Up | Moves among the series of the reading. With one series, moves to the next or the previous reading. | | Home, End | Moves to the first or the last reading. | | Page Down, Page Up | Moves a tenth of the readings on or back. | | Enter, Space | Presses the reading shown, which sends 'helix-reading-press'. | | Escape | Puts the reading and its tooltip away. | */
19471
19538
  "helix-headless-line-chart": DefineCustomElement<
19472
19539
  HelixHeadlessLineChart,
19473
19540
  HelixHeadlessLineChartVueProps,
@@ -19491,7 +19558,7 @@ export interface WcToolkitVueGlobalComponents {
19491
19558
  HelixHeadlessListboxVueProps,
19492
19559
  HelixHeadlessListboxVueEvents
19493
19560
  >;
19494
- /** 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)'. */
19561
+ /** 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)'. **The loader can stand in for what it wraps.** Put the content in the 'content' slot, such as a button or a card, and set 'idle' while no work is in progress. While the work runs, the content keeps its size and is hidden and inert, and the ring draws over it. While 'idle' is set, the loader draws nothing of its own, has no role, and marks no region busy, so only the content shows. Clearing 'idle' starts 'delay' again. */
19495
19562
  "helix-headless-loader": DefineCustomElement<
19496
19563
  HelixHeadlessLoader,
19497
19564
  HelixHeadlessLoaderVueProps,
@@ -19713,13 +19780,13 @@ export interface WcToolkitVueGlobalComponents {
19713
19780
  HelixHeadlessRadioVueProps,
19714
19781
  HelixHeadlessRadioVueEvents
19715
19782
  >;
19716
- /** Supports half marks, so the value is not always an integer and the press targets are not the marks: five stars at a half step give ten places to press. The pointer handling and 'step' are built around half marks. A partial mark is the full mark, clipped. The filled marks are drawn over the empty marks and cut off partway, so any mark and any fraction work. A read-only rating displays a score, which is the most common use. It is announced as a displayed value and does not look disabled. With 'clearable', pressing the chosen score again, or Backspace or Delete on the marks, takes the rating back to unrated and sends 'helix-clear'. **Keyboard.** The marks are one tab stop, on the chosen score or the first. | Key | What it does | |---|---| | Right, Down | Chooses the next score up, and stops at the highest. | | Left, Up | Chooses the next score down, and stops at the lowest. | | Home, End | Chooses the lowest or the highest score. | | Space, Enter | Chooses the focused score, or clears it under 'clearable' when it is already chosen. | | Backspace, Delete | Clears the rating, under 'clearable'. | Left and Right swap on a right-to-left page. The marks are a 'radiogroup' named by 'label', and each score is a 'radio' named by 'option-label', such as "3 out of 5". A read-only rating is one 'img' named by its score. */
19783
+ /** Supports half marks, so the value is not always an integer and the press targets are not the marks: five stars at a half step give ten places to press. The pointer handling and 'step' are built around half marks. A partial mark is the full mark, clipped. The filled marks are drawn over the empty marks and cut off partway, so any mark and any fraction work. A read-only rating displays a score, which is the most common use. It is announced as a displayed value and does not look disabled. With 'clearable', pressing the chosen score again, or Backspace or Delete on the marks, takes the rating back to unrated and sends 'helix-clear'. **Keyboard.** The marks are one tab stop, on the chosen score or the first. | Key | What it does | |---|---| | Right, Down | Chooses the next score up, and stops at the highest. | | Left, Up | Chooses the next score down, and stops at the lowest. | | Home, End | Chooses the lowest or the highest score. | | Space, Enter | Chooses the focused score, or clears it under 'clearable' when it is already chosen. | | Backspace, Delete | Clears the rating, under 'clearable'. | Left and Right swap on a right-to-left page. The marks are a 'radiogroup' named by 'label', and each score is a 'radio' named by 'option-label', such as "3 out of 5". A read-only rating is one 'img' named by its label and then its score, such as "Quality 3 out of 5". */
19717
19784
  "helix-headless-rating": DefineCustomElement<
19718
19785
  HelixHeadlessRating,
19719
19786
  HelixHeadlessRatingVueProps,
19720
19787
  HelixHeadlessRatingVueEvents
19721
19788
  >;
19722
- /** 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. */
19789
+ /** 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 point to point, left to right across the plot, 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. **Keyboard.** The plot is one tab stop. | Key | What it does | |---|---| | Tab | Moves focus to the plot and shows the first reading. | | Right, Left | Moves to the next or the previous point, left to right across the plot. On a right-to-left page, Left moves to the next. | | Down, Up | Moves among the series of the point. With one series, moves to the next or the previous point. | | Home, End | Moves to the first or the last point. | | Page Down, Page Up | Moves a tenth of the points on or back. | | Enter, Space | Presses the point shown, which sends 'helix-reading-press'. | | Escape | Puts the point and its tooltip away. | */
19723
19790
  "helix-headless-scatter-chart": DefineCustomElement<
19724
19791
  HelixHeadlessScatterChart,
19725
19792
  HelixHeadlessScatterChartVueProps,
@@ -19731,7 +19798,7 @@ export interface WcToolkitVueGlobalComponents {
19731
19798
  HelixHeadlessScrollAreaVueProps,
19732
19799
  HelixHeadlessScrollAreaVueEvents
19733
19800
  >;
19734
- /** A trigger that opens a 'Listbox'. The list is the same element you can use on its own, with the same keyboard behavior, filtering, and multi-select rules. Select adds a trigger that shows what is chosen, a floating surface, and a place for focus to return to when the list closes. Your options stay in your light DOM and are slotted through into the listbox, so the listbox looks through slots to find them. For a list too long to draw whole, set 'items' instead: the list draws only the options in sight, as Listbox's 'items' does, and the trigger, its keys and the form read the whole set. 'Select' owns the value, passes it down to the listbox, and takes changes back, so the value lives in one place. With 'multiple', the value is the chosen values joined with commas, and the form receives one entry for each. An option's value may hold a comma, and it is read as one value. Set 'valueContent' to draw the trigger's content from the chosen options, and several chosen options are written as a list in the reader's language. **Keyboard.** On the closed trigger: | Key | What it does | |---|---| | Down, Enter, Space | Opens the list on the chosen option, or the first. | | Up | Opens the list on the chosen option, or the last. | | Home, End | Opens the list on the first or the last option. | | Left, Right | Chooses the option before or after the chosen one without opening, as React Aria's Select does. On a right-to-left page Left chooses the one after. | | A letter or a word | Chooses the option whose words start with what you typed, as a native '<select>' does. With 'multiple', opens the list on it. | In the open list, which is a 'Listbox': | Key | What it does | |---|---| | Down, Up, Home, End, Page Down, Page Up | Moves the highlight. | | A letter or a word | Moves the highlight to the next option whose words start with what you typed. | | Enter, Space | Chooses the highlighted option and closes the list. With 'multiple', toggles it and leaves the list open. | | Escape | Closes the list and puts focus back on the trigger. | | Tab | Closes the list and moves on. | A choice made on the closed trigger is said aloud on Apple devices, where VoiceOver does not read the trigger's new name. **ARIA.** The trigger is a 'button' with 'aria-haspopup="listbox"' and 'aria-expanded', named by the label and then the chosen words, as a native '<select>' is. The list is the listbox 'Listbox' describes, named by the label, or by 'list-label' where there is none. Set 'autocomplete' to let a browser's autofill choose, as a native '<select>' with the same attribute would. */
19801
+ /** A trigger that opens a 'Listbox'. The list is the same element you can use on its own, with the same keyboard behavior, filtering, and multi-select rules. Select adds a trigger that shows what is chosen, a floating surface, and a place for focus to return to when the list closes. Your options stay in your light DOM and are slotted through into the listbox, so the listbox looks through slots to find them. Write them as 'Option', group them in 'Option.Group', and divide them with 'Option.Separator'. Importing Select registers all three in the same tier. For a list too long to draw whole, set 'items' instead: the list draws only the options in sight, as Listbox's 'items' does, and the trigger, its keys and the form read the whole set. 'Select' owns the value, passes it down to the listbox, and takes changes back, so the value lives in one place. With 'multiple', the value is the chosen values joined with commas, and the form receives one entry for each. An option's value may hold a comma, and it is read as one value. Set 'valueContent' to draw the trigger's content from the chosen options, and several chosen options are written as a list in the reader's language. **Keyboard.** On the closed trigger: | Key | What it does | |---|---| | Down, Enter, Space | Opens the list on the chosen option, or the first. | | Up | Opens the list on the chosen option, or the last. | | Home, End | Opens the list on the first or the last option. | | Left, Right | Chooses the option before or after the chosen one without opening, as React Aria's Select does. On a right-to-left page Left chooses the one after. | | A letter or a word | Chooses the option whose words start with what you typed, as a native '<select>' does. With 'multiple', opens the list on it. | In the open list, which is a 'Listbox': | Key | What it does | |---|---| | Down, Up, Home, End, Page Down, Page Up | Moves the highlight. | | A letter or a word | Moves the highlight to the next option whose words start with what you typed. | | Enter, Space | Chooses the highlighted option and closes the list. With 'multiple', toggles it and leaves the list open. | | Escape | Closes the list and puts focus back on the trigger. | | Tab | Closes the list and moves on. | A choice made on the closed trigger is said aloud on Apple devices, where VoiceOver does not read the trigger's new name. **ARIA.** The trigger is a 'button' with 'aria-haspopup="listbox"' and 'aria-expanded', named by the label and then the chosen words, as a native '<select>' is. The list is the listbox 'Listbox' describes, named by the label, or by 'list-label' where there is none. Set 'autocomplete' to let a browser's autofill choose, as a native '<select>' with the same attribute would. */
19735
19802
  "helix-headless-select": DefineCustomElement<
19736
19803
  HelixHeadlessSelect,
19737
19804
  HelixHeadlessSelectVueProps,
@@ -19755,7 +19822,7 @@ export interface WcToolkitVueGlobalComponents {
19755
19822
  HelixHeadlessSliderVueProps,
19756
19823
  HelixHeadlessSliderVueEvents
19757
19824
  >;
19758
- /** Takes its numbers from the 'values' attribute. The other charts read a table, but a table behind a small trend line would be read aloud row by row. Set 'values' to the data and 'label' to the one sentence a screen reader announces. Use 'for' when a sparkline has a real table behind it. 'for' wins when both are set. Without a 'label' the sparkline is decorative and 'aria-hidden', for example beside a stat that already says "Sessions, 1,102". With a 'label' it is named by that sentence and read by key, as every chart is: the drawing takes focus, the arrow keys walk the readings, Home and End go to the first and the last, Escape puts the reading away, and the 'live' part says each reading with where it stands, such as "Mon: 12 (3 of 7)". **A named sparkline describes itself.** Beside its name, a screen reader hears what the readings come to, the first and the last, the highest and the lowest, in 'overview-label': "From 12 to 20, highest 30, lowest 8". An 'aria-label' on the element names it as 'label' does. A pointer resting on the drawing shows the reading under it: the 'cursor' part marks it and the 'readout' part writes it. 'marks' adds a mark on the highest and the lowest reading, and 'range' draws a band between two values, such as a normal range. A blank cell in a 'for' table is a gap in the line, and a reading alone between two blanks is a 'lone' mark. Place it beside a 'Stat', because a change beside a figure is a second fact, as 'Stat''s own spec says. 'Trend' is composed the same way. The component writes the properties listed below, and the stylesheet that draws the sparkline reads them. Do not set them yourself. They carry numbers the component computes and CSS cannot, so a stylesheet can draw the sparkline without measuring anything. */
19825
+ /** Takes its numbers from the 'values' attribute. The other charts read a table, but a table behind a small trend line would be read aloud row by row. Set 'values' to the data and 'label' to the one sentence a screen reader announces. Use 'for' when a sparkline has a real table behind it. 'for' wins when both are set. Without a 'label' the sparkline is decorative and 'aria-hidden', for example beside a stat that already says "Sessions, 1,102". With a 'label' it is named by that sentence and read by key, as every chart is: the drawing takes focus, the arrow keys walk the readings, Home and End go to the first and the last, Escape puts the reading away, and the 'live' part says each reading with where it stands, such as "Mon: 12 (3 of 7)". **A named sparkline describes itself.** Beside its name, a screen reader hears what the readings come to, the first and the last, the highest and the lowest, in 'overview-label': "From 12 to 20, highest 30, lowest 8". An 'aria-label' on the element names it as 'label' does. '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, as on every chart. A pointer resting on the drawing shows the reading under it: the 'cursor' part marks it and the 'readout' part writes it. 'marks' adds a mark on the highest and the lowest reading, and 'range' draws a band between two values, such as a normal range. A blank cell in a 'for' table is a gap in the line, and a reading alone between two blanks is a 'lone' mark. Place it beside a 'Stat', because a change beside a figure is a second fact, as 'Stat''s own spec says. 'Trend' is composed the same way. The component writes the properties listed below, and the stylesheet that draws the sparkline reads them. Do not set them yourself. They carry numbers the component computes and CSS cannot, so a stylesheet can draw the sparkline without measuring anything. **Keyboard.** A sparkline with a 'label' is one tab stop. | Key | What it does | |---|---| | Tab | Moves focus to the drawing and shows the first reading, where there is a 'label'. | | Any arrow | Right and Down move to the next reading, Left and Up to the previous. On a right-to-left page, Left moves to the next. | | Home, End | Moves to the first or the last reading. | | Page Down, Page Up | Moves a tenth of the readings on or back. | | Enter, Space | Presses the reading shown, which sends 'helix-reading-press'. | | Escape | Puts the reading and its tooltip away. | */
19759
19826
  "helix-headless-sparkline": DefineCustomElement<
19760
19827
  HelixHeadlessSparkline,
19761
19828
  HelixHeadlessSparklineVueProps,
@@ -19953,7 +20020,7 @@ export interface WcToolkitVueGlobalComponents {
19953
20020
  HelixHeadlessTourStopVueProps,
19954
20021
  HelixHeadlessTourStopVueEvents
19955
20022
  >;
19956
- /** 'open' comes from 'MixinControllerOpen', the same state a disclosure holds, so you can respond to a branch opening and control the state yourself. The row renders 'aria-expanded'. Each item is an element because it holds state: whether it is open, selected, and focused. An item is a branch when something is slotted into 'children'. This is detected on the client, so server-rendered markup shows a leaf and the twisty appears on hydration. **'href' makes the whole row a link**, rendered as an '<a>'. Enter, middle click, and the status bar then work anywhere on the row. Pressing a branch, or Enter or Space on it, opens or closes it. A branch with a 'value' is chosen as well and sends 'helix-select', unless the tree has 'nesting="heading"', where a branch names the list under it, or 'selection-mode="leaf"', where only the items at the ends are chosen. A 'disabled' item is reached by the arrow keys and announced as unavailable, and a press, Enter or Space on it does nothing. A 'lazy' item is a branch whose children you load when it opens: opening it sends 'helix-load', the row says it is busy, and the children you add appear in it. Remove 'lazy' once they are in. **In a 'reorderable' tree, the row has a grip** at its far end, which a pointer drags to move the item among its siblings. The tree says which item is moving and where the drop indicator is, with the 'dragging', 'drop-before', and 'drop-after' states. */
20023
+ /** 'open' comes from 'MixinControllerOpen', the same state a disclosure holds, so you can respond to a branch opening and control the state yourself. The row renders 'aria-expanded'. Each item is an element because it holds state: whether it is open, selected, and focused. An item is a branch when an item is slotted into 'children', with 'slot="children"' on each nested item. This is detected on the client, so server-rendered markup shows a leaf and the twisty appears on hydration. **'href' makes the whole row a link**, rendered as an '<a>'. Enter, middle click, and the status bar then work anywhere on the row. Pressing a branch, or Enter or Space on it, opens or closes it. A branch with a 'value' is chosen as well and sends 'helix-select', unless the tree has 'nesting="heading"', where a branch names the list under it, or 'selection-mode="leaf"', where only the items at the ends are chosen. A 'disabled' item is reached by the arrow keys and announced as unavailable, and a press, Enter or Space on it does nothing. A 'lazy' item is a branch whose children you load when it opens: opening it sends 'helix-load', the row says it is busy, and the children you add appear in it. Remove 'lazy' once they are in. **In a 'reorderable' tree, the row has a grip** at its far end, which a pointer drags to move the item among its siblings. The tree says which item is moving and where the drop indicator is, with the 'dragging', 'drop-before', and 'drop-after' states. */
19957
20024
  "helix-headless-tree-item": DefineCustomElement<
19958
20025
  HelixHeadlessTreeItem,
19959
20026
  HelixHeadlessTreeItemVueProps,
package/types/words.d.ts CHANGED
@@ -1413,6 +1413,20 @@ declare module '@fusion.dev/helix-core' {
1413
1413
  fallbackLabel: Message
1414
1414
  }
1415
1415
  'helix-donut-chart': {
1416
+ /**
1417
+ * The words shown in place of the drawing when the table has no readings,
1418
+ * and the fallback of the `empty` slot.
1419
+ *
1420
+ * English: `No readings`
1421
+ */
1422
+ emptyText: Message
1423
+ /**
1424
+ * The words shown in place of the drawing while `loading` is set and
1425
+ * there are no readings yet, and the fallback of the `loading` slot.
1426
+ *
1427
+ * English: `Loading readings`
1428
+ */
1429
+ loadingText: Message
1416
1430
  /**
1417
1431
  * Where a reading the keys moved to stands among the readings, said after
1418
1432
  * it. `{position}` and `{count}` are replaced with the numbers, written in
@@ -1721,6 +1735,14 @@ declare module '@fusion.dev/helix-core' {
1721
1735
  * English: `Selected`
1722
1736
  */
1723
1737
  selectedLabel: Message
1738
+ /**
1739
+ * What screen readers hear after a reader selects a note, in the list or in
1740
+ * the drawing, with `{note}` for its name and `{count}` for how many notes
1741
+ * the list then holds, written with `count-label`.
1742
+ *
1743
+ * English: `{note}, selected. {count}`
1744
+ */
1745
+ selectionLabel: Message
1724
1746
  /**
1725
1747
  * The hint shown when one finger swipes over the graph with `gestures="cooperative"`.
1726
1748
  *