@fusion.dev/helix-headless 0.157.0 → 0.159.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 (56) hide show
  1. package/custom-elements.json +851 -56
  2. package/dist/app-header/root/app-header-root.d.ts +59 -12
  3. package/dist/app-header/root/app-header-root.js +68 -29
  4. package/dist/button/root/button-root.d.ts +8 -0
  5. package/dist/button/root/button-root.js +4 -0
  6. package/dist/button-group/root/button-group-root.d.ts +20 -7
  7. package/dist/button-group/root/button-group-root.js +30 -5
  8. package/dist/command/root/command-root.d.ts +19 -5
  9. package/dist/command/root/command-root.js +14 -4
  10. package/dist/data-table/root/data-table-root.js +5 -2
  11. package/dist/element-events.generated.js +7 -1
  12. package/dist/lightbox/item/lightbox-item.d.ts +7 -1
  13. package/dist/lightbox/item/lightbox-item.js +15 -2
  14. package/dist/lightbox/root/lightbox-root.d.ts +8 -4
  15. package/dist/lightbox/root/lightbox-root.js +9 -1
  16. package/dist/lightbox/zoom-controller.d.ts +13 -4
  17. package/dist/lightbox/zoom-controller.js +17 -0
  18. package/dist/list/item/list-item.d.ts +15 -1
  19. package/dist/list/item/list-item.js +20 -1
  20. package/dist/list/root/list-root.d.ts +29 -1
  21. package/dist/list/root/list-root.js +44 -10
  22. package/dist/listbox/root/listbox-root.d.ts +19 -2
  23. package/dist/listbox/root/listbox-root.js +16 -8
  24. package/dist/map/root/map-root.d.ts +4 -0
  25. package/dist/map/root/map-root.js +1 -1
  26. package/dist/menu/item/menu-item.js +1 -1
  27. package/dist/menu/root/menu-root.d.ts +6 -2
  28. package/dist/menu/root/menu-root.js +9 -2
  29. package/dist/number-input/root/number-input-root.d.ts +7 -4
  30. package/dist/number-input/root/number-input-root.js +3 -3
  31. package/dist/progress/root/progress-root.js +1 -1
  32. package/dist/select/root/select-root.d.ts +8 -1
  33. package/dist/select/root/select-root.js +8 -5
  34. package/dist/skeleton/root/skeleton-root.d.ts +2 -1
  35. package/dist/skeleton/root/skeleton-root.js +1 -1
  36. package/dist/steps/root/steps-root.js +8 -6
  37. package/dist/steps/step/step.d.ts +9 -0
  38. package/dist/steps/step/step.js +19 -2
  39. package/dist/tabs/panel/tab-panel.d.ts +22 -1
  40. package/dist/tabs/panel/tab-panel.js +22 -1
  41. package/dist/tabs/root/tabs-root.d.ts +21 -5
  42. package/dist/tabs/root/tabs-root.js +24 -13
  43. package/dist/tabs/tab/tab.d.ts +4 -2
  44. package/dist/tabs/tab/tab.js +3 -1
  45. package/dist/toast/item/toast-item.d.ts +27 -8
  46. package/dist/toast/item/toast-item.js +47 -11
  47. package/dist/toast/root/toast-root.d.ts +24 -1
  48. package/dist/toast/root/toast-root.js +54 -0
  49. package/dist/tour/root/tour-root.d.ts +34 -0
  50. package/dist/tour/root/tour-root.js +92 -3
  51. package/dist/tour/stop/tour-stop.d.ts +33 -1
  52. package/dist/tour/stop/tour-stop.js +12 -1
  53. package/lint.json +1 -1
  54. package/package.json +5 -5
  55. package/types/jsx.d.ts +667 -102
  56. package/types/vue.d.ts +148 -23
@@ -1707,7 +1707,7 @@
1707
1707
  "text": "HTMLElement | undefined"
1708
1708
  }
1709
1709
  },
1710
- "description": "The tab stop after this element on the page, or the one before it at the\nend, for a lone element whose removal would drop focus to the body.\n\n**A lone Callout or Announcement had nowhere to hand focus**, so a\nkeyboard reader who dismissed one started again from the top of the\npage. React Aria's Toast hands focus on the same way. Read before the\nevent, in the order Tab reaches the stops, while this element's own are\nstill among them.",
1710
+ "description": "The tab stop after this element on the page, or the one before it at the\nend, for an element whose removal would drop focus to the body because\nno neighbor of its kind has a control to take it.\n\n**A lone Callout or Announcement had nowhere to hand focus**, so a\nkeyboard reader who dismissed one started again from the top of the\npage. React Aria's Toast hands focus on the same way. Read before the\nevent, in the order Tab reaches the stops, while this element's own are\nstill among them.",
1711
1711
  "inheritedFrom": {
1712
1712
  "name": "MixinDismissible",
1713
1713
  "module": "src/mixins/mixin-dismissible/mixin-dismissible.ts"
@@ -2303,7 +2303,7 @@
2303
2303
  "declarations": [
2304
2304
  {
2305
2305
  "kind": "class",
2306
- "description": "Tracks whether the page has scrolled and sets the custom state `scrolled`, so\nthe styled tier can lift the bar without a scroll handler of its own. The\nstate is read when the element connects. A fresh load starts at the top,\nwhich matches the server markup, and a reload partway down the page is\ncorrected on hydration.\n\nThe element uses a custom state because an attribute such as `data-scrolled`,\nwritten onto its own host, is one the server did not send. A hydrating\nframework would report a mismatch whenever the page reloads far enough down.\n`ElementInternals.states` is not in the DOM, so hydration has nothing to\ncompare. Select the state with `:state(scrolled)`.\n\nThe page is the window unless `scroller` names the element that scrolls, for\nan app shell whose content scrolls inside a container.\n\n**Set `hide-on-scroll` for a bar that moves out of the way.** Scrolling down\npast the bar's own height hides it, and scrolling up shows it again, as does\nfocus moving into it. The custom state `hidden` is on the host while it is\nhidden, and the styled tier slides a `sticky` bar up out of view.\n\n**Set `fold-below` to fold the middle region on a narrow screen.** Below that\nmany pixels of the bar's own width, the middle region is hidden behind a\ntoggle at the end of the bar, named by `menu-label`. The toggle says whether\nthe region is open with `aria-expanded`, and the region opens below the row.\nEscape closes it and puts focus back on the toggle. The custom state\n`folded` is on the host while the bar is that narrow, and `open` while the\nfolded region is open. A server serves the bar unfolded, and the browser\nfolds it once it has measured it.\n\nThe host is the page's `banner` landmark. Placed inside `main`, `article`,\n`aside`, `nav` or `section`, it is a plain box instead, as a native\n`<header>` is there, so a header inside a card or a pane does not add a\nsecond banner. The ancestors are read as the accessibility tree reads them,\nthrough the slots that take the header in, so one slotted into a component\nthat draws a `<nav>`, such as `Navigation`, is not a banner either. A server\ncannot see the ancestors, so it serves the banner and the browser corrects\nit when the element connects.",
2306
+ "description": "Tracks whether the page has scrolled and sets the custom state `scrolled`, so\nthe styled tier can lift the bar without a scroll handler of its own. The\nstate is read when the element connects. A fresh load starts at the top,\nwhich matches the server markup, and a reload partway down the page is\ncorrected on hydration.\n\nThe element uses a custom state because an attribute such as `data-scrolled`,\nwritten onto its own host, is one the server did not send. A hydrating\nframework would report a mismatch whenever the page reloads far enough down.\n`ElementInternals.states` is not in the DOM, so hydration has nothing to\ncompare. Select the state with `:state(scrolled)`.\n\nThe page is the window unless `scroller` names the element that scrolls, for\nan app shell whose content scrolls inside a container.\n\n**Set `hide-on-scroll` for a bar that moves out of the way.** Scrolling down\npast the bar's own height hides it, and scrolling up shows it again, as does\nfocus moving into it. The custom state `hidden` is on the host while it is\nhidden, and the styled tier slides a `sticky` bar up out of view.\n\n**Set `fold-below` to fold the middle region on a narrow screen.** Below that\nmany pixels of the bar's own width, the middle region is hidden behind a\ntoggle at the end of the bar, named by `menu-label`, or at its start with\n`toggle-placement=\"start\"`. The toggle says whether the region is open with\n`aria-expanded`, and the region opens below the row. The region follows the\ntoggle's region in focus order, so Tab from the toggle at the end goes into\nthe open region. The custom state `folded` is on the host while the bar is\nthat narrow, and `open` while the folded region is open. A server serves the\nbar unfolded, and the browser folds it once it has measured it.\n\n**`open` says whether the folded region is open, and setting it opens or\ncloses the region.** `requestOpen(true)` and `requestOpen(false)` do the same\nand send `helix-before-open` or `helix-before-close` first, which you can\ncancel, and `toggleOpen()` asks for the opposite. `toggle` follows every\nchange. The region closes on Escape, which puts focus back on the toggle,\nwhen focus moves to something outside the header, and on a press outside\nit. A bar that widens past `fold-below` closes its region.\n\nThe host is the page's `banner` landmark. Placed inside `main`, `article`,\n`aside`, `nav` or `section`, it is a plain box instead, as a native\n`<header>` is there, so a header inside a card or a pane does not add a\nsecond banner. The ancestors are read as the accessibility tree reads them,\nthrough the slots that take the header in, so one slotted into a component\nthat draws a `<nav>`, such as `Navigation`, is not a banner either. A server\ncannot see the ancestors, so it serves the banner and the browser corrects\nit when the element connects.",
2307
2307
  "name": "HelixHeadlessAppHeader",
2308
2308
  "cssParts": [
2309
2309
  {
@@ -2389,6 +2389,19 @@
2389
2389
  "description": "Hides the bar as the page scrolls down past it, and shows it again as the\npage scrolls up.",
2390
2390
  "attribute": "hide-on-scroll"
2391
2391
  },
2392
+ {
2393
+ "kind": "field",
2394
+ "name": "menuLabel",
2395
+ "type": {
2396
+ "text": "string"
2397
+ },
2398
+ "default": "'Menu'",
2399
+ "description": "The name of the toggle that opens a folded middle region.",
2400
+ "attribute": "menu-label",
2401
+ "helix": {
2402
+ "words": true
2403
+ }
2404
+ },
2392
2405
  {
2393
2406
  "kind": "field",
2394
2407
  "name": "folded",
@@ -2406,8 +2419,8 @@
2406
2419
  "text": "boolean"
2407
2420
  },
2408
2421
  "privacy": "private",
2409
- "default": "false",
2410
- "description": "Whether the folded middle region is open."
2422
+ "description": "Whether the folded middle region is open and showing.",
2423
+ "readonly": true
2411
2424
  },
2412
2425
  {
2413
2426
  "kind": "field",
@@ -2446,7 +2459,7 @@
2446
2459
  }
2447
2460
  }
2448
2461
  ],
2449
- "description": "Folds the middle region where the bar is narrower than `fold-below`."
2462
+ "description": "Folds the middle region where the bar is narrower than `fold-below`. A bar\nthat widens closes its region, so it starts closed when it folds again;\none that narrows keeps an `open` you set."
2450
2463
  },
2451
2464
  {
2452
2465
  "kind": "field",
@@ -2462,6 +2475,41 @@
2462
2475
  "readonly": true,
2463
2476
  "description": "Escape in the open region closes it and puts focus back on the toggle."
2464
2477
  },
2478
+ {
2479
+ "kind": "field",
2480
+ "name": "handleFocusOut",
2481
+ "privacy": "private",
2482
+ "readonly": true,
2483
+ "description": "Closes the open region when focus moves to something outside the header.\nFocus leaving the window has no `relatedTarget`, and closes nothing."
2484
+ },
2485
+ {
2486
+ "kind": "field",
2487
+ "name": "handleOutsidePress",
2488
+ "privacy": "private",
2489
+ "readonly": true,
2490
+ "description": "Closes the open region on a press outside the header."
2491
+ },
2492
+ {
2493
+ "kind": "field",
2494
+ "name": "pressing",
2495
+ "type": {
2496
+ "text": "boolean"
2497
+ },
2498
+ "privacy": "private",
2499
+ "default": "false",
2500
+ "description": "Whether the outside press is listened for, which is while the region is open."
2501
+ },
2502
+ {
2503
+ "kind": "method",
2504
+ "name": "watchPresses",
2505
+ "privacy": "private",
2506
+ "return": {
2507
+ "type": {
2508
+ "text": "void"
2509
+ }
2510
+ },
2511
+ "description": "Listens for a press outside while the folded region is open, and only then."
2512
+ },
2465
2513
  {
2466
2514
  "kind": "field",
2467
2515
  "name": "away",
@@ -2529,25 +2577,22 @@
2529
2577
  },
2530
2578
  {
2531
2579
  "kind": "field",
2532
- "name": "menuLabel",
2580
+ "name": "scroller",
2533
2581
  "type": {
2534
- "text": "string"
2582
+ "text": "string | undefined"
2535
2583
  },
2536
- "default": "'Menu'",
2537
- "description": "The name of the toggle that opens a folded middle region.",
2538
- "attribute": "menu-label",
2539
- "helix": {
2540
- "words": true
2541
- }
2584
+ "description": "The id of the element whose scrolling lifts the bar, for an app shell that\nscrolls a container instead of the window. Unset is the window.",
2585
+ "attribute": "scroller"
2542
2586
  },
2543
2587
  {
2544
2588
  "kind": "field",
2545
- "name": "scroller",
2589
+ "name": "togglePlacement",
2546
2590
  "type": {
2547
- "text": "string | undefined"
2591
+ "text": "'start' | undefined"
2548
2592
  },
2549
- "description": "The id of the element whose scrolling lifts the bar, for an app shell that\nscrolls a container instead of the window. Unset is the window.",
2550
- "attribute": "scroller"
2593
+ "description": "Where the toggle that opens a folded middle region sits: at the end of the\nbar, after the trailing content, or with `start`, before the leading\ncontent.\n\nOptional, so the resting bar writes no attribute onto the host.",
2594
+ "attribute": "toggle-placement",
2595
+ "reflects": true
2551
2596
  },
2552
2597
  {
2553
2598
  "kind": "field",
@@ -2636,6 +2681,126 @@
2636
2681
  },
2637
2682
  "description": "The glyph on the toggle that opens a folded middle region, behind a seam:\nslot fallback, so a consumer replaces it by slotting, and a method, so a\ntier above replaces it by overriding."
2638
2683
  },
2684
+ {
2685
+ "kind": "field",
2686
+ "name": "defaultOpen",
2687
+ "type": {
2688
+ "text": "boolean"
2689
+ },
2690
+ "default": "false",
2691
+ "description": "Whether the element starts open. Ignored once `open` is written.",
2692
+ "attribute": "default-open",
2693
+ "inheritedFrom": {
2694
+ "name": "MixinControllerOpen",
2695
+ "module": "src/mixins/mixin-controller-open/mixin-controller-open.ts"
2696
+ }
2697
+ },
2698
+ {
2699
+ "kind": "field",
2700
+ "name": "open",
2701
+ "type": {
2702
+ "text": "boolean"
2703
+ },
2704
+ "description": "Whether the element is open.\n\nOne property, not two, so `dialog.open` answers the question anyone\nasking it meant. Writing always applies; `<helix-dialog open>` is the\nsame statement in markup.\n\n**Not reflected, and that is required rather than tidy.** Reflection\nwrites the resolved state back as an attribute, so an element that opened\nitself would put `open` on its own host: cloned, serialized for\nhydration, or diffed by a framework, it comes back holding whatever the\nlast reader did rather than what the author wrote. `:state(open)` carries\nthe resolved state for stylesheets, which is what the mirror is for.",
2705
+ "attribute": "open",
2706
+ "inheritedFrom": {
2707
+ "name": "MixinControllerOpen",
2708
+ "module": "src/mixins/mixin-controller-open/mixin-controller-open.ts"
2709
+ }
2710
+ },
2711
+ {
2712
+ "kind": "field",
2713
+ "name": "openState",
2714
+ "type": {
2715
+ "text": "boolean | undefined"
2716
+ },
2717
+ "privacy": "private",
2718
+ "default": "undefined",
2719
+ "description": "The state, whoever set it, and `undefined` until somebody has.\n\nPrefixed, and it has to be. These mixins compose onto one prototype\nchain, `Select` takes this one and `MixinControllerValue` together, and\nTypeScript's `private` is a compile-time fiction: two mixins with a field\ncalled `state` share one property on the instance, and the second one\nsilently overwrites the first. Measured, as a select whose `value` came\nback holding its `open` boolean.\n\nOne field and not two. Writing always applies, the way a native control\ndoes when a script assigns to it.",
2720
+ "inheritedFrom": {
2721
+ "name": "MixinControllerOpen",
2722
+ "module": "src/mixins/mixin-controller-open/mixin-controller-open.ts"
2723
+ }
2724
+ },
2725
+ {
2726
+ "kind": "field",
2727
+ "name": "announcedOpen",
2728
+ "type": {
2729
+ "text": "boolean | undefined"
2730
+ },
2731
+ "privacy": "private",
2732
+ "default": "undefined",
2733
+ "description": "The state `toggle` last reported, and `undefined` before the first update.\n\n`requestOpen` announces at once. An assignment to `open` announces here,\nonce it has rendered, so a consumer binding `toggle` hears every change\nthat a `close` listener on a dialog hears. The first update sets it and\nannounces nothing, because a seed is where the element starts.",
2734
+ "inheritedFrom": {
2735
+ "name": "MixinControllerOpen",
2736
+ "module": "src/mixins/mixin-controller-open/mixin-controller-open.ts"
2737
+ }
2738
+ },
2739
+ {
2740
+ "kind": "method",
2741
+ "name": "requestOpen",
2742
+ "return": {
2743
+ "type": {
2744
+ "text": "boolean"
2745
+ }
2746
+ },
2747
+ "parameters": [
2748
+ {
2749
+ "name": "next",
2750
+ "type": {
2751
+ "text": "boolean"
2752
+ }
2753
+ }
2754
+ ],
2755
+ "description": "Requests that the element open or close, and returns whether the change\nwas applied.\n\nAnnounces before it acts, so `preventDefault()` on the `helix-before-open` or\n`helix-before-close` is a refusal and nothing moves. Nobody refusing means the\nelement opens or closes itself, whether or not a consumer declared\n`open`: a declared property is a seed and a correction, and a consumer\nwho wants the decision for themselves refuses it and assigns their own.",
2756
+ "inheritedFrom": {
2757
+ "name": "MixinControllerOpen",
2758
+ "module": "src/mixins/mixin-controller-open/mixin-controller-open.ts"
2759
+ },
2760
+ "type": {
2761
+ "text": "requestOpen(next: boolean) => boolean"
2762
+ }
2763
+ },
2764
+ {
2765
+ "kind": "method",
2766
+ "name": "announceToggle",
2767
+ "privacy": "private",
2768
+ "return": {
2769
+ "type": {
2770
+ "text": "void"
2771
+ }
2772
+ },
2773
+ "parameters": [
2774
+ {
2775
+ "name": "open",
2776
+ "type": {
2777
+ "text": "boolean"
2778
+ }
2779
+ }
2780
+ ],
2781
+ "description": "Says the state moved, under the platform's own name and in its shape.\n\n**A native `toggle` from inside a shadow root reaches nobody**, because\nit neither bubbles nor composes, so the ten families showing a\n`popover=\"manual\"` panel and the two rendering a real `<dialog>` announce\nnothing to a consumer. The disclosures have no native element to fire\nanything at all: `AccordionItem` and `TreeItem` are `aria-expanded` and\n`hidden` written by hand, which is `<details>`'s job done manually.\n\n**From here rather than from `PopoverController`.** The controller covers\neleven families and the mixin covers sixteen, so announcing from both\nwould announce twice on the ten they share. What `toggle` reports is the\n*state*, and the state is this mixin's; the controller is a way of\nputting a panel on the screen.\n\n**`newState` and `oldState`, because that is the platform's shape**, so a\nconsumer arriving from `<details>` reads the same two words. Not\ncancelable: the before events are the request, and a second cancelable\nevent for one transition is two answers to one question.",
2782
+ "inheritedFrom": {
2783
+ "name": "MixinControllerOpen",
2784
+ "module": "src/mixins/mixin-controller-open/mixin-controller-open.ts"
2785
+ }
2786
+ },
2787
+ {
2788
+ "kind": "method",
2789
+ "name": "toggleOpen",
2790
+ "return": {
2791
+ "type": {
2792
+ "text": "boolean"
2793
+ }
2794
+ },
2795
+ "description": "Requests the opposite of the current state.",
2796
+ "inheritedFrom": {
2797
+ "name": "MixinControllerOpen",
2798
+ "module": "src/mixins/mixin-controller-open/mixin-controller-open.ts"
2799
+ },
2800
+ "type": {
2801
+ "text": "toggleOpen() => boolean"
2802
+ }
2803
+ },
2639
2804
  {
2640
2805
  "kind": "field",
2641
2806
  "name": "tier",
@@ -2977,6 +3142,22 @@
2977
3142
  }
