@fusion.dev/helix-headless 0.217.0 → 0.219.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 (74) hide show
  1. package/api.json +1 -1
  2. package/custom-elements.json +1 -1
  3. package/dist/breadcrumbs/breadcrumb/breadcrumb.d.ts +13 -2
  4. package/dist/breadcrumbs/breadcrumb/breadcrumb.js +19 -9
  5. package/dist/breadcrumbs/root/breadcrumbs-root.d.ts +16 -1
  6. package/dist/breadcrumbs/root/breadcrumbs-root.js +6 -0
  7. package/dist/button/root/button-root.d.ts +33 -0
  8. package/dist/button/root/button-root.js +13 -3
  9. package/dist/canvas/root/canvas-root.d.ts +11 -0
  10. package/dist/canvas/root/canvas-root.js +1 -0
  11. package/dist/chat/composer/chat-composer.d.ts +221 -6
  12. package/dist/chat/composer/chat-composer.js +249 -19
  13. package/dist/chat/message/chat-message.d.ts +7 -0
  14. package/dist/chat/message/chat-message.js +2 -1
  15. package/dist/chat/root/chat-root.d.ts +1 -0
  16. package/dist/chat/root/chat-root.js +1 -1
  17. package/dist/copy-button/root/copy-button-root.js +3 -3
  18. package/dist/device-screen/root/device-screen-root.d.ts +11 -0
  19. package/dist/device-screen/root/device-screen-root.js +22 -10
  20. package/dist/dialog/root/dialog-root.js +6 -1
  21. package/dist/drilldown/item/drilldown-item.js +1 -1
  22. package/dist/element-events.generated.js +1 -0
  23. package/dist/filter-input/root/filter-input-root.d.ts +4 -3
  24. package/dist/filter-input/root/filter-input-root.js +1 -20
  25. package/dist/graph/root/graph-root.d.ts +11 -0
  26. package/dist/graph/root/graph-root.js +4 -1
  27. package/dist/input/root/input-root.d.ts +6 -0
  28. package/dist/input/root/input-root.js +7 -0
  29. package/dist/lightbox/root/lightbox-root.d.ts +4 -1
  30. package/dist/lightbox/root/lightbox-root.js +10 -8
  31. package/dist/listbox/root/listbox-root.d.ts +21 -0
  32. package/dist/listbox/root/listbox-root.js +37 -2
  33. package/dist/log/group/log-group.d.ts +7 -1
  34. package/dist/log/group/log-group.js +14 -1
  35. package/dist/log/root/log-root.d.ts +13 -3
  36. package/dist/log/root/log-root.js +5 -2
  37. package/dist/map/root/map-root.d.ts +11 -0
  38. package/dist/map/root/map-root.js +28 -12
  39. package/dist/menu/root/menu-root.d.ts +8 -0
  40. package/dist/menu/root/menu-root.js +22 -1
  41. package/dist/menu/section/menu-section.d.ts +10 -0
  42. package/dist/menu/section/menu-section.js +10 -0
  43. package/dist/meter/index.d.ts +1 -0
  44. package/dist/meter/index.js +1 -0
  45. package/dist/meter/root/meter-root.d.ts +16 -1
  46. package/dist/meter/root/meter-root.js +27 -11
  47. package/dist/meter/segment/meter-segment.d.ts +74 -0
  48. package/dist/meter/segment/meter-segment.js +47 -0
  49. package/dist/scroll-area/root/scroll-area-root.d.ts +20 -3
  50. package/dist/scroll-area/root/scroll-area-root.js +23 -4
  51. package/dist/spatial-bar-chart/bars.d.ts +125 -5
  52. package/dist/spatial-bar-chart/bars.js +194 -17
  53. package/dist/spatial-bar-chart/root/spatial-bar-chart-root.d.ts +148 -6
  54. package/dist/spatial-bar-chart/root/spatial-bar-chart-root.js +285 -16
  55. package/dist/splitter/root/splitter-root.js +1 -0
  56. package/dist/tabs/root/tabs-root.d.ts +4 -0
  57. package/dist/tabs/tab/tab.d.ts +1 -0
  58. package/dist/tabs/tab/tab.js +2 -2
  59. package/dist/tag/root/tag-root.d.ts +1 -1
  60. package/dist/terminal/root/terminal-root.d.ts +11 -0
  61. package/dist/terminal/root/terminal-root.js +23 -10
  62. package/dist/toolbar/root/toolbar-root.d.ts +4 -1
  63. package/dist/tooltip/root/tooltip-root.d.ts +23 -1
  64. package/dist/tooltip/root/tooltip-root.js +28 -5
  65. package/dist/tour/root/tour-root.d.ts +1 -0
  66. package/dist/tour/root/tour-root.js +4 -1
  67. package/dist/tour/stop/tour-stop.js +1 -0
  68. package/examples.json +1 -1
  69. package/lint.json +1 -1
  70. package/package.json +5 -5
  71. package/types/jsx.d.ts +1373 -52
  72. package/types/svelte.d.ts +1 -0
  73. package/types/vue.d.ts +312 -17
  74. package/types/words.d.ts +9 -1
