@fusion.dev/helix-headless 0.150.0 → 0.152.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 (75) hide show
  1. package/custom-elements.json +1388 -93
  2. package/dist/app-header/root/app-header-root.d.ts +75 -0
  3. package/dist/app-header/root/app-header-root.js +140 -5
  4. package/dist/area-chart/root/area-chart-root.d.ts +36 -0
  5. package/dist/area-chart/root/area-chart-root.js +17 -2
  6. package/dist/bar-chart/root/bar-chart-root.d.ts +28 -4
  7. package/dist/bar-chart/root/bar-chart-root.js +17 -4
  8. package/dist/breadcrumbs/breadcrumb/breadcrumb.d.ts +11 -2
  9. package/dist/breadcrumbs/breadcrumb/breadcrumb.js +11 -2
  10. package/dist/breadcrumbs/root/breadcrumbs-root.d.ts +14 -2
  11. package/dist/breadcrumbs/root/breadcrumbs-root.js +16 -3
  12. package/dist/callout/root/callout-root.d.ts +20 -0
  13. package/dist/callout/root/callout-root.js +19 -4
  14. package/dist/chat/composer/chat-composer.d.ts +30 -0
  15. package/dist/chat/composer/chat-composer.js +47 -2
  16. package/dist/chat/root/chat-root.d.ts +10 -0
  17. package/dist/chat/root/chat-root.js +14 -0
  18. package/dist/data-table/root/data-table-root.d.ts +34 -2
  19. package/dist/data-table/root/data-table-root.js +63 -2
  20. package/dist/dialog/description.d.ts +10 -0
  21. package/dist/dialog/description.js +22 -8
  22. package/dist/dialog/root/dialog-root.d.ts +17 -1
  23. package/dist/dialog/root/dialog-root.js +2 -2
  24. package/dist/divider/root/divider-root.d.ts +8 -6
  25. package/dist/divider/root/divider-root.js +10 -2
  26. package/dist/drawer/root/drawer-root.d.ts +38 -2
  27. package/dist/drawer/root/drawer-root.js +33 -6
  28. package/dist/element-events.generated.js +4 -0
  29. package/dist/kbd/root/kbd-root.d.ts +7 -1
  30. package/dist/kbd/root/kbd-root.js +8 -4
  31. package/dist/lightbox/root/lightbox-root.d.ts +44 -6
  32. package/dist/lightbox/root/lightbox-root.js +59 -11
  33. package/dist/lightbox/zoom-controller.d.ts +5 -0
  34. package/dist/lightbox/zoom-controller.js +8 -0
  35. package/dist/line-chart/root/line-chart-root.d.ts +36 -0
  36. package/dist/line-chart/root/line-chart-root.js +15 -2
  37. package/dist/menu/root/menu-root.js +2 -0
  38. package/dist/navigation/root/navigation-root.d.ts +11 -1
  39. package/dist/navigation/root/navigation-root.js +10 -5
  40. package/dist/notifications/root/notifications-root.d.ts +17 -0
  41. package/dist/notifications/root/notifications-root.js +21 -1
  42. package/dist/popover/root/popover-root.d.ts +18 -7
  43. package/dist/popover/root/popover-root.js +8 -1
  44. package/dist/scatter-chart/root/scatter-chart-root.d.ts +18 -0
  45. package/dist/scatter-chart/root/scatter-chart-root.js +38 -15
  46. package/dist/splitter/root/splitter-root.d.ts +41 -0
  47. package/dist/splitter/root/splitter-root.js +77 -0
  48. package/dist/table/column/table-column.js +3 -2
  49. package/dist/table/grid-controller.d.ts +14 -2
  50. package/dist/table/grid-controller.js +27 -1
  51. package/dist/table/root/table-root.d.ts +30 -4
  52. package/dist/table/root/table-root.js +45 -7
  53. package/dist/table/row/table-row.d.ts +12 -2
  54. package/dist/table/row/table-row.js +8 -2
  55. package/dist/tabs/root/tabs-root.d.ts +25 -0
  56. package/dist/tabs/root/tabs-root.js +28 -1
  57. package/dist/tour/naming.d.ts +9 -3
  58. package/dist/tour/naming.js +9 -3
  59. package/dist/tour/root/tour-root.d.ts +29 -5
  60. package/dist/tour/root/tour-root.js +13 -1
  61. package/dist/tour/stop/tour-stop.d.ts +2 -1
  62. package/dist/tour/stop/tour-stop.js +4 -1
  63. package/dist/tree/root/tree-root.d.ts +13 -0
  64. package/dist/tree/root/tree-root.js +42 -2
  65. package/dist/video/root/video-root.d.ts +6 -0
  66. package/dist/video/root/video-root.js +5 -1
  67. package/dist/video-playlist/root/video-playlist-root.d.ts +4 -0
  68. package/dist/video-playlist/root/video-playlist-root.js +4 -1
  69. package/dist/virtual-list/root/virtual-list-root.d.ts +23 -1
  70. package/dist/virtual-list/root/virtual-list-root.js +21 -2
  71. package/lint.json +1 -1
  72. package/package.json +5 -5
  73. package/types/jsx.d.ts +1098 -128
  74. package/types/vue.d.ts +248 -59
  75. package/types/words.d.ts +12 -2