2978
3143
  ],
2979
3144
  "events": [
3145
+ {
3146
+ "type": {
3147
+ "text": "HelixBeforeCloseEvent"
3148
+ },
3149
+ "description": "The folded region is about to close. Cancelable: cancel it to keep it open.",
3150
+ "name": "helix-before-close",
3151
+ "reactProp": "onhelix-before-close"
3152
+ },
3153
+ {
3154
+ "type": {
3155
+ "text": "HelixBeforeOpenEvent"
3156
+ },
3157
+ "description": "The folded region is about to open. Cancelable: cancel it to keep it closed.",
3158
+ "name": "helix-before-open",
3159
+ "reactProp": "onhelix-before-open"
3160
+ },
2980
3161
  {
2981
3162
  "type": {
2982
3163
  "text": "HelixScrolledEvent"
@@ -2984,6 +3165,18 @@
2984
3165
  "description": "Fired when the page crosses the scroll threshold, with the new state. A custom state cannot be observed the way an attribute can, so listen for this event to follow it. The event uses the header's own threshold and hysteresis, so you do not need a second scroll listener.",
2985
3166
  "name": "helix-scrolled",
2986
3167
  "reactProp": "onhelix-scrolled"
3168
+ },
3169
+ {
3170
+ "name": "toggle",
3171
+ "type": {
3172
+ "text": "ToggleEvent"
3173
+ },
3174
+ "description": "The folded region opened or closed. The event carries `newState` and `oldState`.",
3175
+ "inheritedFrom": {
3176
+ "name": "MixinControllerOpen",
3177
+ "module": "src/mixins/mixin-controller-open/mixin-controller-open.ts"
3178
+ },
3179
+ "reactProp": "ontoggle"
2987
3180
  }
2988
3181
  ],
2989
3182
  "attributes": [
@@ -3028,6 +3221,39 @@
3028
3221
  },
3029
3222
  "description": "The id of the element whose scrolling lifts the bar, for an app shell that\nscrolls a container instead of the window. Unset is the window.",
3030
3223
  "fieldName": "scroller"
3224
+ },
3225
+ {
3226
+ "name": "toggle-placement",
3227
+ "type": {
3228
+ "text": "'start' | undefined"
3229
+ },
3230
+ "description": "Where the toggle that opens a folded middle region sits: at the end of the\nbar, after the trailing content, or with `start`, before the leading\ncontent.\n\nOptional, so the resting bar writes no attribute onto the host.",
3231
+ "fieldName": "togglePlacement"
3232
+ },
3233
+ {
3234
+ "name": "default-open",
3235
+ "type": {
3236
+ "text": "boolean"
3237
+ },
3238
+ "default": "false",
3239
+ "description": "Whether the element starts open. Ignored once `open` is written.",
3240
+ "fieldName": "defaultOpen",
3241
+ "inheritedFrom": {
3242
+ "name": "MixinControllerOpen",
3243
+ "module": "src/mixins/mixin-controller-open/mixin-controller-open.ts"
3244
+ }
3245
+ },
3246
+ {
3247
+ "name": "open",
3248
+ "type": {
3249
+ "text": "boolean"
3250
+ },
3251
+ "description": "Whether the element is open.\n\nOne property, not two, so `dialog.open` answers the question anyone\nasking it meant. Writing always applies; `<helix-dialog open>` is the\nsame statement in markup.\n\n**Not reflected, and that is required rather than tidy.** Reflection\nwrites the resolved state back as an attribute, so an element that opened\nitself would put `open` on its own host: cloned, serialized for\nhydration, or diffed by a framework, it comes back holding whatever the\nlast reader did rather than what the author wrote. `:state(open)` carries\nthe resolved state for stylesheets, which is what the mirror is for.",
3252
+ "fieldName": "open",
3253
+ "inheritedFrom": {
3254
+ "name": "MixinControllerOpen",
3255
+ "module": "src/mixins/mixin-controller-open/mixin-controller-open.ts"
3256
+ }
3031
3257
  }
3032
3258
  ],
3033
3259
  "cssStates": [
@@ -3056,6 +3282,12 @@
3056
3282
  }
3057
3283
  }
3058
3284
  ],
3285
+ "mixins": [
3286
+ {
3287
+ "name": "MixinControllerOpen",
3288
+ "package": "@fusion.dev/helix-core"
3289
+ }
3290
+ ],
3059
3291
  "superclass": {
3060
3292
  "name": "HelixElement",
3061
3293
  "package": "@fusion.dev/helix-core"
@@ -10275,7 +10507,7 @@
10275
10507
  "declarations": [
10276
10508
  {
10277
10509
  "kind": "class",
10278
- "description": "Sets `role=\"group\"` on the host through internals, and `label` names the\ngroup. Without a name, a screen reader announces the buttons as separate\ncontrols, and a development build warns once with the kind `missing-name`.\n\nThe group does not manage focus, so each button keeps its own tab stop. For\none tab stop with arrow keys between a mix of controls, the APG toolbar\npattern, use Toolbar.\n\nButtons are slotted, so they stay your own elements and keep their own\nappearance and size.\n\n**Buttons that stay pressed.** With `selection-mode`, each button with a\n`value` is a toggle button: a press presses or releases it, and it says so\nwith `aria-pressed`. `single` keeps one pressed at a time, and a press on the\npressed one releases it. `multiple` lets any number be pressed. `value` is\nthe pressed values, comma separated. A press sends a cancelable\n`helix-before-change` with the value it would leave, then `change`.\n\nThe pressed state is written on the control inside each button's shadow\nroot, so the markup you rendered is never changed and a framework hydrating\nit sees what its server sent. That is also why only Helix buttons are\ntoggles: a native `<button>` or a button without a `value` stays a plain\naction button in the group, and a native one without its own\n`aria-pressed` warns once, with the runtime kind `untold-toggle`. The inner\ncontrol also carries\n`--button-group-pressed`, `1` or `0`, for a `::part(button)` rule of yours.\n\nUse Toggle Group instead for a choice that belongs in a form, or one where\nthe arrow keys choose as they move: it is a `radiogroup` of options with a\nform value, `required` and validation. A Button Group in a selection mode is\na set of actions that stay on, such as bold and italic, or a view that a\npress switches, and it submits nothing.\n\n**Keyboard.** In a selection mode the group is one tab stop: the button\nfocus was last on, then the first pressed one, then the first one.\n\n| Key | What it does |\n|---|---|\n| Right, Down | Moves to the next button, from the last back to the first. |\n| Left, Up | Moves to the button before, from the first round to the last. |\n| Home, End | Moves to the first or the last button. |\n| Space, Enter | Presses or releases the focused button. |\n\nLeft and Right swap on a right-to-left page, and a disabled button is\npassed over. In a selection mode the group is a `toolbar`, with\n`aria-orientation` under `orientation=\"vertical\"`. Inside a toolbar it stays\na named `group`, and the toolbar's own arrow keys walk its buttons, so a\nreader meets one toolbar.",
10510
+ "description": "Sets `role=\"group\"` on the host through internals, and `label` names the\ngroup. Without a name, a screen reader announces the buttons as separate\ncontrols, and a development build warns once with the kind `missing-name`.\n\nThe group does not manage focus, so each button keeps its own tab stop. For\none tab stop with arrow keys between a mix of controls, the APG toolbar\npattern, use Toolbar.\n\nButtons are slotted, so they stay your own elements and keep their own\nappearance and size.\n\n**Buttons that stay pressed.** With `selection-mode`, each button with a\n`value` is a toggle button: a press presses or releases it. `multiple` lets\nany number be pressed, and each button says so with `aria-pressed`. `single`\nkeeps one pressed at a time: the group is a `radiogroup` and each button a\n`radio` that says so with `aria-checked`, as React Aria's toggle button\ngroup is. A press on the pressed one releases it, unless\n`disallow-empty-selection` keeps one pressed. `value` is the pressed values,\ncomma separated. A press sends a cancelable `helix-before-change` with the\nvalue it would leave, then `change`. A pressed Helix button has\n`:state(pressed)` on its own element.\n\nThe pressed state is written on the control inside each button's shadow\nroot, so the markup you rendered is never changed and a framework hydrating\nit sees what its server sent. That is also why only Helix buttons are\ntoggles: a native `<button>` or a button without a `value` stays a plain\naction button in the group, and a native one without its own\n`aria-pressed` warns once, with the runtime kind `untold-toggle`. The inner\ncontrol also carries\n`--button-group-pressed`, `1` or `0`, for a `::part(button)` rule of yours.\n\nUse Toggle Group instead for a choice that belongs in a form, or one where\nthe arrow keys choose as they move: it is a `radiogroup` of options with a\nform value, `required` and validation. A Button Group in a selection mode is\na set of actions that stay on, such as bold and italic, or a view that a\npress switches, and it submits nothing.\n\n**Keyboard.** In a selection mode the group is one tab stop: the button\nfocus was last on, then the first pressed one, then the first one.\n\n| Key | What it does |\n|---|---|\n| Right, Down | Moves to the next button, from the last back to the first. |\n| Left, Up | Moves to the button before, from the first round to the last. |\n| Home, End | Moves to the first or the last button. |\n| Space, Enter | Presses or releases the focused button. |\n\nLeft and Right swap on a right-to-left page, and a disabled button is\npassed over. Under `multiple` the group is a `toolbar`, with\n`aria-orientation` under `orientation=\"vertical\"`. Inside a toolbar it stays\na named `group`, and the toolbar's own arrow keys walk its buttons, so a\nreader meets one toolbar. Under `single` it is a `radiogroup` either way.",
10279
10511
  "name": "HelixHeadlessButtonGroup",
10280
10512
  "cssProperties": [
10281
10513
  {
@@ -10290,6 +10522,16 @@
10290
10522
  }
10291
10523
  ],
10292
10524
  "members": [
10525
+ {
10526
+ "kind": "field",
10527
+ "name": "disallowEmptySelection",
10528
+ "type": {
10529
+ "text": "boolean"
10530
+ },
10531
+ "default": "false",
10532
+ "description": "Keeps at least one button pressed once one is, as React Aria's\n`disallowEmptySelection`: a press that would leave none pressed is\nrefused.",
10533
+ "attribute": "disallow-empty-selection"
10534
+ },
10293
10535
  {
10294
10536
  "kind": "field",
10295
10537
  "name": "label",
@@ -10479,7 +10721,7 @@
10479
10721
  "description": "Whether the button is pressed, or undefined where it is not a toggle."
10480
10722
  }
10481
10723
  ],
10482
- "description": "Says on a button's control whether it is pressed, or that it is no toggle\nat all where `pressed` is undefined. A styled tier draws the look here."
10724
+ "description": "Says on a button's control whether it is pressed, or that it is no toggle\nat all where `pressed` is undefined. A styled tier draws the look here.\n\nUnder `single` the control is a `radio` that says so with `aria-checked`,\nand under `multiple` a toggle button that says so with `aria-pressed`."
10483
10725
  },
10484
10726
  {
10485
10727
  "kind": "field",
@@ -10861,6 +11103,15 @@
10861
11103
  }
10862
11104
  ],
10863
11105
  "attributes": [
11106
+ {
11107
+ "name": "disallow-empty-selection",
11108
+ "type": {
11109
+ "text": "boolean"
11110
+ },
11111
+ "default": "false",
11112
+ "description": "Keeps at least one button pressed once one is, as React Aria's\n`disallowEmptySelection`: a press that would leave none pressed is\nrefused.",
11113
+ "fieldName": "disallowEmptySelection"
11114
+ },
10864
11115
  {
10865
11116
  "name": "label",
10866
11117
  "type": {
@@ -12343,6 +12594,10 @@
12343
12594
  "description": "The button is pending: `pending` is set.",
12344
12595
  "name": "pending"
12345
12596
  },
12597
+ {
12598
+ "description": "A Button Group in a selection mode has this button pressed.",
12599
+ "name": "pressed"
12600
+ },
12346
12601
  {
12347
12602
  "description": "Set one frame after the first render. Transitions wait for it, so an element does not animate its own arrival.",
12348
12603
  "name": "settled",
@@ -12691,7 +12946,7 @@
12691
12946
  "text": "HTMLElement | undefined"
12692
12947
  }
12693
12948
  },
12694
- "description": "The tab stop after this element on the page, or the one before it at the\nend, for a lone element whose removal would drop focus to the body.\n\n**A lone Callout or Announcement had nowhere to hand focus**, so a\nkeyboard reader who dismissed one started again from the top of the\npage. React Aria's Toast hands focus on the same way. Read before the\nevent, in the order Tab reaches the stops, while this element's own are\nstill among them.",
12949
+ "description": "The tab stop after this element on the page, or the one before it at the\nend, for an element whose removal would drop focus to the body because\nno neighbor of its kind has a control to take it.\n\n**A lone Callout or Announcement had nowhere to hand focus**, so a\nkeyboard reader who dismissed one started again from the top of the\npage. React Aria's Toast hands focus on the same way. Read before the\nevent, in the order Tab reaches the stops, while this element's own are\nstill among them.",
12695
12950
  "inheritedFrom": {
12696
12951
  "name": "MixinDismissible",
12697
12952
  "module": "src/mixins/mixin-dismissible/mixin-dismissible.ts"
@@ -40391,7 +40646,7 @@
40391
40646
  "declarations": [
40392
40647
  {
40393
40648
  "kind": "class",
40394
- "description": "The list is a `Listbox`, which handles filtering, the empty state, the match\nhighlight, `aria-activedescendant`, scrolling an option into view, and moving\nbetween options with the keyboard. The palette adds a dialog and a hotkey\nthat opens it.\n\nThe palette keeps no value. It is not a form control and submits nothing.\nChoosing an option dispatches `helix-select` once. To remember the last\ncommand, store it yourself. An option with `href` is a link to a page, which\nthe browser follows once the palette has closed.\n\nThe hotkey listener is on the document, so the hotkey works from anywhere on\nthe page, including inside another control's text field, whether or not the\npalette is open. `mod` means Command on a Mac and Control elsewhere, so you\nwrite one binding.\n\nWith `inline`, the palette is drawn in the page with no dialog, as a search\nover a list that is always shown.\n\n**Pages.** A command can open a page of commands of its own, as a palette\noffers \"Change theme\" and then the themes. Give the option `opens` with a\nname, and slot the page's commands as `page:` and that name:\n\n```html\n<helix-command>\n <helix-option value=\"theme\" opens=\"theme\">Change theme</helix-option>\n <helix-option value=\"dark\" slot=\"page:theme\">Dark</helix-option>\n <helix-option value=\"light\" slot=\"page:theme\">Light</helix-option>\n</helix-command>\n```\n\nChoosing the opener says `helix-select` with its value, and canceling it\nkeeps the page that is shown. The list then shows the page, named by the\nopener's words, and Backspace in an empty filter goes back. `page` says\nwhich page is shown.\n\nThe filter is cleared when the palette closes, so each opening starts from\nthe full list. Combobox and Select do the same. As typing narrows the list, a\nscreen reader hears how many commands are left, such as \"3 commands\".\n\n**Keyboard.** Focus goes to the filter field as the palette opens, and the\nhighlight moves through the commands while you type.\n\n| Key | What it does |\n|---|---|\n| `hotkey`, Command or Control with K by default | Opens the palette from anywhere on the page, or closes it. With `inline`, puts focus in its filter field. |\n| Down, Up | Moves the highlight to the next or the previous command, round from the last to the first. |\n| Page Down, Page Up | Moves the highlight by as many commands as the list shows at once. |\n| Home, End, Left, Right | Move the caret in the filter field. |\n| Enter | Runs the highlighted command, or follows it where it is a link, and closes the palette. On a command with `opens`, shows its page. |\n| Command or Control with Enter | Takes the highlighted command's `alternate` destination, where it has one. |\n| Backspace | In an empty filter on a page, goes back to the page before. |\n| Escape | Clears the filter. With the filter empty, closes the palette and puts focus back where it was. |\n| Tab | Stays in the palette, which is modal. With `inline`, moves on through the page. |\n\n**ARIA.** The palette is a modal `dialog` named by `label`, or with\n`inline` no dialog at all. Inside it the filter field is a `combobox` with\n`aria-activedescendant` on the highlighted command, and the commands are a\n`listbox` of `option`s. How many commands typing left, the empty text and\nthe loading text are said in a polite live region.",
40649
+ "description": "The list is a `Listbox`, which handles filtering, the empty state, the match\nhighlight, `aria-activedescendant`, scrolling an option into view, and moving\nbetween options with the keyboard. The palette adds a dialog and a hotkey\nthat opens it.\n\nThe palette keeps no value. It is not a form control and submits nothing.\nChoosing an option dispatches `helix-select` once. To remember the last\ncommand, store it yourself. An option with `href` is a link to a page, which\nthe browser follows once the palette has closed.\n\nThe hotkey listener is on the document, so the hotkey works from anywhere on\nthe page, including inside another control's text field, whether or not the\npalette is open. `mod` means Command on a Mac and Control elsewhere, so you\nwrite one binding.\n\nWith `inline`, the palette is drawn in the page with no dialog, as a search\nover a list that is always shown.\n\n**Pages.** A command can open a page of commands of its own, as a palette\noffers \"Change theme\" and then the themes. Give the option `opens` with a\nname, and slot the page's commands as `page:` and that name:\n\n```html\n<helix-command>\n <helix-option value=\"theme\" opens=\"theme\">Change theme</helix-option>\n <helix-option value=\"dark\" slot=\"page:theme\">Dark</helix-option>\n <helix-option value=\"light\" slot=\"page:theme\">Light</helix-option>\n</helix-command>\n```\n\nChoosing the opener says `helix-select` with its value, and canceling it\nkeeps the page that is shown. The list then shows the page, named by the\nopener's words, and a screen reader hears those words. Backspace in an empty\nfilter goes back, and a screen reader hears the name of the page it goes\nback to. `page` says which page is shown.\n\nThe filter is cleared when the palette closes, so each opening starts from\nthe full list. Combobox and Select do the same. As typing narrows the list, a\nscreen reader hears how many commands are left, such as \"3 commands\".\n\n**Keyboard.** Focus goes to the filter field as the palette opens, and the\nhighlight moves through the commands while you type.\n\n| Key | What it does |\n|---|---|\n| `hotkey`, Command or Control with K by default | Opens the palette from anywhere on the page, or closes it. With `inline`, puts focus in its filter field. |\n| Down, Up | Moves the highlight to the next or the previous command, round from the last to the first. |\n| Page Down, Page Up | Moves the highlight by as many commands as the list shows at once. |\n| Home, End, Left, Right | Move the caret in the filter field. |\n| Enter | Runs the highlighted command, or follows it where it is a link, and closes the palette. On a command with `opens`, shows its page. |\n| Command or Control with Enter | Takes the highlighted command's `alternate` destination, where it has one. |\n| Backspace | In an empty filter on a page, goes back to the page before. |\n| Escape | Clears the filter. With the filter empty, closes the palette and puts focus back where it was. |\n| Tab | Stays in the palette, which is modal. With `inline`, moves on through the page. |\n\n**ARIA.** The palette is a modal `dialog` named by `label`, or with\n`inline` no dialog at all. Inside it the filter field is a text field with\n`aria-autocomplete=\"list\"`, `aria-controls` on the list, and\n`aria-activedescendant` on the highlighted command, as the field of React\nAria's `Autocomplete` is. The commands are a `listbox` of `option`s. How many commands typing left, the empty text and\nthe loading text are said in a polite live region.",
40395
40650
  "name": "HelixHeadlessCommand",
40396
40651
  "cssParts": [
40397
40652
  {
@@ -40473,6 +40728,10 @@
40473
40728
  {
40474
40729
  "description": "The filter field.",
40475
40730
  "name": "listbox-search-field"
40731
+ },
40732
+ {
40733
+ "description": "The region a screen reader announces the page shown from, by the words of the command that opens it, drawn once there is one to say. Visually hidden in the styled tier.",
40734
+ "name": "live"
40476
40735
  }
40477
40736
  ],
40478
40737
  "slots": [
@@ -40543,6 +40802,14 @@
40543
40802
  "description": "How long typing rests before the commands are filtered, in milliseconds,\nso a palette filtered on a server sends one `helix-filter` for a word.\n`0` filters on every keystroke. See Listbox's `filter-delay`.",
40544
40803
  "attribute": "filter-delay"
40545
40804
  },
40805
+ {
40806
+ "kind": "field",
40807
+ "name": "filterMatch",
40808
+ "type": {
40809
+ "text": "((text: string, filter: string) => boolean) | undefined | undefined"
40810
+ },
40811
+ "description": "Whether a command is kept by the filter: a function given the command's\nwords and the filter, trimmed, that returns `true` to keep it showing, as\nReact Aria's `Autocomplete` takes `filter`. See Listbox's `filterMatch`.\n\nAbsent, a command is kept where its words hold the filter, in any case. A\nproperty only, there being no way to write a function in markup."
40812
+ },
40546
40813
  {
40547
40814
  "kind": "field",
40548
40815
  "name": "hotkey",
@@ -40752,6 +41019,14 @@
40752
41019
  ],
40753
41020
  "description": "Shows a page of commands, with the trail that leads back from it. The\nfilter starts empty, as it does on opening, and the field keeps focus."
40754
41021
  },
41022
+ {
41023
+ "kind": "field",
41024
+ "name": "status",
41025
+ "privacy": "private",
41026
+ "readonly": true,
41027
+ "default": "new StatusController(this)",
41028
+ "description": "The region the page shown is said from as it changes."
41029
+ },
40755
41030
  {
40756
41031
  "kind": "field",
40757
41032
  "name": "handleBack",
@@ -43288,6 +43563,14 @@
43288
43563
  "module": "src/button/root/button-root.ts"
43289
43564
  }
43290
43565
  },
43566
+ {
43567
+ "description": "A Button Group in a selection mode has this button pressed.",
43568
+ "name": "pressed",
43569
+ "inheritedFrom": {
43570
+ "name": "HelixHeadlessButton",
43571
+ "module": "src/button/root/button-root.ts"
43572
+ }
43573
+ },
43291
43574
  {
43292
43575
  "description": "Set one frame after the first render. Transitions wait for it, so an element does not animate its own arrival.",
43293
43576
  "name": "settled",
@@ -45597,6 +45880,13 @@
45597
45880
  "type": {
45598
45881
  "text": "boolean"
45599
45882
  }
45883
+ },
45884
+ {
45885
+ "name": "id",
45886
+ "optional": true,
45887
+ "type": {
45888
+ "text": "string"
45889
+ }
45600
45890
  }
45601
45891
  ],
45602
45892
  "description": "One cell, carrying its column's edge as a fact rather than as a decision.\n\n**A fact published rather than a property chosen**, which is what `Table`\ndoes with the same attribute: what lining up *means*, a `justify-content`\nfor a value that fits or a `text-align` for one that wraps, belongs to\nwhoever draws the cell. Written here as an inline `text-align` it was this\ntier choosing, in the tier that ships no CSS, and a consumer could not\noverrule it either, an inline declaration beating any `::part(cell)` rule\nthey wrote.\n\nOnly the three edges reach it, `text-align` being a string anybody can write and\nthis being a style attribute: `edgeOf` is that guard, and `Table` holds the\nsame value to the same three."
@@ -64523,7 +64813,7 @@
64523
64813
  "text": "HTMLElement | undefined"
64524
64814
  }
64525
64815
  },
64526
- "description": "The tab stop after this element on the page, or the one before it at the\nend, for a lone element whose removal would drop focus to the body.\n\n**A lone Callout or Announcement had nowhere to hand focus**, so a\nkeyboard reader who dismissed one started again from the top of the\npage. React Aria's Toast hands focus on the same way. Read before the\nevent, in the order Tab reaches the stops, while this element's own are\nstill among them.",
64816
+ "description": "The tab stop after this element on the page, or the one before it at the\nend, for an element whose removal would drop focus to the body because\nno neighbor of its kind has a control to take it.\n\n**A lone Callout or Announcement had nowhere to hand focus**, so a\nkeyboard reader who dismissed one started again from the top of the\npage. React Aria's Toast hands focus on the same way. Read before the\nevent, in the order Tab reaches the stops, while this element's own are\nstill among them.",
64527
64817
  "inheritedFrom": {
64528
64818
  "name": "MixinDismissible",
64529
64819
  "module": "src/mixins/mixin-dismissible/mixin-dismissible.ts"
@@ -77545,6 +77835,14 @@
77545
77835
  "module": "src/button/root/button-root.ts"
77546
77836
  }
77547
77837
  },