package/types/vue.d.ts CHANGED
@@ -137,6 +137,7 @@ import type {
137
137
  HelixHeadlessMenuItem,
138
138
  HelixHeadlessMenuSection,
139
139
  HelixHeadlessMeter,
140
+ HelixHeadlessMeterSegment,
140
141
  HelixHeadlessMotionToggle,
141
142
  HelixHeadlessNavigation,
142
143
  HelixHeadlessNotification,
@@ -256,6 +257,7 @@ import type {
256
257
  HelixShortcutEvent,
257
258
  HelixSortEvent,
258
259
  HelixSortedEvent,
260
+ HelixStopEvent,
259
261
  HelixTerminalBellEvent,
260
262
  HelixTerminalInputEvent,
261
263
  HelixTerminalLinkEvent,
@@ -1371,6 +1373,19 @@ into one, counting the first and the last. Unset, it never folds. At least
1371
1373
  into one, counting the first and the last. Unset, it never folds. At least
1372
1374
  2, so the first crumb and the current page always show. */
1373
1375
  maxItems?: (HelixHeadlessBreadcrumbs["maxItems"]) | undefined;
1376
+ /** The mark between one crumb and the next, for the whole trail. Unset is a
1377
+ chevron; `slash` is a slash, as a path or a repository and its branch is
1378
+ written.
1379
+
1380
+ **On the trail rather than on each crumb**, because the marks are one
1381
+ decision: a trail whose separators differ from crumb to crumb is a
1382
+ mistake, and a trail drawn from `items` has no crumb of yours to set it
1383
+ on. A crumb's own `separator` slot still replaces its mark, for the rare
1384
+ crumb that needs something else.
1385
+
1386
+ Optional and reflected, per the rule that a reflected property takes no
1387
+ default, so a stylesheet can select on it. */
1388
+ separator?: (HelixHeadlessBreadcrumbs["separator"]) | undefined;
1374
1389
  /** The trail as data, drawn as crumbs before any you slot. The last item is the
1375
1390
  current page.
1376
1391
 
@@ -1485,6 +1500,36 @@ is the platform's `commandfor`. */
1485
1500
  commandfor?: (HelixHeadlessButton["commandFor"]) | undefined;
1486
1501
  /** The id of the element the command is sent to. */
1487
1502
  commandFor?: (HelixHeadlessButton["commandFor"]) | undefined;
1503
+ /** Whether a disabled button stays in the tab order, so a tooltip around it
1504
+ can say why it is disabled.
1505
+
1506
+ Set it on a button whose reason a Tooltip gives, such as a Save with no
1507
+ changes to save. While the button is disabled, it keeps focus and takes
1508
+ hover, and it refuses every press: a click, Enter and Space, and Enter in
1509
+ a field of its form. The click does not reach your listeners, and a submit
1510
+ button submits nothing. The inner control carries `aria-disabled` in place
1511
+ of the native `disabled`, so a screen reader still says it is unavailable.
1512
+ The styled button keeps the disabled look.
1513
+
1514
+ Leave it unset on a button with no reason to give. A plain disabled button
1515
+ leaves the tab order, as a native one does, and a keyboard reader skips a
1516
+ stop that does nothing. Set `pending` for the wait after a press. */
1517
+ "focusable-when-disabled"?: (HelixHeadlessButton["focusableWhenDisabled"]) | undefined;
1518
+ /** Whether a disabled button stays in the tab order, so a tooltip around it
1519
+ can say why it is disabled.
1520
+
1521
+ Set it on a button whose reason a Tooltip gives, such as a Save with no
1522
+ changes to save. While the button is disabled, it keeps focus and takes
1523
+ hover, and it refuses every press: a click, Enter and Space, and Enter in
1524
+ a field of its form. The click does not reach your listeners, and a submit
1525
+ button submits nothing. The inner control carries `aria-disabled` in place
1526
+ of the native `disabled`, so a screen reader still says it is unavailable.
1527
+ The styled button keeps the disabled look.
1528
+
1529
+ Leave it unset on a button with no reason to give. A plain disabled button
1530
+ leaves the tab order, as a native one does, and a keyboard reader skips a
1531
+ stop that does nothing. Set `pending` for the wait after a press. */
1532
+ focusableWhenDisabled?: (HelixHeadlessButton["focusableWhenDisabled"]) | undefined;
1488
1533
  /** Where this button's submission goes, overriding the form's own.
1489
1534
 
1490
1535
  **The five `form*` overrides ride on a native submit button that stands in
@@ -2713,11 +2758,26 @@ export type HelixHeadlessChatComposerHelixListenElementEvent =
2713
2758
  /** `helix-send` event type */
2714
2759
  export type HelixHeadlessChatComposerHelixSendElementEvent =
2715
2760
  HelixHeadlessChatComposerElementEvent<HelixSendEvent>;
2761
+ /** `helix-stop` event type */
2762
+ export type HelixHeadlessChatComposerHelixStopElementEvent =
2763
+ HelixHeadlessChatComposerElementEvent<HelixStopEvent>;
2716
2764
  /** `helix-typing` event type */
2717
2765
  export type HelixHeadlessChatComposerHelixTypingElementEvent =
2718
2766
  HelixHeadlessChatComposerElementEvent<HelixTypingEvent>;
2719
2767
 
2720
2768
  export type HelixHeadlessChatComposerVueProps = {
2769
+ /** Whether the draft holds something besides its text, such as an attached
2770
+ file. The draft then counts as one though the field is empty, so the
2771
+ send button shows in place of the `idle` slot. */
2772
+ attached?: (HelixHeadlessChatComposer["attached"]) | undefined;
2773
+ /** Whether a reply is on its way. While set, the send button is a stop
2774
+ button that sends `helix-stop`, and the draft does not send.
2775
+
2776
+ **The same button rather than one beside it**, because sending and
2777
+ stopping are never both possible: while a reply is on its way there is
2778
+ nothing to send to, and the place the reader's eye goes to act is the
2779
+ place that can act. The field stays open for the next turn. */
2780
+ busy?: (HelixHeadlessChatComposer["busy"]) | undefined;
2721
2781
  /** A message about the draft, shown under the field. While set, the composer
2722
2782
  is invalid, does not send, and does not submit, as a field's `feedback`
2723
2783
  does, and the message is announced as it appears. */
@@ -2736,6 +2796,14 @@ the field, as on a `<textarea>`. */
2736
2796
  minLength?: (HelixHeadlessChatComposer["minLength"]) | undefined;
2737
2797
  /** Placeholder text shown in an empty field. */
2738
2798
  placeholder?: (HelixHeadlessChatComposer["placeholder"]) | undefined;
2799
+ /** Whether Enter sends while `busy`, for a page that queues the turn or
2800
+ hands it to the reply under way.
2801
+
2802
+ Off by default, because a page that does neither would drop the turn: it
2803
+ has nowhere to put a message while a reply is coming. The button stays
2804
+ the stop button either way, since stopping is still the one thing it
2805
+ should do while a reply is on its way. */
2806
+ queue?: (HelixHeadlessChatComposer["queue"]) | undefined;
2739
2807
  /** Whether the form needs a draft to submit. An empty draft never sends,
2740
2808
  required or not. */
2741
2809
  required?: (HelixHeadlessChatComposer["required"]) | undefined;
@@ -2743,10 +2811,34 @@ required or not. */
2743
2811
 
2744
2812
  It grows from there. */
2745
2813
  rows?: (HelixHeadlessChatComposer["rows"]) | undefined;
2814
+ /** Whether the draft waits to be sent, such as while an attachment is still
2815
+ read. The send button is unavailable and Enter does not send, while the
2816
+ field stays open. The stop button shown while `busy` still stops. */
2817
+ "send-disabled"?: (HelixHeadlessChatComposer["sendDisabled"]) | undefined;
2818
+ /** Whether the draft waits to be sent, such as while an attachment is still
2819
+ read. The send button is unavailable and Enter does not send, while the
2820
+ field stays open. The stop button shown while `busy` still stops. */
2821
+ sendDisabled?: (HelixHeadlessChatComposer["sendDisabled"]) | undefined;
2746
2822
  /** Label for the send button. */
2747
2823
  "send-label"?: (HelixHeadlessChatComposer["sendLabel"]) | undefined;
2748
2824
  /** Label for the send button. */
2749
2825
  sendLabel?: (HelixHeadlessChatComposer["sendLabel"]) | undefined;
2826
+ /** Why the draft waits, such as "Reading photo.jpg", shown in a tooltip on
2827
+ the send button while `send-disabled` is set. The button then stays in
2828
+ the tab order and takes the pointer, with `aria-disabled` in place of
2829
+ `disabled`, so the reason can be reached by keyboard and by pointer, as
2830
+ Button's `focusable-when-disabled` does. A press still sends nothing. */
2831
+ "send-reason"?: (HelixHeadlessChatComposer["sendReason"]) | undefined;
2832
+ /** Why the draft waits, such as "Reading photo.jpg", shown in a tooltip on
2833
+ the send button while `send-disabled` is set. The button then stays in
2834
+ the tab order and takes the pointer, with `aria-disabled` in place of
2835
+ `disabled`, so the reason can be reached by keyboard and by pointer, as
2836
+ Button's `focusable-when-disabled` does. A press still sends nothing. */
2837
+ sendReason?: (HelixHeadlessChatComposer["sendReason"]) | undefined;
2838
+ /** Label for the stop button shown while `busy`. */
2839
+ "stop-label"?: (HelixHeadlessChatComposer["stopLabel"]) | undefined;
2840
+ /** Label for the stop button shown while `busy`. */
2841
+ stopLabel?: (HelixHeadlessChatComposer["stopLabel"]) | undefined;
2750
2842
  /** What sends the turn: `enter` for the Enter key, or `button` for the send
2751
2843
  button only.
2752
2844
 
@@ -2819,6 +2911,23 @@ imperatively later, and nothing is hydrating by then.
2819
2911
 
2820
2912
  Here rather than on each control. */
2821
2913
  name?: (HelixHeadlessChatComposer["name"]) | undefined;
2914
+ /** Examples the empty field shows in turn, in place of `placeholder`, such
2915
+ as tasks a reader might ask for. Each shows for 6.5 seconds, and a longer
2916
+ one shows longer, up to 10 seconds.
2917
+
2918
+ **Each is the field's placeholder in its turn**, so a screen reader that
2919
+ reaches the field hears the one showing. The swap runs through
2920
+ `:state(example-leaving)`, as one example leaves, and
2921
+ `:state(example-entering)`, as the next arrives.
2922
+
2923
+ **They move only while nobody is about to write, and while the reader
2924
+ can see them.** An empty field without focus moves on. Focus or text
2925
+ holds the example showing, and an example already leaving finishes its
2926
+ turn. A composer scrolled out of view holds its example, and the example
2927
+ gets its full time again when the composer comes back. Where the reader
2928
+ asked for less motion, or the page paused its motion, the first example
2929
+ stays. */
2930
+ placeholders?: (HelixHeadlessChatComposer["placeholders"]) | undefined;
2822
2931
  /** The engine this field listens through, in place of the one
2823
2932
  `registerSpeechEngine` gave the page, or the browser's own. */
2824
2933
  speechEngine?: (HelixHeadlessChatComposer["speechEngine"]) | undefined;
@@ -2831,6 +2940,8 @@ export type HelixHeadlessChatComposerVueEvents = {
2831
2940
  "helix-listen": HelixHeadlessChatComposerHelixListenElementEvent;
2832
2941
  /** Fired when the user sends their turn, and cancelable. */
2833
2942
  "helix-send": HelixHeadlessChatComposerHelixSendElementEvent;
2943
+ /** Fired when the user presses the stop button, shown in place of the send button while `busy` is set. */
2944
+ "helix-stop": HelixHeadlessChatComposerHelixStopElementEvent;
2834
2945
  /** The user started or stopped writing, with `typing` saying which, as the composer's `typing` does. */
2835
2946
  "helix-typing": HelixHeadlessChatComposerHelixTypingElementEvent;
2836
2947
  /** The user changed the text. Read it from `value`, for a typing indicator or a saved draft. Bubbles and is composed, as a native field's is. */
@@ -5330,6 +5441,36 @@ whatever its `type`. Declared here so its own page says what it holds. */
5330
5441
  value?: (HelixHeadlessCopyButton["value"]) | undefined;
5331
5442
  /** */
5332
5443
  "aria-label"?: (string) | undefined;
5444
+ /** Whether a disabled button stays in the tab order, so a tooltip around it
5445
+ can say why it is disabled.
5446
+
5447
+ Set it on a button whose reason a Tooltip gives, such as a Save with no
5448
+ changes to save. While the button is disabled, it keeps focus and takes
5449
+ hover, and it refuses every press: a click, Enter and Space, and Enter in
5450
+ a field of its form. The click does not reach your listeners, and a submit
5451
+ button submits nothing. The inner control carries `aria-disabled` in place
5452
+ of the native `disabled`, so a screen reader still says it is unavailable.
5453
+ The styled button keeps the disabled look.
5454
+
5455
+ Leave it unset on a button with no reason to give. A plain disabled button
5456
+ leaves the tab order, as a native one does, and a keyboard reader skips a
5457
+ stop that does nothing. Set `pending` for the wait after a press. */
5458
+ "focusable-when-disabled"?: (HelixHeadlessCopyButton["focusableWhenDisabled"]) | undefined;
5459
+ /** Whether a disabled button stays in the tab order, so a tooltip around it
5460
+ can say why it is disabled.
5461
+
5462
+ Set it on a button whose reason a Tooltip gives, such as a Save with no
5463
+ changes to save. While the button is disabled, it keeps focus and takes
5464
+ hover, and it refuses every press: a click, Enter and Space, and Enter in
5465
+ a field of its form. The click does not reach your listeners, and a submit
5466
+ button submits nothing. The inner control carries `aria-disabled` in place
5467
+ of the native `disabled`, so a screen reader still says it is unavailable.
5468
+ The styled button keeps the disabled look.
5469
+
5470
+ Leave it unset on a button with no reason to give. A plain disabled button
5471
+ leaves the tab order, as a native one does, and a keyboard reader skips a
5472
+ stop that does nothing. Set `pending` for the wait after a press. */
5473
+ focusableWhenDisabled?: (HelixHeadlessCopyButton["focusableWhenDisabled"]) | undefined;
5333
5474
  /** Whether the action the button started is still running.
5334
5475
 
5335
5476
  A pending button keeps focus and stays in the tab order, and refuses every
@@ -9167,6 +9308,36 @@ is the platform's `commandfor`. */
9167
9308
  commandfor?: (HelixHeadlessIconButton["commandFor"]) | undefined;
9168
9309
  /** The id of the element the command is sent to. */
9169
9310
  commandFor?: (HelixHeadlessIconButton["commandFor"]) | undefined;
9311
+ /** Whether a disabled button stays in the tab order, so a tooltip around it
9312
+ can say why it is disabled.
9313
+
9314
+ Set it on a button whose reason a Tooltip gives, such as a Save with no
9315
+ changes to save. While the button is disabled, it keeps focus and takes
9316
+ hover, and it refuses every press: a click, Enter and Space, and Enter in
9317
+ a field of its form. The click does not reach your listeners, and a submit
9318
+ button submits nothing. The inner control carries `aria-disabled` in place
9319
+ of the native `disabled`, so a screen reader still says it is unavailable.
9320
+ The styled button keeps the disabled look.
9321
+
9322
+ Leave it unset on a button with no reason to give. A plain disabled button
9323
+ leaves the tab order, as a native one does, and a keyboard reader skips a
9324
+ stop that does nothing. Set `pending` for the wait after a press. */
9325
+ "focusable-when-disabled"?: (HelixHeadlessIconButton["focusableWhenDisabled"]) | undefined;
9326
+ /** Whether a disabled button stays in the tab order, so a tooltip around it
9327
+ can say why it is disabled.
9328
+
9329
+ Set it on a button whose reason a Tooltip gives, such as a Save with no
9330
+ changes to save. While the button is disabled, it keeps focus and takes
9331
+ hover, and it refuses every press: a click, Enter and Space, and Enter in
9332
+ a field of its form. The click does not reach your listeners, and a submit
9333
+ button submits nothing. The inner control carries `aria-disabled` in place
9334
+ of the native `disabled`, so a screen reader still says it is unavailable.
9335
+ The styled button keeps the disabled look.
9336
+
9337
+ Leave it unset on a button with no reason to give. A plain disabled button
9338
+ leaves the tab order, as a native one does, and a keyboard reader skips a
9339
+ stop that does nothing. Set `pending` for the wait after a press. */
9340
+ focusableWhenDisabled?: (HelixHeadlessIconButton["focusableWhenDisabled"]) | undefined;
9170
9341
  /** Where this button's submission goes, overriding the form's own.
9171
9342
 
9172
9343
  **The five `form*` overrides ride on a native submit button that stands in
@@ -9522,6 +9693,10 @@ token.
9522
9693
  Empty leaves the attribute off, which is the browser's default. Set it to
9523
9694
  a token like `email` or `bday` to ask for autofill, or to `off` to refuse. */
9524
9695
  autocomplete?: (HelixHeadlessInput["autocomplete"]) | undefined;
9696
+ /** Whether the browser corrects words as the reader types, as the platform's
9697
+ `autocorrect`. Turn it off, with `autocorrect="off"`, for text that is not
9698
+ prose, such as an address or a code, which corrections would change. */
9699
+ autocorrect?: (HelixHeadlessInput["autocorrect"]) | undefined;
9525
9700
  /** Whether the field shows a button that empties it.
9526
9701
 
9527
9702
  Shown only while there is something to clear, because a control that does
@@ -11116,9 +11291,13 @@ stream ends. */
11116
11291
  "dropped-label"?: (HelixHeadlessLog["droppedLabel"]) | undefined;
11117
11292
  /** What the line above the log says once `limit` has let lines go. `{count}` is how many. */
11118
11293
  droppedLabel?: (HelixHeadlessLog["droppedLabel"]) | undefined;
11119
- /** The text shown and announced when the log has no lines. */
11294
+ /** The text shown and announced when the log has no lines and no steps. A
11295
+ step with nothing in it yet, such as one still `pending`, is its heading
11296
+ alone, so a log holding one says nothing. */
11120
11297
  "empty-text"?: (HelixHeadlessLog["emptyText"]) | undefined;
11121
- /** The text shown and announced when the log has no lines. */
11298
+ /** The text shown and announced when the log has no lines and no steps. A
11299
+ step with nothing in it yet, such as one still `pending`, is its heading
11300
+ alone, so a log holding one says nothing. */
11122
11301
  emptyText?: (HelixHeadlessLog["emptyText"]) | undefined;
11123
11302
  /** What a screen reader hears when lines at `error` arrive. `{count}` is how
11124
11303
  many arrived together and `{text}` is the first of them. */
@@ -12641,6 +12820,24 @@ export type HelixHeadlessMeterVueEvents = {
12641
12820
  "helix-band": HelixHeadlessMeterHelixBandElementEvent;
12642
12821
  };
12643
12822
 
12823
+ export type HelixHeadlessMeterSegmentVueProps = {
12824
+ /** What the segment is, such as "Tools", which names the slice when a pointer
12825
+ rests on it.
12826
+
12827
+ Not announced: see the note on a meter's children above. */
12828
+ label?: (HelixHeadlessMeterSegment["label"]) | undefined;
12829
+ /** What the segment means, as it does on a callout. Takes the tone's color in
12830
+ place of the next color in the series. */
12831
+ tone?: (HelixHeadlessMeterSegment["tone"]) | undefined;
12832
+ /** How much of the meter's range the segment takes, in the units of the meter's
12833
+ `min` and `max`.
12834
+
12835
+ A value that is not a number, or is below zero, draws nothing. */
12836
+ value?: (HelixHeadlessMeterSegment["value"]) | undefined;
12837
+ };
12838
+
12839
+ export type HelixHeadlessMeterSegmentVueEvents = {};
12840
+
12644
12841
  /** `HelixHeadlessMotionToggle` component event */
12645
12842
  export type HelixHeadlessMotionToggleElementEvent<E = Event> = TypedEvent<
12646
12843
  HelixHeadlessMotionToggle,
@@ -15819,13 +16016,42 @@ export type HelixHeadlessSpatialBarChartHelixReadingPressElementEvent =
15819
16016
  HelixHeadlessSpatialBarChartElementEvent<HelixReadingPressEvent>;
15820
16017
 
15821
16018
  export type HelixHeadlessSpatialBarChartVueProps = {
15822
- /** Draws no box: no edges, grid, numbers, or names, so the readings stand
15823
- alone and fill the plot, as a picture on a product's own page does. The
16019
+ /** Grows the bars up from the floor the first time the chart comes into
16020
+ view with readings, each category a little after the one before it, so
16021
+ the drawing arrives the way a page's own picture does. The growth is
16022
+ fast at first, slows to rest, and never passes a bar's value.
16023
+
16024
+ Under `prefers-reduced-motion`, or where the page has paused its motion
16025
+ through `pauseMotion` or `Motion Toggle`, the bars stand at their height
16026
+ from the start. A later table draws the bars it already had at their
16027
+ height, and grows the bars it adds, each from the floor, so a reading that
16028
+ arrives while the chart is in view arrives the same way. */
16029
+ grow?: (HelixHeadlessSpatialBarChart["grow"]) | undefined;
16030
+ /** Grows the bars again each time the chart comes back into view after it
16031
+ left it, as a pane does when it is opened again, where `grow` alone grows
16032
+ them the first time only. Only a chart that grows takes it.
16033
+
16034
+ While it is out of view the bars stand at the floor, so the first frame
16035
+ after it returns is the start of the growth and never a flash at full
16036
+ height. */
16037
+ "grow-again"?: (HelixHeadlessSpatialBarChart["growAgain"]) | undefined;
16038
+ /** Grows the bars again each time the chart comes back into view after it
16039
+ left it, as a pane does when it is opened again, where `grow` alone grows
16040
+ them the first time only. Only a chart that grows takes it.
16041
+
16042
+ While it is out of view the bars stand at the floor, so the first frame
16043
+ after it returns is the start of the growth and never a flash at full
16044
+ height. */
16045
+ growAgain?: (HelixHeadlessSpatialBarChart["growAgain"]) | undefined;
16046
+ /** Draws no box: no edges, grid, numbers, or names, and in a `row` no
16047
+ floor, so the readings stand alone and fill the plot, as a picture on a
16048
+ product's own page does. The
15824
16049
  table, the summary, the tooltip, and the keys still carry every value,
15825
16050
  and a renderer draws no box either. */
15826
16051
  "no-box"?: (HelixHeadlessSpatialBarChart["noBox"]) | undefined;
15827
- /** Draws no box: no edges, grid, numbers, or names, so the readings stand
15828
- alone and fill the plot, as a picture on a product's own page does. The
16052
+ /** Draws no box: no edges, grid, numbers, or names, and in a `row` no
16053
+ floor, so the readings stand alone and fill the plot, as a picture on a
16054
+ product's own page does. The
15829
16055
  table, the summary, the tooltip, and the keys still carry every value,
15830
16056
  and a renderer draws no box either. */
15831
16057
  noBox?: (HelixHeadlessSpatialBarChart["noBox"]) | undefined;
@@ -15839,6 +16065,15 @@ and a renderer draws no box either. */
15839
16065
  "plot-label"?: (HelixHeadlessSpatialBarChart["plotLabel"]) | undefined;
15840
16066
  /** The plot's name where the chart has none: no `aria-label`, `label`, or table caption. */
15841
16067
  plotLabel?: (HelixHeadlessSpatialBarChart["plotLabel"]) | undefined;
16068
+ /** Stacks a category's series into one column, each block standing on the
16069
+ ones before it, so the column is as tall as the category's total, as a
16070
+ flat `Bar Chart` stacks them.
16071
+
16072
+ Absent stands the series one behind another in depth. Stacked, every
16073
+ series stands in the front row, so none hides another, and the parts of
16074
+ one total read together. A negative reading hangs below zero on the
16075
+ negatives before it. The scale fits the stacks. */
16076
+ stacked?: (HelixHeadlessSpatialBarChart["stacked"]) | undefined;
15842
16077
  /** The `summary` part's sentence. `{count}`, `{series}`, and `{categories}`
15843
16078
  are the number of bars, series, and categories, written in the locale,
15844
16079
  and `{low}` and `{high}` the lowest and the highest value. */
@@ -15847,6 +16082,38 @@ and `{low}` and `{high}` the lowest and the highest value. */
15847
16082
  are the number of bars, series, and categories, written in the locale,
15848
16083
  and `{low}` and `{high}` the lowest and the highest value. */
15849
16084
  summaryLabel?: (HelixHeadlessSpatialBarChart["summaryLabel"]) | undefined;
16085
+ /** How the bars stand.
16086
+
16087
+ Unset, they stand on a grid of categories across and series in depth,
16088
+ in a box the camera looks at from a corner, so the grid recedes at an
16089
+ angle. `row` lays the categories in a straight line across the page and
16090
+ turns each bar to the camera, showing its top and two sides, for one row
16091
+ of readings in a small space such as a pane: turning the view turns each
16092
+ bar where it stands, and the row stays level. It is the chart's own
16093
+ drawing that lays the row: a renderer connected through
16094
+ `@fusion.dev/helix-plot` stands the bars on the grid.
16095
+
16096
+ `diagonal` is the same row climbing to the right as it recedes, each
16097
+ place a step further back than the one before, as a row of days on a
16098
+ product's page is drawn: the row rises one part in five across the page
16099
+ from any turn, and its floor and names climb with it. A row whose bars
16100
+ have a size climbs at most a quarter of the plot's height, so the bars
16101
+ of a long row keep theirs.
16102
+
16103
+ **A row draws its floor in place of a box**: each place as an outline a
16104
+ little wider than its bar, and each category's name under it, as many
16105
+ names as fit without touching. A name whose bar names a tone is written
16106
+ first, in that tone. `no-box` leaves the floor and the names out.
16107
+
16108
+ **A `column-gap` on the `fallback` part gives a row's bars one width**,
16109
+ which the styled tier sets from `--spatial-bar-chart-bar-size`: one bar
16110
+ stands as wide as each of twenty, the row is as long as its bars and
16111
+ centered, the tallest bar stands as high as the plot has room for and
16112
+ no taller than the row is long and a quarter again, so one bar stands
16113
+ as a block, and `fits` says how many bars the plot holds, so a page
16114
+ can give it the latest of a longer table. It is read when the plot's
16115
+ size changes. */
16116
+ variant?: (HelixHeadlessSpatialBarChart["variant"]) | undefined;
15850
16117
  /** The words shown in place of the drawing when the table has no readings,
15851
16118
  and the fallback of the `empty` slot. */
15852
16119
  "empty-text"?: (HelixHeadlessSpatialBarChart["emptyText"]) | undefined;
@@ -22033,8 +22300,12 @@ export type CustomCssProperties = {
22033
22300
  "--meter-at"?: (string) | undefined;
22034
22301
  /** The value as a fraction of the range, 0 to 1. */
22035
22302
  "--meter-fraction"?: (string) | undefined;
22303
+ /** How much the range holds, `max` less `min`, which a segment divides its own value by to find its width. */
22304
+ "--meter-span"?: (string) | undefined;
22036
22305
  /** How much of the circle the arc covers, as a path length. */
22037
22306
  "--meter-sweep"?: (string) | undefined;
22307
+ /** How much of the range the segment takes, in the meter's own units. */
22308
+ "--meter-segment-value"?: (string) | undefined;
22038
22309
  /** How deep a row is, from 0 at the root, for indenting it. */
22039
22310
  "--object-inspector-level"?: (string) | undefined;
22040
22311
  /** The value as a fraction of the range, 0 to 1. Pinned to 1 while indeterminate. */
@@ -22055,6 +22326,10 @@ export type CustomCssProperties = {
22055
22326
  "--chart-point-y"?: (string) | undefined;
22056
22327
  /** A tick's position along its axis, as a percentage. The component writes it. */
22057
22328
  "--chart-tick"?: (string) | undefined;
22329
+ /** The room the browser's horizontal scrollbar takes at the block end of the viewport, in pixels. Written on the `viewport` part while that scrollbar takes room, and absent while it draws over the content. */
22330
+ "--scroll-area-gutter-block-end"?: (string) | undefined;
22331
+ /** The room the browser's vertical scrollbar takes at the inline end of the viewport, in pixels. Written on the `viewport` part while that scrollbar takes room, and absent while it draws over the content. */
22332
+ "--scroll-area-gutter-inline-end"?: (string) | undefined;
22058
22333
  /** How far along its axis the content is scrolled, from 0 at the start to 1 at the end. Written on each `scrollbar` part, so its thumb inherits it. Counted from the right on a right-to-left page. */
22059
22334
  "--scroll-area-scroll-fraction"?: (string) | undefined;
22060
22335
  /** The share of the track the thumb covers, from 0 to 1, which is how much of the content is in view. Written on each `scrollbar` part. */
@@ -22069,8 +22344,22 @@ export type CustomCssProperties = {
22069
22344
  "--slider-marker-at"?: (string) | undefined;
22070
22345
  /** Where the filled span ends, as a fraction of the track, 0 to 1: a range's upper thumb, or the farther of a single thumb and its `origin`. */
22071
22346
  "--slider-to"?: (string) | undefined;
22072
- /** How far a bar's face turns from the light, from 0 for its top. The component writes it on each face, and the stylesheet that shades the face reads it. */
22073
- "--spatial-bar-chart-shade"?: (string) | undefined;
22347
+ /** */
22348
+ "--spatial-bar-chart-shade -How far a bar's face turns from the light, from 0 for its top. The component writes it on each face, and the stylesheet that shades the face reads it."?: (string) | undefined;
22349
+ /** The color of a bar whose cell says `data-tone="accent"`. */
22350
+ "--spatial-bar-chart-tone-accent"?: (string) | undefined;
22351
+ /** The color of a bar whose cell says `data-tone="danger"`. */
22352
+ "--spatial-bar-chart-tone-danger"?: (string) | undefined;
22353
+ /** The color of a bar whose cell says `data-tone="info"`. */
22354
+ "--spatial-bar-chart-tone-info"?: (string) | undefined;
22355
+ /** The color of a bar whose cell says `data-tone="muted"`. */
22356
+ "--spatial-bar-chart-tone-muted"?: (string) | undefined;
22357
+ /** The color of a bar whose cell says `data-tone="primary"`. A tone with no property of its own falls back to the bar's series color, and the same holds for a name you define. */
22358
+ "--spatial-bar-chart-tone-primary"?: (string) | undefined;
22359
+ /** The color of a bar whose cell says `data-tone="success"`. */
22360
+ "--spatial-bar-chart-tone-success"?: (string) | undefined;
22361
+ /** The color of a bar whose cell says `data-tone="warning"`. */
22362
+ "--spatial-bar-chart-tone-warning"?: (string) | undefined;
22074
22363
  /** Where the `start` or the `end` label stands clear of the drawing, from the footer's inline start, in pixels. The component measures it and writes it on the label, with `data-placed`, as the view turns. */
22075
22364
  "--spatial-heatmap-label-x"?: (string) | undefined;
22076
22365
  /** Where the `start` or the `end` label stands clear of the drawing, from the footer's top, in pixels. The component measures it and writes it on the label, with `data-placed`, as the view turns. */
@@ -22251,7 +22540,7 @@ export interface WcToolkitVueGlobalComponents {
22251
22540
  HelixHeadlessButtonGroupVueProps,
22252
22541
  HelixHeadlessButtonGroupVueEvents
22253
22542
  >;
22254
- /** Renders a real '<button>', so activation, focus, and other browser behavior come from the platform. **It never renders an anchor.** A router renders its own '<a>' to intercept a click, and it cannot render one inside the button's shadow root. For a link that looks like a button, use the base layer recipe on your own anchor: '<Link data-button="solid">' draws the same control. 'delegatesFocus' moves focus to the inner control. It is serialized into the server markup, so the button is reachable by keyboard before any JavaScript loads. The inner control is always 'type="button"', because a '<button type="submit">' inside a shadow root cannot submit a form outside it. To submit, the button puts a hidden native submit button carrying its 'name', 'value' and 'form*' overrides into the form, calls 'requestSubmit()' with it, which runs validation, unlike 'submit()', and takes it out again, as Shoelace and Web Awesome do. A 'submit' listener reads that button as 'event.submitter', so 'event.submitter.value' and 'new FormData(form, event.submitter)' tell two submit buttons apart. As the first submit button in its form, it is the form's default button: Enter in a text field of the form presses it, as it presses a native one. A press acts once its 'click' has reached your listeners, as a native button's does, so 'preventDefault()' in a 'click' listener cancels it: the form is not submitted or reset, and no command is sent. Set 'pending' while the action a press started is still running. The button keeps focus and refuses presses, and a reader on it hears 'pending-label'. Every press that acts sends 'helix-press' with what pressed it in 'detail.pointerType': 'mouse', 'pen', 'touch', 'keyboard', or 'virtual' for a screen reader's press or a script's 'click()', as React Aria's 'onPress' does. It is sent once the press has done its own work, after 'click' has reached your listeners, and never for a disabled or pending button or a canceled press. **Keyboard.** Enter and Space press the button, as on a native one. */
22543
+ /** Renders a real '<button>', so activation, focus, and other browser behavior come from the platform. **It never renders an anchor.** A router renders its own '<a>' to intercept a click, and it cannot render one inside the button's shadow root. For a link that looks like a button, use the base layer recipe on your own anchor: '<Link data-button="solid">' draws the same control. 'delegatesFocus' moves focus to the inner control. It is serialized into the server markup, so the button is reachable by keyboard before any JavaScript loads. The inner control is always 'type="button"', because a '<button type="submit">' inside a shadow root cannot submit a form outside it. To submit, the button puts a hidden native submit button carrying its 'name', 'value' and 'form*' overrides into the form, calls 'requestSubmit()' with it, which runs validation, unlike 'submit()', and takes it out again, as Shoelace and Web Awesome do. A 'submit' listener reads that button as 'event.submitter', so 'event.submitter.value' and 'new FormData(form, event.submitter)' tell two submit buttons apart. As the first submit button in its form, it is the form's default button: Enter in a text field of the form presses it, as it presses a native one. A press acts once its 'click' has reached your listeners, as a native button's does, so 'preventDefault()' in a 'click' listener cancels it: the form is not submitted or reset, and no command is sent. Set 'pending' while the action a press started is still running. The button keeps focus and refuses presses, and a reader on it hears 'pending-label'. Set 'focusable-when-disabled' on a disabled button whose reason a Tooltip gives. It stays in the tab order and takes hover, so the tooltip opens, and it refuses every press. Every press that acts sends 'helix-press' with what pressed it in 'detail.pointerType': 'mouse', 'pen', 'touch', 'keyboard', or 'virtual' for a screen reader's press or a script's 'click()', as React Aria's 'onPress' does. It is sent once the press has done its own work, after 'click' has reached your listeners, and never for a disabled or pending button or a canceled press. **Keyboard.** Enter and Space press the button, as on a native one. */
22255
22544
  "helix-headless-button": DefineCustomElement<
22256
22545
  HelixHeadlessButton,
22257
22546
  HelixHeadlessButtonVueProps,
@@ -22293,13 +22582,13 @@ export interface WcToolkitVueGlobalComponents {
22293
22582
  HelixHeadlessCarouselVueProps,
22294
22583
  HelixHeadlessCarouselVueEvents
22295
22584
  >;
22296
- /** The composer is a separate element so you can replace it. If you need attachments, slash commands, or a model picker, replace the composer and keep the transcript. By default, Enter sends and Shift+Enter starts a new line, the convention in messaging apps. Document editors mostly use the opposite, so 'submit-on' takes 'enter' or 'button'. Use 'button' for a long-form composer. The composer clears only when no listener cancels the send, so the text is kept when you cancel a send that failed. **Set 'voice' for dictation.** A microphone button before send listens through the page's speech engine, the browser's own unless 'registerSpeechEngine' gave the page another, and types what it hears at the caret as the reader speaks, each guess replaced by the next. Press it again, press Escape, or send, and it stops. Where the browser has no engine, as in Firefox, no button is drawn. **In a form, the draft is the composer's value**, submitted under 'name', and an empty draft submits an empty entry, as a native textarea does. A form reset puts back the 'value' the markup declared, and a '<fieldset disabled>' turns the composer off. Sending is still 'helix-send', and it does not submit the form. **'required', 'minlength' and 'maxlength' are checked by the browser**, as on a '<textarea>', and the message is the browser's. 'maxlength' stops the field taking more. A draft that fails them does not send, and the composer takes ':state(invalid)' and 'aria-invalid' once the reader has tried to send it, the form was submitted, or the reader edited the field and left it. Sending an empty required composer counts as trying. Tabbing past an empty composer marks nothing. **'feedback' is a message of your own about the draft**, such as one your server sent back. While it is set, the composer is invalid at once, does not send or submit, shows the message under the field, and a screen reader hears it as it appears. Clear it to let the draft go. **'typing' says whether the user is writing**, and 'helix-typing' is sent each time it changes: when they start, and when they send or stop for 'typing-timeout' milliseconds. Pass it on to show "is typing" to the other side. */
22585
+ /** The composer is a separate element so you can replace it. If you need slash commands or a layout of your own, replace the composer and keep the transcript. By default, Enter sends and Shift+Enter starts a new line, the convention in messaging apps. Document editors mostly use the opposite, so 'submit-on' takes 'enter' or 'button'. Use 'button' for a long-form composer. The composer clears only when no listener cancels the send, so the text is kept when you cancel a send that failed. **Set 'voice' for dictation.** A microphone button before send listens through the page's speech engine, the browser's own unless 'registerSpeechEngine' gave the page another, and types what it hears at the caret as the reader speaks, each guess replaced by the next. Press it again, press Escape, or send, and it stops. Where the browser has no engine, as in Firefox, no button is drawn. **In a form, the draft is the composer's value**, submitted under 'name', and an empty draft submits an empty entry, as a native textarea does. A form reset puts back the 'value' the markup declared, and a '<fieldset disabled>' turns the composer off. Sending is still 'helix-send', and it does not submit the form. **'required', 'minlength' and 'maxlength' are checked by the browser**, as on a '<textarea>', and the message is the browser's. 'maxlength' stops the field taking more. A draft that fails them does not send, and the composer takes ':state(invalid)' and 'aria-invalid' once the reader has tried to send it, the form was submitted, or the reader edited the field and left it. Sending an empty required composer counts as trying. Tabbing past an empty composer marks nothing. **'feedback' is a message of your own about the draft**, such as one your server sent back. While it is set, the composer is invalid at once, does not send or submit, shows the message under the field, and a screen reader hears it as it appears. Clear it to let the draft go. **'typing' says whether the user is writing**, and 'helix-typing' is sent each time it changes: when they start, and when they send or stop for 'typing-timeout' milliseconds. Pass it on to show "is typing" to the other side. **'busy' says a reply is on its way**, and turns the send button into a stop button, named by 'stop-label', that sends 'helix-stop'. The field stays open so the reader can write the next turn, and Enter does not send it until 'busy' is cleared. With 'queue', Enter sends while 'busy' too, for a page that holds a turn until the reply ends or hands it to the reply under way; the button stays the stop button. **The 'idle' slot takes the send button's place while there is nothing to send**: the field is empty, 'attached' is not set, and no reply is on its way. Put the action an empty draft offers there, such as a button that starts a voice conversation. The send button comes back as soon as there is a draft. Where focus was on the one that goes, it moves to the one that comes, so a keyboard reader stays in the same place. **What the draft carries goes in 'attachments'**, inside the box and above the field, such as thumbnails of attached images and cards for attached files. The region takes no room while nothing is in it. A press on its empty space keeps the reader in the field, and a press on a control in it, such as a button that removes an attachment, goes to that control. Set 'attached' as well, so the send button shows for a draft with no text. */
22297
22586
  "helix-headless-chat-composer": DefineCustomElement<
22298
22587
  HelixHeadlessChatComposer,
22299
22588
  HelixHeadlessChatComposerVueProps,
22300
22589
  HelixHeadlessChatComposerVueEvents
22301
22590
  >;
22302
- /** A chat message carries its state: sending, arrived, streaming, or failed. A failed message has a retry control in the message, which fires 'helix-send'. 'streaming' is the state the others are arranged around. A streaming message changes height on every frame, so it is marked 'aria-busy' while it arrives and announced once when it settles. A screen reader cannot follow a stream read out character by character. A screen reader names the turn by its author and its time, such as "You, 2 minutes ago". The author is 'author-label', or "You" for 'me', or the 'author' itself where it is a name; give a turn by 'them' an 'author-label' to name it. The chat it sits in holds the sentence and the word for 'me', so a page in another language sets them once there. The time moves on by itself, so "now" becomes "1 minute ago" while the page is open. **An agent's work goes in 'work', and its answer in the content.** The work, its thinking, the commands it ran and what they printed, is a record read the way a log is, so a 'Log' with 'separation="plain"' and 'quiet' sits there above the answer. The chat says the turn once it settles, from the content alone, so the work is never read aloud as part of the answer. */
22591
+ /** A chat message carries its state: sending, arrived, streaming, or failed. A failed message has a retry control in the message, which fires 'helix-send'. 'streaming' is the state the others are arranged around. A streaming message changes height on every frame, so it is marked 'aria-busy' while it arrives and announced once when it settles. A screen reader cannot follow a stream read out character by character. A screen reader names the turn by its author and its time, such as "You, 2 minutes ago". The author is 'author-label', or "You" for 'me', or the 'author' itself where it is a name; give a turn by 'them' an 'author-label' to name it. The chat it sits in holds the sentence and the word for 'me', so a page in another language sets them once there. The time moves on by itself, so "now" becomes "1 minute ago" while the page is open. **What a turn carries goes in 'attachments'**, above the bubble rather in it: a picture inside a tinted bubble is framed twice, and one sent with no words is an empty bubble around it. It sits against the same edge as the turn, and the words keep their bubble under it. **An agent's work goes in 'work', and its answer in the content.** The work, its thinking, the commands it ran and what they printed, is a record read the way a log is, so a 'Log' with 'separation="plain"' and 'quiet' sits there above the answer. The chat says the turn once it settles, from the content alone, so the work is never read aloud as part of the answer. */
22303
22592
  "helix-headless-chat-message": DefineCustomElement<
22304
22593
  HelixHeadlessChatMessage,
22305
22594
  HelixHeadlessChatMessageVueProps,
@@ -22551,7 +22840,7 @@ export interface WcToolkitVueGlobalComponents {
22551
22840
  HelixHeadlessLightboxItemVueProps,
22552
22841
  HelixHeadlessLightboxItemVueEvents
22553
22842
  >;
22554
- /** The frame around content you open, such as a picture, a video frame, or a chart. The lightbox draws no content of its own. It provides the frame, the keyboard behavior, and text that states the current position in the set. The modal behavior comes from a native '<dialog>' opened with 'showModal()', which provides the top layer, a backdrop, Escape to close, and 'inert' on the rest of the document. Every way of closing goes through 'requestOpen', as in 'Dialog' and 'Drawer'. A lightbox shows one item at a time and has no scrolling track, so 'active' holds the current item, as in 'Tabs'. The arrow keys change the item while focus stays in the dialog. 'active' names an item by its 'value', and an item with no 'value' by its place, counted from 1, as in 'Steps', so a set written without values moves and 'helix-activate' says '1', '2' and so on. Set 'controls' for the viewer's own previous, next and close controls, named by 'previous-label', 'next-label' and 'dismiss-label', whose glyphs you can replace in the 'previous-icon', 'next-icon' and 'dismiss-icon' slots. Without it, compose the chrome yourself in the 'header' and 'footer' slots, with buttons that send '--previous', '--next' and '--close'. **Set 'max-zoom' to let a reader zoom into the shown item**, such as '3'. Two fingers pinch it, and so does a trackpad pinch or the wheel with Ctrl held, about the point under the pointer. A double click or a double tap zooms all the way in about the point pressed and back out, and once zoomed one pointer drags it about and the wheel moves it. '+' and '-' zoom in and out from the keyboard, and '0' puts it back. The scale and the offset are on the 'viewport' part as '--lightbox-zoom', '--lightbox-pan-x' and '--lightbox-pan-y', written only while zoomed, and a swipe moves to the next item only while the item is at its own size. With 'controls', the viewer also draws zoom-out and zoom-in controls, for a pointer with no wheel and no second finger. Once a reader stops zooming, and at once for a key or a zoom control, the live region says the new scale in the words of 'zoom-status-label', such as "Zoomed to 150%". Each item is a slide: a 'group' with the role description in 'slide-role-label', named by its 'label' or by 'slide-label'. A touch or a pen swiped across the picture shows the next or the previous item, the way the line of text runs. A press on the empty area around the item closes the viewer, as a press on the backdrop does. Under 'max-zoom', a press beside the item zooms on a double press and closes nothing, and only the space outside the viewport closes the viewer. A press that dragged closes nothing. **Keyboard.** Opening moves focus to the viewer itself, which a screen reader names. | Key | What it does | |---|---| | Right, Down | Shows the next item. On a right-to-left page, Left does. While the item is zoomed, the arrows move about it instead. | | Left, Up | Shows the previous item. | | Home, End | Shows the first or the last item. | | '+', '-', '0' | Zooms in, zooms out, and puts the item back at its own size, where 'max-zoom' allows zooming. | | Tab, Shift+Tab | Moves through the controls in the viewer, from the last round to the first and from the first round to the last. | | Escape | Closes the viewer. A 'helix-before-close' listener can refuse. | A development build warns when a viewer opens with no 'label'. The chrome hides when there is no input, through 'IdleController', and comes back on a pointer move, a key press, or a focus. It stays while focus is on a control in the header or the footer, so a keyboard reader is never left on a control that has gone. 'fullscreen' uses 'FullscreenController', as 'Video' does. While the viewer is open, the page behind it does not scroll. */
22843
+ /** The frame around content you open, such as a picture, a video frame, or a chart. The lightbox draws no content of its own. It provides the frame, the keyboard behavior, and text that states the current position in the set. The modal behavior comes from a native '<dialog>' opened with 'showModal()', which provides the top layer, a backdrop, Escape to close, and 'inert' on the rest of the document. Every way of closing goes through 'requestOpen', as in 'Dialog' and 'Drawer'. A lightbox shows one item at a time and has no scrolling track, so 'active' holds the current item, as in 'Tabs'. The arrow keys change the item while focus stays in the dialog. 'active' names an item by its 'value', and an item with no 'value' by its place, counted from 1, as in 'Steps', so a set written without values moves and 'helix-activate' says '1', '2' and so on. Set 'controls' for the viewer's own previous, next and close controls, named by 'previous-label', 'next-label' and 'dismiss-label', whose glyphs you can replace in the 'previous-icon', 'next-icon' and 'dismiss-icon' slots. A set of one item has nothing to step to, so it draws no previous, next or counter. Without it, compose the chrome yourself in the 'header' and 'footer' slots, with buttons that send '--previous', '--next' and '--close'. **Set 'max-zoom' to let a reader zoom into the shown item**, such as '3'. Two fingers pinch it, and so does a trackpad pinch or the wheel with Ctrl held, about the point under the pointer. A double click or a double tap zooms all the way in about the point pressed and back out, and once zoomed one pointer drags it about and the wheel moves it. '+' and '-' zoom in and out from the keyboard, and '0' puts it back. The scale and the offset are on the 'viewport' part as '--lightbox-zoom', '--lightbox-pan-x' and '--lightbox-pan-y', written only while zoomed, and a swipe moves to the next item only while the item is at its own size. With 'controls', the viewer also draws zoom-out and zoom-in controls, for a pointer with no wheel and no second finger. Once a reader stops zooming, and at once for a key or a zoom control, the live region says the new scale in the words of 'zoom-status-label', such as "Zoomed to 150%". Each item is a slide: a 'group' with the role description in 'slide-role-label', named by its 'label' or by 'slide-label'. A touch or a pen swiped across the picture shows the next or the previous item, the way the line of text runs. A press on the empty area around the item closes the viewer, as a press on the backdrop does. Under 'max-zoom', a press beside the item zooms on a double press and closes nothing, and only the space outside the viewport closes the viewer. A press that dragged closes nothing. **Keyboard.** Opening moves focus to the viewer itself, which a screen reader names. | Key | What it does | |---|---| | Right, Down | Shows the next item. On a right-to-left page, Left does. While the item is zoomed, the arrows move about it instead. | | Left, Up | Shows the previous item. | | Home, End | Shows the first or the last item. | | '+', '-', '0' | Zooms in, zooms out, and puts the item back at its own size, where 'max-zoom' allows zooming. | | Tab, Shift+Tab | Moves through the controls in the viewer, from the last round to the first and from the first round to the last. | | Escape | Closes the viewer. A 'helix-before-close' listener can refuse. | A development build warns when a viewer opens with no 'label'. The chrome hides when there is no input, through 'IdleController', and comes back on a pointer move, a key press, or a focus. It stays while focus is on a control in the header or the footer, so a keyboard reader is never left on a control that has gone. 'fullscreen' uses 'FullscreenController', as 'Video' does. While the viewer is open, the page behind it does not scroll. */
22555
22844
  "helix-headless-lightbox": DefineCustomElement<
22556
22845
  HelixHeadlessLightbox,
22557
22846
  HelixHeadlessLightboxVueProps,
@@ -22701,12 +22990,18 @@ export interface WcToolkitVueGlobalComponents {
22701
22990
  HelixHeadlessMenuSectionVueProps,
22702
22991
  HelixHeadlessMenuSectionVueEvents
22703
22992
  >;
22704
- /** A meter shows a level within a range. Use 'Progress' to show how far along a task is. A progress bar starts empty and ends full, and full is always the good end. For a meter, which end is good depends on what is measured. There is no 'indeterminate', because a meter always has a value. **Set 'low', 'high', and 'optimum'**, as defined in the HTML specification. 'low' and 'high' divide the range into a low band, a middle band, and a high band. 'optimum' sets the preferred band. The band next to it is fair, and the band two away is poor. The band is a custom state on the meter, 'good', 'fair' or 'poor', beside 'over' and 'under' for a value past an end, so a page styles the meter around the fill as well as the fill. **'live' says the reading when it moves into another band**, such as "92%, Poor", in a polite region, for a meter whose value changes while a reader is on the page: a disk filling or a battery draining. The band's word comes from 'band-labels'. */
22993
+ /** A meter shows a level within a range, or how the level divides: write 'Meter.Segment' inside it for each part of the whole, and the meter measures their sum. Use 'Progress' to show how far along a task is. A progress bar starts empty and ends full, and full is always the good end. For a meter, which end is good depends on what is measured. There is no 'indeterminate', because a meter always has a value. **Set 'low', 'high', and 'optimum'**, as defined in the HTML specification. 'low' and 'high' divide the range into a low band, a middle band, and a high band. 'optimum' sets the preferred band. The band next to it is fair, and the band two away is poor. The band is a custom state on the meter, 'good', 'fair' or 'poor', beside 'over' and 'under' for a value past an end, so a page styles the meter around the fill as well as the fill. **'live' says the reading when it moves into another band**, such as "92%, Poor", in a polite region, for a meter whose value changes while a reader is on the page: a disk filling or a battery draining. The band's word comes from 'band-labels'. */
22705
22994
  "helix-headless-meter": DefineCustomElement<
22706
22995
  HelixHeadlessMeter,
22707
22996
  HelixHeadlessMeterVueProps,
22708
22997
  HelixHeadlessMeterVueEvents
22709
22998
  >;
22999
+ /** A segment says how much of the range one part of the whole takes, such as the tokens a model's context holds for its tools, against the tokens it holds for the conversation. Write one for each part inside a 'Meter'. **The meter's reading is the sum of its segments.** 'value' on the meter is ignored while it has any, so the two cannot disagree, and the bands, the ticks and the reading answer to the total. A segment is drawn as wide as its 'value' is of the meter's range, so segments that add up to less than the range leave the rest of the track empty, and ones that add up to more are cut at the end. **A meter's children are presentational to a screen reader**, so a segment reaches no one that cannot see the bar. Say the breakdown in text beside it, such as a list with the name and the amount of each part, which is also where a reader finds the exact figures. A segment draws only in the bar. A meter in 'ring' or 'arc' draws its total. */
23000
+ "helix-headless-meter-segment": DefineCustomElement<
23001
+ HelixHeadlessMeterSegment,
23002
+ HelixHeadlessMeterSegmentVueProps,
23003
+ HelixHeadlessMeterSegmentVueEvents
23004
+ >;
22710
23005
  /** WCAG 2.2.2 asks that motion which starts by itself and runs longer than five seconds can be paused. **This is one control for the whole page**: a press pauses every Helix component that moves by itself, and another lets them run again. - 'Carousel' stops rotating under 'autoplay'. - 'Video' pauses a video that started itself under 'autoplay'. - 'Aura', 'Orb', and 'Strands' hold the frame they show. - A graph that 'connectGraph' lays out stops where its notes stand, and its three.js view stops turning. - A map layer's 'frames' stop on the frame they show. **The choice is the page's**, held on the document element as 'data-helix-motion="paused"', so two of these on one page agree, and a page can set it in its markup or with 'pauseMotion' from '@fusion.dev/helix-core'. A stylesheet can select on the attribute to pause motion of its own. It is a toggle button: a '<button>' that says whether motion is paused with 'aria-pressed'. It keeps one name, 'label', whichever way it stands, as a toggle button does, and its icon shows what a press does next. Put it where a reader looks first, such as the page's header. Where the reader asked for reduced motion, nothing moves by itself to begin with. */
22711
23006
  "helix-headless-motion-toggle": DefineCustomElement<
22712
23007
  HelixHeadlessMotionToggle,
@@ -22845,7 +23140,7 @@ export interface WcToolkitVueGlobalComponents {
22845
23140
  HelixHeadlessScatterChartVueProps,
22846
23141
  HelixHeadlessScatterChartVueEvents
22847
23142
  >;
22848
- /** Measures which edges have content past them and sets one custom state per edge. CSS cannot read scroll position, so a stylesheet cannot work this out on its own. The styled tier draws a fade on each edge that has a state. Custom states keep an element that upgrades after a framework rendered it from adding markup the framework did not write. Select them with ':host(:state(more-block-end))'. While the content overflows, the region gets a 'tabindex', so keyboard users can scroll it. When nothing overflows, it is not a tab stop. It has 'role="region"' only when you set a 'label', because a screen reader announces an unnamed region as only "region". **'scrollbars' draws scrollbars of its own** in place of the browser's: a 'scrollbar' part for each axis that scrolls, a 'thumb' in each, and a 'corner' where the two meet. They are for the pointer. The thumb drags, and a press on the track moves the thumb to the press. The viewport stays the tab stop and the region a screen reader reads, and the scrollbars are hidden from screen readers. On the headless tier your stylesheet sizes and places them, hides the browser's own with 'scrollbar-width: none' on the viewport, and draws the thumb from the two custom properties written on each scrollbar. An axis whose 'overflow' is 'hidden' gets no scrollbar. **'orientation' keeps the content to one axis.** 'vertical' scrolls up and down only, and 'horizontal' sideways only, so the other axis has no scrollbar, the browser's or the component's, and clips what is past it. Leave it unset to scroll both ways. The viewport's 'scroll' and 'scrollend' are sent again from the host, which is the element you hold. A thumb dragged across the content sends one 'scrollend', once it is let go. In React, bind them with 'onScroll' and 'onScrollEnd'. **Keyboard.** The viewport is the tab stop while the content overflows, and the browser's scrolling keys move it: the arrow keys, Page Up and Page Down, Home and End, and Space. The scrollbars take no focus. */
23143
+ /** Measures which edges have content past them and sets one custom state per edge. CSS cannot read scroll position, so a stylesheet cannot work this out on its own. The styled tier draws a fade on each edge that has a state. Custom states keep an element that upgrades after a framework rendered it from adding markup the framework did not write. Select them with ':host(:state(more-block-end))'. While the content overflows, the region gets a 'tabindex', so keyboard users can scroll it. When nothing overflows, it is not a tab stop. It has 'role="region"' only when you set a 'label', because a screen reader announces an unnamed region as only "region". **'scrollbars' draws scrollbars of its own** in place of the browser's: a 'scrollbar' part for each axis that scrolls, a 'thumb' in each, and a 'corner' where the two meet. They are for the pointer. The thumb drags, and a press on the track moves the thumb to the press. The viewport stays the tab stop and the region a screen reader reads, and the scrollbars are hidden from screen readers. On the headless tier your stylesheet sizes and places them, hides the browser's own with 'scrollbar-width: none' on the viewport, and draws the thumb from the two custom properties written on each scrollbar. An axis whose 'overflow' is 'hidden' gets no scrollbar. **'orientation' keeps the content to one axis.** 'vertical' scrolls up and down only, and 'horizontal' sideways only, so the other axis has no scrollbar, the browser's or the component's, and clips what is past it. Leave it unset to scroll both ways. **A mask on the viewport also masks the browser's scrollbar.** While a scrollbar takes room beside the content, the viewport carries its size in '--scroll-area-gutter-inline-end' or '--scroll-area-gutter-block-end', so a mask can leave that room opaque. The styled tier's fades use them. The viewport's 'scroll' and 'scrollend' are sent again from the host, which is the element you hold. A thumb dragged across the content sends one 'scrollend', once it is let go. In React, bind them with 'onScroll' and 'onScrollEnd'. **Keyboard.** The viewport is the tab stop while the content overflows, and the browser's scrolling keys move it: the arrow keys, Page Up and Page Down, Home and End, and Space. The scrollbars take no focus. */
22849
23144
  "helix-headless-scroll-area": DefineCustomElement<
22850
23145
  HelixHeadlessScrollArea,
22851
23146
  HelixHeadlessScrollAreaVueProps,
@@ -22887,7 +23182,7 @@ export interface WcToolkitVueGlobalComponents {
22887
23182
  HelixHeadlessSparklineVueProps,
22888
23183
  HelixHeadlessSparklineVueEvents
22889
23184
  >;
22890
- /** A 3D bar chart reads its table as 'Bar Chart' does: **each row is a category, named by its label, and each numeric column a series**, named by its heading. The bars stand on a grid of categories across and series in depth, each as tall as its value from zero and colored by its series, so one series is a single row of bars and several make a block of them. **The flat 'Bar Chart' is read more exactly.** Measured, a reader judges a 3D bar's value less closely than a flat one's, and a bar can stand behind another. Use this one where the shape across two sets of names matters more than any one exact value, such as sales by region and by quarter. The tooltip and the table carry the exact values, and a drag turns the view to show a bar another hides. **Helix draws the frame, and the chart draws the bars in 3D itself, in SVG**: a picture a print and a page without WebGL show too, which a drag or Shift with an arrow turns. Put a box inside the chart, and 'connectSpatialBarChart' from '@fusion.dev/helix-plot', given 'threeBarDriver' from '@fusion.dev/helix-plot/three', draws the bars in it with three.js, lit and in perspective. **The table is the reading.** Every number is in it, and screen readers read it. The 'summary' part names the number of bars, series, and categories, and the range of values, and describes the plot. **The plot is read by key, across and in depth.** It takes focus, named by 'label' or the caption. The left and right arrows move from category to category, the down and up arrows from series to series, and Home and End go to the first and the last bar. The 'live' part says the bar's category, series, and value in words. Shift with an arrow turns the view, and Escape lets the bar go. **A reading shows its row in a tooltip**, as on every chart: the bar a mouse or a pen rests on, the bar tapped, or the one the keys move to. **Readings are sent as every chart sends them.** 'helix-reading-change' says each move of the reading, and 'helix-reading-press' a bar clicked or pressed with Enter or Space, each with the row of the table in 'index'. **Keyboard.** The plot is one tab stop once it has readings. | Key | What it does | |---|---| | Tab | Moves focus to the plot. | | Right, Left | Moves to the next or the previous category. | | Down, Up | Moves to the next or the previous series. | | Home, End | Moves to the first or the last bar. | | Shift with an arrow | Turns the view across, or tilts it up and down. | | Enter, Space | Presses the bar, which sends 'helix-reading-press'. | | Escape | Lets the bar go. | */
23185
+ /** A 3D bar chart reads its table as 'Bar Chart' does: **each row is a category, named by its label, and each numeric column a series**, named by its heading. The bars stand on a grid of categories across and series in depth, each as tall as its value from zero and colored by its series, so one series is a single row of bars and several make a block of them. **A cell's 'data-tone' colors its own bar and writes its value above it**, such as 'data-tone="primary"' on the one reading a chart is about, as on 'Bar Chart'. The value is the cell's own text. Without a tone, a bar takes its series' color. **The flat 'Bar Chart' is read more exactly.** Measured, a reader judges a 3D bar's value less closely than a flat one's, and a bar can stand behind another. Use this one where the shape across two sets of names matters more than any one exact value, such as sales by region and by quarter. The tooltip and the table carry the exact values, and a drag turns the view to show a bar another hides. **Helix draws the frame, and the chart draws the bars in 3D itself, in SVG**: a picture a print and a page without WebGL show too, which a drag or Shift with an arrow turns. Put a box inside the chart, and 'connectSpatialBarChart' from '@fusion.dev/helix-plot', given 'threeBarDriver' from '@fusion.dev/helix-plot/three', draws the bars in it with three.js, lit and in perspective. **The table is the reading.** Every number is in it, and screen readers read it. The 'summary' part names the number of bars, series, and categories, and the range of values, and describes the plot. **The plot is read by key, across and in depth.** It takes focus, named by 'label' or the caption. The left and right arrows move from category to category, the down and up arrows from series to series, and Home and End go to the first and the last bar. The 'live' part says the bar's category, series, and value in words. Shift with an arrow turns the view, and Escape lets the bar go. **A reading shows its row in a tooltip**, as on every chart: the bar a mouse or a pen rests on, the bar tapped, or the one the keys move to. **Readings are sent as every chart sends them.** 'helix-reading-change' says each move of the reading, and 'helix-reading-press' a bar clicked or pressed with Enter or Space, each with the row of the table in 'index'. **Keyboard.** The plot is one tab stop once it has readings. | Key | What it does | |---|---| | Tab | Moves focus to the plot. | | Right, Left | Moves to the next or the previous category. | | Down, Up | Moves to the next or the previous series. | | Home, End | Moves to the first or the last bar. | | Shift with an arrow | Turns the view across, or tilts it up and down. | | Enter, Space | Presses the bar, which sends 'helix-reading-press'. | | Escape | Lets the bar go. | */
22891
23186
  "helix-headless-spatial-bar-chart": DefineCustomElement<
22892
23187
  HelixHeadlessSpatialBarChart,
22893
23188
  HelixHeadlessSpatialBarChartVueProps,
@@ -23007,7 +23302,7 @@ export interface WcToolkitVueGlobalComponents {
23007
23302
  HelixHeadlessTabPanelVueProps,
23008
23303
  HelixHeadlessTabPanelVueEvents
23009
23304
  >;
23010
- /** Selection works through an event, the same as in the accordion and the tree. A tab dispatches 'helix-select', and the root pairs it with the panel of the same value. Nothing registers with anything, so tabs added later work with no extra setup. The tab list is a single tab stop, and the arrow keys move between tabs through 'KeyboardNavigationController', the same as in the radio and toggle groups. Selection follows focus, which suits a small set where showing a panel is cheap. Set 'manual' when showing a panel is expensive, so focus can move without selecting. 'orientation="vertical"' sets the tabs in a column beside the panels, and the tab list says 'aria-orientation="vertical"'. The arrow keys of both axes move between tabs either way. A tab with an 'href' is a link, for tabs that are pages of a site. Pressing it follows the link. Where any tab is a link, the arrow keys move focus without choosing on every tab of the list, as under 'manual', so arrowing past a tab never leaves the page and the list answers the keys one way. Mark the tab of the page you are on with 'selected', or set 'active' to its value. Each tab says which panel it controls through 'aria-controls', set as an element reference to the panel's host, where the engine has reflection. Keys, on the tab list: Left and Right Arrow move between tabs, and so do Up and Down; Home and End go to the first and the last. The horizontal arrows follow the reading direction, so on a right-to-left page Left moves on. Disabled tabs are passed over. Tab leaves the list for the selected panel, which is a tab stop only while it holds nothing focusable. **Keyboard.** | Key | What it does | |---|---| | Right, Down | Moves to the next tab, from the last round to the first. Selects it, unless 'manual' is set or a tab is a link. | | Left, Up | Moves to the tab before, from the first round to the last. | | Home, End | Moves to the first or the last tab. | | Enter, Space | Selects the tab with focus, or follows its link. | | Tab | Leaves the list for the selected panel. | Removing the selected tab selects the enabled tab beside it, the next one or else the one before, and 'active' says so, with 'helix-activate'. Where the removed tab had focus, focus moves to the tab now selected. **More tabs than fit.** With 'scroll-controls', a strip that scrolls shows a button at each end it can scroll toward, as Web Awesome's tab group does, and a press scrolls it most of its own length. The buttons are for the pointer, so they are out of the tab order and hidden from screen readers; the arrow keys already reach every tab, and the strip scrolls the selected tab into view. A strip scrolls once a stylesheet gives the 'tabs' part an 'overflow', as the styled tier does. A tab with 'dismissible' can be closed: see 'Tabs.Tab'. The 'indicator' part moves to the selected tab and carries its place and size, so a mark of your own can be drawn there: style the part, or slot an element into 'indicator', which sits inside the part and reads the same properties. */
23305
+ /** Selection works through an event, the same as in the accordion and the tree. A tab dispatches 'helix-select', and the root pairs it with the panel of the same value. Nothing registers with anything, so tabs added later work with no extra setup. The tab list is a single tab stop, and the arrow keys move between tabs through 'KeyboardNavigationController', the same as in the radio and toggle groups. Selection follows focus, which suits a small set where showing a panel is cheap. Set 'manual' when showing a panel is expensive, so focus can move without selecting. 'orientation="vertical"' sets the tabs in a column beside the panels, and the tab list says 'aria-orientation="vertical"'. The arrow keys of both axes move between tabs either way. A tab with an 'href' is a link, for tabs that are pages of a site. Pressing it follows the link. Where any tab is a link, the arrow keys move focus without choosing on every tab of the list, as under 'manual', so arrowing past a tab never leaves the page and the list answers the keys one way. Mark the tab of the page you are on with 'selected', or set 'active' to its value. Each tab says which panel it controls through 'aria-controls', set as an element reference to the panel's host, where the engine has reflection. Keys, on the tab list: Left and Right Arrow move between tabs, and so do Up and Down; Home and End go to the first and the last. The horizontal arrows follow the reading direction, so on a right-to-left page Left moves on. Disabled tabs are passed over. Tab leaves the list for the selected panel, which is a tab stop only while it holds nothing focusable. **Keyboard.** | Key | What it does | |---|---| | Right, Down | Moves to the next tab, from the last round to the first. Selects it, unless 'manual' is set or a tab is a link. | | Left, Up | Moves to the tab before, from the first round to the last. | | Home, End | Moves to the first or the last tab. | | Enter, Space | Selects the tab with focus, or follows its link. | | Tab | Leaves the list for the selected panel. | Removing the selected tab selects the enabled tab beside it, the next one or else the one before, and 'active' says so, with 'helix-activate'. Where the removed tab had focus, focus moves to the tab now selected. **More tabs than fit.** With 'scroll-controls', a strip that scrolls shows a button at each end it can scroll toward, as Web Awesome's tab group does, and a press scrolls it most of its own length. The buttons are for the pointer, so they are out of the tab order and hidden from screen readers; the arrow keys already reach every tab, and the strip scrolls the selected tab into view. A strip scrolls once a stylesheet gives the 'tabs' part an 'overflow', as the styled tier does. A tab with 'dismissible' can be closed: see 'Tabs.Tab'. **Panels are optional.** A set with none is a strip whose tabs stand for something the page shows elsewhere: the keys, the selection, 'active' and 'helix-activate' work the same, and no tab names a panel it controls. The 'indicator' part moves to the selected tab and carries its place and size, so a mark of your own can be drawn there: style the part, or slot an element into 'indicator', which sits inside the part and reads the same properties. */
23011
23306
  "helix-headless-tabs": DefineCustomElement<
23012
23307
  HelixHeadlessTabs,
23013
23308
  HelixHeadlessTabsVueProps,
@@ -23097,7 +23392,7 @@ export interface WcToolkitVueGlobalComponents {
23097
23392
  HelixHeadlessToggleVueProps,
23098
23393
  HelixHeadlessToggleVueEvents
23099
23394
  >;
23100
- /** A toolbar holds a mix of controls, such as buttons, toggles, and menus. A button group holds one kind, so the two are separate components. The toolbar is one tab stop, and the arrow keys move between its controls, so three toolbars take three presses of Tab to pass. Any element the browser can focus counts as a control, including your own elements. A child that takes no focus, such as a divider, is skipped. A menu is reached at its trigger. A Divider in the toolbar is a separator across the toolbar's axis, as React Aria's is: vertical in a horizontal toolbar and horizontal in a vertical one, without an 'orientation' of its own. Controls inside a plain wrapper, such as a 'Button Group', are each a stop of the toolbar's own, as React Aria's toolbar flattens a group: the arrows walk through the group's buttons and on past it, and the group takes no tab stop of its own. The arrows wrap from the last control to the first. Set 'stop-at-ends' to keep them at the ends, as Radix's 'loop' set to false does. **Keyboard.** Tab enters the toolbar on the control that last had focus, the first control at the start, and the next Tab leaves it. | Key | What it does | |---|---| | Right | Moves to the next control in a horizontal toolbar, from the last back to the first. | | Left | Moves to the control before in a horizontal toolbar, from the first round to the last. | | Down, Up | The same in a vertical toolbar. | | Home, End | Moves to the first or the last control. | Left and Right swap on a right-to-left page, where the first control is on the right. The arrows across the toolbar's axis are left to the control that has focus, so a radio-style toggle group or a select answers them itself. The toolbar is 'role="toolbar"' with 'aria-orientation', named by 'label'. The stop moves through a control's own 'focusable' property where it has one, as Button, Select and Toggle Group do. A control without one has 'tabindex' written on the element that takes focus: a native element itself, or the control inside a custom element's open shadow root, so the host keeps the markup you rendered. Only a custom element whose shadow root is closed takes it on the host. A toggle group of pressed buttons, 'selection-mode="multiple"', is walked through the same way, each toggle a stop on the toolbar's axis, as React Aria's toolbar walks its toggle buttons. Another nested composite, such as a radio-style toggle group, is one stop on the toolbar's axis: the toolbar's arrows move past it, and the arrows across the toolbar move inside it. A composite with a 'focusable' property, as Toggle Group has, gives up its own tab stop while the toolbar's is elsewhere, so Tab stops once in the toolbar. A composite without one keeps its own tab stop. A '<slot>' in the toolbar counts as the controls assigned to it, for a toolbar a component draws in its own shadow root with your controls passed into it: they share its tab stop and its arrows with the component's own. A toolbar inside another toolbar, a Helix one or the page's own 'role="toolbar"', is a 'group' of the outer one, as React Aria's is: the outer toolbar's arrows walk through its controls and on past them, and it takes no keys and no tab stop of its own. A server renders it as a toolbar, having no parent to read, until it upgrades. */
23395
+ /** A toolbar holds a mix of controls, such as buttons, toggles, and menus. A button group holds one kind, so the two are separate components. The toolbar is one tab stop, and the arrow keys move between its controls, so three toolbars take three presses of Tab to pass. Any element the browser can focus counts as a control, including your own elements. A child that takes no focus, such as a divider, is skipped. A menu is reached at its trigger. A disabled control is skipped too, except a Button with 'focusable-when-disabled', which the arrows still reach so its tooltip can say why it is disabled. A Divider in the toolbar is a separator across the toolbar's axis, as React Aria's is: vertical in a horizontal toolbar and horizontal in a vertical one, without an 'orientation' of its own. Controls inside a plain wrapper, such as a 'Button Group', are each a stop of the toolbar's own, as React Aria's toolbar flattens a group: the arrows walk through the group's buttons and on past it, and the group takes no tab stop of its own. The arrows wrap from the last control to the first. Set 'stop-at-ends' to keep them at the ends, as Radix's 'loop' set to false does. **Keyboard.** Tab enters the toolbar on the control that last had focus, the first control at the start, and the next Tab leaves it. | Key | What it does | |---|---| | Right | Moves to the next control in a horizontal toolbar, from the last back to the first. | | Left | Moves to the control before in a horizontal toolbar, from the first round to the last. | | Down, Up | The same in a vertical toolbar. | | Home, End | Moves to the first or the last control. | Left and Right swap on a right-to-left page, where the first control is on the right. The arrows across the toolbar's axis are left to the control that has focus, so a radio-style toggle group or a select answers them itself. The toolbar is 'role="toolbar"' with 'aria-orientation', named by 'label'. The stop moves through a control's own 'focusable' property where it has one, as Button, Select and Toggle Group do. A control without one has 'tabindex' written on the element that takes focus: a native element itself, or the control inside a custom element's open shadow root, so the host keeps the markup you rendered. Only a custom element whose shadow root is closed takes it on the host. A toggle group of pressed buttons, 'selection-mode="multiple"', is walked through the same way, each toggle a stop on the toolbar's axis, as React Aria's toolbar walks its toggle buttons. Another nested composite, such as a radio-style toggle group, is one stop on the toolbar's axis: the toolbar's arrows move past it, and the arrows across the toolbar move inside it. A composite with a 'focusable' property, as Toggle Group has, gives up its own tab stop while the toolbar's is elsewhere, so Tab stops once in the toolbar. A composite without one keeps its own tab stop. A '<slot>' in the toolbar counts as the controls assigned to it, for a toolbar a component draws in its own shadow root with your controls passed into it: they share its tab stop and its arrows with the component's own. A toolbar inside another toolbar, a Helix one or the page's own 'role="toolbar"', is a 'group' of the outer one, as React Aria's is: the outer toolbar's arrows walk through its controls and on past them, and it takes no keys and no tab stop of its own. A server renders it as a toolbar, having no parent to read, until it upgrades. */
23101
23396
  "helix-headless-toolbar": DefineCustomElement<
23102
23397
  HelixHeadlessToolbar,
23103
23398
  HelixHeadlessToolbarVueProps,