@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.
- package/api.json +1 -1
- package/custom-elements.json +1 -1
- package/dist/breadcrumbs/breadcrumb/breadcrumb.d.ts +13 -2
- package/dist/breadcrumbs/breadcrumb/breadcrumb.js +19 -9
- package/dist/breadcrumbs/root/breadcrumbs-root.d.ts +16 -1
- package/dist/breadcrumbs/root/breadcrumbs-root.js +6 -0
- package/dist/button/root/button-root.d.ts +33 -0
- package/dist/button/root/button-root.js +13 -3
- package/dist/canvas/root/canvas-root.d.ts +11 -0
- package/dist/canvas/root/canvas-root.js +1 -0
- package/dist/chat/composer/chat-composer.d.ts +221 -6
- package/dist/chat/composer/chat-composer.js +249 -19
- package/dist/chat/message/chat-message.d.ts +7 -0
- package/dist/chat/message/chat-message.js +2 -1
- package/dist/chat/root/chat-root.d.ts +1 -0
- package/dist/chat/root/chat-root.js +1 -1
- package/dist/copy-button/root/copy-button-root.js +3 -3
- package/dist/device-screen/root/device-screen-root.d.ts +11 -0
- package/dist/device-screen/root/device-screen-root.js +22 -10
- package/dist/dialog/root/dialog-root.js +6 -1
- package/dist/drilldown/item/drilldown-item.js +1 -1
- package/dist/element-events.generated.js +1 -0
- package/dist/filter-input/root/filter-input-root.d.ts +4 -3
- package/dist/filter-input/root/filter-input-root.js +1 -20
- package/dist/graph/root/graph-root.d.ts +11 -0
- package/dist/graph/root/graph-root.js +4 -1
- package/dist/input/root/input-root.d.ts +6 -0
- package/dist/input/root/input-root.js +7 -0
- package/dist/lightbox/root/lightbox-root.d.ts +4 -1
- package/dist/lightbox/root/lightbox-root.js +10 -8
- package/dist/listbox/root/listbox-root.d.ts +21 -0
- package/dist/listbox/root/listbox-root.js +37 -2
- package/dist/log/group/log-group.d.ts +7 -1
- package/dist/log/group/log-group.js +14 -1
- package/dist/log/root/log-root.d.ts +13 -3
- package/dist/log/root/log-root.js +5 -2
- package/dist/map/root/map-root.d.ts +11 -0
- package/dist/map/root/map-root.js +28 -12
- package/dist/menu/root/menu-root.d.ts +8 -0
- package/dist/menu/root/menu-root.js +22 -1
- package/dist/menu/section/menu-section.d.ts +10 -0
- package/dist/menu/section/menu-section.js +10 -0
- package/dist/meter/index.d.ts +1 -0
- package/dist/meter/index.js +1 -0
- package/dist/meter/root/meter-root.d.ts +16 -1
- package/dist/meter/root/meter-root.js +27 -11
- package/dist/meter/segment/meter-segment.d.ts +74 -0
- package/dist/meter/segment/meter-segment.js +47 -0
- package/dist/scroll-area/root/scroll-area-root.d.ts +20 -3
- package/dist/scroll-area/root/scroll-area-root.js +23 -4
- package/dist/spatial-bar-chart/bars.d.ts +125 -5
- package/dist/spatial-bar-chart/bars.js +194 -17
- package/dist/spatial-bar-chart/root/spatial-bar-chart-root.d.ts +148 -6
- package/dist/spatial-bar-chart/root/spatial-bar-chart-root.js +285 -16
- package/dist/splitter/root/splitter-root.js +1 -0
- package/dist/tabs/root/tabs-root.d.ts +4 -0
- package/dist/tabs/tab/tab.d.ts +1 -0
- package/dist/tabs/tab/tab.js +2 -2
- package/dist/tag/root/tag-root.d.ts +1 -1
- package/dist/terminal/root/terminal-root.d.ts +11 -0
- package/dist/terminal/root/terminal-root.js +23 -10
- package/dist/toolbar/root/toolbar-root.d.ts +4 -1
- package/dist/tooltip/root/tooltip-root.d.ts +23 -1
- package/dist/tooltip/root/tooltip-root.js +28 -5
- package/dist/tour/root/tour-root.d.ts +1 -0
- package/dist/tour/root/tour-root.js +4 -1
- package/dist/tour/stop/tour-stop.js +1 -0
- package/examples.json +1 -1
- package/lint.json +1 -1
- package/package.json +5 -5
- package/types/jsx.d.ts +1373 -52
- package/types/svelte.d.ts +1 -0
- package/types/vue.d.ts +312 -17
- 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
|
-
/**
|
|
15823
|
-
|
|
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,
|
|
15828
|
-
alone and fill the plot, as a picture on a
|
|
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
|
-
/**
|
|
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
|
|
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,
|