77838
+ {
77839
+ "description": "A Button Group in a selection mode has this button pressed.",
77840
+ "name": "pressed",
77841
+ "inheritedFrom": {
77842
+ "name": "HelixHeadlessButton",
77843
+ "module": "src/button/root/button-root.ts"
77844
+ }
77845
+ },
77548
77846
  {
77549
77847
  "description": "Set one frame after the first render. Transitions wait for it, so an element does not animate its own arrival.",
77550
77848
  "name": "settled",
@@ -84170,7 +84468,7 @@
84170
84468
  "declarations": [
84171
84469
  {
84172
84470
  "kind": "class",
84173
- "description": "Wraps one piece of content in the lightbox, such as a picture, a video frame,\nor a chart. The lightbox shows one item at a time, and the root decides\nwhich.\n\nEach item is a `group` with the role description `slide`, named by its\n`label` or, without one, by its place in the set, such as \"2 of 5\", as the\nAPG carousel pattern names a slide. The lightbox supplies both words, so they\nare translated on the lightbox.\n\nAn item that is not current is hidden and stays in the DOM, as a `TabPanel`\ndoes. Crawlers can read it, it is in the server-rendered markup, and an\n`<img>` that has decoded does not decode again when you go back to it.",
84471
+ "description": "Wraps one piece of content in the lightbox, such as a picture, a video frame,\nor a chart. The lightbox shows one item at a time, and the root decides\nwhich.\n\nEach item is a `group` with the role description `slide`, named by its\n`label` or, without one, by its place in the set, such as \"2 of 5\", as the\nAPG carousel pattern names a slide. The lightbox supplies both words, so they\nare translated on the lightbox. A `description`, while there is one,\ndescribes the group, so a screen reader says it with the name.\n\nAn item that is not current is hidden and stays in the DOM, as a `TabPanel`\ndoes. Crawlers can read it, it is in the server-rendered markup, and an\n`<img>` that has decoded does not decode again when you go back to it.",
84174
84472
  "name": "HelixHeadlessLightboxItem",
84175
84473
  "cssParts": [
84176
84474
  {
@@ -84219,6 +84517,23 @@
84219
84517
  "description": "The item's identifier. The root compares its `active` value against it.",
84220
84518
  "attribute": "value"
84221
84519
  },
84520
+ {
84521
+ "kind": "field",
84522
+ "name": "described",
84523
+ "type": {
84524
+ "text": "boolean"
84525
+ },
84526
+ "privacy": "private",
84527
+ "default": "false",
84528
+ "description": "Whether anything is slotted into `description`, which then describes the group."
84529
+ },
84530
+ {
84531
+ "kind": "field",
84532
+ "name": "readDescription",
84533
+ "privacy": "private",
84534
+ "readonly": true,
84535
+ "description": "Reads whether the `description` slot holds anything."
84536
+ },
84222
84537
  {
84223
84538
  "kind": "field",
84224
84539
  "name": "tier",
@@ -84651,7 +84966,7 @@
84651
84966
  "declarations": [
84652
84967
  {
84653
84968
  "kind": "class",
84654
- "description": "The frame around content you open, such as a picture, a video frame, or a\nchart. The lightbox draws no content of its own. It provides the frame, the\nkeyboard behavior, and text that states the current position in the set.\n\nThe modal behavior comes from a native `<dialog>` opened with `showModal()`,\nwhich provides the top layer, a backdrop, Escape to close, and `inert` on the\nrest of the document. Every way of closing goes through `requestOpen`, as in\n`Dialog` and `Drawer`.\n\nA lightbox shows one item at a time and has no scrolling track, so `active`\nholds the current item, as in `Tabs`. The arrow keys change the item while\nfocus stays in the dialog.\n\nSet `controls` for the viewer's own previous, next and close controls, named\nby `previous-label`, `next-label` and `dismiss-label`, whose glyphs you can\nreplace in the `previous-icon`, `next-icon` and `dismiss-icon` slots. Without\nit, compose the chrome yourself in the `header` and `footer` slots, with\nbuttons that send `--previous`, `--next` and `--close`.\n\n**Set `max-zoom` to let a reader zoom into the shown item**, such as `3`.\nTwo fingers pinch it, a double click or a double tap zooms all the way in\nabout the point pressed and back out, and once zoomed one pointer drags it\nabout. `+` and `-` zoom in and out from the keyboard, and `0` puts it back.\nThe scale and the offset are on the `viewport` part as `--lightbox-zoom`,\n`--lightbox-pan-x` and `--lightbox-pan-y`, written only while zoomed, and a\nswipe moves to the next item only while the item is at its own size. With\n`controls`, the viewer also draws zoom-out and zoom-in controls, for a\npointer with no wheel and no second finger. Once a reader stops zooming, the\nlive region says the new scale in the words of `zoom-status-label`, such as\n\"Zoomed to 150%\".\n\nEach item is a slide: a `group` with the role description in\n`slide-role-label`, named by its `label` or by `slide-label`. A touch or a pen\nswiped across the picture shows the next or the previous item, the way the\nline of text runs.\n\nA press on the empty area around the item closes the viewer, as a press on\nthe backdrop does. Under `max-zoom`, a press beside the item zooms on a\ndouble press and closes nothing, and only the space outside the viewport\ncloses the viewer. A press that dragged closes nothing.\n\n**Keyboard.** Opening moves focus to the viewer itself, which a screen\nreader names.\n\n| Key | What it does |\n|---|---|\n| Right, Down | Shows the next item. On a right-to-left page, Left does. While the item is zoomed, the arrows move about it instead. |\n| Left, Up | Shows the previous item. |\n| Home, End | Shows the first or the last item. |\n| `+`, `-`, `0` | Zooms in, zooms out, and puts the item back at its own size, where `max-zoom` allows zooming. |\n| Tab, Shift+Tab | Moves through the controls in the viewer, from the last round to the first and from the first round to the last. |\n| Escape | Closes the viewer. A `helix-before-close` listener can refuse. |\n\nA development build warns when a viewer opens with no `label`.\n\nThe chrome hides when there is no input, through `IdleController`, and comes\nback on a pointer move, a key press, or a focus. It stays while focus is on a\ncontrol in the header or the footer, so a keyboard reader is never left on\na control that has gone. `fullscreen` uses `FullscreenController`, as `Video`\ndoes. While the viewer is open, the page behind it does not scroll.",
84969
+ "description": "The frame around content you open, such as a picture, a video frame, or a\nchart. The lightbox draws no content of its own. It provides the frame, the\nkeyboard behavior, and text that states the current position in the set.\n\nThe modal behavior comes from a native `<dialog>` opened with `showModal()`,\nwhich provides the top layer, a backdrop, Escape to close, and `inert` on the\nrest of the document. Every way of closing goes through `requestOpen`, as in\n`Dialog` and `Drawer`.\n\nA lightbox shows one item at a time and has no scrolling track, so `active`\nholds the current item, as in `Tabs`. The arrow keys change the item while\nfocus stays in the dialog.\n\nSet `controls` for the viewer's own previous, next and close controls, named\nby `previous-label`, `next-label` and `dismiss-label`, whose glyphs you can\nreplace in the `previous-icon`, `next-icon` and `dismiss-icon` slots. Without\nit, compose the chrome yourself in the `header` and `footer` slots, with\nbuttons that send `--previous`, `--next` and `--close`.\n\n**Set `max-zoom` to let a reader zoom into the shown item**, such as `3`.\nTwo fingers pinch it, and so does a trackpad pinch or the wheel with Ctrl\nheld, about the point under the pointer. A double click or a double tap\nzooms all the way in about the point pressed and back out, and once zoomed\none pointer drags it about and the wheel moves it. `+` and `-` zoom in and out from the keyboard, and `0` puts it back.\nThe scale and the offset are on the `viewport` part as `--lightbox-zoom`,\n`--lightbox-pan-x` and `--lightbox-pan-y`, written only while zoomed, and a\nswipe moves to the next item only while the item is at its own size. With\n`controls`, the viewer also draws zoom-out and zoom-in controls, for a\npointer with no wheel and no second finger. Once a reader stops zooming, the\nlive region says the new scale in the words of `zoom-status-label`, such as\n\"Zoomed to 150%\".\n\nEach item is a slide: a `group` with the role description in\n`slide-role-label`, named by its `label` or by `slide-label`. A touch or a pen\nswiped across the picture shows the next or the previous item, the way the\nline of text runs.\n\nA press on the empty area around the item closes the viewer, as a press on\nthe backdrop does. Under `max-zoom`, a press beside the item zooms on a\ndouble press and closes nothing, and only the space outside the viewport\ncloses the viewer. A press that dragged closes nothing.\n\n**Keyboard.** Opening moves focus to the viewer itself, which a screen\nreader names.\n\n| Key | What it does |\n|---|---|\n| Right, Down | Shows the next item. On a right-to-left page, Left does. While the item is zoomed, the arrows move about it instead. |\n| Left, Up | Shows the previous item. |\n| Home, End | Shows the first or the last item. |\n| `+`, `-`, `0` | Zooms in, zooms out, and puts the item back at its own size, where `max-zoom` allows zooming. |\n| Tab, Shift+Tab | Moves through the controls in the viewer, from the last round to the first and from the first round to the last. |\n| Escape | Closes the viewer. A `helix-before-close` listener can refuse. |\n\nA development build warns when a viewer opens with no `label`.\n\nThe chrome hides when there is no input, through `IdleController`, and comes\nback on a pointer move, a key press, or a focus. It stays while focus is on a\ncontrol in the header or the footer, so a keyboard reader is never left on\na control that has gone. `fullscreen` uses `FullscreenController`, as `Video`\ndoes. While the viewer is open, the page behind it does not scroll.",
84655
84970
  "name": "HelixHeadlessLightbox",
84656
84971
  "cssProperties": [
84657
84972
  {
@@ -85042,6 +85357,13 @@
85042
85357
  "readonly": true,
85043
85358
  "default": "new FocusScopeController(this, { contain: () => this.open, contents: () => [ ...['header', '', 'footer'].flatMap( (name) => this.renderRoot ?.querySelector<HTMLSlotElement>(name ? `slot[name=\"${name}\"]` : 'slot:not([name])') ?.assignedElements({ flatten: true }) ?? [], ), /* And the controls the viewer draws itself. */ ...[...(this.dialog?.children ?? [])].filter((one) => one.localName === 'button'), ], surface: () => this.dialog, })"
85044
85359
  },
85360
+ {
85361
+ "kind": "field",
85362
+ "name": "phases",
85363
+ "privacy": "protected",
85364
+ "readonly": true,
85365
+ "default": "new OpenPhaseController(this, { mark: { entering: (on) => this.toggleState('entering', on), exiting: (on) => this.toggleState('exiting', on), }, open: () => this.open, surface: () => this.dialog, })"
85366
+ },
85045
85367
  {
85046
85368
  "kind": "field",
85047
85369
  "name": "zoomer",
@@ -86320,6 +86642,14 @@
86320
86642
  }
86321
86643
  ],
86322
86644
  "cssStates": [
86645
+ {
86646
+ "description": "From the moment the viewer opens until its entrance has finished.",
86647
+ "name": "entering"
86648
+ },
86649
+ {
86650
+ "description": "From the moment the viewer closes until its exit has finished.",
86651
+ "name": "exiting"
86652
+ },
86323
86653
  {
86324
86654
  "description": "While the viewer fills the screen.",
86325
86655
  "name": "fullscreen"
@@ -86417,7 +86747,7 @@
86417
86747
  "declarations": [
86418
86748
  {
86419
86749
  "kind": "class",
86420
- "description": "Pinch, double press and drag to zoom into the item a viewer shows, and to\nmove about it once zoomed.\n\nTwo fingers scale the item about the point between them. A double press, a\ndouble click or a double tap, zooms all the way in about the point pressed,\nand back out again. One pointer dragged across a zoomed item moves it, never\nso far that an edge comes inside the box. What it reports is a scale and an\noffset from the middle of the box; drawing them is the caller's.",
86750
+ "description": "Pinch, double press and drag to zoom into the item a viewer shows, and to\nmove about it once zoomed.\n\nTwo fingers scale the item about the point between them. A trackpad pinch,\nwhich the browser sends as a wheel with Ctrl held, and the wheel with Ctrl\nheld scale it about the pointer. A double press, a double click or a double\ntap, zooms all the way in about the point pressed, and back out again. One\npointer dragged across a zoomed item moves it, never so far that an edge\ncomes inside the box, and so does the wheel without Ctrl. What it reports is a scale and an\noffset from the middle of the box; drawing them is the caller's.",
86421
86751
  "name": "ZoomController",
86422
86752
  "members": [
86423
86753
  {
@@ -86655,6 +86985,13 @@
86655
86985
  "privacy": "private",
86656
86986
  "readonly": true
86657
86987
  },
86988
+ {
86989
+ "kind": "field",
86990
+ "name": "handleWheel",
86991
+ "privacy": "private",
86992
+ "readonly": true,
86993
+ "description": "A wheel with Ctrl held, which is also how the browser sends a trackpad\npinch, scales the item about the pointer. Without Ctrl, a wheel over a\nzoomed item moves it. Over an item at its own size, a plain wheel is left\nto the page."
86994
+ },
86658
86995
  {
86659
86996
  "kind": "field",
86660
86997
  "name": "handleDouble",
@@ -88633,7 +88970,7 @@
88633
88970
  "text": "boolean"
88634
88971
  },
88635
88972
  "default": "false",
88636
- "description": "Takes the row out of reach in a list with `selection-mode`: the arrow keys\npass over it and it cannot be selected or acted on.",
88973
+ "description": "Takes the row out of reach in a list with `selection-mode`: the arrow keys\npass over it and it cannot be selected or acted on. In a list with\n`disabled-behavior=\"selection\"`, it cannot be selected and is reached and\nacted on as any row is.",
88637
88974
  "attribute": "disabled",
88638
88975
  "reflects": true
88639
88976
  },
@@ -88689,6 +89026,15 @@
88689
89026
  },
88690
89027
  "description": "Whether the row is selected, in a list that selects.\n\nWritten by the list from its own `value`, and unset where nothing can be\nselected, which keeps `aria-selected` off a list that does not select."
88691
89028
  },
89029
+ {
89030
+ "kind": "field",
89031
+ "name": "selectionOnly",
89032
+ "type": {
89033
+ "text": "boolean"
89034
+ },
89035
+ "default": "false",
89036
+ "description": "Whether `disabled` takes the row out of selection alone, written by a list\nwith `disabled-behavior=\"selection\"`. No attribute: it is coordination\nbetween elements, as `focusable` is."
89037
+ },
88692
89038
  {
88693
89039
  "kind": "field",
88694
89040
  "name": "target",
@@ -88738,6 +89084,13 @@
88738
89084
  "description": "Whether a list with `selection-mode` holds this row, which makes it a row of a grid.",
88739
89085
  "readonly": true
88740
89086
  },
89087
+ {
89088
+ "kind": "field",
89089
+ "name": "handleCellFocus",
89090
+ "privacy": "private",
89091
+ "readonly": true,
89092
+ "description": "Says whether the cell shows keyboard focus, as `:focus-visible` does, so a\nsheet outside can draw the ring on the row by the host."
89093
+ },
88741
89094
  {
88742
89095
  "kind": "method",
88743
89096
  "name": "focusItem",
@@ -89138,7 +89491,7 @@
89138
89491
  "text": "boolean"
89139
89492
  },
89140
89493
  "default": "false",
89141
- "description": "Takes the row out of reach in a list with `selection-mode`: the arrow keys\npass over it and it cannot be selected or acted on.",
89494
+ "description": "Takes the row out of reach in a list with `selection-mode`: the arrow keys\npass over it and it cannot be selected or acted on. In a list with\n`disabled-behavior=\"selection\"`, it cannot be selected and is reached and\nacted on as any row is.",
89142
89495
  "fieldName": "disabled"
89143
89496
  },
89144
89497
  {
@@ -89191,6 +89544,10 @@
89191
89544
  "description": "The row being moved goes before this one when it is dropped.",
89192
89545
  "name": "drop-before"
89193
89546
  },
89547
+ {
89548
+ "description": "The row's cell has keyboard focus that the browser shows, in a list with `selection-mode`.",
89549
+ "name": "focus-visible"
89550
+ },
89194
89551
  {
89195
89552
  "description": "The row is selected, in a list that selects.",
89196
89553
  "name": "selected"
@@ -89298,7 +89655,7 @@
89298
89655
  "declarations": [
89299
89656
  {
89300
89657
  "kind": "class",
89301
- "description": "Sets `role=\"list\"` on the host, so a screen reader counts the rows and\nannounces each one's position, such as \"1 of 7\".\n\n**`selection-mode` makes the list interactive**, in the way of a grid list:\na grid of rows that is one tab stop. `single` selects one row at a time and\n`multiple` any number, and `value` holds the selected rows' values,\nseparated by commas. A change asks with `helix-before-change` and tells\nwith `change`. `none` selects nothing, so a press acts on the row. A\n`disabled` row is passed over. Each row is named by its label and described\nby its description, so the words of the controls in `end` are not read as\npart of its name.\n\n`selection-behavior` says what a press does to the rows already selected.\n`toggle`, the default, adds or takes out the row. `replace` selects the row\nalone, as a file list does, and the arrow keys carry the selection with\nthem. Control or Command with a press then adds or takes out one row.\n\n| Key | What it does |\n|---|---|\n| Down, Up | Moves to the next or the previous row. Under `replace`, selects it. |\n| Home, End | Moves to the first or the last row. Under `replace`, selects it. |\n| Page Down, Page Up | Moves a box's height of rows, so the row at one edge lands at the other. Under `replace`, selects the row it lands on. |\n| A letter or a word | Moves to the next row whose words start with what you typed. |\n| Left, Right | Moves between the row and the controls in its `end` slot. |\n| Space | Selects the row, or lets it go. |\n| Shift with Down, Up, Home, End, Page Down, Page Up or Space | Selects every row from the last one pressed, in `multiple`. |\n| Control or Command with Down, Up, Home, End, Page Down or Page Up | Moves without selecting, under `replace`. |\n| Control or Command with A | Selects every row, in `multiple`. |\n| Escape | Lets go of every selected row, asking first, and keeps the key from the dialog or menu around the list. With nothing selected, the key goes on to them. |\n| Enter | Acts on the row: follows its link, or sends `helix-action` from it. |\n\nA press with Shift selects every row from the last one pressed, and a press\nwith Control or Command adds or takes out one row under `replace`.\n\n**Leave `selection-mode` unset for a list a reader reads**, and set it for\none a reader chooses from or acts on. The rows of an interactive list are\ngrid rows, which hold controls as a list box option cannot. Give a control\nin `end` `tabindex=\"-1\"` to leave it to the arrow keys and out of the tab\norder.\n\n**`reorderable` lets you move rows.** Each row gets a grip after its `end`\nslot, named by `move-label`. Drag a grip to move its row, and the list\nscrolls near an edge. Or press a grip with Space, Enter, or a click to pick\nup its row, move it with the arrow keys, and press the grip again to drop\nit. A click on another row drops it there, and Escape puts it back. The list\nsays each step in its `live` region. A drop sends `helix-before-reorder`,\nwhich you can refuse, and then `helix-reorder`, whose `keys` hold every\nrow's value in the new order. **You move the rows**: the list moves no\nelement of yours, so your framework keeps the order it rendered.\n\n| Key, on a held row's grip | What it does |\n|---|---|\n| Down, Up | Moves the row one place. |\n| Home, End | Moves the row to the top or the bottom. |\n| Space, Enter | Drops the row. |\n| Escape | Puts the row back where it was. |\n\n`start` and `reversed` number an ordered list as `<ol>` does. The list\nwrites where the numbers start and which way they run as `--list-first` and\n`--list-step` on its slot, which the styled tier counts from. Reversed with\nno `start` counts down from the number of rows, which a server cannot know,\nso served markup counts from one until the list runs.\n\n**An empty list.** Set `empty-label`, or put your own content in the `empty`\nslot, for a row shown while the list has no rows and none are loading, such\nas \"No files yet\" and a link to add one. Without either, an empty list shows\nnothing. The list takes the `empty` state while it has no rows, whatever it\nshows.\n\n**Loading more.** `load-more` sends `helix-load-more` once the end of the\nlist comes within a screen of view, in the box that scrolls it or the page,\nonce for each number of rows: add rows and it can send it again. While you\nfetch, set `loading`: the list is busy, and a row after the last says\n\"Loading more\" (`loading-label`, or your own content in the `loading`\nslot). The list asks for nothing while `loading` is set.\n\nAn interactive list with no name is reported once in a development build,\nsince a screen reader announces it as a grid and nothing more. Name it with\n`label` or `aria-label`.",
89658
+ "description": "Sets `role=\"list\"` on the host, so a screen reader counts the rows and\nannounces each one's position, such as \"1 of 7\".\n\n**`selection-mode` makes the list interactive**, in the way of a grid list:\na grid of rows that is one tab stop. `single` selects one row at a time and\n`multiple` any number, and `value` holds the selected rows' values,\nseparated by commas. A change asks with `helix-before-change` and tells\nwith `change`. `none` selects nothing, so a press acts on the row. A\n`disabled` row is passed over. With `disabled-behavior=\"selection\"`, a\n`disabled` row cannot be selected, and is reached and acted on as any row\nis, as React Aria's GridList has it. Each row is named by its label and described\nby its description, so the words of the controls in `end` are not read as\npart of its name.\n\n`selection-behavior` says what a press does to the rows already selected.\n`toggle`, the default, adds or takes out the row. `replace` selects the row\nalone, as a file list does, and the arrow keys carry the selection with\nthem. Control or Command with a press then adds or takes out one row.\n\n| Key | What it does |\n|---|---|\n| Down, Up | Moves to the next or the previous row. Under `replace`, selects it. |\n| Home, End | Moves to the first or the last row. Under `replace`, selects it. |\n| Page Down, Page Up | Moves a box's height of rows, so the row at one edge lands at the other. Under `replace`, selects the row it lands on. |\n| A letter or a word | Moves to the next row whose words start with what you typed. |\n| Left, Right | Moves between the row and the controls in its `end` slot. |\n| Space | Selects the row, or lets it go. |\n| Shift with Down, Up, Home, End, Page Down, Page Up or Space | Selects every row from the last one pressed, in `multiple`. |\n| Control or Command with Down, Up, Home, End, Page Down or Page Up | Moves without selecting, under `replace`. |\n| Control or Command with A | Selects every row, in `multiple`. |\n| Escape | Lets go of every selected row, asking first, and keeps the key from the dialog or menu around the list. With nothing selected, the key goes on to them. |\n| Enter | Acts on the row: follows its link, or sends `helix-action` from it. |\n\nA press with Shift selects every row from the last one pressed, and a press\nwith Control or Command adds or takes out one row under `replace`.\n\n**Leave `selection-mode` unset for a list a reader reads**, and set it for\none a reader chooses from or acts on. The rows of an interactive list are\ngrid rows, which hold controls as a list box option cannot. Give a control\nin `end` `tabindex=\"-1\"` to leave it to the arrow keys and out of the tab\norder.\n\n**`reorderable` lets you move rows.** Each row gets a grip after its `end`\nslot, named by `move-label`. Drag a grip to move its row, and the list\nscrolls near an edge. Or press a grip with Space, Enter, or a click to pick\nup its row, move it with the arrow keys, and press the grip again to drop\nit. A click on another row drops it there, and Escape puts it back. The list\nsays each step in its `live` region. A drop sends `helix-before-reorder`,\nwhich you can refuse, and then `helix-reorder`, whose `keys` hold every\nrow's value in the new order. **You move the rows**: the list moves no\nelement of yours, so your framework keeps the order it rendered.\n\n| Key, on a held row's grip | What it does |\n|---|---|\n| Down, Up | Moves the row one place. |\n| Home, End | Moves the row to the top or the bottom. |\n| Space, Enter | Drops the row. |\n| Escape | Puts the row back where it was. |\n\n`start` and `reversed` number an ordered list as `<ol>` does. The list\nwrites where the numbers start and which way they run as `--list-first` and\n`--list-step` on its slot, which the styled tier counts from. Reversed with\nno `start` counts down from the number of rows, which a server cannot know,\nso served markup counts from one until the list runs.\n\n**An empty list.** Set `empty-label`, or put your own content in the `empty`\nslot, for a row shown while the list has no rows and none are loading, such\nas \"No files yet\" and a link to add one. Without either, an empty list shows\nnothing. The list takes the `empty` state while it has no rows, whatever it\nshows.\n\n**Loading more.** `load-more` sends `helix-load-more` once the end of the\nlist comes within a screen of view, in the box that scrolls it or the page,\nonce for each number of rows: add rows and it can send it again. While you\nfetch, set `loading`: the list is busy, and a row after the last says\n\"Loading more\" (`loading-label`, or your own content in the `loading`\nslot). The list asks for nothing while `loading` is set.\n\nAn interactive list with no name is reported once in a development build,\nsince a screen reader announces it as a grid and nothing more. Name it with\n`label` or `aria-label`.",
89302
89659
  "name": "HelixHeadlessList",
89303
89660
  "cssProperties": [
89304
89661
  {
@@ -89366,6 +89723,15 @@
89366
89723
  "words": true
89367
89724
  }
89368
89725
  },
89726
+ {
89727
+ "kind": "field",
89728
+ "name": "disabledBehavior",
89729
+ "type": {
89730
+ "text": "'all' | 'selection' | undefined | undefined"
89731
+ },
89732
+ "description": "What `disabled` takes from a row, in a list that selects: `all`, which\npasses over the row, or `selection`, which keeps the row out of the\nselection and lets the keys reach it and Enter or a press act on it, as\nReact Aria's GridList takes `disabledBehavior`.\n\nAbsent is `all`.",
89733
+ "attribute": "disabled-behavior"
89734
+ },
89369
89735
  {
89370
89736
  "kind": "field",
89371
89737
  "name": "droppedLabel",
@@ -89511,6 +89877,35 @@
89511
89877
  "description": "What a press does to the rows already selected, in a list that selects:\n`toggle` adds or takes out the row, and `replace` selects it alone and\nlets the arrow keys carry the selection.",
89512
89878
  "attribute": "selection-behavior"
89513
89879
  },
89880
+ {
89881
+ "kind": "method",
89882
+ "name": "blocked",
89883
+ "privacy": "private",
89884
+ "return": {
89885
+ "type": {
89886
+ "text": "boolean"
89887
+ }
89888
+ },
89889
+ "parameters": [
89890
+ {
89891
+ "name": "row",
89892
+ "type": {
89893
+ "text": "HelixHeadlessListItem"
89894
+ }
89895
+ }
89896
+ ],
89897
+ "description": "Whether the row is out of reach of the keys and of actions, past selection."
89898
+ },
89899
+ {
89900
+ "kind": "field",
89901
+ "name": "selectable",
89902
+ "type": {
89903
+ "text": "HelixHeadlessListItem[]"
89904
+ },
89905
+ "privacy": "private",
89906
+ "description": "The rows a key can land on that can also be selected.",
89907
+ "readonly": true
89908
+ },
89514
89909
  {
89515
89910
  "kind": "field",
89516
89911
  "name": "selectionMode",
@@ -89558,6 +89953,16 @@
89558
89953
  "privacy": "private",
89559
89954
  "description": "The row the reader was last on, which keeps the tab stop."
89560
89955
  },
89956
+ {
89957
+ "kind": "field",
89958
+ "name": "placed",
89959
+ "type": {
89960
+ "text": "HelixHeadlessListItem[]"
89961
+ },
89962
+ "privacy": "private",
89963
+ "default": "[]",
89964
+ "description": "The rows in order on the last `sync`, so a removed row's place is known."
89965
+ },
89561
89966
  {
89562
89967
  "kind": "field",
89563
89968
  "name": "anchor",
@@ -89757,6 +90162,25 @@
89757
90162
  },
89758
90163
  "description": "Tells every row its place: whether it holds the one tab stop and whether\nit is selected, or that it is a plain row. Through `whenHydrated`, so a\nrow a server rendered draws its served markup first."
89759
90164
  },
90165
+ {
90166
+ "kind": "method",
90167
+ "name": "followRemoved",
90168
+ "privacy": "private",
90169
+ "return": {
90170
+ "type": {
90171
+ "text": "void"
90172
+ }
90173
+ },
90174
+ "parameters": [
90175
+ {
90176
+ "name": "rows",
90177
+ "type": {
90178
+ "text": "HelixHeadlessListItem[]"
90179
+ }
90180
+ }
90181
+ ],
90182
+ "description": "Moves the tab stop off a row the page removed, to the next row a key can\nreach or, at the end, the one before it, and moves focus there where\nremoving the row dropped it to the body.\n\n**Focus went to the body**, and the arrow keys did nothing until the\nreader tabbed back into the list. React Aria's GridList moves focus to a\nneighbor the same way. Focus anywhere but the body is where you put it,\nand is left there."
90183
+ },
89760
90184
  {
89761
90185
  "kind": "method",
89762
90186
  "name": "rowOf",
@@ -90481,6 +90905,14 @@
90481
90905
  "description": "What screen readers hear when a held row is put back, or a move is\nrefused, in a `reorderable` list.",
90482
90906
  "fieldName": "canceledLabel"
90483
90907
  },
90908
+ {
90909
+ "name": "disabled-behavior",
90910
+ "type": {
90911
+ "text": "'all' | 'selection' | undefined | undefined"
90912
+ },
90913
+ "description": "What `disabled` takes from a row, in a list that selects: `all`, which\npasses over the row, or `selection`, which keeps the row out of the\nselection and lets the keys reach it and Enter or a press act on it, as\nReact Aria's GridList takes `disabledBehavior`.\n\nAbsent is `all`.",
90914
+ "fieldName": "disabledBehavior"
90915
+ },
90484
90916
  {
90485
90917
  "name": "dropped-label",
90486
90918
  "type": {
@@ -91076,7 +91508,7 @@
91076
91508
  "declarations": [
91077
91509
  {
91078
91510
  "kind": "class",
91079
- "description": "The listbox is the control, and options are its items. A Select is a listbox\nwith a trigger in front of it, a Combobox is a listbox with a text input, and\na command palette is a listbox in a dialog. They differ only in what opens\nthe list and what filters it.\n\nWith `multiple` set, `value` is a comma-separated string, like\n`Checkbox.Group`'s, because `MixinControllerValue` holds a string. The form\nreceives one entry per selected option, as a native `<select multiple>` sends\nit, so your server does not split on commas.\n\nSelected and active are separate. The selected option is the value. The\nactive option is where the keyboard is: the arrow keys move it, and\n`aria-activedescendant` points to it while focus stays on the list.\n\n**Keyboard.** The list is one tab stop, or its filter field is where there\nis one. In a single-choice list the highlight is the choice unless `manual`\nis set; then Enter, Space or a click chooses.\n\n| Key | What it does |\n|---|---|\n| Down, Up | Moves the highlight to the next or the previous option, round from the last to the first. With `layout=\"grid\"`, to the option below or above, stopping at the edge. |\n| Right, Left | With `layout=\"grid\"`, moves to the next or the previous option, mirrored right to left. In a filter field, moves the caret. |\n| Home, End | Moves to the first or the last option. In a filter field, moves the caret. |\n| Page Down, Page Up | Moves by as many options as the list shows at once. |\n| A letter or a word | Moves to the next option whose words start with what you typed. In a filter field, types it. |\n| Enter | Chooses the highlighted option, or follows it where it is a link. |\n| Space | Chooses the highlighted option, or with `multiple` toggles it. In a filter field, types a space. |\n| Shift with Down or Up | With `multiple`, adds the option the highlight moves to. In a filter field, moves the highlight and leaves the value. |\n| Shift with Space | With `multiple`, adds every option from the one last chosen to the highlighted one. In a filter field, types a space. |\n| Shift with Home or End | With `multiple`, adds every option from the highlight to that end. In a filter field, hold Control as well. |\n| Control or Command with A | With `multiple`, chooses every option, or none where all are chosen. In a filter field, selects the text. |\n| Escape | In a filter field, clears the filter. |\n| Alt with Up or Down | In a `reorderable` list, moves the highlighted option a place. Alt with Home or End moves it to either end. |\n\n**ARIA.** The `items` part is the `listbox`, named by the label and\ndescribed by the hint and the message, with `aria-multiselectable` under\n`multiple`, `aria-required`, `aria-invalid`, and `aria-busy` while loading.\nEach option is an `option` with `aria-selected`. The list, or its filter\nfield, points `aria-activedescendant` at the highlighted option; the field\nis `aria-autocomplete=\"list\"` and controls the list.\n\nAn option with `href` is a link: Enter or a press follows it and selects\nnothing, and moving onto it with the arrows does not follow it.\n\nAs a filter narrows the list, a screen reader hears how many options are\nleft, such as \"3 results\", from `result-label` and `results-label`. A filter\nthat leaves none says `empty-text`.\n\n**Moving options** is a separate import, `@fusion.dev/helix/listbox/reorder`,\nso a list that never moves options carries none of its code. With it\nimported, `reorderable` lets a reader move options:\n\n- Alt with Up or Down moves the highlighted option a place, and Alt with\n Home or End moves it to either end, as the APG's rearrangeable listbox\n does. The highlight stays on it.\n- A pointer drags an option, with a drop indicator, and the list scrolls near\n an edge. A press that does not travel still chooses the option.\n- A drop sends `helix-before-reorder`, which you can refuse, and then\n `helix-reorder`, whose `keys` hold every value in the new order. **You\n move the options**, or set `items` in the new order: the list moves no\n element of yours.\n- The list says each move in its `live` region. The words are the\n `moved-label`, `canceled-label`, `dropped-label`, and `picked-up-label`\n attributes, which the import reads.\n- An option in a group moves within its group. Options do not move while a\n filter narrows the list, under `layout=\"grid\"`, or while the list is\n disabled.",
91511
+ "description": "The listbox is the control, and options are its items. A Select is a listbox\nwith a trigger in front of it, a Combobox is a listbox with a text input, and\na command palette is a listbox in a dialog. They differ only in what opens\nthe list and what filters it.\n\nWith `multiple` set, `value` is a comma-separated string, like\n`Checkbox.Group`'s, because `MixinControllerValue` holds a string. The form\nreceives one entry per selected option, as a native `<select multiple>` sends\nit, so your server does not split on commas. An option's value may hold a\ncomma: a run of the string that is an option's value is read as that one\nvalue, and the form sends it as one entry.\n\nSelected and active are separate. The selected option is the value. The\nactive option is where the keyboard is: the arrow keys move it, and\n`aria-activedescendant` points to it while focus stays on the list.\n\n**Keyboard.** The list is one tab stop, or its filter field is where there\nis one. In a single-choice list the highlight is the choice unless `manual`\nis set; then Enter, Space or a click chooses.\n\n| Key | What it does |\n|---|---|\n| Down, Up | Moves the highlight to the next or the previous option, round from the last to the first. With `layout=\"grid\"`, to the option below or above, stopping at the edge. |\n| Right, Left | With `layout=\"grid\"`, moves to the next or the previous option, mirrored right to left. In a filter field, moves the caret. |\n| Home, End | Moves to the first or the last option. In a filter field, moves the caret. |\n| Page Down, Page Up | Moves by as many options as the list shows at once. |\n| A letter or a word | Moves to the next option whose words start with what you typed. In a filter field, types it. |\n| Enter | Chooses the highlighted option, or follows it where it is a link. |\n| Space | Chooses the highlighted option, or with `multiple` toggles it. In a filter field, types a space. |\n| Shift with Down or Up | With `multiple`, adds the option the highlight moves to. In a filter field, moves the highlight and leaves the value. |\n| Shift with Space | With `multiple`, adds every option from the one last chosen to the highlighted one. In a filter field, types a space. |\n| Shift with Home or End | With `multiple`, adds every option from the highlight to that end. In a filter field, hold Control as well. |\n| Control or Command with A | With `multiple`, chooses every option, or none where all are chosen. In a filter field, selects the text. |\n| Escape | In a filter field, clears the filter. |\n| Alt with Up or Down | In a `reorderable` list, moves the highlighted option a place. Alt with Home or End moves it to either end. |\n\n**ARIA.** The `items` part is the `listbox`, named by the label and\ndescribed by the hint and the message, with `aria-multiselectable` under\n`multiple`, `aria-required`, `aria-invalid`, and `aria-busy` while loading.\nEach option is an `option` with `aria-selected`. The list, or its filter\nfield, points `aria-activedescendant` at the highlighted option; the field\nis `aria-autocomplete=\"list\"` and controls the list.\n\nAn option with `href` is a link: Enter or a press follows it and selects\nnothing, and moving onto it with the arrows does not follow it.\n\nAs a filter narrows the list, a screen reader hears how many options are\nleft, such as \"3 results\", from `result-label` and `results-label`. A filter\nthat leaves none says `empty-text`.\n\n**Moving options** is a separate import, `@fusion.dev/helix/listbox/reorder`,\nso a list that never moves options carries none of its code. With it\nimported, `reorderable` lets a reader move options:\n\n- Alt with Up or Down moves the highlighted option a place, and Alt with\n Home or End moves it to either end, as the APG's rearrangeable listbox\n does. The highlight stays on it.\n- A pointer drags an option, with a drop indicator, and the list scrolls near\n an edge. A press that does not travel still chooses the option.\n- A drop sends `helix-before-reorder`, which you can refuse, and then\n `helix-reorder`, whose `keys` hold every value in the new order. **You\n move the options**, or set `items` in the new order: the list moves no\n element of yours.\n- The list says each move in its `live` region. The words are the\n `moved-label`, `canceled-label`, `dropped-label`, and `picked-up-label`\n attributes, which the import reads.\n- An option in a group moves within its group. Options do not move while a\n filter narrows the list, under `layout=\"grid\"`, or while the list is\n disabled.",
91080
91512
  "name": "HelixHeadlessListbox",
91081
91513
  "cssParts": [
91082
91514
  {
@@ -91278,6 +91710,14 @@
91278
91710
  "words": true
91279
91711
  }
91280
91712
  },
91713
+ {
91714
+ "kind": "field",
91715
+ "name": "filterMatch",
91716
+ "type": {
91717
+ "text": "((text: string, filter: string) => boolean) | undefined | undefined"
91718
+ },
91719
+ "description": "Whether an option is kept by the filter: a function given the option's\nwords and the filter, trimmed, that returns `true` to keep it showing, as\nReact Aria's `Autocomplete` takes `filter`. For matching that ignores\naccents, matches the start of each word, or matches out of order.\n\nAbsent, an option is kept where its words hold the filter, in any case. A\nproperty only, there being no way to write a function in markup."
91720
+ },
91281
91721
  {
91282
91722
  "kind": "field",
91283
91723
  "name": "items",
@@ -91634,7 +92074,7 @@
91634
92074
  "type": {
91635
92075
  "text": "string[]"
91636
92076
  },
91637
- "description": "The chosen values, as an array whether or not `multiple` is set.",
92077
+ "description": "The chosen values, as an array whether or not `multiple` is set.\n\nRead against the options' values, so an option whose value holds a comma\nis one value. See `chosenValues`.",
91638
92078
  "readonly": true
91639
92079
  },
91640
92080
  {
@@ -100490,7 +100930,7 @@
100490
100930
  "name": "handlePartChange",
100491
100931
  "privacy": "private",
100492
100932
  "readonly": true,
100493
- "description": "A route or area renamed, or its description changed, which the list says\nand a slot change does not report."
100933
+ "description": "A route or area renamed, or its description changed, which the list says\nand a slot change does not report.\n\nNot the map's own `gestures` news, which it sends from `updated` and which\nchanges nothing it draws: an update asked for there ran every map's\nupdate twice, and Lit's development build warned about it."
100494
100934
  },
100495
100935
  {
100496
100936
  "kind": "field",
@@ -106011,7 +106451,7 @@
106011
106451
  "declarations": [
106012
106452
  {
106013
106453
  "kind": "class",
106014
- "description": "The trigger is slotted and stays your own element, as with the tooltip. The\nmenu renders its surface in the top layer with the popover API, so an\nancestor with `overflow: hidden` does not clip it and it needs no `z-index`.\n\nSlot a `helix-button` or `helix-icon-button` as the trigger, and the menu\ntells it that it opens a menu and whether the menu is open, inside its own\nshadow root. On a plain element, such as a `<button>`, the menu writes\n`aria-haspopup=\"menu\"` and `aria-expanded`, from a frame after its own first\nrender, so a server's markup is never changed while a framework hydrates it.\nIt never writes `aria-expanded` where you wrote it yourself.\n\nSubmenus drill down by default. A submenu replaces the panel's content, and a\nback row returns to the previous page. One panel stays inside a narrow\nwindow, and works on touch screens, which have no hover.\n\n**`submenus=\"flyout\"` opens each submenu in a panel of its own beside its\nrow**, as React Aria's `SubmenuTrigger` and Radix's `Sub` do. Resting the\npointer on the row opens it, and a pointer crossing toward the open panel\nover the rows between keeps it open, as Radix's grace area does. Right Arrow\nopens a row's submenu on its first row, and Left Arrow or Escape closes it\nand returns focus to the row, the two arrows swapping on a right-to-left\npage. The row says `aria-expanded`, and the panel is a `menu` named by the\nrow.\n\nThe root holds which page is open, because only one page shows at a time. It\nsets this on items as a property, never as an attribute. An attribute written\nonto your element after it upgrades causes a hydration mismatch.\n\nGroup rows under a heading with `Menu.Section`, which is a `group` named by\nits heading. Between runs of rows, a `<helix-divider>` is a separator a\nscreen reader announces.\n\nKeys: Enter, Space or Down Arrow on the trigger opens the menu on its first\nrow, and Up Arrow on its last. In the menu, Up and Down Arrow move between\nrows, Home and End go to the first and the last, a typed letter moves to\nthe next row whose name starts with it, Enter and Space choose, Right Arrow\nopens a row's submenu and Left Arrow goes back, the two swapping on a\nright-to-left page, and Escape closes the menu and returns focus to the\ntrigger. Tab closes it and moves on.\n\nWhile it is open, the surface carries the trigger's width as\n`--floating-anchor-inline-size` and the room left below it as\n`--floating-available-block-size`, as Radix's dropdown menu publishes its\ntrigger's width, for a menu as wide as its trigger:\n`helix-menu::part(surface) { min-inline-size: var(--floating-anchor-inline-size) }`.\n\nWith `context`, the trigger is an area and the menu is its context menu: a\nright-click, a long press, Shift+F10 or the menu key over the area opens it\nat the pointer, or at the area's corner from the keyboard, as Radix's context\nmenu does. A press on the area does not open it, and closing it returns focus\nto where it was. A touch or a pen held still on the area opens it too, on\nevery browser, since iOS sends no `contextmenu` for one.\n\n**A trigger with its own action.** With `open-on=\"long-press\"`, a press on\nthe trigger is the trigger's own, and a press held for half a second opens\nthe menu, as React Aria's `trigger=\"longPress\"` does. Alt+Down or Alt+Up\nopens it from the keyboard, and the trigger is described by\n`long-press-label`, which says so.",
106454
+ "description": "The trigger is slotted and stays your own element, as with the tooltip. The\nmenu renders its surface in the top layer with the popover API, so an\nancestor with `overflow: hidden` does not clip it and it needs no `z-index`.\n\nSlot a `helix-button` or `helix-icon-button` as the trigger, and the menu\ntells it that it opens a menu and whether the menu is open, inside its own\nshadow root. On a plain element, such as a `<button>`, the menu writes\n`aria-haspopup=\"menu\"` and `aria-expanded`, from a frame after its own first\nrender, so a server's markup is never changed while a framework hydrates it.\nIt never writes `aria-expanded` where you wrote it yourself.\n\nSubmenus drill down by default. A submenu replaces the panel's content, and a\nback row returns to the previous page. One panel stays inside a narrow\nwindow, and works on touch screens, which have no hover.\n\n**`submenus=\"flyout\"` opens each submenu in a panel of its own beside its\nrow**, as React Aria's `SubmenuTrigger` and Radix's `Sub` do. Resting the\npointer on the row opens it, and a pointer crossing toward the open panel\nover the rows between keeps it open, as Radix's grace area does. Right Arrow\nopens a row's submenu on its first row, and Left Arrow or Escape closes it\nand returns focus to the row, the two arrows swapping on a right-to-left\npage. The row says `aria-expanded`, and the panel is a `menu` named by the\nrow.\n\nThe root holds which page is open, because only one page shows at a time. It\nsets this on items as a property, never as an attribute. An attribute written\nonto your element after it upgrades causes a hydration mismatch.\n\nGroup rows under a heading with `Menu.Section`, which is a `group` named by\nits heading. Between runs of rows, a `<helix-divider>` is a separator a\nscreen reader announces.\n\nKeys: Enter, Space or Down Arrow on the trigger opens the menu on its first\nrow, and Up Arrow on its last. In the menu, Up and Down Arrow move between\nrows, Home and End go to the first and the last, a typed letter moves to\nthe next row whose name starts with it, Enter and Space choose, Right Arrow\nopens a row's submenu and Left Arrow goes back, the two swapping on a\nright-to-left page. Left Arrow on the top page does nothing. Escape closes\nthe menu and returns focus to the trigger. Tab closes it and moves on.\n\nWhile it is open, the surface carries the trigger's width as\n`--floating-anchor-inline-size` and the room left below it as\n`--floating-available-block-size`, as Radix's dropdown menu publishes its\ntrigger's width, for a menu as wide as its trigger:\n`helix-menu::part(surface) { min-inline-size: var(--floating-anchor-inline-size) }`.\n\nWith `context`, the trigger is an area and the menu is its context menu: a\nright-click, a long press, Shift+F10 or the menu key over the area opens it\nat the pointer, or at the area's corner from the keyboard, as Radix's context\nmenu does. A press on the area does not open it, and closing it returns focus\nto where it was. A touch or a pen held still on the area opens it too, on\nevery browser, since iOS sends no `contextmenu` for one.\n\n**A trigger with its own action.** With `open-on=\"long-press\"`, a press on\nthe trigger is the trigger's own, and a press held for half a second opens\nthe menu, as React Aria's `trigger=\"longPress\"` does. Alt+Down or Alt+Up\nopens it from the keyboard, and the trigger is described by\n`long-press-label`, which says so.",
106015
106455
  "name": "HelixHeadlessMenu",
106016
106456
  "cssProperties": [
106017
106457
  {
@@ -106340,7 +106780,7 @@
106340
106780
  "name": "panel",
106341
106781
  "privacy": "private",
106342
106782
  "readonly": true,
106343
- "default": "new PopoverController(this, { anchor: () => this.context && this.point ? this.renderRoot?.querySelector<HTMLElement>('#point') : this.trigger, // The host is `display: contents`, so it has no box a press can land in. // What counts as inside is the surface, plus the trigger, whose own click // handler decides what a press there means. boundary: () => this, offset: () => this.offset, onDismiss: () => this.hide(), open: () => this.open, placement: () => this.placement, surface: () => this.partNamed('surface'), })"
106783
+ "default": "new PopoverController(this, { anchor: () => this.context && this.point ? this.renderRoot?.querySelector<HTMLElement>('#point') : this.trigger, // The host is `display: contents`, so it has no box a press can land in. // What counts as inside is the surface, plus the trigger, whose own click // handler decides what a press there means. boundary: () => this, offset: () => this.offset, onDismiss: () => this.hide(), /* The side the panel landed on, for a sheet outside that draws by side, as Popover says it. */ onPlace: (placement) => { const side = sideOf(placement) this.toggleState('placed-bottom', side === 'bottom') this.toggleState('placed-left', side === 'left') this.toggleState('placed-right', side === 'right') this.toggleState('placed-top', side === 'top') }, open: () => this.open, placement: () => this.placement, surface: () => this.partNamed('surface'), })"
106344
106784
  },
106345
106785
  {
106346
106786
  "kind": "method",
@@ -107595,6 +108035,22 @@
107595
108035
  "description": "While the menu is open.",
107596
108036
  "name": "open"
107597
108037
  },
108038
+ {
108039
+ "description": "While the open panel sits below its trigger.",
108040
+ "name": "placed-bottom"
108041
+ },
108042
+ {
108043
+ "description": "While the open panel sits to the left of its trigger.",
108044
+ "name": "placed-left"
108045
+ },
108046
+ {
108047
+ "description": "While the open panel sits to the right of its trigger.",
108048
+ "name": "placed-right"
108049
+ },
108050
+ {
108051
+ "description": "While the open panel sits above its trigger.",
108052
+ "name": "placed-top"
108053
+ },
107598
108054
  {
107599
108055
  "description": "A row on the current page has content in its leading column, so every row keeps that column.",
107600
108056
  "name": "start"
@@ -110895,7 +111351,7 @@
110895
111351
  "text": "HTMLElement | undefined"
110896
111352
  }
110897
111353
  },
110898
- "description": "The tab stop after this element on the page, or the one before it at the\nend, for a lone element whose removal would drop focus to the body.\n\n**A lone Callout or Announcement had nowhere to hand focus**, so a\nkeyboard reader who dismissed one started again from the top of the\npage. React Aria's Toast hands focus on the same way. Read before the\nevent, in the order Tab reaches the stops, while this element's own are\nstill among them.",
111354
+ "description": "The tab stop after this element on the page, or the one before it at the\nend, for an element whose removal would drop focus to the body because\nno neighbor of its kind has a control to take it.\n\n**A lone Callout or Announcement had nowhere to hand focus**, so a\nkeyboard reader who dismissed one started again from the top of the\npage. React Aria's Toast hands focus on the same way. Read before the\nevent, in the order Tab reaches the stops, while this element's own are\nstill among them.",
110899
111355
  "inheritedFrom": {
110900
111356
  "name": "MixinDismissible",
110901
111357
  "module": "src/mixins/mixin-dismissible/mixin-dismissible.ts"
@@ -112816,7 +113272,7 @@
112816
113272
  "declarations": [
112817
113273
  {
112818
113274
  "kind": "class",
112819
- "description": "A separate family from `Input`'s `type=\"number\"`. It renders two buttons,\nbinds four keys `Input` does not, and handles clamping and stepping.\n\nThe field is `type=\"text\"` with `inputmode=\"decimal\"`. Tested in a real\nbrowser, `type=\"number\"` fails in three ways:\n- Typing `12e` gives a `.value` of `\"\"`, so the element cannot see what you\n typed. A `type=\"text\"` field keeps `\"12e\"`.\n- The mouse wheel over a focused field changes the value, for example from 5\n to 4, when you only meant to scroll the page.\n- `selectionStart` is `null`, so the caret cannot be managed.\n\n`inputmode=\"decimal\"` keeps the numeric keypad on phones.\n\n`format-options` shows the number with `Intl.NumberFormat` in `locale`, as a\ncurrency, a percent or a unit, while the field is not being edited. Focus\nshows the number itself, and a typed `$1,200` or `25%` is read back with the\nsame options. The value stays the plain number: `1200`, or `0.25` for 25%.\nThe locale's group separators are read in every field, so `1,234` is a\nnumber in `en-US`.\n\nThe field and its two buttons sit in a `role=\"group\"`, and the field carries\n`role-label`, \"number field\" in English, as its `aria-roledescription`, as\nReact Aria's NumberField does. On iOS and iPadOS the field is a plain text\nfield, with no `role=\"spinbutton\"`, which VoiceOver reads as a slider you\ncannot type in, and no role description, so VoiceOver says the field is\nrequired. React Aria's NumberField does the same.\n\nValidity follows the platform's rules: `min`, `max`, and `step` are checked\nand reported through the host's own `setValidity`, under the platform's flag\nnames.\n\nStepping is separate from typing, so a number is not corrected while you type\nit. While you type, the form holds the number the text reads as, so a field\nshowing `$2,500.50` gives the form 2500.5, and text that is not a number\ngives it nothing, as a native number field does.\n\nHolding a stepper button down steps once, then again after 400 milliseconds,\nthen every 60 milliseconds until you let go, as React Aria's NumberField does.\n\n**Keyboard.** The field is one tab stop, and the stepper buttons are not in\nthe tab order.\n\n| Key | What it does |\n|---|---|\n| Up, Down | Steps the value up or down by `step`. |\n| Page Up, Page Down | Steps by `large-step` steps, ten by default. |\n| Home, End | Goes to `min` or `max`, where there is one. Without one, moves the caret. |\n| Enter | Commits the typed number and submits the form, as a native field does. |\n\nThe field has `role=\"spinbutton\"` with `aria-valuenow`, `aria-valuemin`,\n`aria-valuemax`, and the formatted text in `aria-valuetext`.",
113275
+ "description": "A separate family from `Input`'s `type=\"number\"`. It renders two buttons,\nbinds four keys `Input` does not, and handles clamping and stepping.\n\nThe field is `type=\"text\"` with `inputmode=\"decimal\"`. Tested in a real\nbrowser, `type=\"number\"` fails in three ways:\n- Typing `12e` gives a `.value` of `\"\"`, so the element cannot see what you\n typed. A `type=\"text\"` field keeps `\"12e\"`.\n- The mouse wheel over a focused field changes the value, for example from 5\n to 4, when you only meant to scroll the page.\n- `selectionStart` is `null`, so the caret cannot be managed.\n\n`inputmode=\"decimal\"` keeps the numeric keypad on phones.\n\n`format-options` shows the number with `Intl.NumberFormat` in `locale`, as a\ncurrency, a percent or a unit, while the field is not being edited. Focus\nshows the number itself, and a typed `$1,200` or `25%` is read back with the\nsame options. The value stays the plain number: `1200`, or `0.25` for 25%.\nThe locale's group separators are read in every field, so `1,234` is a\nnumber in `en-US`.\n\nThe field and its two buttons sit in a `role=\"group\"` named by the label,\nand the field carries `role-label`, \"number field\" in English, as its\n`aria-roledescription`, as React Aria's NumberField does. On iOS and iPadOS the field is a plain text\nfield, with no `role=\"spinbutton\"`, which VoiceOver reads as a slider you\ncannot type in, and no role description, so VoiceOver says the field is\nrequired. React Aria's NumberField does the same.\n\nValidity follows the platform's rules: `min`, `max`, and `step` are checked\nand reported through the host's own `setValidity`, under the platform's flag\nnames.\n\nStepping is separate from typing, so a number is not corrected while you type\nit. While you type, the form holds the number the text reads as, so a field\nshowing `$2,500.50` gives the form 2500.5, and text that is not a number\ngives it nothing, as a native number field does.\n\nHolding a stepper button down steps once, then again after 400 milliseconds,\nthen every 60 milliseconds until you let go, as React Aria's NumberField does.\n\n**Keyboard.** The field is one tab stop, and the stepper buttons are not in\nthe tab order.\n\n| Key | What it does |\n|---|---|\n| Up, Down | Steps the value up or down by `step`. |\n| Page Up, Page Down | Steps by `large-step` steps, ten by default. |\n| Home, End | Goes to `min` or `max`, where there is one. Without one, moves the caret. |\n| Enter | Commits the typed number and submits the form, as a native field does. |\n\nThe field has `role=\"spinbutton\"` with `aria-valuenow`, `aria-valuemin`,\n`aria-valuemax`, and the formatted text in `aria-valuetext`.",
112820
113276
  "name": "HelixHeadlessNumberInput",
112821
113277
  "cssParts": [
112822
113278
  {
@@ -113613,7 +114069,7 @@
113613
114069
  "type": {
113614
114070
  "text": "number"
113615
114071
  },
113616
- "description": "The value as a number, or `NaN` while the control is empty.\n\n`NaN` and not zero, which is the trap the platform already avoids: `Number('')`\nis zero, so an empty control would report a number it does not hold and a\nform would submit it."
114072
+ "description": "The value as a number, or `NaN` while the control is empty or does not\nhold a number.\n\nRead in the locale and the format, as the form reads it, so `1,5` typed\nin a locale with a decimal comma is 1.5 here while the form holds 1.5.\n`NaN` and not zero, which is the trap the platform already avoids: `Number('')`\nis zero, so an empty control would report a number it does not hold and a\nform would submit it."
113617
114073
  },
113618
114074
  {
113619
114075
  "kind": "field",
@@ -136071,7 +136527,7 @@
136071
136527
  "declarations": [
136072
136528
  {
136073
136529
  "kind": "class",
136074
- "description": "A trigger that opens a `Listbox`. The list is the same element you can use on\nits own, with the same keyboard behavior, filtering, and multi-select rules.\nSelect adds a trigger that shows what is chosen, a floating surface, and a\nplace for focus to return to when the list closes.\n\nYour options stay in your light DOM and are slotted through into the listbox,\nso the listbox looks through slots to find them. For a list too long to draw\nwhole, set `items` instead: the list draws only the options in sight, as\nListbox's `items` does, and the trigger, its keys and the form read the\nwhole set.\n\n`Select` owns the value, passes it down to the listbox, and takes changes\nback, so the value lives in one place.\n\nSet `valueContent` to draw the trigger's content from the chosen options,\nand several chosen options are written as a list in the reader's language.\n\n**Keyboard.** On the closed trigger:\n\n| Key | What it does |\n|---|---|\n| Down, Enter, Space | Opens the list on the chosen option, or the first. |\n| Up | Opens the list on the chosen option, or the last. |\n| Home, End | Opens the list on the first or the last option. |\n| Left, Right | Chooses the option before or after the chosen one without opening, as React Aria's Select does, in either direction of text. |\n| 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. |\n\nIn the open list, which is a `Listbox`:\n\n| Key | What it does |\n|---|---|\n| Down, Up, Home, End, Page Down, Page Up | Moves the highlight. |\n| A letter or a word | Moves the highlight to the next option whose words start with what you typed. |\n| Enter, Space | Chooses the highlighted option and closes the list. With `multiple`, toggles it and leaves the list open. |\n| Escape | Closes the list and puts focus back on the trigger. |\n| Tab | Closes the list and moves on. |\n\nA choice made on the closed trigger is said aloud on Apple devices, where\nVoiceOver does not read the trigger's new name.\n\n**ARIA.** The trigger is a `button` with `aria-haspopup=\"listbox\"` and\n`aria-expanded`, named by the label and then the chosen words, as a native\n`<select>` is. The list is the listbox `Listbox` describes, named by the\nlabel, or by `list-label` where there is none.\n\nSet `autocomplete` to let a browser's autofill choose, as a native `<select>`\nwith the same attribute would.",
136530
+ "description": "A trigger that opens a `Listbox`. The list is the same element you can use on\nits own, with the same keyboard behavior, filtering, and multi-select rules.\nSelect adds a trigger that shows what is chosen, a floating surface, and a\nplace for focus to return to when the list closes.\n\nYour options stay in your light DOM and are slotted through into the listbox,\nso the listbox looks through slots to find them. For a list too long to draw\nwhole, set `items` instead: the list draws only the options in sight, as\nListbox's `items` does, and the trigger, its keys and the form read the\nwhole set.\n\n`Select` owns the value, passes it down to the listbox, and takes changes\nback, so the value lives in one place. With `multiple`, the value is the\nchosen values joined with commas, and the form receives one entry for each.\nAn option's value may hold a comma, and it is read as one value.\n\nSet `valueContent` to draw the trigger's content from the chosen options,\nand several chosen options are written as a list in the reader's language.\n\n**Keyboard.** On the closed trigger:\n\n| Key | What it does |\n|---|---|\n| Down, Enter, Space | Opens the list on the chosen option, or the first. |\n| Up | Opens the list on the chosen option, or the last. |\n| Home, End | Opens the list on the first or the last option. |\n| Left, Right | Chooses the option before or after the chosen one without opening, as React Aria's Select does, in either direction of text. |\n| 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. |\n\nIn the open list, which is a `Listbox`:\n\n| Key | What it does |\n|---|---|\n| Down, Up, Home, End, Page Down, Page Up | Moves the highlight. |\n| A letter or a word | Moves the highlight to the next option whose words start with what you typed. |\n| Enter, Space | Chooses the highlighted option and closes the list. With `multiple`, toggles it and leaves the list open. |\n| Escape | Closes the list and puts focus back on the trigger. |\n| Tab | Closes the list and moves on. |\n\nA choice made on the closed trigger is said aloud on Apple devices, where\nVoiceOver does not read the trigger's new name.\n\n**ARIA.** The trigger is a `button` with `aria-haspopup=\"listbox\"` and\n`aria-expanded`, named by the label and then the chosen words, as a native\n`<select>` is. The list is the listbox `Listbox` describes, named by the\nlabel, or by `list-label` where there is none.\n\nSet `autocomplete` to let a browser's autofill choose, as a native `<select>`\nwith the same attribute would.",
136075
136531
  "name": "HelixHeadlessSelect",
136076
136532
  "cssProperties": [
136077
136533
  {
@@ -136427,6 +136883,16 @@
136427
136883
  "description": "The chosen options, in the order they appear. None on a server or while hydrating, and none for `items`.",
136428
136884
  "readonly": true
136429
136885
  },
136886
+ {
136887
+ "kind": "field",
136888
+ "name": "chosen",
136889
+ "type": {
136890
+ "text": "string[]"
136891
+ },
136892
+ "privacy": "private",
136893
+ "description": "The chosen values, read against the options' values, so an option whose\nvalue holds a comma is one value. See `chosenValues`.",
136894
+ "readonly": true
136895
+ },
136430
136896
  {
136431
136897
  "kind": "field",
136432
136898
  "name": "data",
@@ -138511,7 +138977,7 @@
138511
138977
  "text": "string"
138512
138978
  },
138513
138979
  "default": "''",
138514
- "description": "What is loading, read out as the placeholder's name, such as \"Loading\nprofile\".\n\nAbsent hides the placeholder from screen readers.",
138980
+ "description": "What is loading, read out as the placeholder's name, such as \"Loading\nprofile\".\n\nAbsent hides the placeholder from screen readers. Around content, the name\nis read while `loading` is set, and the loaded content is read as it is.",
138515
138981
  "attribute": "label"
138516
138982
  },
138517
138983
  {
@@ -138893,7 +139359,7 @@
138893
139359
  "text": "string"
138894
139360
  },
138895
139361
  "default": "''",
138896
- "description": "What is loading, read out as the placeholder's name, such as \"Loading\nprofile\".\n\nAbsent hides the placeholder from screen readers.",
139362
+ "description": "What is loading, read out as the placeholder's name, such as \"Loading\nprofile\".\n\nAbsent hides the placeholder from screen readers. Around content, the name\nis read while `loading` is set, and the loaded content is read as it is.",
138897
139363
  "fieldName": "label"
138898
139364
  },
138899
139365
  {
@@ -148816,7 +149282,7 @@
148816
149282
  "declarations": [
148817
149283
  {
148818
149284
  "kind": "class",
148819
- "description": "Only the step's name is a button. The marker is `aria-hidden` decoration, so\nit is outside the button. The name uses `Button`, so the hover wash, the\nfocus ring, and the disabled style come from `Button`.\n\nEvery step can be pressed and fires `helix-select`. To stop the user from\nmoving to a step, set `disabled` on it.\n\nThe marker is a slot, and its fallback shows the step's state: a check for a\nfinished stage, a target for the current stage, and an empty ring for a stage\nnot reached yet. Only that one mark is rendered, so the accessibility tree\nhas no hidden marks.\n\nThe half lines on each side of the mark are drawn on the step's `::before`\nand `::after` from properties the list sets, so the step renders no extra\nelement for them.\n\nA finished stage says so in words: the name's button is described by\n`complete-label`, \"Complete\" unless you translate it, and a stage that\nbecomes complete while the page is open says it once in a polite live\nregion. The current stage's button carries `aria-current=\"step\"`, and only\nthe button, so the state is said once, on the control.",
149285
+ "description": "Only the step's name is a button. The marker is `aria-hidden` decoration, so\nit is outside the button. The name uses `Button`, so the hover wash, the\nfocus ring, and the disabled style come from `Button`.\n\nEvery step can be pressed and fires `helix-select`. To stop the user from\nmoving to a step, set `disabled` on it.\n\nThe marker is a slot, and its fallback shows the step's state: a check for a\nfinished stage, a target for the current stage, and an empty ring for a stage\nnot reached yet. Only that one mark is rendered, so the accessibility tree\nhas no hidden marks.\n\nThe half lines on each side of the mark are drawn on the step's `::before`\nand `::after` from properties the list sets, so the step renders no extra\nelement for them.\n\nA finished stage says so in words: the name's button is described by\n`complete-label`, \"Complete\" unless you translate it, and a stage that\nbecomes complete while the page is open says it once in a polite live\nregion. The current stage's button carries `aria-current=\"step\"`, and only\nthe button, so the state is said once, on the control.\n\nA stage's `content`, while it holds anything, is a group named by the\nstage's name, so a screen reader moving into it hears which stage it\nbelongs to.",
148820
149286
  "name": "HelixHeadlessStep",
148821
149287
  "cssParts": [
148822
149288
  {
@@ -148977,6 +149443,23 @@
148977
149443
  "description": "The value the step sends in `helix-select`.",
148978
149444
  "attribute": "value"
148979
149445
  },
149446
+ {
149447
+ "kind": "field",
149448
+ "name": "holding",
149449
+ "type": {
149450
+ "text": "boolean"
149451
+ },
149452
+ "privacy": "private",
149453
+ "default": "false",
149454
+ "description": "Whether anything is slotted into `content`, which makes it a named group."
149455
+ },
149456
+ {
149457
+ "kind": "field",
149458
+ "name": "readContent",
149459
+ "privacy": "private",
149460
+ "readonly": true,
149461
+ "description": "Reads whether the `content` slot holds anything."
149462
+ },
148980
149463
  {
148981
149464
  "kind": "field",
148982
149465
  "name": "status",
@@ -155659,7 +156142,7 @@
155659
156142
  "declarations": [
155660
156143
  {
155661
156144
  "kind": "class",
155662
- "description": "An inactive panel is hidden and stays mounted. Anything typed into it is\nstill there when the person comes back, and the content of every panel is in\nthe server-rendered markup for crawlers, whichever tab is open.\n\nThe host is the `tabpanel` while its tab is selected, through\n`ElementInternals`, so the tab's `aria-controls` can reach it from the tab's\nshadow root. The box inside is a tab stop only while the panel holds nothing\nfocusable, as the ARIA tabs pattern and React Aria's tab panel do: Tab from\nthe tab list lands on the panel's first link or control where there is one,\nand on the panel itself where there is none.",
156145
+ "description": "An inactive panel is hidden and stays mounted. Anything typed into it is\nstill there when the person comes back, and the content of every panel is in\nthe server-rendered markup for crawlers, whichever tab is open.\n\nThe host is the `tabpanel` while its tab is selected, through\n`ElementInternals`, so the tab's `aria-controls` can reach it from the tab's\nshadow root. The box inside is a tab stop only while the panel holds nothing\nfocusable, as the ARIA tabs pattern and React Aria's tab panel do: Tab from\nthe tab list lands on the panel's first link or control where there is one,\nand on the panel itself where there is none.\n\n**Set `lazy` for a panel that is expensive to draw.** Its content waits in a\n`<template>` inside it, and goes into the panel the first time the panel is\nshown, so it costs nothing until a reader opens that tab. Once in, it stays.\nThe panel sends `helix-load` at the same moment, for content your code\nrenders itself.",
155663
156146
  "name": "HelixHeadlessTabPanel",
155664
156147
  "cssParts": [
155665
156148
  {
@@ -155669,7 +156152,7 @@
155669
156152
  ],
155670
156153
  "slots": [
155671
156154
  {
155672
- "description": "The panel's content.",
156155
+ "description": "The panel's content. Under `lazy`, a `<template>` holding it.",
155673
156156
  "name": ""
155674
156157
  }
155675
156158
  ],
@@ -155683,6 +156166,37 @@
155683
156166
  "default": "''",
155684
156167
  "description": "The name of the panel, which is the text of the tab that opens it.\n\nSet by the root, which is the only thing that sees both. No attribute,\nbecause it is coordination between elements rather than anything a consumer\nwrites: the tab already says it.\n\nA string and not a reference: an IDREF resolves only in the tree it is\nwritten in, and the tab's control is inside the tab's shadow root, which no\nreference from the light DOM can reach. `aria-label` on a `tabpanel` is how\nthe pattern names one anyway."
155685
156168
  },
156169
+ {
156170
+ "kind": "field",
156171
+ "name": "lazy",
156172
+ "type": {
156173
+ "text": "boolean"
156174
+ },
156175
+ "default": "false",
156176
+ "description": "Whether the panel's content waits in a `<template>` until the panel is\nfirst shown.",
156177
+ "attribute": "lazy"
156178
+ },
156179
+ {
156180
+ "kind": "field",
156181
+ "name": "loaded",
156182
+ "type": {
156183
+ "text": "boolean"
156184
+ },
156185
+ "privacy": "private",
156186
+ "default": "false",
156187
+ "description": "Whether a `lazy` panel has put its content in."
156188
+ },
156189
+ {
156190
+ "kind": "method",
156191
+ "name": "load",
156192
+ "privacy": "private",
156193
+ "return": {
156194
+ "type": {
156195
+ "text": "void"
156196
+ }
156197
+ },
156198
+ "description": "Puts a `lazy` panel's content in the first time the panel is shown: the\ncontent of each `<template>` it holds, in place of the template."
156199
+ },
155686
156200
  {
155687
156201
  "kind": "field",
155688
156202
  "name": "selected",
@@ -156066,7 +156580,26 @@
156066
156580
  }
156067
156581
  }
156068
156582
  ],
156583
+ "events": [
156584
+ {
156585
+ "type": {
156586
+ "text": "HelixLoadEvent"
156587
+ },
156588
+ "description": "Fired the first time a `lazy` panel is shown, once its template's content is in.",
156589
+ "name": "helix-load",
156590
+ "reactProp": "onhelix-load"
156591
+ }
156592
+ ],
156069
156593
  "attributes": [
156594
+ {
156595
+ "name": "lazy",
156596
+ "type": {
156597
+ "text": "boolean"
156598
+ },
156599
+ "default": "false",
156600
+ "description": "Whether the panel's content waits in a `<template>` until the panel is\nfirst shown.",
156601
+ "fieldName": "lazy"
156602
+ },
156070
156603
  {
156071
156604
  "name": "selected",
156072
156605
  "type": {
@@ -156087,6 +156620,10 @@
156087
156620
  }
156088
156621
  ],
156089
156622
  "cssStates": [
156623
+ {
156624
+ "description": "Once a `lazy` panel has been shown and its content is in.",
156625
+ "name": "loaded"
156626
+ },
156090
156627
  {
156091
156628
  "description": "While its tab is the one selected.",
156092
156629
  "name": "selected"
@@ -156147,7 +156684,7 @@
156147
156684
  "declarations": [
156148
156685
  {
156149
156686
  "kind": "class",
156150
- "description": "Selection works through an event, the same as in the accordion and the tree.\nA tab dispatches `helix-select`, and the root pairs it with the panel of the\nsame value. Nothing registers with anything, so tabs added later work with no\nextra setup.\n\nThe tab list is a single tab stop, and the arrow keys move between tabs\nthrough `KeyboardNavigationController`, the same as in the radio and toggle\ngroups. Selection follows focus, which suits a small set where showing a\npanel is cheap. Set `manual` when showing a panel is expensive, so focus can\nmove without selecting.\n\n`orientation=\"vertical\"` sets the tabs in a column beside the panels, and the\ntab list says `aria-orientation=\"vertical\"`. The arrow keys of both axes move\nbetween tabs either way.\n\nA tab with an `href` is a link, for tabs that are pages of a site. Pressing\nit follows the link. Where any tab is a link, the arrow keys move focus\nwithout choosing on every tab of the list, as under `manual`, so arrowing\npast a tab never leaves the page and the list answers the keys one way.\nMark the tab of the page you are on with `selected`, or set `active` to its\nvalue.\n\nEach tab says which panel it controls through `aria-controls`, set as an\nelement reference to the panel's host, where the engine has reflection.\n\nKeys, on the tab list: Left and Right Arrow move between tabs, and so do Up\nand Down; Home and End go to the first and the last. The horizontal arrows\nfollow the reading direction, so on a right-to-left page Left moves on.\nDisabled tabs are passed over. Tab leaves the list for the selected panel,\nwhich is a tab stop only while it holds nothing focusable.\n\n**Keyboard.**\n\n| Key | What it does |\n|---|---|\n| 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. |\n| Left, Up | Moves to the tab before, from the first round to the last. |\n| Home, End | Moves to the first or the last tab. |\n| Enter, Space | Selects the tab with focus, or follows its link. |\n| Tab | Leaves the list for the selected panel. |\n\nRemoving the selected tab selects the first enabled tab that is left, and\n`active` says so, with `helix-activate`. Where the removed tab had focus,\nfocus moves to the tab now selected.\n\n**More tabs than fit.** With `scroll-controls`, a strip that scrolls shows a\nbutton at each end it can scroll toward, as Web Awesome's tab group does,\nand a press scrolls it most of its own length. The buttons are for the\npointer, so they are out of the tab order and hidden from screen readers;\nthe arrow keys already reach every tab, and the strip scrolls the selected\ntab into view. A strip scrolls once a stylesheet gives the `tabs` part an\n`overflow`, as the styled tier does.\n\nA tab with `dismissible` can be closed: see `Tabs.Tab`.\n\nThe `indicator` part moves to the selected tab and carries its place and\nsize, so a mark of your own can be drawn there: style the part, or slot an\nelement into `indicator`, which sits inside the part and reads the same\nproperties.",
156687
+ "description": "Selection works through an event, the same as in the accordion and the tree.\nA tab dispatches `helix-select`, and the root pairs it with the panel of the\nsame value. Nothing registers with anything, so tabs added later work with no\nextra setup.\n\nThe tab list is a single tab stop, and the arrow keys move between tabs\nthrough `KeyboardNavigationController`, the same as in the radio and toggle\ngroups. Selection follows focus, which suits a small set where showing a\npanel is cheap. Set `manual` when showing a panel is expensive, so focus can\nmove without selecting.\n\n`orientation=\"vertical\"` sets the tabs in a column beside the panels, and the\ntab list says `aria-orientation=\"vertical\"`. The arrow keys of both axes move\nbetween tabs either way.\n\nA tab with an `href` is a link, for tabs that are pages of a site. Pressing\nit follows the link. Where any tab is a link, the arrow keys move focus\nwithout choosing on every tab of the list, as under `manual`, so arrowing\npast a tab never leaves the page and the list answers the keys one way.\nMark the tab of the page you are on with `selected`, or set `active` to its\nvalue.\n\nEach tab says which panel it controls through `aria-controls`, set as an\nelement reference to the panel's host, where the engine has reflection.\n\nKeys, on the tab list: Left and Right Arrow move between tabs, and so do Up\nand Down; Home and End go to the first and the last. The horizontal arrows\nfollow the reading direction, so on a right-to-left page Left moves on.\nDisabled tabs are passed over. Tab leaves the list for the selected panel,\nwhich is a tab stop only while it holds nothing focusable.\n\n**Keyboard.**\n\n| Key | What it does |\n|---|---|\n| 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. |\n| Left, Up | Moves to the tab before, from the first round to the last. |\n| Home, End | Moves to the first or the last tab. |\n| Enter, Space | Selects the tab with focus, or follows its link. |\n| Tab | Leaves the list for the selected panel. |\n\nRemoving the selected tab selects the enabled tab beside it, the next one\nor else the one before, and `active` says so, with `helix-activate`. Where\nthe removed tab had focus, focus moves to the tab now selected.\n\n**More tabs than fit.** With `scroll-controls`, a strip that scrolls shows a\nbutton at each end it can scroll toward, as Web Awesome's tab group does,\nand a press scrolls it most of its own length. The buttons are for the\npointer, so they are out of the tab order and hidden from screen readers;\nthe arrow keys already reach every tab, and the strip scrolls the selected\ntab into view. A strip scrolls once a stylesheet gives the `tabs` part an\n`overflow`, as the styled tier does.\n\nA tab with `dismissible` can be closed: see `Tabs.Tab`.\n\nThe `indicator` part moves to the selected tab and carries its place and\nsize, so a mark of your own can be drawn there: style the part, or slot an\nelement into `indicator`, which sits inside the part and reads the same\nproperties.",
156151
156688
  "name": "HelixHeadlessTabs",
156152
156689
  "cssParts": [
156153
156690
  {
@@ -156162,10 +156699,18 @@
156162
156699
  "description": "The button that scrolls the strip toward its end, shown under `scroll-controls` while there is more that way.",
156163
156700
  "name": "scroll-end"
156164
156701
  },
156702
+ {
156703
+ "description": "The glyph on that button, where none is slotted.",
156704
+ "name": "scroll-end-mark"
156705
+ },
156165
156706
  {
156166
156707
  "description": "The button that scrolls the strip toward its start, shown under `scroll-controls` while there is more that way.",
156167
156708
  "name": "scroll-start"
156168
156709
  },
156710
+ {
156711
+ "description": "The glyph on that button, where none is slotted.",
156712
+ "name": "scroll-start-mark"
156713
+ },
156169
156714
  {
156170
156715
  "description": "The tab list.",
156171
156716
  "name": "tabs"
@@ -156183,6 +156728,14 @@
156183
156728
  {
156184
156729
  "description": "The panels, as direct children of this element. Panels inside a wrapper are not paired with tabs, because pairing reads only the direct children.",
156185
156730
  "name": "panels"
156731
+ },
156732
+ {
156733
+ "description": "Replaces the glyph on the button that scrolls the strip toward its end.",
156734
+ "name": "scroll-end-icon"
156735
+ },
156736
+ {
156737
+ "description": "Replaces the glyph on the button that scrolls the strip toward its start.",
156738
+ "name": "scroll-start-icon"
156186
156739
  }
156187
156740
  ],
156188
156741
  "members": [
@@ -156362,6 +156915,31 @@
156362
156915
  "default": "[]",
156363
156916
  "description": "The values of the tabs the last pairing read, to tell a removed tab from one not yet here."
156364
156917
  },
156918
+ {
156919
+ "kind": "method",
156920
+ "name": "beside",
156921
+ "privacy": "private",
156922
+ "return": {
156923
+ "type": {
156924
+ "text": "HelixHeadlessTab | undefined"
156925
+ }
156926
+ },
156927
+ "parameters": [
156928
+ {
156929
+ "name": "gone",
156930
+ "type": {
156931
+ "text": "string"
156932
+ }
156933
+ },
156934
+ {
156935
+ "name": "tabs",
156936
+ "type": {
156937
+ "text": "HelixHeadlessTab[]"
156938
+ }
156939
+ }
156940
+ ],
156941
+ "description": "The enabled tab nearest to where a removed one stood: the next ones\nnearest first, then the ones before it nearest first. The same order a\ndismissed tab hands focus in."
156942
+ },
156365
156943
  {
156366
156944
  "kind": "method",
156367
156945
  "name": "sync",
@@ -156445,7 +157023,26 @@
156445
157023
  }
156446
157024
  }
156447
157025
  ],
156448
- "description": "One of the two scroll buttons, pointing the way it scrolls. A caret along\nthe line is mirrored on a right-to-left page, and one down a column is not."
157026
+ "description": "One of the two scroll buttons, with the glyph pointing the way it scrolls."
157027
+ },
157028
+ {
157029
+ "kind": "method",
157030
+ "name": "renderScrollIcon",
157031
+ "privacy": "protected",
157032
+ "return": {
157033
+ "type": {
157034
+ "text": "TemplateResult"
157035
+ }
157036
+ },
157037
+ "parameters": [
157038
+ {
157039
+ "name": "toward",
157040
+ "type": {
157041
+ "text": "1 | -1"
157042
+ }
157043
+ }
157044
+ ],
157045
+ "description": "The glyph on a scroll button, behind a seam: slot fallback, so a consumer\nreplaces it by slotting, and a method, so a tier above replaces it by\noverriding. A caret along the line is mirrored on a right-to-left page, and\none down a column is not."
156449
157046
  },
156450
157047
  {
156451
157048
  "kind": "field",
@@ -157073,13 +157670,17 @@
157073
157670
  "declarations": [
157074
157671
  {
157075
157672
  "kind": "class",
157076
- "description": "A tab is an element, because it manages selection and its own tab stop.\n\nWith an `href`, the tab is a link: `role=\"tab\"` on an `<a>`, which a press,\nEnter and the browser's own link gestures follow. `helix-select` is sent\nfirst, and canceling it keeps the browser from following, so a client-side\nrouter follows it instead.\n\nWith `dismissible`, the tab can be closed, as Web Awesome's closable tab\ncan: a press on its `dismiss` mark, or Delete or Backspace while the tab\nhas focus, sends `helix-dismiss`. The tab does not remove itself, because\nyour code owns the set, so remove the tab and its panel in your handler.\nFocus moves to the tab beside it, and the tab set selects a tab that is\nleft.\nThe tab says the key through `aria-keyshortcuts`, and the mark is for the\npointer, hidden from screen readers.",
157673
+ "description": "A tab is an element, because it manages selection and its own tab stop.\n\nWith an `href`, the tab is a link: `role=\"tab\"` on an `<a>`, which a press,\nEnter and the browser's own link gestures follow. `helix-select` is sent\nfirst, and canceling it keeps the browser from following, so a client-side\nrouter follows it instead.\n\nWith `dismissible`, the tab can be closed, as Web Awesome's closable tab\ncan: a press on its `dismiss` mark, or Delete or Backspace while the tab\nhas focus, sends `helix-dismiss`. The tab does not remove itself, because\nyour code owns the set, so remove the tab and its panel in your handler.\nFocus moves to the tab beside it, and where the tab was selected, the tab\nset selects that same tab.\nThe tab says the key through `aria-keyshortcuts`, and the mark is for the\npointer, hidden from screen readers.",
157077
157674
  "name": "HelixHeadlessTab",
157078
157675
  "cssParts": [
157079
157676
  {
157080
157677
  "description": "The mark a pointer presses to close a `dismissible` tab.",
157081
157678
  "name": "dismiss"
157082
157679
  },
157680
+ {
157681
+ "description": "The glyph on that mark, where none is slotted.",
157682
+ "name": "dismiss-mark"
157683
+ },
157083
157684
  {
157084
157685
  "description": "The tab itself.",
157085
157686
  "name": "tab"
@@ -157089,6 +157690,10 @@
157089
157690
  {
157090
157691
  "description": "The tab's label.",
157091
157692
  "name": ""
157693
+ },
157694
+ {
157695
+ "description": "Replaces the glyph on the mark that closes a `dismissible` tab.",
157696
+ "name": "dismiss-icon"
157092
157697
  }
157093
157698
  ],
157094
157699
  "members": [
@@ -157287,7 +157892,7 @@
157287
157892
  "text": "HTMLElement | undefined"
157288
157893
  }
157289
157894
  },
157290
- "description": "The tab stop after this element on the page, or the one before it at the\nend, for a lone element whose removal would drop focus to the body.\n\n**A lone Callout or Announcement had nowhere to hand focus**, so a\nkeyboard reader who dismissed one started again from the top of the\npage. React Aria's Toast hands focus on the same way. Read before the\nevent, in the order Tab reaches the stops, while this element's own are\nstill among them.",
157895
+ "description": "The tab stop after this element on the page, or the one before it at the\nend, for an element whose removal would drop focus to the body because\nno neighbor of its kind has a control to take it.\n\n**A lone Callout or Announcement had nowhere to hand focus**, so a\nkeyboard reader who dismissed one started again from the top of the\npage. React Aria's Toast hands focus on the same way. Read before the\nevent, in the order Tab reaches the stops, while this element's own are\nstill among them.",
157291
157896
  "inheritedFrom": {
157292
157897
  "name": "MixinDismissible",
157293
157898
  "module": "src/mixins/mixin-dismissible/mixin-dismissible.ts"
@@ -159108,7 +159713,7 @@
159108
159713
  "text": "HTMLElement | undefined"
159109
159714
  }
159110
159715
  },
159111
- "description": "The tab stop after this element on the page, or the one before it at the\nend, for a lone element whose removal would drop focus to the body.\n\n**A lone Callout or Announcement had nowhere to hand focus**, so a\nkeyboard reader who dismissed one started again from the top of the\npage. React Aria's Toast hands focus on the same way. Read before the\nevent, in the order Tab reaches the stops, while this element's own are\nstill among them.",
159716
+ "description": "The tab stop after this element on the page, or the one before it at the\nend, for an element whose removal would drop focus to the body because\nno neighbor of its kind has a control to take it.\n\n**A lone Callout or Announcement had nowhere to hand focus**, so a\nkeyboard reader who dismissed one started again from the top of the\npage. React Aria's Toast hands focus on the same way. Read before the\nevent, in the order Tab reaches the stops, while this element's own are\nstill among them.",
159112
159717
  "inheritedFrom": {
159113
159718
  "name": "MixinDismissible",
159114
159719
  "module": "src/mixins/mixin-dismissible/mixin-dismissible.ts"
@@ -169502,7 +170107,7 @@
169502
170107
  "declarations": [
169503
170108
  {
169504
170109
  "kind": "class",
169505
- "description": "Each message is an element because it has a timeout, a tone, a dismiss\ncontrol, and a lifetime that pauses.\n\n**Each item runs its own timer.** A timer held by the region would restart\nwith each new message, and the last of three messages would stay for nine\nseconds. It pauses while the pointer or focus is on the message, and while\nthe page is hidden, so a message is not spent in a background tab.\n\n**Each message is an `alertdialog` named by its words**, which is how a reader\nwho moves into the stack hears which message they are on. Give it a\n`heading` and a `description`, and the heading names it and the description\ndescribes it, for a message with a title and a line of detail. The region\nsays each message once as it arrives, a `danger` one assertively, so a\nmessage is never a live region of its own.\n\nA touch or a pen swipes a message toward the end of the line, and past\nhalfway, or quickly, dismisses it through the same `helix-dismiss` as its\ncontrol. While it moves, the distance is on the `item` part as\n`--toast-swipe-x`.\n\n**Escape dismisses the message holding focus**, through the same\n`helix-dismiss`, and focus moves to the next message.\n\n**Messages are inverted by default.** The item flips `color-scheme`, so a new\nmessage stands out from the page without using a color that carries meaning.",
170110
+ "description": "Each message is an element because it has a timeout, a tone, a dismiss\ncontrol, and a lifetime that pauses.\n\n**Each item runs its own timer.** A timer held by the region would restart\nwith each new message, and the last of three messages would stay for nine\nseconds. It pauses while the pointer or focus is on the message or anywhere\nin the region's stack, and while the page is hidden, so a message is not\nspent in a background tab.\n\n**Each message is an `alertdialog` named by its words**, which is how a reader\nwho moves into the stack hears which message they are on. Give it a\n`heading` and a `description`, and the heading names it and the description\ndescribes it, for a message with a title and a line of detail. The region\nsays each message once as it arrives, a `danger` one assertively, so a\nmessage is never a live region of its own.\n\nA touch or a pen swipes a message toward the end of the line, or toward the\nedge the region's `swipe-direction` names, and past halfway, or quickly,\ndismisses it through the same `helix-dismiss` as its control. While it\nmoves, the distance is on the `item` part as `--toast-swipe-x` or\n`--toast-swipe-y`.\n\n**Escape dismisses the message holding focus**, through the same\n`helix-dismiss`, and focus moves to the next message.\n\n**Messages are inverted by default.** The item flips `color-scheme`, so a new\nmessage stands out from the page without using a color that carries meaning.",
169506
170111
  "name": "HelixHeadlessToastItem",
169507
170112
  "cssProperties": [
169508
170113
  {
@@ -169512,6 +170117,10 @@
169512
170117
  {
169513
170118
  "description": "How far a swipe has moved the message across, in pixels, toward the right.",
169514
170119
  "name": "--toast-swipe-x"
170120
+ },
170121
+ {
170122
+ "description": "How far a swipe has moved the message down, in pixels, under a `swipe-direction` of `top` or `bottom`.",
170123
+ "name": "--toast-swipe-y"
169515
170124
  }
169516
170125
  ],
169517
170126
  "cssParts": [
@@ -169615,12 +170224,43 @@
169615
170224
  "description": "Whether the message is still showing.\n\nThe item always applies: it goes when it is asked to, having announced\n`helix-dismiss` first, and a consumer who owns the list refuses that event\nto take the decision instead.\n\n**No `default-open`, unlike the four mixins.** A `default-` seed exists so\nmarkup can choose a starting state without claiming ownership, and there is\nonly one starting state that makes sense: a message that has been rendered\nis showing. An attribute whose only legal value is the default is an\nattribute nobody can use.",
169616
170225
  "attribute": "open"
169617
170226
  },
170227
+ {
170228
+ "kind": "field",
170229
+ "name": "regionHolding",
170230
+ "type": {
170231
+ "text": "boolean"
170232
+ },
170233
+ "privacy": "private",
170234
+ "default": "false",
170235
+ "description": "Whether the timer is held for `regionHeld`, so the hold is let go once."
170236
+ },
170237
+ {
170238
+ "kind": "method",
170239
+ "name": "holdForRegion",
170240
+ "privacy": "private",
170241
+ "return": {
170242
+ "type": {
170243
+ "text": "void"
170244
+ }
170245
+ },
170246
+ "description": "Holds the timer while the region asks, and lets it go once."
170247
+ },
170248
+ {
170249
+ "kind": "field",
170250
+ "name": "swipeTo",
170251
+ "type": {
170252
+ "text": "ReturnType<typeof swipeEdge>"
170253
+ },
170254
+ "privacy": "private",
170255
+ "description": "The physical edge a swipe dismisses toward.",
170256
+ "readonly": true
170257
+ },
169618
170258
  {
169619
170259
  "kind": "field",
169620
170260
  "name": "swipes",
169621
170261
  "privacy": "protected",
169622
170262
  "readonly": true,
169623
- "default": "new SwipeController(this, { axis: () => (this.open ? 'x' : undefined), end: (dx, _dy, vx) => { const edge = swipeEdge('end', isRtl(this)) const width = this.partNamed('item')?.getBoundingClientRect().width ?? 0 const shown = settleSwipe({ points: [1], size: width, travel: Math.max(0, towardEdge(edge, dx, 0)), velocity: towardEdge(edge, vx, 0), }) if (shown === 0 && this.dismiss()) { return } this.slide(0) }, move: (dx) => this.slide(Math.max(0, towardEdge(swipeEdge('end', isRtl(this)), dx, 0))), start: (_target, event) => event.pointerType !== 'mouse', surface: () => this.partNamed('item'), })"
170263
+ "default": "new SwipeController(this, { axis: () => (this.open ? swipeAxis(this.swipeTo) : undefined), end: (dx, dy, vx, vy) => { const edge = this.swipeTo const box = this.partNamed('item')?.getBoundingClientRect() const across = swipeAxis(edge) === 'x' const shown = settleSwipe({ points: [1], size: (across ? box?.width : box?.height) ?? 0, travel: Math.max(0, towardEdge(edge, dx, dy)), velocity: towardEdge(edge, vx, vy), }) if (shown === 0 && this.dismiss()) { return } this.slide(0) }, move: (dx, dy) => this.slide(Math.max(0, towardEdge(this.swipeTo, dx, dy))), start: (_target, event) => event.pointerType !== 'mouse', surface: () => this.partNamed('item'), })"
169624
170264
  },
169625
170265
  {
169626
170266
  "kind": "method",
@@ -169639,7 +170279,7 @@
169639
170279
  }
169640
170280
  }
169641
170281
  ],
169642
- "description": "Writes how far a swipe has moved the message toward the end of the line."
170282
+ "description": "Writes how far a swipe has moved the message toward its edge."
169643
170283
  },
169644
170284
  {
169645
170285
  "kind": "field",
@@ -169905,7 +170545,7 @@
169905
170545
  "text": "HTMLElement | undefined"
169906
170546
  }
169907
170547
  },
169908
- "description": "The tab stop after this element on the page, or the one before it at the\nend, for a lone element whose removal would drop focus to the body.\n\n**A lone Callout or Announcement had nowhere to hand focus**, so a\nkeyboard reader who dismissed one started again from the top of the\npage. React Aria's Toast hands focus on the same way. Read before the\nevent, in the order Tab reaches the stops, while this element's own are\nstill among them.",
170548
+ "description": "The tab stop after this element on the page, or the one before it at the\nend, for an element whose removal would drop focus to the body because\nno neighbor of its kind has a control to take it.\n\n**A lone Callout or Announcement had nowhere to hand focus**, so a\nkeyboard reader who dismissed one started again from the top of the\npage. React Aria's Toast hands focus on the same way. Read before the\nevent, in the order Tab reaches the stops, while this element's own are\nstill among them.",
169909
170549
  "inheritedFrom": {
169910
170550
  "name": "MixinDismissible",
169911
170551
  "module": "src/mixins/mixin-dismissible/mixin-dismissible.ts"
@@ -170392,7 +171032,7 @@
170392
171032
  "name": "closed"
170393
171033
  },
170394
171034
  {
170395
- "description": "The dismiss timer is paused, while a pointer or focus is on the message, or while the page is hidden.",
171035
+ "description": "The dismiss timer is paused, while a pointer or focus is on the message or in the stack, or while the page is hidden.",
170396
171036
  "name": "paused"
170397
171037
  },
170398
171038
  {
@@ -170458,7 +171098,7 @@
170458
171098
  "declarations": [
170459
171099
  {
170460
171100
  "kind": "class",
170461
- "description": "The region and its items are one family because a live region must be in the\ndocument before a message is added to it. Assistive technology often does not\nannounce a region that arrives already holding its message. `Radio.Group` is\npart of its family for the same reason.\n\n**The region is a landmark named by `label`, and it says each message once\nas it arrives**: a `danger` message assertively, and every other one\npolitely. It says the word for the tone, the heading, the description and\nthe text, and not the actions, through two live regions of its own, the\n`live` parts, which it empties again a moment later. The stack itself is not\na live region, so a message is never said twice, and changing the words of a\nmessage already showing says nothing. Each message is an `alertdialog` named\nby its words, so a reader who moves into the stack hears which message they\nare on.\n\n**`hotkey` takes focus to the stack and back**, F8 unless you set it, and\n`label` says which key: `{hotkey}` in it is filled in, so the default name\nis \"Notifications (F8)\". Pressed while focus is in the stack, it gives focus\nback to where it was.\n\n**The region never creates or removes items.** You render items and remove\nthem. An item requests closing with a cancelable `helix-dismiss` event. A\ndismissed item hides itself and stays in the DOM, so your framework's state\nand the DOM stay in sync. It hides on its own unless you set `open`, which\nmakes the state yours.\n\n**`add()` shows a message from script**, for a page with no framework state\nto render them from: it appends a message of the region's own tier and\nremoves it once it has been dismissed and has finished leaving. Messages\nyou render yourself stay yours, and the region never removes them. A touch\nor a pen swipes a message away toward the end of the line.\n\n**The stack is in the top layer.** The `region` part is a `popover=\"manual\"`\nshown while a message is showing, and shown again above a modal dialog that\nopened after it. Position the `region` part, which is the box in the top\nlayer. While a modal `Dialog`, `Drawer` or `Lightbox` is open, the browser\nmakes everything outside it inert, the stack included, so a message stays\nvisible and its actions cannot be pressed. Where the browser has\n`ariaNotify`, a message that arrives then is announced through it. For a\nmessage with an action, render a second region inside the dialog.\n\nWhen a message with focus inside it is dismissed, focus moves to the next\nmessage, then the one before it, then back to where it was before it entered\nthe stack.\n\n**`max-visible` limits how many messages show at once**, as Zag's `max`\ndoes. The messages after that many, in document order, wait: each is hidden,\nits timer has not started, and the region says it once it shows, when a\nmessage before it goes. A waiting message has `:state(waiting)`.\n\n**Keyboard.**\n\n| Key | What it does |\n|---|---|\n| F8, or your `hotkey` | Moves focus to the first control in the stack, and back to where it was when pressed in the stack. |\n| Tab, Shift+Tab | Moves between the controls of the messages. |\n| Escape | Dismisses the message holding focus. Focus moves to the next message, then the one before it, then back to where it was. |",
171101
+ "description": "The region and its items are one family because a live region must be in the\ndocument before a message is added to it. Assistive technology often does not\nannounce a region that arrives already holding its message. `Radio.Group` is\npart of its family for the same reason.\n\n**The region is a landmark named by `label`, and it says each message once\nas it arrives**: a `danger` message assertively, and every other one\npolitely. It says the word for the tone, the heading, the description and\nthe text, and not the actions, through two live regions of its own, the\n`live` parts, which it empties again a moment later. The stack itself is not\na live region, so a message is never said twice, and changing the words of a\nmessage already showing says nothing. Each message is an `alertdialog` named\nby its words, so a reader who moves into the stack hears which message they\nare on.\n\n**`hotkey` takes focus to the stack and back**, F8 unless you set it, and\n`label` says which key: `{hotkey}` in it is filled in, so the default name\nis \"Notifications (F8)\". Pressed while focus is in the stack, it gives focus\nback to where it was.\n\n**The region never creates or removes items.** You render items and remove\nthem. An item requests closing with a cancelable `helix-dismiss` event. A\ndismissed item hides itself and stays in the DOM, so your framework's state\nand the DOM stay in sync. It hides on its own unless you set `open`, which\nmakes the state yours.\n\n**`add()` shows a message from script**, for a page with no framework state\nto render them from: it appends a message of the region's own tier and\nremoves it once it has been dismissed and has finished leaving. Messages\nyou render yourself stay yours, and the region never removes them. A touch\nor a pen swipes a message away toward the end of the line, or toward the\nedge `swipe-direction` names.\n\n**Every message's timer waits while a pointer or focus is in the stack**, as\nReact Aria's and Radix's regions do, so a reader moving from one message to\nthe next does not lose the one behind them.\n\n**The stack is in the top layer.** The `region` part is a `popover=\"manual\"`\nshown while a message is showing, and shown again above a modal dialog that\nopened after it. Position the `region` part, which is the box in the top\nlayer. While a modal `Dialog`, `Drawer` or `Lightbox` is open, the browser\nmakes everything outside it inert, the stack included, so a message stays\nvisible and its actions cannot be pressed. Where the browser has\n`ariaNotify`, a message that arrives then is announced through it. For a\nmessage with an action, render a second region inside the dialog.\n\nWhen a message with focus inside it is dismissed, focus moves to the next\nmessage, then the one before it, then back to where it was before it entered\nthe stack.\n\n**`max-visible` limits how many messages show at once**, as Zag's `max`\ndoes. The messages after that many, in document order, wait: each is hidden,\nits timer has not started, and the region says it once it shows, when a\nmessage before it goes. A waiting message has `:state(waiting)`.\n\n**Keyboard.**\n\n| Key | What it does |\n|---|---|\n| F8, or your `hotkey` | Moves focus to the first control in the stack, and back to where it was when pressed in the stack. |\n| Tab, Shift+Tab | Moves between the controls of the messages. |\n| Escape | Dismisses the message holding focus. Focus moves to the next message, then the one before it, then back to where it was. |",
170462
171102
  "name": "HelixHeadlessToast",
170463
171103
  "cssParts": [
170464
171104
  {
@@ -170529,6 +171169,15 @@
170529
171169
  "attribute": "placement",
170530
171170
  "reflects": true
170531
171171
  },
171172
+ {
171173
+ "kind": "field",
171174
+ "name": "swipeDirection",
171175
+ "type": {
171176
+ "text": "'bottom' | 'end' | 'start' | 'top' | undefined"
171177
+ },
171178
+ "description": "The edge a touch or a pen swipes a message toward to dismiss it: `end`,\nthe end of the line, or `start`, `top` or `bottom`. Unset is `end`.",
171179
+ "attribute": "swipe-direction"
171180
+ },
170532
171181
  {
170533
171182
  "kind": "field",
170534
171183
  "name": "said",
@@ -170704,6 +171353,56 @@
170704
171353
  "description": "The messages that are showing, in order.",
170705
171354
  "readonly": true
170706
171355
  },
171356
+ {
171357
+ "kind": "field",
171358
+ "name": "pointerIn",
171359
+ "type": {
171360
+ "text": "boolean"
171361
+ },
171362
+ "privacy": "private",
171363
+ "default": "false",
171364
+ "description": "Whether a pointer is over the stack."
171365
+ },
171366
+ {
171367
+ "kind": "field",
171368
+ "name": "focusIn",
171369
+ "type": {
171370
+ "text": "boolean"
171371
+ },
171372
+ "privacy": "private",
171373
+ "default": "false",
171374
+ "description": "Whether focus is in the stack."
171375
+ },
171376
+ {
171377
+ "kind": "method",
171378
+ "name": "inform",
171379
+ "privacy": "private",
171380
+ "return": {
171381
+ "type": {
171382
+ "text": "void"
171383
+ }
171384
+ },
171385
+ "description": "Tells every message whether the stack holds its timer and which way it\nswipes, which only the region knows."
171386
+ },
171387
+ {
171388
+ "kind": "field",
171389
+ "name": "handlePointerEnter",
171390
+ "privacy": "private",
171391
+ "readonly": true
171392
+ },
171393
+ {
171394
+ "kind": "field",
171395
+ "name": "handlePointerLeave",
171396
+ "privacy": "private",
171397
+ "readonly": true
171398
+ },
171399
+ {
171400
+ "kind": "field",
171401
+ "name": "handleFocusOut",
171402
+ "privacy": "private",
171403
+ "readonly": true,
171404
+ "description": "Focus leaving the stack, and not moving between its messages."
171405
+ },
170707
171406
  {
170708
171407
  "kind": "field",
170709
171408
  "name": "held",
@@ -171210,6 +171909,14 @@
171210
171909
  },
171211
171910
  "description": "Which corner or edge the stack sits at.\n\nNamed here rather than on each message, because where a page puts its\ntoasts is a fact about the page: a stack whose members disagreed about\nwhere they were would not be a stack.\n\n**Six corners in one word, where `Carousel` splits the same question in\ntwo.** That family takes a placement and an alignment, and argues at its own\ndeclaration that one attribute naming both facts multiplies rather than\ncomposing. It is right there and wrong here, and the difference is the\nshape of the product. A carousel's is ragged: its `overlay` belongs to no\nedge at all, and its two groups of chrome move independently, shipping\ndifferent defaults so they do not land on each other, which is what makes\nrewriting one to move the other a real cost. A stack's is two edges by\nthree alignments, every pair real and every pair named this way by every\ntoast a reader has already met. Fusing spells the domain out and loses\nnothing; a stack has one position and takes it once.\n\n**Optional, and bottom-end is the absence of it.** Reflecting *and*\ndefaulting is the pair that writes onto a host: every toast region anybody\nrendered would gain a `placement=\"bottom-end\"` nobody typed, which a React\nconsumer's server markup does not have. A sheet carries the resting\narrangement in its own `:host` rule and the selectors describe only the\ndepartures, which is what `orientation` does.",
171212
171911
  "fieldName": "placement"
171912
+ },
171913
+ {
171914
+ "name": "swipe-direction",
171915
+ "type": {
171916
+ "text": "'bottom' | 'end' | 'start' | 'top' | undefined"
171917
+ },
171918
+ "description": "The edge a touch or a pen swipes a message toward to dismiss it: `end`,\nthe end of the line, or `start`, `top` or `bottom`. Unset is `end`.",
171919
+ "fieldName": "swipeDirection"
171213
171920
  }
171214
171921
  ],
171215
171922
  "superclass": {
@@ -175862,7 +176569,7 @@
175862
176569
  "declarations": [
175863
176570
  {
175864
176571
  "kind": "class",
175865
- "description": "The root holds the order of the stops: which stop is current, what Next and\nBack do, and when the tour is finished. Each stop holds its target, and you\nwrite all the text.\n\n**The spotlight is a shadow.** The scrim is a box the size of the current\ntarget with a very large `box-shadow` spread, and the shadow paints the\ndarkness. A `clip-path` on a full-screen scrim breaks as soon as an element\nbetween the scrim and the viewport is transformed.\n\nThe root measures the target's position in the browser. Nothing is measured\non the server, because a tour starts only on request.\n\n`open`, `default-open`, `helix-before-open`, `helix-before-close` and\n`toggle` work as they do on `Dialog`. Setting `open` starts the run, and\n`skip()` and `requestOpen(false)` end it early.\n\nThe box the light falls on is on the `spotlight` part as\n`--tour-spotlight-x`, `--tour-spotlight-y`, `--tour-spotlight-width` and\n`--tour-spotlight-height`, for a sheet that draws its own light, such as a\nring around the target.\n\nEach stop is told its place in the run, from `progress-label`, such as \"2 of\n5\". It describes the stop's panel, so a screen reader says it at every stop,\nand `progress` draws it in the panel as well. A dialog or a floating stop,\nwhich has nothing to light, is shown over the `backdrop` part. At a `wait`\nstop the run waits for that stop's target to be on the page, and moves on by\nitself.\n\n**Focus follows the run.** Opening moves focus to the first stop's panel,\nand moving on from a control in a stop moves it to the next one. Ending the\ntour puts focus back on the element that had it when the tour opened, unless\nyou have moved it somewhere else on the page. A stop does not trap focus, so\nyou can still `Tab` out to the element it describes.\n\n**The target is scrolled into view** before its stop is shown, by the\nleast distance that brings it on screen, so the stop that points at it is\non screen too.\n\n**Keyboard.** Focus is on the current stop's panel, which is not in the\n`Tab` order itself.\n\n| Key | What it does |\n|---|---|\n| Right | Goes to the next stop. On the last stop it does nothing, and Next finishes the tour. |\n| Left | Goes back to the previous stop. |\n| Escape | Skips the tour, and puts focus back where it was when the tour opened. |\n| Tab, Shift+Tab | Moves through the controls in the stop, and on out to the page. A stop does not trap focus. |\n| Enter, Space | On Back, Next, or Skip, presses it. |\n\nThe arrow that points the way the line runs goes on, and the other goes\nback, so on a right-to-left page Left goes on and Right goes back. A text field in a stop keeps\nits own arrows.\n\nThe tour is a region named by `label` while it runs. A development build\nwarns when a tour opens with no `label`.",
176572
+ "description": "The root holds the order of the stops: which stop is current, what Next and\nBack do, and when the tour is finished. Each stop holds its target, and you\nwrite all the text.\n\n**The spotlight is a shadow.** The scrim is a box the size of the current\ntarget with a very large `box-shadow` spread, and the shadow paints the\ndarkness. A `clip-path` on a full-screen scrim breaks as soon as an element\nbetween the scrim and the viewport is transformed.\n\nThe root measures the target's position in the browser. Nothing is measured\non the server, because a tour starts only on request.\n\n`open`, `default-open`, `helix-before-open`, `helix-before-close` and\n`toggle` work as they do on `Dialog`. Setting `open` starts the run, and\n`skip()` and `requestOpen(false)` end it early.\n\nThe box the light falls on is on the `spotlight` part as\n`--tour-spotlight-x`, `--tour-spotlight-y`, `--tour-spotlight-width` and\n`--tour-spotlight-height`, for a sheet that draws its own light, such as a\nring around the target.\n\nEach stop is told its place in the run, from `progress-label`, such as \"2 of\n5\". It describes the stop's panel, so a screen reader says it at every stop,\nand `progress` draws it in the panel as well. A dialog or a floating stop,\nwhich has nothing to light, is shown over the `backdrop` part. At a `wait`\nstop the run waits for that stop's target to be on the page, and moves on by\nitself.\n\n**Focus follows the run.** Opening moves focus to the first stop's panel,\nand moving on from a control in a stop moves it to the next one. Ending the\ntour puts focus back on the element that had it when the tour opened, unless\nyou have moved it somewhere else on the page. A stop does not trap focus, so\nyou can still `Tab` out to the element it describes.\n\n**The target is scrolled into view** before its stop is shown, by the\nleast distance that brings it on screen, so the stop that points at it is\non screen too.\n\n**A stop's `effect` runs as the tour reaches it**, before it is shown, and\nthe stop waits for a promise it returns, with `:state(preparing)` on the\ntour meanwhile. A function it returns runs when the tour leaves the stop.\n\n**A press outside the current stop and its target does nothing by\ndefault**, so a reader can use the page the tour is describing. Set\n`outside-press=\"close\"` to end the tour on one, through `helix-before-close`\nas Skip does, or `outside-press=\"block\"` to refuse it, so the stop and its\ntarget are all a pointer can reach while the tour runs, as Zag's\n`preventInteraction` does.\n\n**Keyboard.** Focus is on the current stop's panel, which is not in the\n`Tab` order itself.\n\n| Key | What it does |\n|---|---|\n| Right | Goes to the next stop. On the last stop it does nothing, and Next finishes the tour. |\n| Left | Goes back to the previous stop. |\n| Escape | Skips the tour, and puts focus back where it was when the tour opened. |\n| Tab, Shift+Tab | Moves through the controls in the stop, and on out to the page. A stop does not trap focus. |\n| Enter, Space | On Back, Next, or Skip, presses it. |\n\nThe arrow that points the way the line runs goes on, and the other goes\nback, so on a right-to-left page Left goes on and Right goes back. A text field in a stop keeps\nits own arrows.\n\nThe tour is a region named by `label` while it runs. A development build\nwarns when a tour opens with no `label`.",
175866
176573
  "name": "HelixHeadlessTour",
175867
176574
  "cssProperties": [
175868
176575
  {
@@ -175978,6 +176685,15 @@
175978
176685
  "description": "Label for the control that goes on.",
175979
176686
  "attribute": "next-label"
175980
176687
  },
176688
+ {
176689
+ "kind": "field",
176690
+ "name": "outsidePress",
176691
+ "type": {
176692
+ "text": "'block' | 'close' | undefined"
176693
+ },
176694
+ "description": "What a press outside the current stop and its target does while the tour\nruns. Unset, nothing: the page stays usable. `close` ends the tour, as\nSkip does, and `block` refuses the press.",
176695
+ "attribute": "outside-press"
176696
+ },
175981
176697
  {
175982
176698
  "kind": "field",
175983
176699
  "name": "progress",
@@ -176178,6 +176894,50 @@
176178
176894
  "privacy": "private",
176179
176895
  "readonly": true
176180
176896
  },
176897
+ {
176898
+ "kind": "field",
176899
+ "name": "handleOutside",
176900
+ "privacy": "private",
176901
+ "readonly": true,
176902
+ "description": "Answers a press outside the current stop and its target, as\n`outside-press` asks. A press on the tour's own parts, the stop or the\ntarget is the reader using the tour."
176903
+ },
176904
+ {
176905
+ "kind": "field",
176906
+ "name": "entered",
176907
+ "type": {
176908
+ "text": "{ leave?: () => void; stop: HelixHeadlessTourStop } | undefined"
176909
+ },
176910
+ "privacy": "private",
176911
+ "description": "The stop whose `effect` has run, and the function to run on leaving it."
176912
+ },
176913
+ {
176914
+ "kind": "field",
176915
+ "name": "preparing",
176916
+ "type": {
176917
+ "text": "HelixHeadlessTourStop | undefined"
176918
+ },
176919
+ "privacy": "private",
176920
+ "description": "The stop held back while its `effect` settles."
176921
+ },
176922
+ {
176923
+ "kind": "method",
176924
+ "name": "enter",
176925
+ "privacy": "private",
176926
+ "return": {
176927
+ "type": {
176928
+ "text": "void"
176929
+ }
176930
+ },
176931
+ "parameters": [
176932
+ {
176933
+ "name": "stop",
176934
+ "type": {
176935
+ "text": "HelixHeadlessTourStop | undefined"
176936
+ }
176937
+ }
176938
+ ],
176939
+ "description": "Runs the current stop's `effect` as the tour reaches it, and the last\none's leaving function as it leaves, and holds the stop back while a\npromise settles."
176940
+ },
176181
176941
  {
176182
176942
  "kind": "field",
176183
176943
  "name": "revealed",
@@ -176940,6 +177700,14 @@
176940
177700
  "description": "Label for the control that goes on.",
176941
177701
  "fieldName": "nextLabel"
176942
177702
  },
177703
+ {
177704
+ "name": "outside-press",
177705
+ "type": {
177706
+ "text": "'block' | 'close' | undefined"
177707
+ },
177708
+ "description": "What a press outside the current stop and its target does while the tour\nruns. Unset, nothing: the page stays usable. `close` ends the tour, as\nSkip does, and `block` refuses the press.",
177709
+ "fieldName": "outsidePress"
177710
+ },
176943
177711
  {
176944
177712
  "name": "progress",
176945
177713
  "type": {
@@ -177007,6 +177775,10 @@
177007
177775
  "description": "While the tour is running.",
177008
177776
  "name": "open"
177009
177777
  },
177778
+ {
177779
+ "description": "While the tour waits for the current stop's `effect` before showing the stop.",
177780
+ "name": "preparing"
177781
+ },
177010
177782
  {
177011
177783
  "description": "While the tour waits at a `wait` stop for its target to be on the page.",
177012
177784
  "name": "waiting"
@@ -177085,7 +177857,7 @@
177085
177857
  "declarations": [
177086
177858
  {
177087
177859
  "kind": "class",
177088
- "description": "A stop names its target with `for` and holds the content you put in it. The\nstop handles three things:\n\n- **Placement.** The panel is anchored to the target by the same floating\n positioning as the other Helix overlays.\n- **Stacking.** The panel is a popover, so it is in the top layer and shows\n above dialogs, scrolling regions, and other stacking contexts.\n- **Visibility.** The stop shows when it is `current`, which the root sets.\n\nPut any content in the stop, such as a `Card`, or a heading and a line of\ntext. The `heading` and `description` slots are optional places for the\ntitle and the line under it, which then name and describe the panel.\n\n**A stop has a type.** Without one it is a bubble pointing at its target.\n`type=\"dialog\"` is a panel in the middle of the window, over a backdrop, for\na welcome or a summary with nothing to point at. `type=\"floating\"` is a\npanel in a corner of the window, which the styled tier puts at the end of\nthe line, for a note that points at nothing in particular. `type=\"wait\"` shows nothing: the tour waits\nfor the element `for` names to be on the page, such as a menu the reader has\nto open, and moves on by itself.\n\n**The buttons are slot fallback.** With nothing in the `actions` slot, you\nget Back, Next, and Skip, already wired. Slot your own `actions` and drive\nthem with `next()`, `back()`, and `skip()` on the root.\n\n**`for` is an id, as with `Tooltip`**, so you can point at a target elsewhere\non the page from markup. It resolves against the stop's root node, so a stop\ninside a shadow tree points at a target in that tree.\n\nThe panel is a `group`, and a `dialog` for a dialog stop, only while the\nstop is shown. It is named by the `heading` slot, then by the first heading\nin the content, then by `label`, and otherwise by its place in the tour. It\nis described by the `description` slot, or where that is empty by the words\nat the start of the content, and by its place, such as \"2 of 5\",\nso a screen reader says where the reader is at every stop. `focus()` moves\nfocus to the panel, which is what the tour does when it opens or moves on.",
177860
+ "description": "A stop names its target with `for` and holds the content you put in it. The\nstop handles three things:\n\n- **Placement.** The panel is anchored to the target by the same floating\n positioning as the other Helix overlays.\n- **Stacking.** The panel is a popover, so it is in the top layer and shows\n above dialogs, scrolling regions, and other stacking contexts.\n- **Visibility.** The stop shows when it is `current`, which the root sets.\n\nPut any content in the stop, such as a `Card`, or a heading and a line of\ntext. The `heading` and `description` slots are optional places for the\ntitle and the line under it, which then name and describe the panel.\n\n**A stop has a type.** Without one it is a bubble pointing at its target.\n`type=\"dialog\"` is a panel in the middle of the window, over a backdrop, for\na welcome or a summary with nothing to point at. `type=\"floating\"` is a\npanel in a corner of the window, which the styled tier puts at the end of\nthe line, for a note that points at nothing in particular. `type=\"wait\"` shows nothing: the tour waits\nfor the element `for` names to be on the page, such as a menu the reader has\nto open, and moves on by itself.\n\n**The buttons are slot fallback.** With nothing in the `actions` slot, you\nget Back, Next, and Skip, already wired. Slot your own `actions` and drive\nthem with `next()`, `back()`, and `skip()` on the root.\n\n**Set `effect` to prepare the page for a stop**, such as opening the menu\nit points into or loading what it describes. It is a function, set from\nscript, that the tour runs as it reaches the stop. Return a promise and the\nstop waits for it, and the tour has `:state(preparing)` meanwhile; return a\nfunction, or resolve to one, and the tour runs it when it leaves the stop.\nZag's tour step has the same `effect`.\n\n**`for` is an id, as with `Tooltip`**, so you can point at a target elsewhere\non the page from markup. It resolves against the stop's root node, so a stop\ninside a shadow tree points at a target in that tree.\n\nThe panel is a `group`, and a `dialog` for a dialog stop, only while the\nstop is shown. It is named by the `heading` slot, then by the first heading\nin the content, then by `label`, and otherwise by its place in the tour. It\nis described by the `description` slot, or where that is empty by the words\nat the start of the content, and by its place, such as \"2 of 5\",\nso a screen reader says where the reader is at every stop. `focus()` moves\nfocus to the panel, which is what the tour does when it opens or moves on.",
177089
177861
  "name": "HelixHeadlessTourStop",
177090
177862
  "cssParts": [
177091
177863
  {
@@ -177259,6 +178031,14 @@
177259
178031
  "words": true
177260
178032
  }
177261
178033
  },
178034
+ {
178035
+ "kind": "field",
178036
+ "name": "effect",
178037
+ "type": {
178038
+ "text": "TourStopEffect | undefined"
178039
+ },
178040
+ "description": "Run as the tour reaches the stop, before it is shown: see the description\nabove. A function, so it is set from script and has no attribute."
178041
+ },
177262
178042
  {
177263
178043
  "kind": "field",
177264
178044
  "name": "first",
@@ -177356,6 +178136,13 @@
177356
178136
  "privacy": "private",
177357
178137
  "description": "The side of its target the panel last landed on, which names the arrow's\nsecond part. Undefined until the first placement, which the server never\nmakes."
177358
178138
  },
178139
+ {
178140
+ "kind": "field",
178141
+ "name": "phases",
178142
+ "privacy": "protected",
178143
+ "readonly": true,
178144
+ "default": "new OpenPhaseController(this, { mark: { entering: (on) => this.toggleState('entering', on), exiting: (on) => this.toggleState('exiting', on), }, open: () => this.current && this.type !== 'wait', surface: () => this.partNamed('bubble'), })"
178145
+ },
177359
178146
  {
177360
178147
  "kind": "field",
177361
178148
  "name": "target",
@@ -177886,6 +178673,14 @@
177886
178673
  }
177887
178674
  ],
177888
178675
  "cssStates": [
178676
+ {
178677
+ "description": "From the moment the stop is shown until its entrance has finished.",
178678
+ "name": "entering"
178679
+ },
178680
+ {
178681
+ "description": "From the moment the stop is left until its exit has finished.",
178682
+ "name": "exiting"
178683
+ },
177889
178684
  {
177890
178685
  "description": "The panel sits below its target.",
177891
178686
  "name": "placed-bottom"
@@ -188728,6 +189523,6 @@
188728
189523
  ],
188729
189524
  "helix": {
188730
189525
  "package": "@fusion.dev/helix-headless",
188731
- "version": "0.157.0"
189526
+ "version": "0.159.0"
188732
189527
  }
188733
189528
  }