@fusion.dev/helix-headless 0.23.0 → 0.24.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 (102) hide show
  1. package/custom-elements.json +48376 -26638
  2. package/dist/announcement/root/announcement-root.d.ts +19 -5
  3. package/dist/area-chart/index.d.ts +1 -0
  4. package/dist/area-chart/index.js +1 -0
  5. package/dist/area-chart/root/area-chart-root.d.ts +182 -0
  6. package/dist/area-chart/root/area-chart-root.js +205 -0
  7. package/dist/carousel/root/carousel-root.d.ts +1 -0
  8. package/dist/carousel/root/carousel-root.js +18 -2
  9. package/dist/chat/index.d.ts +1 -1
  10. package/dist/chat/message/chat-message.d.ts +7 -0
  11. package/dist/chat/message/chat-message.js +2 -1
  12. package/dist/chat/root/chat-root.d.ts +195 -4
  13. package/dist/chat/root/chat-root.js +316 -23
  14. package/dist/checkbox-group/root/checkbox-group-root.d.ts +2 -0
  15. package/dist/checkbox-group/root/checkbox-group-root.js +12 -2
  16. package/dist/code-block/index.d.ts +1 -0
  17. package/dist/code-block/index.js +1 -0
  18. package/dist/code-block/patch.d.ts +62 -0
  19. package/dist/code-block/patch.js +93 -0
  20. package/dist/code-block/root/code-block-root.d.ts +82 -17
  21. package/dist/code-block/root/code-block-root.js +83 -6
  22. package/dist/color-picker/root/color-picker-root.d.ts +4 -3
  23. package/dist/color-picker/root/color-picker-root.js +4 -1
  24. package/dist/data-table/root/data-table-root.d.ts +195 -23
  25. package/dist/data-table/root/data-table-root.js +308 -27
  26. package/dist/description-list/index.d.ts +2 -0
  27. package/dist/description-list/index.js +2 -0
  28. package/dist/description-list/item/description-list-item.d.ts +39 -0
  29. package/dist/description-list/item/description-list-item.js +26 -0
  30. package/dist/description-list/root/description-list-root.d.ts +56 -0
  31. package/dist/description-list/root/description-list-root.js +21 -0
  32. package/dist/element-events.generated.js +27 -6
  33. package/dist/filter-input/chip/filter-chip.d.ts +114 -0
  34. package/dist/filter-input/chip/filter-chip.js +61 -0
  35. package/dist/filter-input/field/filter-field.d.ts +128 -0
  36. package/dist/filter-input/field/filter-field.js +70 -0
  37. package/dist/filter-input/grammar.d.ts +96 -0
  38. package/dist/filter-input/grammar.js +133 -0
  39. package/dist/filter-input/index.d.ts +5 -0
  40. package/dist/filter-input/index.js +5 -0
  41. package/dist/filter-input/menu/filter-menu.d.ts +153 -0
  42. package/dist/filter-input/menu/filter-menu.js +164 -0
  43. package/dist/filter-input/operator/filter-operator.d.ts +105 -0
  44. package/dist/filter-input/operator/filter-operator.js +39 -0
  45. package/dist/filter-input/root/filter-input-root.d.ts +118 -9
  46. package/dist/filter-input/root/filter-input-root.js +96 -2
  47. package/dist/format-date/root/format-date-root.js +1 -1
  48. package/dist/index.d.ts +5 -0
  49. package/dist/index.js +5 -0
  50. package/dist/line-chart/root/line-chart-root.d.ts +9 -2
  51. package/dist/listbox/root/listbox-root.d.ts +8 -7
  52. package/dist/listbox/root/listbox-root.js +7 -2
  53. package/dist/menu/item/menu-item.d.ts +31 -6
  54. package/dist/menu/item/menu-item.js +18 -5
  55. package/dist/menu/root/menu-root.js +7 -2
  56. package/dist/notifications/group/notification-group.d.ts +129 -0
  57. package/dist/notifications/group/notification-group.js +106 -0
  58. package/dist/notifications/index.d.ts +1 -0
  59. package/dist/notifications/index.js +1 -0
  60. package/dist/notifications/notification/notification.d.ts +39 -13
  61. package/dist/notifications/notification/notification.js +11 -8
  62. package/dist/notifications/root/notifications-root.d.ts +57 -1
  63. package/dist/notifications/root/notifications-root.js +35 -4
  64. package/dist/number-input/root/number-input-root.d.ts +21 -1
  65. package/dist/number-input/root/number-input-root.js +18 -5
  66. package/dist/object-inspector/index.d.ts +1 -0
  67. package/dist/object-inspector/index.js +1 -0
  68. package/dist/object-inspector/root/object-inspector-root.d.ts +183 -0
  69. package/dist/object-inspector/root/object-inspector-root.js +348 -0
  70. package/dist/outline/root/outline-root.d.ts +16 -1
  71. package/dist/outline/root/outline-root.js +27 -9
  72. package/dist/radio/group/radio-group.d.ts +1 -0
  73. package/dist/scatter-chart/index.d.ts +1 -0
  74. package/dist/scatter-chart/index.js +1 -0
  75. package/dist/scatter-chart/root/scatter-chart-root.d.ts +144 -0
  76. package/dist/scatter-chart/root/scatter-chart-root.js +205 -0
  77. package/dist/skip-link/index.d.ts +1 -0
  78. package/dist/skip-link/index.js +1 -0
  79. package/dist/skip-link/root/skip-link-root.d.ts +81 -0
  80. package/dist/skip-link/root/skip-link-root.js +58 -0
  81. package/dist/speed-dial/root/speed-dial-root.d.ts +1 -0
  82. package/dist/speed-dial/root/speed-dial-root.js +6 -2
  83. package/dist/steps/root/steps-root.d.ts +1 -0
  84. package/dist/table/column/table-column.d.ts +79 -0
  85. package/dist/table/column/table-column.js +125 -5
  86. package/dist/table/root/table-root.d.ts +2 -0
  87. package/dist/table/root/table-root.js +12 -3
  88. package/dist/time-picker/root/time-picker-root.d.ts +9 -0
  89. package/dist/time-picker/root/time-picker-root.js +5 -0
  90. package/dist/toast/root/toast-root.d.ts +2 -0
  91. package/dist/tooltip/root/tooltip-root.js +1 -1
  92. package/dist/tour/root/tour-root.d.ts +1 -0
  93. package/dist/tree/item/tree-item.d.ts +7 -4
  94. package/dist/tree/item/tree-item.js +4 -1
  95. package/dist/video/root/video-root.d.ts +23 -1
  96. package/dist/video/root/video-root.js +42 -22
  97. package/dist/virtual-list/root/virtual-list-root.d.ts +10 -6
  98. package/dist/virtual-list/root/virtual-list-root.js +10 -4
  99. package/package.json +5 -5
  100. package/types/jsx.d.ts +4535 -346
  101. package/types/svelte.d.ts +11 -0
  102. package/types/vue.d.ts +737 -39
