@fusion.dev/helix-headless 0.154.0 → 0.155.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 (59) hide show
  1. package/custom-elements.json +1427 -88
  2. package/dist/accordion/item/accordion-item.d.ts +15 -0
  3. package/dist/accordion/item/accordion-item.js +12 -1
  4. package/dist/accordion/root/accordion-root.d.ts +2 -1
  5. package/dist/accordion/root/accordion-root.js +1 -0
  6. package/dist/breadcrumbs/breadcrumb/breadcrumb.d.ts +36 -3
  7. package/dist/breadcrumbs/breadcrumb/breadcrumb.js +42 -2
  8. package/dist/breadcrumbs/root/breadcrumbs-root.d.ts +15 -5
  9. package/dist/breadcrumbs/root/breadcrumbs-root.js +29 -4
  10. package/dist/button-group/root/button-group-root.d.ts +2 -0
  11. package/dist/button-group/root/button-group-root.js +1 -0
  12. package/dist/color-input/root/color-input-root.d.ts +9 -3
  13. package/dist/color-input/root/color-input-root.js +3 -1
  14. package/dist/color-picker/channels.d.ts +5 -3
  15. package/dist/color-picker/channels.js +79 -21
  16. package/dist/color-picker/root/color-picker-root.d.ts +58 -5
  17. package/dist/color-picker/root/color-picker-root.js +75 -13
  18. package/dist/date-input/root/date-input-root.d.ts +1 -0
  19. package/dist/date-input/root/date-input-root.js +2 -1
  20. package/dist/date-picker/root/date-picker-root.d.ts +43 -13
  21. package/dist/date-picker/root/date-picker-root.js +54 -31
  22. package/dist/element-events.generated.js +2 -1
  23. package/dist/navigation/root/navigation-root.d.ts +26 -0
  24. package/dist/navigation/root/navigation-root.js +58 -1
  25. package/dist/select/root/select-root.d.ts +29 -3
  26. package/dist/select/root/select-root.js +34 -9
  27. package/dist/slider/root/slider-root.d.ts +71 -9
  28. package/dist/slider/root/slider-root.js +129 -42
  29. package/dist/speed-dial/item/speed-dial-item.d.ts +29 -1
  30. package/dist/speed-dial/item/speed-dial-item.js +48 -7
  31. package/dist/speed-dial/root/speed-dial-root.d.ts +32 -6
  32. package/dist/speed-dial/root/speed-dial-root.js +50 -5
  33. package/dist/splitter/root/splitter-root.d.ts +22 -0
  34. package/dist/splitter/root/splitter-root.js +36 -7
  35. package/dist/steps/reach.d.ts +5 -1
  36. package/dist/steps/reach.js +2 -2
  37. package/dist/steps/root/steps-root.d.ts +37 -2
  38. package/dist/steps/root/steps-root.js +49 -7
  39. package/dist/steps/step/step.d.ts +6 -0
  40. package/dist/steps/step/step.js +4 -0
  41. package/dist/tabs/root/tabs-root.d.ts +37 -0
  42. package/dist/tabs/root/tabs-root.js +92 -2
  43. package/dist/tabs/tab/tab.d.ts +38 -2
  44. package/dist/tabs/tab/tab.js +45 -4
  45. package/dist/tag/group/tag-group.d.ts +29 -3
  46. package/dist/tag/group/tag-group.js +42 -11
  47. package/dist/toggle/root/toggle-root.d.ts +2 -0
  48. package/dist/toggle/root/toggle-root.js +1 -1
  49. package/dist/tree/item/tree-item.d.ts +10 -0
  50. package/dist/tree/item/tree-item.js +12 -0
  51. package/dist/tree/root/tree-root.d.ts +40 -1
  52. package/dist/tree/root/tree-root.js +120 -4
  53. package/dist/tree/selection.d.ts +6 -0
  54. package/dist/tree/selection.js +11 -0
  55. package/lint.json +1 -1
  56. package/package.json +5 -5
  57. package/types/jsx.d.ts +984 -151
  58. package/types/vue.d.ts +221 -49
  59. package/types/words.d.ts +36 -1