@@ -2299,7 +2299,7 @@
2299
2299
  "declarations": [
2300
2300
  {
2301
2301
  "kind": "class",
2302
- "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\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.",
2302
+ "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.",
2303
2303
  "name": "HelixHeadlessAppHeader",
2304
2304
  "cssParts": [
2305
2305
  {
@@ -2317,6 +2317,14 @@
2317
2317
  {
2318
2318
  "description": "The leading region.",
2319
2319
  "name": "start"
2320
+ },
2321
+ {
2322
+ "description": "The control that opens and closes the folded middle region, drawn while the bar is narrower than `fold-below`.",
2323
+ "name": "toggle"
2324
+ },
2325
+ {
2326
+ "description": "The glyph on the toggle, where none is slotted.",
2327
+ "name": "toggle-mark"
2320
2328
  }
2321
2329
  ],
2322
2330
  "slots": [
@@ -2328,12 +2336,26 @@
2328
2336
  "description": "Trailing content.",
2329
2337
  "name": "end"
2330
2338
  },
2339
+ {
2340
+ "description": "Replaces the glyph inside the toggle that opens a folded middle region.",
2341
+ "name": "menu-icon"
2342
+ },
2331
2343
  {
2332
2344
  "description": "Leading content, usually a wordmark.",
2333
2345
  "name": "start"
2334
2346
  }
2335
2347
  ],
2336
2348
  "members": [
2349
+ {
2350
+ "kind": "field",
2351
+ "name": "words",
2352
+ "type": {
2353
+ "text": "string"
2354
+ },
2355
+ "static": true,
2356
+ "default": "'helix-app-header'",
2357
+ "description": "The key this family's words are registered under, its styled tag:\n`registerWords('de', { 'helix-app-header': { menuLabel: 'Menü' } })`."
2358
+ },
2337
2359
  {
2338
2360
  "kind": "field",
2339
2361
  "name": "contentAlign",
@@ -2344,6 +2366,176 @@
2344
2366
  "attribute": "content-align",
2345
2367
  "reflects": true
2346
2368
  },
2369
+ {
2370
+ "kind": "field",
2371
+ "name": "foldBelow",
2372
+ "type": {
2373
+ "text": "number | undefined"
2374
+ },
2375
+ "description": "The width of the bar, in pixels, below which the middle region folds behind\na toggle. Unset, it never folds.",
2376
+ "attribute": "fold-below"
2377
+ },
2378
+ {
2379
+ "kind": "field",
2380
+ "name": "hideOnScroll",
2381
+ "type": {
2382
+ "text": "boolean"
2383
+ },
2384
+ "default": "false",
2385
+ "description": "Hides the bar as the page scrolls down past it, and shows it again as the\npage scrolls up.",
2386
+ "attribute": "hide-on-scroll"
2387
+ },
2388
+ {
2389
+ "kind": "field",
2390
+ "name": "folded",
2391
+ "type": {
2392
+ "text": "boolean"
2393
+ },
2394
+ "privacy": "private",
2395
+ "default": "false",
2396
+ "description": "Whether the bar is narrower than `fold-below`, which only the observer sets."
2397
+ },
2398
+ {
2399
+ "kind": "field",
2400
+ "name": "unfolded",
2401
+ "type": {
2402
+ "text": "boolean"
2403
+ },
2404
+ "privacy": "private",
2405
+ "default": "false",
2406
+ "description": "Whether the folded middle region is open."
2407
+ },
2408
+ {
2409
+ "kind": "field",
2410
+ "name": "widths",
2411
+ "type": {
2412
+ "text": "ResizeObserver | undefined"
2413
+ },
2414
+ "privacy": "private",
2415
+ "description": "Watches the bar's own width while `fold-below` is set."
2416
+ },
2417
+ {
2418
+ "kind": "method",
2419
+ "name": "watchWidth",
2420
+ "privacy": "private",
2421
+ "return": {
2422
+ "type": {
2423
+ "text": "void"
2424
+ }
2425
+ },
2426
+ "description": "Starts or stops watching the width, according to `fold-below`."
2427
+ },
2428
+ {
2429
+ "kind": "method",
2430
+ "name": "fold",
2431
+ "privacy": "private",
2432
+ "return": {
2433
+ "type": {
2434
+ "text": "void"
2435
+ }
2436
+ },
2437
+ "parameters": [
2438
+ {
2439
+ "name": "width",
2440
+ "type": {
2441
+ "text": "number"
2442
+ }
2443
+ }
2444
+ ],
2445
+ "description": "Folds the middle region where the bar is narrower than `fold-below`."
2446
+ },
2447
+ {
2448
+ "kind": "field",
2449
+ "name": "handleToggle",
2450
+ "privacy": "private",
2451
+ "readonly": true,
2452
+ "description": "Opens or closes the folded middle region."
2453
+ },
2454
+ {
2455
+ "kind": "field",
2456
+ "name": "handleKeydown",
2457
+ "privacy": "private",
2458
+ "readonly": true,
2459
+ "description": "Escape in the open region closes it and puts focus back on the toggle."
2460
+ },
2461
+ {
2462
+ "kind": "field",
2463
+ "name": "away",
2464
+ "type": {
2465
+ "text": "boolean"
2466
+ },
2467
+ "privacy": "private",
2468
+ "default": "false",
2469
+ "description": "Whether the bar is out of the way, under `hide-on-scroll`."
2470
+ },
2471
+ {
2472
+ "kind": "field",
2473
+ "name": "lastY",
2474
+ "type": {
2475
+ "text": "number"
2476
+ },
2477
+ "privacy": "private",
2478
+ "default": "0",
2479
+ "description": "Where the page was last scrolled to, to tell down from up."
2480
+ },
2481
+ {
2482
+ "kind": "field",
2483
+ "name": "handleFocusIn",
2484
+ "privacy": "private",
2485
+ "readonly": true,
2486
+ "description": "Shows a hidden bar again when focus moves into it."
2487
+ },
2488
+ {
2489
+ "kind": "method",
2490
+ "name": "hide",
2491
+ "privacy": "private",
2492
+ "return": {
2493
+ "type": {
2494
+ "text": "void"
2495
+ }
2496
+ },
2497
+ "parameters": [
2498
+ {
2499
+ "name": "away",
2500
+ "type": {
2501
+ "text": "boolean"
2502
+ }
2503
+ }
2504
+ ],
2505
+ "description": "Hides the bar or shows it again, under `hide-on-scroll`."
2506
+ },
2507
+ {
2508
+ "kind": "method",
2509
+ "name": "follow",
2510
+ "privacy": "private",
2511
+ "return": {
2512
+ "type": {
2513
+ "text": "void"
2514
+ }
2515
+ },
2516
+ "parameters": [
2517
+ {
2518
+ "name": "y",
2519
+ "type": {
2520
+ "text": "number"
2521
+ }
2522
+ }
2523
+ ],
2524
+ "description": "Hides the bar on a scroll down past its own height, and shows it on a\nscroll up. A few pixels either way are not a direction, so a bar does not\nflicker under a hand resting on a trackpad. Not while focus is in the bar\nor its folded region is open, which a reader is using."
2525
+ },
2526
+ {
2527
+ "kind": "field",
2528
+ "name": "menuLabel",
2529
+ "type": {
2530
+ "text": "string"
2531
+ },
2532
+ "default": "'Menu'",
2533
+ "description": "The name of the toggle that opens a folded middle region.",
2534
+ "attribute": "menu-label",
2535
+ "helix": {
2536
+ "words": true
2537
+ }
2538
+ },
2347
2539
  {
2348
2540
  "kind": "field",
2349
2541
  "name": "scroller",
@@ -2420,6 +2612,26 @@
2420
2612
  },
2421
2613
  "description": "Whether this header is the page's banner, read from where it sits."
2422
2614
  },
2615
+ {
2616
+ "kind": "field",
2617
+ "name": "watchedFor",
2618
+ "type": {
2619
+ "text": "number | undefined"
2620
+ },
2621
+ "privacy": "private",
2622
+ "description": "The `fold-below` the width watch was started for, so a change is measured at once."
2623
+ },
2624
+ {
2625
+ "kind": "method",
2626
+ "name": "renderMenuIcon",
2627
+ "privacy": "protected",
2628
+ "return": {
2629
+ "type": {
2630
+ "text": "TemplateResult"
2631
+ }
2632
+ },
2633
+ "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."
2634
+ },
2423
2635
  {
2424
2636
  "kind": "field",
2425
2637
  "name": "tier",
@@ -2779,6 +2991,32 @@
2779
2991
  "description": "Where the middle region sits in the bar.\n\nCentered by default, which reads as the site's spine when the navigation is\nthe primary thing in the header rather than an afterthought beside a logo.\nCentered against the banner rather than against whatever space the brand\nleft over, so the middle of the nav is the middle of the window whatever\nthe wordmark and the actions happen to measure.\n\n`start` is the opt-out, for a header whose middle region trails the brand.\n\n**Named for the region and not for what is usually in it.** The middle slot\ntakes a search field or a breadcrumb trail as readily as a `Navigation`, so\nthe property carries the part's name, `content`.",
2780
2992
  "fieldName": "contentAlign"
2781
2993
  },
2994
+ {
2995
+ "name": "fold-below",
2996
+ "type": {
2997
+ "text": "number | undefined"
2998
+ },
2999
+ "description": "The width of the bar, in pixels, below which the middle region folds behind\na toggle. Unset, it never folds.",
3000
+ "fieldName": "foldBelow"
3001
+ },
3002
+ {
3003
+ "name": "hide-on-scroll",
3004
+ "type": {
3005
+ "text": "boolean"
3006
+ },
3007
+ "default": "false",
3008
+ "description": "Hides the bar as the page scrolls down past it, and shows it again as the\npage scrolls up.",
3009
+ "fieldName": "hideOnScroll"
3010
+ },
3011
+ {
3012
+ "name": "menu-label",
3013
+ "type": {
3014
+ "text": "string"
3015
+ },
3016
+ "default": "'Menu'",
3017
+ "description": "The name of the toggle that opens a folded middle region.",
3018
+ "fieldName": "menuLabel"
3019
+ },
2782
3020
  {
2783
3021
  "name": "scroller",
2784
3022
  "type": {
@@ -2789,6 +3027,18 @@
2789
3027
  }
2790
3028
  ],
2791
3029
  "cssStates": [
3030
+ {
3031
+ "description": "While the bar is narrower than `fold-below`, and the middle region is behind the toggle.",
3032
+ "name": "folded"
3033
+ },
3034
+ {
3035
+ "description": "While `hide-on-scroll` has the bar out of the way, after a scroll down.",
3036
+ "name": "hidden"
3037
+ },
3038
+ {
3039
+ "description": "While the folded middle region is open.",
3040
+ "name": "open"
3041
+ },
2792
3042
  {
2793
3043
  "description": "While the page is scrolled down from the top, which is when the bar lifts off it.",
2794
3044
  "name": "scrolled"
@@ -2908,13 +3158,23 @@
2908
3158
  "declarations": [
2909
3159
  {
2910
3160
  "kind": "class",
2911
- "description": "Shows how a total is made up. Each numeric column of the table is a part, the\nparts add up to the total at each reading, and the top edge is that total.\nThe thickness of a band is that part's amount.\n\nUse `LineChart` with `area` to show how each series moved: it fills each\nseries from the floor separately, so the fills overlap. Use this chart to\nshow the composition: it stacks the series.\n\n**The value axis always starts at zero**, as in `BarChart`, because a band's\nthickness is its value. For the same reason there is no streamgraph mode,\nwhich moves the baseline. To show how the composition changed, set `share`.\n\nBand edges are straight between readings by default. A smoothed curve through\none sum can dip below the curve through the sum beneath it, which draws a\npart as less than zero. Other curves:\n\n- `curve=\"smooth\"`: for a stack read as an overall shape.\n- `curve=\"step\"`: holds each reading and jumps at the midpoint, so stacked\n edges stay in order, as with `straight`. Use it for a quantity that changes\n at a moment, such as a headcount or a price.\n\n`share` draws each reading as 100 percent, so the top edge is flat and the\nbands show each part's share. Use it to see which part grew. The default\nshows whether the total grew.\n\n`overlap` draws every band from zero, one in front of another, so each\npart's own amount is its height: the first column is in front. Use it to\ncompare the parts with each other; the scale then fits the largest part\nrather than the total.\n\nThe drawing is hidden from screen readers. The text summary gives the latest\nreading's total and each part's share of it, and the table beside the chart\nhas every number.\n\n**The plot is read by key.** It takes focus, named by `label` or the caption.\nThe left and right arrows move from reading to reading, Home and End go to\nthe first and the last, and the up and down arrows move among the series of\na reading. The tooltip follows, the `live` part says the reading in words,\nand Escape puts the tooltip away.\n\nEvery numeric column is a part, so leave a total column out of the table the\nchart reads, or it is counted twice. A negative reading is drawn as zero.",
3161
+ "description": "Shows how a total is made up. Each numeric column of the table is a part, the\nparts add up to the total at each reading, and the top edge is that total.\nThe thickness of a band is that part's amount.\n\nUse `LineChart` with `area` to show how each series moved: it fills each\nseries from the floor separately, so the fills overlap. Use this chart to\nshow the composition: it stacks the series.\n\n**The value axis always starts at zero**, as in `BarChart`, because a band's\nthickness is its value. For the same reason there is no streamgraph mode,\nwhich moves the baseline. To show how the composition changed, set `share`.\n\nBand edges are straight between readings by default. A smoothed curve through\none sum can dip below the curve through the sum beneath it, which draws a\npart as less than zero. Other curves:\n\n- `curve=\"smooth\"`: for a stack read as an overall shape.\n- `curve=\"step\"`: holds each reading and jumps at the midpoint, so stacked\n edges stay in order, as with `straight`. Use it for a quantity that changes\n at a moment, such as a headcount or a price.\n\n`share` draws each reading as 100 percent, so the top edge is flat and the\nbands show each part's share. Use it to see which part grew. The default\nshows whether the total grew.\n\n`overlap` draws every band from zero, one in front of another, so each\npart's own amount is its height: the first column is in front. Use it to\ncompare the parts with each other; the scale then fits the largest part\nrather than the total.\n\n`value-axis` draws the scale's numbers beside the plot, at the levels\n`gridlines` rules: amounts in `locale`, or percentages under `share`.\n\nThe drawing is hidden from screen readers. The text summary gives the latest\nreading's total and each part's share of it, and the table beside the chart\nhas every number.\n\n**The plot is read by key.** It takes focus, named by `label` or the caption.\nThe left and right arrows move from reading to reading, Home and End go to\nthe first and the last, and the up and down arrows move among the series of\na reading. The tooltip follows, the `live` part says the reading in words,\nand Escape puts the tooltip away.\n\nEvery numeric column is a part, so leave a total column out of the table the\nchart reads, or it is counted twice. A negative reading is drawn as zero.\n\n**A tap shows the reading under it**, and keeps it until a tap lands\nelsewhere. `helix-reading-change` says each move of the reading, by pointer,\ntap or key, and `helix-reading-press` says a reading was clicked, tapped, or\npressed with Enter or Space, for a page that opens what a reading stands for.",
2912
3162
  "name": "HelixHeadlessAreaChart",
3163
+ "cssProperties": [
3164
+ {
3165
+ "description": "The width of the axis, in `ch`, set from the widest number on it. Written by the component on the axis.",
3166
+ "name": "--area-chart-axis"
3167
+ }
3168
+ ],
2913
3169
  "cssParts": [
2914
3170
  {
2915
3171
  "description": "One part's band.",
2916
3172
  "name": "area"
2917
3173
  },
3174
+ {
3175
+ "description": "The numbers of the scale beside the plot, under `value-axis`.",
3176
+ "name": "axis"
3177
+ },
2918
3178
  {
2919
3179
  "description": "The rule at zero, which is the floor of the drawing.",
2920
3180
  "name": "baseline"
@@ -2959,6 +3219,10 @@
2959
3219
  "description": "The drawing surface the bands sit on.",
2960
3220
  "name": "svg"
2961
3221
  },
3222
+ {
3223
+ "description": "One number on the axis, placed with `inset-block-start` at its level.",
3224
+ "name": "tick"
3225
+ },
2962
3226
  {
2963
3227
  "description": "The bubble, forwarded from `Tooltip`.",
2964
3228
  "name": "tooltip"
@@ -3106,6 +3370,17 @@
3106
3370
  "words": true
3107
3371
  }
3108
3372
  },
3373
+ {
3374
+ "kind": "field",
3375
+ "name": "valueAxis",
3376
+ "type": {
3377
+ "text": "boolean"
3378
+ },
3379
+ "default": "false",
3380
+ "description": "Draws the scale's numbers beside the plot, the `axis` part, at the levels\n`gridlines` rules: amounts, or percentages under `share`.\n\nAbsent draws none: bands read as a composition need no numbers beside\nthem, and the tooltip and the table hold every reading.",
3381
+ "attribute": "value-axis",
3382
+ "reflects": true
3383
+ },
3109
3384
  {
3110
3385
  "kind": "field",
3111
3386
  "name": "warnedAboutNegatives",
@@ -3156,6 +3431,31 @@
3156
3431
  },
3157
3432
  "description": "Says once that a reading was below zero, and what was drawn instead.\n\nOnce per element, and in a browser only: a server render warning per\nrequest is one nobody can act on."
3158
3433
  },
3434
+ {
3435
+ "kind": "method",
3436
+ "name": "renderAxis",
3437
+ "privacy": "protected",
3438
+ "return": {
3439
+ "type": {
3440
+ "text": "TemplateResult"
3441
+ }
3442
+ },
3443
+ "parameters": [
3444
+ {
3445
+ "name": "y",
3446
+ "type": {
3447
+ "text": "(value: number) => number"
3448
+ }
3449
+ },
3450
+ {
3451
+ "name": "domain",
3452
+ "type": {
3453
+ "text": "[number, number]"
3454
+ }
3455
+ }
3456
+ ],
3457
+ "description": "The scale's numbers beside the plot, under `value-axis`: amounts written\nin the chart's locale, or percentages under `share`. A seam, so a\nsubclass can write the numbers its own way, such as a currency."
3458
+ },
3159
3459
  {
3160
3460
  "kind": "method",
3161
3461
  "name": "renderPlot",
@@ -4024,6 +4324,24 @@
4024
4324
  }
4025
4325
  }
4026
4326
  ],
4327
+ "events": [
4328
+ {
4329
+ "type": {
4330
+ "text": "HelixReadingChangeEvent"
4331
+ },
4332
+ "description": "The reading shown moved, or was put away: `index` is the row, or `-1` for none, with its `label`, the `series` the keys rest on, and the `pointerType` that moved it.",
4333
+ "name": "helix-reading-change",
4334
+ "reactProp": "onhelix-reading-change"
4335
+ },
4336
+ {
4337
+ "type": {
4338
+ "text": "HelixReadingPressEvent"
4339
+ },
4340
+ "description": "A reading was clicked, tapped, or pressed with Enter or Space, with the same detail as `helix-reading-change`.",
4341
+ "name": "helix-reading-press",
4342
+ "reactProp": "onhelix-reading-press"
4343
+ }
4344
+ ],
4027
4345
  "attributes": [
4028
4346
  {
4029
4347
  "name": "curve",
@@ -4077,6 +4395,15 @@
4077
4395
  "description": "The name for the sum of the parts, shown in the tooltip and the summary.",
4078
4396
  "fieldName": "totalLabel"
4079
4397
  },
4398
+ {
4399
+ "name": "value-axis",
4400
+ "type": {
4401
+ "text": "boolean"
4402
+ },
4403
+ "default": "false",
4404
+ "description": "Draws the scale's numbers beside the plot, the `axis` part, at the levels\n`gridlines` rules: amounts, or percentages under `share`.\n\nAbsent draws none: bands read as a composition need no numbers beside\nthem, and the tooltip and the table hold every reading.",
4405
+ "fieldName": "valueAxis"
4406
+ },
4080
4407
  {
4081
4408
  "name": "for",
4082
4409
  "type": {
@@ -6217,7 +6544,7 @@
6217
6544
  "declarations": [
6218
6545
  {
6219
6546
  "kind": "class",
6220
- "description": "Every bar is measured from zero, and no property changes the baseline,\nbecause a bar's length is its value. To show the differences between values,\nuse a line chart.\n\nThe labels are HTML beside the drawing. An `<svg>` that fills its box scales\nthe text inside it: the same `font-size` renders at 10px in a narrow chart\nand 43px in a wide one, and SVG has no setting that keeps text at one size\nthe way `vector-effect` does for strokes.\n\nThe table is the accessible representation, and the drawing is hidden from\nscreen readers, so they get the numbers themselves. The `summary` part names\nthe chart, from `label` or the table's caption, and gives each series' highest\nreading.\n\n**The plot is read by key.** It takes focus, named by `label` or the caption.\nThe arrows along the categories move from one to the next, which is left and\nright for columns and up and down for `orientation=\"horizontal\"`. Home and\nEnd go to the first and the last, and the other pair of arrows moves among\nthe series of a category. The tooltip follows, the `live` part says the\nreading in words, and Escape puts the tooltip away.\n\nThe component writes the custom properties below with numbers it computes,\nand the stylesheet that draws the chart reads them. Do not set them yourself.",
6547
+ "description": "Every bar is measured from zero, and no property changes the baseline,\nbecause a bar's length is its value. To show the differences between values,\nuse a line chart.\n\nThe labels are HTML beside the drawing. An `<svg>` that fills its box scales\nthe text inside it: the same `font-size` renders at 10px in a narrow chart\nand 43px in a wide one, and SVG has no setting that keeps text at one size\nthe way `vector-effect` does for strokes.\n\nThe table is the accessible representation, and the drawing is hidden from\nscreen readers, so they get the numbers themselves. The `summary` part names\nthe chart, from `label` or the table's caption, and gives each series' highest\nreading.\n\n**The plot is read by key.** It takes focus, named by `label` or the caption.\nThe arrows along the categories move from one to the next, which is left and\nright for columns and up and down for `orientation=\"horizontal\"`. Home and\nEnd go to the first and the last, and the other pair of arrows moves among\nthe series of a category. The tooltip follows, the `live` part says the\nreading in words, and Escape puts the tooltip away.\n\nThe component writes the custom properties below with numbers it computes,\nand the stylesheet that draws the chart reads them. Do not set them yourself.\n\n**A tap shows the reading under it**, and keeps it until a tap lands\nelsewhere. `helix-reading-change` says each move of the reading, by pointer,\ntap or key, and `helix-reading-press` says a reading was clicked, tapped, or\npressed with Enter or Space, for a page that opens what a reading stands for.",
6221
6548
  "name": "HelixHeadlessBarChart",
6222
6549
  "cssProperties": [
6223
6550
  {
@@ -6235,7 +6562,7 @@
6235
6562
  ],
6236
6563
  "cssParts": [
6237
6564
  {
6238
- "description": "The numbers of one scale, drawn only when `secondary` splits the chart into two scales.",
6565
+ "description": "The numbers of one scale: the primary under `value-axis`, and both when `secondary` splits the chart into two scales.",
6239
6566
  "name": "axis"
6240
6567
  },
6241
6568
  {
@@ -6461,6 +6788,17 @@
6461
6788
  "words": true
6462
6789
  }
6463
6790
  },
6791
+ {
6792
+ "kind": "field",
6793
+ "name": "valueAxis",
6794
+ "type": {
6795
+ "text": "boolean"
6796
+ },
6797
+ "default": "false",
6798
+ "description": "Draws the numbers of the scale the bars are measured on, the `axis` part,\nat the levels `gridlines` rules: down the side of columns, and along the\nbottom of bars under `orientation=\"horizontal\"`.\n\nAbsent draws none with one scale, since bars compared with each other need\nno numbers. With `secondary` both scales are drawn whatever this says.",
6799
+ "attribute": "value-axis",
6800
+ "reflects": true
6801
+ },
6464
6802
  {
6465
6803
  "kind": "field",
6466
6804
  "name": "scaled",
@@ -6655,7 +6993,7 @@
6655
6993
  }
6656
6994
  }
6657
6995
  ],
6658
- "description": "The numbers along one scale, drawn only where there are two of them.\n\n**A chart with one scale renders no axis, on purpose.** Columns measured\nagainst each other need no numbers to be compared, and a row of them beside\na small chart is furniture that makes the drawing smaller for no reading a\nreader was going to do. With two scales that argument inverts: a reader\ncannot tell there are two, cannot tell which series is on which, and cannot\nrecover either from the picture. So this appears with `secondary` and never\nwithout it.\n\n**Beside the plot and not inside it.** Inside, the numbers are drawn over\nthe drawing, and a horizontal chart shows it immediately: its value axis\nruns along the bottom, which is where the last row of bars is. The vertical\ncase has the same fault and enough slack to hide it. The plot is also the\npointer's catchment and the tooltip's containing block, both measured from\nits box, so padding it to make room would move every reading half an axis\nto the right.\n\nA column of the host grid instead, which the stylesheet grows only when\n`secondary` is set. That is what the property reflects for.\n\nThe primary hugs the edge the drawing starts at and the secondary the edge\nit ends at: down the two sides for columns, along the bottom and top for\nbars, which is where each axis is when the chart is turned."
6996
+ "description": "The numbers along one scale, drawn only where there are two of them.\n\n**A chart with one scale renders no axis, on purpose.** Columns measured\nagainst each other need no numbers to be compared, and a row of them beside\na small chart is furniture that makes the drawing smaller for no reading a\nreader was going to do. With two scales that argument inverts: a reader\ncannot tell there are two, cannot tell which series is on which, and cannot\nrecover either from the picture. So this appears with `secondary`, and\nwith one scale only where `value-axis` asks for its numbers.\n\n**Beside the plot and not inside it.** Inside, the numbers are drawn over\nthe drawing, and a horizontal chart shows it immediately: its value axis\nruns along the bottom, which is where the last row of bars is. The vertical\ncase has the same fault and enough slack to hide it. The plot is also the\npointer's catchment and the tooltip's containing block, both measured from\nits box, so padding it to make room would move every reading half an axis\nto the right.\n\nA column of the host grid instead, which the stylesheet grows only when\n`secondary` or `value-axis` is set. That is what the two reflect for.\n\nThe primary hugs the edge the drawing starts at and the secondary the edge\nit ends at: down the two sides for columns, along the bottom and top for\nbars, which is where each axis is when the chart is turned."
6659
6997
  },
6660
6998
  {
6661
6999
  "kind": "method",
@@ -7429,6 +7767,24 @@
7429
7767
  }
7430
7768
  }
7431
7769
  ],
7770
+ "events": [
7771
+ {
7772
+ "type": {
7773
+ "text": "HelixReadingChangeEvent"
7774
+ },
7775
+ "description": "The reading shown moved, or was put away: `index` is the row, or `-1` for none, with its `label`, the `series` the keys rest on, and the `pointerType` that moved it.",
7776
+ "name": "helix-reading-change",
7777
+ "reactProp": "onhelix-reading-change"
7778
+ },
7779
+ {
7780
+ "type": {
7781
+ "text": "HelixReadingPressEvent"
7782
+ },
7783
+ "description": "A reading was clicked, tapped, or pressed with Enter or Space, with the same detail as `helix-reading-change`.",
7784
+ "name": "helix-reading-press",
7785
+ "reactProp": "onhelix-reading-press"
7786
+ }
7787
+ ],
7432
7788
  "attributes": [
7433
7789
  {
7434
7790
  "name": "gridlines",
@@ -7489,6 +7845,15 @@
7489
7845
  "description": "The summary's sentence. `{highestLabel}` is `highest-label`, and\n`{readings}` each series' highest reading: the series, the category and\nthe reading as the table writes it.",
7490
7846
  "fieldName": "summaryLabel"
7491
7847
  },
7848
+ {
7849
+ "name": "value-axis",
7850
+ "type": {
7851
+ "text": "boolean"
7852
+ },
7853
+ "default": "false",
7854
+ "description": "Draws the numbers of the scale the bars are measured on, the `axis` part,\nat the levels `gridlines` rules: down the side of columns, and along the\nbottom of bars under `orientation=\"horizontal\"`.\n\nAbsent draws none with one scale, since bars compared with each other need\nno numbers. With `secondary` both scales are drawn whatever this says.",
7855
+ "fieldName": "valueAxis"
7856
+ },
7492
7857
  {
7493
7858
  "name": "for",
7494
7859
  "type": {
@@ -8284,7 +8649,7 @@
8284
8649
  "declarations": [
8285
8650
  {
8286
8651
  "kind": "class",
8287
- "description": "Each crumb renders its separator and sets its list-item role. It hides its\nown separator with `:host(:first-child)`, so the trail needs no index from\nthe parent.\n\nSet `href` to make the whole crumb an anchor, which works with Enter, middle\nclick, and the status bar, and before any JavaScript runs. A router cannot\nreach an anchor inside a shadow root, so intercept the click for client-side\nnavigation, as with `Tree.Item` and `List.Item`. A trail that collapses also\nreads `href` to rebuild its hidden crumbs elsewhere.\n\nWithout `href`, the crumb renders a plain `<span>` around what you slot,\nincluding your own anchor.\n\nThe current page is plain text, and `aria-current=\"page\"` on the host conveys\nthe position.",
8652
+ "description": "Each crumb renders its separator and sets its list-item role. It hides its\nown separator with `:host(:first-child)`, so the trail needs no index from\nthe parent.\n\nSet `href` to make the whole crumb an anchor, which works with Enter, middle\nclick, and the status bar, and before any JavaScript runs. A router cannot\nreach an anchor inside a shadow root, so intercept the click for client-side\nnavigation, as with `Tree.Item` and `List.Item`. A trail that collapses also\nreads `href` to rebuild its hidden crumbs elsewhere.\n\nWithout `href`, the crumb renders a plain `<span>` around what you slot,\nincluding your own anchor.\n\nThe current page is plain text, and `aria-current=\"page\"` on the host conveys\nthe position. In a trail where no crumb is `current`, the last one is said\nto be the current page, and keeps its link. An `aria-current` you write on\nthe host, such as `aria-current=\"location\"`, replaces the one the crumb\ngives itself.",
8288
8653
  "name": "HelixHeadlessBreadcrumb",
8289
8654
  "cssParts": [
8290
8655
  {
@@ -8849,7 +9214,7 @@
8849
9214
  "declarations": [
8850
9215
  {
8851
9216
  "kind": "class",
8852
- "description": "The host is the navigation landmark, named \"Breadcrumb\" by default. An\n`aria-label` on the host names the trail instead, and so does `label`. When a\npage has more than one navigation landmark, screen reader users choose\nbetween them by name.\n\nThe `<ol>` has an explicit `role=\"list\"`, because Safari removes list\nsemantics from a list with `list-style: none`, and the trail always hides its\nmarkers.\n\nThe items are slotted directly, so they are `<ol>` children in the flat tree,\nand each item sets `role=\"listitem\"` on itself.\n\nThe trail does not measure itself, and you write its overflow in markup: put\nthe crumb that holds the folded items where the gap should appear.\n\nA trail built from data, such as a router's matched routes, takes `items`: an\narray of `{ label, href }`, drawn as crumbs in order, the last one as the\ncurrent page. Slotted crumbs follow them. Use one way or the other in a trail.\n\nWith `max-items`, a trail drawn from `items` that is longer folds its middle\ninto one crumb: the first crumb, a button, then the last `max-items` less one.\nThe button is named by `expand-label` and shows the whole trail, moving focus\nto the first crumb it brought back. A new `items` folds again. Slotted crumbs\ndo not fold; write the folded crumb where the gap should be.",
9217
+ "description": "The host is the navigation landmark, named \"Breadcrumb\" by default. An\n`aria-label` on the host names the trail instead, and so does `label`. When a\npage has more than one navigation landmark, screen reader users choose\nbetween them by name.\n\nThe `<ol>` has an explicit `role=\"list\"`, because Safari removes list\nsemantics from a list with `list-style: none`, and the trail always hides its\nmarkers.\n\nThe items are slotted directly, so they are `<ol>` children in the flat tree,\nand each item sets `role=\"listitem\"` on itself. Where no slotted crumb is\n`current`, the last one is said to be the current page.\n\nThe trail does not measure itself, and you write its overflow in markup: put\nthe crumb that holds the folded items where the gap should appear.\n\nA trail built from data, such as a router's matched routes, takes `items`: an\narray of `{ label, href }`, drawn as crumbs in order, the last one as the\ncurrent page. Slotted crumbs follow them. Use one way or the other in a trail.\n\nWith `max-items`, a trail drawn from `items` that is longer folds its middle\ninto one crumb: the first crumb, a button, then the last `max-items` less one.\nThe button is named by `expand-label` and shows the whole trail, moving focus\nto the first crumb it brought back. A new `items` folds again. Slotted crumbs\ndo not fold; write the folded crumb where the gap should be.\n\n**Keyboard.** Each crumb with an `href` is a link and one tab stop, and\nEnter follows it. The current page and the separators are not in the tab\norder. In a folded trail, Enter or Space on the fold's button shows the\nwhole trail and moves focus to the first crumb it brought back.",
8853
9218
  "name": "HelixHeadlessBreadcrumbs",
8854
9219
  "cssParts": [
8855
9220
  {
@@ -8973,6 +9338,13 @@
8973
9338
  "description": "How many crumbs drawn from `items` are folded away, or 0.",
8974
9339
  "readonly": true
8975
9340
  },
9341
+ {
9342
+ "kind": "field",
9343
+ "name": "markLast",
9344
+ "privacy": "private",
9345
+ "readonly": true,
9346
+ "description": "Says the last slotted crumb is the current page where none is marked\n`current`, as React Aria's trail does. Through a property the crumb does\nnot reflect, so nothing is written onto your markup."
9347
+ },
8976
9348
  {
8977
9349
  "kind": "method",
8978
9350
  "name": "renderItems",
@@ -11729,6 +12101,23 @@
11729
12101
  "module": "src/mixins/mixin-dismissible/mixin-dismissible.ts"
11730
12102
  }
11731
12103
  },
12104
+ {
12105
+ "kind": "field",
12106
+ "name": "dismissLabel",
12107
+ "type": {
12108
+ "text": "string"
12109
+ },
12110
+ "default": "'Dismiss {label}'",
12111
+ "description": "The dismiss button's name, read by screen readers, with `{label}` for\nwhat the callout is called: its heading, or the tone's name where it has\nnone.\n\n\"Dismiss Scheduled maintenance\" says which of several callouts the button\ntakes away, where every button was \"Dismiss\". A label without `{label}` is\nread as written.",
12112
+ "attribute": "dismiss-label",
12113
+ "helix": {
12114
+ "words": true
12115
+ },
12116
+ "inheritedFrom": {
12117
+ "name": "MixinDismissible",
12118
+ "module": "src/mixins/mixin-dismissible/mixin-dismissible.ts"
12119
+ }
12120
+ },
11732
12121
  {
11733
12122
  "kind": "field",
11734
12123
  "name": "tone",
@@ -11798,6 +12187,25 @@
11798
12187
  },
11799
12188
  "description": "The cross inside the dismiss button, behind a seam, for the reason\n`renderIcon` gives: the slot answers the page and the method the tier\nabove."
11800
12189
  },
12190
+ {
12191
+ "kind": "method",
12192
+ "name": "dismissName",
12193
+ "privacy": "private",
12194
+ "return": {
12195
+ "type": {
12196
+ "text": "string"
12197
+ }
12198
+ },
12199
+ "parameters": [
12200
+ {
12201
+ "name": "tone",
12202
+ "type": {
12203
+ "text": "string"
12204
+ }
12205
+ }
12206
+ ],
12207
+ "description": "The dismiss button's name: `dismissLabel` with the heading's words, or the\ntone's name.\n\nThe heading is read from the children, so a server and a hydrating render\nname the button for the tone, and the update after names it for the\nheading."
12208
+ },
11801
12209
  {
11802
12210
  "kind": "field",
11803
12211
  "name": "dismissible",
@@ -11813,23 +12221,6 @@
11813
12221
  "module": "src/mixins/mixin-dismissible/mixin-dismissible.ts"
11814
12222
  }
11815
12223
  },
11816
- {
11817
- "kind": "field",
11818
- "name": "dismissLabel",
11819
- "type": {
11820
- "text": "string"
11821
- },
11822
- "default": "'Dismiss'",
11823
- "description": "The dismiss control's label, read by screen readers.\n\n`attribute` is spelled out because Lit lowercases a property name to\nderive one rather than dash-casing it, so this would otherwise be\nreachable only as `dismisslabel`, which nobody would guess and no linter\nwould catch.\n\nA word property: register it for a locale under the host's key. A family\nthat names the control otherwise, such as Tag's `Remove {label}`,\ndeclares its own English with `@words` above the override.",
11824
- "attribute": "dismiss-label",
11825
- "helix": {
11826
- "words": true
11827
- },
11828
- "inheritedFrom": {
11829
- "name": "MixinDismissible",
11830
- "module": "src/mixins/mixin-dismissible/mixin-dismissible.ts"
11831
- }
11832
- },
11833
12224
  {
11834
12225
  "kind": "method",
11835
12226
  "name": "dismissEvent",
@@ -12315,6 +12706,19 @@
12315
12706
  }
12316
12707
  ],
12317
12708
  "attributes": [
12709
+ {
12710
+ "name": "dismiss-label",
12711
+ "type": {
12712
+ "text": "string"
12713
+ },
12714
+ "default": "'Dismiss {label}'",
12715
+ "description": "The dismiss button's name, read by screen readers, with `{label}` for\nwhat the callout is called: its heading, or the tone's name where it has\nnone.\n\n\"Dismiss Scheduled maintenance\" says which of several callouts the button\ntakes away, where every button was \"Dismiss\". A label without `{label}` is\nread as written.",
12716
+ "fieldName": "dismissLabel",
12717
+ "inheritedFrom": {
12718
+ "name": "MixinDismissible",
12719
+ "module": "src/mixins/mixin-dismissible/mixin-dismissible.ts"
12720
+ }
12721
+ },
12318
12722
  {
12319
12723
  "name": "tone",
12320
12724
  "type": {
@@ -12353,19 +12757,6 @@
12353
12757
  "name": "MixinDismissible",
12354
12758
  "module": "src/mixins/mixin-dismissible/mixin-dismissible.ts"
12355
12759
  }
12356
- },
12357
- {
12358
- "name": "dismiss-label",
12359
- "type": {
12360
- "text": "string"
12361
- },
12362
- "default": "'Dismiss'",
12363
- "description": "The dismiss control's label, read by screen readers.\n\n`attribute` is spelled out because Lit lowercases a property name to\nderive one rather than dash-casing it, so this would otherwise be\nreachable only as `dismisslabel`, which nobody would guess and no linter\nwould catch.\n\nA word property: register it for a locale under the host's key. A family\nthat names the control otherwise, such as Tag's `Remove {label}`,\ndeclares its own English with `@words` above the override.",
12364
- "fieldName": "dismissLabel",
12365
- "inheritedFrom": {
12366
- "name": "MixinDismissible",
12367
- "module": "src/mixins/mixin-dismissible/mixin-dismissible.ts"
12368
- }
12369
12760
  }
12370
12761
  ],
12371
12762
  "mixins": [
@@ -21242,7 +21633,7 @@
21242
21633
  "declarations": [
21243
21634
  {
21244
21635
  "kind": "class",
21245
- "description": "The composer is a separate element so you can replace it. If you need\nattachments, slash commands, or a model picker, replace the composer and keep\nthe transcript.\n\nBy default, Enter sends and Shift+Enter starts a new line, the convention in\nmessaging apps. Document editors mostly use the opposite, so `submit-on`\ntakes `enter` or `button`. Use `button` for a long-form composer.\n\nThe composer clears only when no listener cancels the send, so the text is\nkept when you cancel a send that failed.\n\n**In a form, the draft is the composer's value**, submitted under `name`. A\nform reset puts back the `value` the markup declared, and a `<fieldset\ndisabled>` turns the composer off. Sending is still `helix-send`, and it\ndoes not submit the form.\n\n**`typing` says whether the user is writing**, and `helix-typing` is sent\neach time it changes: when they start, and when they send or stop for\n`typing-timeout` milliseconds. Pass it on to show \"is typing\" to the other\nside.",
21636
+ "description": "The composer is a separate element so you can replace it. If you need\nattachments, slash commands, or a model picker, replace the composer and keep\nthe transcript.\n\nBy default, Enter sends and Shift+Enter starts a new line, the convention in\nmessaging apps. Document editors mostly use the opposite, so `submit-on`\ntakes `enter` or `button`. Use `button` for a long-form composer.\n\nThe composer clears only when no listener cancels the send, so the text is\nkept when you cancel a send that failed.\n\n**In a form, the draft is the composer's value**, submitted under `name`. A\nform reset puts back the `value` the markup declared, and a `<fieldset\ndisabled>` turns the composer off. Sending is still `helix-send`, and it\ndoes not submit the form.\n\n**`required`, `minlength` and `maxlength` are checked by the browser**, as\non a `<textarea>`, and the message is the browser's. `maxlength` stops the\nfield taking more. A draft that fails them does not send, and the composer\ntakes `:state(invalid)` and `aria-invalid` once the reader has tried to send\nit, the form was submitted, or the reader edited the field and left it.\nTabbing past an empty composer marks nothing.\n\n**`typing` says whether the user is writing**, and `helix-typing` is sent\neach time it changes: when they start, and when they send or stop for\n`typing-timeout` milliseconds. Pass it on to show \"is typing\" to the other\nside.",
21246
21637
  "name": "HelixHeadlessChatComposer",
21247
21638
  "cssParts": [
21248
21639
  {
@@ -21308,6 +21699,24 @@
21308
21699
  "words": true
21309
21700
  }
21310
21701
  },
21702
+ {
21703
+ "kind": "field",
21704
+ "name": "maxLength",
21705
+ "type": {
21706
+ "text": "number | undefined"
21707
+ },
21708
+ "description": "The most characters a draft can have. The field stops taking more.",
21709
+ "attribute": "maxlength"
21710
+ },
21711
+ {
21712
+ "kind": "field",
21713
+ "name": "minLength",
21714
+ "type": {
21715
+ "text": "number | undefined"
21716
+ },
21717
+ "description": "The fewest characters a draft can have, once the reader has written in\nthe field, as on a `<textarea>`.",
21718
+ "attribute": "minlength"
21719
+ },
21311
21720
  {
21312
21721
  "kind": "field",
21313
21722
  "name": "placeholder",
@@ -21318,6 +21727,16 @@
21318
21727
  "description": "Placeholder text shown in an empty field.",
21319
21728
  "attribute": "placeholder"
21320
21729
  },
21730
+ {
21731
+ "kind": "field",
21732
+ "name": "required",
21733
+ "type": {
21734
+ "text": "boolean"
21735
+ },
21736
+ "default": "false",
21737
+ "description": "Whether the form needs a draft to submit. An empty draft never sends,\nrequired or not.",
21738
+ "attribute": "required"
21739
+ },
21321
21740
  {
21322
21741
  "kind": "field",
21323
21742
  "name": "rows",
@@ -21381,6 +21800,26 @@
21381
21800
  "default": "false",
21382
21801
  "description": "Whether the user is writing, which `helix-typing` announces."
21383
21802
  },
21803
+ {
21804
+ "kind": "field",
21805
+ "name": "touched",
21806
+ "type": {
21807
+ "text": "boolean"
21808
+ },
21809
+ "privacy": "private",
21810
+ "default": "false",
21811
+ "description": "Whether the reader has tried to send or submit the draft, or edited it and left."
21812
+ },
21813
+ {
21814
+ "kind": "field",
21815
+ "name": "shownInvalid",
21816
+ "type": {
21817
+ "text": "boolean"
21818
+ },
21819
+ "privacy": "private",
21820
+ "default": "false",
21821
+ "description": "Whether the composer shows that its draft is wrong."
21822
+ },
21384
21823
  {
21385
21824
  "kind": "field",
21386
21825
  "name": "pause",
@@ -21457,6 +21896,13 @@
21457
21896
  "text": "formResetCallback() => void"
21458
21897
  }
21459
21898
  },
21899
+ {
21900
+ "kind": "field",
21901
+ "name": "touch",
21902
+ "privacy": "private",
21903
+ "readonly": true,
21904
+ "description": "The reader has had a go at the draft, so whether it is wrong can be shown."
21905
+ },
21460
21906
  {
21461
21907
  "kind": "method",
21462
21908
  "name": "formStateRestoreCallback",
@@ -22343,6 +22789,22 @@
22343
22789
  "description": "The field's name, read by screen readers.",
22344
22790
  "fieldName": "label"
22345
22791
  },
22792
+ {
22793
+ "name": "maxlength",
22794
+ "type": {
22795
+ "text": "number | undefined"
22796
+ },
22797
+ "description": "The most characters a draft can have. The field stops taking more.",
22798
+ "fieldName": "maxLength"
22799
+ },
22800
+ {
22801
+ "name": "minlength",
22802
+ "type": {
22803
+ "text": "number | undefined"
22804
+ },
22805
+ "description": "The fewest characters a draft can have, once the reader has written in\nthe field, as on a `<textarea>`.",
22806
+ "fieldName": "minLength"
22807
+ },
22346
22808
  {
22347
22809
  "name": "placeholder",
22348
22810
  "type": {
@@ -22352,6 +22814,15 @@
22352
22814
  "description": "Placeholder text shown in an empty field.",
22353
22815
  "fieldName": "placeholder"
22354
22816
  },
22817
+ {
22818
+ "name": "required",
22819
+ "type": {
22820
+ "text": "boolean"
22821
+ },
22822
+ "default": "false",
22823
+ "description": "Whether the form needs a draft to submit. An empty draft never sends,\nrequired or not.",
22824
+ "fieldName": "required"
22825
+ },
22355
22826
  {
22356
22827
  "name": "rows",
22357
22828
  "type": {
@@ -22424,6 +22895,20 @@
22424
22895
  }
22425
22896
  }
22426
22897
  ],
22898
+ "cssStates": [
22899
+ {
22900
+ "description": "The draft fails `required`, `minlength`, `maxlength`, or a custom error, and the reader has tried to send or submit it, or edited the field and left it.",
22901
+ "name": "invalid"
22902
+ },
22903
+ {
22904
+ "description": "Set one frame after the first render. Transitions wait for it, so an element does not animate its own arrival.",
22905
+ "name": "settled",
22906
+ "inheritedFrom": {
22907
+ "name": "HelixElement",
22908
+ "module": "src/helix-element/helix-element.ts"
22909
+ }
22910
+ }
22911
+ ],
22427
22912
  "superclass": {
22428
22913
  "name": "HelixFormElement",
22429
22914
  "package": "@fusion.dev/helix-core"
@@ -22444,16 +22929,6 @@
22444
22929
  },
22445
22930
  "tagName": "helix-headless-chat-composer",
22446
22931
  "customElement": true,
22447
- "cssStates": [
22448
- {
22449
- "description": "Set one frame after the first render. Transitions wait for it, so an element does not animate its own arrival.",
22450
- "name": "settled",
22451
- "inheritedFrom": {
22452
- "name": "HelixElement",
22453
- "module": "src/helix-element/helix-element.ts"
22454
- }
22455
- }
22456
- ],
22457
22932
  "modulePath": "src/chat/composer/chat-composer.ts",
22458
22933
  "definitionPath": "src/chat/composer/chat-composer.ts"
22459
22934
  }
@@ -23992,6 +24467,17 @@
23992
24467
  "description": "The element that scrolls, once there is one.",
23993
24468
  "readonly": true
23994
24469
  },
24470
+ {
24471
+ "kind": "method",
24472
+ "name": "markScroller",
24473
+ "privacy": "private",
24474
+ "return": {
24475
+ "type": {
24476
+ "text": "void"
24477
+ }
24478
+ },
24479
+ "description": "Makes the log a tab stop while it scrolls, and takes the stop away when it\ndoes not.\n\n**A reader on a keyboard scrolls the history from the log itself.**\nChromium and Firefox make a box that scrolls focusable on their own, and\nSafari does not, so there the arrow keys could not reach a long history.\nA log that fits is no stop at all, so Tab goes straight to the composer."
24480
+ },
23995
24481
  {
23996
24482
  "kind": "field",
23997
24483
  "name": "atBottom",
@@ -24497,6 +24983,20 @@
24497
24983
  "module": "src/mixins/mixin-collection/mixin-collection.ts"
24498
24984
  }
24499
24985
  },
24986
+ {
24987
+ "kind": "field",
24988
+ "name": "statusSlots",
24989
+ "type": {
24990
+ "text": "boolean"
24991
+ },
24992
+ "privacy": "protected",
24993
+ "default": "false",
24994
+ "description": "Whether the status line is an `empty` or `loading` slot, with\n`empty-text` or `loading-text` as its fallback.\n\n**Off unless a family turns it on**, because a slot is published API:\neach family that renders one documents it in its own manifest. The live\nregion keeps saying the text either way, because a slotted picture has no\nwords to say.",
24995
+ "inheritedFrom": {
24996
+ "name": "MixinCollection",
24997
+ "module": "src/mixins/mixin-collection/mixin-collection.ts"
24998
+ }
24999
+ },
24500
25000
  {
24501
25001
  "kind": "field",
24502
25002
  "name": "tier",
@@ -41959,7 +42459,7 @@
41959
42459
  "declarations": [
41960
42460
  {
41961
42461
  "kind": "class",
41962
- "description": "Declare the columns as `TableColumn` children and pass the rows as an array.\nThe schema stays readable in the HTML, and the rows can be windowed, which\nten thousand row elements cannot be.\n\n```html\n<helix-headless-data-table .rows=${rows} sort=\"name:asc\" page-size=\"20\">\n <helix-headless-table-column field=\"name\" sortable>Name</helix-headless-table-column>\n <helix-headless-table-column field=\"size\" text-align=\"end\" sortable .cell=${bytes}>Size</helix-headless-table-column>\n</helix-headless-data-table>\n```\n\nFor a short table written out by hand, use `Table`, which takes rows as\nmarkup.\n\nSort and filter apply to the whole set, including the rows on other pages.\n\n**The cell values do not server-render.** The headings and the row elements\ndo. Reading a cell needs the columns, and Lit SSR does not pass the column\nchildren to this element, so a crawler sees an empty table of the right\nshape. Use `Table` when the served HTML has to carry the values.\n\n`selectable` adds a column of checkboxes, keyed on `row-key`:\n\n- A row is selected by its key, so the selection survives a sort, a filter,\n and a page change.\n- `selected` holds the chosen keys, comma separated, the same shape `Listbox`\n uses for a multiple choice. As with `sort`, writing it applies the\n selection, and `default-selected` holds what the markup declared.\n- The checkbox in the heading selects every row in the result, across pages,\n and shows a dash while only some are chosen.\n- Shift with a press on a checkbox selects every row between it and the row\n last chosen.\n\nTo act on a single row, such as opening it, put a link or a button in a cell.\n\n**Keyboard.** The grid is one tab stop, and the arrow keys move between its\ncells, the headings included.\n\n| Key | What it does |\n|---|---|\n| Right, Left | Moves one cell along the row. Left moves on, on a right-to-left page. |\n| Down, Up | Moves one row, the heading row and the `load-more` row included. |\n| Home, End | Moves to the first or the last cell of the row. |\n| Control with Home or End | Moves to the first or the last cell of the grid. |\n| Page Down, Page Up | Moves by the rows that fit in view. |\n| Enter, F2 | Moves into the cell's controls. Escape moves back to the cell, and Tab moves between the controls of one cell. |\n| Enter, Space on a sortable heading | Sorts by the column. |\n| Enter, Space on the `load-more` row | Sends `helix-load-more`. |\n| Space on a row | Selects the row, in a `selectable` table. |\n| Shift with Down or Up | Selects the rows it moves across, in a `selectable` table. |\n| Shift with Space | Selects every row from the one last chosen, in a `selectable` table. |\n| Control or Command with A | Selects every row, in a `selectable` table. |\n| Right on a row header in a tree grid | Opens a closed row, and moves one cell along an open one. |\n| Left on a row header in a tree grid | Closes an open row, and moves to the parent of a closed one. |\n| A letter or a word | Moves to the next row whose row header starts with what you typed. |\n\n`selected` and `expanded` hold their keys in the order of the rows, as do\n`helix-select`, `helix-selected` and `helix-expand`.\n\nEach row is named by its row header, the column marked `row-header`, or the\nfirst column with a `field` where none is. A screen reader says it as a reader\nmoves between rows.\n\n**Rows that hold rows.** `child-field` names the field that holds a row's\nchild rows, and the grid becomes a tree grid. The row header column draws a\nmark that a press opens and closes a row by, and `expanded` holds the keys of the open\nrows, which `row-key` names. Right on a closed row's header opens it, Left on\nan open one closes it, and Left on a child moves to its parent. A sort orders\nthe rows under each parent, and a search shows the rows that lead to each\nmatch, open.\n\n`load-more` adds a row after the last one with a button that sends\n`helix-load-more`. A `windowed` table also sends it by itself once a reader\nscrolls within one screen of the end, once for each number of rows. Add the\nnext rows to `rows`, and set `loading` while they are on their way.\n\nThe controls inside the cells leave the tab order, so Tab moves past the\nwhole grid. A windowed table keeps the row holding focus drawn while the\nrest scroll away.\n\nPeople can resize and reorder the columns. `resizable` on a column puts a\nseparator on its edge. `reorderable` on the table puts a grip on each heading\nthat has a `field`, moved by dragging or with the arrow keys. The new order\nis written to `order` as a list of fields. Your markup is not rewritten: the\ntable assigns the headings to its header in that order.\n\n**`reorderable-rows` lets people move rows.** A column of grips leads each\nrow, named by `move-row-label`. Drag a grip to move its row, and the table\nscrolls near an edge. Or press Space or Enter on a grip, or click it, to pick\nup its row, move it with Down and Up, Home and End, and press Space or Enter\nagain to drop it. A click on another row drops it there, and Escape puts it\nback. The table says each step in its `live` region. A drop sends\n`helix-before-reorder`, which you can refuse, and then `helix-reorder` with\n`kind` set to `row`, whose `keys` hold every key of `rows` in the new order.\n**You move the rows**: set `rows` to the new order, and the table draws it.\nSet `row-key`, so a row is known by its key once it has moved. The grips do\nnothing while a `sort` is set, since the sort decides the order, and a tree\ngrid draws none.\n\n`csv()` returns the result as text: every row that passes the filter, in the\norder and the columns on screen. Saving the file is up to you.\n\n`DataTable` has no `columns` attribute. Each `TableColumn` is part of the\nschema, so you size a column with its own `width`. `Table` has `columns`\nbecause its cells are markup you write and it can have no columns at all.\nWritten on `DataTable`, `columns` has no effect, so watch for it when you\nmove a table from `Table` to `DataTable`.",
42462
+ "description": "Declare the columns as `TableColumn` children and pass the rows as an array.\nThe schema stays readable in the HTML, and the rows can be windowed, which\nten thousand row elements cannot be.\n\n```html\n<helix-headless-data-table .rows=${rows} sort=\"name:asc\" page-size=\"20\">\n <helix-headless-table-column field=\"name\" sortable>Name</helix-headless-table-column>\n <helix-headless-table-column field=\"size\" text-align=\"end\" sortable .cell=${bytes}>Size</helix-headless-table-column>\n</helix-headless-data-table>\n```\n\nFor a short table written out by hand, use `Table`, which takes rows as\nmarkup.\n\nSort and filter apply to the whole set, including the rows on other pages.\n\n**The cell values do not server-render.** The headings and the row elements\ndo. Reading a cell needs the columns, and Lit SSR does not pass the column\nchildren to this element, so a crawler sees an empty table of the right\nshape. Use `Table` when the served HTML has to carry the values.\n\n`selectable` adds a column of checkboxes, keyed on `row-key`:\n\n- A row is selected by its key, so the selection survives a sort, a filter,\n and a page change.\n- `selected` holds the chosen keys, comma separated, the same shape `Listbox`\n uses for a multiple choice. As with `sort`, writing it applies the\n selection, and `default-selected` holds what the markup declared.\n- The checkbox in the heading selects every row in the result, across pages,\n and shows a dash while only some are chosen.\n- Shift with a press on a checkbox selects every row between it and the row\n last chosen.\n- `selection-behavior=\"replace\"` makes a press or a move select the row\n alone, as a file list does. Control or Command with a press adds or takes\n out one row, and Shift with a press selects every row from the one last\n chosen.\n\nTo act on a single row, such as opening it, put a link or a button in a cell.\n\n**Keyboard.** The grid is one tab stop, and the arrow keys move between its\ncells, the headings included.\n\n| Key | What it does |\n|---|---|\n| Right, Left | Moves one cell along the row. Left moves on, on a right-to-left page. |\n| Down, Up | Moves one row, the heading row and the `load-more` row included. |\n| Home, End | Moves to the first or the last cell of the row. |\n| Control with Home or End | Moves to the first or the last cell of the grid. |\n| Page Down, Page Up | Moves by the rows that fit in view. |\n| Enter, F2 | Moves into the cell's controls. Escape moves back to the cell, and Tab moves between the controls of one cell. |\n| Enter, Space on a sortable heading | Sorts by the column. |\n| Enter, Space on the `load-more` row | Sends `helix-load-more`. |\n| Space on a row | Selects the row, in a `selectable` table. Under `selection-behavior=\"replace\"`, selects it alone, and Control or Command with Space adds or takes out the row. |\n| Down, Up, Page Down, Page Up under `selection-behavior=\"replace\"` | Selects the row it moves to alone. Control or Command with the key moves without selecting. |\n| Shift with Down or Up | Selects the rows it moves across, in a `selectable` table. |\n| Shift with Space | Selects every row from the one last chosen, in a `selectable` table. |\n| Control or Command with A | Selects every row, in a `selectable` table. |\n| Right on a row header in a tree grid | Opens a closed row, and moves one cell along an open one. |\n| Left on a row header in a tree grid | Closes an open row, and moves to the parent of a closed one. |\n| A letter or a word | Moves to the next row whose row header starts with what you typed. |\n\n`selected` and `expanded` hold their keys in the order of the rows, as do\n`helix-select`, `helix-selected` and `helix-expand`.\n\nEach row is named by its row header, the column marked `row-header`, or the\nfirst column with a `field` where none is. A screen reader says it as a reader\nmoves between rows.\n\n**Rows that hold rows.** `child-field` names the field that holds a row's\nchild rows, and the grid becomes a tree grid. The row header column draws a\nmark that a press opens and closes a row by, and `expanded` holds the keys of the open\nrows, which `row-key` names. Right on a closed row's header opens it, Left on\nan open one closes it, and Left on a child moves to its parent. A sort orders\nthe rows under each parent, and a search shows the rows that lead to each\nmatch, open.\n\n`load-more` adds a row after the last one with a button that sends\n`helix-load-more`. A `windowed` table also sends it by itself once a reader\nscrolls within one screen of the end, once for each number of rows. Add the\nnext rows to `rows`, and set `loading` while they are on their way.\n\nThe controls inside the cells leave the tab order, so Tab moves past the\nwhole grid. A windowed table keeps the row holding focus drawn while the\nrest scroll away.\n\nPeople can resize and reorder the columns. `resizable` on a column puts a\nseparator on its edge. `reorderable` on the table puts a grip on each heading\nthat has a `field`, moved by dragging or with the arrow keys. The new order\nis written to `order` as a list of fields. Your markup is not rewritten: the\ntable assigns the headings to its header in that order.\n\n**`reorderable-rows` lets people move rows.** A column of grips leads each\nrow, named by `move-row-label`. Drag a grip to move its row, and the table\nscrolls near an edge. Or press Space or Enter on a grip, or click it, to pick\nup its row, move it with Down and Up, Home and End, and press Space or Enter\nagain to drop it. A click on another row drops it there, and Escape puts it\nback. The table says each step in its `live` region. A drop sends\n`helix-before-reorder`, which you can refuse, and then `helix-reorder` with\n`kind` set to `row`, whose `keys` hold every key of `rows` in the new order.\n**You move the rows**: set `rows` to the new order, and the table draws it.\nSet `row-key`, so a row is known by its key once it has moved. The grips do\nnothing while a `sort` is set, since the sort decides the order, and a tree\ngrid draws none.\n\n`csv()` returns the result as text: every row that passes the filter, in the\norder and the columns on screen. Saving the file is up to you.\n\n`DataTable` has no `columns` attribute. Each `TableColumn` is part of the\nschema, so you size a column with its own `width`. `Table` has `columns`\nbecause its cells are markup you write and it can have no columns at all.\nWritten on `DataTable`, `columns` has no effect, so watch for it when you\nmove a table from `Table` to `DataTable`.",
41963
42463
  "name": "HelixHeadlessDataTable",
41964
42464
  "cssProperties": [
41965
42465
  {
@@ -42198,10 +42698,18 @@
42198
42698
  "description": "The columns, as `TableColumn` elements.",
42199
42699
  "name": ""
42200
42700
  },
42701
+ {
42702
+ "description": "Content shown when there are no rows to show and none are loading, such as a picture and a link. Falls back to `empty-text`, which the live region still says.",
42703
+ "name": "empty"
42704
+ },
42201
42705
  {
42202
42706
  "description": "Content below the grid. It replaces the built-in pagination.",
42203
42707
  "name": "footer"
42204
42708
  },
42709
+ {
42710
+ "description": "Content shown while the rows load, such as a spinner. Falls back to `loading-text`, which the live region still says.",
42711
+ "name": "loading"
42712
+ },
42205
42713
  {
42206
42714
  "description": "Content above the grid, such as a search field or actions.",
42207
42715
  "name": "toolbar"
@@ -42232,6 +42740,20 @@
42232
42740
  "module": "src/mixins/mixin-collection/mixin-collection.ts"
42233
42741
  }
42234
42742
  },
42743
+ {
42744
+ "kind": "field",
42745
+ "name": "statusSlots",
42746
+ "type": {
42747
+ "text": "boolean"
42748
+ },
42749
+ "privacy": "protected",
42750
+ "default": "true",
42751
+ "description": "The empty and loading lines are the `empty` and `loading` slots.",
42752
+ "inheritedFrom": {
42753
+ "name": "MixinCollection",
42754
+ "module": "src/mixins/mixin-collection/mixin-collection.ts"
42755
+ }
42756
+ },
42235
42757
  {
42236
42758
  "kind": "field",
42237
42759
  "name": "ascendingLabel",
@@ -42704,6 +43226,16 @@
42704
43226
  "words": true
42705
43227
  }
42706
43228
  },
43229
+ {
43230
+ "kind": "field",
43231
+ "name": "selectionBehavior",
43232
+ "type": {
43233
+ "text": "'replace' | 'toggle'"
43234
+ },
43235
+ "default": "'toggle'",
43236
+ "description": "What a key or a press on a row does to the rows already selected, in a\n`selectable` table. `toggle`, the default, keeps them: Space adds or takes\nout the row. `replace` selects the row alone, as a file list does: Down and\nUp carry the selection with them, and a press on a row selects it. Control\nor Command with a press or Space adds or takes out one row, and with a move\ngoes without selecting. The checkboxes add or take out one row either way.",
43237
+ "attribute": "selection-behavior"
43238
+ },
42707
43239
  {
42708
43240
  "kind": "field",
42709
43241
  "name": "selectRowLabel",
@@ -43861,7 +44393,7 @@
43861
44393
  "text": "void"
43862
44394
  }
43863
44395
  },
43864
- "description": "The columns into the header row, everything else into the toolbar and footer.\n\nManual assignment, so a consumer's own markup is never written to."
44396
+ "description": "The columns into the header row, everything else into the slot it names.\n\nManual assignment, so a consumer's own markup is never written to."
43865
44397
  },
43866
44398
  {
43867
44399
  "kind": "field",
@@ -44284,6 +44816,42 @@
44284
44816
  "readonly": true,
44285
44817
  "description": "Notes whether Shift is held, before the press reaches a checkbox, whose\nrequest carries only the state it asks for."
44286
44818
  },
44819
+ {
44820
+ "kind": "field",
44821
+ "name": "replaces",
44822
+ "type": {
44823
+ "text": "boolean"
44824
+ },
44825
+ "privacy": "private",
44826
+ "description": "Whether a press or a move on a row selects it alone.",
44827
+ "readonly": true
44828
+ },
44829
+ {
44830
+ "kind": "method",
44831
+ "name": "chooseOnly",
44832
+ "privacy": "private",
44833
+ "return": {
44834
+ "type": {
44835
+ "text": "void"
44836
+ }
44837
+ },
44838
+ "parameters": [
44839
+ {
44840
+ "name": "row",
44841
+ "type": {
44842
+ "text": "number"
44843
+ }
44844
+ }
44845
+ ],
44846
+ "description": "Selects the row at `row` on the page alone, and makes it where a range\nruns from. Asks nothing where it is already the only one selected."
44847
+ },
44848
+ {
44849
+ "kind": "field",
44850
+ "name": "handleRowClick",
44851
+ "privacy": "private",
44852
+ "readonly": true,
44853
+ "description": "A press on a row under `selection-behavior=\"replace\"`: it selects the row\nalone, Control or Command adds or takes out the row, and Shift selects\nevery row from the one last chosen. A press on a control in a cell, or on\nthe checkbox or grip column, is the control's."
44854
+ },
44287
44855
  {
44288
44856
  "kind": "field",
44289
44857
  "name": "handleHeadClick",
@@ -45609,6 +46177,15 @@
45609
46177
  "description": "What screen readers hear when the chosen rows change. `{count}` is how many\nrows are chosen, written in the locale, and a language that needs plural\nforms writes them: `{count, plural, one {# wybrany} few {# wybrane} many\n{# wybranych} other {# wybranego}}`.",
45610
46178
  "fieldName": "selectedLabel"
45611
46179
  },
46180
+ {
46181
+ "name": "selection-behavior",
46182
+ "type": {
46183
+ "text": "'replace' | 'toggle'"
46184
+ },
46185
+ "default": "'toggle'",
46186
+ "description": "What a key or a press on a row does to the rows already selected, in a\n`selectable` table. `toggle`, the default, keeps them: Space adds or takes\nout the row. `replace` selects the row alone, as a file list does: Down and\nUp carry the selection with them, and a press on a row selects it. Control\nor Command with a press or Space adds or takes out one row, and with a move\ngoes without selecting. The checkboxes add or take out one row either way.",
46187
+ "fieldName": "selectionBehavior"
46188
+ },
45612
46189
  {
45613
46190
  "name": "select-row-label",
45614
46191
  "type": {
@@ -53482,6 +54059,31 @@
53482
54059
  "kind": "javascript-module",
53483
54060
  "path": "src/dialog/description.ts",
53484
54061
  "declarations": [
54062
+ {
54063
+ "kind": "function",
54064
+ "name": "wordsAmong",
54065
+ "return": {
54066
+ "type": {
54067
+ "text": "Element[]"
54068
+ }
54069
+ },
54070
+ "parameters": [
54071
+ {
54072
+ "name": "elements",
54073
+ "type": {
54074
+ "text": "readonly Element[]"
54075
+ }
54076
+ },
54077
+ {
54078
+ "name": "skip",
54079
+ "default": "null",
54080
+ "type": {
54081
+ "text": "Element | null"
54082
+ }
54083
+ }
54084
+ ],
54085
+ "description": "The elements at the start of a list that hold words and no control, up to the\nfirst one that is or holds a control.\n\n`skip` is an element whose words are said elsewhere, such as the heading\nthat names a panel. It is left out, and an element holding it is read for\nits other children, so a card's title names the panel and the card's text\ndescribes it."
54086
+ },
53485
54087
  {
53486
54088
  "kind": "function",
53487
54089
  "name": "wordsIn",
@@ -53502,6 +54104,14 @@
53502
54104
  }
53503
54105
  ],
53504
54106
  "exports": [
54107
+ {
54108
+ "kind": "js",
54109
+ "name": "wordsAmong",
54110
+ "declaration": {
54111
+ "name": "wordsAmong",
54112
+ "module": "src/dialog/description.ts"
54113
+ }
54114
+ },
53505
54115
  {
53506
54116
  "kind": "js",
53507
54117
  "name": "wordsIn",
@@ -53533,7 +54143,7 @@
53533
54143
  "declarations": [
53534
54144
  {
53535
54145
  "kind": "class",
53536
- "description": "Renders a native `<dialog>` opened with `showModal()`. The platform provides:\n\n- the top layer, so the dialog is above everything whatever the `z-index`\n- a backdrop\n- closing with Escape\n- an inert page behind the dialog, unreachable by pointer, keyboard, or\n virtual cursor\n\nThe dialog adds one thing to those: `Tab` from its last control goes to its\nfirst, and `Shift+Tab` from its first to its last. A native modal lets `Tab`\npast its last control out to the browser's own controls.\n\n`open` calls `showModal()`, and every way the dialog closes goes through\n`requestOpen`. A native dialog closes three ways: the property, Escape, and a\n`<form method=\"dialog\">` submit. Routing all three through `requestOpen`\nkeeps your state in step, so the dialog never closes while your state still\nsays it is open, which would leave it impossible to reopen.\n\nThe dialog's name is `label` when you set it. Otherwise it is the heading in\nthe `header` slot, or the elements an `aria-labelledby` on the host names,\nand `fallback-label` where nothing names it.\nWhile it is open, the page behind it does not scroll.\n\nThe dialog is described by the words at the start of its body: the elements\nin the default slot before the first one that is or holds a control. A\nquestion above a form describes the dialog, and the form does not. A Helix\ncomponent that draws words and no control, such as `Text`, counts as words. An\n`aria-describedby` on the host replaces it.\n\nSet `alert` for a dialog that interrupts to ask for an answer, such as a\nconfirmation before a deletion. It is an `alertdialog`, which a screen reader\nannounces with its description as it opens. Set `dismissible` to draw a\nclose control, labeled by `dismiss-label`.",
54146
+ "description": "Renders a native `<dialog>` opened with `showModal()`. The platform provides:\n\n- the top layer, so the dialog is above everything whatever the `z-index`\n- a backdrop\n- closing with Escape\n- an inert page behind the dialog, unreachable by pointer, keyboard, or\n virtual cursor\n\nThe dialog adds one thing to those: `Tab` from its last control goes to its\nfirst, and `Shift+Tab` from its first to its last. A native modal lets `Tab`\npast its last control out to the browser's own controls.\n\n`open` calls `showModal()`, and every way the dialog closes goes through\n`requestOpen`. A native dialog closes three ways: the property, Escape, and a\n`<form method=\"dialog\">` submit. Routing all three through `requestOpen`\nkeeps your state in step, so the dialog never closes while your state still\nsays it is open, which would leave it impossible to reopen.\n\nThe dialog's name is `label` when you set it. Otherwise it is the heading in\nthe `header` slot, or the elements an `aria-labelledby` on the host names,\nand `fallback-label` where nothing names it.\nWhile it is open, the page behind it does not scroll.\n\nThe dialog is described by the words at the start of its body: the elements\nin the default slot before the first one that is or holds a control. A\nquestion above a form describes the dialog, and the form does not. A Helix\ncomponent that draws words and no control, such as `Text`, counts as words. An\n`aria-describedby` on the host replaces it.\n\nSet `alert` for a dialog that interrupts to ask for an answer, such as a\nconfirmation before a deletion. It is an `alertdialog`, which a screen reader\nannounces with its description as it opens. Set `dismissible` to draw a\nclose control, labeled by `dismiss-label`.\n\n**Keyboard.** Opening moves focus to the first control in the dialog.\n\n| Key | What it does |\n|---|---|\n| Tab, Shift+Tab | Moves through the controls in the dialog, from the last round to the first and from the first round to the last. |\n| Escape | Asks to close the dialog. A `helix-before-close` listener can refuse, and `persistent` or `closedby=\"none\"` keeps it open. |\n| Enter, Space | On the close control, closes the dialog. |\n\nClosing puts focus back on the element that had it before the dialog opened.",
53537
54147
  "name": "HelixHeadlessDialog",
53538
54148
  "cssParts": [
53539
54149
  {
@@ -53610,7 +54220,7 @@
53610
54220
  "type": {
53611
54221
  "text": "'any' | 'closerequest' | 'none' | undefined"
53612
54222
  },
53613
- "description": "Which close requests the browser handles on its own.\n\n`<dialog closedby>`, forwarded, and safe to forward because every path it\nopens still comes back through this element: a close request fires `cancel`\nfirst, `handleCancel` prevents it, and `requestOpen` decides. So\n`closedby=\"any\"` gains light dismiss without giving up the refusal, which is\nthe property this component exists to keep.\n\nAbsent by default, which is the platform's `auto` and this library's rule\nthat a resting value is an attribute's absence.",
54223
+ "description": "Which close requests the browser handles on its own.\n\n`<dialog closedby>`, forwarded, and safe to forward because every path it\nopens still comes back through this element: a close request fires `cancel`\nfirst, `handleCancel` prevents it, and `requestOpen` decides. So\n`closedby=\"any\"` gains light dismiss without giving up the refusal, which is\nthe property this component exists to keep.\n\nThe press on the backdrop that this element handles itself follows it too:\n`closerequest` and `none` leave the dialog open on that press, as the\nplatform does, and `none` also keeps it open on Escape in a browser without\n`closedby`.\n\nAbsent by default, which is the platform's `auto` and this library's rule\nthat a resting value is an attribute's absence. Absent, a press on the\nbackdrop closes the dialog.",
53614
54224
  "attribute": "closedby",
53615
54225
  "reflects": true
53616
54226
  },
@@ -54396,7 +55006,7 @@
54396
55006
  "type": {
54397
55007
  "text": "'any' | 'closerequest' | 'none' | undefined"
54398
55008
  },
54399
- "description": "Which close requests the browser handles on its own.\n\n`<dialog closedby>`, forwarded, and safe to forward because every path it\nopens still comes back through this element: a close request fires `cancel`\nfirst, `handleCancel` prevents it, and `requestOpen` decides. So\n`closedby=\"any\"` gains light dismiss without giving up the refusal, which is\nthe property this component exists to keep.\n\nAbsent by default, which is the platform's `auto` and this library's rule\nthat a resting value is an attribute's absence.",
55009
+ "description": "Which close requests the browser handles on its own.\n\n`<dialog closedby>`, forwarded, and safe to forward because every path it\nopens still comes back through this element: a close request fires `cancel`\nfirst, `handleCancel` prevents it, and `requestOpen` decides. So\n`closedby=\"any\"` gains light dismiss without giving up the refusal, which is\nthe property this component exists to keep.\n\nThe press on the backdrop that this element handles itself follows it too:\n`closerequest` and `none` leave the dialog open on that press, as the\nplatform does, and `none` also keeps it open on Escape in a browser without\n`closedby`.\n\nAbsent by default, which is the platform's `auto` and this library's rule\nthat a resting value is an attribute's absence. Absent, a press on the\nbackdrop closes the dialog.",
54400
55010
  "fieldName": "closedBy"
54401
55011
  },
54402
55012
  {
@@ -54570,7 +55180,7 @@
54570
55180
  "declarations": [
54571
55181
  {
54572
55182
  "kind": "class",
54573
- "description": "The separator role is on the rule inside the shadow root. A role does not\nneed to cross the shadow boundary the way an IDREF does, so it can sit on the\nrendered element. The semantics are then in the server-rendered markup, with\nno attribute written by script after the element connects.\n\n**The line is a separator**, as `<hr>` is, and as Radix Separator, React\nAria Separator, and Web Awesome's divider are. It is named by any content\nset into it, so a screen reader says \"Or, separator\" where you wrote \"Or\" on\nthe line. Set `decorative` on a rule that separates nothing, such as one\nunder a heading or between the facts of a byline, and it leaves the\naccessibility tree.\n\nUse `orientation=\"vertical\"` between items on one line. A vertical divider\nstretches to fit its flex parent and sets no height of its own.\n\n**Inside a toolbar it runs across the toolbar** without being told: vertical\nin a horizontal toolbar and horizontal in a vertical one, with\n`aria-orientation` to match, as React Aria's separator does inside a\ntoolbar. Inside means a child of Toolbar or of the page's own\n`role=\"toolbar\"`. An `orientation` you write still wins. A server cannot see\nthe toolbar, so the turn arrives with hydration, inside the shadow root.",
55183
+ "description": "The separator role is on the rule inside the shadow root. A role does not\nneed to cross the shadow boundary the way an IDREF does, so it can sit on the\nrendered element. The semantics are then in the server-rendered markup, with\nno attribute written by script after the element connects.\n\n**The line is a separator**, as `<hr>` is, and as Radix Separator, React\nAria Separator, and Web Awesome's divider are. It is named by any content\nset into it, so a screen reader says \"Or, separator\" where you wrote \"Or\" on\nthe line, and the words are read once, as that name. Set words into a\nseparator and no controls, which are hidden with them. Set `decorative` on\na rule that separates nothing, such as one under a heading or between the\nfacts of a byline, and it leaves the accessibility tree.\n\nUse `orientation=\"vertical\"` between items on one line. A vertical divider\nstretches to fit its flex parent and sets no height of its own.\n\n**Inside a toolbar it runs across the toolbar** without being told: vertical\nin a horizontal toolbar and horizontal in a vertical one, with\n`aria-orientation` to match, as React Aria's separator does inside a\ntoolbar. Inside means a child of Toolbar or of the page's own\n`role=\"toolbar\"`. An `orientation` you write still wins. A server cannot see\nthe toolbar, so the turn arrives with hydration, inside the shadow root.",
54574
55184
  "name": "HelixHeadlessDivider",
54575
55185
  "cssParts": [
54576
55186
  {
@@ -54596,7 +55206,7 @@
54596
55206
  "text": "boolean"
54597
55207
  },
54598
55208
  "default": "false",
54599
- "description": "Whether screen readers announce the line as a separator, which they now do\nby default.\n\nIt dates from when the line was decorative by default. It is still read,\nand it wins over `decorative`, so a divider written with it stays a\nseparator.",
55209
+ "description": "Whether screen readers announce the line as a separator, which they now do\nby default.",
54600
55210
  "attribute": "announced",
54601
55211
  "reflects": true
54602
55212
  },
@@ -54989,7 +55599,7 @@
54989
55599
  "text": "boolean"
54990
55600
  },
54991
55601
  "default": "false",
54992
- "description": "Whether screen readers announce the line as a separator, which they now do\nby default.\n\nIt dates from when the line was decorative by default. It is still read,\nand it wins over `decorative`, so a divider written with it stays a\nseparator.",
55602
+ "description": "Whether screen readers announce the line as a separator, which they now do\nby default.",
54993
55603
  "fieldName": "announced"
54994
55604
  },
54995
55605
  {
@@ -56390,7 +57000,7 @@
56390
57000
  "declarations": [
56391
57001
  {
56392
57002
  "kind": "class",
56393
- "description": "Uses `MixinControllerOpen`, so `open`, `defaultOpen`, and the\n`helix-before-open` and `helix-before-close` events work the same way as on\nan accordion item.\n\nThe drawer is modal by default, which means four things:\n\n- focus is trapped inside: `Tab` from the last control goes to the first,\n and `Shift+Tab` from the first to the last, as in `Dialog`\n- Escape and a press outside close it\n- the page behind is covered\n- the page behind does not scroll\n\nA drawer with `modal=\"false\"` leaves the page usable and still closes on\nEscape, in a browser without `closedby` as well.\n\n**A touch or a pen swipes it away**, toward the edge it came from, resolved\nagainst the writing direction. A swipe past halfway, or a quick one, closes\nit through the same request as every other way out. `snap-points` lists the\nfractions of the panel a reader can leave on screen, such as `0.5 1` for a\nsheet that rests half open: it opens at the smallest, and a swipe settles at\nthe nearest. While a swipe moves the panel, the distance is written on it as\n`--drawer-swipe-x` and `--drawer-swipe-y`. `swipe=\"false\"` turns swiping off.\n\n`snap` is the snap point the panel rests at, and `:state(snapped)` is on the\nhost while that is less than the whole panel. `snapTo()` moves it to\nanother. **Focus moving to a control past the\nwindow's edge opens the panel to its largest snap point**, so a reader\nmoving through a half open sheet with `Tab` never lands on a control they\ncannot see.\n\nSet `dismissible` to draw a close control in the corner, labeled by\n`dismiss-label`, as `Dialog` draws one.\n\nThe panel's name is `label` when you set it. Otherwise it is the heading in\nthe `header` slot, or the elements an `aria-labelledby` on the host names,\nand `fallback-label` where nothing names it.\n\nContent stays mounted when the drawer is closed, so it is in the server\nmarkup and can animate. A closed `<dialog>` is already out of the tab order\nand the accessibility tree, so the drawer does not write `inert`. The `role`,\n`aria-modal`, and the scrim also come from the `<dialog>` element.\n`drawer-root.ssr.spec.ts` checks that the panel has no hand-written `inert`\nor `role`.\n\nOpen the drawer declaratively with the platform's invoker attributes:\n\n```html\n<helix-headless-button commandfor=\"nav\" command=\"--toggle\">Menu</helix-headless-button>\n<helix-headless-drawer id=\"nav\">…</helix-headless-drawer>\n```",
57003
+ "description": "Uses `MixinControllerOpen`, so `open`, `defaultOpen`, and the\n`helix-before-open` and `helix-before-close` events work the same way as on\nan accordion item.\n\nThe drawer is modal by default, which means four things:\n\n- focus is trapped inside: `Tab` from the last control goes to the first,\n and `Shift+Tab` from the first to the last, as in `Dialog`\n- Escape and a press outside close it\n- the page behind is covered\n- the page behind does not scroll\n\nA drawer with `modal=\"false\"` leaves the page usable and still closes on\nEscape, in a browser without `closedby` as well.\n\nSet `persistent` for a drawer that has to be answered: Escape, a press\noutside, and a swipe leave it open, and the close control and `close()`\nstill close it. `closedby=\"none\"` keeps it open on all three as well, and\n`closedby=\"closerequest\"` keeps it open on a press outside.\n\n**A touch or a pen swipes it away**, toward the edge it came from, resolved\nagainst the writing direction. A swipe past halfway, or a quick one, closes\nit through the same request as every other way out. `snap-points` lists the\nfractions of the panel a reader can leave on screen, such as `0.5 1` for a\nsheet that rests half open: it opens at the smallest, and a swipe settles at\nthe nearest. While a swipe moves the panel, the distance is written on it as\n`--drawer-swipe-x` and `--drawer-swipe-y`. `swipe=\"false\"` turns swiping off.\n\n`snap` is the snap point the panel rests at, and `:state(snapped)` is on the\nhost while that is less than the whole panel. `snapTo()` moves it to\nanother. **Focus moving to a control past the\nwindow's edge opens the panel to its largest snap point**, so a reader\nmoving through a half open sheet with `Tab` never lands on a control they\ncannot see.\n\nSet `dismissible` to draw a close control in the corner, labeled by\n`dismiss-label`, as `Dialog` draws one.\n\nThe panel's name is `label` when you set it. Otherwise it is the heading in\nthe `header` slot, or the elements an `aria-labelledby` on the host names,\nand `fallback-label` where nothing names it. A development build warns\nwhen a drawer opens with nothing but `fallback-label` to name it.\n\nThe panel is described by the words at the start of its body, as `Dialog`\nis: the elements in the default slot before the first one that is or holds\na control. An `aria-describedby` on the host replaces it.\n\n**Keyboard.** Opening moves focus to the first control in the panel.\n\n| Key | What it does |\n|---|---|\n| Tab, Shift+Tab | In a modal drawer, moves through the controls in the panel, from the last round to the first and from the first round to the last. In a drawer that is not modal, moves on to the page. |\n| Escape | Asks to close the drawer. A `helix-before-close` listener can refuse, and `persistent` or `closedby=\"none\"` keeps it open. |\n| Enter, Space | On the close control, closes the drawer. |\n\nContent stays mounted when the drawer is closed, so it is in the server\nmarkup and can animate. A closed `<dialog>` is already out of the tab order\nand the accessibility tree, so the drawer does not write `inert`. The `role`,\n`aria-modal`, and the scrim also come from the `<dialog>` element.\n`drawer-root.ssr.spec.ts` checks that the panel has no hand-written `inert`\nor `role`.\n\nOpen the drawer declaratively with the platform's invoker attributes:\n\n```html\n<helix-headless-button commandfor=\"nav\" command=\"--toggle\">Menu</helix-headless-button>\n<helix-headless-drawer id=\"nav\">…</helix-headless-drawer>\n```",
56394
57004
  "name": "HelixHeadlessDrawer",
56395
57005
  "cssProperties": [
56396
57006
  {
@@ -56485,6 +57095,16 @@
56485
57095
  "attribute": "dismissible",
56486
57096
  "reflects": true
56487
57097
  },
57098
+ {
57099
+ "kind": "field",
57100
+ "name": "refusesDismissal",
57101
+ "type": {
57102
+ "text": "boolean"
57103
+ },
57104
+ "privacy": "private",
57105
+ "description": "Whether a request to dismiss the drawer, by Escape or a swipe, is refused.",
57106
+ "readonly": true
57107
+ },
56488
57108
  {
56489
57109
  "kind": "field",
56490
57110
  "name": "dismissLabel",
@@ -56521,6 +57141,16 @@
56521
57141
  "description": "Accessible name for the panel. When it is empty, the heading in the\n`header` slot names the panel.",
56522
57142
  "attribute": "label"
56523
57143
  },
57144
+ {
57145
+ "kind": "field",
57146
+ "name": "modal",
57147
+ "type": {
57148
+ "text": "boolean"
57149
+ },
57150
+ "default": "true",
57151
+ "description": "Whether the drawer blocks the page behind it.\n\nTurning this off removes the focus trap and the scrim together, because\nthey are one decision: a panel that traps focus without covering the page\nstrands the reader, and one that covers without trapping lets them tab\nbehind the cover.\n\nNot reflected. It stays `true` by default, since a drawer that silently\nlost its focus trap because a consumer forgot a word would be worse than an\nattribute on the host, and nothing selects on it: the scrim is rendered or\nnot, rather than shown or hidden by CSS.",
57152
+ "attribute": "modal"
57153
+ },
56524
57154
  {
56525
57155
  "kind": "field",
56526
57156
  "name": "aria",
@@ -56530,13 +57160,14 @@
56530
57160
  },
56531
57161
  {
56532
57162
  "kind": "field",
56533
- "name": "modal",
57163
+ "name": "persistent",
56534
57164
  "type": {
56535
57165
  "text": "boolean"
56536
57166
  },
56537
- "default": "true",
56538
- "description": "Whether the drawer blocks the page behind it.\n\nTurning this off removes the focus trap and the scrim together, because\nthey are one decision: a panel that traps focus without covering the page\nstrands the reader, and one that covers without trapping lets them tab\nbehind the cover.\n\nNot reflected. It stays `true` by default, since a drawer that silently\nlost its focus trap because a consumer forgot a word would be worse than an\nattribute on the host, and nothing selects on it: the scrim is rendered or\nnot, rather than shown or hidden by CSS.",
56539
- "attribute": "modal"
57167
+ "default": "false",
57168
+ "description": "Stops Escape, a press outside, and a swipe from closing the drawer, for a\ndrawer that has to be answered.\n\nThe close control and `close()` still close it, as on `Dialog`: a panel\nwith no way out at all is a trap.",
57169
+ "attribute": "persistent",
57170
+ "reflects": true
56540
57171
  },
56541
57172
  {
56542
57173
  "kind": "field",
@@ -56864,6 +57495,27 @@
56864
57495
  },
56865
57496
  "description": "Names the panel by its heading, where nothing else names it.\n\nAn element reference, because the heading is in the light DOM and the\n`<dialog>` is in this shadow root, which an IDREF cannot cross. `label` and\nan `aria-labelledby` on the host come first. A browser without element\nreflection keeps the fallback name."
56866
57497
  },
57498
+ {
57499
+ "kind": "field",
57500
+ "name": "describedByBody",
57501
+ "type": {
57502
+ "text": "boolean"
57503
+ },
57504
+ "privacy": "private",
57505
+ "default": "false",
57506
+ "description": "Whether the body's words are what currently describe the panel."
57507
+ },
57508
+ {
57509
+ "kind": "method",
57510
+ "name": "describeByBody",
57511
+ "privacy": "private",
57512
+ "return": {
57513
+ "type": {
57514
+ "text": "void"
57515
+ }
57516
+ },
57517
+ "description": "Describes the panel by the words at the start of its body, where nothing\nelse describes it, as `Dialog` does. An `aria-describedby` on the host\ncomes first."
57518
+ },
56867
57519
  {
56868
57520
  "kind": "method",
56869
57521
  "name": "renderDismissIcon",
@@ -57427,6 +58079,15 @@
57427
58079
  "description": "Whether the drawer blocks the page behind it.\n\nTurning this off removes the focus trap and the scrim together, because\nthey are one decision: a panel that traps focus without covering the page\nstrands the reader, and one that covers without trapping lets them tab\nbehind the cover.\n\nNot reflected. It stays `true` by default, since a drawer that silently\nlost its focus trap because a consumer forgot a word would be worse than an\nattribute on the host, and nothing selects on it: the scrim is rendered or\nnot, rather than shown or hidden by CSS.",
57428
58080
  "fieldName": "modal"
57429
58081
  },
58082
+ {
58083
+ "name": "persistent",
58084
+ "type": {
58085
+ "text": "boolean"
58086
+ },
58087
+ "default": "false",
58088
+ "description": "Stops Escape, a press outside, and a swipe from closing the drawer, for a\ndrawer that has to be answered.\n\nThe close control and `close()` still close it, as on `Dialog`: a panel\nwith no way out at all is a trap.",
58089
+ "fieldName": "persistent"
58090
+ },
57430
58091
  {
57431
58092
  "name": "placement",
57432
58093
  "type": {
@@ -58702,6 +59363,20 @@
58702
59363
  "module": "src/mixins/mixin-collection/mixin-collection.ts"
58703
59364
  }
58704
59365
  },
59366
+ {
59367
+ "kind": "field",
59368
+ "name": "statusSlots",
59369
+ "type": {
59370
+ "text": "boolean"
59371
+ },
59372
+ "privacy": "protected",
59373
+ "default": "false",
59374
+ "description": "Whether the status line is an `empty` or `loading` slot, with\n`empty-text` or `loading-text` as its fallback.\n\n**Off unless a family turns it on**, because a slot is published API:\neach family that renders one documents it in its own manifest. The live\nregion keeps saying the text either way, because a slotted picture has no\nwords to say.",
59375
+ "inheritedFrom": {
59376
+ "name": "MixinCollection",
59377
+ "module": "src/mixins/mixin-collection/mixin-collection.ts"
59378
+ }
59379
+ },
58705
59380
  {
58706
59381
  "kind": "field",
58707
59382
  "name": "tier",
@@ -80174,7 +80849,7 @@
80174
80849
  "declarations": [
80175
80850
  {
80176
80851
  "kind": "class",
80177
- "description": "Renders a `<kbd>` element.\n\nEach element holds one key, except when you use `keys`. For a sequence or a\nchord, write one element per key and put the separator between them as text,\nsuch as \"then\" or \"plus\".\n\n`keys` renders the right glyphs for the platform. Given `mod`, it renders\n`⌘K` on Apple devices and `Ctrl+K` everywhere else. A `⌘K` typed into a\ntemplate is wrong for anyone on Windows.\n\nThe element binds the shortcut only when `within` is set. By default it draws\nthe key and listens for nothing.\n\n**`for` names the control the shortcut works**, and the key writes its chord\nonto that control's `aria-keyshortcuts`, in the platform's words (`Meta+K`\non an Apple keyboard, `Control+K` elsewhere), so a screen reader announces\nthe shortcut with the control. A chord the page wrote there itself is left\nalone, and the key takes back only what it added.\n\n`caps` draws a chord as a key per key: each is a `key` part and the `+`\nbetween two a `separator` part, so a sheet can draw a cap for each.\n`key-labels` renames any key, on every platform, such as\n`key-labels='{\"mod\":\"Command\"}'`. On an Apple keyboard a word joins the\nnext key with a hyphen, as in `Command-K`.\n\n**`activate` makes the shortcut work the control `for` names**, with no\nscript: `activate=\"focus\"` moves focus to it, as `/` does to a search\nfield, and `activate=\"click\"` presses it. It acts once `helix-shortcut` has\ngone out and no listener canceled it, and only where `within` listens.",
80852
+ "description": "Renders a `<kbd>` element.\n\nEach element holds one key, except when you use `keys`. For a sequence or a\nchord, write one element per key and put the separator between them as text,\nsuch as \"then\" or \"plus\".\n\n`keys` renders the right glyphs for the platform. Given `mod`, it renders\n`⌘K` on Apple devices and `Ctrl+K` everywhere else. A `⌘K` typed into a\ntemplate is wrong for anyone on Windows.\n\nThe element binds the shortcut only when `within` is set. By default it draws\nthe key and listens for nothing.\n\n**`for` names the control the shortcut works**, and the key writes its chord\nonto that control's `aria-keyshortcuts`, in the platform's words (`Meta+K`\non an Apple keyboard, `Control+K` elsewhere), so a screen reader announces\nthe shortcut with the control. A chord the page wrote there itself is left\nalone, and the key takes back only what it added.\n\nA chord is drawn with the platform's modifiers first, in its order, so one\n`keys` value is right everywhere: `mod+shift+p` is `⇧⌘P` on an Apple\nkeyboard and `Ctrl+Shift+P` elsewhere. Where it is drawn in glyphs, it is\nread in words, such as `Shift Command P`.\n\n`caps` draws a chord as a key per key: each is a `key` part and the `+`\nbetween two a `separator` part, so a sheet can draw a cap for each.\n`key-labels` renames any key, on every platform, such as\n`key-labels='{\"mod\":\"Command\"}'`. On an Apple keyboard a word joins the\nnext key with a hyphen, as in `Command-K`.\n\n**`activate` makes the shortcut work the control `for` names**, with no\nscript: `activate=\"focus\"` moves focus to it, as `/` does to a search\nfield, and `activate=\"click\"` presses it. It acts once `helix-shortcut` has\ngone out and no listener canceled it, and only where `within` listens.",
80178
80853
  "name": "HelixHeadlessKbd",
80179
80854
  "cssParts": [
80180
80855
  {
@@ -80352,7 +81027,7 @@
80352
81027
  "text": "TemplateResult"
80353
81028
  }
80354
81029
  },
80355
- "description": "The chord under `caps`, a part for each key and for each `+` between two,\nso a sheet can draw a cap per key. Written with no space between, so a\nchord reads as the one label it was."
81030
+ "description": "The chord under `caps`, a part for each key and for each `+` between two,\nso a sheet can draw a cap per key. Written with no space between, so a\nchord reads as the one label it was. Where the chord is said in words,\nthe parts are hidden from a screen reader, which reads the words."
80356
81031
  },
80357
81032
  {
80358
81033
  "kind": "field",
@@ -82299,7 +82974,7 @@
82299
82974
  "declarations": [
82300
82975
  {
82301
82976
  "kind": "class",
82302
- "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\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.",
82977
+ "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.",
82303
82978
  "name": "HelixHeadlessLightbox",
82304
82979
  "cssProperties": [
82305
82980
  {
@@ -82683,6 +83358,13 @@
82683
83358
  "readonly": true,
82684
83359
  "default": "new SwipeController(this, { axis: () => (this.open && !this.zoomer.engaged ? 'x' : undefined), end: (dx, _dy, vx) => { /* Two fingers came down while it was under way: a pinch, not a swipe. */ if (this.zoomer.pinched) { return } const width = this.partNamed('viewport')?.getBoundingClientRect().width ?? 0 const step = swipeStep(dx, vx, width, isRtl(this)) if (step !== 0) { this.step(step) } }, move: () => this.idle.stir(), start: (_target, event) => event.pointerType !== 'mouse', surface: () => this.dialog, })"
82685
83360
  },
83361
+ {
83362
+ "kind": "field",
83363
+ "name": "scope",
83364
+ "privacy": "protected",
83365
+ "readonly": true,
83366
+ "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, })"
83367
+ },
82686
83368
  {
82687
83369
  "kind": "field",
82688
83370
  "name": "zoomer",
@@ -82923,6 +83605,25 @@
82923
83605
  ],
82924
83606
  "description": "`+` and `-` zoom in and out by half again, and `0` puts the item back. Returns whether it was one."
82925
83607
  },
83608
+ {
83609
+ "kind": "method",
83610
+ "name": "panKey",
83611
+ "privacy": "private",
83612
+ "return": {
83613
+ "type": {
83614
+ "text": "boolean"
83615
+ }
83616
+ },
83617
+ "parameters": [
83618
+ {
83619
+ "name": "key",
83620
+ "type": {
83621
+ "text": "string"
83622
+ }
83623
+ }
83624
+ ],
83625
+ "description": "The arrow keys on a zoomed item, which move about it rather than to\nanother item. Returns whether it was one."
83626
+ },
82926
83627
  {
82927
83628
  "kind": "method",
82928
83629
  "name": "zoomIn",
@@ -82976,7 +83677,60 @@
82976
83677
  "name": "handleBackdrop",
82977
83678
  "privacy": "private",
82978
83679
  "readonly": true,
82979
- "description": "A press on the backdrop, which lands on the dialog element itself.\n\nThe point is compared against the panel's box rather than trusting the\ntarget alone, for the reason `Dialog` gives: a modal `<dialog>` attributes\nbackdrop presses to itself, so any padding the styled tier gives the panel\nis a strip where a press on the panel looks like a press outside it."
83680
+ "description": "A press on the backdrop or on the empty area around the item.\n\nA modal `<dialog>` attributes backdrop presses to itself, and the styled\ntier draws the viewer over the whole screen, so a press beside the item\nlands on the dialog, the viewport, or the item's own box. Any of those is\na reader done with the viewer, as a press on a dark room around a picture\nis. Not a press that dragged, which was a swipe or a pan."
83681
+ },
83682
+ {
83683
+ "kind": "field",
83684
+ "name": "pressedAt",
83685
+ "type": {
83686
+ "text": "{ x: number; y: number } | undefined"
83687
+ },
83688
+ "privacy": "private",
83689
+ "description": "Where the last press began, so a press that dragged closes nothing."
83690
+ },
83691
+ {
83692
+ "kind": "field",
83693
+ "name": "handlePointerDown",
83694
+ "privacy": "private",
83695
+ "readonly": true
83696
+ },
83697
+ {
83698
+ "kind": "method",
83699
+ "name": "dragged",
83700
+ "privacy": "private",
83701
+ "return": {
83702
+ "type": {
83703
+ "text": "boolean"
83704
+ }
83705
+ },
83706
+ "parameters": [
83707
+ {
83708
+ "name": "event",
83709
+ "type": {
83710
+ "text": "MouseEvent"
83711
+ }
83712
+ }
83713
+ ],
83714
+ "description": "Whether the press moved further than a click does, as a swipe or a pan does."
83715
+ },
83716
+ {
83717
+ "kind": "method",
83718
+ "name": "onEmptyArea",
83719
+ "privacy": "private",
83720
+ "return": {
83721
+ "type": {
83722
+ "text": "boolean"
83723
+ }
83724
+ },
83725
+ "parameters": [
83726
+ {
83727
+ "name": "event",
83728
+ "type": {
83729
+ "text": "MouseEvent"
83730
+ }
83731
+ }
83732
+ ],
83733
+ "description": "Whether a press landed on the empty area around the item: the viewer's\nown surface, the viewport, or an item's box beside what it holds. The\nlast two not where `max-zoom` lets a reader zoom, since a double press\nthere zooms."
82980
83734
  },
82981
83735
  {
82982
83736
  "kind": "method",
@@ -84105,6 +84859,24 @@
84105
84859
  ],
84106
84860
  "description": "Zooms to `scale` about the middle of the box, held to the range."
84107
84861
  },
84862
+ {
84863
+ "kind": "method",
84864
+ "name": "panBy",
84865
+ "return": {
84866
+ "type": {
84867
+ "text": "boolean"
84868
+ }
84869
+ },
84870
+ "parameters": [
84871
+ {
84872
+ "name": "by",
84873
+ "type": {
84874
+ "text": "Offset"
84875
+ }
84876
+ }
84877
+ ],
84878
+ "description": "Moves a zoomed item by `by`, in pixels, never so far that an edge comes\ninside the box. Returns whether it moved."
84879
+ },
84108
84880
  {
84109
84881
  "kind": "method",
84110
84882
  "name": "reset",
@@ -84477,7 +85249,7 @@
84477
85249
  "declarations": [
84478
85250
  {
84479
85251
  "kind": "class",
84480
- "description": "A line chart shows the shape of each series: where the readings went.\n\nThe scale covers the range of the data. Including zero in the range of a\nseries that moves between 980 and 1020 would flatten the line into a rule\nacross the top of the box. `BarChart` always starts at zero, because a bar's\nlength is its value. Set `zero` when the distance from zero is the point.\n\nEvery series shares one scale, as in the bar chart.\n\n`dashed` names the series drawn as a dashed line, such as a forecast or a\ntarget beside the readings: `dashed=\"Forecast\"`. Each takes a\n`line-dashed` part beside `line`.\n\n`area` fills each series down to the floor on its own, so the fills overlap.\nFor a total made of parts, use `Area Chart`, which stacks the series so the\ntop edge is the total and each band is a share.\n\nThe labels are HTML beside the drawing, as in `BarChart`. Text inside an\n`<svg>` that fills its box scales with the box, so the same `font-size` can\nrender at 10px in a narrow chart and 43px in a wide one.\n\nThe table is the accessible representation, and the drawing is hidden from\nscreen readers, who get the numbers. The `summary` part names the chart, from\n`label` or the table's caption, and gives each series' latest reading.\n\n**The plot is read by key.** It takes focus, named by `label` or the caption.\nThe left and right arrows move from reading to reading, Home and End go to\nthe first and the last, and the up and down arrows move among the series of\na reading. The tooltip follows, the `live` part says the reading in words,\nand Escape puts the tooltip away.",
85252
+ "description": "A line chart shows the shape of each series: where the readings went.\n\nThe scale covers the range of the data. Including zero in the range of a\nseries that moves between 980 and 1020 would flatten the line into a rule\nacross the top of the box. `BarChart` always starts at zero, because a bar's\nlength is its value. Set `zero` when the distance from zero is the point.\n\nEvery series shares one scale, as in the bar chart.\n\n`dashed` names the series drawn as a dashed line, such as a forecast or a\ntarget beside the readings: `dashed=\"Forecast\"`. Each takes a\n`line-dashed` part beside `line`.\n\n`area` fills each series down to the floor on its own, so the fills overlap.\nFor a total made of parts, use `Area Chart`, which stacks the series so the\ntop edge is the total and each band is a share.\n\nThe labels are HTML beside the drawing, as in `BarChart`. Text inside an\n`<svg>` that fills its box scales with the box, so the same `font-size` can\nrender at 10px in a narrow chart and 43px in a wide one.\n\n`value-axis` draws the scale's numbers beside the plot, at the levels\n`gridlines` rules, written in `locale`.\n\nThe table is the accessible representation, and the drawing is hidden from\nscreen readers, who get the numbers. The `summary` part names the chart, from\n`label` or the table's caption, and gives each series' latest reading.\n\n**The plot is read by key.** It takes focus, named by `label` or the caption.\nThe left and right arrows move from reading to reading, Home and End go to\nthe first and the last, and the up and down arrows move among the series of\na reading. The tooltip follows, the `live` part says the reading in words,\nand Escape puts the tooltip away.\n\n**A tap shows the reading under it**, and keeps it until a tap lands\nelsewhere. `helix-reading-change` says each move of the reading, by pointer,\ntap or key, and `helix-reading-press` says a reading was clicked, tapped, or\npressed with Enter or Space, for a page that opens what a reading stands for.",
84481
85253
  "name": "HelixHeadlessLineChart",
84482
85254
  "cssProperties": [
84483
85255
  {
@@ -84487,6 +85259,10 @@
84487
85259
  {
84488
85260
  "description": "Where a series' last reading sits vertically, as a percentage. Written by the component.",
84489
85261
  "name": "--chart-terminus-y"
85262
+ },
85263
+ {
85264
+ "description": "The width of the axis, in `ch`, set from the widest number on it. Written by the component on the axis.",
85265
+ "name": "--line-chart-axis"
84490
85266
  }
84491
85267
  ],
84492
85268
  "cssParts": [
@@ -84494,6 +85270,10 @@
84494
85270
  "description": "The wash under one line, where `area` is set.",
84495
85271
  "name": "area"
84496
85272
  },
85273
+ {
85274
+ "description": "The numbers of the scale beside the plot, under `value-axis`.",
85275
+ "name": "axis"
85276
+ },
84497
85277
  {
84498
85278
  "description": "The band around the reading under the pointer.",
84499
85279
  "name": "band"
@@ -84558,6 +85338,10 @@
84558
85338
  "description": "The mark on one series' last reading.",
84559
85339
  "name": "terminus"
84560
85340
  },
85341
+ {
85342
+ "description": "One number on the axis, placed with `inset-block-start` at its level.",
85343
+ "name": "tick"
85344
+ },
84561
85345
  {
84562
85346
  "description": "The bubble, forwarded from `Tooltip`.",
84563
85347
  "name": "tooltip"
@@ -84719,6 +85503,17 @@
84719
85503
  "attribute": "terminus",
84720
85504
  "reflects": true
84721
85505
  },
85506
+ {
85507
+ "kind": "field",
85508
+ "name": "valueAxis",
85509
+ "type": {
85510
+ "text": "boolean"
85511
+ },
85512
+ "default": "false",
85513
+ "description": "Draws the scale's numbers beside the plot, the `axis` part, at the levels\n`gridlines` rules, so a reading can be measured off the drawing as well\nas read from the tooltip.\n\nAbsent draws none: a line read for its shape needs no numbers beside it,\nand the tooltip and the table hold every reading.",
85514
+ "attribute": "value-axis",
85515
+ "reflects": true
85516
+ },
84722
85517
  {
84723
85518
  "kind": "method",
84724
85519
  "name": "range",
@@ -84780,6 +85575,31 @@
84780
85575
  ],
84781
85576
  "description": "Where each series ends, as percentages of the drawing's own box.\n\nPercentages rather than user units, for the reason the mark is a `<span>`\nrather than a `<circle>`: `preserveAspectRatio=\"none\"` stretches the\ncoordinate space, so a length in there means two different things depending\non how wide the consumer made the chart. The host's box stretches nothing."
84782
85577
  },
85578
+ {
85579
+ "kind": "method",
85580
+ "name": "renderAxis",
85581
+ "privacy": "protected",
85582
+ "return": {
85583
+ "type": {
85584
+ "text": "TemplateResult"
85585
+ }
85586
+ },
85587
+ "parameters": [
85588
+ {
85589
+ "name": "y",
85590
+ "type": {
85591
+ "text": "(value: number) => number"
85592
+ }
85593
+ },
85594
+ {
85595
+ "name": "domain",
85596
+ "type": {
85597
+ "text": "[number, number]"
85598
+ }
85599
+ }
85600
+ ],
85601
+ "description": "The scale's numbers beside the plot, under `value-axis`, written in the\nchart's locale. A seam, so a subclass can write the numbers its own way,\nsuch as a currency."
85602
+ },
84783
85603
  {
84784
85604
  "kind": "method",
84785
85605
  "name": "renderSummary",
@@ -85685,6 +86505,24 @@
85685
86505
  }
85686
86506
  }
85687
86507
  ],
86508
+ "events": [
86509
+ {
86510
+ "type": {
86511
+ "text": "HelixReadingChangeEvent"
86512
+ },
86513
+ "description": "The reading shown moved, or was put away: `index` is the row, or `-1` for none, with its `label`, the `series` the keys rest on, and the `pointerType` that moved it.",
86514
+ "name": "helix-reading-change",
86515
+ "reactProp": "onhelix-reading-change"
86516
+ },
86517
+ {
86518
+ "type": {
86519
+ "text": "HelixReadingPressEvent"
86520
+ },
86521
+ "description": "A reading was clicked, tapped, or pressed with Enter or Space, with the same detail as `helix-reading-change`.",
86522
+ "name": "helix-reading-press",
86523
+ "reactProp": "onhelix-reading-press"
86524
+ }
86525
+ ],
85688
86526
  "attributes": [
85689
86527
  {
85690
86528
  "name": "area",
@@ -85737,6 +86575,15 @@
85737
86575
  "description": "The shape of the mark on each series' last reading.\n\nAbsent is a dot, and absent rather than defaulted because a reflecting\nproperty with a default writes its attribute onto a host the consumer\nrendered, which React reports as a hydration mismatch.\n\n**One per series, in a column at the far edge**, because every series here\nshares an x-axis and therefore ends at the same reading. That column is the\nuseful thing: it is where a reader looks for \"and what is it now\", which is\nthe question a sparkline's single mark answers too.\n\n`none` lets the lines stop on their own, which suits a chart read for its\nshape rather than for where it finished. `square` is the same mark with its\ncorners, for a drawing whose neighbors are square, the columns of a table\nbeside it for instance. `ring` lets the ground through, for a chart drawn\nover something busy. `triangle` points along the axis and reads as \"and\nonward\" rather than as a second claim about the data.\n\nThe shapes come from one shared sheet, the same one `Sparkline` takes, so\nthe set is identical wherever one appears. **Which is why every value is\nnamed here.** `Sparkline` shipped `square` implemented, drawn, asserted and\nundocumented until the cohort before this one; this family reads the same\nfour out of the same sheet and had left two of them unwritten, so the\nfinding arrived twice. A shared vocabulary wants naming at each door into\nit, because a reader arrives at one door and not at the set.\n\n`ring` is the one that asks something of the drawing. It leaves a hole and a\nline ends at the reading, which is the hole's center, so the `<svg>` is\nmasked with one disc per series and every stroke stops at its own ring's\ninner edge. `mask-composite: intersect` is what makes N holes out of N\nlayers; a single `mask-image` would only ever cut the last one.",
85738
86576
  "fieldName": "terminus"
85739
86577
  },
86578
+ {
86579
+ "name": "value-axis",
86580
+ "type": {
86581
+ "text": "boolean"
86582
+ },
86583
+ "default": "false",
86584
+ "description": "Draws the scale's numbers beside the plot, the `axis` part, at the levels\n`gridlines` rules, so a reading can be measured off the drawing as well\nas read from the tooltip.\n\nAbsent draws none: a line read for its shape needs no numbers beside it,\nand the tooltip and the table hold every reading.",
86585
+ "fieldName": "valueAxis"
86586
+ },
85740
86587
  {
85741
86588
  "name": "zero",
85742
86589
  "type": {
@@ -89289,6 +90136,20 @@
89289
90136
  "module": "src/mixins/mixin-collection/mixin-collection.ts"
89290
90137
  }
89291
90138
  },
90139
+ {
90140
+ "kind": "field",
90141
+ "name": "statusSlots",
90142
+ "type": {
90143
+ "text": "boolean"
90144
+ },
90145
+ "privacy": "protected",
90146
+ "default": "false",
90147
+ "description": "Whether the status line is an `empty` or `loading` slot, with\n`empty-text` or `loading-text` as its fallback.\n\n**Off unless a family turns it on**, because a slot is published API:\neach family that renders one documents it in its own manifest. The live\nregion keeps saying the text either way, because a slotted picture has no\nwords to say.",
90148
+ "inheritedFrom": {
90149
+ "name": "MixinCollection",
90150
+ "module": "src/mixins/mixin-collection/mixin-collection.ts"
90151
+ }
90152
+ },
89292
90153
  {
89293
90154
  "kind": "field",
89294
90155
  "name": "defaultValue",
@@ -103560,6 +104421,20 @@
103560
104421
  "module": "src/mixins/mixin-collection/mixin-collection.ts"
103561
104422
  }
103562
104423
  },
104424
+ {
104425
+ "kind": "field",
104426
+ "name": "statusSlots",
104427
+ "type": {
104428
+ "text": "boolean"
104429
+ },
104430
+ "privacy": "protected",
104431
+ "default": "false",
104432
+ "description": "Whether the status line is an `empty` or `loading` slot, with\n`empty-text` or `loading-text` as its fallback.\n\n**Off unless a family turns it on**, because a slot is published API:\neach family that renders one documents it in its own manifest. The live\nregion keeps saying the text either way, because a slotted picture has no\nwords to say.",
104433
+ "inheritedFrom": {
104434
+ "name": "MixinCollection",
104435
+ "module": "src/mixins/mixin-collection/mixin-collection.ts"
104436
+ }
104437
+ },
103563
104438
  {
103564
104439
  "kind": "field",
103565
104440
  "name": "defaultOpen",
@@ -105690,7 +106565,7 @@
105690
106565
  "declarations": [
105691
106566
  {
105692
106567
  "kind": "class",
105693
- "description": "Renders a real `<nav>`, the landmark that screen reader users jump to.\nNavigation is its own component, separate from `AppHeader`, so you can use it\nin a header, a footer, or a sidebar.\n\n**It renders no links.** Bring your own, mark the current one with\n`aria-current=\"page\"`, and style them with the `data-navigation-item` recipe.\nA router renders its own anchors and cannot render them inside the\ncomponent's shadow root.\n\nThe component moves a marker to the current item. It finds the current item\nby reading `aria-current`, so the attribute that screen readers announce also\nplaces the marker. Any value but `false` counts, so a sidebar of sections on\none page can mark the section in view with `aria-current=\"location\"`. Where\nseveral are marked, `page` wins.\n\nSet `orientation=\"vertical\"` to stack the destinations in a column, for a\nsidebar.\n\nSet `arrows` and the arrow keys move focus between the destinations, as\nRadix's navigation menu does: left and right along a row, up and down a\ncolumn, Home and End to the ends. A `Megamenu` among them is reached at its\ntrigger. Tab still stops at every link, since a navigation is a list of\nlinks and not a single control, and the keys across the other axis are\nleft to the page and to an open panel.",
106568
+ "description": "Renders a real `<nav>`, the landmark that screen reader users jump to.\nNavigation is its own component, separate from `AppHeader`, so you can use it\nin a header, a footer, or a sidebar.\n\n**It renders no links.** Bring your own, mark the current one with\n`aria-current=\"page\"`, and style them with the `data-navigation-item` recipe.\nA router renders its own anchors and cannot render them inside the\ncomponent's shadow root.\n\nThe component moves a marker to the current item. It finds the current item\nby reading `aria-current`, so the attribute that screen readers announce also\nplaces the marker. Any value but `false` counts, so a sidebar of sections on\none page can mark the section in view with `aria-current=\"location\"`. Where\nseveral are marked, `page` wins.\n\n**The destinations can be a list.** Slot a `<ul>` or an `<ol>` of `<li>`\nelements, each holding a link, and a screen reader says how many there are\nand where each one is, as in Radix's `NavigationMenu.List`. The marker and\nthe arrow keys work on the list items as they do on bare links. Give the\nlist `role=\"list\"` as well, since Safari drops the semantics of a list drawn\nwithout bullets.\n\nSet `orientation=\"vertical\"` to stack the destinations in a column, for a\nsidebar.\n\nSet `arrows` and the arrow keys move focus between the destinations, as\nRadix's navigation menu does: left and right along a row, up and down a\ncolumn, Home and End to the ends. A `Megamenu` among them is reached at its\ntrigger. Tab still stops at every link, since a navigation is a list of\nlinks and not a single control, and the keys across the other axis are\nleft to the page and to an open panel.",
105694
106569
  "name": "HelixHeadlessNavigation",
105695
106570
  "cssParts": [
105696
106571
  {
@@ -105728,7 +106603,7 @@
105728
106603
  "name": "indicator",
105729
106604
  "privacy": "private",
105730
106605
  "readonly": true,
105731
- "default": "new IndicatorController(this, { active: () => { const items = this.items const marked = (item: HTMLElement): boolean => { const current = item.getAttribute('aria-current') return current !== null && current !== 'false' } return ( items.find((item) => item.getAttribute('aria-current') === 'page') ?? items.find(marked) ) }, indicator: () => this.partNamed('indicator'), observe: () => this.items, surface: () => this.partNamed('nav'), })"
106606
+ "default": "new IndicatorController(this, { active: () => { const items = this.items const marked = (item: HTMLElement): boolean => { const current = markOf(item)?.getAttribute('aria-current') return current !== null && current !== undefined && current !== 'false' } return ( items.find((item) => markOf(item)?.getAttribute('aria-current') === 'page') ?? items.find(marked) ) }, indicator: () => this.partNamed('indicator'), observe: () => this.items, surface: () => this.partNamed('nav'), })"
105732
106607
  },
105733
106608
  {
105734
106609
  "kind": "field",
@@ -105793,7 +106668,7 @@
105793
106668
  "text": "HTMLElement[]"
105794
106669
  },
105795
106670
  "privacy": "private",
105796
- "description": "The destinations the consumer slotted.",
106671
+ "description": "The destinations the consumer slotted, and the items of a slotted list in\nplace of the list.",
105797
106672
  "readonly": true
105798
106673
  },
105799
106674
  {
@@ -108031,7 +108906,7 @@
108031
108906
  "declarations": [
108032
108907
  {
108033
108908
  "kind": "class",
108034
- "description": "Notifications are slotted children. Each one is your own markup, with an\navatar, a link, or a button in it. Feeds usually hold tens of items, so\nwriting them out lets an item hold anything.\n\nThe list does not virtualize. Windowing needs the list to own the data, and\nhere you own it, so N notifications are N elements. For a feed of thousands,\nuse a data table with a custom cell.\n\nRead state is reported to you. Marking read goes from the root to the item\nand from the item to you, so a canceled `helix-read` changes nothing, and if\nyou own `read`, nothing changes until you set it. `unread` is derived from\nthe items and written to an attribute, so a stylesheet and a badge can both\nuse it without counting.\n\n**The feed is one `Tab` stop for its rows.** Each row takes focus itself and\nis read by its label. `ArrowDown` and `ArrowUp` move to the next and the\nprevious row, `Home` and `End` to the first and the last, and `PageDown` and\n`PageUp` move a row on or back from anywhere inside one, as in the APG feed\npattern. The controls inside a row stay in the `Tab` order. Set `total` when\nthe feed holds one page of a longer list, and each row says its place in the\nwhole of it.\n\n**`load-more` adds a button after the list** that sends `helix-load-more`,\nfor a feed that holds one page of a longer list. Append the next page, set\n`loading` while it is on its way, and take `load-more` off once there is\nnothing more. While the feed is loading the button stays, so focus stays on\nit, and it is `aria-disabled` and sends nothing.\n\n**`load-error` says a page could not be fetched**, such as \"Could not load\nnotifications\": it shows under the rows there are, in the `error` part, in\nplace of the empty and loading lines, and a screen reader hears it. Clear it\nwhen you ask again.",
108909
+ "description": "Notifications are slotted children. Each one is your own markup, with an\navatar, a link, or a button in it. Feeds usually hold tens of items, so\nwriting them out lets an item hold anything.\n\nThe list does not virtualize. Windowing needs the list to own the data, and\nhere you own it, so N notifications are N elements. For a feed of thousands,\nuse a data table with a custom cell.\n\nRead state is reported to you. Marking read goes from the root to the item\nand from the item to you, so a canceled `helix-read` changes nothing, and if\nyou own `read`, nothing changes until you set it. `unread` is derived from\nthe items and written to an attribute, so a stylesheet and a badge can both\nuse it without counting.\n\n**The feed is one `Tab` stop for its rows.** Each row takes focus itself and\nis read by its label. `ArrowDown` and `ArrowUp` move to the next and the\nprevious row, `Home` and `End` to the first and the last, and `PageDown` and\n`PageUp` move a row on or back from anywhere inside one, as in the APG feed\npattern. The controls inside a row stay in the `Tab` order. Set `total` when\nthe feed holds one page of a longer list, and each row says its place in the\nwhole of it.\n\n**Keyboard.**\n\n| Key | What it does |\n|---|---|\n| Down, Up | On a row, moves to the next or the previous row. |\n| Home, End | On a row, moves to the first or the last row. |\n| Page Down, Page Up | From anywhere in a row, moves to the next or the previous row. |\n| Control+End | From anywhere in the feed, moves to the first control after it on the page. |\n| Control+Home | From anywhere in the feed, moves to the nearest control before it on the page. |\n| Tab | Moves through the controls in a row, and on out of the feed. |\n\n**`load-more` adds a button after the list** that sends `helix-load-more`,\nfor a feed that holds one page of a longer list. Append the next page, set\n`loading` while it is on its way, and take `load-more` off once there is\nnothing more. While the feed is loading the button stays, so focus stays on\nit, and it is `aria-disabled` and sends nothing.\n\n**`load-error` says a page could not be fetched**, such as \"Could not load\nnotifications\": it shows under the rows there are, in the `error` part, in\nplace of the empty and loading lines, and a screen reader hears it. Clear it\nwhen you ask again.",
108035
108910
  "name": "HelixHeadlessNotifications",
108036
108911
  "cssParts": [
108037
108912
  {
@@ -108362,6 +109237,25 @@
108362
109237
  "readonly": true,
108363
109238
  "description": "Moves between rows.\n\nThe arrows and `Home` and `End` only from a row's own box, so a control in\na row keeps its keys. `PageDown` and `PageUp` from anywhere in a row, which\nis how the APG feed pattern moves on from inside an article."
108364
109239
  },
109240
+ {
109241
+ "kind": "method",
109242
+ "name": "leave",
109243
+ "privacy": "private",
109244
+ "return": {
109245
+ "type": {
109246
+ "text": "void"
109247
+ }
109248
+ },
109249
+ "parameters": [
109250
+ {
109251
+ "name": "event",
109252
+ "type": {
109253
+ "text": "KeyboardEvent"
109254
+ }
109255
+ }
109256
+ ],
109257
+ "description": "`Control+End` and `Control+Home`, which leave the feed for the first\ncontrol after it or the nearest one before it, as the APG feed pattern\ndoes. A feed of many rows is otherwise a long walk to get past."
109258
+ },
108365
109259
  {
108366
109260
  "kind": "method",
108367
109261
  "name": "rove",
@@ -108606,6 +109500,20 @@
108606
109500
  "module": "src/mixins/mixin-collection/mixin-collection.ts"
108607
109501
  }
108608
109502
  },
109503
+ {
109504
+ "kind": "field",
109505
+ "name": "statusSlots",
109506
+ "type": {
109507
+ "text": "boolean"
109508
+ },
109509
+ "privacy": "protected",
109510
+ "default": "false",
109511
+ "description": "Whether the status line is an `empty` or `loading` slot, with\n`empty-text` or `loading-text` as its fallback.\n\n**Off unless a family turns it on**, because a slot is published API:\neach family that renders one documents it in its own manifest. The live\nregion keeps saying the text either way, because a slotted picture has no\nwords to say.",
109512
+ "inheritedFrom": {
109513
+ "name": "MixinCollection",
109514
+ "module": "src/mixins/mixin-collection/mixin-collection.ts"
109515
+ }
109516
+ },
108609
109517
  {
108610
109518
  "kind": "field",
108611
109519
  "name": "tier",
@@ -121509,7 +122417,7 @@
121509
122417
  "declarations": [
121510
122418
  {
121511
122419
  "kind": "class",
121512
- "description": "Popover is the general overlay that the specific ones build on. `Menu` holds\ncommands, `Select` holds options, and `Tooltip` holds a description. Popover\nholds any content you put in it, so it has no keyboard handling of its own.\n\nThe trigger is slotted and stays your own element. A Helix trigger is told\nwhether the popover is open inside its own shadow root. On a plain element,\nsuch as a `<button>`, the popover writes `aria-expanded` only once a reader\nhas pressed it, which is after any hydration, and never where you wrote\n`aria-expanded` yourself. It writes nothing else onto your markup.\n\nThe panel is in the top layer through the popover API, so it needs no\n`z-index`, and an ancestor with `overflow: hidden`, `transform`, `filter`, or\n`contain` does not clip or move it.\n\nIt opens on click and from a command. `command=\"--show\"` and the related\ncommands work as they do on `Dialog` and `Drawer`, so a button anywhere on\nthe page can open the popover with no script.\n\n**Opening moves focus into the panel**, to the first control in it, or to the\npanel itself where it holds none, and closing from inside gives it back to\nthe trigger. It closes on Escape, on a press outside it, and when focus moves\nout of the trigger and the panel to somewhere else on the page.\n\n`modal` keeps `Tab` inside the panel while it is open and says so with\n`aria-modal`, for a panel that has to be answered before the page goes on.\nThe rest of the page is hidden from screen readers with `aria-hidden` while\nit is open, so the virtual cursor stays in the panel too. Without it the\npopover does not trap focus.\n\nThe panel's name is `label` when you set it. Otherwise it is the first\nheading in the panel, or the elements an `aria-labelledby` on the host names.\n\n`arrow` draws a point on the panel's edge facing the trigger. The side the\npanel landed on is on the host as `:state(placed-top)` and its kin, and the\ntrigger's width is on the panel as `--floating-anchor-inline-size`, for a\npanel as wide as its trigger:\n\n```css\nhelix-popover::part(popover) {\n min-inline-size: var(--floating-anchor-inline-size);\n}\n```",
122420
+ "description": "Popover is the general overlay that the specific ones build on. `Menu` holds\ncommands, `Select` holds options, and `Tooltip` holds a description. Popover\nholds any content you put in it, so it has no keyboard handling of its own.\n\nThe trigger is slotted and stays your own element. A Helix trigger is told\nwhether the popover is open inside its own shadow root. On a plain element,\nsuch as a `<button>`, the popover writes `aria-expanded`, from a frame after\nits own first render, or from the first press where that comes sooner. It\nnever writes it where you wrote `aria-expanded` yourself, and writes nothing\nelse onto your markup.\n\nThe panel is in the top layer through the popover API, so it needs no\n`z-index`, and an ancestor with `overflow: hidden`, `transform`, `filter`, or\n`contain` does not clip or move it.\n\nIt opens on click and from a command. `command=\"--show\"` and the related\ncommands work as they do on `Dialog` and `Drawer`, so a button anywhere on\nthe page can open the popover with no script.\n\n**Opening moves focus into the panel**, to the first control in it, or to the\npanel itself where it holds none, and closing from inside gives it back to\nthe trigger. It closes on Escape, on a press outside it, and when focus moves\nout of the trigger and the panel to somewhere else on the page.\n\n`modal` keeps `Tab` inside the panel while it is open and says so with\n`aria-modal`, for a panel that has to be answered before the page goes on.\nThe rest of the page is hidden from screen readers with `aria-hidden` while\nit is open, so the virtual cursor stays in the panel too. Without it the\npopover does not trap focus.\n\nThe panel's name is `label` when you set it. Otherwise it is the first\nheading in the panel, or the elements an `aria-labelledby` on the host names.\nA development build warns when a popover opens with nothing but\n`fallback-label` to name it.\n\n**Keyboard.** Opening moves focus to the first control in the panel, or to\nthe panel where it holds none.\n\n| Key | What it does |\n|---|---|\n| Enter, Space | On the trigger, opens the panel, or closes it while it is open. |\n| Escape | Closes the panel and puts focus back on the trigger. |\n| Tab, Shift+Tab | Moves through the controls in the panel. Leaving the panel and the trigger closes it. With `modal`, moves from the last control round to the first and from the first round to the last. |\n\n`arrow` draws a point on the panel's edge facing the trigger. The side the\npanel landed on is on the host as `:state(placed-top)` and its kin, and the\ntrigger's width is on the panel as `--floating-anchor-inline-size`, for a\npanel as wide as its trigger:\n\n```css\nhelix-popover::part(popover) {\n min-inline-size: var(--floating-anchor-inline-size);\n}\n```",
121513
122421
  "name": "HelixHeadlessPopover",
121514
122422
  "cssProperties": [
121515
122423
  {
@@ -121822,7 +122730,7 @@
121822
122730
  },
121823
122731
  "privacy": "private",
121824
122732
  "default": "false",
121825
- "description": "Whether a reader has pressed the trigger, which is after any hydration."
122733
+ "description": "Whether the trigger may be told, from a frame after the first render or a reader's press."
121826
122734
  },
121827
122735
  {
121828
122736
  "kind": "field",
@@ -121842,7 +122750,7 @@
121842
122750
  "text": "void"
121843
122751
  }
121844
122752
  },
121845
- "description": "Tells a slotted trigger the disclosure state.\n\nA Helix trigger by property, through `tellDisclosure`. A plain element,\nwhich has no shadow root to keep the state out of the markup, by\n`aria-expanded`, and only from a reader's first press on: by then a server\nor a framework has long finished writing the element, so the write cannot\nbe a hydration mismatch. One that already carries `aria-expanded` is the\nconsumer's to keep, and is left alone."
122753
+ "description": "Tells a slotted trigger the disclosure state.\n\nA Helix trigger by property, through `tellDisclosure`. A plain element,\nwhich has no shadow root to keep the state out of the markup, by\n`aria-expanded`, from a frame after the first render or a reader's first\npress on, so a closed panel is said to be closed before anyone presses. One that already carries `aria-expanded` is the\nconsumer's to keep, and is left alone."
121846
122754
  },
121847
122755
  {
121848
122756
  "kind": "field",
@@ -129443,7 +130351,7 @@
129443
130351
  "declarations": [
129444
130352
  {
129445
130353
  "kind": "class",
129446
- "description": "A scatter chart shows how two measures relate. The table's first numeric\ncolumn is measured across, every other numeric column is measured up, and\neach row is one point. A table of countries with an income column and a life\nexpectancy column draws one point for each country. Each additional numeric\ncolumn is another series, in its own color.\n\nBoth axes are labeled, because both positions are values. The ticks sit at\nround numbers, and the range extends to them.\n\n`trend` draws each series' line of best fit, by least squares, across the\nplot in the series' color.\n\n**`size-by` names a third measure, drawn as each point's size**, as a bubble\nchart does: `size-by=\"Population\"` takes that column out of the series and\ngives each point an area in proportion to its row's number there. The\ntooltip and the table still say the number.\n\nThe summary gives each series' correlation coefficient and its number of\npoints. The table has every number, and the drawing is hidden from screen\nreaders.\n\n**The plot is read by key.** It takes focus, named by `label` or the caption.\nThe left and right arrows move from row to row in the table's order, Home\nand End go to the first and the last, and the up and down arrows move among\nthe series of a row. The tooltip sits on that point, the `live` part says the\nrow in words, and Escape puts the tooltip away.\n\nEach point is a `<span>` placed by percentage over the drawing, as\n`LineChart` places its end points, so points stay round when the drawing\nstretches.\n\nThe plot runs left to right in every text direction, as a number line does.\nThe plot, its axes, and the axis names sit in a `plane` part with\n`dir=\"ltr\"`. The axis names carry `dir=\"auto\"`, so a name in Arabic or Hebrew\nreads in its own direction. The summary and the tooltip bubble follow the\npage's direction.",
130354
+ "description": "A scatter chart shows how two measures relate. The table's first numeric\ncolumn is measured across, every other numeric column is measured up, and\neach row is one point. A table of countries with an income column and a life\nexpectancy column draws one point for each country. Each additional numeric\ncolumn is another series, in its own color.\n\nBoth axes are labeled, because both positions are values. The ticks sit at\nround numbers, and the range extends to them.\n\n`trend` draws each series' line of best fit, by least squares, across the\nplot in the series' color.\n\n**`size-by` names a third measure, drawn as each point's size**, as a bubble\nchart does: `size-by=\"Population\"` takes that column out of the series and\ngives each point an area in proportion to its row's number there. The\ntooltip and the table still say the number.\n\nThe summary gives each series' correlation coefficient and its number of\npoints. The table has every number, and the drawing is hidden from screen\nreaders.\n\n**The plot is read by key.** It takes focus, named by `label` or the caption.\nThe left and right arrows move from row to row in the table's order, Home\nand End go to the first and the last, and the up and down arrows move among\nthe series of a row. The tooltip sits on that point, the `live` part says the\nrow in words, and Escape puts the tooltip away.\n\nEach point is a `<span>` placed by percentage over the drawing, as\n`LineChart` places its end points, so points stay round when the drawing\nstretches.\n\nThe plot runs left to right in every text direction, as a number line does.\nThe plot, its axes, and the axis names sit in a `plane` part with\n`dir=\"ltr\"`. The axis names carry `dir=\"auto\"`, so a name in Arabic or Hebrew\nreads in its own direction. The summary and the tooltip bubble follow the\npage's direction.\n\n**A tap shows the reading under it**, and keeps it until a tap lands\nelsewhere. `helix-reading-change` says each move of the reading, by pointer,\ntap or key, and `helix-reading-press` says a reading was clicked, tapped, or\npressed with Enter or Space, for a page that opens what a reading stands for.",
129447
130355
  "name": "HelixHeadlessScatterChart",
129448
130356
  "cssProperties": [
129449
130357
  {
@@ -129861,6 +130769,38 @@
129861
130769
  "readonly": true,
129862
130770
  "description": "The point a pointer is nearest, within reach.\n\nMeasured in the plot's pixels rather than in percent, because the plot is\nrarely square and a percent across is a different distance from a percent\nup. A mouse or a pen only, as every chart here: a finger has no hover to\nrest on a point with."
129863
130771
  },
130772
+ {
130773
+ "kind": "field",
130774
+ "name": "handleTap",
130775
+ "privacy": "private",
130776
+ "readonly": true,
130777
+ "description": "The point a tap lands nearest, within twice a pointer's reach, a finger\nbeing broader than a cursor. It stays shown until a tap lands elsewhere."
130778
+ },
130779
+ {
130780
+ "kind": "method",
130781
+ "name": "pointNear",
130782
+ "privacy": "private",
130783
+ "return": {
130784
+ "type": {
130785
+ "text": "ScatterPoint | undefined | null"
130786
+ }
130787
+ },
130788
+ "parameters": [
130789
+ {
130790
+ "name": "event",
130791
+ "type": {
130792
+ "text": "PointerEvent"
130793
+ }
130794
+ },
130795
+ {
130796
+ "name": "reach",
130797
+ "type": {
130798
+ "text": "number"
130799
+ }
130800
+ }
130801
+ ],
130802
+ "description": "The drawn point nearest a pointer, within `reach` pixels, `undefined` for\nnone in reach, and `null` with no plot to measure."
130803
+ },
129864
130804
  {
129865
130805
  "kind": "field",
129866
130806
  "name": "handleLeave",
@@ -130480,6 +131420,24 @@
130480
131420
  }
130481
131421
  }
130482
131422
  ],
131423
+ "events": [
131424
+ {
131425
+ "type": {
131426
+ "text": "HelixReadingChangeEvent"
131427
+ },
131428
+ "description": "The reading shown moved, or was put away: `index` is the row, or `-1` for none, with its `label`, the `series` the keys rest on, and the `pointerType` that moved it.",
131429
+ "name": "helix-reading-change",
131430
+ "reactProp": "onhelix-reading-change"
131431
+ },
131432
+ {
131433
+ "type": {
131434
+ "text": "HelixReadingPressEvent"
131435
+ },
131436
+ "description": "A reading was clicked, tapped, or pressed with Enter or Space, with the same detail as `helix-reading-change`.",
131437
+ "name": "helix-reading-press",
131438
+ "reactProp": "onhelix-reading-press"
131439
+ }
131440
+ ],
130483
131441
  "attributes": [
130484
131442
  {
130485
131443
  "name": "correlation-label",
@@ -140967,7 +141925,7 @@
140967
141925
  "declarations": [
140968
141926
  {
140969
141927
  "kind": "class",
140970
- "description": "A splitter has one axis. Nest splitters to get two axes and three-pane or\nfour-pane layouts.\n\nWhen a splitter is slotted into a pane of another at a right angle, a corner\nhandle appears where the dividers cross. It shows the `move` cursor, responds\nto both arrow axes, and a drag moves both dividers at once. The corner is\nadded at `firstUpdated` and is not in the server markup. Before it appears,\nboth dividers work on their own.\n\nThe divider has `role=\"separator\"` and `aria-valuenow`, with\n`aria-valuetext` saying the start pane's share as a percentage in the\nnearest `lang`, or in the reader's locale where no `lang` is set, and `aria-controls` names the start pane. Drag it with a pointer or move it with the arrow keys,\npress `Home` or `End` to move it to its bounds, and press `Enter` to collapse\nthe start pane and open it again. A drag in progress is tracked as a state, so both dividers a\ncorner moves stay lit for as long as they move.\n\nBy default, `min` and `max` let the divider reach either edge, so you can\ndrag a pane fully closed. Set them to limit the range.\n\nA pane can be collapsed, which is a separate state from a divider at the\nedge. `collapsed` names the shut pane, `start` or `end`, and the pane opens\nback to the position where the collapsing gesture began. A drag records that position\non press, and every other way of collapsing records it in `settle`.\n`collapsed-size` keeps a sliver of the pane visible, such as a tab strip.\nCollapsing overrides `min` and `max`.",
141928
+ "description": "A splitter has one axis. Nest splitters to get two axes and three-pane or\nfour-pane layouts.\n\nWhen a splitter is slotted into a pane of another at a right angle, a corner\nhandle appears where the dividers cross. It shows the `move` cursor, responds\nto both arrow axes, and a drag moves both dividers at once. The corner is\nadded at `firstUpdated` and is not in the server markup. Before it appears,\nboth dividers work on their own.\n\nThe divider has `role=\"separator\"` and `aria-valuenow`, with\n`aria-valuetext` saying the start pane's share as a percentage in the\nnearest `lang`, or in the reader's locale where no `lang` is set, and `aria-controls` names the start pane. Drag it with a pointer or move it with the arrow keys,\npress `Home` or `End` to move it to its bounds, and press `Enter` to collapse\nthe start pane and open it again. A drag in progress is tracked as a state, so both dividers a\ncorner moves stay lit for as long as they move.\n\nBy default, `min` and `max` let the divider reach either edge, so you can\ndrag a pane fully closed. Set them to limit the range.\n\nA pane can be collapsed, which is a separate state from a divider at the\nedge. `collapsed` names the shut pane, `start` or `end`, and the pane opens\nback to the position where the collapsing gesture began. A drag records that position\non press, and every other way of collapsing records it in `settle`.\n`collapsed-size` keeps a sliver of the pane visible, such as a tab strip.\nCollapsing overrides `min` and `max`.\n\nSet `primary` to the pane that keeps its size when the splitter's own size\nchanges, such as a sidebar beside a window being resized. The other pane\ntakes all of the change, as Web Awesome's split panel does. Without it,\nboth panes keep their share.\n\n**Keyboard.** The divider is one tab stop.\n\n| Key | What it does |\n|---|---|\n| Left, Right | Moves a side-by-side divider by `step`. On a right-to-left page, Left moves it toward the end. |\n| Up, Down | Moves a stacked divider by `step`. |\n| Home, End | Moves the divider to its bounds. |\n| Enter | Collapses the start pane, and opens it again. |\n| F6 | Moves focus from one pane to the first control in the other, and from the divider to the start pane. |",
140971
141929
  "name": "HelixHeadlessSplitter",
140972
141930
  "cssProperties": [
140973
141931
  {
@@ -141191,6 +142149,71 @@
141191
142149
  "description": "Where the divider sits, as a percentage of the whole.\n\nReading gives where it is; writing declares it the consumer's, and\n`default-position` seeds one this element owns. The same accessor pair\n`Pagination.page` and the calendar's `month` carry.",
141192
142150
  "attribute": "position"
141193
142151
  },
142152
+ {
142153
+ "kind": "field",
142154
+ "name": "primary",
142155
+ "type": {
142156
+ "text": "'end' | 'start' | undefined"
142157
+ },
142158
+ "description": "The pane that keeps its size when the splitter's own size changes. The\nother pane takes all of the change. Unset, both keep their share.",
142159
+ "attribute": "primary"
142160
+ },
142161
+ {
142162
+ "kind": "field",
142163
+ "name": "lengths",
142164
+ "type": {
142165
+ "text": "ResizeObserver | undefined"
142166
+ },
142167
+ "privacy": "private",
142168
+ "description": "Watches this element's length along its axis while `primary` is set."
142169
+ },
142170
+ {
142171
+ "kind": "field",
142172
+ "name": "length",
142173
+ "type": {
142174
+ "text": "number"
142175
+ },
142176
+ "privacy": "private",
142177
+ "default": "0",
142178
+ "description": "The length along the axis last seen, in pixels."
142179
+ },
142180
+ {
142181
+ "kind": "method",
142182
+ "name": "watchLength",
142183
+ "privacy": "private",
142184
+ "return": {
142185
+ "type": {
142186
+ "text": "void"
142187
+ }
142188
+ },
142189
+ "description": "Starts or stops watching the length, according to `primary`, and holds\nthe primary pane's size in pixels as the length changes."
142190
+ },
142191
+ {
142192
+ "kind": "method",
142193
+ "name": "holdPrimary",
142194
+ "privacy": "private",
142195
+ "return": {
142196
+ "type": {
142197
+ "text": "void"
142198
+ }
142199
+ },
142200
+ "parameters": [
142201
+ {
142202
+ "name": "length",
142203
+ "type": {
142204
+ "text": "number"
142205
+ }
142206
+ }
142207
+ ],
142208
+ "description": "Moves the divider so the primary pane keeps the pixels it had, as the\nsplitter's length goes from the one last seen to `length`. Not while a\npane is shut or a drag holds the divider."
142209
+ },
142210
+ {
142211
+ "kind": "field",
142212
+ "name": "handlePaneKeys",
142213
+ "privacy": "private",
142214
+ "readonly": true,
142215
+ "description": "F6, which moves focus between the panes, as the window splitter pattern\nallows: from the start pane to the end pane, and from the end pane or the\ndivider to the start pane. Only a pane that holds a control takes focus."
142216
+ },
141194
142217
  {
141195
142218
  "kind": "field",
141196
142219
  "name": "snap",
@@ -142139,6 +143162,14 @@
142139
143162
  "description": "Where the divider sits, as a percentage of the whole.\n\nReading gives where it is; writing declares it the consumer's, and\n`default-position` seeds one this element owns. The same accessor pair\n`Pagination.page` and the calendar's `month` carry.",
142140
143163
  "fieldName": "position"
142141
143164
  },
143165
+ {
143166
+ "name": "primary",
143167
+ "type": {
143168
+ "text": "'end' | 'start' | undefined"
143169
+ },
143170
+ "description": "The pane that keeps its size when the splitter's own size changes. The\nother pane takes all of the change. Unset, both keep their share.",
143171
+ "fieldName": "primary"
143172
+ },
142142
143173
  {
142143
143174
  "name": "snap",
142144
143175
  "type": {
@@ -147912,7 +148943,7 @@
147912
148943
  "declarations": [
147913
148944
  {
147914
148945
  "kind": "class",
147915
- "description": "The keyboard of a `grid` table: one tab stop among its cells, the arrow\nkeys, Home, End and the Page keys between them, and Enter or F2 into a\ncell's controls.\n\n**Tab leaves the grid.** The controls in a cell are the consumer's, so their\ntab order is left as written: Tab on a cell, or past the last control of a\ncell, focuses an empty box at the grid's end (Shift: its start) and lets the\nkey go on from there, as React Aria's collections do. A control in a cell\nthat focus reaches from outside by the keyboard hands it to the stop, so the\ngrid is one stop from either side. A press, or a script focusing a cell, is\nleft where it lands, and the stop follows it.",
148946
+ "description": "The keyboard of a `grid` table: one tab stop among its cells, the arrow\nkeys, Home, End and the Page keys between them, Enter or F2 into a cell's\ncontrols, typeahead over the rows, and Shift ranges of rows.\n\n**Tab leaves the grid.** The controls in a cell are the consumer's, so their\ntab order is left as written: Tab on a cell, or past the last control of a\ncell, focuses an empty box at the grid's end (Shift: its start) and lets the\nkey go on from there, as React Aria's collections do. A control in a cell\nthat focus reaches from outside by the keyboard hands it to the stop, so the\ngrid is one stop from either side. A press, or a script focusing a cell, is\nleft where it lands, and the stop follows it.",
147916
148947
  "name": "TableGridController",
147917
148948
  "members": [
147918
148949
  {
@@ -148003,6 +149034,14 @@
148003
149034
  "default": "new Set<HTMLElement>()",
148004
149035
  "description": "The cells given a `tabindex`, so a table that stops being a grid takes it back."
148005
149036
  },
149037
+ {
149038
+ "kind": "field",
149039
+ "name": "typeahead",
149040
+ "privacy": "private",
149041
+ "readonly": true,
149042
+ "default": "new Typeahead()",
149043
+ "description": "The letters a reader has typed at the rows."
149044
+ },
148006
149045
  {
148007
149046
  "kind": "method",
148008
149047
  "name": "hostConnected",
@@ -148366,7 +149405,7 @@
148366
149405
  "declarations": [
148367
149406
  {
148368
149407
  "kind": "class",
148369
- "description": "Lays out the rows on a CSS grid, so every column lines up across rows and\neach row stays a real element that can be styled, hidden, or made\ninteractive. A `<table>` layout aligns columns but limits almost everything\nelse.\n\nA grid of elements has no table structure for assistive technology, so the\nroles are set explicitly: `table`, `row`, `cell`, `columnheader`, and\n`rowheader` for a `header` cell in a row of values. Rows are\n`display: contents`, so their cells become items of the one grid.\n\n**Sorting.** A column with `sortable` and a `field` draws its heading as a\nbutton that sorts the rows by the text of its cells, numbers by their value.\nYour markup is not reordered: the table draws the rows in the sorted order.\n\n1. Each press cycles the column through ascending, descending, and the\n order the rows were written in, which keeps a server's own ranking\n reachable.\n2. `helix-sort` asks first, with `field:direction`, or empty for the written\n order. Refuse it to keep the order, or to sort the rows yourself and set\n `sort`.\n3. `helix-sorted` follows once the order stands, and `sort` holds it.\n4. The heading carries `aria-sort`, and a screen reader hears `sorted-label`\n (\"Sorted by Name, ascending\") or `unsorted-label` from a polite region.\n\nTab reaches each sort button, and Enter or Space presses it.\n\nThe `heading` slot names the table: slot a heading or a line of text into\nit, and the table is named by its words. An `aria-label` or `aria-labelledby` on the\nhost wins over it.\n\n**Selecting.** `selectable` adds a column of checkboxes.\n\n1. Each row is known by its `value`, or by its place among the rows where it\n has none, and `selected` holds the chosen keys, comma separated, the same\n shape `DataTable` uses. `default-selected` is where it starts.\n2. A row's checkbox is named by `select-row-label` (\"Select {row}\") with the\n words of the row's first cell. The checkbox in the heading selects every\n row, and shows a dash while only some are chosen.\n3. `helix-select` asks first, with every key the change would leave.\n Refuse it to keep the selection. `helix-selected` follows once it stands.\n4. A chosen row takes `:state(selected)`, and a screen reader hears\n `selected-label` (\"2 selected\") from a polite region.\n\nTab reaches each checkbox, and Space ticks it. To act on one row, put a\nlink or a button in a cell, or give the row an `href`.\n\n**Moving rows.** `reorderable` adds a column of grips before the checkboxes,\nunder a heading named by `row-grips-label`.\n\n1. Each row is known by its `value`, or by its place among the rows where it\n has none, as for selecting. Give rows a `value` when they move, so a key\n stays with its row.\n2. A grip is a button named by `move-row-label` (\"Move {row}\") with the\n words of the row's first cell. Drag it to move its row, and the page\n scrolls near an edge. Or press it with Space, Enter, or a click to pick\n the row up, move it with Up, Down, Home, and End, and press it again to\n drop it. A click on another row drops it there, and Escape puts it back.\n3. `helix-before-reorder` asks first, and `helix-reorder` follows with\n `keys`, every row's key in the new order. **You move the rows**: the\n table moves no element of yours, and focus goes back to the moved row's\n grip once you have.\n4. Each step is said in the table's live region, in words you can change:\n `picked-up-label`, `moved-label`, `dropped-label`, and `canceled-label`.\n The grips do nothing while a sort is set.\n\n**A grid.** `grid` makes the table one tab stop that the arrow keys move\nthrough cell by cell, the headings included, as React Aria's table is. The\ntable is then a `grid` and each value a `gridcell`, and the table gives\nevery cell a `tabindex` so focus can rest on it: set `grid` only where the\ncells may carry one. For typeahead and range selection, use `DataTable`.\n\n| Key | What it does |\n|---|---|\n| Right, Left | Moves one cell along the row. Left moves on, on a right-to-left page. |\n| Down, Up | Moves one row, the headings included. |\n| Home, End | Moves to the first or the last cell of the row. |\n| Control with Home or End | Moves to the first or the last cell of the table. |\n| Page Down, Page Up | Moves by the rows that fit in view. |\n| Enter, F2 | Moves into the cell's links and controls. Escape or F2 moves back to the cell, and Tab moves between the controls of one cell. |\n| Enter on a cell of a row with `href` | Follows the row's link. |\n| Enter, Space on a sortable heading | Sorts by the column. |\n| Space on a row, Enter or Space on its checkbox cell | Selects the row, in a `selectable` table. |\n| Enter or Space on a grip cell | Picks the row up, or drops it, in a `reorderable` table. Up, Down, Home, and End move a row picked up, and Escape puts it back. |\n| Control or Command with A | Selects every row, in a `selectable` table. |\n| Tab | Leaves the table. |\n\nThe CSS custom properties listed for this component are written by it and\nread by the stylesheet that draws it. Do not set them. Each holds a number\nthe component computes and CSS cannot, so the stylesheet can draw the table\nwithout measuring anything.",
149408
+ "description": "Lays out the rows on a CSS grid, so every column lines up across rows and\neach row stays a real element that can be styled, hidden, or made\ninteractive. A `<table>` layout aligns columns but limits almost everything\nelse.\n\nA grid of elements has no table structure for assistive technology, so the\nroles are set explicitly: `table`, `row`, `cell`, `columnheader`, and\n`rowheader` for a `header` cell in a row of values. Rows are\n`display: contents`, so their cells become items of the one grid.\n\n**Sorting.** A column with `sortable` and a `field` draws its heading as a\nbutton that sorts the rows by the text of its cells, numbers by their value.\nYour markup is not reordered: the table draws the rows in the sorted order.\n\n1. Each press cycles the column through ascending, descending, and the\n order the rows were written in, which keeps a server's own ranking\n reachable.\n2. `helix-sort` asks first, with `field:direction`, or empty for the written\n order. Refuse it to keep the order, or to sort the rows yourself and set\n `sort`.\n3. `helix-sorted` follows once the order stands, and `sort` holds it.\n4. The heading carries `aria-sort`, and a screen reader hears `sorted-label`\n (\"Sorted by Name, ascending\") or `unsorted-label` from a polite region.\n\nTab reaches each sort button, and Enter or Space presses it.\n\nThe `heading` slot names the table: slot a heading or a line of text into\nit, and the table is named by its words. An `aria-label` or `aria-labelledby` on the\nhost wins over it.\n\n**Selecting.** `selectable` adds a column of checkboxes.\n\n1. Each row is known by its `value`, or by its place among the rows where it\n has none, and `selected` holds the chosen keys, comma separated, the same\n shape `DataTable` uses. `default-selected` is where it starts.\n2. A row's checkbox is named by `select-row-label` (\"Select {row}\") with the\n words of the row's first cell. The checkbox in the heading selects every\n row, and shows a dash while only some are chosen.\n3. `helix-select` asks first, with every key the change would leave.\n Refuse it to keep the selection. `helix-selected` follows once it stands.\n4. A chosen row takes `:state(selected)`, and a screen reader hears\n `selected-label` (\"2 selected\") from a polite region.\n\nTab reaches each checkbox, and Space ticks it. To act on one row, put a\nlink or a button in a cell, or give the row an `href`.\n\n**Moving rows.** `reorderable` adds a column of grips before the checkboxes,\nunder a heading named by `row-grips-label`.\n\n1. Each row is known by its `value`, or by its place among the rows where it\n has none, as for selecting. Give rows a `value` when they move, so a key\n stays with its row.\n2. A grip is a button named by `move-row-label` (\"Move {row}\") with the\n words of the row's first cell. Drag it to move its row, and the page\n scrolls near an edge. Or press it with Space, Enter, or a click to pick\n the row up, move it with Up, Down, Home, and End, and press it again to\n drop it. A click on another row drops it there, and Escape puts it back.\n3. `helix-before-reorder` asks first, and `helix-reorder` follows with\n `keys`, every row's key in the new order. **You move the rows**: the\n table moves no element of yours, and focus goes back to the moved row's\n grip once you have.\n4. Each step is said in the table's live region, in words you can change:\n `picked-up-label`, `moved-label`, `dropped-label`, and `canceled-label`.\n The grips do nothing while a sort is set.\n\n**A grid.** `grid` makes the table one tab stop that the arrow keys move\nthrough cell by cell, the headings included, as React Aria's table is. The\ntable is then a `grid` and each value a `gridcell`, and the table gives\nevery cell a `tabindex` so focus can rest on it: set `grid` only where the\ncells may carry one.\n\n| Key | What it does |\n|---|---|\n| Right, Left | Moves one cell along the row. Left moves on, on a right-to-left page. |\n| Down, Up | Moves one row, the headings included. |\n| Home, End | Moves to the first or the last cell of the row. |\n| Control with Home or End | Moves to the first or the last cell of the table. |\n| Page Down, Page Up | Moves by the rows that fit in view. |\n| Enter, F2 | Moves into the cell's links and controls. Escape or F2 moves back to the cell, and Tab moves between the controls of one cell. |\n| Enter on a cell of a row with `href` | Follows the row's link. |\n| Enter, Space on a sortable heading | Sorts by the column. |\n| Space on a row, Enter or Space on its checkbox cell | Selects the row, in a `selectable` table. |\n| Enter or Space on a grip cell | Picks the row up, or drops it, in a `reorderable` table. Up, Down, Home, and End move a row picked up, and Escape puts it back. |\n| Shift with Down or Up | Selects the rows it moves across, in a `selectable` table. |\n| Shift with Space | Selects every row from the one last chosen, in a `selectable` table. |\n| Control or Command with A | Selects every row, in a `selectable` table. |\n| A letter or a word | Moves to the next row whose first cell starts with what you typed. |\n| Tab | Leaves the table. |\n\nThe CSS custom properties listed for this component are written by it and\nread by the stylesheet that draws it. Do not set them. Each holds a number\nthe component computes and CSS cannot, so the stylesheet can draw the table\nwithout measuring anything.",
148370
149409
  "name": "HelixHeadlessTable",
148371
149410
  "cssProperties": [
148372
149411
  {
@@ -148465,9 +149504,17 @@
148465
149504
  "description": "The table's rows.",
148466
149505
  "name": ""
148467
149506
  },
149507
+ {
149508
+ "description": "Content shown when there are no rows and none are loading, such as a picture and a link. Falls back to `empty-text`, which the live region still says.",
149509
+ "name": "empty"
149510
+ },
148468
149511
  {
148469
149512
  "description": "Words that name the table, shown above it, such as a heading.",
148470
149513
  "name": "heading"
149514
+ },
149515
+ {
149516
+ "description": "Content shown while the rows load, such as a spinner. Falls back to `loading-text`, which the live region still says.",
149517
+ "name": "loading"
148471
149518
  }
148472
149519
  ],
148473
149520
  "members": [
@@ -148485,6 +149532,20 @@
148485
149532
  "module": "src/mixins/mixin-collection/mixin-collection.ts"
148486
149533
  }
148487
149534
  },
149535
+ {
149536
+ "kind": "field",
149537
+ "name": "statusSlots",
149538
+ "type": {
149539
+ "text": "boolean"
149540
+ },
149541
+ "privacy": "protected",
149542
+ "default": "true",
149543
+ "description": "The empty and loading lines are the `empty` and `loading` slots.",
149544
+ "inheritedFrom": {
149545
+ "name": "MixinCollection",
149546
+ "module": "src/mixins/mixin-collection/mixin-collection.ts"
149547
+ }
149548
+ },
148488
149549
  {
148489
149550
  "kind": "field",
148490
149551
  "name": "ascendingLabel",
@@ -148796,7 +149857,7 @@
148796
149857
  "name": "gridKeys",
148797
149858
  "privacy": "private",
148798
149859
  "readonly": true,
148799
- "default": "new TableGridController(this, { activate: (place, event) => this.activate(place, event), columns: () => this.tableColumns.filter((column) => column.shown), lead: () => this.lead, on: () => this.grid, part: (name) => this.partNamed(name), rows: () => (this.childrenKnown ? this.arrangedRows : []), selectAll: () => this.selectable && this.requestSelected(new Set(this.everyKey)), })",
149860
+ "default": "new TableGridController(this, { activate: (place, event) => this.activate(place, event), columns: () => this.tableColumns.filter((column) => column.shown), lead: () => this.lead, on: () => this.grid, part: (name) => this.partNamed(name), rows: () => (this.childrenKnown ? this.arrangedRows : []), rowWords: () => this.arrangedRows.map((row) => textOf(row.children[0])), selectAll: () => this.selectable && this.requestSelected(new Set([...this.chosen, ...this.enabledKeys])), selectRange: (to, from) => this.selectRange(to, from), })",
148800
149861
  "description": "The keyboard of a `grid` table, in `grid-controller.ts`."
148801
149862
  },
148802
149863
  {
@@ -149027,6 +150088,35 @@
149027
150088
  "description": "Every row's key, in the order the rows are written.",
149028
150089
  "readonly": true
149029
150090
  },
150091
+ {
150092
+ "kind": "field",
150093
+ "name": "enabledKeys",
150094
+ "type": {
150095
+ "text": "string[]"
150096
+ },
150097
+ "privacy": "private",
150098
+ "description": "The keys of the rows that can be chosen: every row that is not `disabled`.",
150099
+ "readonly": true
150100
+ },
150101
+ {
150102
+ "kind": "method",
150103
+ "name": "isDisabled",
150104
+ "privacy": "private",
150105
+ "return": {
150106
+ "type": {
150107
+ "text": "boolean"
150108
+ }
150109
+ },
150110
+ "parameters": [
150111
+ {
150112
+ "name": "key",
150113
+ "type": {
150114
+ "text": "string"
150115
+ }
150116
+ }
150117
+ ],
150118
+ "description": "Whether the row of that key is `disabled`."
150119
+ },
149030
150120
  {
149031
150121
  "kind": "method",
149032
150122
  "name": "chooseAll",
@@ -149036,7 +150126,42 @@
149036
150126
  "text": "void"
149037
150127
  }
149038
150128
  },
149039
- "description": "The checkbox in the heading: every row, or none where every row is chosen."
150129
+ "description": "The checkbox in the heading: every row that can be chosen, or none of\nthem where each already is. A `disabled` row keeps what it had."
150130
+ },
150131
+ {
150132
+ "kind": "field",
150133
+ "name": "anchorKey",
150134
+ "type": {
150135
+ "text": "string | undefined"
150136
+ },
150137
+ "privacy": "private",
150138
+ "default": "undefined",
150139
+ "description": "The key of the row a Shift range runs from: the one last chosen."
150140
+ },
150141
+ {
150142
+ "kind": "method",
150143
+ "name": "selectRange",
150144
+ "privacy": "private",
150145
+ "return": {
150146
+ "type": {
150147
+ "text": "boolean"
150148
+ }
150149
+ },
150150
+ "parameters": [
150151
+ {
150152
+ "name": "to",
150153
+ "type": {
150154
+ "text": "number"
150155
+ }
150156
+ },
150157
+ {
150158
+ "name": "from",
150159
+ "type": {
150160
+ "text": "number"
150161
+ }
150162
+ }
150163
+ ],
150164
+ "description": "Selects every row from the one last chosen to the drawn row `to`, keeping\nwhat was already selected. With no row to run from, the range is the row\nthe reader is on, `from`, and it becomes the one to run from. Says whether\nthe table selects at all."
149040
150165
  },
149041
150166
  {
149042
150167
  "kind": "method",
@@ -149061,7 +150186,7 @@
149061
150186
  }
149062
150187
  }
149063
150188
  ],
149064
- "description": "One row's checkbox, ticked or not."
150189
+ "description": "One row's checkbox, ticked or not. It becomes the row a range runs from."
149065
150190
  },
149066
150191
  {
149067
150192
  "kind": "method",
@@ -149225,7 +150350,7 @@
149225
150350
  "text": "Element[]"
149226
150351
  },
149227
150352
  "privacy": "protected",
149228
- "description": "The rows: every child that is not a column, which is what the body slot is assigned.",
150353
+ "description": "The rows: every child that is not a column, a heading, or the content of\nthe `empty` or `loading` slot, which is what the body slot is assigned.",
149229
150354
  "readonly": true,
149230
150355
  "inheritedFrom": {
149231
150356
  "name": "MixinCollection",
@@ -150186,7 +151311,7 @@
150186
151311
  "declarations": [
150187
151312
  {
150188
151313
  "kind": "class",
150189
- "description": "The row renders its cells straight through and lays out none of them, so a\nstylesheet can place them in the table's grid and every column lines up\nacross rows. The row still exists as an element, so you can style it, hide\nit, or make it interactive.\n\nIn a `selectable` table the row draws a checkbox cell before its own cells,\nand `value` is the key the table's `selected` lists it by.\n\nIn a `reorderable` table the row draws a grip cell before those, holding a\nbutton named by the table's `move-row-label`, and `value` is the key\n`helix-reorder` lists it by. The table says which row is moving and where\nthe drop indicator is, with the `dragging`, `drop-before`, and `drop-after`\nstates.\n\n**`href` makes the whole row a link**, as a row action does in React Aria's\ntable: a press anywhere on the row follows it, except on a link or a control\nof the row's own, and Control, Command or Shift open it the way they open a\nlink. A drag that selects text follows nothing. A row in a table is not a\nstop of its own, so put the same link in a cell, usually the row header,\nwhich is what the keyboard and a screen reader reach. In a `grid` table,\nEnter on any cell of the row follows it as well.",
151314
+ "description": "The row renders its cells straight through and lays out none of them, so a\nstylesheet can place them in the table's grid and every column lines up\nacross rows. The row still exists as an element, so you can style it, hide\nit, or make it interactive.\n\nIn a `selectable` table the row draws a checkbox cell before its own cells,\nand `value` is the key the table's `selected` lists it by. `disabled` keeps\nthe row out of the selection and out of its link.\n\nIn a `reorderable` table the row draws a grip cell before those, holding a\nbutton named by the table's `move-row-label`, and `value` is the key\n`helix-reorder` lists it by. The table says which row is moving and where\nthe drop indicator is, with the `dragging`, `drop-before`, and `drop-after`\nstates.\n\n**`href` makes the whole row a link**, as a row action does in React Aria's\ntable: a press anywhere on the row follows it, except on a link or a control\nof the row's own, and Control, Command or Shift open it the way they open a\nlink. A drag that selects text follows nothing. A row in a table is not a\nstop of its own, so put the same link in a cell, usually the row header,\nwhich is what the keyboard and a screen reader reach. In a `grid` table,\nEnter on any cell of the row follows it as well.",
150190
151315
  "name": "HelixHeadlessTableRow",
150191
151316
  "cssParts": [
150192
151317
  {
@@ -150261,6 +151386,17 @@
150261
151386
  }
150262
151387
  ],
150263
151388
  "members": [
151389
+ {
151390
+ "kind": "field",
151391
+ "name": "disabled",
151392
+ "type": {
151393
+ "text": "boolean"
151394
+ },
151395
+ "default": "false",
151396
+ "description": "Takes the row out of the table's selection and out of its link: the row's\ncheckbox is disabled, Space, Shift ranges, and the checkbox in the heading\npass over it, and a press does not follow `href`. A row already selected\nstays selected. A screen reader hears it as unavailable, and in a `grid`\ntable the arrow keys still reach it, as a disabled cell in a grid is\nreached.",
151397
+ "attribute": "disabled",
151398
+ "reflects": true
151399
+ },
150264
151400
  {
150265
151401
  "kind": "field",
150266
151402
  "name": "href",
@@ -150688,6 +151824,15 @@
150688
151824
  }
150689
151825
  ],
150690
151826
  "attributes": [
151827
+ {
151828
+ "name": "disabled",
151829
+ "type": {
151830
+ "text": "boolean"
151831
+ },
151832
+ "default": "false",
151833
+ "description": "Takes the row out of the table's selection and out of its link: the row's\ncheckbox is disabled, Space, Shift ranges, and the checkbox in the heading\npass over it, and a press does not follow `href`. A row already selected\nstays selected. A screen reader hears it as unavailable, and in a `grid`\ntable the arrow keys still reach it, as a disabled cell in a grid is\nreached.",
151834
+ "fieldName": "disabled"
151835
+ },
150691
151836
  {
150692
151837
  "name": "href",
150693
151838
  "type": {
@@ -150739,7 +151884,7 @@
150739
151884
  "name": "drop-before"
150740
151885
  },
150741
151886
  {
150742
- "description": "While the row has `href`, so a press on it follows the link.",
151887
+ "description": "While the row has `href` and is not `disabled`, so a press on it follows the link.",
150743
151888
  "name": "link"
150744
151889
  },
150745
151890
  {
@@ -151325,7 +152470,7 @@
151325
152470
  "declarations": [
151326
152471
  {
151327
152472
  "kind": "class",
151328
- "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\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.",
152473
+ "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\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.",
151329
152474
  "name": "HelixHeadlessTabs",
151330
152475
  "cssParts": [
151331
152476
  {
@@ -151466,6 +152611,16 @@
151466
152611
  "privacy": "private",
151467
152612
  "readonly": true
151468
152613
  },
152614
+ {
152615
+ "kind": "field",
152616
+ "name": "held",
152617
+ "type": {
152618
+ "text": "string[]"
152619
+ },
152620
+ "privacy": "private",
152621
+ "default": "[]",
152622
+ "description": "The values of the tabs the last pairing read, to tell a removed tab from one not yet here."
152623
+ },
151469
152624
  {
151470
152625
  "kind": "method",
151471
152626
  "name": "sync",
@@ -151477,6 +152632,32 @@
151477
152632
  },
151478
152633
  "description": "Pushes the current value down to whichever tab and panel own it."
151479
152634
  },
152635
+ {
152636
+ "kind": "field",
152637
+ "name": "focused",
152638
+ "type": {
152639
+ "text": "HelixHeadlessTab | undefined"
152640
+ },
152641
+ "privacy": "private",
152642
+ "description": "The tab that last had focus, so its removal can hand focus on."
152643
+ },
152644
+ {
152645
+ "kind": "field",
152646
+ "name": "handleFocusIn",
152647
+ "privacy": "private",
152648
+ "readonly": true
152649
+ },
152650
+ {
152651
+ "kind": "method",
152652
+ "name": "refocus",
152653
+ "privacy": "private",
152654
+ "return": {
152655
+ "type": {
152656
+ "text": "void"
152657
+ }
152658
+ },
152659
+ "description": "Puts focus on the selected tab where the tab that had it was removed and\nfocus fell to the page, which is where removing a focused element leaves\nit."
152660
+ },
151480
152661
  {
151481
152662
  "kind": "field",
151482
152663
  "name": "handleSlotChange",
@@ -170153,13 +171334,13 @@
170153
171334
  },
170154
171335
  "parameters": [
170155
171336
  {
170156
- "name": "{\n content,\n description,\n heading,\n labeled,\n progress,\n}",
171337
+ "name": "{\n content,\n description,\n heading,\n labeled,\n loose = null,\n progress,\n}",
170157
171338
  "type": {
170158
171339
  "text": "StopWords"
170159
171340
  }
170160
171341
  }
170161
171342
  ],
170162
- "description": "What names a tour stop's panel and what describes it.\n\nNamed by the `heading` slot, then by the first heading in the content, then\nby the stop's own `label`, and where there is none of those, by its place in\nthe tour, so no stop is an unnamed group. Described by the `description`\nslot and by its place, which is how a screen reader hears where it is as\nfocus moves from one stop to the next."
171343
+ "description": "What names a tour stop's panel and what describes it.\n\nNamed by the `heading` slot, then by the first heading in the content, then\nby the stop's own `label`, and where there is none of those, by its place in\nthe tour, so no stop is an unnamed group. Described by the `description`\nslot, or where it is empty by the words at the start of the content, as a\n`Dialog` is, and then by its place, which is how a screen reader hears where\nit is as focus moves from one stop to the next."
170163
171344
  }
170164
171345
  ],
170165
171346
  "exports": [
@@ -170179,7 +171360,7 @@
170179
171360
  "declarations": [
170180
171361
  {
170181
171362
  "kind": "class",
170182
- "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 arrow keys move between stops** while focus is in one: the arrow that\npoints the way the line runs goes on, and the other goes back, so on a\nright-to-left page `ArrowLeft` goes on. Neither finishes the tour at the last\nstop, and a text field in a stop keeps its own arrows. `Escape` skips the\ntour.",
171363
+ "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`.",
170183
171364
  "name": "HelixHeadlessTour",
170184
171365
  "cssProperties": [
170185
171366
  {
@@ -170495,6 +171676,26 @@
170495
171676
  "privacy": "private",
170496
171677
  "readonly": true
170497
171678
  },
171679
+ {
171680
+ "kind": "field",
171681
+ "name": "revealed",
171682
+ "type": {
171683
+ "text": "HTMLElement | undefined"
171684
+ },
171685
+ "privacy": "private",
171686
+ "description": "The target last scrolled into view, so a render that moved nothing scrolls nothing."
171687
+ },
171688
+ {
171689
+ "kind": "method",
171690
+ "name": "reveal",
171691
+ "privacy": "private",
171692
+ "return": {
171693
+ "type": {
171694
+ "text": "void"
171695
+ }
171696
+ },
171697
+ "description": "Scrolls the current target into view, by the least distance that brings\nit on screen, before its stop is shown beside it. Zag's tour does the same.\nA target already on screen does not move."
171698
+ },
170498
171699
  {
170499
171700
  "kind": "field",
170500
171701
  "name": "returnFocus",
@@ -171382,7 +172583,7 @@
171382
172583
  "declarations": [
171383
172584
  {
171384
172585
  "kind": "class",
171385
- "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 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.",
172586
+ "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.",
171386
172587
  "name": "HelixHeadlessTourStop",
171387
172588
  "cssParts": [
171388
172589
  {
@@ -173352,7 +174553,7 @@
173352
174553
  "declarations": [
173353
174554
  {
173354
174555
  "kind": "class",
173355
- "description": "The tree is a single tab stop, and arrow keys move focus between items, as\nthe tree pattern requires, so Tab moves past a long sidebar in one press. The\ntree moves the tab stop to the focused item, so the browser's focus order\nstays intact.\n\nItems are found with `instanceof`, never by tag name, so the headless tier\ndoes not depend on the styled one.\n\nTyping a letter moves to the next visible item whose name starts with it,\nand `*` opens every branch beside the focused item.\n\n`selection-mode=\"multiple\"` draws a check mark on every row and lets a\nreader check many, as Web Awesome's and Ark UI's checkbox trees do. Checking\na branch checks every item under it, and a branch some of whose items are\nchecked is partly checked. Space or a press on the mark checks the focused\nrow, and Enter or a press on a branch's row opens it. `active` then holds the\nchecked values, comma separated, which `values` also gives as a list, and\nthe tree says `aria-multiselectable`.\n\n`selection-mode=\"leaf\"` chooses one item at a time and only the items at the\nends: a press, Enter or Space on a branch opens or closes it and chooses\nnothing, as Web Awesome's `leaf` mode does.\n\nKeys: Up and Down Arrow move between the items a reader can see; Right\nArrow opens a shut branch and then moves into it, and Left Arrow shuts an\nopen one and then moves to its parent, the two swapping on a right-to-left\npage. Home and End go to the first and the last item, Enter and Space choose\nor open, and the tree's one tab stop stays on the item last reached. In a\ntree of check marks, Control+A (Command+A on an Apple keyboard) checks every\nitem or clears them all, and Shift with Up or Down Arrow moves and checks.\n\n**`reorderable` lets you move items among their siblings.** Alt with Up or\nDown moves the focused item a place, and Alt with Home or End to the first\nor the last place among its siblings, as the APG's rearrangeable listbox\ndoes. Each row gets a grip at its far end: drag it to move the item, and the\ntree scrolls near an edge. A click on a grip picks the item up and a click on\none of its siblings drops it there, which needs no drag. The arrows move an\nitem picked up that way, Enter or Space drops it, and Escape puts it back.\nThe tree says each step in its `live` region. A drop sends\n`helix-before-reorder`, which you can refuse, and then `helix-reorder`, whose\n`keys` hold the siblings in the new order. **You move the items**: the tree\nmoves no element of yours, and focus follows the moved item once you have.\nMoving an item into another branch is not part of this.",
174556
+ "description": "The tree is a single tab stop, and arrow keys move focus between items, as\nthe tree pattern requires, so Tab moves past a long sidebar in one press. The\ntree moves the tab stop to the focused item, so the browser's focus order\nstays intact.\n\nItems are found with `instanceof`, never by tag name, so the headless tier\ndoes not depend on the styled one.\n\nTyping a letter moves to the next visible item whose name starts with it,\nand `*` opens every branch beside the focused item.\n\n`selection-mode=\"multiple\"` draws a check mark on every row and lets a\nreader check many, as Web Awesome's and Ark UI's checkbox trees do. Checking\na branch checks every item under it, and a branch some of whose items are\nchecked is partly checked. Space or a press on the mark checks the focused\nrow, and Enter or a press on a branch's row opens it. `active` then holds the\nchecked values, comma separated, which `values` also gives as a list, and\nthe tree says `aria-multiselectable`.\n\n`selection-mode=\"leaf\"` chooses one item at a time and only the items at the\nends: a press, Enter or Space on a branch opens or closes it and chooses\nnothing, as Web Awesome's `leaf` mode does.\n\nKeys: Up and Down Arrow move between the items a reader can see; Right\nArrow opens a shut branch and then moves into it, and Left Arrow shuts an\nopen one and then moves to its parent, the two swapping on a right-to-left\npage. Home and End go to the first and the last item, Enter and Space choose\nor open, and the tree's one tab stop stays on the item last reached. In a\ntree of check marks, Control+A (Command+A on an Apple keyboard) checks every\nitem or clears them all, and Shift with Up or Down Arrow moves and checks.\n\nRemoving the item that has focus moves focus to the item after it among its\nsiblings, or the one before, or its parent, so focus stays in the tree.\n\n**`reorderable` lets you move items among their siblings.** Alt with Up or\nDown moves the focused item a place, and Alt with Home or End to the first\nor the last place among its siblings, as the APG's rearrangeable listbox\ndoes. Each row gets a grip at its far end: drag it to move the item, and the\ntree scrolls near an edge. A click on a grip picks the item up and a click on\none of its siblings drops it there, which needs no drag. The arrows move an\nitem picked up that way, Enter or Space drops it, and Escape puts it back.\nThe tree says each step in its `live` region. A drop sends\n`helix-before-reorder`, which you can refuse, and then `helix-reorder`, whose\n`keys` hold the siblings in the new order. **You move the items**: the tree\nmoves no element of yours, and focus follows the moved item once you have.\nMoving an item into another branch is not part of this.",
173356
174557
  "name": "HelixHeadlessTree",
173357
174558
  "cssParts": [
173358
174559
  {
@@ -173656,6 +174857,40 @@
173656
174857
  },
173657
174858
  "privacy": "private"
173658
174859
  },
174860
+ {
174861
+ "kind": "field",
174862
+ "name": "focused",
174863
+ "type": {
174864
+ "text": "HelixHeadlessTreeItem | undefined"
174865
+ },
174866
+ "privacy": "private",
174867
+ "description": "The item that last had focus, so its removal can hand focus on."
174868
+ },
174869
+ {
174870
+ "kind": "field",
174871
+ "name": "handleFocusIn",
174872
+ "privacy": "private",
174873
+ "readonly": true
174874
+ },
174875
+ {
174876
+ "kind": "method",
174877
+ "name": "refocus",
174878
+ "privacy": "private",
174879
+ "return": {
174880
+ "type": {
174881
+ "text": "void"
174882
+ }
174883
+ },
174884
+ "parameters": [
174885
+ {
174886
+ "name": "records",
174887
+ "type": {
174888
+ "text": "MutationRecord[]"
174889
+ }
174890
+ }
174891
+ ],
174892
+ "description": "Puts focus back in the tree where the item that had it was removed and\nfocus fell to the page: on the item after it among its siblings, or the\none before, or its parent. Read from the removal itself, which knows where\nthe item stood."
174893
+ },
173659
174894
  {
173660
174895
  "kind": "field",
173661
174896
  "name": "items",
@@ -174059,6 +175294,20 @@
174059
175294
  "module": "src/mixins/mixin-collection/mixin-collection.ts"
174060
175295
  }
174061
175296
  },
175297
+ {
175298
+ "kind": "field",
175299
+ "name": "statusSlots",
175300
+ "type": {
175301
+ "text": "boolean"
175302
+ },
175303
+ "privacy": "protected",
175304
+ "default": "false",
175305
+ "description": "Whether the status line is an `empty` or `loading` slot, with\n`empty-text` or `loading-text` as its fallback.\n\n**Off unless a family turns it on**, because a slot is published API:\neach family that renders one documents it in its own manifest. The live\nregion keeps saying the text either way, because a slotted picture has no\nwords to say.",
175306
+ "inheritedFrom": {
175307
+ "name": "MixinCollection",
175308
+ "module": "src/mixins/mixin-collection/mixin-collection.ts"
175309
+ }
175310
+ },
174062
175311
  {
174063
175312
  "kind": "field",
174064
175313
  "name": "active",
@@ -177075,7 +178324,7 @@
177075
178324
  "declarations": [
177076
178325
  {
177077
178326
  "kind": "class",
177078
- "description": "**You slot the player**, so it keeps your appearance, extra controls,\ncaptions, and poster treatment. `Sandbox` takes its preview and `Menu` its\ntrigger the same way.\n\n**Entries are markup.** React skips properties it would set imperatively\nduring hydration, so an array property on a custom element is missing on the\nfirst paint of a server-rendered page. `using-the-elements.mdx` has the\nmeasurement. Markup also makes each entry a real button with its name inside.\n\n**The playlist does not play media.** It sets `src` on the player and tracks\nwhich entry is current. The current entry moves when:\n\n- an entry is pressed,\n- the player dispatches `helix-next` or `helix-previous`, or\n- the player reaches the end.\n\nOn `ended` the playlist advances and the next clip starts playing, because\nthe user already pressed play once. `repeat` decides what happens at the\nend: `one` plays the same entry again, and `all` goes from the last entry\nback to the first. Without it, the playlist stops on the last entry and\nsends `helix-end`. `shuffle` plays the entries in a random order, starting\nfrom the one that is current, and `previous` retraces that order.\n\n**Keyboard.** Each entry is a button in the tab order, and Enter or Space\nplays it. The current entry carries `aria-current`. While focus is on the\nplayer, the player's own keys work, and `Video` lists them. Its previous\nand next controls move through the entries in the same order the playlist\ndoes.",
178327
+ "description": "**You slot the player**, so it keeps your appearance, extra controls,\ncaptions, and poster treatment. `Sandbox` takes its preview and `Menu` its\ntrigger the same way.\n\n**Entries are markup.** React skips properties it would set imperatively\nduring hydration, so an array property on a custom element is missing on the\nfirst paint of a server-rendered page. `using-the-elements.mdx` has the\nmeasurement. Markup also makes each entry a real button with its name inside.\n\n**The playlist does not play media.** It sets `src` on the player and tracks\nwhich entry is current. The current entry moves when:\n\n- an entry is pressed,\n- the player dispatches `helix-next` or `helix-previous`, or\n- the player reaches the end.\n\nOn `ended` the playlist advances and the next clip starts playing, because\nthe user already pressed play once. `repeat` decides what happens at the\nend: `one` plays the same entry again, and `all` goes from the last entry\nback to the first. Without it, the playlist stops on the last entry and\nsends `helix-end`. `shuffle` plays the entries in a random order, starting\nfrom the one that is current, and `previous` retraces that order.\n\n**The player is named by the current entry**, and the device's own media\ncontrols show the entry as the title. A player you gave a `label` keeps\nyour name, and only the title follows the entry.\n\n**Keyboard.** Each entry is a button in the tab order, and Enter or Space\nplays it. The current entry carries `aria-current`. While focus is on the\nplayer, the player's own keys work, and `Video` lists them. Its previous\nand next controls move through the entries in the same order the playlist\ndoes.",
177079
178328
  "name": "HelixHeadlessVideoPlaylist",
177080
178329
  "cssParts": [
177081
178330
  {
@@ -178727,6 +179976,16 @@
178727
179976
  "attribute": "loop",
178728
179977
  "reflects": true
178729
179978
  },
179979
+ {
179980
+ "kind": "field",
179981
+ "name": "mediaTitle",
179982
+ "type": {
179983
+ "text": "string"
179984
+ },
179985
+ "default": "''",
179986
+ "description": "The title the device's own media controls show while the video plays,\nsuch as on a lock screen. Empty, the default, shows `label`. A playlist\nwrites the current entry's name here.",
179987
+ "attribute": "media-title"
179988
+ },
178730
179989
  {
178731
179990
  "kind": "field",
178732
179991
  "name": "moreLabel",
@@ -180463,6 +181722,15 @@
180463
181722
  "description": "Whether the video starts again at the end.",
180464
181723
  "fieldName": "loop"
180465
181724
  },
181725
+ {
181726
+ "name": "media-title",
181727
+ "type": {
181728
+ "text": "string"
181729
+ },
181730
+ "default": "''",
181731
+ "description": "The title the device's own media controls show while the video plays,\nsuch as on a lock screen. Empty, the default, shows `label`. A playlist\nwrites the current entry's name here.",
181732
+ "fieldName": "mediaTitle"
181733
+ },
180466
181734
  {
180467
181735
  "name": "more-label",
180468
181736
  "type": {
@@ -181153,7 +182421,7 @@
181153
182421
  "declarations": [
181154
182422
  {
181155
182423
  "kind": "class",
181156
- "description": "The items arrive as data, in one of two ways:\n\n- `items` takes an array. A framework sets it as a property, and React\n hydration keeps it.\n- `for` names a `<script type=\"application/json\">` that holds an array, which\n a server sends as markup.\n\nEach item is drawn into a row in one of two ways:\n\n- `renderItem` is a function from an item and its index to the row's\n content: a Lit template, a string, or a DOM node.\n- A `<template>` child defines one row. `data-field=\"name\"` fills an element\n with the item's `name` as text, and `data-field-href=\"url\"` writes the\n item's `url` into `href`, the same for any attribute. A field may be a path\n of keys, such as `author.name`.\n\nRows are your markup in the light DOM, so your stylesheet styles them.\n\n**A grid.** `columns` lays the items out that many to a line, as a grid of\nequal columns, and windows the set a line at a time, as React Aria's grid\nlayout does. Each item draws one element, a cell of the grid, and\n`estimate` is the height of a line. Space the items with padding inside\neach one, which the list measures with the line.\n\n**Keyboard.** The list is one tab stop.\n\n| Key | What it does |\n|---|---|\n| Down, Up | Moves to the next or the previous item, or in a grid to the item in the same column on the next or the previous line. |\n| Right, Left | In a grid, moves to the next or the previous item along the line, the other way round on a right-to-left page. |\n| Home, End | Moves to the first or the last item. |\n| Page Down, Page Up | Moves by the number of items, or of lines in a grid, on screen. |\n| A letter or a word | Moves to the next item whose text starts with what you typed. |\n| Tab | Moves into the focused row's own links and buttons, then out of the list. |\n\nAn item that is not drawn is scrolled into view and focused, so a keyboard\nreaches the whole set. When the row holding the tab stop scrolls away, the\nstop moves to the first row on screen. Typing matches each item's\n`text-field`, which is the first `data-field` of the row template by default,\nor the item itself when it is a string or a number.\n\nEach row says its place in the whole set with `aria-posinset` and\n`aria-setsize`, so a screen reader says \"4,000 of 10,000\". The row holding\nfocus stays drawn when it scrolls out.\n\n**Selecting.** `selection-mode` makes the list a list box a reader chooses\nfrom: `single` selects one item and `multiple` any number. Space or a press\nselects an item, Shift with Space, an arrow, Home, End or a press takes in\nthe items from the last one chosen, and Control or Command with A selects\nthem all, in `multiple`. `value` holds the chosen items' keys, separated by\ncommas, in the order of the set: `key-field` names each item's key, and a\nstring or a number item is its own key. A change asks with\n`helix-before-change` and tells with `change`. Each row is an `option`\nmarked `aria-selected`, so a row's own links and buttons are not reached\nthere: keep those to a list without `selection-mode`.\n\n**Loading more.** `helix-range-change` fires as the items on screen change,\nand `range` holds them. `helix-load-more` fires once a reader is within one\nscreen of the end, once for each length of the set: add to `items` and it can\nfire again. While you fetch, set `loading`: the list is busy, and a row after\nthe last item says \"Loading more\" (`loading-label`, or your own content in\nthe `loading` slot). `scrollToIndex` takes a reader to an item.\n\n**Row height.** Rows are placed by `estimate` until they are drawn. Then the\nlist reads the drawn rows' height once and places every row by it, so a\nwrong estimate still reaches the last item. Set `measured` for rows of\ndifferent heights. Once the list draws rows of different heights, such as\nrows that wrap on a narrow screen, it places each row by its own height\nwhether `measured` is set or not.\n\nThe list follows its source. A new `items` array, an edit to the script's\ntext, or a script replaced under the same id draws the new rows. A row that\nstays in view keeps its element as the list scrolls.\n\nThe viewport scrolls on this tier. It carries `data-scroller`, and `core`\nships `[data-scroller] { overflow: auto }` into every shadow root, so\n`scrollTop` works with no stylesheet. You still need to set a block size.",
182424
+ "description": "The items arrive as data, in one of two ways:\n\n- `items` takes an array. A framework sets it as a property, and React\n hydration keeps it.\n- `for` names a `<script type=\"application/json\">` that holds an array, which\n a server sends as markup.\n\nEach item is drawn into a row in one of two ways:\n\n- `renderItem` is a function from an item and its index to the row's\n content: a Lit template, a string, or a DOM node.\n- A `<template>` child defines one row. `data-field=\"name\"` fills an element\n with the item's `name` as text, and `data-field-href=\"url\"` writes the\n item's `url` into `href`, the same for any attribute. A field may be a path\n of keys, such as `author.name`.\n\nRows are your markup in the light DOM, so your stylesheet styles them.\n\n**A grid.** `columns` lays the items out that many to a line, as a grid of\nequal columns, and windows the set a line at a time, as React Aria's grid\nlayout does. Each item draws one element, a cell of the grid, and\n`estimate` is the height of a line. Space the items with padding inside\neach one, which the list measures with the line.\n\n**Keyboard.** The list is one tab stop.\n\n| Key | What it does |\n|---|---|\n| Down, Up | Moves to the next or the previous item, or in a grid to the item in the same column on the next or the previous line. |\n| Right, Left | In a grid, moves to the next or the previous item along the line, the other way round on a right-to-left page. |\n| Home, End | Moves to the first or the last item. |\n| Page Down, Page Up | Moves by the number of items, or of lines in a grid, on screen. |\n| A letter or a word | Moves to the next item whose text starts with what you typed. |\n| Tab | Moves into the focused row's own links and buttons, then out of the list. |\n\nAn item that is not drawn is scrolled into view and focused, so a keyboard\nreaches the whole set. When the row holding the tab stop scrolls away, the\nstop moves to the first row on screen. Typing matches each item's\n`text-field`, which is the first `data-field` of the row template by default,\nor the item itself when it is a string or a number.\n\nEach row says its place in the whole set with `aria-posinset` and\n`aria-setsize`, so a screen reader says \"4,000 of 10,000\". The row holding\nfocus stays drawn when it scrolls out.\n\n**Selecting.** `selection-mode` makes the list a list box a reader chooses\nfrom: `single` selects one item and `multiple` any number. Space or a press\nselects an item, Shift with Space, an arrow, Home, End or a press takes in\nthe items from the last one chosen, and Control or Command with A selects\nthem all, in `multiple`. `value` holds the chosen items' keys, separated by\ncommas, in the order of the set: `key-field` names each item's key, and a\nstring or a number item is its own key. A change asks with\n`helix-before-change` and tells with `change`. Each row is an `option`\nmarked `aria-selected`, so a row's own links and buttons are not reached\nthere: keep those to a list without `selection-mode`.\n\n**Loading more.** `helix-range-change` fires as the items on screen change,\nand `range` holds them. `helix-load-more` fires once a reader is within one\nscreen of the end, once for each length of the set: add to `items` and it can\nfire again. While you fetch, set `loading`: the list is busy, and a row after\nthe last item says \"Loading more\" (`loading-label`, or your own content in\nthe `loading` slot). `scrollToIndex` takes a reader to an item.\n\n**An empty list.** Set `empty-label`, or put your own content in the `empty`\nslot, for a row shown when there are no items and none are loading, such as\n\"No messages yet\" and a link to write one. Without either, an empty list\nshows nothing, since a list whose items have not arrived yet has not said\nit has none.\n\n**Row height.** Rows are placed by `estimate` until they are drawn. Then the\nlist reads the drawn rows' height once and places every row by it, so a\nwrong estimate still reaches the last item. Set `measured` for rows of\ndifferent heights. Once the list draws rows of different heights, such as\nrows that wrap on a narrow screen, it places each row by its own height\nwhether `measured` is set or not.\n\nThe list follows its source. A new `items` array, an edit to the script's\ntext, or a script replaced under the same id draws the new rows. A row that\nstays in view keeps its element as the list scrolls.\n\nThe viewport scrolls on this tier. It carries `data-scroller`, and `core`\nships `[data-scroller] { overflow: auto }` into every shadow root, so\n`scrollTop` works with no stylesheet. You still need to set a block size.",
181157
182425
  "name": "HelixHeadlessVirtualList",
181158
182426
  "cssParts": [
181159
182427
  {
@@ -181164,6 +182432,10 @@
181164
182432
  "description": "The space that stands in for the rows above the rendered ones.",
181165
182433
  "name": "before"
181166
182434
  },
182435
+ {
182436
+ "description": "The row shown when there are no items and none are loading, where `empty-label` or the `empty` slot gives it content.",
182437
+ "name": "empty"
182438
+ },
181167
182439
  {
181168
182440
  "description": "The row after the last item while `loading` is set.",
181169
182441
  "name": "loading"
@@ -181178,6 +182450,10 @@
181178
182450
  "description": "The `<template>` that defines one row. The list writes the rows it renders beside it, and this slot shows them between the two spacers.",
181179
182451
  "name": ""
181180
182452
  },
182453
+ {
182454
+ "description": "Content for the row shown when there are no items and none are loading. Falls back to `empty-label`.",
182455
+ "name": "empty"
182456
+ },
181181
182457
  {
181182
182458
  "description": "Content for the row after the last item while `loading` is set. Falls back to `loading-label`.",
181183
182459
  "name": "loading"
@@ -181204,6 +182480,16 @@
181204
182480
  "description": "How many items a line holds. One, the default, is a list; more lays the\nitems out as a grid of that many equal columns, windowed a line at a\ntime, with Left and Right moving along a line.",
181205
182481
  "attribute": "columns"
181206
182482
  },
182483
+ {
182484
+ "kind": "field",
182485
+ "name": "emptyLabel",
182486
+ "type": {
182487
+ "text": "string"
182488
+ },
182489
+ "default": "''",
182490
+ "description": "The text of the row shown when there are no items and none are loading,\nwhere the `empty` slot is empty. Empty, the default, shows no row.",
182491
+ "attribute": "empty-label"
182492
+ },
181207
182493
  {
181208
182494
  "kind": "field",
181209
182495
  "name": "estimate",
@@ -181765,7 +183051,7 @@
181765
183051
  "name": "handleFocusOut",
181766
183052
  "privacy": "private",
181767
183053
  "readonly": true,
181768
- "description": "The row kept for focus is let go once focus has left it."
183054
+ "description": "The row kept for focus is let go once focus has left it.\n\n**A task later, and not at once.** Between `focusout` and `focusin` the\npage's focus is on `<body>`, and Chromium runs microtasks there when a key\nmoves focus. An update asked for here ran in that gap: Tab from a kept row\nto its own link found no row holding focus, removed the row, and the link\nwent with it, leaving focus on `<body>`. A move to a control inside this\nlist asks for its own update in `handleFocusIn`, so it needs nothing here."
181769
183055
  },
181770
183056
  {
181771
183057
  "kind": "field",
@@ -182306,6 +183592,15 @@
182306
183592
  "description": "How many items a line holds. One, the default, is a list; more lays the\nitems out as a grid of that many equal columns, windowed a line at a\ntime, with Left and Right moving along a line.",
182307
183593
  "fieldName": "columns"
182308
183594
  },
183595
+ {
183596
+ "name": "empty-label",
183597
+ "type": {
183598
+ "text": "string"
183599
+ },
183600
+ "default": "''",
183601
+ "description": "The text of the row shown when there are no items and none are loading,\nwhere the `empty` slot is empty. Empty, the default, shows no row.",
183602
+ "fieldName": "emptyLabel"
183603
+ },
182309
183604
  {
182310
183605
  "name": "estimate",
182311
183606
  "type": {
@@ -182455,6 +183750,6 @@
182455
183750
  ],
182456
183751
  "helix": {
182457
183752
  "package": "@fusion.dev/helix-headless",
182458
- "version": "0.150.0"
183753
+ "version": "0.152.0"
182459
183754
  }
182460
183755
  }