package/types/vue.d.ts CHANGED
@@ -3,6 +3,7 @@ import type {
3
3
  HelixHeadlessAccordion,
4
4
  HelixHeadlessAnnouncement,
5
5
  HelixHeadlessAppHeader,
6
+ HelixHeadlessAreaChart,
6
7
  FOLDS_UP_TO,
7
8
  HelixHeadlessAvatarGroup,
8
9
  initialsOf,
@@ -18,6 +19,7 @@ import type {
18
19
  HelixHeadlessCard,
19
20
  HelixHeadlessCarousel,
20
21
  HelixHeadlessChatComposer,
22
+ FAILED_LABEL,
21
23
  HelixHeadlessChatMessage,
22
24
  HelixHeadlessChat,
23
25
  HelixHeadlessCheckboxGroup,
@@ -32,6 +34,8 @@ import type {
32
34
  HelixHeadlessDataTable,
33
35
  HelixHeadlessDateInput,
34
36
  HelixHeadlessDatePicker,
37
+ HelixHeadlessDescriptionListItem,
38
+ HelixHeadlessDescriptionList,
35
39
  HelixHeadlessDialog,
36
40
  HelixHeadlessDivider,
37
41
  HelixHeadlessDonutChart,
@@ -40,6 +44,10 @@ import type {
40
44
  HelixHeadlessDrilldown,
41
45
  HelixHeadlessEmpty,
42
46
  HelixHeadlessFileInput,
47
+ HelixHeadlessFilterChip,
48
+ HelixHeadlessFilterField,
49
+ HelixHeadlessFilterMenu,
50
+ HelixHeadlessFilterOperator,
43
51
  HelixHeadlessFilterInput,
44
52
  HelixHeadlessFormatDate,
45
53
  HelixHeadlessHeatmap,
@@ -59,9 +67,11 @@ import type {
59
67
  HelixHeadlessMenu,
60
68
  HelixHeadlessMeter,
61
69
  HelixHeadlessNavigation,
70
+ HelixHeadlessNotificationGroup,
62
71
  HelixHeadlessNotification,
63
72
  HelixHeadlessNotifications,
64
73
  HelixHeadlessNumberInput,
74
+ HelixHeadlessObjectInspector,
65
75
  HelixHeadlessOptionGroup,
66
76
  HelixHeadlessOption,
67
77
  HelixHeadlessOutline,
@@ -76,10 +86,12 @@ import type {
76
86
  HelixHeadlessRadioGroup,
77
87
  HelixHeadlessRadio,
78
88
  HelixHeadlessRating,
89
+ HelixHeadlessScatterChart,
79
90
  HelixHeadlessScrollArea,
80
91
  EDGES,
81
92
  HelixHeadlessSelect,
82
93
  HelixHeadlessSkeleton,
94
+ HelixHeadlessSkipLink,
83
95
  HelixHeadlessSlider,
84
96
  HelixHeadlessSparkline,
85
97
  HelixHeadlessSpeedDialItem,
@@ -91,6 +103,7 @@ import type {
91
103
  HelixHeadlessStep,
92
104
  HelixHeadlessSwitch,
93
105
  HelixHeadlessTableCell,
106
+ at,
94
107
  HelixHeadlessTableColumn,
95
108
  HelixHeadlessTable,
96
109
  HelixHeadlessTableRow,
@@ -130,6 +143,7 @@ import type {
130
143
  HelixSelectEvent,
131
144
  HelixSendEvent,
132
145
  HelixBeforePinEvent,
146
+ HelixHistoryEvent,
133
147
  HelixBeforeChangeEvent,
134
148
  HelixBeforeToggleEvent,
135
149
  HelixCopyEvent,
@@ -138,7 +152,9 @@ import type {
138
152
  HelixCreateEvent,
139
153
  HelixFilterEvent,
140
154
  HelixNavigateEvent,
155
+ HelixReorderEvent,
141
156
  HelixSortEvent,
157
+ HelixFacetEvent,
142
158
  HelixResizeEvent,
143
159
  HelixShortcutEvent,
144
160
  HelixReadEvent,
@@ -294,10 +310,24 @@ export type HelixHeadlessAnnouncementVueProps = {
294
310
  /** Which color the band wears.
295
311
 
296
312
  Paint only: unlike `Callout`, no value here draws a mark, changes the label,
297
- or moves the live region off polite. The set matches `Tag`'s. `neutral` is
298
- the resting value, said out loud so a consumer can put a band back to it
299
- from markup, and `surface` is the one value that is not a color: it lifts
300
- the band onto the surface step instead of the sunken one. */
313
+ or moves the live region off polite. `neutral` is the resting value, said
314
+ out loud so a consumer can put a band back to it from markup.
315
+
316
+ **The set is `Tag`'s and `Badge`'s, and now actually is.** This doc claimed
317
+ to match `Tag` while differing from it in both directions: it carried
318
+ `surface`, which `Tag` does not, and lacked `accent`, which `Tag` has. Three
319
+ components saying what a thing means, in three vocabularies, one of which
320
+ described itself as a fourth.
321
+
322
+ `accent` is the second emphasis, a rotation off the brand seed rather than a
323
+ color of its own, so it stays in relation when somebody rethemes. `primary`
324
+ is the seed itself.
325
+
326
+ **`surface` was never a color and has moved to `separation`**, which is the
327
+ axis that owns where a box sits relative to the page. It said the band rode
328
+ the surface step instead of the sunken one, which is an elevation, and a
329
+ band can be `info` and elevated at once: two values true together are two
330
+ axes, which is the test the registry answers to. */
301
331
  tone?: (HelixHeadlessAnnouncement["tone"]) | undefined;
302
332
  /** Whether it offers a control to take it away. */
303
333
  dismissible?: (HelixHeadlessAnnouncement["dismissible"]) | undefined;
@@ -367,6 +397,47 @@ export type HelixHeadlessAppHeaderVueEvents = {
367
397
  "helix-scrolled": HelixHeadlessAppHeaderHelixScrolledElementEvent;
368
398
  };
369
399
 
400
+ export type HelixHeadlessAreaChartVueProps = {
401
+ /** How a band's edge gets from one reading to the next.
402
+
403
+ Absent is `straight`, for the reason the class doc gives, and absent rather
404
+ than defaulted because a reflecting property with a default writes its
405
+ attribute onto every host, including the ones nobody configured. */
406
+ curve?: (HelixHeadlessAreaChart["curve"]) | undefined;
407
+ /** Which rules are drawn across the plot, if any.
408
+
409
+ The same three values `LineChart` takes, with the same fallback: a bare
410
+ `gridlines`, or anything unrecognized, rules the levels. Drawn over the bands
411
+ rather than under them, because the bands are opaque and a rule under one is
412
+ a rule nobody sees. */
413
+ gridlines?: (HelixHeadlessAreaChart["gridlines"]) | undefined;
414
+ /** Whether each reading is drawn as a hundred percent.
415
+
416
+ Absent stacks the amounts, so the top edge is the total. Set, every reading
417
+ fills the height and the bands are shares of it. */
418
+ share?: (HelixHeadlessAreaChart["share"]) | undefined;
419
+ /** What to call the sum of the parts, in the tooltip and the summary. */
420
+ "total-label"?: (HelixHeadlessAreaChart["totalLabel"]) | undefined;
421
+ /** What to call the sum of the parts, in the tooltip and the summary. */
422
+ totalLabel?: (HelixHeadlessAreaChart["totalLabel"]) | undefined;
423
+ /** The id of the table to read.
424
+
425
+ Resolved through `getRootNode()`, so a chart inside another component's
426
+ shadow root names a table in that root rather than in the document. A
427
+ `<table>` or anything built from grid roles, including `helix-table`.
428
+
429
+ **In React this arrives as a property and not as an attribute**, the way
430
+ `Tooltip.for` does, so it does not reflect and nothing styles on it. */
431
+ for?: (HelixHeadlessAreaChart["for"]) | undefined;
432
+ /** The drawing's name, for a pointer resting on it.
433
+
434
+ Absent falls back to the table's own caption, which is usually the right
435
+ words and is already written. */
436
+ label?: (HelixHeadlessAreaChart["label"]) | undefined;
437
+ };
438
+
439
+ export type HelixHeadlessAreaChartVueEvents = {};
440
+
370
441
  export type HelixHeadlessAvatarGroupVueProps = {
371
442
  /** Accessible name for the set, such as "Reviewers". */
372
443
  label?: (HelixHeadlessAvatarGroup["label"]) | undefined;
@@ -1023,12 +1094,29 @@ export type HelixHeadlessChatElementEvent<E = Event> = TypedEvent<
1023
1094
  /** `helix-before-pin` event type */
1024
1095
  export type HelixHeadlessChatHelixBeforePinElementEvent =
1025
1096
  HelixHeadlessChatElementEvent<HelixBeforePinEvent>;
1097
+ /** `helix-history` event type */
1098
+ export type HelixHeadlessChatHelixHistoryElementEvent =
1099
+ HelixHeadlessChatElementEvent<HelixHistoryEvent>;
1100
+ /** `helix-send` event type */
1101
+ export type HelixHeadlessChatHelixSendElementEvent =
1102
+ HelixHeadlessChatElementEvent<HelixSendEvent>;
1026
1103
 
1027
1104
  export type HelixHeadlessChatVueProps = {
1028
1105
  /** Whether to open pinned, where nothing declared it. */
1029
1106
  "default-pinned"?: (HelixHeadlessChat["defaultPinned"]) | undefined;
1030
1107
  /** Whether to open pinned, where nothing declared it. */
1031
1108
  defaultPinned?: (HelixHeadlessChat["defaultPinned"]) | undefined;
1109
+ /** Whether there are older turns than the ones here, and whether they are coming.
1110
+
1111
+ `more` makes reaching the top fire `helix-history`, once per arrival;
1112
+ `loading` draws `history-text` above the oldest turn and fires nothing; empty
1113
+ says this is the start of the conversation. The consumer owns it, because
1114
+ only the consumer knows whether the server has anything older. */
1115
+ history?: (HelixHeadlessChat["history"]) | undefined;
1116
+ /** What to say while older turns are on their way. */
1117
+ "history-text"?: (HelixHeadlessChat["historyText"]) | undefined;
1118
+ /** What to say while older turns are on their way. */
1119
+ historyText?: (HelixHeadlessChat["historyText"]) | undefined;
1032
1120
  /** Accessible name for the conversation. */
1033
1121
  label?: (HelixHeadlessChat["label"]) | undefined;
1034
1122
  /** Whether the transcript follows new turns to the bottom.
@@ -1053,7 +1141,8 @@ it. Measured rather than assumed: `label, pinned` after upgrade against
1053
1141
  A hook rather than a constant, because the right number depends on how tall
1054
1142
  a turn is: a transcript of one-line replies wants a smaller threshold than
1055
1143
  one of paragraphs, and a reader who has scrolled up by half a message has
1056
- not left. */
1144
+ not left. The same distance from the top is what counts as reaching the
1145
+ history. */
1057
1146
  threshold?: (HelixHeadlessChat["threshold"]) | undefined;
1058
1147
  /** What is said where there are none, and none are coming. */
1059
1148
  "empty-text"?: (HelixHeadlessChat["emptyText"]) | undefined;
@@ -1069,11 +1158,24 @@ say that without the component knowing what a row looks like. */
1069
1158
  "loading-text"?: (HelixHeadlessChat["loadingText"]) | undefined;
1070
1159
  /** What is said while they are on their way. */
1071
1160
  loadingText?: (HelixHeadlessChat["loadingText"]) | undefined;
1161
+ /** The turns as data, for a transcript too long to hold as elements.
1162
+
1163
+ Drawn a window at a time, so the log needs a block size. Set it or declare
1164
+ children, not both: while it holds anything the children are not drawn.
1165
+
1166
+ **Read, never written**, and replaced rather than mutated: a streamed turn
1167
+ is a new array with the last turn's text longer, which is what tells this
1168
+ element to look again. */
1169
+ turns?: (HelixHeadlessChat["turns"]) | undefined;
1072
1170
  };
1073
1171
 
1074
1172
  export type HelixHeadlessChatVueEvents = {
1075
1173
  /** Fired when the reader pins or unpins the transcript by scrolling. Cancelable. */
1076
1174
  "helix-before-pin": HelixHeadlessChatHelixBeforePinElementEvent;
1175
+ /** Fired when the reader reaches the oldest turn while `history` is `more`, reporting where they are rather than asking. */
1176
+ "helix-history": HelixHeadlessChatHelixHistoryElementEvent;
1177
+ /** A turn offered from the composer, or a failed one asked to go again, dispatched inside and heard here because the conversation is what a consumer holds. Cancelable: refusing it takes the decision and nothing is sent. */
1178
+ "helix-send": HelixHeadlessChatHelixSendElementEvent;
1077
1179
  };
1078
1180
 
1079
1181
  /** `HelixHeadlessCheckboxGroup` component event */
@@ -1208,7 +1310,15 @@ export type HelixHeadlessCheckboxVueEvents = {
1208
1310
  };
1209
1311
 
1210
1312
  export type HelixHeadlessCodeBlockVueProps = {
1211
- /** What to call this block, usually a file name or a language. */
1313
+ /** Whether the content is a unified diff, drawn as the lines it changed.
1314
+
1315
+ Reflected, because the stylesheet paints a diff differently from code, and
1316
+ `false` reflects as no attribute at all. */
1317
+ diff?: (HelixHeadlessCodeBlock["diff"]) | undefined;
1318
+ /** What to call this block, usually a file name or a language.
1319
+
1320
+ In a diff, each file is named from the patch, and this names a patch that
1321
+ carries no name of its own. */
1212
1322
  label?: (HelixHeadlessCodeBlock["label"]) | undefined;
1213
1323
  /** Whether to leave the copy button off.
1214
1324
 
@@ -1250,6 +1360,12 @@ A false boolean reflects as the attribute's absence, so this costs no
1250
1360
  reflected property taking no default is satisfied by the default being
1251
1361
  `false`. */
1252
1362
  noCopy?: (HelixHeadlessCodeBlock["noCopy"]) | undefined;
1363
+ /** How a diff's two versions are arranged; nothing without `diff`.
1364
+
1365
+ Absent is unified, each removal above its replacement, which fits any
1366
+ width. `split` sets the old version beside the new one. Optional rather
1367
+ than defaulted, so the host carries no attribute the consumer did not write. */
1368
+ variant?: (HelixHeadlessCodeBlock["variant"]) | undefined;
1253
1369
  };
1254
1370
 
1255
1371
  export type HelixHeadlessCodeBlockVueEvents = {};
@@ -1968,6 +2084,12 @@ export type HelixHeadlessDataTableHelixFilterElementEvent =
1968
2084
  /** `helix-navigate` event type */
1969
2085
  export type HelixHeadlessDataTableHelixNavigateElementEvent =
1970
2086
  HelixHeadlessDataTableElementEvent<HelixNavigateEvent>;
2087
+ /** `helix-reorder` event type */
2088
+ export type HelixHeadlessDataTableHelixReorderElementEvent =
2089
+ HelixHeadlessDataTableElementEvent<HelixReorderEvent>;
2090
+ /** `helix-select` event type */
2091
+ export type HelixHeadlessDataTableHelixSelectElementEvent =
2092
+ HelixHeadlessDataTableElementEvent<HelixSelectEvent>;
1971
2093
  /** `helix-sort` event type */
1972
2094
  export type HelixHeadlessDataTableHelixSortElementEvent =
1973
2095
  HelixHeadlessDataTableElementEvent<HelixSortEvent>;
@@ -1977,6 +2099,10 @@ export type HelixHeadlessDataTableVueProps = {
1977
2099
  "default-filter"?: (HelixHeadlessDataTable["defaultFilter"]) | undefined;
1978
2100
  /** Query to open with, where nothing declared one. */
1979
2101
  defaultFilter?: (HelixHeadlessDataTable["defaultFilter"]) | undefined;
2102
+ /** Column order to open with, where nothing declared one. */
2103
+ "default-order"?: (HelixHeadlessDataTable["defaultOrder"]) | undefined;
2104
+ /** Column order to open with, where nothing declared one. */
2105
+ defaultOrder?: (HelixHeadlessDataTable["defaultOrder"]) | undefined;
1980
2106
  /** Page to open on, where nothing declared one. */
1981
2107
  "default-page"?: (HelixHeadlessDataTable["defaultPage"]) | undefined;
1982
2108
  /** Page to open on, where nothing declared one. */
@@ -1985,6 +2111,10 @@ export type HelixHeadlessDataTableVueProps = {
1985
2111
  "default-page-size"?: (HelixHeadlessDataTable["defaultPageSize"]) | undefined;
1986
2112
  /** Page size to open with, where nothing declared one. */
1987
2113
  defaultPageSize?: (HelixHeadlessDataTable["defaultPageSize"]) | undefined;
2114
+ /** Keys to open with selected, comma separated, where nothing declared any. */
2115
+ "default-selected"?: (HelixHeadlessDataTable["defaultSelected"]) | undefined;
2116
+ /** Keys to open with selected, comma separated, where nothing declared any. */
2117
+ defaultSelected?: (HelixHeadlessDataTable["defaultSelected"]) | undefined;
1988
2118
  /** Order to open on, where nothing declared one. */
1989
2119
  "default-sort"?: (HelixHeadlessDataTable["defaultSort"]) | undefined;
1990
2120
  /** Order to open on, where nothing declared one. */
@@ -2003,29 +2133,14 @@ Set it and this element defers: a reader's click fires `helix-sort` and
2003
2133
  changes nothing until a new value arrives. `default-sort` seeds an order this
2004
2134
  element then owns. */
2005
2135
  sort?: (HelixHeadlessDataTable["sort"]) | undefined;
2006
- /** The field naming a row's stable identity.
2007
-
2008
- **Needed before selection exists, not after.** Lit keys the rendered rows by
2009
- it, so a sort moves a row's element rather than rewriting every cell in
2010
- place, which is what keeps focus inside a cell and keeps a CSS transition
2011
- attached to the row it belongs to. Left unset the index is the key, which is
2012
- correct only while nothing reorders: it is why this defaults to something
2013
- that works and is worth setting anyway. */
2014
- key?: (HelixHeadlessDataTable["key"]) | undefined;
2136
+ /** Accessible name for the grid. */
2137
+ label?: (HelixHeadlessDataTable["label"]) | undefined;
2015
2138
  /** What the rows are narrowed to, as one query across every column.
2016
2139
 
2017
2140
  One query rather than a predicate per column, which is what a reader means
2018
2141
  by a search box above a table. It matches on each column's ordering value,
2019
2142
  so search and sort cannot disagree about what a column holds. */
2020
2143
  filter?: (HelixHeadlessDataTable["filter"]) | undefined;
2021
- /** Accessible name for the grid. */
2022
- label?: (HelixHeadlessDataTable["label"]) | undefined;
2023
- /** The page on show, from 1.
2024
-
2025
- Clamped on the way out, so what this reports is the page it drew: a
2026
- bookmarked link to page 99 of a result that has since shrunk reads back as
2027
- the last page rather than as 99. */
2028
- page?: (HelixHeadlessDataTable["page"]) | undefined;
2029
2144
  /** Whether this element does the work or asks the consumer to.
2030
2145
 
2031
2146
  `client` filters, sorts and pages `rows` itself. `server` applies none of
@@ -2035,6 +2150,64 @@ the client cannot hold the data, so this is not an optimization, it is the
2035
2150
  only mode that works, and it is here from the start because adding it later
2036
2151
  inverts the data flow. */
2037
2152
  mode?: (HelixHeadlessDataTable["mode"]) | undefined;
2153
+ /** The page on show, from 1.
2154
+
2155
+ Clamped on the way out, so what this reports is the page it drew: a
2156
+ bookmarked link to page 99 of a result that has since shrunk reads back as
2157
+ the last page rather than as 99. */
2158
+ page?: (HelixHeadlessDataTable["page"]) | undefined;
2159
+ /** Whether a reader may move the columns.
2160
+
2161
+ Each heading with a `field` gets a grip, dragged along the header or moved a
2162
+ place at a time with the arrow keys once it has focus. */
2163
+ reorderable?: (HelixHeadlessDataTable["reorderable"]) | undefined;
2164
+ /** The columns' order, as their fields separated by spaces.
2165
+
2166
+ A reader's move fires `helix-reorder` first, and refusing it leaves the
2167
+ columns where they were, which is how a consumer who stores the order takes
2168
+ the decision. `default-order` seeds an order this element then owns. A field not named
2169
+ keeps its place after the named ones, and a column with no field never
2170
+ moves. */
2171
+ order?: (HelixHeadlessDataTable["order"]) | undefined;
2172
+ /** The field naming a row's stable identity.
2173
+
2174
+ **Needed before selection exists, not after.** Lit keys the rendered rows by
2175
+ it, so a sort moves a row's element rather than rewriting every cell in
2176
+ place, which is what keeps focus inside a cell and keeps a CSS transition
2177
+ attached to the row it belongs to. Left unset the index is the key, which is
2178
+ correct only while nothing reorders: it is why this defaults to something
2179
+ that works and is worth setting anyway.
2180
+
2181
+ **`row-key` and not `key`**, which is what it was called until selection
2182
+ needed it from React: `key` is reserved there, and a JSX `key` never reaches
2183
+ the element, so a React page could not tell the table which field a row is. */
2184
+ "row-key"?: (HelixHeadlessDataTable["rowKey"]) | undefined;
2185
+ /** The field naming a row's stable identity.
2186
+
2187
+ **Needed before selection exists, not after.** Lit keys the rendered rows by
2188
+ it, so a sort moves a row's element rather than rewriting every cell in
2189
+ place, which is what keeps focus inside a cell and keeps a CSS transition
2190
+ attached to the row it belongs to. Left unset the index is the key, which is
2191
+ correct only while nothing reorders: it is why this defaults to something
2192
+ that works and is worth setting anyway.
2193
+
2194
+ **`row-key` and not `key`**, which is what it was called until selection
2195
+ needed it from React: `key` is reserved there, and a JSX `key` never reaches
2196
+ the element, so a React page could not tell the table which field a row is. */
2197
+ rowKey?: (HelixHeadlessDataTable["rowKey"]) | undefined;
2198
+ /** Whether a reader may select rows, with a column of checkboxes.
2199
+
2200
+ Wants `row-key`: a selection is a set of identities, and without one the rows
2201
+ are known by their place in the result, which a sort changes. */
2202
+ selectable?: (HelixHeadlessDataTable["selectable"]) | undefined;
2203
+ /** The keys of the selected rows, comma separated.
2204
+
2205
+ A string rather than an array, so it is an attribute a server writes and a
2206
+ framework's hydration keeps, and the shape a multiple Listbox already uses.
2207
+ A key holding a comma cannot be told apart from two keys, which is the
2208
+ price of the shape. A reader's choice fires `helix-select` first, and
2209
+ refusing it leaves the selection as it was. */
2210
+ selected?: (HelixHeadlessDataTable["selected"]) | undefined;
2038
2211
  /** How many rows a page holds. Zero is every row, which is what "no paging" means.
2039
2212
 
2040
2213
  **It announces nothing, and that is not an omission.** Nothing in this
@@ -2114,6 +2287,10 @@ export type HelixHeadlessDataTableVueEvents = {
2114
2287
  "helix-filter": HelixHeadlessDataTableHelixFilterElementEvent;
2115
2288
  /** Fired when a reader asks for another page, and cancelable. */
2116
2289
  "helix-navigate": HelixHeadlessDataTableHelixNavigateElementEvent;
2290
+ /** Fired when a reader asks for the columns in another order, with every field in the new one, and cancelable. */
2291
+ "helix-reorder": HelixHeadlessDataTableHelixReorderElementEvent;
2292
+ /** Fired when a reader changes which rows are selected, with every selected key comma separated, and cancelable. */
2293
+ "helix-select": HelixHeadlessDataTableHelixSelectElementEvent;
2117
2294
  /** Fired when a reader asks for a different order, and cancelable. */
2118
2295
  "helix-sort": HelixHeadlessDataTableHelixSortElementEvent;
2119
2296
  };
@@ -2531,6 +2708,35 @@ export type HelixHeadlessDatePickerVueEvents = {
2531
2708
  input: HelixHeadlessDatePickerElementEvent;
2532
2709
  };
2533
2710
 
2711
+ export type HelixHeadlessDescriptionListItemVueProps = {
2712
+ /** What the value is, for the common case of plain text.
2713
+
2714
+ The fallback of the `label` slot, so slotted content replaces it rather than
2715
+ appearing beside it. */
2716
+ label?: (HelixHeadlessDescriptionListItem["label"]) | undefined;
2717
+ };
2718
+
2719
+ export type HelixHeadlessDescriptionListItemVueEvents = {};
2720
+
2721
+ export type HelixHeadlessDescriptionListVueProps = {
2722
+ /** Whether each label sits over its value or beside it.
2723
+
2724
+ Absent is a column, the label over the value, which fits any width and is
2725
+ how a narrow panel reads. `row` puts every label in one column and every
2726
+ value in the next, which is how a wide panel is scanned: down the labels to
2727
+ the one wanted, then across.
2728
+
2729
+ On the list rather than on each item, because beside only reads when the
2730
+ labels line up, and lining up is a fact about all of them.
2731
+
2732
+ **Optional rather than defaulted to `column`**, for the reason `Stat` gives:
2733
+ a reflecting default writes an attribute onto markup the consumer rendered,
2734
+ and React reports that as a hydration mismatch. */
2735
+ direction?: (HelixHeadlessDescriptionList["direction"]) | undefined;
2736
+ };
2737
+
2738
+ export type HelixHeadlessDescriptionListVueEvents = {};
2739
+
2534
2740
  /** `HelixHeadlessDialog` component event */
2535
2741
  export type HelixHeadlessDialogElementEvent<E = Event> = TypedEvent<
2536
2742
  HelixHeadlessDialog,
@@ -2967,6 +3173,171 @@ export type HelixHeadlessFileInputVueEvents = {
2967
3173
  "helix-before-change": HelixHeadlessFileInputHelixBeforeChangeElementEvent;
2968
3174
  };
2969
3175
 
3176
+ /** `HelixHeadlessFilterChip` component event */
3177
+ export type HelixHeadlessFilterChipElementEvent<E = Event> = TypedEvent<
3178
+ HelixHeadlessFilterChip,
3179
+ E
3180
+ >;
3181
+ /** `helix-dismiss` event type */
3182
+ export type HelixHeadlessFilterChipHelixDismissElementEvent =
3183
+ HelixHeadlessFilterChipElementEvent<HelixDismissEvent>;
3184
+
3185
+ export type HelixHeadlessFilterChipVueProps = {
3186
+ /** The field this filter is on, as a reader sees it.
3187
+
3188
+ The slot's fallback rather than the slot's replacement: a consumer who wants
3189
+ a mark beside the name slots `field` and this goes unused. */
3190
+ label?: (HelixHeadlessFilterChip["label"]) | undefined;
3191
+ /** The field this filter is on, as the consumer's model calls it.
3192
+
3193
+ Never shown. Reflected, because a consumer removing one filter from a list
3194
+ of them selects on this, and so undefaulted for the reason `operator` gives.
3195
+
3196
+ **A chip built in script should be given the attribute, not the property**,
3197
+ if the next thing to happen might select on it. Reflection is written on
3198
+ this element's next update rather than during the assignment, so a second
3199
+ `helix-facet` for the same field arriving in the same frame selects nothing,
3200
+ builds a second chip, and leaves the row holding two of one filter. The
3201
+ lookup then finds whichever came first, so dismissing one chip takes the
3202
+ other away. `setAttribute('name', field)` is true immediately and costs
3203
+ nothing; the property is for markup and for frameworks that write both. */
3204
+ name?: (HelixHeadlessFilterChip["name"]) | undefined;
3205
+ /** What the consumer's own model calls the comparison in force.
3206
+
3207
+ Never shown, and it is what a consumer matches on when the chip comes back
3208
+ to them. `label` translates; this does not.
3209
+
3210
+ Reflected and so undefaulted: a reflected property with a default writes an
3211
+ attribute on upgrade that the server never wrote, and the two markups differ
3212
+ before a reader has touched anything. */
3213
+ operator?: (HelixHeadlessFilterChip["operator"]) | undefined;
3214
+ /** The comparison, as a reader sees it, and empty for the field's usual one.
3215
+
3216
+ **Empty is the whole design and not an oversight.** A chip drawn for the
3217
+ comparison a field is normally filtered by says the field and the values and
3218
+ nothing between them, because a word every chip carries is a word nobody
3219
+ reads. The moment somebody picks a different comparison it appears, which
3220
+ makes an unusual filter look unusual. */
3221
+ "operator-label"?: (HelixHeadlessFilterChip["operatorLabel"]) | undefined;
3222
+ /** The comparison, as a reader sees it, and empty for the field's usual one.
3223
+
3224
+ **Empty is the whole design and not an oversight.** A chip drawn for the
3225
+ comparison a field is normally filtered by says the field and the values and
3226
+ nothing between them, because a word every chip carries is a word nobody
3227
+ reads. The moment somebody picks a different comparison it appears, which
3228
+ makes an unusual filter look unusual. */
3229
+ operatorLabel?: (HelixHeadlessFilterChip["operatorLabel"]) | undefined;
3230
+ /** Whether it offers a control to take it away. */
3231
+ dismissible?: (HelixHeadlessFilterChip["dismissible"]) | undefined;
3232
+ /** Accessible name for that control.
3233
+
3234
+ `attribute` is spelled out because Lit lowercases a property name to
3235
+ derive one rather than dash-casing it, so this would otherwise be
3236
+ reachable only as `dismisslabel`, which nobody would guess and no linter
3237
+ would catch. */
3238
+ "dismiss-label"?: (HelixHeadlessFilterChip["dismissLabel"]) | undefined;
3239
+ /** Accessible name for that control.
3240
+
3241
+ `attribute` is spelled out because Lit lowercases a property name to
3242
+ derive one rather than dash-casing it, so this would otherwise be
3243
+ reachable only as `dismisslabel`, which nobody would guess and no linter
3244
+ would catch. */
3245
+ dismissLabel?: (HelixHeadlessFilterChip["dismissLabel"]) | undefined;
3246
+ };
3247
+
3248
+ export type HelixHeadlessFilterChipVueEvents = {
3249
+ /** Fired when the reader asks to remove the filter. Cancelable: refusing it takes the decision and nothing moves. */
3250
+ "helix-dismiss": HelixHeadlessFilterChipHelixDismissElementEvent;
3251
+ };
3252
+
3253
+ export type HelixHeadlessFilterFieldVueProps = {
3254
+ /** What a reader is shown, in the menu and on every chip built from this field. */
3255
+ label?: (HelixHeadlessFilterField["label"]) | undefined;
3256
+ /** What the consumer's own model calls this field.
3257
+
3258
+ Never shown, and what arrives in the filter this helps build.
3259
+
3260
+ Reflected and so undefaulted: a reflected property with a default writes an
3261
+ attribute on upgrade that the server never wrote. */
3262
+ name?: (HelixHeadlessFilterField["name"]) | undefined;
3263
+ };
3264
+
3265
+ export type HelixHeadlessFilterFieldVueEvents = {};
3266
+
3267
+ /** `HelixHeadlessFilterMenu` component event */
3268
+ export type HelixHeadlessFilterMenuElementEvent<E = Event> = TypedEvent<
3269
+ HelixHeadlessFilterMenu,
3270
+ E
3271
+ >;
3272
+ /** `helix-facet` event type */
3273
+ export type HelixHeadlessFilterMenuHelixFacetElementEvent =
3274
+ HelixHeadlessFilterMenuElementEvent<HelixFacetEvent>;
3275
+
3276
+ export type HelixHeadlessFilterMenuVueProps = {
3277
+ /** Accessible name for the menu. */
3278
+ label?: (HelixHeadlessFilterMenu["label"]) | undefined;
3279
+ };
3280
+
3281
+ export type HelixHeadlessFilterMenuVueEvents = {
3282
+ /** Fired when a field's values change. Cancelable: refusing it takes the decision and nothing moves. */
3283
+ "helix-facet": HelixHeadlessFilterMenuHelixFacetElementEvent;
3284
+ };
3285
+
3286
+ export type HelixHeadlessFilterOperatorVueProps = {
3287
+ /** How many values this comparison takes.
3288
+
3289
+ `none` is a comparison that is complete on its own, which is what `is empty`
3290
+ and `is set` are: a chip drawn for one shows no values because there are
3291
+ none to show, and the menu that builds it offers nothing to pick.
3292
+
3293
+ `one` takes a single value, which is every scalar comparison: `is after` a
3294
+ date, `is above` a number. `many` takes a set, which is what `is any of` and
3295
+ `is none of` are, and is the only arity a multi-select panel makes sense
3296
+ for.
3297
+
3298
+ Read rather than enforced. This element applies nothing, so the arity is a
3299
+ fact the picker uses to decide what to offer, not a rule it polices. What
3300
+ the picker does with it: `none` offers no values at all and takes back any
3301
+ that were ticked, since the comparison is the whole filter; `one` replaces
3302
+ rather than adds, and its rows announce as one of a set. The typed grammar
3303
+ reads it too, refusing a list where a scalar was declared and never writing
3304
+ a comparison that takes nothing.
3305
+
3306
+ The arity reaches a consumer in `helix-facet`, which is what tells an empty
3307
+ filter from no filter: `values` empty means the field is no longer narrowing
3308
+ anything, unless the comparison is one that never had values to give.
3309
+
3310
+ **Undefined reads as `many`, and takes no default**, which is the rule every
3311
+ reflected property here answers to: a default writes an attribute on upgrade
3312
+ that the server never wrote, and the two markups differ before a reader has
3313
+ touched anything. */
3314
+ arity?: (HelixHeadlessFilterOperator["arity"]) | undefined;
3315
+ /** Whether this is the comparison the field is filtered by unless asked
3316
+ otherwise.
3317
+
3318
+ The chip leaves a default operator unwritten, so the common filter reads as
3319
+ a field and its values and nothing else, and the word only appears once
3320
+ somebody has chosen a comparison worth noticing. */
3321
+ default?: (HelixHeadlessFilterOperator["default"]) | undefined;
3322
+ /** What a reader is shown, in the chip and in the menu that changes it.
3323
+
3324
+ Words rather than symbols, and the reason is that a set has more than one
3325
+ negation: `!=` cannot tell "is none of" from "is not all of", and both are
3326
+ filters somebody wants. A chip is read, so it takes the reading. The text
3327
+ grammar a consumer types is theirs and may use whatever symbols it likes. */
3328
+ label?: (HelixHeadlessFilterOperator["label"]) | undefined;
3329
+ /** What the consumer's own model calls this comparison.
3330
+
3331
+ Never shown. It is what arrives in the filter this element helps build, so
3332
+ a consumer matches on it rather than on the words a reader sees, and
3333
+ translating the label breaks nothing.
3334
+
3335
+ Reflected and so undefaulted, for the reason `arity` gives above. */
3336
+ name?: (HelixHeadlessFilterOperator["name"]) | undefined;
3337
+ };
3338
+
3339
+ export type HelixHeadlessFilterOperatorVueEvents = {};
3340
+
2970
3341
  /** `HelixHeadlessFilterInput` component event */
2971
3342
  export type HelixHeadlessFilterInputElementEvent<E = Event> = TypedEvent<
2972
3343
  HelixHeadlessFilterInput,
@@ -2981,6 +3352,15 @@ export type HelixHeadlessFilterInputHelixBeforeCloseElementEvent =
2981
3352
  /** `helix-before-open` event type */
2982
3353
  export type HelixHeadlessFilterInputHelixBeforeOpenElementEvent =
2983
3354
  HelixHeadlessFilterInputElementEvent<HelixBeforeOpenEvent>;
3355
+ /** `helix-dismiss` event type */
3356
+ export type HelixHeadlessFilterInputHelixDismissElementEvent =
3357
+ HelixHeadlessFilterInputElementEvent<HelixDismissEvent>;
3358
+ /** `helix-facet` event type */
3359
+ export type HelixHeadlessFilterInputHelixFacetElementEvent =
3360
+ HelixHeadlessFilterInputElementEvent<HelixFacetEvent>;
3361
+ /** `helix-select` event type */
3362
+ export type HelixHeadlessFilterInputHelixSelectElementEvent =
3363
+ HelixHeadlessFilterInputElementEvent<HelixSelectEvent>;
2984
3364
 
2985
3365
  export type HelixHeadlessFilterInputVueProps = {
2986
3366
  /** Whether the field offers a button that empties it.
@@ -3085,6 +3465,12 @@ export type HelixHeadlessFilterInputVueEvents = {
3085
3465
  "helix-before-close": HelixHeadlessFilterInputHelixBeforeCloseElementEvent;
3086
3466
  /** Fired before the suggestions show, and cancelable. */
3087
3467
  "helix-before-open": HelixHeadlessFilterInputHelixBeforeOpenElementEvent;
3468
+ /** A token asking to go, from its close control or from Backspace on an empty field. A `FilterChip` naming a declared field is answered as `helix-facet` instead. Cancelable: refusing it takes the decision and the token stays. */
3469
+ "helix-dismiss": HelixHeadlessFilterInputHelixDismissElementEvent;
3470
+ /** Fired when a filter changes, whether read out of the text, picked, or dismissed. Cancelable: refusing it leaves the text and the chip where they were. */
3471
+ "helix-facet": HelixHeadlessFilterInputHelixFacetElementEvent;
3472
+ /** A suggestion was chosen: the option's own, heard here because it bubbles out of `suggestions`. Cancelable: refusing it takes the decision from any other listener, and this field never acts on a choice itself, since what it means is the page's. */
3473
+ "helix-select": HelixHeadlessFilterInputHelixSelectElementEvent;
3088
3474
  /** Announced once the text has moved. */
3089
3475
  input: HelixHeadlessFilterInputElementEvent;
3090
3476
  /** Says the panel moved, carrying `newState` and `oldState`. */
@@ -3726,10 +4112,12 @@ shadow root names a table in that root rather than in the document.
3726
4112
  export type HelixHeadlessLegendVueEvents = {};
3727
4113
 
3728
4114
  export type HelixHeadlessLineChartVueProps = {
3729
- /** Whether a wash is drawn under each line.
4115
+ /** Whether a wash is drawn under each line, each from the floor on its own.
4116
+ The washes overlap rather than add up: for parts that make a total, use
4117
+ `Area Chart`, which stacks them.
3730
4118
 
3731
4119
  Absent is lines alone, which is what suits more than one series: washes
3732
- stack and the lower ones are read through the upper. One series over a
4120
+ overlap and the lower ones are read through the upper. One series over a
3733
4121
  ground it should feel like a quantity against is the case for this. */
3734
4122
  area?: (HelixHeadlessLineChart["area"]) | undefined;
3735
4123
  /** How the line gets from one reading to the next.
@@ -4156,6 +4544,17 @@ Only meaningful beside an `href`, and only for a file served from this
4156
4544
  origin: the attribute is ignored cross-origin, which is the browser's rule
4157
4545
  about who may name a file on somebody's disk rather than a gap here. */
4158
4546
  download?: (HelixHeadlessMenuItem["download"]) | undefined;
4547
+ /** Whether only one row of the set it belongs to can be on.
4548
+
4549
+ Announcement and nothing else, the way `checkable` is: this element applies
4550
+ no choice and polices no group, so what it does is tell a reader which kind
4551
+ of set they are in. `menuitemcheckbox` says every row here is independent,
4552
+ which for a run of comparisons, or the values of a filter that compares
4553
+ against one, is the opposite of true.
4554
+
4555
+ Meaningless without `checkable`, since a row that cannot be ticked is not
4556
+ one of a set of anything. */
4557
+ exclusive?: (HelixHeadlessMenuItem["exclusive"]) | undefined;
4159
4558
  /** Where the row goes, which makes it a real link.
4160
4559
 
4161
4560
  **The row itself becomes an `<a>`, and the role goes with it.** A
@@ -4187,13 +4586,14 @@ Set by the menu, and a property rather than an attribute for that reason.
4187
4586
  Public because the menu has to reach it, and not something a consumer
4188
4587
  writes: which page is open is the menu's business. */
4189
4588
  onPage?: (HelixHeadlessMenuItem["onPage"]) | undefined;
4190
- /** Whether this row's submenu is the page showing.
4589
+ /** Whether the page showing is this row's submenu, or one below it.
4191
4590
 
4192
4591
  Separate from `onPage`, and it has to be. A row that opened a page is not
4193
4592
  itself on that page, so both are false for it, and rendering nothing on
4194
4593
  that basis takes its `slot[name="submenu"]` with it: the rows inside have
4195
- nowhere to be assigned and are never laid out. The element that holds the
4196
- page has to keep the slot even when it shows no row of its own. */
4594
+ nowhere to be assigned and are never laid out. Every row on the way down to
4595
+ the open page has to keep its slot, not only the one directly above it.
4596
+ Three levels deep, the topmost row holds the slot the middle one lives in. */
4197
4597
  showingSubmenu?: (HelixHeadlessMenuItem["showingSubmenu"]) | undefined;
4198
4598
  };
4199
4599
 
@@ -4374,6 +4774,63 @@ export type HelixHeadlessNavigationVueProps = {
4374
4774
 
4375
4775
  export type HelixHeadlessNavigationVueEvents = {};
4376
4776
 
4777
+ /** `HelixHeadlessNotificationGroup` component event */
4778
+ export type HelixHeadlessNotificationGroupElementEvent<E = Event> = TypedEvent<
4779
+ HelixHeadlessNotificationGroup,
4780
+ E
4781
+ >;
4782
+ /** `helix-before-close` event type */
4783
+ export type HelixHeadlessNotificationGroupHelixBeforeCloseElementEvent =
4784
+ HelixHeadlessNotificationGroupElementEvent<HelixBeforeCloseEvent>;
4785
+ /** `helix-before-open` event type */
4786
+ export type HelixHeadlessNotificationGroupHelixBeforeOpenElementEvent =
4787
+ HelixHeadlessNotificationGroupElementEvent<HelixBeforeOpenEvent>;
4788
+
4789
+ export type HelixHeadlessNotificationGroupVueProps = {
4790
+ /** Whether the group can be collapsed to its first row.
4791
+
4792
+ Off by default, because a group is a heading before it is a control: a feed
4793
+ cut by day wants its days named and rarely wants them folded, and a control
4794
+ that does nothing anybody asked for is still a tab stop. */
4795
+ collapsible?: (HelixHeadlessNotificationGroup["collapsible"]) | undefined;
4796
+ /** How many notifications this group stands for.
4797
+
4798
+ **Not the number of rows, and that is the point.** A group saying five with
4799
+ one row under it and a link to the rest is the ordinary shape of a feed that
4800
+ has been trimmed, and deriving this from the children would make it
4801
+ unsayable. Left off, it is the number of rows. */
4802
+ count?: (HelixHeadlessNotificationGroup["count"]) | undefined;
4803
+ /** What the group is called: a day, a subject, a person.
4804
+
4805
+ The slot's fallback rather than its replacement, so a consumer who wants a
4806
+ mark beside the name slots `label` and this goes unused. */
4807
+ label?: (HelixHeadlessNotificationGroup["label"]) | undefined;
4808
+ /** Whether the element is open.
4809
+
4810
+ One property, not two, so `dialog.open` answers the question anyone
4811
+ asking it meant. Writing always applies; `<helix-dialog open>` is the
4812
+ same statement in markup.
4813
+
4814
+ **Not reflected, and that is required rather than tidy.** Reflection
4815
+ writes the resolved state back as an attribute, so an element that opened
4816
+ itself would put `open` on its own host: cloned, serialized for
4817
+ hydration, or diffed by a framework, it comes back holding whatever the
4818
+ last reader did rather than what the author wrote. `:state(open)` carries
4819
+ the resolved state for stylesheets, which is what the mirror is for. */
4820
+ open?: (HelixHeadlessNotificationGroup["open"]) | undefined;
4821
+ /** Initial open state for uncontrolled use, where nothing declared one. */
4822
+ "default-open"?: (HelixHeadlessNotificationGroup["defaultOpen"]) | undefined;
4823
+ /** Initial open state for uncontrolled use, where nothing declared one. */
4824
+ defaultOpen?: (HelixHeadlessNotificationGroup["defaultOpen"]) | undefined;
4825
+ };
4826
+
4827
+ export type HelixHeadlessNotificationGroupVueEvents = {
4828
+ /** Fired before the group folds, and cancelable. */
4829
+ "helix-before-close": HelixHeadlessNotificationGroupHelixBeforeCloseElementEvent;
4830
+ /** Fired before the group unfolds. Cancelable: refusing it takes the decision and nothing moves. */
4831
+ "helix-before-open": HelixHeadlessNotificationGroupHelixBeforeOpenElementEvent;
4832
+ };
4833
+
4377
4834
  /** `HelixHeadlessNotification` component event */
4378
4835
  export type HelixHeadlessNotificationElementEvent<E = Event> = TypedEvent<
4379
4836
  HelixHeadlessNotification,
@@ -4436,6 +4893,9 @@ export type HelixHeadlessNotificationsElementEvent<E = Event> = TypedEvent<
4436
4893
  HelixHeadlessNotifications,
4437
4894
  E
4438
4895
  >;
4896
+ /** `helix-dismiss` event type */
4897
+ export type HelixHeadlessNotificationsHelixDismissElementEvent =
4898
+ HelixHeadlessNotificationsElementEvent<HelixDismissEvent>;
4439
4899
  /** `helix-read` event type */
4440
4900
  export type HelixHeadlessNotificationsHelixReadElementEvent =
4441
4901
  HelixHeadlessNotificationsElementEvent<HelixReadEvent>;
@@ -4468,6 +4928,8 @@ say that without the component knowing what a row looks like. */
4468
4928
  };
4469
4929
 
4470
4930
  export type HelixHeadlessNotificationsVueEvents = {
4931
+ /** A row asking to be removed, dispatched by the row and heard here because the feed is what a consumer holds. Cancelable: refusing it takes the decision and the row stays. */
4932
+ "helix-dismiss": HelixHeadlessNotificationsHelixDismissElementEvent;
4471
4933
  /** Fired by an item, and by this element when everything is marked read. Cancelable. */
4472
4934
  "helix-read": HelixHeadlessNotificationsHelixReadElementEvent;
4473
4935
  };
@@ -4598,6 +5060,65 @@ export type HelixHeadlessNumberInputVueEvents = {
4598
5060
  input: HelixHeadlessNumberInputElementEvent;
4599
5061
  };
4600
5062
 
5063
+ /** `HelixHeadlessObjectInspector` component event */
5064
+ export type HelixHeadlessObjectInspectorElementEvent<E = Event> = TypedEvent<
5065
+ HelixHeadlessObjectInspector,
5066
+ E
5067
+ >;
5068
+ /** `helix-copy` event type */
5069
+ export type HelixHeadlessObjectInspectorHelixCopyElementEvent =
5070
+ HelixHeadlessObjectInspectorElementEvent<HelixCopyEvent>;
5071
+
5072
+ export type HelixHeadlessObjectInspectorVueProps = {
5073
+ /** How many levels start open.
5074
+
5075
+ One by default: the root is open and everything under it closed, so a
5076
+ reader sees the shape of the value before its contents. `0` starts with the
5077
+ root closed; a large number opens everything, which on a big value is the
5078
+ wall of text this exists to avoid. */
5079
+ "default-depth"?: (HelixHeadlessObjectInspector["defaultDepth"]) | undefined;
5080
+ /** How many levels start open.
5081
+
5082
+ One by default: the root is open and everything under it closed, so a
5083
+ reader sees the shape of the value before its contents. `0` starts with the
5084
+ root closed; a large number opens everything, which on a big value is the
5085
+ wall of text this exists to avoid. */
5086
+ defaultDepth?: (HelixHeadlessObjectInspector["defaultDepth"]) | undefined;
5087
+ /** The id of a `<script type="application/json">` holding the value.
5088
+
5089
+ Read once the document exists, and again whenever this changes. Text that
5090
+ does not parse leaves the inspector empty rather than throwing, since a
5091
+ page's markup should not take the page down over a comma. */
5092
+ for?: (HelixHeadlessObjectInspector["for"]) | undefined;
5093
+ /** Accessible name for the tree, and the text of the header where there is one. */
5094
+ label?: (HelixHeadlessObjectInspector["label"]) | undefined;
5095
+ /** Whether to leave the copy button off.
5096
+
5097
+ Negative for the reason Code Block's is: a boolean attribute defaulting to
5098
+ true could never be turned off from markup. */
5099
+ "no-copy"?: (HelixHeadlessObjectInspector["noCopy"]) | undefined;
5100
+ /** Whether to leave the copy button off.
5101
+
5102
+ Negative for the reason Code Block's is: a boolean attribute defaulting to
5103
+ true could never be turned off from markup. */
5104
+ noCopy?: (HelixHeadlessObjectInspector["noCopy"]) | undefined;
5105
+ /** Whether to draw only the rows in view.
5106
+
5107
+ For a value of thousands of entries. Reflected, because the box it scrolls
5108
+ needs a height, which is a stylesheet rule reading this attribute. */
5109
+ windowed?: (HelixHeadlessObjectInspector["windowed"]) | undefined;
5110
+ /** The value itself, for a page that already holds it.
5111
+
5112
+ Takes precedence over `for`. Anything JSON can say is drawn; anything else
5113
+ is shown as its string. */
5114
+ value?: (HelixHeadlessObjectInspector["value"]) | undefined;
5115
+ };
5116
+
5117
+ export type HelixHeadlessObjectInspectorVueEvents = {
5118
+ /** A value was put on the clipboard, from the copy button or the keyboard. */
5119
+ "helix-copy": HelixHeadlessObjectInspectorHelixCopyElementEvent;
5120
+ };
5121
+
4601
5122
  export type HelixHeadlessOptionGroupVueProps = {
4602
5123
  /** The heading over the run. */
4603
5124
  label?: (HelixHeadlessOptionGroup["label"]) | undefined;
@@ -4743,7 +5264,8 @@ JavaScript rather than CSS decides. */
4743
5264
  behavior?: (HelixHeadlessOutline["behavior"]) | undefined;
4744
5265
  /** Accessible name for the navigation. */
4745
5266
  label?: (HelixHeadlessOutline["label"]) | undefined;
4746
- /** How far below the top of the window a heading counts as reached, in pixels.
5267
+ /** How far below the top of what scrolls a heading counts as reached, in
5268
+ pixels: the window, or the panel the sections scroll in.
4747
5269
 
4748
5270
  The reading line. A page with a sticky masthead sets this to its height, or
4749
5271
  a little more: without it the current section changes as a heading slides
@@ -5268,6 +5790,9 @@ export type HelixHeadlessRadioGroupElementEvent<E = Event> = TypedEvent<
5268
5790
  /** `helix-before-change` event type */
5269
5791
  export type HelixHeadlessRadioGroupHelixBeforeChangeElementEvent =
5270
5792
  HelixHeadlessRadioGroupElementEvent<HelixBeforeChangeEvent>;
5793
+ /** `helix-select` event type */
5794
+ export type HelixHeadlessRadioGroupHelixSelectElementEvent =
5795
+ HelixHeadlessRadioGroupElementEvent<HelixSelectEvent>;
5271
5796
 
5272
5797
  export type HelixHeadlessRadioGroupVueProps = {
5273
5798
  /** Which way the choices run. A column reads one line per answer.
@@ -5331,6 +5856,8 @@ export type HelixHeadlessRadioGroupVueEvents = {
5331
5856
  change: HelixHeadlessRadioGroupElementEvent;
5332
5857
  /** Fired when the answer changes, and cancelable. */
5333
5858
  "helix-before-change": HelixHeadlessRadioGroupHelixBeforeChangeElementEvent;
5859
+ /** Fired when an answer is chosen. Dispatched by the radio and listened for here, because the group is what a consumer holds. Cancelable: refusing it takes the decision and nothing moves. */
5860
+ "helix-select": HelixHeadlessRadioGroupHelixSelectElementEvent;
5334
5861
  /** Announced once the value has moved. */
5335
5862
  input: HelixHeadlessRadioGroupElementEvent;
5336
5863
  };
@@ -5505,6 +6032,40 @@ export type HelixHeadlessRatingVueEvents = {
5505
6032
  input: HelixHeadlessRatingElementEvent;
5506
6033
  };
5507
6034
 
6035
+ export type HelixHeadlessScatterChartVueProps = {
6036
+ /** What to call the strength of the relation in the summary. */
6037
+ "correlation-label"?: (HelixHeadlessScatterChart["correlationLabel"]) | undefined;
6038
+ /** What to call the strength of the relation in the summary. */
6039
+ correlationLabel?: (HelixHeadlessScatterChart["correlationLabel"]) | undefined;
6040
+ /** Which rules are drawn across the plot, if any.
6041
+
6042
+ Both axes are measured, so the values name an axis rather than a role:
6043
+ `x` rules the levels across, `y` the levels up. A bare `gridlines`, or
6044
+ anything unrecognized, means `both`, since neither axis is the one a scatter
6045
+ is read along. */
6046
+ gridlines?: (HelixHeadlessScatterChart["gridlines"]) | undefined;
6047
+ /** What to call a row in the summary, which counts them. */
6048
+ "points-label"?: (HelixHeadlessScatterChart["pointsLabel"]) | undefined;
6049
+ /** What to call a row in the summary, which counts them. */
6050
+ pointsLabel?: (HelixHeadlessScatterChart["pointsLabel"]) | undefined;
6051
+ /** The id of the table to read.
6052
+
6053
+ Resolved through `getRootNode()`, so a chart inside another component's
6054
+ shadow root names a table in that root rather than in the document. A
6055
+ `<table>` or anything built from grid roles, including `helix-table`.
6056
+
6057
+ **In React this arrives as a property and not as an attribute**, the way
6058
+ `Tooltip.for` does, so it does not reflect and nothing styles on it. */
6059
+ for?: (HelixHeadlessScatterChart["for"]) | undefined;
6060
+ /** The drawing's name, for a pointer resting on it.
6061
+
6062
+ Absent falls back to the table's own caption, which is usually the right
6063
+ words and is already written. */
6064
+ label?: (HelixHeadlessScatterChart["label"]) | undefined;
6065
+ };
6066
+
6067
+ export type HelixHeadlessScatterChartVueEvents = {};
6068
+
5508
6069
  export type HelixHeadlessScrollAreaVueProps = {
5509
6070
  /** Names the region, for a reader arriving at it out of context.
5510
6071
 
@@ -5643,6 +6204,23 @@ export type HelixHeadlessSkeletonVueProps = {};
5643
6204
 
5644
6205
  export type HelixHeadlessSkeletonVueEvents = {};
5645
6206
 
6207
+ export type HelixHeadlessSkipLinkVueProps = {
6208
+ /** Where the reader is sent, as an in-page fragment.
6209
+
6210
+ `#main` by default, because that is the id the content region almost always
6211
+ has; a page whose content is somewhere else says so. Anything that is not a
6212
+ fragment naming an element on the page is left to the browser, as a plain
6213
+ link. */
6214
+ href?: (HelixHeadlessSkipLink["href"]) | undefined;
6215
+ /** The link's words, for the common case of plain text.
6216
+
6217
+ The fallback of the default slot, so slotted content replaces it rather than
6218
+ appearing beside it. */
6219
+ label?: (HelixHeadlessSkipLink["label"]) | undefined;
6220
+ };
6221
+
6222
+ export type HelixHeadlessSkipLinkVueEvents = {};
6223
+
5646
6224
  /** `HelixHeadlessSlider` component event */
5647
6225
  export type HelixHeadlessSliderElementEvent<E = Event> = TypedEvent<
5648
6226
  HelixHeadlessSlider,
@@ -5863,6 +6441,9 @@ export type HelixHeadlessSpeedDialHelixBeforeCloseElementEvent =
5863
6441
  /** `helix-before-open` event type */
5864
6442
  export type HelixHeadlessSpeedDialHelixBeforeOpenElementEvent =
5865
6443
  HelixHeadlessSpeedDialElementEvent<HelixBeforeOpenEvent>;
6444
+ /** `helix-select` event type */
6445
+ export type HelixHeadlessSpeedDialHelixSelectElementEvent =
6446
+ HelixHeadlessSpeedDialElementEvent<HelixSelectEvent>;
5866
6447
 
5867
6448
  export type HelixHeadlessSpeedDialVueProps = {
5868
6449
  /** Names the trigger and the set of actions it opens. */
@@ -5898,6 +6479,8 @@ export type HelixHeadlessSpeedDialVueEvents = {
5898
6479
  "helix-before-close": HelixHeadlessSpeedDialHelixBeforeCloseElementEvent;
5899
6480
  /** Fired before it opens, and cancelable. */
5900
6481
  "helix-before-open": HelixHeadlessSpeedDialHelixBeforeOpenElementEvent;
6482
+ /** Fired when an action is chosen. Dispatched by the action and listened for here, and the dial closes behind it once it has been heard. Cancelable: refusing it takes the decision and the dial stays open. */
6483
+ "helix-select": HelixHeadlessSpeedDialHelixSelectElementEvent;
5901
6484
  /** Says the state moved, carrying `newState` and `oldState`. */
5902
6485
  toggle: HelixHeadlessSpeedDialElementEvent;
5903
6486
  };
@@ -6062,6 +6645,9 @@ export type HelixHeadlessStepsHelixActivateElementEvent =
6062
6645
  /** `helix-before-activate` event type */
6063
6646
  export type HelixHeadlessStepsHelixBeforeActivateElementEvent =
6064
6647
  HelixHeadlessStepsElementEvent<HelixBeforeActivateEvent>;
6648
+ /** `helix-select` event type */
6649
+ export type HelixHeadlessStepsHelixSelectElementEvent =
6650
+ HelixHeadlessStepsElementEvent<HelixSelectEvent>;
6065
6651
 
6066
6652
  export type HelixHeadlessStepsVueProps = {
6067
6653
  /** Accessible name for the sequence.
@@ -6116,6 +6702,8 @@ export type HelixHeadlessStepsVueEvents = {
6116
6702
  "helix-activate": HelixHeadlessStepsHelixActivateElementEvent;
6117
6703
  /** Fired before the active step changes. Cancelable: refusing it takes the decision and nothing moves. */
6118
6704
  "helix-before-activate": HelixHeadlessStepsHelixBeforeActivateElementEvent;
6705
+ /** Fired when a step is pressed. Dispatched by the step and listened for here, because the root is what a consumer holds. Cancelable: refusing it takes the decision and nothing moves. */
6706
+ "helix-select": HelixHeadlessStepsHelixSelectElementEvent;
6119
6707
  };
6120
6708
 
6121
6709
  /** `HelixHeadlessStep` component event */
@@ -6220,6 +6808,15 @@ export type HelixHeadlessTableCellVueProps = {
6220
6808
 
6221
6809
  export type HelixHeadlessTableCellVueEvents = {};
6222
6810
 
6811
+ /** `HelixHeadlessTableColumn` component event */
6812
+ export type HelixHeadlessTableColumnElementEvent<E = Event> = TypedEvent<
6813
+ HelixHeadlessTableColumn,
6814
+ E
6815
+ >;
6816
+ /** `helix-before-resize` event type */
6817
+ export type HelixHeadlessTableColumnHelixBeforeResizeElementEvent =
6818
+ HelixHeadlessTableColumnElementEvent<HelixBeforeResizeEvent>;
6819
+
6223
6820
  export type HelixHeadlessTableColumnVueProps = {
6224
6821
  /** Which edge the values line up against.
6225
6822
 
@@ -6241,6 +6838,13 @@ after a column moves is a sort a consumer cannot store in a URL.
6241
6838
  Empty on a column that is purely presentational, an actions column say, and
6242
6839
  such a column is never sortable however it is marked. */
6243
6840
  field?: (HelixHeadlessTableColumn["field"]) | undefined;
6841
+ /** Whether a reader may change this column's width.
6842
+
6843
+ By dragging the edge at the end of the heading, or with the arrow keys once
6844
+ it has focus, a step at a time and four with Shift. The width lands in
6845
+ `width` as pixels, and `helix-before-resize` asks first, so a consumer who
6846
+ stores the widths can take the decision. */
6847
+ resizable?: (HelixHeadlessTableColumn["resizable"]) | undefined;
6244
6848
  /** Whether a reader may reorder the set by this column.
6245
6849
 
6246
6850
  Ignored without a `field`, and silently: a column with nothing to sort by
@@ -6286,7 +6890,10 @@ correct default: the raw value is what an API sorted by. */
6286
6890
  compare?: (HelixHeadlessTableColumn["compare"]) | undefined;
6287
6891
  };
6288
6892
 
6289
- export type HelixHeadlessTableColumnVueEvents = {};
6893
+ export type HelixHeadlessTableColumnVueEvents = {
6894
+ /** Fired as a reader resizes the column, with the width asked for, and cancelable. */
6895
+ "helix-before-resize": HelixHeadlessTableColumnHelixBeforeResizeElementEvent;
6896
+ };
6290
6897
 
6291
6898
  export type HelixHeadlessTableVueProps = {
6292
6899
  /** Column track list, as CSS. Deprecated: declare columns instead.
@@ -7071,6 +7678,15 @@ export type HelixHeadlessToastItemVueEvents = {
7071
7678
  "helix-dismiss": HelixHeadlessToastItemHelixDismissElementEvent;
7072
7679
  };
7073
7680
 
7681
+ /** `HelixHeadlessToast` component event */
7682
+ export type HelixHeadlessToastElementEvent<E = Event> = TypedEvent<
7683
+ HelixHeadlessToast,
7684
+ E
7685
+ >;
7686
+ /** `helix-dismiss` event type */
7687
+ export type HelixHeadlessToastHelixDismissElementEvent =
7688
+ HelixHeadlessToastElementEvent<HelixDismissEvent>;
7689
+
7074
7690
  export type HelixHeadlessToastVueProps = {
7075
7691
  /** Accessible name for the region, such as "Notifications". */
7076
7692
  label?: (HelixHeadlessToast["label"]) | undefined;
@@ -7089,7 +7705,10 @@ departures, which is what `orientation` does. */
7089
7705
  placement?: (HelixHeadlessToast["placement"]) | undefined;
7090
7706
  };
7091
7707
 
7092
- export type HelixHeadlessToastVueEvents = {};
7708
+ export type HelixHeadlessToastVueEvents = {
7709
+ /** A message asking to go, by its control or by its timer, dispatched by the message and heard here because the stack is what a consumer holds. Cancelable: refusing it takes the decision and the message stays. */
7710
+ "helix-dismiss": HelixHeadlessToastHelixDismissElementEvent;
7711
+ };
7093
7712
 
7094
7713
  /** `HelixHeadlessToggleGroup` component event */
7095
7714
  export type HelixHeadlessToggleGroupElementEvent<E = Event> = TypedEvent<
@@ -7377,6 +7996,9 @@ export type HelixHeadlessTourHelixBeforeCloseElementEvent =
7377
7996
  /** `helix-complete` event type */
7378
7997
  export type HelixHeadlessTourHelixCompleteElementEvent =
7379
7998
  HelixHeadlessTourElementEvent<HelixCompleteEvent>;
7999
+ /** `helix-tour-ask` event type */
8000
+ export type HelixHeadlessTourHelixTourAskElementEvent =
8001
+ HelixHeadlessTourElementEvent<HelixTourAskEvent>;
7380
8002
 
7381
8003
  export type HelixHeadlessTourVueProps = {
7382
8004
  /** Label for the control that goes back, handed to every stop. */
@@ -7427,6 +8049,8 @@ export type HelixHeadlessTourVueEvents = {
7427
8049
  "helix-before-close": HelixHeadlessTourHelixBeforeCloseElementEvent;
7428
8050
  /** Fired when the last stop is finished. */
7429
8051
  "helix-complete": HelixHeadlessTourHelixCompleteElementEvent;
8052
+ /** A stop's own controls asking the tour to move, dispatched by the stop and heard here because the tour is what moves. */
8053
+ "helix-tour-ask": HelixHeadlessTourHelixTourAskElementEvent;
7430
8054
  /** Says the state moved, carrying `newState` and `oldState`. */
7431
8055
  toggle: HelixHeadlessTourElementEvent;
7432
8056
  };
@@ -8102,6 +8726,8 @@ export type CustomCssProperties = {
8102
8726
  "--meter-fraction"?: (string) | undefined;
8103
8727
  /** How much of the circle the arc covers, as a path length. */
8104
8728
  "--meter-sweep"?: (string) | undefined;
8729
+ /** How deep a row is, from 0 at the root, for indenting it. */
8730
+ "--object-inspector-level"?: (string) | undefined;
8105
8731
  /** The value as a fraction of the range, 0 to 1. Pinned to 1 while indeterminate. */
8106
8732
  "--progress-fraction"?: (string) | undefined;
8107
8733
  /** How many marks are wholly filled. */
@@ -8112,6 +8738,12 @@ export type CustomCssProperties = {
8112
8738
  "--rating-step"?: (string) | undefined;
8113
8739
  /** How many steps one mark is divided into. */
8114
8740
  "--rating-steps"?: (string) | undefined;
8741
+ /** Where a point sits across, as a percentage. Written by the component. */
8742
+ "--chart-point-x"?: (string) | undefined;
8743
+ /** Where a point sits up, as a percentage from the top. Written by the component. */
8744
+ "--chart-point-y"?: (string) | undefined;
8745
+ /** Where a tick sits along its axis, as a percentage. Written by the component. */
8746
+ "--chart-tick"?: (string) | undefined;
8115
8747
  /** The value as a fraction of the range, 0 to 1. */
8116
8748
  "--slider-fraction"?: (string) | undefined;
8117
8749
  /** Where the filled span starts, as a percentage of the track. */
@@ -8172,6 +8804,12 @@ export interface WcToolkitVueGlobalComponents {
8172
8804
  HelixHeadlessAppHeaderVueProps,
8173
8805
  HelixHeadlessAppHeaderVueEvents
8174
8806
  >;
8807
+ /** The chart for a composition: every column of the table is a part, the parts sum to the whole at each reading, and the top edge is that whole. What a line chart of the same table cannot show is the share, which here is the thickness of a band. **Not 'Line Chart' with 'area'.** That washes each series from the floor on its own, so the series overlap; this adds them. Reach for 'Line Chart' when the question is how each series moved, and for this when it is how the whole is made up. **It measures from zero, always**, which is 'BarChart''s rule and for the same reason: a band's thickness *is* its value, so a range that starts anywhere else draws every part in proportion to nothing. 'LineChart' measures from its own range because a line claims a position; a band claims an amount. **Straight between readings unless asked otherwise.** A band's top edge is a sum, and a curve fitted through one sum can pass under the curve fitted through the sum beneath it, so a smoothed stack can draw a part as less than nothing between two readings. Straight segments between ordered points stay ordered. 'curve="smooth"' is there for a stack that is read as a shape. **'share' draws each reading as a hundred percent**, so the bands are the parts' shares and the top edge is flat. It answers "which part grew" where the default answers "did the whole grow". **What a reader without the picture is told is the total and the share**, not every band in turn. The table beside the chart already reads out every number; what the drawing adds is the composition, so the summary says the latest reading's total and each part's share of it. The drawing itself is 'aria-hidden'. Every numeric column is a part. A table that carries its own total column would count it twice, so leave it out of the table the chart reads. A negative reading is drawn as none: a part of a whole cannot be less than nothing, and a band that folded under its neighbor would say it was. */
8808
+ "helix-headless-area-chart": DefineCustomElement<
8809
+ HelixHeadlessAreaChart,
8810
+ HelixHeadlessAreaChartVueProps,
8811
+ HelixHeadlessAreaChartVueEvents
8812
+ >;
8175
8813
  /** A part of 'Avatar' rather than a family of its own: it arranges avatars and is about nothing else. **The overflow count is the group's, not a slot.** Which avatars are hidden is a fact the group works out from 'max', so a consumer writing the "+3" would be writing a number that has to agree with a list they do not control. **Hidden, not removed.** Past 'max' the extra avatars stay in the DOM and stop being shown, so nothing re-renders when 'max' changes and the accessible name is still built from all of them. */
8176
8814
  "helix-headless-avatar-group": DefineCustomElement<
8177
8815
  HelixHeadlessAvatarGroup,
@@ -8256,7 +8894,7 @@ export interface WcToolkitVueGlobalComponents {
8256
8894
  HelixHeadlessChatMessageVueProps,
8257
8895
  HelixHeadlessChatMessageVueEvents
8258
8896
  >;
8259
- /** **It has no opinion about where it sits.** A chat is asked for as a floating button, a page, a palette, a sidebar, a modal and an inline block, and none of those is a variant of a conversation: they are containers, and the containers already exist. Nothing here is positioned, nothing has a backdrop, and nothing owns a trigger. If a form factor needs a mode on this element, the split is wrong. **Scroll ownership is the behavior everything else depends on.** A transcript that grows wants to stay at the bottom, except when the reader has scrolled up to read, where pinning is hostile. The rule: pin while the reader is within 'threshold' of the bottom, and let go the moment they leave it. */
8897
+ /** **It has no opinion about where it sits.** A chat is asked for as a floating button, a page, a palette, a sidebar, a modal and an inline block, and none of those is a variant of a conversation: they are containers, and the containers already exist. Nothing here is positioned, nothing has a backdrop, and nothing owns a trigger. If a form factor needs a mode on this element, the split is wrong. **Scroll ownership is the behavior everything else depends on.** A transcript that grows wants to stay at the bottom, except when the reader has scrolled up to read, where pinning is hostile. The rule: pin while the reader is within 'threshold' of the bottom, and let go the moment they leave it. A turn growing under a pinned reader is not the reader leaving, so a streamed answer is followed to its last line. **History loads upward, under a reader who does not move.** With 'history' set to 'more', reaching the top fires 'helix-history'; the consumer sets 'loading' while it fetches and prepends the older turns, and the turn the reader was looking at stays where it was on screen while the room above it grows. **A turn is announced once, when it settles**, and not by the log. A log that is a live region reads what enters it, which is every token of a stream where 'aria-busy' is not honored, every page of history as it loads, and every window of a long transcript as the reader scrolls through it. So the log is 'aria-live="off"', and a status region of its own says each new turn when it has finished arriving: never the reader's own words unless they failed to send, never a turn loaded above the ones already there, and never what was in the transcript when it opened. **Turns are markup children or data, not both.** Children serve whole from a server and are what most conversations want. 'turns' is for the transcript too long to hold as elements: it is drawn a window at a time, measured as it goes, and the log needs a block size of its own for that to mean anything. */
8260
8898
  "helix-headless-chat": DefineCustomElement<
8261
8899
  HelixHeadlessChat,
8262
8900
  HelixHeadlessChatVueProps,
@@ -8274,7 +8912,7 @@ export interface WcToolkitVueGlobalComponents {
8274
8912
  HelixHeadlessCheckboxVueProps,
8275
8913
  HelixHeadlessCheckboxVueEvents
8276
8914
  >;
8277
- /** **'<pre><code>' and nothing cleverer.** The pair is what the platform means by a block of code: 'pre' keeps the whitespace, 'code' says what the whitespace is for, and losing either one loses something no styling puts back. Indentation in a 'div' is a paragraph with odd spacing. **It scrolls rather than wraps.** A wrapped line of code is a lie about where the line ends, and in a language where a line break can be significant it is a lie that costs someone an afternoon. The box takes its own scrollbar. **The copy button is here because the alternative is selecting it by hand.** Every consumer would otherwise put one there, slightly differently, and the one that forgot would be the one with the longest snippet. It is on unless 'no-copy' says otherwise, and takes its text from the slot rather than from a property, so there is no second copy of the code to keep in step. A 'Code' for a fragment inside a sentence. Separate families, because one flows with prose and the other is a figure. */
8915
+ /** **'<pre><code>' and nothing cleverer.** The pair is what the platform means by a block of code: 'pre' keeps the whitespace, 'code' says what the whitespace is for, and losing either one loses something no styling puts back. Indentation in a 'div' is a paragraph with odd spacing. **It scrolls rather than wraps.** A wrapped line of code is a lie about where the line ends, and in a language where a line break can be significant it is a lie that costs someone an afternoon. The box takes its own scrollbar. **The copy button is here because the alternative is selecting it by hand.** Every consumer would otherwise put one there, slightly differently, and the one that forgot would be the one with the longest snippet. It is on unless 'no-copy' says otherwise, and takes its text from the slot rather than from a property, so there is no second copy of the code to keep in step. A 'Code' for a fragment inside a sentence. Separate families, because one flows with prose and the other is a figure. **'diff' reads the code as a change.** The content is then a unified diff, what 'git diff' and 'diff -u' write, in the same slot ordinary code goes in, and it is drawn as the lines it added and removed. The block reads a diff and never computes one, so the algorithm stays wherever the two versions are. Numbers come from the hunk headers, which makes them the file's; changed lines are '<ins>' and '<del>' with the '+' and '-' kept as text, so the change is not carried by color; the numbers are hidden from the accessibility tree. Each file in the patch is a block of its own under its own name, and its copy button takes the file as it now reads. 'variant="split"' sets the old version beside the new, each removal opposite its replacement. **Before the script runs, a diff is its own text.** A server has no children to read, so it renders the slot as ordinary code, which for a diff is the patch in a '<pre>': a legible diff, and the first render the client makes too, which is what keeps hydration clean. The drawn diff replaces it once the content can be read. Diff mode is experimental while the rest of the family is stable. */
8278
8916
  "helix-headless-code-block": DefineCustomElement<
8279
8917
  HelixHeadlessCodeBlock,
8280
8918
  HelixHeadlessCodeBlockVueProps,
@@ -8316,7 +8954,7 @@ export interface WcToolkitVueGlobalComponents {
8316
8954
  HelixHeadlessCopyButtonVueProps,
8317
8955
  HelixHeadlessCopyButtonVueEvents
8318
8956
  >;
8319
- /** **The schema is markup and the data is a property.** Columns are declared as 'helix-table-column' children, because a schema is small and something a reader should see in the HTML; rows are handed over as an array, because a table that draws ten thousand elements cannot window them. '''html <helix-data-table .rows=${rows} sort="name:asc" page-size="20"> <helix-table-column field="name" sortable>Name</helix-table-column> <helix-table-column field="size" align="end" sortable .cell=${bytes}>Size</helix-table-column> </helix-data-table> ''' 'helix-table' takes rows as markup and is the right component for a table of twelve things a person wrote out. **Sort and filter apply to the whole set, never the page.** Sorting the drawn window is correct on the first screen and wrong on every other one. **The cell values do not server-render.** The headings do, and the row elements do, but reading a cell needs the columns, and the columns are markup children Lit SSR does not hand this element. So a crawler sees a table of the right shape with nothing in it. That is the cost of the first paragraph: use 'helix-table' where the served HTML has to carry the values. */
8957
+ /** **The schema is markup and the data is a property.** Columns are declared as 'helix-table-column' children, because a schema is small and something a reader should see in the HTML; rows are handed over as an array, because a table that draws ten thousand elements cannot window them. '''html <helix-data-table .rows=${rows} sort="name:asc" page-size="20"> <helix-table-column field="name" sortable>Name</helix-table-column> <helix-table-column field="size" align="end" sortable .cell=${bytes}>Size</helix-table-column> </helix-data-table> ''' 'helix-table' takes rows as markup and is the right component for a table of twelve things a person wrote out. **Sort and filter apply to the whole set, never the page.** Sorting the drawn window is correct on the first screen and wrong on every other one. **The cell values do not server-render.** The headings do, and the row elements do, but reading a cell needs the columns, and the columns are markup children Lit SSR does not hand this element. So a crawler sees a table of the right shape with nothing in it. That is the cost of the first paragraph: use 'helix-table' where the served HTML has to carry the values. **'selectable' adds a column of checkboxes, keyed on 'row-key'.** A row is selected by its identity rather than its position, so a selection survives a sort, a filter and a page. 'selected' is the chosen keys, comma separated, the shape Listbox uses for a multiple choice, and like 'sort' it is controlled when set and seeded by 'default-selected'. The box in the heading selects every row in the result, across pages, and shows a dash while only some are chosen. Choosing one of many, rather than several, is opening a row, and that is a link or a button in a cell rather than a selection. **A reader can size and order the columns.** 'resizable' on a column puts a separator on its edge; 'reorderable' on the table puts a grip on each heading that has a 'field', moved by dragging or with the arrow keys. The order lands in 'order' as fields, and the consumer's own markup is never rewritten: the table assigns the headings to its header in that order instead. **'csv()' hands back the result as text**: every row the filter lets through, in the order on screen, in the columns on screen. Saving it is the page's business, the same as any other file. */
8320
8958
  "helix-headless-data-table": DefineCustomElement<
8321
8959
  HelixHeadlessDataTable,
8322
8960
  HelixHeadlessDataTableVueProps,
@@ -8334,6 +8972,18 @@ export interface WcToolkitVueGlobalComponents {
8334
8972
  HelixHeadlessDatePickerVueProps,
8335
8973
  HelixHeadlessDatePickerVueEvents
8336
8974
  >;
8975
+ /** An element rather than a pair of slots on the list, because a pair is the unit a reader hears: the label is the '<dt>' and the value its '<dd>', and the two stay together however the list lays them out. The value is the default slot, since it is what varies and is often more than text: a tag, an avatar, a link. The label is text almost every time, so it is also a property. */
8976
+ "helix-headless-description-list-item": DefineCustomElement<
8977
+ HelixHeadlessDescriptionListItem,
8978
+ HelixHeadlessDescriptionListItemVueProps,
8979
+ HelixHeadlessDescriptionListItemVueEvents
8980
+ >;
8981
+ /** "Owner: Ada, Region: us-east, Created: 3 days ago" is the commonest panel in any console, and built from layout primitives it is a run of adjacent text: nothing tells a screen reader that a label and a value belong together, or how many pairs there are. This renders the element the platform has for it, a '<dl>', with each item's label a '<dt>' and its value a '<dd>'. **The items render their own term and description**, and the list takes them through its slot. The accessibility tree is built from the flattened tree, so the pairs reach it inside the list rather than beside it. Measured in Chromium's tree rather than assumed, because a list whose semantics stopped at a shadow boundary would look identical on screen: one description list holding term and definition pairs, node for node what a plain '<dl>' with the same content produces, with a slotted label and with an item drawn as 'display: contents' alike. */
8982
+ "helix-headless-description-list": DefineCustomElement<
8983
+ HelixHeadlessDescriptionList,
8984
+ HelixHeadlessDescriptionListVueProps,
8985
+ HelixHeadlessDescriptionListVueEvents
8986
+ >;
8337
8987
  /** A real '<dialog>' opened with 'showModal()', not a div with a role and a hand-built trap. The platform gives four things that are each a day's work to reimplement: the top layer, so the dialog is above everything whatever 'z-index' anyone wrote; a real backdrop; Escape; and inert-behind, so the page underneath is unreachable by pointer, keyboard or virtual cursor. **'open' drives 'showModal()', and every way it can close comes back through 'requestOpen'.** A native dialog closes from three directions: the property, Escape, and a '<form method="dialog">' submit. Left alone, two of them would shut the dialog while the consumer's state still said open, which is the bug that makes a modal impossible to reopen. */
8338
8988
  "helix-headless-dialog": DefineCustomElement<
8339
8989
  HelixHeadlessDialog,
@@ -8382,7 +9032,31 @@ export interface WcToolkitVueGlobalComponents {
8382
9032
  HelixHeadlessFileInputVueProps,
8383
9033
  HelixHeadlessFileInputVueEvents
8384
9034
  >;
8385
- /** **The tokens are the consumer's own elements, slotted.** What a filter narrows by belongs to the consumer's model rather than to this element: a facet with a prefix, a saved query, a range. So they are slotted rather than rendered from a list of strings, and removing one is a request this element makes rather than a change it applies. Combobox is the other way round, and that is the difference between the two: its tokens are a view of a selection it owns, drawn from options it was handed. **'value' is the text being typed, not the tokens**, which is what makes this a field a consumer can listen to. Every keystroke announces 'input' with the text on the element, so a table narrows as the reader types. The tokens need no reporting back, being markup the consumer already holds. Backspace on an empty field asks the last token to go, through the same 'helix-dismiss' its own remove control fires, so a consumer who handled the pointer has already handled the keyboard. **It can suggest what to type next, and it never learns the grammar.** Slot 'helix-option' elements into 'suggestions' and the field shows them, moves through them with the arrows, and lets Enter press one; the option fires its own 'helix-select' and the consumer decides what choosing meant. Deciding *what* to suggest is theirs too: keys before a colon and values after it are the same panel with different contents, which is all a two-level filter is, and the parse that tells them apart belongs where the domain does. **The panel opens when there is something in it and closes when there is not**, rather than on a choice. A reader who picks a key wants its values next, and closing on the choice would shut the panel between two renders. Use 'selectionStart' and 'setSelectionRange' to write a completion back and put the caret after it, or the next parse reads the wrong term. **Three things here have three different owners, and only one of them is a controlled property.** 'value' is the text, and it is uncontrolled by default: the reader types, the element applies it, and 'input' says so. **Writing 'value' does not take that over.** It is a seed and a correction, so a consumer who sets it and then expects the field to hold still will watch the next keystroke overwrite them. Ownership is taken by refusing 'helix-before-change' and writing the value you want, which is the same shape every field in this library uses and is worth saying out loud here because the property looks like React's. 'default-value' seeds the field without claiming anything. 'open' is the suggestions panel, and it is the ordinary controlled pair: refuse 'helix-before-open' or 'helix-before-close' to take the decision, and 'default-open' to seed it. The tokens are neither, because they are not state. They are the consumer's own elements in a slot, so there is nothing for this to own and nothing to report back: a token goes when the consumer removes it from their markup, having been asked by 'helix-dismiss'. */
9035
+ /** A chip is the readable form of the thing 'FilterField' declares. It carries the three parts a filter has and a control that asks for it to go. **The operator is drawn only when it is worth drawing**, which is the whole reason the common case reads as plainly as it does: ''' Disposition refunded, chargeback the field's usual comparison, unwritten Disposition is not refunded a comparison somebody chose, so it shows Created after 1 Aug a scalar, which has no usual comparison ''' A reader ticking two values in a menu gets the first, with no jargon on it. A reader who reaches for a comparison gets the third, which explains itself the first time they see one. The rule is one line: **omit 'operator-label' for the field's default operator and pass it for every other.** Whoever builds the chip holds the field, and the field knows which its default is. **It shows a filter and never applies one.** Dismissing is a request, the way it is on 'Tag' and 'Announcement': the chip is the consumer's element in a consumer's list, and taking it out from under them would put their model and the document out of step. 'preventDefault()' on the 'helix-dismiss' is a refusal, and that is also how a consumer takes control of the interaction for one press: 'requestChange' documents the whole pattern, and its first line is that control is an action rather than a mode. **Changing the comparison belongs to whatever is slotted into 'operator'.** A menu trigger there makes the segment a control; the text fallback makes it a label. This element does not learn either, for the reason 'FilterOperator' gives: what the words mean is the domain's. */
9036
+ "helix-headless-filter-chip": DefineCustomElement<
9037
+ HelixHeadlessFilterChip,
9038
+ HelixHeadlessFilterChipVueProps,
9039
+ HelixHeadlessFilterChipVueEvents
9040
+ >;
9041
+ /** **A declaration, not a control.** It renders nothing and is never seen. A consumer writes one per field, with the comparisons that field supports and the values it supports them on, and the filter input reads them to build its menu: '''html <helix-headless-filter-field name="disposition" label="Disposition"> <helix-headless-filter-operator name="any" label="is any of" default> </helix-headless-filter-operator> <helix-headless-filter-operator name="none" label="is none of"> </helix-headless-filter-operator> <helix-headless-option value="refunded">Refunded</helix-headless-option> </helix-headless-filter-field> ''' **Operators are per field and never global.** 'is after' belongs to a date and 'has all of' to a set, and a field that supports one comparison shows no chooser at all. A global list would offer every field every word and leave the component deciding which of them made sense, which is the domain question it declines to answer. **A field that declares none gets two, and they are the ones the punctuation can say.** 'is any of' and 'is none of' are what 'field:a,b' and '-field:a,b' mean, so declaring them was ceremony for the case every product has; the example above is what a consumer writes when the words matter, not the price of admission. Declaring one comparison replaces both rather than joining them — see 'vocabulary', which is where that is decided once for the menu and the grammar together. **Values are 'Option's, which is the element a consumer already has.** They carry a value, a label and a disabled state, and a picker built on 'Menu' or 'Listbox' can render them without this element inventing a second way to say the same thing. A field whose values cannot be enumerated declares none, and what fills a chip then is whatever the consumer types. */
9042
+ "helix-headless-filter-field": DefineCustomElement<
9043
+ HelixHeadlessFilterField,
9044
+ HelixHeadlessFilterFieldVueProps,
9045
+ HelixHeadlessFilterFieldVueEvents
9046
+ >;
9047
+ /** **It reads the declarations and renders a menu.** A consumer writes their fields as 'FilterField's inside this, and what comes out is a two level menu: the fields, and under each one its comparisons and its values. Nothing here knows what a field means, which is the line 'FilterField' already draws. '''html <helix-headless-filter-menu label="Filter"> <helix-headless-filter-field name="disposition" label="Disposition"> <helix-headless-option value="refunded">Refunded</helix-headless-option> </helix-headless-filter-field> </helix-headless-filter-menu> ''' That field declares no comparisons and so is offered 'is any of' and 'is none of', which are the two the typed grammar can say. The menu and the text end up offering the same filters because both read 'FilterField.vocabulary', and a consumer whose field needs other words declares them there. **A tick is a filter, immediately.** There is no Apply: ticking a value announces the field's whole set as it now stands, so a queue narrows as the reader works rather than after they have finished. Unticking the last value announces an empty set, which is a consumer's cue to drop the chip. **The operator is chosen here and written nowhere else.** 'helix-facet' carries 'operatorLabel' empty when the comparison is the field's default, which is exactly what a chip's 'operator-label' wants: the segment appears only where somebody picked something worth noticing. Deciding it here is the point, since this is the only thing that has read both the field and its operators. **How many values a comparison takes decides what is under it.** A field whose comparison is 'arity="none"', 'is empty' or 'is set', is offered no values at all and gives back any that were ticked: the comparison is the whole filter. One at 'arity="one"' offers its values as a single choice, so pressing another replaces it and pressing the one already on clears it. Both announce 'arity' in the facet, which is what lets a consumer tell an empty filter from no filter at all. **It applies nothing.** The chips are the consumer's markup and the rows are their data, so this announces and stops, the way 'Notification' reports a read rather than inventing one. Refusing 'helix-facet' refuses the change. */
9048
+ "helix-headless-filter-menu": DefineCustomElement<
9049
+ HelixHeadlessFilterMenu,
9050
+ HelixHeadlessFilterMenuVueProps,
9051
+ HelixHeadlessFilterMenuVueEvents
9052
+ >;
9053
+ /** **A declaration, not a control.** It renders nothing and is never seen: it is how a consumer says which comparisons their field supports, in markup, beside the values it supports them on. 'Field' reads them; the chip shows the one in force; the menu offers the rest. **The vocabulary is the consumer's and this element never learns it.** What 'is none of' means against a queue of refunds is a question about refunds, so nothing here compares anything or knows what 'name' will be handed to. Helix owns the shape a filter has, which is a field, an operator and some values, and owns the interaction that builds one. What the words mean is the domain's, which is the same line 'FilterInput' already draws when it declines to learn a grammar. **'default' is what makes a chip readable.** The operator a field is usually filtered by is the one nobody needs told, so a chip drawn with it says only the field and the values. Naming a second operator 'default' on one field is a consumer bug and the field reports it rather than guessing. */
9054
+ "helix-headless-filter-operator": DefineCustomElement<
9055
+ HelixHeadlessFilterOperator,
9056
+ HelixHeadlessFilterOperatorVueProps,
9057
+ HelixHeadlessFilterOperatorVueEvents
9058
+ >;
9059
+ /** **The tokens are the consumer's own elements, slotted.** What a filter narrows by belongs to the consumer's model rather than to this element: a facet with a prefix, a saved query, a range. So they are slotted rather than rendered from a list of strings, and removing one is a request this element makes rather than a change it applies. Combobox is the other way round, and that is the difference between the two: its tokens are a view of a selection it owns, drawn from options it was handed. **'value' is the text being typed, not the tokens**, which is what makes this a field a consumer can listen to. Every keystroke announces 'input' with the text on the element, so a table narrows as the reader types. The tokens need no reporting back, being markup the consumer already holds. Backspace on an empty field asks the last token to go, through the same 'helix-dismiss' its own remove control fires, so a consumer who handled the pointer has already handled the keyboard. **It reads what was declared, and nothing that was not.** Write 'FilterField's — usually inside the 'FilterMenu' slotted into 'start', so the picker and the text work off one set — and Enter reads the box against them: 'disposition:refunded,settled' and '-disposition:refunded' announce 'helix-facet', exactly as ticking those values in the picker would, and the text they were read from goes. Everything else stays where it was typed, so 'refund tuesday disposition:settled' is a filter and a search at once. 'grammar.ts' carries the whole rule and is worth reading before relying on it; the short version is that Helix owns the punctuation and the consumer owns every word in it. A field with no 'FilterField' in it parses nothing, which is the behavior this had before it could. **A field whose values cannot be listed belongs here rather than in the picker.** 'assignee:ada' is a filter and nobody wants to enumerate every name in the company, but a menu page for it would have nothing on it to press. Written directly inside this element it is read by the grammar and never offered as a page: unslotted, so nothing draws it, which is the same trick 'FilterField' already plays on its own children. **It can suggest what to type next, and deciding what to suggest is still the consumer's.** Slot 'helix-option' elements into 'suggestions' and the field shows them, moves through them with the arrows, and lets Enter press one; the option fires its own 'helix-select' and the consumer decides what choosing meant. Keys before a colon and values after it are the same panel with different contents, and 'readFilterText' is exported for a consumer narrowing that panel against what a reader has half typed. **The panel opens when there is something in it and closes when there is not**, rather than on a choice. A reader who picks a key wants its values next, and closing on the choice would shut the panel between two renders. Use 'selectionStart' and 'setSelectionRange' to write a completion back and put the caret after it, or the next parse reads the wrong term. **Three things here have three different owners, and only one of them is a controlled property.** 'value' is the text, and it is uncontrolled by default: the reader types, the element applies it, and 'input' says so. **Writing 'value' does not take that over.** It is a seed and a correction, so a consumer who sets it and then expects the field to hold still will watch the next keystroke overwrite them. Ownership is taken by refusing 'helix-before-change' and writing the value you want, which is the same shape every field in this library uses and is worth saying out loud here because the property looks like React's. 'default-value' seeds the field without claiming anything. 'open' is the suggestions panel, and it is the ordinary controlled pair: refuse 'helix-before-open' or 'helix-before-close' to take the decision, and 'default-open' to seed it. The tokens are neither, because they are not state. They are the consumer's own elements in a slot, so there is nothing for this to own and nothing to report back: a token goes when the consumer removes it from their markup, having been asked by 'helix-dismiss'. **A 'FilterChip' naming a declared field is asked differently**, and it has to be: the picker holds what is ticked, so a chip that removed itself without telling it left the value ticked in a list nobody could see was wrong. That dismissal is answered as the field being filtered by nothing, so it arrives as 'helix-facet' like every other change and the chip goes because the filter went. */
8386
9060
  "helix-headless-filter-input": DefineCustomElement<
8387
9061
  HelixHeadlessFilterInput,
8388
9062
  HelixHeadlessFilterInputVueProps,
@@ -8436,7 +9110,7 @@ export interface WcToolkitVueGlobalComponents {
8436
9110
  HelixHeadlessLegendVueProps,
8437
9111
  HelixHeadlessLegendVueEvents
8438
9112
  >;
8439
- /** The chart for a shape rather than for a quantity, which is what decides the one thing a bar chart is not allowed to do. **It measures from its own range and not from zero, deliberately.** 'BarChart' refuses that switch because a bar's length *is* its value, so a baseline anywhere else makes the lengths proportional to nothing. A line claims no such thing: it says where the readings went, and forcing zero into the range of a series that moves between 980 and 1020 flattens the entire shape into a rule across the top of the box. The two rules are opposite because the two charts answer opposite questions, and 'zero' is here for the case where the distance from nothing is the point. **One scale across every series**, the same as the bar chart, because two series drawn to different scales are two charts sharing a picture. **The labels are HTML beside the drawing rather than '<text>' inside it**, for the reason 'BarChart' records: an '<svg>' that fills its box scales its type with everything else, the same 'font-size' arriving at 10px in a narrow chart and 43px in a wide one, and there is no non-scaling-font to answer it the way 'vector-effect' answers strokes. The table is the accessible representation and this drawing is 'aria-hidden'. A reader who wants the numbers gets the numbers, not a described picture. */
9113
+ /** The chart for a shape rather than for a quantity, which is what decides the one thing a bar chart is not allowed to do. **It measures from its own range and not from zero, deliberately.** 'BarChart' refuses that switch because a bar's length *is* its value, so a baseline anywhere else makes the lengths proportional to nothing. A line claims no such thing: it says where the readings went, and forcing zero into the range of a series that moves between 980 and 1020 flattens the entire shape into a rule across the top of the box. The two rules are opposite because the two charts answer opposite questions, and 'zero' is here for the case where the distance from nothing is the point. **One scale across every series**, the same as the bar chart, because two series drawn to different scales are two charts sharing a picture. **Not the chart for a total made of parts.** 'area' washes each series from the floor on its own, so they overlap; 'Area Chart' stacks them, so the top edge is the total and each band is a share. A line chart answers how each series moved, an area chart how the whole is made up. **The labels are HTML beside the drawing rather than '<text>' inside it**, for the reason 'BarChart' records: an '<svg>' that fills its box scales its type with everything else, the same 'font-size' arriving at 10px in a narrow chart and 43px in a wide one, and there is no non-scaling-font to answer it the way 'vector-effect' answers strokes. The table is the accessible representation and this drawing is 'aria-hidden'. A reader who wants the numbers gets the numbers, not a described picture. */
8440
9114
  "helix-headless-line-chart": DefineCustomElement<
8441
9115
  HelixHeadlessLineChart,
8442
9116
  HelixHeadlessLineChartVueProps,
@@ -8472,7 +9146,7 @@ export interface WcToolkitVueGlobalComponents {
8472
9146
  HelixHeadlessMegamenuVueProps,
8473
9147
  HelixHeadlessMegamenuVueEvents
8474
9148
  >;
8475
- /** Three shapes, one element, because a reader moving down a menu with the arrow keys does not care which kind each row is and neither should the markup. What it is follows from what it was given: something slotted into 'submenu' makes it a way in, 'checked' makes it a choice, and neither makes it a command. **The role follows the shape.** A row that can be ticked is 'menuitemcheckbox' and carries 'aria-checked', because a reader is told "one of these is on" rather than "here is a button". A row that opens a page keeps 'menuitem' and says 'aria-haspopup', since the page it opens is a menu. Whether it is on the page showing is set by the menu as a property, never as an attribute: an attribute written onto a consumer's element after it upgrades is a hydration mismatch waiting to happen. */
9149
+ /** Three shapes, one element, because a reader moving down a menu with the arrow keys does not care which kind each row is and neither should the markup. What it is follows from what it was given: something slotted into 'submenu' makes it a way in, 'checked' makes it a choice, and neither makes it a command. **The role follows the shape.** A row that can be ticked is 'menuitemcheckbox' and carries 'aria-checked', because a reader is told "one of these is on" rather than "here is a button"; 'exclusive' makes it 'menuitemradio', for a set where only one can be. A row that opens a page keeps 'menuitem' and says 'aria-haspopup', since the page it opens is a menu. Whether it is on the page showing is set by the menu as a property, never as an attribute: an attribute written onto a consumer's element after it upgrades is a hydration mismatch waiting to happen. */
8476
9150
  "helix-headless-menu-item": DefineCustomElement<
8477
9151
  HelixHeadlessMenuItem,
8478
9152
  HelixHeadlessMenuItemVueProps,
@@ -8496,6 +9170,12 @@ export interface WcToolkitVueGlobalComponents {
8496
9170
  HelixHeadlessNavigationVueProps,
8497
9171
  HelixHeadlessNavigationVueEvents
8498
9172
  >;
9173
+ /** **What groups with what is the consumer's, and this never guesses.** A feed can be cut by day, by the thing being talked about, by the person doing the talking, or by nothing at all, and which of those is right is a question about the product. So a group is written by hand around the rows that belong together and told what to call itself, exactly as 'FilterField' is told what its operators are. **Collapsed shows the first row and assigns the rest nowhere.** Not 'hidden', not 'inert', not a stylesheet: the slot is assigned imperatively, so a collapsed group's later rows are absent from the layout and from the accessibility tree with no CSS at all, which is what the headless tier claims for itself. 'Notifications' already assigns its list this way and this borrows the mechanism. The count is separate from how many rows are written, because it usually is: a group saying five with one row under it and a link to the rest is the common shape, and computing the number from the children would make that unsayable. Left off, it is the number of rows. */
9174
+ "helix-headless-notification-group": DefineCustomElement<
9175
+ HelixHeadlessNotificationGroup,
9176
+ HelixHeadlessNotificationGroupVueProps,
9177
+ HelixHeadlessNotificationGroupVueEvents
9178
+ >;
8499
9179
  /** A notification is a toast that did not go away. 'helix-toast' is deliberately the opposite of this: a live region whose items carry a 'duration' and whose root never creates or destroys anything. What makes this its own family is the state each item carries rather than the arrangement it sits in: read and unread, a timestamp that has to stay correct, and an action a reader can take later. **The row is a label, a caption under it, and one trailing column that holds either the time or the controls.** A feed is scanned rather than read, so the thing that happened gets the first line on its own and everything qualifying it goes under. The time and the controls occupy the same place because a reader wants exactly one of them at a time: the time while they are scanning, and what they can do about it once they have stopped on a row. **The timestamp is 'helix-format-date'**, which is where the reading, the '<time datetime>' and the shared timer now live. It was implemented here, and a component that formats a date is not a fact about notifications: Chat wanted the same thing and had its own copy of half of it. **Read state is reported, not invented.** Marking something read is usually a round trip, and a component that flips its own state and then hears the request failed has told the reader something untrue. 'helix-read' is cancelable, and a 'read' set by the consumer makes this element defer entirely. */
8500
9180
  "helix-headless-notification": DefineCustomElement<
8501
9181
  HelixHeadlessNotification,
@@ -8514,6 +9194,12 @@ export interface WcToolkitVueGlobalComponents {
8514
9194
  HelixHeadlessNumberInputVueProps,
8515
9195
  HelixHeadlessNumberInputVueEvents
8516
9196
  >;
9197
+ /** What a developer-facing product shows constantly is a structured value: an API response, a config, a row's raw record. As text in a code block, a reader scrolls a wall of JSON and cannot put away the branch they do not care about; as a Tree, every node is a label and a string reads the same as a number. This reads the value and draws each entry with its type visible. **It reads and never edits.** An inspector that edits is a different component, with validation, undo and a model of what changed, and the reading one is what is wanted. **The data is text in the page or a property.** 'for' names a '<script type="application/json">' by id, the channel 'VirtualList' and the charts already read: it survives a server, which has attributes and no children, and React's hydration, which skips object properties. 'value' is there for a page that already holds the object, and wins when both are set. **One tab stop, and the rows are reached with the arrow keys**, the tree pattern: Up and Down move, Right opens a branch or enters it, Left closes it or goes to its parent, Home and End go to the ends. The tree keeps focus and points at the active row with 'aria-activedescendant', which is what lets a windowed tree drop rows from the page without dropping focus with them. Each row carries its real level, position and set size, so a reader on a windowed row hears where it is in the value rather than in the slice drawn. **Copying takes the active row**, as JSON for a branch and as itself for a string, from the copy button or from Command or Control with C while the tree has focus and nothing is selected. The button sits beside the tree rather than in each row, where a button would be an interactive control inside a tree item, which assistive technology cannot reach reliably. **'windowed' draws only the rows in view**, for a value of thousands of entries, through the same controller 'VirtualList' and 'DataTable' use. The box has to have a height for that to mean anything, which the styled tier gives it and a headless consumer has to. */
9198
+ "helix-headless-object-inspector": DefineCustomElement<
9199
+ HelixHeadlessObjectInspector,
9200
+ HelixHeadlessObjectInspectorVueProps,
9201
+ HelixHeadlessObjectInspectorVueEvents
9202
+ >;
8517
9203
  /** A heading over a set, and nothing else: it holds no selection and no value, because grouping is presentation over a list whose owner is the listbox. Its options are still the listbox's options, which is what keeps the keyboard moving through a grouped list exactly as it moves through a flat one. 'role="group"' named by the heading, so a screen reader announces which run an option is in without the heading becoming something to land on. */
8518
9204
  "helix-headless-option-group": DefineCustomElement<
8519
9205
  HelixHeadlessOptionGroup,
@@ -8598,6 +9284,12 @@ export interface WcToolkitVueGlobalComponents {
8598
9284
  HelixHeadlessRatingVueProps,
8599
9285
  HelixHeadlessRatingVueEvents
8600
9286
  >;
9287
+ /** The chart for a relation rather than a series. The table's first numeric column is measured across and every other numeric column is measured up, one point per row, so a table of countries with a column of income and a column of life expectancy draws one dot for each country. More numeric columns are more series against the same across, each in its own color. **Both axes are measured, so both are labeled.** A line chart's readings are named along the bottom and its values are read from the tooltip; here the horizontal position is itself a value, and a point with no scale under it says nothing about how far along it is. The ticks sit at round numbers and the range is widened to them, so the plot's edges are numbers a reader can name. **What a reader without the picture is told is how strongly the two relate**, because that is the question a scatter is drawn to answer and the one a table of the same numbers makes hardest to see. The summary gives each series' correlation coefficient and how many points it rests on; the table has every number, and the drawing is 'aria-hidden'. **The points are elements, not shapes in the drawing.** The drawing stretches to its box, and a circle in a stretched space is an ellipse, so each point is a '<span>' placed by percentage over it, which is how 'LineChart' draws its termini and for the same reason. */
9288
+ "helix-headless-scatter-chart": DefineCustomElement<
9289
+ HelixHeadlessScatterChart,
9290
+ HelixHeadlessScatterChartVueProps,
9291
+ HelixHeadlessScatterChartVueEvents
9292
+ >;
8601
9293
  /** **The whole component is one fact a stylesheet cannot work out for itself: which edges have content past them.** A fade at the bottom of a list is easy to draw and impossible to decide, because CSS has no reading of scroll position. So this measures and says, in a custom state per edge, and the styled tier draws whatever it likes on the edges named. **States rather than attributes**, so an element that upgrades after a framework rendered its markup does not hand that framework markup it did not write. A stylesheet asks ':host(:state(more-block-end))'. **A scrolling region takes the keyboard when it scrolls, and not before.** A box a reader can only reach with a pointer is a box some readers cannot read at all, which is what 'tabindex' answers here. Only while it overflows: a tab stop on a box with nothing to scroll is a stop that does nothing, and a form full of them is worse than the problem. 'role="region"' only with a 'label', because an unnamed region is an announcement with no content: a screen reader says "region" and the reader has learned nothing they did not already know. */
8602
9294
  "helix-headless-scroll-area": DefineCustomElement<
8603
9295
  HelixHeadlessScrollArea,
@@ -8616,6 +9308,12 @@ export interface WcToolkitVueGlobalComponents {
8616
9308
  HelixHeadlessSkeletonVueProps,
8617
9309
  HelixHeadlessSkeletonVueEvents
8618
9310
  >;
9311
+ /** A keyboard reader arriving on a page tabs through the whole header before reaching anything the page is about, and does it again on the next page. This is the control that skips it: first in the document, and pointed at the content. **It moves focus, not only the scroll position.** An in-page link on its own scrolls to its target and leaves focus behind, so the next Tab goes to whatever followed the link, which is the header it was meant to skip. Pressed, this focuses the target. A target that cannot take focus, which is most of them, since '<main>' cannot, is given 'tabindex="-1"' for as long as it holds focus and has it taken off again when focus leaves, so the page ends up as the consumer wrote it. **The address is left alone.** The press is handled rather than followed, so no '#main' lands in the URL and no history entry is added, which matters to a router reading the hash. The anchor is still a real anchor with a real 'href', so before any script has run the link does what a plain link does: it scrolls there and moves the point the next Tab starts from. **Hidden until focused is the styled tier's**, being a decision about paint, and on this tier the link is simply a link. A headless consumer hides '::part(link)' while the host is not ':focus-within' and shows it when it is. Hiding with 'display: none' or 'visibility: hidden' takes it out of the tab order as well, and a skip link nobody can reach is the most common way one is broken. */
9312
+ "helix-headless-skip-link": DefineCustomElement<
9313
+ HelixHeadlessSkipLink,
9314
+ HelixHeadlessSkipLinkVueProps,
9315
+ HelixHeadlessSkipLinkVueEvents
9316
+ >;
8619
9317
  /** A real '<input type="range">', so the drag, the arrow keys, Home and End, the page keys and the touch target are the platform's. The last is the one nobody notices: a native range has a hit area larger than its thumb, sized by the platform for a finger. **The value is a string, like every other form control's.** A range submits text and 'MixinControllerValue' holds text, so the number is a reading of the value. 'valueAsNumber' is there for arithmetic. **Marks are drawn rather than left to '<datalist>'**, whose ticks cannot be styled and which Firefox does not render for a range at all. A mark is decoration; what a reader can land on is 'step', which the input enforces whether or not anything is drawn. 'markers' is a count rather than a flag, so a slider from zero to a hundred cannot silently ask for a hundred and one. **A range is two of them.** There is no native two-thumb range, so two are stacked on one track and each thumb keeps its own. */
8620
9318
  "helix-headless-slider": DefineCustomElement<
8621
9319
  HelixHeadlessSlider,
@@ -8682,7 +9380,7 @@ export interface WcToolkitVueGlobalComponents {
8682
9380
  HelixHeadlessTableCellVueProps,
8683
9381
  HelixHeadlessTableCellVueEvents
8684
9382
  >;
8685
- /** **The column is the source of both its heading and its track.** Add one and the table has another track; remove one and it does not. Declaring the widths separately, as a CSS track list on the table, leaves nothing tying the two together: a table with three headings and a two-track list renders without complaint, and a track list that is accidentally the headings is invalid CSS the grid silently ignores, collapsing the whole table into one column. **It is also where every per-column fact goes**, which is the reason 'helix-data-table' needs no column config object. 'field' names the key the cell reads, 'sortable' says a reader may reorder by it, 'align' says which edge the values line up against, and 'cell' takes a function for anything the field alone cannot express. The schema is markup and the data is a property: a schema is small, declarative, and something a reader should be able to see in the HTML, and data is large and windowed. **The same element serves both tables**, the markup one and the data one. It is identified by a flag rather than by 'instanceof', so a 'helix-table-column' works inside either without the two roots sharing anything else. **It generates no box of its own**, the same as a row: the heading is a grid item of the table, so it lines up with the cells under it rather than sitting in a wrapper that has to be kept the same width. */
9383
+ /** **The column is the source of both its heading and its track.** Add one and the table has another track; remove one and it does not. Declaring the widths separately, as a CSS track list on the table, leaves nothing tying the two together: a table with three headings and a two-track list renders without complaint, and a track list that is accidentally the headings is invalid CSS the grid silently ignores, collapsing the whole table into one column. **It is also where every per-column fact goes**, which is the reason 'helix-data-table' needs no column config object. 'field' names the key the cell reads, 'sortable' says a reader may reorder by it, 'align' says which edge the values line up against, and 'cell' takes a function for anything the field alone cannot express. The schema is markup and the data is a property: a schema is small, declarative, and something a reader should be able to see in the HTML, and data is large and windowed. **The same element serves both tables**, the markup one and the data one. It is identified by a flag rather than by 'instanceof', so a 'helix-table-column' works inside either without the two roots sharing anything else. **It generates no box of its own**, the same as a row: the heading is a grid item of the table, so it lines up with the cells under it rather than sitting in a wrapper that has to be kept the same width. **A heading that does something holds a control that does it.** The host is the column header, and a header is not focusable, so a sortable heading is a '<button>' inside it: the pattern for a sortable table, and the only way a reader on a keyboard reaches the sort at all. A column a reader may resize carries a 'separator' on its end edge, moved by dragging it or with the arrow keys, and a column in a table that lets a reader reorder its columns carries a grip the table moves. */
8686
9384
  "helix-headless-table-column": DefineCustomElement<
8687
9385
  HelixHeadlessTableColumn,
8688
9386
  HelixHeadlessTableColumnVueProps,
@@ -8802,7 +9500,7 @@ export interface WcToolkitVueGlobalComponents {
8802
9500
  HelixHeadlessTourStopVueProps,
8803
9501
  HelixHeadlessTourStopVueEvents
8804
9502
  >;
8805
- /** **'open', on 'MixinControllerOpen', rather than a bare boolean of its own.** A branch showing its children is the same state a disclosure holds. A hand-written toggle announces nothing, so a consumer could neither know a branch opened nor own the state. 'aria-expanded' is still what the row renders: the property differs, not the semantics. An element rather than a slot, because it owns state: whether it is open, selected, and whether it holds focus. A branch is any item with something slotted into 'children', detected in 'firstUpdated' because the server cannot inspect children. The server renders the node as a leaf and the twisty appears on hydration, which is the harmless direction. **'href' makes the row itself the link.** With the anchor slotted into the name instead, everything outside the words is dead: no Enter, no middle click, no status bar. Given an 'href' the row *is* an '<a>'. */
9503
+ /** **'open', on 'MixinControllerOpen', rather than a bare boolean of its own.** A branch showing its children is the same state a disclosure holds. A hand-written toggle announces nothing, so a consumer could neither know a branch opened nor own the state. 'aria-expanded' is still what the row renders: the property differs, not the semantics. An element rather than a slot, because it owns state: whether it is open, selected, and whether it holds focus. A branch is any item with something slotted into 'children', detected on the client because the server cannot inspect children. The server renders the node as a leaf and the twisty appears on hydration, which is the harmless direction. **'href' makes the row itself the link.** With the anchor slotted into the name instead, everything outside the words is dead: no Enter, no middle click, no status bar. Given an 'href' the row *is* an '<a>'. */
8806
9504
  "helix-headless-tree-item": DefineCustomElement<
8807
9505
  HelixHeadlessTreeItem,
8808
9506
  HelixHeadlessTreeItemVueProps,