package/types/vue.d.ts CHANGED
@@ -177,6 +177,7 @@ import type {
177
177
  HelixScrolledEvent,
178
178
  HelixReadingChangeEvent,
179
179
  HelixReadingPressEvent,
180
+ HelixSelectEvent,
180
181
  HelixBeforeChangeEvent,
181
182
  HelixPressEvent,
182
183
  HelixBeforeMoveEvent,
@@ -191,7 +192,6 @@ import type {
191
192
  HelixReconnectEvent,
192
193
  HelixRelabelEvent,
193
194
  HelixRemoveEvent,
194
- HelixSelectEvent,
195
195
  HelixActivateEvent,
196
196
  HelixSendEvent,
197
197
  HelixTypingEvent,
@@ -1148,6 +1148,15 @@ element's language. Leave the marks out of the text. */
1148
1148
 
1149
1149
  export type HelixHeadlessBlockquoteVueEvents = {};
1150
1150
 
1151
+ /** `HelixHeadlessBreadcrumb` component event */
1152
+ export type HelixHeadlessBreadcrumbElementEvent<E = Event> = TypedEvent<
1153
+ HelixHeadlessBreadcrumb,
1154
+ E
1155
+ >;
1156
+ /** `helix-select` event type */
1157
+ export type HelixHeadlessBreadcrumbHelixSelectElementEvent =
1158
+ HelixHeadlessBreadcrumbElementEvent<HelixSelectEvent>;
1159
+
1151
1160
  export type HelixHeadlessBreadcrumbVueProps = {
1152
1161
  /** Marks this item as the page you are on. */
1153
1162
  current?: (HelixHeadlessBreadcrumb["current"]) | undefined;
@@ -1177,7 +1186,10 @@ The consumer's decision. */
1177
1186
  target?: (HelixHeadlessBreadcrumb["target"]) | undefined;
1178
1187
  };
1179
1188
 
1180
- export type HelixHeadlessBreadcrumbVueEvents = {};
1189
+ export type HelixHeadlessBreadcrumbVueEvents = {
1190
+ /** A plain press on the crumb's link, with its `href` as the value, before the browser follows it. Cancelable: cancel it to keep the browser from following, as a client-side router does. */
1191
+ "helix-select": HelixHeadlessBreadcrumbHelixSelectElementEvent;
1192
+ };
1181
1193
 
1182
1194
  export type HelixHeadlessBreadcrumbsVueProps = {
1183
1195
  /** The name of the button that shows a folded trail's hidden crumbs. `{count}`
@@ -3188,7 +3200,8 @@ Passed to the panel, whose square, hue ramp and presets say the color's
3188
3200
  name, and read by the swatch in `swatch`, which says it before the value.
3189
3201
  Color Picker lists the keys. */
3190
3202
  colorWords?: (HelixHeadlessColorInput["colorWords"]) | undefined;
3191
- /** The syntax the value is written in: `hex`, `rgb`, or `hsl`.
3203
+ /** The syntax the value is written in: `hex`, `rgb`, `hsl`, `oklch`, or
3204
+ `hsb`, as Color Picker's `format`.
3192
3205
 
3193
3206
  **Undefaulted, because it reflects.** The two together stamp an attribute
3194
3207
  onto every host anybody renders, including the ones nobody configured: the
@@ -3423,8 +3436,9 @@ language hears its own rather than English between its own labels. */
3423
3436
  brightnessLabel?: (HelixHeadlessColorPicker["brightnessLabel"]) | undefined;
3424
3437
  /** Whether the picker shows a number field for each channel of the color, as
3425
3438
  React Aria's ColorField does with `channel`: red, green and blue for hex
3426
- and rgb, hue, saturation and lightness for hsl, and the opacity with
3427
- `alpha`.
3439
+ and rgb, hue, saturation and lightness for hsl, hue, saturation and
3440
+ brightness for hsb, lightness, chroma and hue for oklch, and the opacity
3441
+ with `alpha`.
3428
3442
 
3429
3443
  For a reader who has the numbers from a brand guide, and for a keyboard,
3430
3444
  where typing 128 is quicker than holding an arrow key. The fields follow
@@ -3432,13 +3446,20 @@ the syntax the format toggle sets. */
3432
3446
  "channel-fields"?: (HelixHeadlessColorPicker["channelFields"]) | undefined;
3433
3447
  /** Whether the picker shows a number field for each channel of the color, as
3434
3448
  React Aria's ColorField does with `channel`: red, green and blue for hex
3435
- and rgb, hue, saturation and lightness for hsl, and the opacity with
3436
- `alpha`.
3449
+ and rgb, hue, saturation and lightness for hsl, hue, saturation and
3450
+ brightness for hsb, lightness, chroma and hue for oklch, and the opacity
3451
+ with `alpha`.
3437
3452
 
3438
3453
  For a reader who has the numbers from a brand guide, and for a keyboard,
3439
3454
  where typing 128 is quicker than holding an arrow key. The fields follow
3440
3455
  the syntax the format toggle sets. */
3441
3456
  channelFields?: (HelixHeadlessColorPicker["channelFields"]) | undefined;
3457
+ /** What the chroma channel's field is called, in `channel-fields` with
3458
+ oklch. */
3459
+ "chroma-label"?: (HelixHeadlessColorPicker["chromaLabel"]) | undefined;
3460
+ /** What the chroma channel's field is called, in `channel-fields` with
3461
+ oklch. */
3462
+ chromaLabel?: (HelixHeadlessColorPicker["chromaLabel"]) | undefined;
3442
3463
  /** The words a color's name is spoken in, as JSON keyed by their English,
3443
3464
  such as `{"red": "rot", "vibrant": "kräftiges"}`.
3444
3465
 
@@ -3479,10 +3500,16 @@ the color. */
3479
3500
  "eyedropper-label"?: (HelixHeadlessColorPicker["eyedropperLabel"]) | undefined;
3480
3501
  /** What the eyedropper is called. */
3481
3502
  eyedropperLabel?: (HelixHeadlessColorPicker["eyedropperLabel"]) | undefined;
3482
- /** The syntax the value is written in: `hex`, `rgb`, or `hsl`.
3503
+ /** The syntax the value is written in: `hex`, `rgb`, `hsl`, `oklch`, or
3504
+ `hsb`.
3483
3505
 
3484
3506
  Only what is written. Everything is read whatever this says, so a picker on
3485
- `hex` still takes an `rgb()` handed to it and stores the hex for it. */
3507
+ `hex` still takes an `rgb()` or an `oklch()` handed to it and stores the
3508
+ hex for it. `oklch` writes the sRGB color the picker holds, such as
3509
+ `oklch(62.8% 0.258 29.2)`; a color outside sRGB that is handed in is
3510
+ clipped to it. `hsb` writes the picker's own model, `hsb(0, 100%, 100%)`,
3511
+ as React Aria's and Zag's color strings do. It is not CSS, so the toggle
3512
+ walks the other four. */
3486
3513
  format?: (HelixHeadlessColorPicker["format"]) | undefined;
3487
3514
  /** What the syntax toggle is called, with `{format}` filled in. */
3488
3515
  "format-label"?: (HelixHeadlessColorPicker["formatLabel"]) | undefined;
@@ -3492,15 +3519,21 @@ Only what is written. Everything is read whatever this says, so a picker on
3492
3519
  "green-label"?: (HelixHeadlessColorPicker["greenLabel"]) | undefined;
3493
3520
  /** What the green channel's field is called, in `channel-fields`. */
3494
3521
  greenLabel?: (HelixHeadlessColorPicker["greenLabel"]) | undefined;
3522
+ /** Help under the picker, such as what the color is used for. The `hint`
3523
+ slot takes richer content. */
3524
+ hint?: (HelixHeadlessColorPicker["hint"]) | undefined;
3495
3525
  /** What the hue channel is called. */
3496
3526
  "hue-label"?: (HelixHeadlessColorPicker["hueLabel"]) | undefined;
3497
3527
  /** What the hue channel is called. */
3498
3528
  hueLabel?: (HelixHeadlessColorPicker["hueLabel"]) | undefined;
3529
+ /** The name above the picker, such as "Brand color". The picker is then a
3530
+ group with this name. The `label` slot takes richer content. */
3531
+ label?: (HelixHeadlessColorPicker["label"]) | undefined;
3499
3532
  /** What the lightness channel's field is called, in `channel-fields` with
3500
- hsl. */
3533
+ hsl and oklch. */
3501
3534
  "lightness-label"?: (HelixHeadlessColorPicker["lightnessLabel"]) | undefined;
3502
3535
  /** What the lightness channel's field is called, in `channel-fields` with
3503
- hsl. */
3536
+ hsl and oklch. */
3504
3537
  lightnessLabel?: (HelixHeadlessColorPicker["lightnessLabel"]) | undefined;
3505
3538
  /** Hides the eyedropper. Without it, the eyedropper appears in browsers that
3506
3539
  support one. */
@@ -5266,15 +5299,22 @@ speaks it. Unset is the sentence registered for the page's language, then
5266
5299
  the English. `{mode}` is `single`, `range` or `multiple`, so each can have
5267
5300
  its own sentence. */
5268
5301
  badInputMessage?: (HelixHeadlessDatePicker["badInputMessage"]) | undefined;
5269
- /** The calendar the heading, the days, and the months are written in:
5270
- `gregory`, `buddhist`, `japanese`, `roc`, or `iso8601`, the five whose
5271
- months are the Gregorian months.
5272
-
5273
- Absent is the locale's own where it is one of the five, such as
5274
- `buddhist` for `th-TH` or `japanese` for `ja-JP-u-ca-japanese`, and
5275
- `gregory` for every other, such as `persian` for `fa-IR`, so the heading
5276
- names the Gregorian month the grid shows. The value is `YYYY-MM-DD` in
5277
- every calendar. */
5302
+ /** The calendar the heading, the days, and the months are written in.
5303
+
5304
+ `gregory`, `buddhist`, `japanese`, `roc`, and `iso8601` are the five
5305
+ whose months are the Gregorian months. Absent is the locale's own where
5306
+ it is one of the five, such as `buddhist` for `th-TH` or `japanese` for
5307
+ `ja-JP-u-ca-japanese`, and `gregory` for every other, such as `persian`
5308
+ for `fa-IR`.
5309
+
5310
+ `persian`, `hebrew`, `islamic-umalqura`, `islamic-civil`, `ethiopic`,
5311
+ `coptic`, and `indian` draw a calendar with months of its own, as React
5312
+ Aria's calendars do: each grid is one of that calendar's months, the
5313
+ Hebrew leap month and Ethiopia's five-day thirteenth month included, and
5314
+ Previous, Next and the page keys move by those months. `month` and
5315
+ `helix-navigate` then name a month by its first day, `YYYY-MM-DD`. The
5316
+ heading stays text, as the months and years views are drawn in Gregorian
5317
+ months only. The value is `YYYY-MM-DD` in every calendar. */
5278
5318
  calendar?: (HelixHeadlessDatePicker["calendar"]) | undefined;
5279
5319
  /** The month to open on when `month` is not set. */
5280
5320
  "default-month"?: (HelixHeadlessDatePicker["defaultMonth"]) | undefined;
@@ -5333,8 +5373,9 @@ its days. */
5333
5373
  min?: (HelixHeadlessDatePicker["min"]) | undefined;
5334
5374
  /** How many dates can be held at once. */
5335
5375
  mode?: (HelixHeadlessDatePicker["mode"]) | undefined;
5336
- /** The month shown, as `YYYY-MM`. When it is not set, it follows `value`,
5337
- then the current month.
5376
+ /** The month shown, as `YYYY-MM`, or as its first day, `YYYY-MM-DD`, under a
5377
+ `calendar` with months of its own. When it is not set, it follows
5378
+ `value`, then the current month.
5338
5379
 
5339
5380
  Separate from `value` on purpose, so paging selects nothing and a consumer
5340
5381
  can drive the view. Reading gives the month on show; writing sets it, and
@@ -5436,6 +5477,22 @@ date including the one already chosen. */
5436
5477
  "step-mismatch-message"?: (HelixHeadlessDatePicker["stepMismatchMessage"]) | undefined;
5437
5478
  /** The validation message for a date that `step` skips. */
5438
5479
  stepMismatchMessage?: (HelixHeadlessDatePicker["stepMismatchMessage"]) | undefined;
5480
+ /** The time zone today is read in, such as `America/New_York`, as React
5481
+ Aria's `today(timeZone)` reads it. Empty is the reader's own.
5482
+
5483
+ Dates are plain `YYYY-MM-DD` and carry no zone, so this moves only today:
5484
+ the day marked `aria-current` and `day-today`, and the month a picker
5485
+ with no value opens on. A desk in Tokyo booking for an office in New York
5486
+ sets `America/New_York`, and today is the office's. */
5487
+ "time-zone"?: (HelixHeadlessDatePicker["timeZone"]) | undefined;
5488
+ /** The time zone today is read in, such as `America/New_York`, as React
5489
+ Aria's `today(timeZone)` reads it. Empty is the reader's own.
5490
+
5491
+ Dates are plain `YYYY-MM-DD` and carry no zone, so this moves only today:
5492
+ the day marked `aria-current` and `day-today`, and the month a picker
5493
+ with no value opens on. A desk in Tokyo booking for an office in New York
5494
+ sets `America/New_York`, and today is the office's. */
5495
+ timeZone?: (HelixHeadlessDatePicker["timeZone"]) | undefined;
5439
5496
  /** The validation message for a date that `disable-dates` or `disable-days`
5440
5497
  bars. */
5441
5498
  "unavailable-message"?: (HelixHeadlessDatePicker["unavailableMessage"]) | undefined;
@@ -12594,6 +12651,18 @@ the stop moves on the trigger inside the shadow root, as Button's does.
12594
12651
  No attribute, because it is coordination between elements rather than
12595
12652
  anything a consumer sets. */
12596
12653
  focusable?: (HelixHeadlessSelect["focusable"]) | undefined;
12654
+ /** The options as data, for a list too long to draw whole: each a value,
12655
+ which is also its words, or a record with a `value`, a `label` and
12656
+ `disabled`. Passed to the list, which draws only the options in sight,
12657
+ as Listbox's `items` does. Set, the options you write as children are
12658
+ not read.
12659
+
12660
+ The trigger shows the chosen options' labels, the letters and the Left
12661
+ and Right keys on the closed trigger choose over the whole set, and a
12662
+ chosen value whose option leaves `items` drops out of `value`.
12663
+ `value-content` is not called for `items`. Import the Option family as
12664
+ well, whose elements are drawn. */
12665
+ items?: (HelixHeadlessSelect["items"]) | undefined;
12597
12666
  /** What the trigger shows for the chosen options: a function given them, in
12598
12667
  the order they appear, that returns text, an element or a Lit template.
12599
12668
 
@@ -12758,9 +12827,11 @@ between its thumbs and ignores it. */
12758
12827
  origin?: (HelixHeadlessSlider["origin"]) | undefined;
12759
12828
  /** Adds a second thumb, so the value is a pair.
12760
12829
 
12761
- The pair is one string, `"10,50"`, which is what a form submits and what
12762
- `MixinControllerValue` already holds. `valueAsNumber` reads the lower of
12763
- the two, since a range has no single number. */
12830
+ The pair is one string, `"10,50"`, which is what `value` and
12831
+ `MixinControllerValue` hold. A form receives two entries under the name,
12832
+ `price=10&price=50`, as React Aria's two thumbs send theirs.
12833
+ `valueAsNumber` reads the lower of the two, since a range has no single
12834
+ number. */
12764
12835
  range?: (HelixHeadlessSlider["range"]) | undefined;
12765
12836
  /** How the readout joins a range's two values, with `{start}` and `{end}`
12766
12837
  filled in. Write it in the page's language, such as `{start} bis {end}`. */
@@ -12768,12 +12839,34 @@ filled in. Write it in the page's language, such as `{start} bis {end}`. */
12768
12839
  /** How the readout joins a range's two values, with `{start}` and `{end}`
12769
12840
  filled in. Write it in the page's language, such as `{start} bis {end}`. */
12770
12841
  rangeText?: (HelixHeadlessSlider["rangeText"]) | undefined;
12842
+ /** Whether a reader can see and focus the value and cannot change it. A
12843
+ read-only slider still submits its value.
12844
+
12845
+ React Aria's `isReadOnly`. Each thumb stays a tab stop and says
12846
+ `aria-readonly`. The arrow keys, the page keys, Home, End, and a drag
12847
+ leave the value where it is. A script can still set `value`. */
12848
+ readonly?: (HelixHeadlessSlider["readOnly"]) | undefined;
12849
+ /** Whether a reader can see and focus the value and cannot change it. A
12850
+ read-only slider still submits its value.
12851
+
12852
+ React Aria's `isReadOnly`. Each thumb stays a tab stop and says
12853
+ `aria-readonly`. The arrow keys, the page keys, Home, End, and a drag
12854
+ leave the value where it is. A script can still set `value`. */
12855
+ readOnly?: (HelixHeadlessSlider["readOnly"]) | undefined;
12771
12856
  /** Shows the chosen value beside the track. */
12772
12857
  "show-value"?: (HelixHeadlessSlider["showValue"]) | undefined;
12773
12858
  /** Shows the chosen value beside the track. */
12774
12859
  showValue?: (HelixHeadlessSlider["showValue"]) | undefined;
12775
12860
  /** How far one press of an arrow key moves the thumb. */
12776
12861
  step?: (HelixHeadlessSlider["step"]) | undefined;
12862
+ /** The name of a thumb between a range's first and last, read after the
12863
+ slider's label, with `{index}` filled in: its place, counted from 1. The
12864
+ first is `minimum-label` and the last `maximum-label`. */
12865
+ "thumb-label"?: (HelixHeadlessSlider["thumbLabel"]) | undefined;
12866
+ /** The name of a thumb between a range's first and last, read after the
12867
+ slider's label, with `{index}` filled in: its place, counted from 1. The
12868
+ first is `minimum-label` and the last `maximum-label`. */
12869
+ thumbLabel?: (HelixHeadlessSlider["thumbLabel"]) | undefined;
12777
12870
  /** Whether each thumb shows its value in a bubble beside it, as Web
12778
12871
  Awesome's `with-tooltip`. The styled slider shows the bubbles while the
12779
12872
  slider is under the pointer or holds focus. They repeat what each thumb
@@ -13023,10 +13116,20 @@ export type HelixHeadlessSpeedDialItemHelixSelectElementEvent =
13023
13116
  export type HelixHeadlessSpeedDialItemVueProps = {
13024
13117
  /** Whether the action is disabled, so it cannot be chosen. */
13025
13118
  disabled?: (HelixHeadlessSpeedDialItem["disabled"]) | undefined;
13119
+ /** Whether the link downloads the file when the action is chosen. Only
13120
+ meaningful beside an `href`, and only for a file served from the page's
13121
+ origin. */
13122
+ download?: (HelixHeadlessSpeedDialItem["download"]) | undefined;
13123
+ /** The URL the action links to. Setting it draws the action as a link. */
13124
+ href?: (HelixHeadlessSpeedDialItem["href"]) | undefined;
13125
+ /** The link's `rel`. Set it whenever you set `target="_blank"`. */
13126
+ rel?: (HelixHeadlessSpeedDialItem["rel"]) | undefined;
13026
13127
  /** The action's keyboard shortcut as a chord, such as `mod+s`, carried as
13027
13128
  `aria-keyshortcuts` and drawn after the name. `mod` is Command on an Apple
13028
13129
  keyboard and Control elsewhere. Showing a shortcut does not bind it. */
13029
13130
  shortcut?: (HelixHeadlessSpeedDialItem["shortcut"]) | undefined;
13131
+ /** Where the link opens, such as `_blank` for a new tab. */
13132
+ target?: (HelixHeadlessSpeedDialItem["target"]) | undefined;
13030
13133
  /** The action's value, sent in `helix-select` when the action is chosen. */
13031
13134
  value?: (HelixHeadlessSpeedDialItem["value"]) | undefined;
13032
13135
  };
@@ -13075,13 +13178,17 @@ you described or labeled it yourself. */
13075
13178
  longPressLabel?: (HelixHeadlessSpeedDial["longPressLabel"]) | undefined;
13076
13179
  /** Space between the trigger and the actions, in pixels. */
13077
13180
  offset?: (HelixHeadlessSpeedDial["offset"]) | undefined;
13078
- /** What opens the dial. `click` opens it on a press of the trigger. Under
13079
- `long-press`, a press is the trigger's own action, and the dial opens on a
13080
- press held for half a second, or on Alt+Down or Alt+Up. */
13181
+ /** What opens the dial. `click` opens it on a press of the trigger. `hover`
13182
+ also opens it while a mouse rests on the trigger, and closes it once the
13183
+ mouse has left. Under `long-press`, a press is the trigger's own action,
13184
+ and the dial opens on a press held for half a second, or on Alt+Down or
13185
+ Alt+Up. */
13081
13186
  "open-on"?: (HelixHeadlessSpeedDial["openOn"]) | undefined;
13082
- /** What opens the dial. `click` opens it on a press of the trigger. Under
13083
- `long-press`, a press is the trigger's own action, and the dial opens on a
13084
- press held for half a second, or on Alt+Down or Alt+Up. */
13187
+ /** What opens the dial. `click` opens it on a press of the trigger. `hover`
13188
+ also opens it while a mouse rests on the trigger, and closes it once the
13189
+ mouse has left. Under `long-press`, a press is the trigger's own action,
13190
+ and the dial opens on a press held for half a second, or on Alt+Down or
13191
+ Alt+Up. */
13085
13192
  openOn?: (HelixHeadlessSpeedDial["openOn"]) | undefined;
13086
13193
  /** The direction the actions open in. They move to another side if that side
13087
13194
  does not fit.
@@ -13355,6 +13462,16 @@ export type HelixHeadlessStepsHelixSelectElementEvent =
13355
13462
  HelixHeadlessStepsElementEvent<HelixSelectEvent>;
13356
13463
 
13357
13464
  export type HelixHeadlessStepsVueProps = {
13465
+ /** Whether the arrow keys move focus between the stages' names, along the
13466
+ way the steps run. Off by default, so the arrows keep scrolling the page. */
13467
+ arrows?: (HelixHeadlessSteps["arrows"]) | undefined;
13468
+ /** What marks a stage `complete`.
13469
+
13470
+ Absent, you do: each step's `complete` is yours, because a reader who
13471
+ steps back has finished more stages than the one they are on. `passed`
13472
+ marks every stage before the one a reader moves to, and leaves the marks
13473
+ when they go back. */
13474
+ completion?: (HelixHeadlessSteps["completion"]) | undefined;
13358
13475
  /** The sequence's name, read by screen readers.
13359
13476
 
13360
13477
  A list of stages is a landmark a reader arrives at out of order, so it
@@ -14076,6 +14193,12 @@ panels and tells a screen reader the list is vertical.
14076
14193
 
14077
14194
  Optional, so the resting row writes no attribute onto the host. */
14078
14195
  orientation?: (HelixHeadlessTabs["orientation"]) | undefined;
14196
+ /** Whether a strip with more tabs than fit shows a button at each end it can
14197
+ scroll toward. */
14198
+ "scroll-controls"?: (HelixHeadlessTabs["scrollControls"]) | undefined;
14199
+ /** Whether a strip with more tabs than fit shows a button at each end it can
14200
+ scroll toward. */
14201
+ scrollControls?: (HelixHeadlessTabs["scrollControls"]) | undefined;
14079
14202
  /** How the row of tabs is drawn.
14080
14203
 
14081
14204
  Unset is a raised pill on the selected tab with nothing behind the row,
@@ -14132,11 +14255,22 @@ export type HelixHeadlessTabElementEvent<E = Event> = TypedEvent<
14132
14255
  HelixHeadlessTab,
14133
14256
  E
14134
14257
  >;
14258
+ /** `helix-dismiss` event type */
14259
+ export type HelixHeadlessTabHelixDismissElementEvent =
14260
+ HelixHeadlessTabElementEvent<HelixDismissEvent>;
14135
14261
  /** `helix-select` event type */
14136
14262
  export type HelixHeadlessTabHelixSelectElementEvent =
14137
14263
  HelixHeadlessTabElementEvent<HelixSelectEvent>;
14138
14264
 
14139
14265
  export type HelixHeadlessTabVueProps = {
14266
+ /** The tooltip on the mark that closes a `dismissible` tab. The mark is for
14267
+ the pointer and hidden from screen readers, which hear the Delete key
14268
+ through `aria-keyshortcuts`. */
14269
+ "dismiss-label"?: (HelixHeadlessTab["dismissLabel"]) | undefined;
14270
+ /** The tooltip on the mark that closes a `dismissible` tab. The mark is for
14271
+ the pointer and hidden from screen readers, which hear the Delete key
14272
+ through `aria-keyshortcuts`. */
14273
+ dismissLabel?: (HelixHeadlessTab["dismissLabel"]) | undefined;
14140
14274
  /** The URL the tab links to. Setting it renders the tab as a link, for a set
14141
14275
  of tabs that are pages of a site. */
14142
14276
  href?: (HelixHeadlessTab["href"]) | undefined;
@@ -14144,6 +14278,8 @@ of tabs that are pages of a site. */
14144
14278
  rel?: (HelixHeadlessTab["rel"]) | undefined;
14145
14279
  /** Where the link opens, such as `_blank`, for a tab with an `href`. */
14146
14280
  target?: (HelixHeadlessTab["target"]) | undefined;
14281
+ /** Whether the element shows a control that dismisses it. */
14282
+ dismissible?: (HelixHeadlessTab["dismissible"]) | undefined;
14147
14283
  /** Whether the item is disabled and cannot be chosen. */
14148
14284
  disabled?: (HelixHeadlessTab["disabled"]) | undefined;
14149
14285
  /** Whether the item is selected.
@@ -14158,6 +14294,8 @@ submits. */
14158
14294
  };
14159
14295
 
14160
14296
  export type HelixHeadlessTabVueEvents = {
14297
+ /** A `dismissible` tab was asked to close. The tab does not remove itself, so remove it and its panel in response. Cancelable. */
14298
+ "helix-dismiss": HelixHeadlessTabHelixDismissElementEvent;
14161
14299
  /** Fired when the tab is chosen. Cancelable: canceling it stops the change and leaves the decision to you. */
14162
14300
  "helix-select": HelixHeadlessTabHelixSelectElementEvent;
14163
14301
  };
@@ -14175,6 +14313,14 @@ export type HelixHeadlessTagGroupHelixDismissElementEvent =
14175
14313
  HelixHeadlessTagGroupElementEvent<HelixDismissEvent>;
14176
14314
 
14177
14315
  export type HelixHeadlessTagGroupVueProps = {
14316
+ /** Keeps at least one tag selected once one is, as React Aria's
14317
+ `disallowEmptySelection`: a press or a key that would leave none selected
14318
+ is refused. Removing the last selected tag still takes it out of `value`. */
14319
+ "disallow-empty-selection"?: (HelixHeadlessTagGroup["disallowEmptySelection"]) | undefined;
14320
+ /** Keeps at least one tag selected once one is, as React Aria's
14321
+ `disallowEmptySelection`: a press or a key that would leave none selected
14322
+ is refused. Removing the last selected tag still takes it out of `value`. */
14323
+ disallowEmptySelection?: (HelixHeadlessTagGroup["disallowEmptySelection"]) | undefined;
14178
14324
  /** The words the group shows and says once its last tag is removed, where
14179
14325
  nothing is in the `empty` slot. */
14180
14326
  "empty-label"?: (HelixHeadlessTagGroup["emptyLabel"]) | undefined;
@@ -14184,6 +14330,20 @@ nothing is in the `empty` slot. */
14184
14330
  /** The name of the set, such as "Filters", which a screen reader announces
14185
14331
  before its tags. */
14186
14332
  label?: (HelixHeadlessTagGroup["label"]) | undefined;
14333
+ /** What a press, Space, or a move does to the tags already selected.
14334
+ `toggle`, the default, keeps them: a press adds or takes out the tag, and
14335
+ the arrow keys move focus alone. `replace` selects the tag alone, as a
14336
+ file list does, and the arrow keys carry the selection with focus.
14337
+ Control or Command with a press or Space adds or takes out one tag in
14338
+ `multiple`, and with an arrow moves focus without selecting. */
14339
+ "selection-behavior"?: (HelixHeadlessTagGroup["selectionBehavior"]) | undefined;
14340
+ /** What a press, Space, or a move does to the tags already selected.
14341
+ `toggle`, the default, keeps them: a press adds or takes out the tag, and
14342
+ the arrow keys move focus alone. `replace` selects the tag alone, as a
14343
+ file list does, and the arrow keys carry the selection with focus.
14344
+ Control or Command with a press or Space adds or takes out one tag in
14345
+ `multiple`, and with an arrow moves focus without selecting. */
14346
+ selectionBehavior?: (HelixHeadlessTagGroup["selectionBehavior"]) | undefined;
14187
14347
  /** How many tags a reader can select: `single`, `multiple`, or none.
14188
14348
 
14189
14349
  Absent selects nothing, and the tags carry no selected state at all. */
@@ -16010,6 +16170,18 @@ refused, in a `reorderable` tree. */
16010
16170
  An `aria-label` or `aria-labelledby` on the host names the tree too, and
16011
16171
  wins over this. */
16012
16172
  label?: (HelixHeadlessTree["label"]) | undefined;
16173
+ /** What screen readers hear when an item moves into another branch, in a
16174
+ `reorderable` tree. `{name}` is the item's words, `{parent}` the words of
16175
+ the branch it moved into, or the tree's `label` for the top level,
16176
+ `{position}` its place there, counting from 1, and `{count}` the number of
16177
+ items there. */
16178
+ "moved-into-label"?: (HelixHeadlessTree["movedIntoLabel"]) | undefined;
16179
+ /** What screen readers hear when an item moves into another branch, in a
16180
+ `reorderable` tree. `{name}` is the item's words, `{parent}` the words of
16181
+ the branch it moved into, or the tree's `label` for the top level,
16182
+ `{position}` its place there, counting from 1, and `{count}` the number of
16183
+ items there. */
16184
+ movedIntoLabel?: (HelixHeadlessTree["movedIntoLabel"]) | undefined;
16013
16185
  /** What screen readers hear each time an item moves, in a `reorderable`
16014
16186
  tree. `{name}` is the item's words, `{position}` its place among its
16015
16187
  siblings, counting from 1, and `{count}` the number of siblings. */
@@ -17049,7 +17221,7 @@ export type CustomCssProperties = {
17049
17221
  "--scroll-area-scroll-fraction"?: (string) | undefined;
17050
17222
  /** 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. */
17051
17223
  "--scroll-area-thumb-fraction"?: (string) | undefined;
17052
- /** Where a bubble's thumb is, as a fraction of the track, 0 to 1. Set on each `tooltip` part. */
17224
+ /** Where a bubble's or a thumb box's thumb is, as a fraction of the track, 0 to 1. Set on each `tooltip` and `thumb` part. */
17053
17225
  "--slider-at"?: (string) | undefined;
17054
17226
  /** The value as a fraction of the range, 0 to 1. */
17055
17227
  "--slider-fraction"?: (string) | undefined;
@@ -17095,13 +17267,13 @@ export type CustomCssProperties = {
17095
17267
  // Note: Some tooling expects this augmentation under "@vue/runtime-core", while
17096
17268
  // other docs/examples use "vue". We emit both for compatibility.
17097
17269
  export interface WcToolkitVueGlobalComponents {
17098
- /** Holds its own open state. Used alone, outside an accordion, it works as a disclosure. The trigger sits inside a heading, so a screen reader lists the section with the page's headings. The level is the item's 'heading-level', then the accordion's, then 3. Content stays mounted when the item is closed, so it can animate and its text is present in server-rendered HTML. The browser's find in page searches a closed section, and a match opens it, with 'helix-before-open' first, as React Aria's disclosure does. Closed content is 'hidden="until-found"', which hides it with no stylesheet loaded and keeps it out of the tab order and the accessibility tree. A section that closes keeps its content drawn until the content part's animations and transitions end, so a sheet that animates the section closed shows the content shrinking rather than an empty box. Set 'hidden-until-found="false"' and a closed section is 'hidden' and 'inert' instead, and find in page skips it. While it is open, the content part carries the content's height as '--accordion-content-height', as Radix's accordion does, for a stylesheet that animates the section open with keyframes of its own. */
17270
+ /** Holds its own open state. Used alone, outside an accordion, it works as a disclosure. The trigger sits inside a heading, so a screen reader lists the section with the page's headings. The level is the item's 'heading-level', then the accordion's, then 3. Content stays mounted when the item is closed, so it can animate and its text is present in server-rendered HTML. The browser's find in page searches a closed section, and a match opens it, with 'helix-before-open' first, as React Aria's disclosure does. Closed content is 'hidden="until-found"', which hides it with no stylesheet loaded and keeps it out of the tab order and the accessibility tree. A section that closes keeps its content drawn until the content part's animations and transitions end, so a sheet that animates the section closed shows the content shrinking rather than an empty box. Set 'hidden-until-found="false"' and a closed section is 'hidden' and 'inert' instead, and find in page skips it. A section whose trigger has no words, with nothing in its 'summary' slot, is announced as a bare button, and a development build warns once with the kind 'missing-name'. While it is open, the content part carries the content's height as '--accordion-content-height', as Radix's accordion does, for a stylesheet that animates the section open with keyframes of its own. */
17099
17271
  "helix-headless-accordion-item": DefineCustomElement<
17100
17272
  HelixHeadlessAccordionItem,
17101
17273
  HelixHeadlessAccordionItemVueProps,
17102
17274
  HelixHeadlessAccordionItemVueEvents
17103
17275
  >;
17104
- /** Holds the mode. Each item coordinates itself: when you click an item, it finds the nearest accordion, reads the mode, and closes the other items. The accordion does not listen for items opening. 'helix-before-open' does not bubble and is not composed, because overlays nest and an inner overlay's events must stay separate from the outer one's. Items are found when they are clicked, so there is no registry to keep up to date. An item added after render coordinates on its first click. Items are matched with 'instanceof HelixHeadlessAccordionItem', so the headless tier does not depend on the styled tier's tag names. Keys, on a trigger: Up and Down Arrow move to the previous and the next trigger, and so do Left and Right, wrapping at the ends; Home and End go to the first and the last. Enter and Space open and close the section. Disabled sections are passed over. Each trigger is a button with 'aria-expanded' and 'aria-controls', inside a heading, level 3 unless 'heading-level' says otherwise, so the sections are in a screen reader's list of headings. An open section is a region named by its trigger. Set the level that fits the page's outline. Find in page searches the closed sections too, and opens the one it matches in. 'hidden-until-found="false"' turns that off. */
17276
+ /** Holds the mode. Each item coordinates itself: when you click an item, it finds the nearest accordion, reads the mode, and closes the other items. The accordion does not listen for items opening. 'helix-before-open' does not bubble and is not composed, because overlays nest and an inner overlay's events must stay separate from the outer one's. Items are found when they are clicked, so there is no registry to keep up to date. An item added after render coordinates on its first click. Items are matched with 'instanceof HelixHeadlessAccordionItem', so the headless tier does not depend on the styled tier's tag names. Keys, on a trigger: Up and Down Arrow move to the previous and the next trigger, and so do Left and Right, wrapping at the ends; Home and End go to the first and the last. Enter and Space open and close the section. Disabled sections are passed over. Under 'single' the open section's trigger is 'aria-disabled', because a press cannot close it. Each trigger is a button with 'aria-expanded' and 'aria-controls', inside a heading, level 3 unless 'heading-level' says otherwise, so the sections are in a screen reader's list of headings. An open section is a region named by its trigger. Set the level that fits the page's outline. Find in page searches the closed sections too, and opens the one it matches in. 'hidden-until-found="false"' turns that off. */
17105
17277
  "helix-headless-accordion": DefineCustomElement<
17106
17278
  HelixHeadlessAccordion,
17107
17279
  HelixHeadlessAccordionVueProps,
@@ -17155,13 +17327,13 @@ export interface WcToolkitVueGlobalComponents {
17155
17327
  HelixHeadlessBlockquoteVueProps,
17156
17328
  HelixHeadlessBlockquoteVueEvents
17157
17329
  >;
17158
- /** Each crumb renders its separator and sets its list-item role. It hides its own separator with ':host(:first-child)', so the trail needs no index from the parent. Set 'href' to make the whole crumb an anchor, which works with Enter, middle click, and the status bar, and before any JavaScript runs. A router cannot reach an anchor inside a shadow root, so intercept the click for client-side navigation, as with 'Tree.Item' and 'List.Item'. A trail that collapses also reads 'href' to rebuild its hidden crumbs elsewhere. Without 'href', the crumb renders a plain '<span>' around what you slot, including your own anchor. The current page is plain text, and 'aria-current="page"' on the host conveys the position. In a trail where no crumb is 'current', the last one is said to be the current page, and keeps its link. An 'aria-current' you write on the host, such as 'aria-current="location"', replaces the one the crumb gives itself. */
17330
+ /** Each crumb renders its separator and sets its list-item role. It hides its own separator with ':host(:first-child)', so the trail needs no index from the parent. Set 'href' to make the whole crumb an anchor, which works with Enter, middle click, and the status bar, and before any JavaScript runs. A router cannot reach an anchor inside a shadow root, so intercept the click for client-side navigation, as with 'Tree.Item' and 'List.Item': a plain press on the link sends 'helix-select' with the 'href' as its value first, and canceling it keeps the browser from following, so a client-side router follows it instead, as React Aria's 'onAction' lets a router do. A press with a modifier opens the link where the browser opens it and sends nothing. Without 'href', the crumb renders a plain '<span>' around what you slot, including your own anchor. The current page is plain text, and 'aria-current="page"' on the host conveys the position. In a trail where no crumb is 'current', the last one is said to be the current page, and keeps its link. An 'aria-current' you write on the host, such as 'aria-current="location"', replaces the one the crumb gives itself. */
17159
17331
  "helix-headless-breadcrumb": DefineCustomElement<
17160
17332
  HelixHeadlessBreadcrumb,
17161
17333
  HelixHeadlessBreadcrumbVueProps,
17162
17334
  HelixHeadlessBreadcrumbVueEvents
17163
17335
  >;
17164
- /** The host is the navigation landmark, named "Breadcrumb" by default. An 'aria-label' on the host names the trail instead, and so does 'label'. When a page has more than one navigation landmark, screen reader users choose between them by name. The '<ol>' has an explicit 'role="list"', because Safari removes list semantics from a list with 'list-style: none', and the trail always hides its markers. The items are slotted directly, so they are '<ol>' children in the flat tree, and each item sets 'role="listitem"' on itself. Where no slotted crumb is 'current', the last one is said to be the current page. The trail does not measure itself, and you write its overflow in markup: put the crumb that holds the folded items where the gap should appear. A trail built from data, such as a router's matched routes, takes 'items': an array of '{ label, href }', drawn as crumbs in order, the last one as the current page. Slotted crumbs follow them. Use one way or the other in a trail. With 'max-items', a trail drawn from 'items' that is longer folds its middle into one crumb: the first crumb, a button, then the last 'max-items' less one. The button is named by 'expand-label' and shows the whole trail, moving focus to the first crumb it brought back. A new 'items' folds again. Slotted crumbs do not fold; write the folded crumb where the gap should be. **Keyboard.** Each crumb with an 'href' is a link and one tab stop, and Enter follows it. The current page and the separators are not in the tab order. In a folded trail, Enter or Space on the fold's button shows the whole trail and moves focus to the first crumb it brought back. */
17336
+ /** The host is the navigation landmark, named "Breadcrumb" by default. An 'aria-label' on the host names the trail instead, and so does 'label'. When a page has more than one navigation landmark, screen reader users choose between them by name. The '<ol>' has an explicit 'role="list"', because Safari removes list semantics from a list with 'list-style: none', and the trail always hides its markers. The items are slotted directly, so they are '<ol>' children in the flat tree, and each item sets 'role="listitem"' on itself. Where no slotted crumb is 'current', the last one is said to be the current page. The trail does not measure itself, and you write its overflow in markup: put the crumb that holds the folded items where the gap should appear. A trail built from data, such as a router's matched routes, takes 'items': an array of '{ label, href }', drawn as crumbs in order, the last one as the current page. Slotted crumbs follow them. Use one way or the other in a trail. With 'max-items', a trail that is longer folds its middle into one place: the first crumb, a button, then the last 'max-items' less one. The button is named by 'expand-label' and shows the whole trail, moving focus to the first crumb it brought back. A trail drawn from 'items' draws the button as a crumb of its own, and a new 'items' folds again. A slotted trail hides the crumbs it folds, which take no room, and its first crumb draws the button after its link; a change to the crumbs folds again. **Keyboard.** Each crumb with an 'href' is a link and one tab stop, and Enter follows it. The current page and the separators are not in the tab order. In a folded trail, Enter or Space on the fold's button shows the whole trail and moves focus to the first crumb it brought back. */
17165
17337
  "helix-headless-breadcrumbs": DefineCustomElement<
17166
17338
  HelixHeadlessBreadcrumbs,
17167
17339
  HelixHeadlessBreadcrumbsVueProps,
@@ -17257,13 +17429,13 @@ export interface WcToolkitVueGlobalComponents {
17257
17429
  HelixHeadlessCodeVueProps,
17258
17430
  HelixHeadlessCodeVueEvents
17259
17431
  >;
17260
- /** A text field with a button that opens 'ColorPicker' in an overlay. 'ColorPicker' provides the square, the ramps, the eyedropper, and the syntax toggle, and you can also use it on its own, flat on the page. Color Input adds the field, the overlay, and the form value, the same arrangement Date Input has with 'DatePicker'. You can type or paste a color into the field without opening the picker. Color Input is a custom control, unlike '<input type="color">', so you can style the panel to match your interface. The field reads every color syntax, including '#f00', '#ff0000', 'rgb(255 0 0)', 'rgba(255,0,0,.5)', 'rgb(255 0 0 / 50%)', and 'hsl(0 100% 50%)'. It writes colors in the syntax that 'format' names. The field shows the value without reformatting it, because half-typed input does not survive a round trip through a formatter. Date Input does the same with dates. Typing sends 'input' on each keystroke and 'change' when you leave the field, as a text field does, so the message about a color it cannot read waits until you are done. Dragging in the panel sends 'input' as the color moves and 'change' when it settles. The trigger and ArrowDown open the panel with focus in the square. Tab moves between the panel's controls without leaving it, and Escape closes it and returns focus to the field. The component sets '--color-input-swatch', so do not set it yourself. It holds the resolved color, so the styled tier can paint the swatch without parsing the value. */
17432
+ /** A text field with a button that opens 'ColorPicker' in an overlay. 'ColorPicker' provides the square, the ramps, the eyedropper, and the syntax toggle, and you can also use it on its own, flat on the page. Color Input adds the field, the overlay, and the form value, the same arrangement Date Input has with 'DatePicker'. You can type or paste a color into the field without opening the picker. Color Input is a custom control, unlike '<input type="color">', so you can style the panel to match your interface. The field reads every color syntax, including '#f00', '#ff0000', 'rgb(255 0 0)', 'rgba(255,0,0,.5)', 'rgb(255 0 0 / 50%)', 'hsl(0 100% 50%)', 'oklch(62.8% 0.258 29.2)', and 'hsb(0, 100%, 100%)'. It writes colors in the syntax that 'format' names. The field shows the value without reformatting it, because half-typed input does not survive a round trip through a formatter. Date Input does the same with dates. Typing sends 'input' on each keystroke and 'change' when you leave the field, as a text field does, so the message about a color it cannot read waits until you are done. Dragging in the panel sends 'input' as the color moves and 'change' when it settles. The trigger and ArrowDown open the panel with focus in the square. Tab moves between the panel's controls without leaving it, and Escape closes it and returns focus to the field. The component sets '--color-input-swatch', so do not set it yourself. It holds the resolved color, so the styled tier can paint the swatch without parsing the value. */
17261
17433
  "helix-headless-color-input": DefineCustomElement<
17262
17434
  HelixHeadlessColorInput,
17263
17435
  HelixHeadlessColorInputVueProps,
17264
17436
  HelixHeadlessColorInputVueEvents
17265
17437
  >;
17266
- /** The picker on its own, with no field around it, for a settings pane or a toolbar. Color Input shows this element in a panel behind a text field. The saturation and brightness square is two '<input type="range">' elements, laid over the square and made invisible, and the handle is drawn from their values. The keyboard behavior, the announcements, and the touch targets come from the platform, and there is no 'role="application"'. The picker works in HSB and derives the value from it. A value set from outside is read into the model once. Black is 'brightness: 0', which has no hue or saturation, so a model read back from the value would turn red into gray after you drag to the bottom of the square and back. The square is one tab stop. In it, the up and down arrows move brightness and the left and right arrows move saturation, and PageUp and PageDown move brightness by ten. The picker sends 'input' as the color moves and 'change' when a drag, a key, a typed value or a preset settles it, as '<input type="color">' does. A screen reader hears the color's name, such as "vibrant red", after the two numbers on the square and after the number on the hue ramp, and each preset is named by its color. The opacity ramp is heard as a percentage. Set 'color-words' to speak the names in another language. The presets are a listbox with the current color selected, and one tab stop. The arrow keys move between them, Home and End go to the ends, and Enter, Space or a press chooses one. */
17438
+ /** The picker on its own, with no field around it, for a settings pane or a toolbar. Color Input shows this element in a panel behind a text field. The saturation and brightness square is two '<input type="range">' elements, laid over the square and made invisible, and the handle is drawn from their values. The keyboard behavior, the announcements, and the touch targets come from the platform, and there is no 'role="application"'. The picker works in HSB and derives the value from it. A value set from outside is read into the model once. Black is 'brightness: 0', which has no hue or saturation, so a model read back from the value would turn red into gray after you drag to the bottom of the square and back. The square is one tab stop. In it, the up and down arrows move brightness and the left and right arrows move saturation, and PageUp and PageDown move brightness by ten. The picker sends 'input' as the color moves and 'change' when a drag, a key, a typed value or a preset settles it, as '<input type="color">' does. A screen reader hears the color's name, such as "vibrant red", after the two numbers on the square and after the number on the hue ramp, and each preset is named by its color. The opacity ramp is heard as a percentage. Set 'color-words' to speak the names in another language. 'label' names the picker, which is then a group with that name, and the square's ramps say it before their own, as "Brand, Saturation". 'hint' writes help under the picker, which the square, the ramps and the value field are described by. Inside Color Input the field carries both. The presets are a listbox with the current color selected, and one tab stop. The arrow keys move between them, Home and End go to the ends, and Enter, Space or a press chooses one. */
17267
17439
  "helix-headless-color-picker": DefineCustomElement<
17268
17440
  HelixHeadlessColorPicker,
17269
17441
  HelixHeadlessColorPickerVueProps,
@@ -17587,7 +17759,7 @@ export interface WcToolkitVueGlobalComponents {
17587
17759
  HelixHeadlessMeterVueProps,
17588
17760
  HelixHeadlessMeterVueEvents
17589
17761
  >;
17590
- /** Renders a real '<nav>', the landmark that screen reader users jump to. Navigation is its own component, separate from 'AppHeader', so you can use it in a header, a footer, or a sidebar. **It renders no links.** Bring your own, mark the current one with 'aria-current="page"', and style them with the 'data-navigation-item' recipe. A router renders its own anchors and cannot render them inside the component's shadow root. The component moves a marker to the current item. It finds the current item by reading 'aria-current', so the attribute that screen readers announce also places the marker. Any value but 'false' counts, so a sidebar of sections on one page can mark the section in view with 'aria-current="location"'. Where several are marked, 'page' wins. **The destinations can be a list.** Slot a '<ul>' or an '<ol>' of '<li>' elements, each holding a link, and a screen reader says how many there are and where each one is, as in Radix's 'NavigationMenu.List'. The marker and the arrow keys work on the list items as they do on bare links. Give the list 'role="list"' as well, since Safari drops the semantics of a list drawn without bullets. Set 'orientation="vertical"' to stack the destinations in a column, for a sidebar. Set 'arrows' and the arrow keys move focus between the destinations, as Radix's navigation menu does: left and right along a row, up and down a column, Home and End to the ends. A 'Megamenu' among them is reached at its trigger. Tab still stops at every link, since a navigation is a list of links and not a single control, and the keys across the other axis are left to the page and to an open panel. */
17762
+ /** Renders a real '<nav>', the landmark that screen reader users jump to. Navigation is its own component, separate from 'AppHeader', so you can use it in a header, a footer, or a sidebar. **It renders no links.** Bring your own, mark the current one with 'aria-current="page"', and style them with the 'data-navigation-item' recipe. A router renders its own anchors and cannot render them inside the component's shadow root. The component moves a marker to the current item. It finds the current item by reading 'aria-current', so the attribute that screen readers announce also places the marker. Any value but 'false' counts, so a sidebar of sections on one page can mark the section in view with 'aria-current="location"'. Where several are marked, 'page' wins. **The destinations can be a list.** Slot a '<ul>' or an '<ol>' of '<li>' elements, each holding a link, and a screen reader says how many there are and where each one is, as in Radix's 'NavigationMenu.List'. The marker and the arrow keys work on the list items as they do on bare links. Give the list 'role="list"' as well, since Safari drops the semantics of a list drawn without bullets. Set 'orientation="vertical"' to stack the destinations in a column, for a sidebar. Set 'arrows' and the arrow keys move focus between the destinations, as Radix's navigation menu does: left and right along a row, up and down a column, Home and End to the ends. A 'Megamenu' among them is reached at its trigger. Tab still stops at every link, since a navigation is a list of links and not a single control, and the keys across the other axis are left to the page and to an open panel. While a 'Megamenu', or another disclosure among the destinations, is open, the navigation is ':state(open)', so a page can dim what lies under the panel, as Radix's navigation menu marks its open state. A screen reader lists the page's navigation landmarks by name, so two named alike cannot be told apart. Where another navigation in the same document has the same name, "Main" for two with no 'label', the later one warns once with the kind 'duplicate-name'. */
17591
17763
  "helix-headless-navigation": DefineCustomElement<
17592
17764
  HelixHeadlessNavigation,
17593
17765
  HelixHeadlessNavigationVueProps,
@@ -17725,7 +17897,7 @@ export interface WcToolkitVueGlobalComponents {
17725
17897
  HelixHeadlessScrollAreaVueProps,
17726
17898
  HelixHeadlessScrollAreaVueEvents
17727
17899
  >;
17728
- /** A trigger that opens a 'Listbox'. The list is the same element you can use on its own, with the same keyboard behavior, filtering, and multi-select rules. Select adds a trigger that shows what is chosen, a floating surface, and a place for focus to return to when the list closes. Your options stay in your light DOM and are slotted through into the listbox, so the listbox looks through slots to find them. 'Select' owns the value, passes it down to the listbox, and takes changes back, so the value lives in one place. Set 'valueContent' to draw the trigger's content from the chosen options, and several chosen options are written as a list in the reader's language. **Keyboard.** On the closed trigger: | Key | What it does | |---|---| | Down, Enter, Space | Opens the list on the chosen option, or the first. | | Up | Opens the list on the chosen option, or the last. | | Home, End | Opens the list on the first or the last option. | | Left, Right | Chooses the option before or after the chosen one without opening, as React Aria's Select does, in either direction of text. | | A letter or a word | Chooses the option whose words start with what you typed, as a native '<select>' does. With 'multiple', opens the list on it. | In the open list, which is a 'Listbox': | Key | What it does | |---|---| | Down, Up, Home, End, Page Down, Page Up | Moves the highlight. | | A letter or a word | Moves the highlight to the next option whose words start with what you typed. | | Enter, Space | Chooses the highlighted option and closes the list. With 'multiple', toggles it and leaves the list open. | | Escape | Closes the list and puts focus back on the trigger. | | Tab | Closes the list and moves on. | A choice made on the closed trigger is said aloud on Apple devices, where VoiceOver does not read the trigger's new name. **ARIA.** The trigger is a 'button' with 'aria-haspopup="listbox"' and 'aria-expanded', named by the label and then the chosen words, as a native '<select>' is. The list is the listbox 'Listbox' describes, named by the label, or by 'list-label' where there is none. Set 'autocomplete' to let a browser's autofill choose, as a native '<select>' with the same attribute would. */
17900
+ /** A trigger that opens a 'Listbox'. The list is the same element you can use on its own, with the same keyboard behavior, filtering, and multi-select rules. Select adds a trigger that shows what is chosen, a floating surface, and a place for focus to return to when the list closes. Your options stay in your light DOM and are slotted through into the listbox, so the listbox looks through slots to find them. For a list too long to draw whole, set 'items' instead: the list draws only the options in sight, as Listbox's 'items' does, and the trigger, its keys and the form read the whole set. 'Select' owns the value, passes it down to the listbox, and takes changes back, so the value lives in one place. Set 'valueContent' to draw the trigger's content from the chosen options, and several chosen options are written as a list in the reader's language. **Keyboard.** On the closed trigger: | Key | What it does | |---|---| | Down, Enter, Space | Opens the list on the chosen option, or the first. | | Up | Opens the list on the chosen option, or the last. | | Home, End | Opens the list on the first or the last option. | | Left, Right | Chooses the option before or after the chosen one without opening, as React Aria's Select does, in either direction of text. | | A letter or a word | Chooses the option whose words start with what you typed, as a native '<select>' does. With 'multiple', opens the list on it. | In the open list, which is a 'Listbox': | Key | What it does | |---|---| | Down, Up, Home, End, Page Down, Page Up | Moves the highlight. | | A letter or a word | Moves the highlight to the next option whose words start with what you typed. | | Enter, Space | Chooses the highlighted option and closes the list. With 'multiple', toggles it and leaves the list open. | | Escape | Closes the list and puts focus back on the trigger. | | Tab | Closes the list and moves on. | A choice made on the closed trigger is said aloud on Apple devices, where VoiceOver does not read the trigger's new name. **ARIA.** The trigger is a 'button' with 'aria-haspopup="listbox"' and 'aria-expanded', named by the label and then the chosen words, as a native '<select>' is. The list is the listbox 'Listbox' describes, named by the label, or by 'list-label' where there is none. Set 'autocomplete' to let a browser's autofill choose, as a native '<select>' with the same attribute would. */
17729
17901
  "helix-headless-select": DefineCustomElement<
17730
17902
  HelixHeadlessSelect,
17731
17903
  HelixHeadlessSelectVueProps,
@@ -17743,7 +17915,7 @@ export interface WcToolkitVueGlobalComponents {
17743
17915
  HelixHeadlessSkipLinkVueProps,
17744
17916
  HelixHeadlessSkipLinkVueEvents
17745
17917
  >;
17746
- /** Renders a native '<input type="range">', so the drag, the arrow keys, Home, End, the page keys, and the touch target come from the platform. A native range has a hit area larger than its thumb, sized for a finger. The value is a string, like every other form control's, and 'MixinControllerValue' holds text. Use 'valueAsNumber' for arithmetic. Marks are drawn by the component. The ticks of a '<datalist>' cannot be styled, and Firefox does not render them for a range. Marks are decoration. 'step' sets where the value can land, and the input enforces it whether or not marks are drawn. 'markers' is a count, so a slider from zero to a hundred does not draw a hundred and one marks by accident. A range with two thumbs is two inputs stacked on one track, because there is no native two-thumb range. Each thumb keeps its own value. 'min-steps-between-thumbs' keeps them that many steps apart, and the readout joins the two as 'range-text' writes them. 'origin' sets where a single thumb's fill starts: at 'min', at the middle of the track, or at 'max'. A balance or an offset from zero fills from the middle, as Zag's slider 'origin' does. The fill's ends are published as '--slider-from' and '--slider-to'. 'format-options' writes the value with 'Intl.NumberFormat' in 'locale', as a currency, a percent or a unit, and 'formatter' writes it with a function of your own, such as words for a scale. Either one is what a screen reader hears, what the readout shows and what the marker labels say. 'value-text' still wraps it in a sentence, with the formatted value in its place. 'required' comes with the field mixin and cannot fail. A range is never empty: the platform shows its midpoint when no value is set, and 'willUpdate' seeds that midpoint into 'defaultValue', so the value matches the handle from the first render. HTML does not apply 'required' to a range either, so it is not set on the input. It only adds the marker beside the label. **Keyboard.** Each thumb is one tab stop, and its keys are the native range's. | Key | What it does | |---|---| | Right, Up | Moves the thumb up by 'step'. | | Left, Down | Moves the thumb down by 'step'. | | Page Up, Page Down | Moves the thumb by a larger step. | | Home, End | Moves the thumb to its lowest or highest value. | Each thumb is an '<input type="range">' with 'aria-valuetext' where the value is formatted or worded. A range's thumbs say they stop at each other with 'aria-valuemin' and 'aria-valuemax'. */
17918
+ /** Renders a native '<input type="range">', so the drag, the arrow keys, Home, End, the page keys, and the touch target come from the platform. A native range has a hit area larger than its thumb, sized for a finger. The value is a string, like every other form control's, and 'MixinControllerValue' holds text. Use 'valueAsNumber' for arithmetic. Marks are drawn by the component. The ticks of a '<datalist>' cannot be styled, and Firefox does not render them for a range. Marks are decoration. 'step' sets where the value can land, and the input enforces it whether or not marks are drawn. 'markers' is a count, so a slider from zero to a hundred does not draw a hundred and one marks by accident. A range with two thumbs is two inputs stacked on one track, because there is no native two-thumb range. Each thumb keeps its own value, and a named range submits one entry per thumb under its name, the lowest first. A range given more than two values, such as 'default-value="20,50,80"', has a thumb for each, as React Aria's slider takes any number of thumbs: each stops at its neighbors, and the ones between the first and the last are named by 'thumb-label'. 'min-steps-between-thumbs' keeps them that many steps apart, and the readout joins the two as 'range-text' writes them. 'origin' sets where a single thumb's fill starts: at 'min', at the middle of the track, or at 'max'. A balance or an offset from zero fills from the middle, as Zag's slider 'origin' does. The fill's ends are published as '--slider-from' and '--slider-to'. 'format-options' writes the value with 'Intl.NumberFormat' in 'locale', as a currency, a percent or a unit, and 'formatter' writes it with a function of your own, such as words for a scale. Either one is what a screen reader hears, what the readout shows and what the marker labels say. 'value-text' still wraps it in a sentence, with the formatted value in its place. 'required' comes with the field mixin and cannot fail. A range is never empty: the platform shows its midpoint when no value is set, and 'willUpdate' seeds that midpoint into 'defaultValue', so the value matches the handle from the first render. HTML does not apply 'required' to a range either, so it is not set on the input. It only adds the marker beside the label. **Keyboard.** Each thumb is one tab stop, and its keys are the native range's. | Key | What it does | |---|---| | Right, Up | Moves the thumb up by 'step'. | | Left, Down | Moves the thumb down by 'step'. | | Page Up, Page Down | Moves the thumb by a larger step. | | Home, End | Moves the thumb to its lowest or highest value. | Under 'readonly' none of these move the thumb, and Tab still reaches it. Each thumb is an '<input type="range">' with 'aria-valuetext' where the value is formatted or worded. A range's thumbs say they stop at each other with 'aria-valuemin' and 'aria-valuemax'. */
17747
17919
  "helix-headless-slider": DefineCustomElement<
17748
17920
  HelixHeadlessSlider,
17749
17921
  HelixHeadlessSliderVueProps,
@@ -17761,19 +17933,19 @@ export interface WcToolkitVueGlobalComponents {
17761
17933
  HelixHeadlessSpeedDialGroupVueProps,
17762
17934
  HelixHeadlessSpeedDialGroupVueEvents
17763
17935
  >;
17764
- /** Each item is a command, so it has the 'menuitem' role. A megamenu holds destinations, so it is a disclosure of links. A speed dial holds actions, which is what 'role="menu"' is for. The name is text rendered beside the icon, and it is the accessible name. A 'title' on an icon shows only on hover. Visible text is read, searched, and translated like other text. 'shortcut' gives the action's keyboard shortcut as a chord, such as 'mod+s', the grammar Menu's rows use. The action carries it as 'aria-keyshortcuts' and draws it after the name in the platform's glyphs or words, '⌘S' on an Apple keyboard and 'Ctrl+S' elsewhere, as Menu draws its rows' shortcuts. Put a 'Kbd' in the 'shortcut' slot to draw it as keys instead; the dial imports no 'Kbd' of its own. Showing a shortcut does not bind it. */
17936
+ /** Each item is a command, so it has the 'menuitem' role. A megamenu holds destinations, so it is a disclosure of links. A speed dial holds actions, which is what 'role="menu"' is for. The name is text rendered beside the icon, and it is the accessible name. A 'title' on an icon shows only on hover. Visible text is read, searched, and translated like other text. 'shortcut' gives the action's keyboard shortcut as a chord, such as 'mod+s', the grammar Menu's rows use. The action carries it as 'aria-keyshortcuts' and draws it after the name in the platform's glyphs or words, '⌘S' on an Apple keyboard and 'Ctrl+S' elsewhere, as Menu draws its rows' shortcuts. Put a 'Kbd' in the 'shortcut' slot to draw it as keys instead; the dial imports no 'Kbd' of its own. Showing a shortcut does not bind it. 'href' makes the action a link, as Menu's rows take one: the 'item' part is then an '<a>' carrying 'menuitem', so the browser follows it, opens it in a new tab on a middle press, and offers its own menu for it. Choosing it still sends 'helix-select' and closes the dial. A disabled action draws no link. */
17765
17937
  "helix-headless-speed-dial-item": DefineCustomElement<
17766
17938
  HelixHeadlessSpeedDialItem,
17767
17939
  HelixHeadlessSpeedDialItemVueProps,
17768
17940
  HelixHeadlessSpeedDialItemVueEvents
17769
17941
  >;
17770
- /** A speed dial is a menu. Its items are commands, so it uses 'role="menu"' and 'menuitem', and it is built from the same pieces as 'Menu': - 'KeyboardNavigationController' for the arrow keys - 'PopoverController' for the panel - 'MixinControllerOpen' for open and closed It is a separate component because a speed dial has no submenus, headers, or checkable items. You slot the trigger. The usual floating action button is 'IconButton' with 'shape="circle"' and 'raised'. There is no 'helix-fab', because 'IconButton' already has 'emphasis', 'tone', 'label', and a size. Position the button with 'data-dock' in the base layer. All four arrow keys move through the actions, because a speed dial has no nested levels to reserve the horizontal pair for. This is the default behavior of the keyboard controller. Typing a letter moves to the next action whose name starts with it. The actions are one tab stop, and Tab closes the dial and moves on. **Keyboard.** On the trigger, Enter, Space or a press opens the dial on its first action. With the dial open: | Key | What it does | |---|---| | Down, Right | Moves to the next action, from the last back to the first. | | Up, Left | Moves to the action before, from the first round to the last. | | Home, End | Moves to the first or the last action. | | A letter | Moves to the next action whose name starts with it. | | Enter, Space | Chooses the action, and the dial closes. | | Escape | Closes the dial and puts focus back on the trigger. | | Tab | Closes the dial and moves on. | **Groups.** Put actions in 'Speed Dial.Group', named by its 'label', to set them apart as Menu's sections do: each is a 'group' of the menu, and the arrow keys walk through every group's actions in order. **A trigger with its own action.** With 'open-on="long-press"', a press on the trigger is the trigger's own, such as composing a message, and holding it for half a second opens the dial, as React Aria's menu trigger does with 'trigger="longPress"'. Alt+Down or Alt+Up opens it from the keyboard, and the trigger says so in its description, 'long-press-label', the drawn one and a slotted one alike. A press that has opened the dial does not also do the trigger's action. */
17942
+ /** A speed dial is a menu. Its items are commands, so it uses 'role="menu"' and 'menuitem', and it is built from the same pieces as 'Menu': - 'KeyboardNavigationController' for the arrow keys - 'PopoverController' for the panel - 'MixinControllerOpen' for open and closed It is a separate component because a speed dial has no submenus, headers, or checkable items. You slot the trigger. The usual floating action button is 'IconButton' with 'shape="circle"' and 'raised'. There is no 'helix-fab', because 'IconButton' already has 'emphasis', 'tone', 'label', and a size. Position the button with 'data-dock' in the base layer. All four arrow keys move through the actions, because a speed dial has no nested levels to reserve the horizontal pair for. This is the default behavior of the keyboard controller. Typing a letter moves to the next action whose name starts with it. The actions are one tab stop, and Tab closes the dial and moves on. **Keyboard.** On the trigger, Enter, Space, Down or a press opens the dial on its first action, and Up opens it on its last, as an APG menu button does. With the dial open: | Key | What it does | |---|---| | Down, Right | Moves to the next action, from the last back to the first. | | Up, Left | Moves to the action before, from the first round to the last. | | Home, End | Moves to the first or the last action. | | A letter | Moves to the next action whose name starts with it. | | Enter, Space | Chooses the action, and the dial closes. | | Escape | Closes the dial and puts focus back on the trigger. | | Tab | Closes the dial and moves on. | **Groups.** Put actions in 'Speed Dial.Group', named by its 'label', to set them apart as Menu's sections do: each is a 'group' of the menu, and the arrow keys walk through every group's actions in order. **A trigger with its own action.** With 'open-on="long-press"', a press on the trigger is the trigger's own, such as composing a message, and holding it for half a second opens the dial, as React Aria's menu trigger does with 'trigger="longPress"'. Alt+Down or Alt+Up opens it from the keyboard, and the trigger says so in its description, 'long-press-label', the drawn one and a slotted one alike. A press that has opened the dial does not also do the trigger's action. **Open on hover.** With 'open-on="hover"', a mouse resting on the trigger opens the dial, as Material's speed dial does, and the dial closes a moment after the mouse leaves both the trigger and the actions. A press, a touch and the keyboard open it as under 'click', and a press on the trigger of a dial already open moves focus to its first action, so the press a mouse makes after hovering keeps the dial open. */
17771
17943
  "helix-headless-speed-dial": DefineCustomElement<
17772
17944
  HelixHeadlessSpeedDial,
17773
17945
  HelixHeadlessSpeedDialVueProps,
17774
17946
  HelixHeadlessSpeedDialVueEvents
17775
17947
  >;
17776
- /** A splitter has one axis. Nest splitters to get two axes and three-pane or four-pane layouts. When a splitter is slotted into a pane of another at a right angle, a corner handle appears where the dividers cross. It shows the 'move' cursor, responds to both arrow axes, and a drag moves both dividers at once. The corner is added at 'firstUpdated' and is not in the server markup. Before it appears, both dividers work on their own. The divider has 'role="separator"' and 'aria-valuenow', with 'aria-valuetext' saying the start pane's share as a percentage in the nearest 'lang', or in the reader's locale where no 'lang' is set, and 'aria-controls' names the start pane. Drag it with a pointer or move it with the arrow keys, press 'Home' or 'End' to move it to its bounds, and press 'Enter' to collapse the start pane and open it again. A drag in progress is tracked as a state, so both dividers a corner moves stay lit for as long as they move. By default, 'min' and 'max' let the divider reach either edge, so you can drag a pane fully closed. Set them to limit the range. A pane can be collapsed, which is a separate state from a divider at the edge. 'collapsed' names the shut pane, 'start' or 'end', and the pane opens back to the position where the collapsing gesture began. A drag records that position on press, and every other way of collapsing records it in 'settle'. 'collapsed-size' keeps a sliver of the pane visible, such as a tab strip. Collapsing overrides 'min' and 'max'. Set 'primary' to the pane that keeps its size when the splitter's own size changes, such as a sidebar beside a window being resized. The other pane takes all of the change, as Web Awesome's split panel does. Without it, both panes keep their share. **Keyboard.** The divider is one tab stop. | Key | What it does | |---|---| | Left, Right | Moves a side-by-side divider by 'step'. On a right-to-left page, Left moves it toward the end. | | Up, Down | Moves a stacked divider by 'step'. | | Home, End | Moves the divider to its bounds. | | Enter | Collapses the start pane, and opens it again. | | F6 | Moves focus from one pane to the first control in the other, and from the divider to the start pane. | */
17948
+ /** A splitter has one axis. Nest splitters to get two axes and three-pane or four-pane layouts. When a splitter is slotted into a pane of another at a right angle, a corner handle appears where the dividers cross. It shows the 'move' cursor, responds to both arrow axes, and a drag moves both dividers at once. The corner is added at 'firstUpdated' and is not in the server markup. Before it appears, both dividers work on their own. The divider has 'role="separator"' and 'aria-valuenow', with 'aria-valuetext' saying the start pane's share as a percentage in the nearest 'lang', or in the reader's locale where no 'lang' is set, and 'aria-controls' names the start pane. Drag it with a pointer or move it with the arrow keys, press 'Home' or 'End' to move it to its bounds, and press 'Enter' to collapse the start pane and open it again. A drag in progress is tracked as a state, so both dividers a corner moves stay lit for as long as they move. By default, 'min' and 'max' let the divider reach either edge, so you can drag a pane fully closed. Set them to limit the range. A pane can be collapsed, which is a separate state from a divider at the edge. 'collapsed' names the shut pane, 'start' or 'end', and the pane opens back to the position where the collapsing gesture began. A drag records that position on press, and every other way of collapsing records it in 'settle'. 'collapsed-size' keeps a sliver of the pane visible, such as a tab strip. Collapsing overrides 'min' and 'max'. Set 'primary' to the pane that keeps its size when the splitter's own size changes, such as a sidebar beside a window being resized. The other pane takes all of the change, as Web Awesome's split panel does. Without it, both panes keep their share. **Three or more panes along one axis are splitters nested on that axis**, a splitter in the 'end' pane of another for three columns. The nested one keeps the pane on its far side the size it was while the outer divider moves, so a divider resizes only the two panes beside it, as Zag's splitter does with any number of panels. Where the whole row is resized, every pane keeps its share, unless 'primary' says otherwise. **Keyboard.** The divider is one tab stop. | Key | What it does | |---|---| | Left, Right | Moves a side-by-side divider by 'step'. On a right-to-left page, Left moves it toward the end. | | Up, Down | Moves a stacked divider by 'step'. | | Home, End | Moves the divider to its bounds. | | Enter | Collapses the start pane, and opens it again. | | F6 | Moves focus from one pane to the first control in the other, and from the divider to the start pane. | */
17777
17949
  "helix-headless-splitter": DefineCustomElement<
17778
17950
  HelixHeadlessSplitter,
17779
17951
  HelixHeadlessSplitterVueProps,
@@ -17791,7 +17963,7 @@ export interface WcToolkitVueGlobalComponents {
17791
17963
  HelixHeadlessStatVueProps,
17792
17964
  HelixHeadlessStatVueEvents
17793
17965
  >;
17794
- /** 'active' sets where the user is, and 'complete' stays on each step. Returning to stage one of three leaves stages one and two finished, so the root sets 'current' on the steps and never changes 'complete'. 'active' is optional. Without it, each step keeps its own 'current', so the sequence is correct in the server's markup, where the root cannot count its slotted children. 'linear' keeps a reader from passing a stage they have not finished, as Ark UI's linear steps do: a stage ahead is out of reach, and its button disabled, until every stage before it is 'complete' or 'optional'. Going back is always allowed. 'next()' and 'previous()' move one stage either way, under the same rules, for your own buttons. To check a stage before a reader moves on from it, set 'validate' to a function that answers whether the stage is valid, as Ark UI's 'isStepValid' does. Moving forward asks it about the stage the reader is on, and where it answers 'false' the reader stays and the stage is ':state(invalid)' until it answers 'true'. An 'optional' stage is not asked. 'helix-before-activate' is still sent for every move, for a check of your own. 'progress' is how far through the sequence is, from 0 to 100: the share of its stages that are 'complete'. The 'progress' part carries it as a 'progressbar' and as '--steps-progress', and is hidden until a stylesheet gives it a 'display', so a bar of your own costs nothing until you draw it. A screen reader hears it as 'progress-label' says, "33% complete" unless set, as Ark UI's steps write it. The sequence is ':state(complete)' once every stage is. The sequence is a list named by 'label', and each step a list item. The current stage's button says 'aria-current="step"', and a finished stage's button is described by its 'complete-label'. */
17966
+ /** 'active' sets where the user is, and 'complete' stays on each step. Returning to stage one of three leaves stages one and two finished, so the root sets 'current' on the steps and never changes 'complete'. 'active' is optional. Without it, each step keeps its own 'current', so the sequence is correct in the server's markup, where the root cannot count its slotted children. 'linear' keeps a reader from passing a stage they have not finished, as Ark UI's linear steps do: a stage ahead is out of reach, and its button disabled, until every stage before it is 'complete' or 'optional'. Going back is always allowed. 'next()' and 'previous()' move one stage either way, under the same rules, for your own buttons. 'reset()' goes back to the first stage and clears every stage's 'complete', as Ark UI's 'resetStep' does. 'completion="passed"' marks a stage 'complete' once a reader moves past it, as Ark UI counts a stage before the current one as completed. Going back leaves it complete. In a 'linear' sequence the next stage is then in reach from the current one, and 'validate' decides whether the reader may go. To check a stage before a reader moves on from it, set 'validate' to a function that answers whether the stage is valid, as Ark UI's 'isStepValid' does. Moving forward asks it about the stage the reader is on, and where it answers 'false' the reader stays and the stage is ':state(invalid)' until it answers 'true'. An 'optional' stage is not asked. 'helix-before-activate' is still sent for every move, for a check of your own. 'progress' is how far through the sequence is, from 0 to 100: the share of its stages that are 'complete'. The 'progress' part carries it as a 'progressbar' and as '--steps-progress', and is hidden until a stylesheet gives it a 'display', so a bar of your own costs nothing until you draw it. A screen reader hears it as 'progress-label' says, "33% complete" unless set, as Ark UI's steps write it. The sequence is ':state(complete)' once every stage is. The sequence is a list named by 'label', and each step a list item. The current stage's button says 'aria-current="step"', and a finished stage's button is described by its 'complete-label'. **Keyboard.** Each stage's name is a button and its own tab stop, and Enter or Space goes to the stage. Set 'arrows' and the arrow keys move focus between the names as well, as Ark UI's steps do: Left and Right along a row, Up and Down a column, Home and End to the first and the last. The arrows pass over a disabled stage and one a linear sequence holds out of reach, and they move focus without going to the stage. */
17795
17967
  "helix-headless-steps": DefineCustomElement<
17796
17968
  HelixHeadlessSteps,
17797
17969
  HelixHeadlessStepsVueProps,
@@ -17839,19 +18011,19 @@ export interface WcToolkitVueGlobalComponents {
17839
18011
  HelixHeadlessTabPanelVueProps,
17840
18012
  HelixHeadlessTabPanelVueEvents
17841
18013
  >;
17842
- /** 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 first enabled tab that is left, and 'active' says so, with 'helix-activate'. Where the removed tab had focus, focus moves to the tab now selected. 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. */
18014
+ /** 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 first enabled tab that is left, 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. */
17843
18015
  "helix-headless-tabs": DefineCustomElement<
17844
18016
  HelixHeadlessTabs,
17845
18017
  HelixHeadlessTabsVueProps,
17846
18018
  HelixHeadlessTabsVueEvents
17847
18019
  >;
17848
- /** A tab is an element, because it manages selection and its own tab stop. With an 'href', the tab is a link: 'role="tab"' on an '<a>', which a press, Enter and the browser's own link gestures follow. 'helix-select' is sent first, and canceling it keeps the browser from following, so a client-side router follows it instead. */
18020
+ /** A tab is an element, because it manages selection and its own tab stop. With an 'href', the tab is a link: 'role="tab"' on an '<a>', which a press, Enter and the browser's own link gestures follow. 'helix-select' is sent first, and canceling it keeps the browser from following, so a client-side router follows it instead. With 'dismissible', the tab can be closed, as Web Awesome's closable tab can: a press on its 'dismiss' mark, or Delete or Backspace while the tab has focus, sends 'helix-dismiss'. The tab does not remove itself, because your code owns the set, so remove the tab and its panel in your handler. Focus moves to the tab beside it, and the tab set selects a tab that is left. The tab says the key through 'aria-keyshortcuts', and the mark is for the pointer, hidden from screen readers. */
17849
18021
  "helix-headless-tab": DefineCustomElement<
17850
18022
  HelixHeadlessTab,
17851
18023
  HelixHeadlessTabVueProps,
17852
18024
  HelixHeadlessTabVueEvents
17853
18025
  >;
17854
- /** A part of 'Tag' that holds tags as one control: a grid of rows, one tab stop for the whole set. The arrow keys move between tags, Home and End go to the first and the last, and a typed letter goes to the next tag starting with it. Delete or Backspace removes the focused tag where it is 'dismissible', by sending its 'helix-dismiss': remove it from your list in the handler, and focus moves to the next tag, or the previous one after the last. 'selection-mode' lets a reader select tags, with Space, Enter or a press: 'single' selects one at a time and 'multiple' any number. In 'multiple', Shift with an arrow, Home or End selects the range from the tag last pressed to the tag focus moves to, and Control or Command with A selects every tag that is not disabled. 'value' holds the selected tags' values, separated by commas, and a change asks with 'helix-before-change' and tells with 'change'. Enter on a tag with an 'href' follows its link. A 'disabled' tag is passed over. A selected tag that is removed leaves 'value', which then sends 'change'. Name the set with 'label'. Each tag is named by its words alone, without its remove button. 'value' takes an array of values on the property as well, as React sets 'value={['Apple']}'; a press writes it back as a string. **Removing the last tag keeps focus in the group.** With no tags left the set is a 'group', and focus moves to its 'empty' part, which holds the 'empty' slot: put words there such as "No filters" for a reader to hear. With nothing slotted it says 'empty-label', "No tags". Where only disabled tags are left, the first of them holds the tab stop and takes focus, so the reader stays in the set. */
18026
+ /** A part of 'Tag' that holds tags as one control: a grid of rows, one tab stop for the whole set. The arrow keys move between tags, Home and End go to the first and the last, and a typed letter goes to the next tag starting with it. Delete or Backspace removes the focused tag where it is 'dismissible', by sending its 'helix-dismiss': remove it from your list in the handler, and focus moves to the next tag, or the previous one after the last. 'selection-mode' lets a reader select tags, with Space, Enter or a press: 'single' selects one at a time and 'multiple' any number. In 'multiple', Shift with an arrow, Home or End selects the range from the tag last pressed to the tag focus moves to, Shift with a press or Space selects the range to that tag, and Control or Command with A selects every tag that is not disabled. 'selection-behavior="replace"' selects the tag a reader presses or moves to alone, as a file list does, and Control or Command with a press or Space adds or takes out one tag. 'disallow-empty-selection' keeps one tag selected once one is. 'value' holds the selected tags' values, separated by commas, and a change asks with 'helix-before-change' and tells with 'change'. Enter on a tag with an 'href' follows its link. A 'disabled' tag is passed over. A selected tag that is removed leaves 'value', which then sends 'change'. Name the set with 'label'. Each tag is named by its words alone, without its remove button. 'value' takes an array of values on the property as well, as React sets 'value={['Apple']}'; a press writes it back as a string. **Removing the last tag keeps focus in the group.** With no tags left the set is a 'group', and focus moves to its 'empty' part, which holds the 'empty' slot: put words there such as "No filters" for a reader to hear. With nothing slotted it says 'empty-label', "No tags". Where only disabled tags are left, the first of them holds the tab stop and takes focus, so the reader stays in the set. */
17855
18027
  "helix-headless-tag-group": DefineCustomElement<
17856
18028
  HelixHeadlessTagGroup,
17857
18029
  HelixHeadlessTagGroupVueProps,
@@ -17953,7 +18125,7 @@ export interface WcToolkitVueGlobalComponents {
17953
18125
  HelixHeadlessTreeItemVueProps,
17954
18126
  HelixHeadlessTreeItemVueEvents
17955
18127
  >;
17956
- /** The tree is a single tab stop, and arrow keys move focus between items, as the tree pattern requires, so Tab moves past a long sidebar in one press. The tree moves the tab stop to the focused item, so the browser's focus order stays intact. Items are found with 'instanceof', never by tag name, so the headless tier does not depend on the styled one. Typing a letter moves to the next visible item whose name starts with it, and '*' opens every branch beside the focused item. 'selection-mode="multiple"' draws a check mark on every row and lets a reader check many, as Web Awesome's and Ark UI's checkbox trees do. Checking a branch checks every item under it, and a branch some of whose items are checked is partly checked. Space or a press on the mark checks the focused row, and Enter or a press on a branch's row opens it. 'active' then holds the checked values, comma separated, which 'values' also gives as a list, and the tree says 'aria-multiselectable'. 'selection-mode="leaf"' chooses one item at a time and only the items at the ends: a press, Enter or Space on a branch opens or closes it and chooses nothing, as Web Awesome's 'leaf' mode does. Keys: Up and Down Arrow move between the items a reader can see; Right Arrow opens a shut branch and then moves into it, and Left Arrow shuts an open one and then moves to its parent, the two swapping on a right-to-left page. Home and End go to the first and the last item, Enter and Space choose or open, and the tree's one tab stop stays on the item last reached. In a tree of check marks, Control+A (Command+A on an Apple keyboard) checks every item or clears them all, and Shift with Up or Down Arrow moves and checks. Removing the item that has focus moves focus to the item after it among its siblings, or the one before, or its parent, so focus stays in the tree. **'reorderable' lets you move items among their siblings.** Alt with Up or Down moves the focused item a place, and Alt with Home or End to the first or the last place among its siblings, as the APG's rearrangeable listbox does. Each row gets a grip at its far end: drag it to move the item, and the tree scrolls near an edge. A click on a grip picks the item up and a click on one of its siblings drops it there, which needs no drag. The arrows move an item picked up that way, Enter or Space drops it, and Escape puts it back. The tree says each step in its 'live' region. A drop sends 'helix-before-reorder', which you can refuse, and then 'helix-reorder', whose 'keys' hold the siblings in the new order. **You move the items**: the tree moves no element of yours, and focus follows the moved item once you have. Moving an item into another branch is not part of this. */
18128
+ /** The tree is a single tab stop, and arrow keys move focus between items, as the tree pattern requires, so Tab moves past a long sidebar in one press. The tree moves the tab stop to the focused item, so the browser's focus order stays intact. Items are found with 'instanceof', never by tag name, so the headless tier does not depend on the styled one. Typing a letter moves to the next visible item whose name starts with it, and '*' opens every branch beside the focused item. 'selection-mode="multiple"' draws a check mark on every row and lets a reader check many, as Web Awesome's and Ark UI's checkbox trees do. Checking a branch checks every item under it, and a branch some of whose items are checked is partly checked. Space or a press on the mark checks the focused row, and Enter or a press on a branch's row opens it. 'active' then holds the checked values, comma separated, which 'values' also gives as a list, and the tree says 'aria-multiselectable'. 'selection-mode="leaf"' chooses one item at a time and only the items at the ends: a press, Enter or Space on a branch opens or closes it and chooses nothing, as Web Awesome's 'leaf' mode does. Keys: Up and Down Arrow move between the items a reader can see; Right Arrow opens a shut branch and then moves into it, and Left Arrow shuts an open one and then moves to its parent, the two swapping on a right-to-left page. Home and End go to the first and the last item, Enter and Space choose or open, and the tree's one tab stop stays on the item last reached. In a tree of check marks, Control+A (Command+A on an Apple keyboard) checks every item or clears them all, and Shift with Up or Down Arrow moves and checks. Shift+Space checks every item from the one last checked to the focused one, and Control+Shift+Home or End checks every item from the focused one to the first or the last, then moves there, as the tree pattern's range keys do. A tree with no name of its own is announced as "Tree", which says nothing about what it holds, so a development build warns once with the kind 'missing-name' where neither 'label' nor an 'aria-label' names it. Removing the item that has focus moves focus to the item after it among its siblings, or the one before, or its parent, so focus stays in the tree. **'reorderable' lets you move items among their siblings.** Alt with Up or Down moves the focused item a place, and Alt with Home or End to the first or the last place among its siblings, as the APG's rearrangeable listbox does. Each row gets a grip at its far end: drag it to move the item, and the tree scrolls near an edge. A click on a grip picks the item up and a click on one of its siblings drops it there, which needs no drag. The arrows move an item picked up that way, Enter or Space drops it, and Escape puts it back. The tree says each step in its 'live' region. A drop sends 'helix-before-reorder', which you can refuse, and then 'helix-reorder', whose 'keys' hold the siblings in the new order. **You move the items**: the tree moves no element of yours, and focus follows the moved item once you have. **Alt with the arrow along the line moves an item into another branch.** Alt with the arrow that opens a branch (Right on a left-to-right page) puts the focused item last inside the item before it, and opens that item; Alt with the other arrow puts it after its parent, a level out. The same 'helix-before-reorder' and 'helix-reorder' are sent, with 'parent' naming the branch it moves into by its key, '''' for the top level, and 'keys' holding that branch's items in their new order. The tree says the move with 'moved-into-label'. */
17957
18129
  "helix-headless-tree": DefineCustomElement<
17958
18130
  HelixHeadlessTree,
17959
18131
  HelixHeadlessTreeVueProps,