@fusion.dev/helix-headless 0.151.0 → 0.153.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 (54) hide show
  1. package/custom-elements.json +1332 -37
  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 +16 -1
  5. package/dist/area-chart/root/area-chart-root.js +3 -3
  6. package/dist/bar-chart/root/bar-chart-root.d.ts +16 -1
  7. package/dist/bar-chart/root/bar-chart-root.js +3 -3
  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/dialog/description.d.ts +10 -0
  13. package/dist/dialog/description.js +22 -8
  14. package/dist/dialog/root/dialog-root.d.ts +17 -1
  15. package/dist/dialog/root/dialog-root.js +2 -2
  16. package/dist/drawer/root/drawer-root.d.ts +38 -2
  17. package/dist/drawer/root/drawer-root.js +33 -6
  18. package/dist/heatmap/root/heatmap-root.d.ts +3 -0
  19. package/dist/heatmap/root/heatmap-root.js +2 -8
  20. package/dist/lightbox/root/lightbox-root.d.ts +44 -6
  21. package/dist/lightbox/root/lightbox-root.js +59 -11
  22. package/dist/lightbox/zoom-controller.d.ts +5 -0
  23. package/dist/lightbox/zoom-controller.js +8 -0
  24. package/dist/line-chart/root/line-chart-root.d.ts +16 -1
  25. package/dist/line-chart/root/line-chart-root.js +3 -3
  26. package/dist/loader/root/loader-root.d.ts +5 -0
  27. package/dist/menu/root/menu-root.js +2 -0
  28. package/dist/navigation/root/navigation-root.d.ts +11 -1
  29. package/dist/navigation/root/navigation-root.js +10 -5
  30. package/dist/notifications/root/notifications-root.d.ts +17 -0
  31. package/dist/notifications/root/notifications-root.js +21 -1
  32. package/dist/popover/root/popover-root.d.ts +18 -7
  33. package/dist/popover/root/popover-root.js +8 -1
  34. package/dist/progress/root/progress-root.d.ts +16 -1
  35. package/dist/progress/root/progress-root.js +12 -4
  36. package/dist/scatter-chart/root/scatter-chart-root.d.ts +16 -1
  37. package/dist/scatter-chart/root/scatter-chart-root.js +3 -3
  38. package/dist/splitter/root/splitter-root.d.ts +41 -0
  39. package/dist/splitter/root/splitter-root.js +77 -0
  40. package/dist/tabs/root/tabs-root.d.ts +25 -0
  41. package/dist/tabs/root/tabs-root.js +28 -1
  42. package/dist/tour/naming.d.ts +9 -3
  43. package/dist/tour/naming.js +9 -3
  44. package/dist/tour/root/tour-root.d.ts +29 -5
  45. package/dist/tour/root/tour-root.js +13 -1
  46. package/dist/tour/stop/tour-stop.d.ts +2 -1
  47. package/dist/tour/stop/tour-stop.js +4 -1
  48. package/dist/tree/root/tree-root.d.ts +13 -0
  49. package/dist/tree/root/tree-root.js +42 -2
  50. package/lint.json +1 -1
  51. package/package.json +5 -5
  52. package/types/jsx.d.ts +1456 -36
  53. package/types/vue.d.ts +277 -24
  54. package/types/words.d.ts +64 -0
@@ -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,7 +3158,7 @@
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\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.",
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.\n\n**`data` takes the readings as data** where the page has no table to point\n`for` at, in a table's shape: the column headings, then one row per reading\nwith its label first. A table is still the better source where the page can\nshow one, since it reads before any script runs.\n\n**A chart with nothing to draw says so.** A table with no readings shows\n`empty-text`, \"No readings\", in the plot, and `loading` shows `loading-text`\nthere until readings arrive. The `empty` and `loading` slots take markup in\ntheir place, such as a link to add the first reading.",
2912
3162
  "name": "HelixHeadlessAreaChart",
2913
3163
  "cssProperties": [
2914
3164
  {
@@ -2929,6 +3179,10 @@
2929
3179
  "description": "The rule at zero, which is the floor of the drawing.",
2930
3180
  "name": "baseline"
2931
3181
  },
3182
+ {
3183
+ "description": "The words in place of the drawing when the table has no readings: the `empty` slot, falling back to `empty-text`. Not drawn while the table cannot be read yet, on the server and during hydration.",
3184
+ "name": "empty"
3185
+ },
2932
3186
  {
2933
3187
  "description": "One rule across the plot, under `gridlines`.",
2934
3188
  "name": "gridline"
@@ -2953,6 +3207,10 @@
2953
3207
  "description": "The readout: a polite live region that says the reading the keys moved to. Hide it visually.",
2954
3208
  "name": "live"
2955
3209
  },
3210
+ {
3211
+ "description": "The words in place of the drawing while `loading` is set and there are no readings: the `loading` slot, falling back to `loading-text`.",
3212
+ "name": "loading"
3213
+ },
2956
3214
  {
2957
3215
  "description": "The invisible point the tooltip is anchored to.",
2958
3216
  "name": "mark"
@@ -3038,6 +3296,16 @@
3038
3296
  "name": "tooltip-value"
3039
3297
  }
3040
3298
  ],
3299
+ "slots": [
3300
+ {
3301
+ "description": "Content shown in place of the drawing when the table has no readings, such as a link to add the first. Falls back to `empty-text`.",
3302
+ "name": "empty"
3303
+ },
3304
+ {
3305
+ "description": "Content shown in place of the drawing while `loading` is set and there are no readings yet. Falls back to `loading-text`.",
3306
+ "name": "loading"
3307
+ }
3308
+ ],
3041
3309
  "members": [
3042
3310
  {
3043
3311
  "kind": "field",
@@ -3436,6 +3704,70 @@
3436
3704
  ],
3437
3705
  "description": "What a pointer resting on a reading shows, above the top of the stack."
3438
3706
  },
3707
+ {
3708
+ "kind": "field",
3709
+ "name": "emptyText",
3710
+ "type": {
3711
+ "text": "string"
3712
+ },
3713
+ "default": "'No readings'",
3714
+ "description": "The words shown in place of the drawing when the table has no readings,\nand the fallback of the `empty` slot.",
3715
+ "attribute": "empty-text",
3716
+ "helix": {
3717
+ "words": true
3718
+ },
3719
+ "inheritedFrom": {
3720
+ "name": "MixinChartStatus",
3721
+ "module": "src/mixins/mixin-chart-status/mixin-chart-status.ts"
3722
+ }
3723
+ },
3724
+ {
3725
+ "kind": "field",
3726
+ "name": "loading",
3727
+ "type": {
3728
+ "text": "boolean"
3729
+ },
3730
+ "default": "false",
3731
+ "description": "Whether the readings are still on their way. The chart shows\n`loading-text` in place of an empty drawing until it has readings.\n\nReflected, so a stylesheet can treat the chart while it waits. A chart\nthat already has readings keeps drawing them, so a refresh does not\nblank it.",
3732
+ "attribute": "loading",
3733
+ "reflects": true,
3734
+ "inheritedFrom": {
3735
+ "name": "MixinChartStatus",
3736
+ "module": "src/mixins/mixin-chart-status/mixin-chart-status.ts"
3737
+ }
3738
+ },
3739
+ {
3740
+ "kind": "field",
3741
+ "name": "loadingText",
3742
+ "type": {
3743
+ "text": "string"
3744
+ },
3745
+ "default": "'Loading readings'",
3746
+ "description": "The words shown in place of the drawing while `loading` is set and\nthere are no readings yet, and the fallback of the `loading` slot.",
3747
+ "attribute": "loading-text",
3748
+ "helix": {
3749
+ "words": true
3750
+ },
3751
+ "inheritedFrom": {
3752
+ "name": "MixinChartStatus",
3753
+ "module": "src/mixins/mixin-chart-status/mixin-chart-status.ts"
3754
+ }
3755
+ },
3756
+ {
3757
+ "kind": "method",
3758
+ "name": "renderStatus",
3759
+ "privacy": "protected",
3760
+ "return": {
3761
+ "type": {
3762
+ "text": "TemplateResult | typeof nothing"
3763
+ }
3764
+ },
3765
+ "description": "What stands in the plot while there is nothing to draw: the `loading`\nline, the `empty` line, or nothing while the table cannot be read yet.\n\n`dir=\"auto\"`, so words in a right-to-left script read their own way in\na plot that holds itself left to right, as Scatter Chart's does.",
3766
+ "inheritedFrom": {
3767
+ "name": "MixinChartStatus",
3768
+ "module": "src/mixins/mixin-chart-status/mixin-chart-status.ts"
3769
+ }
3770
+ },
3439
3771
  {
3440
3772
  "kind": "field",
3441
3773
  "name": "source",
@@ -3459,6 +3791,19 @@
3459
3791
  "module": "src/mixins/mixin-chart-source/mixin-chart-source.ts"
3460
3792
  }
3461
3793
  },
3794
+ {
3795
+ "kind": "field",
3796
+ "name": "data",
3797
+ "type": {
3798
+ "text": "ChartData | undefined"
3799
+ },
3800
+ "default": "undefined",
3801
+ "description": "The readings as data, in the shape of a table, where the page has no\ntable to point `for` at. `for` wins where both are set.\n\n```js\nchart.data = {\n caption: 'Sessions by channel',\n columns: ['Month', 'Direct', 'Referral'],\n rows: [['Jan', 10, 4], ['Feb', 20, 8]],\n}\n```\n\nThe first column holds each row's label and every column after it a\nseries, as in a table. A cell is a number, words, `null` for a blank,\nor `{ value, text }` for a number shown as words, such as `$128k`. A\nnumber is shown in `locale`.\n\n**A table is still the better source where the page can show one**:\nit reads with no script and before hydration, and a reader can sort and\ncopy it. Data is drawn on the client only, so a server serves the\nframe, and the summary, the keys and the readout are then the whole of\nwhat a screen reader is given. Set a new object to redraw: the chart\ndoes not look inside the one it has.",
3802
+ "inheritedFrom": {
3803
+ "name": "MixinChartSource",
3804
+ "module": "src/mixins/mixin-chart-source/mixin-chart-source.ts"
3805
+ }
3806
+ },
3462
3807
  {
3463
3808
  "kind": "field",
3464
3809
  "name": "for",
@@ -3595,6 +3940,19 @@
3595
3940
  "module": "src/mixins/mixin-chart-source/mixin-chart-source.ts"
3596
3941
  }
3597
3942
  },
3943
+ {
3944
+ "kind": "field",
3945
+ "name": "readingsKnown",
3946
+ "type": {
3947
+ "text": "boolean"
3948
+ },
3949
+ "description": "Whether the readings have been looked for: false on the server and\nwhile hydrating, where no table is resolved and no data is read. A\nchart says it has no readings only once this is true.",
3950
+ "readonly": true,
3951
+ "inheritedFrom": {
3952
+ "name": "MixinChartSource",
3953
+ "module": "src/mixins/mixin-chart-source/mixin-chart-source.ts"
3954
+ }
3955
+ },
3598
3956
  {
3599
3957
  "kind": "field",
3600
3958
  "name": "sourceRows",
@@ -4154,6 +4512,45 @@
4154
4512
  "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.",
4155
4513
  "fieldName": "valueAxis"
4156
4514
  },
4515
+ {
4516
+ "name": "empty-text",
4517
+ "type": {
4518
+ "text": "string"
4519
+ },
4520
+ "default": "'No readings'",
4521
+ "description": "The words shown in place of the drawing when the table has no readings,\nand the fallback of the `empty` slot.",
4522
+ "fieldName": "emptyText",
4523
+ "inheritedFrom": {
4524
+ "name": "MixinChartStatus",
4525
+ "module": "src/mixins/mixin-chart-status/mixin-chart-status.ts"
4526
+ }
4527
+ },
4528
+ {
4529
+ "name": "loading",
4530
+ "type": {
4531
+ "text": "boolean"
4532
+ },
4533
+ "default": "false",
4534
+ "description": "Whether the readings are still on their way. The chart shows\n`loading-text` in place of an empty drawing until it has readings.\n\nReflected, so a stylesheet can treat the chart while it waits. A chart\nthat already has readings keeps drawing them, so a refresh does not\nblank it.",
4535
+ "fieldName": "loading",
4536
+ "inheritedFrom": {
4537
+ "name": "MixinChartStatus",
4538
+ "module": "src/mixins/mixin-chart-status/mixin-chart-status.ts"
4539
+ }
4540
+ },
4541
+ {
4542
+ "name": "loading-text",
4543
+ "type": {
4544
+ "text": "string"
4545
+ },
4546
+ "default": "'Loading readings'",
4547
+ "description": "The words shown in place of the drawing while `loading` is set and\nthere are no readings yet, and the fallback of the `loading` slot.",
4548
+ "fieldName": "loadingText",
4549
+ "inheritedFrom": {
4550
+ "name": "MixinChartStatus",
4551
+ "module": "src/mixins/mixin-chart-status/mixin-chart-status.ts"
4552
+ }
4553
+ },
4157
4554
  {
4158
4555
  "name": "for",
4159
4556
  "type": {
@@ -4208,6 +4605,10 @@
4208
4605
  }
4209
4606
  ],
4210
4607
  "mixins": [
4608
+ {
4609
+ "name": "MixinChartStatus",
4610
+ "package": "@fusion.dev/helix-core"
4611
+ },
4211
4612
  {
4212
4613
  "name": "MixinChartSource",
4213
4614
  "package": "@fusion.dev/helix-core"
@@ -6294,7 +6695,7 @@
6294
6695
  "declarations": [
6295
6696
  {
6296
6697
  "kind": "class",
6297
- "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.",
6698
+ "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.\n\n**`data` takes the readings as data** where the page has no table to point\n`for` at, in a table's shape: the column headings, then one row per reading\nwith its label first. A table is still the better source where the page can\nshow one, since it reads before any script runs.\n\n**A chart with nothing to draw says so.** A table with no readings shows\n`empty-text`, \"No readings\", in the plot, and `loading` shows `loading-text`\nthere until readings arrive. The `empty` and `loading` slots take markup in\ntheir place, such as a link to add the first reading.",
6298
6699
  "name": "HelixHeadlessBarChart",
6299
6700
  "cssProperties": [
6300
6701
  {
@@ -6335,6 +6736,10 @@
6335
6736
  "description": "The line the columns stand on.",
6336
6737
  "name": "baseline"
6337
6738
  },
6739
+ {
6740
+ "description": "The words in place of the drawing when the table has no readings: the `empty` slot, falling back to `empty-text`. Not drawn while the table cannot be read yet, on the server and during hydration.",
6741
+ "name": "empty"
6742
+ },
6338
6743
  {
6339
6744
  "description": "One gridline across the plot, drawn when `gridlines` is set.",
6340
6745
  "name": "gridline"
@@ -6363,6 +6768,10 @@
6363
6768
  "description": "The readout: a polite live region that says the reading the keys moved to. Hide it visually.",
6364
6769
  "name": "live"
6365
6770
  },
6771
+ {
6772
+ "description": "The words in place of the drawing while `loading` is set and there are no readings: the `loading` slot, falling back to `loading-text`.",
6773
+ "name": "loading"
6774
+ },
6366
6775
  {
6367
6776
  "description": "The invisible point the tooltip is anchored to.",
6368
6777
  "name": "mark"
@@ -6448,6 +6857,16 @@
6448
6857
  "name": "tooltip-value"
6449
6858
  }
6450
6859
  ],
6860
+ "slots": [
6861
+ {
6862
+ "description": "Content shown in place of the drawing when the table has no readings, such as a link to add the first. Falls back to `empty-text`.",
6863
+ "name": "empty"
6864
+ },
6865
+ {
6866
+ "description": "Content shown in place of the drawing while `loading` is set and there are no readings yet. Falls back to `loading-text`.",
6867
+ "name": "loading"
6868
+ }
6869
+ ],
6451
6870
  "members": [
6452
6871
  {
6453
6872
  "kind": "field",
@@ -6879,6 +7298,70 @@
6879
7298
  },
6880
7299
  "description": "What a pointer resting on a reading shows.\n\nA seam over `drawTooltip`, which holds the markup every chart shares. The\nusual reason to override is arrangement: every cell of the row is already\nthere, including the columns nothing was plotted from."
6881
7300
  },
7301
+ {
7302
+ "kind": "field",
7303
+ "name": "emptyText",
7304
+ "type": {
7305
+ "text": "string"
7306
+ },
7307
+ "default": "'No readings'",
7308
+ "description": "The words shown in place of the drawing when the table has no readings,\nand the fallback of the `empty` slot.",
7309
+ "attribute": "empty-text",
7310
+ "helix": {
7311
+ "words": true
7312
+ },
7313
+ "inheritedFrom": {
7314
+ "name": "MixinChartStatus",
7315
+ "module": "src/mixins/mixin-chart-status/mixin-chart-status.ts"
7316
+ }
7317
+ },
7318
+ {
7319
+ "kind": "field",
7320
+ "name": "loading",
7321
+ "type": {
7322
+ "text": "boolean"
7323
+ },
7324
+ "default": "false",
7325
+ "description": "Whether the readings are still on their way. The chart shows\n`loading-text` in place of an empty drawing until it has readings.\n\nReflected, so a stylesheet can treat the chart while it waits. A chart\nthat already has readings keeps drawing them, so a refresh does not\nblank it.",
7326
+ "attribute": "loading",
7327
+ "reflects": true,
7328
+ "inheritedFrom": {
7329
+ "name": "MixinChartStatus",
7330
+ "module": "src/mixins/mixin-chart-status/mixin-chart-status.ts"
7331
+ }
7332
+ },
7333
+ {
7334
+ "kind": "field",
7335
+ "name": "loadingText",
7336
+ "type": {
7337
+ "text": "string"
7338
+ },
7339
+ "default": "'Loading readings'",
7340
+ "description": "The words shown in place of the drawing while `loading` is set and\nthere are no readings yet, and the fallback of the `loading` slot.",
7341
+ "attribute": "loading-text",
7342
+ "helix": {
7343
+ "words": true
7344
+ },
7345
+ "inheritedFrom": {
7346
+ "name": "MixinChartStatus",
7347
+ "module": "src/mixins/mixin-chart-status/mixin-chart-status.ts"
7348
+ }
7349
+ },
7350
+ {
7351
+ "kind": "method",
7352
+ "name": "renderStatus",
7353
+ "privacy": "protected",
7354
+ "return": {
7355
+ "type": {
7356
+ "text": "TemplateResult | typeof nothing"
7357
+ }
7358
+ },
7359
+ "description": "What stands in the plot while there is nothing to draw: the `loading`\nline, the `empty` line, or nothing while the table cannot be read yet.\n\n`dir=\"auto\"`, so words in a right-to-left script read their own way in\na plot that holds itself left to right, as Scatter Chart's does.",
7360
+ "inheritedFrom": {
7361
+ "name": "MixinChartStatus",
7362
+ "module": "src/mixins/mixin-chart-status/mixin-chart-status.ts"
7363
+ }
7364
+ },
6882
7365
  {
6883
7366
  "kind": "field",
6884
7367
  "name": "source",
@@ -6902,6 +7385,19 @@
6902
7385
  "module": "src/mixins/mixin-chart-source/mixin-chart-source.ts"
6903
7386
  }
6904
7387
  },
7388
+ {
7389
+ "kind": "field",
7390
+ "name": "data",
7391
+ "type": {
7392
+ "text": "ChartData | undefined"
7393
+ },
7394
+ "default": "undefined",
7395
+ "description": "The readings as data, in the shape of a table, where the page has no\ntable to point `for` at. `for` wins where both are set.\n\n```js\nchart.data = {\n caption: 'Sessions by channel',\n columns: ['Month', 'Direct', 'Referral'],\n rows: [['Jan', 10, 4], ['Feb', 20, 8]],\n}\n```\n\nThe first column holds each row's label and every column after it a\nseries, as in a table. A cell is a number, words, `null` for a blank,\nor `{ value, text }` for a number shown as words, such as `$128k`. A\nnumber is shown in `locale`.\n\n**A table is still the better source where the page can show one**:\nit reads with no script and before hydration, and a reader can sort and\ncopy it. Data is drawn on the client only, so a server serves the\nframe, and the summary, the keys and the readout are then the whole of\nwhat a screen reader is given. Set a new object to redraw: the chart\ndoes not look inside the one it has.",
7396
+ "inheritedFrom": {
7397
+ "name": "MixinChartSource",
7398
+ "module": "src/mixins/mixin-chart-source/mixin-chart-source.ts"
7399
+ }
7400
+ },
6905
7401
  {
6906
7402
  "kind": "field",
6907
7403
  "name": "for",
@@ -7038,6 +7534,19 @@
7038
7534
  "module": "src/mixins/mixin-chart-source/mixin-chart-source.ts"
7039
7535
  }
7040
7536
  },
7537
+ {
7538
+ "kind": "field",
7539
+ "name": "readingsKnown",
7540
+ "type": {
7541
+ "text": "boolean"
7542
+ },
7543
+ "description": "Whether the readings have been looked for: false on the server and\nwhile hydrating, where no table is resolved and no data is read. A\nchart says it has no readings only once this is true.",
7544
+ "readonly": true,
7545
+ "inheritedFrom": {
7546
+ "name": "MixinChartSource",
7547
+ "module": "src/mixins/mixin-chart-source/mixin-chart-source.ts"
7548
+ }
7549
+ },
7041
7550
  {
7042
7551
  "kind": "field",
7043
7552
  "name": "sourceRows",
@@ -7604,6 +8113,45 @@
7604
8113
  "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.",
7605
8114
  "fieldName": "valueAxis"
7606
8115
  },
8116
+ {
8117
+ "name": "empty-text",
8118
+ "type": {
8119
+ "text": "string"
8120
+ },
8121
+ "default": "'No readings'",
8122
+ "description": "The words shown in place of the drawing when the table has no readings,\nand the fallback of the `empty` slot.",
8123
+ "fieldName": "emptyText",
8124
+ "inheritedFrom": {
8125
+ "name": "MixinChartStatus",
8126
+ "module": "src/mixins/mixin-chart-status/mixin-chart-status.ts"
8127
+ }
8128
+ },
8129
+ {
8130
+ "name": "loading",
8131
+ "type": {
8132
+ "text": "boolean"
8133
+ },
8134
+ "default": "false",
8135
+ "description": "Whether the readings are still on their way. The chart shows\n`loading-text` in place of an empty drawing until it has readings.\n\nReflected, so a stylesheet can treat the chart while it waits. A chart\nthat already has readings keeps drawing them, so a refresh does not\nblank it.",
8136
+ "fieldName": "loading",
8137
+ "inheritedFrom": {
8138
+ "name": "MixinChartStatus",
8139
+ "module": "src/mixins/mixin-chart-status/mixin-chart-status.ts"
8140
+ }
8141
+ },
8142
+ {
8143
+ "name": "loading-text",
8144
+ "type": {
8145
+ "text": "string"
8146
+ },
8147
+ "default": "'Loading readings'",
8148
+ "description": "The words shown in place of the drawing while `loading` is set and\nthere are no readings yet, and the fallback of the `loading` slot.",
8149
+ "fieldName": "loadingText",
8150
+ "inheritedFrom": {
8151
+ "name": "MixinChartStatus",
8152
+ "module": "src/mixins/mixin-chart-status/mixin-chart-status.ts"
8153
+ }
8154
+ },
7607
8155
  {
7608
8156
  "name": "for",
7609
8157
  "type": {
@@ -7658,6 +8206,10 @@
7658
8206
  }
7659
8207
  ],
7660
8208
  "mixins": [
8209
+ {
8210
+ "name": "MixinChartStatus",
8211
+ "package": "@fusion.dev/helix-core"
8212
+ },
7661
8213
  {
7662
8214
  "name": "MixinChartSource",
7663
8215
  "package": "@fusion.dev/helix-core"
@@ -8399,7 +8951,7 @@
8399
8951
  "declarations": [
8400
8952
  {
8401
8953
  "kind": "class",
8402
- "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.",
8954
+ "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.",
8403
8955
  "name": "HelixHeadlessBreadcrumb",
8404
8956
  "cssParts": [
8405
8957
  {
@@ -8964,7 +9516,7 @@
8964
9516
  "declarations": [
8965
9517
  {
8966
9518
  "kind": "class",
8967
- "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.",
9519
+ "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.",
8968
9520
  "name": "HelixHeadlessBreadcrumbs",
8969
9521
  "cssParts": [
8970
9522
  {
@@ -9088,6 +9640,13 @@
9088
9640
  "description": "How many crumbs drawn from `items` are folded away, or 0.",
9089
9641
  "readonly": true
9090
9642
  },
9643
+ {
9644
+ "kind": "field",
9645
+ "name": "markLast",
9646
+ "privacy": "private",
9647
+ "readonly": true,
9648
+ "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."
9649
+ },
9091
9650
  {
9092
9651
  "kind": "method",
9093
9652
  "name": "renderItems",
@@ -53802,6 +54361,31 @@
53802
54361
  "kind": "javascript-module",
53803
54362
  "path": "src/dialog/description.ts",
53804
54363
  "declarations": [
54364
+ {
54365
+ "kind": "function",
54366
+ "name": "wordsAmong",
54367
+ "return": {
54368
+ "type": {
54369
+ "text": "Element[]"
54370
+ }
54371
+ },
54372
+ "parameters": [
54373
+ {
54374
+ "name": "elements",
54375
+ "type": {
54376
+ "text": "readonly Element[]"
54377
+ }
54378
+ },
54379
+ {
54380
+ "name": "skip",
54381
+ "default": "null",
54382
+ "type": {
54383
+ "text": "Element | null"
54384
+ }
54385
+ }
54386
+ ],
54387
+ "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."
54388
+ },
53805
54389
  {
53806
54390
  "kind": "function",
53807
54391
  "name": "wordsIn",
@@ -53822,6 +54406,14 @@
53822
54406
  }
53823
54407
  ],
53824
54408
  "exports": [
54409
+ {
54410
+ "kind": "js",
54411
+ "name": "wordsAmong",
54412
+ "declaration": {
54413
+ "name": "wordsAmong",
54414
+ "module": "src/dialog/description.ts"
54415
+ }
54416
+ },
53825
54417
  {
53826
54418
  "kind": "js",
53827
54419
  "name": "wordsIn",
@@ -53853,7 +54445,7 @@
53853
54445
  "declarations": [
53854
54446
  {
53855
54447
  "kind": "class",
53856
- "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`.",
54448
+ "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.",
53857
54449
  "name": "HelixHeadlessDialog",
53858
54450
  "cssParts": [
53859
54451
  {
@@ -53930,7 +54522,7 @@
53930
54522
  "type": {
53931
54523
  "text": "'any' | 'closerequest' | 'none' | undefined"
53932
54524
  },
53933
- "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.",
54525
+ "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.",
53934
54526
  "attribute": "closedby",
53935
54527
  "reflects": true
53936
54528
  },
@@ -54716,7 +55308,7 @@
54716
55308
  "type": {
54717
55309
  "text": "'any' | 'closerequest' | 'none' | undefined"
54718
55310
  },
54719
- "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.",
55311
+ "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.",
54720
55312
  "fieldName": "closedBy"
54721
55313
  },
54722
55314
  {
@@ -55859,6 +56451,19 @@
55859
56451
  "module": "src/mixins/mixin-chart-source/mixin-chart-source.ts"
55860
56452
  }
55861
56453
  },
56454
+ {
56455
+ "kind": "field",
56456
+ "name": "data",
56457
+ "type": {
56458
+ "text": "ChartData | undefined"
56459
+ },
56460
+ "default": "undefined",
56461
+ "description": "The readings as data, in the shape of a table, where the page has no\ntable to point `for` at. `for` wins where both are set.\n\n```js\nchart.data = {\n caption: 'Sessions by channel',\n columns: ['Month', 'Direct', 'Referral'],\n rows: [['Jan', 10, 4], ['Feb', 20, 8]],\n}\n```\n\nThe first column holds each row's label and every column after it a\nseries, as in a table. A cell is a number, words, `null` for a blank,\nor `{ value, text }` for a number shown as words, such as `$128k`. A\nnumber is shown in `locale`.\n\n**A table is still the better source where the page can show one**:\nit reads with no script and before hydration, and a reader can sort and\ncopy it. Data is drawn on the client only, so a server serves the\nframe, and the summary, the keys and the readout are then the whole of\nwhat a screen reader is given. Set a new object to redraw: the chart\ndoes not look inside the one it has.",
56462
+ "inheritedFrom": {
56463
+ "name": "MixinChartSource",
56464
+ "module": "src/mixins/mixin-chart-source/mixin-chart-source.ts"
56465
+ }
56466
+ },
55862
56467
  {
55863
56468
  "kind": "field",
55864
56469
  "name": "for",
@@ -55995,6 +56600,19 @@
55995
56600
  "module": "src/mixins/mixin-chart-source/mixin-chart-source.ts"
55996
56601
  }
55997
56602
  },
56603
+ {
56604
+ "kind": "field",
56605
+ "name": "readingsKnown",
56606
+ "type": {
56607
+ "text": "boolean"
56608
+ },
56609
+ "description": "Whether the readings have been looked for: false on the server and\nwhile hydrating, where no table is resolved and no data is read. A\nchart says it has no readings only once this is true.",
56610
+ "readonly": true,
56611
+ "inheritedFrom": {
56612
+ "name": "MixinChartSource",
56613
+ "module": "src/mixins/mixin-chart-source/mixin-chart-source.ts"
56614
+ }
56615
+ },
55998
56616
  {
55999
56617
  "kind": "field",
56000
56618
  "name": "sourceRows",
@@ -56710,7 +57328,7 @@
56710
57328
  "declarations": [
56711
57329
  {
56712
57330
  "kind": "class",
56713
- "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```",
57331
+ "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```",
56714
57332
  "name": "HelixHeadlessDrawer",
56715
57333
  "cssProperties": [
56716
57334
  {
@@ -56805,6 +57423,16 @@
56805
57423
  "attribute": "dismissible",
56806
57424
  "reflects": true
56807
57425
  },
57426
+ {
57427
+ "kind": "field",
57428
+ "name": "refusesDismissal",
57429
+ "type": {
57430
+ "text": "boolean"
57431
+ },
57432
+ "privacy": "private",
57433
+ "description": "Whether a request to dismiss the drawer, by Escape or a swipe, is refused.",
57434
+ "readonly": true
57435
+ },
56808
57436
  {
56809
57437
  "kind": "field",
56810
57438
  "name": "dismissLabel",
@@ -56841,6 +57469,16 @@
56841
57469
  "description": "Accessible name for the panel. When it is empty, the heading in the\n`header` slot names the panel.",
56842
57470
  "attribute": "label"
56843
57471
  },
57472
+ {
57473
+ "kind": "field",
57474
+ "name": "modal",
57475
+ "type": {
57476
+ "text": "boolean"
57477
+ },
57478
+ "default": "true",
57479
+ "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.",
57480
+ "attribute": "modal"
57481
+ },
56844
57482
  {
56845
57483
  "kind": "field",
56846
57484
  "name": "aria",
@@ -56850,13 +57488,14 @@
56850
57488
  },
56851
57489
  {
56852
57490
  "kind": "field",
56853
- "name": "modal",
57491
+ "name": "persistent",
56854
57492
  "type": {
56855
57493
  "text": "boolean"
56856
57494
  },
56857
- "default": "true",
56858
- "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.",
56859
- "attribute": "modal"
57495
+ "default": "false",
57496
+ "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.",
57497
+ "attribute": "persistent",
57498
+ "reflects": true
56860
57499
  },
56861
57500
  {
56862
57501
  "kind": "field",
@@ -57184,6 +57823,27 @@
57184
57823
  },
57185
57824
  "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."
57186
57825
  },
57826
+ {
57827
+ "kind": "field",
57828
+ "name": "describedByBody",
57829
+ "type": {
57830
+ "text": "boolean"
57831
+ },
57832
+ "privacy": "private",
57833
+ "default": "false",
57834
+ "description": "Whether the body's words are what currently describe the panel."
57835
+ },
57836
+ {
57837
+ "kind": "method",
57838
+ "name": "describeByBody",
57839
+ "privacy": "private",
57840
+ "return": {
57841
+ "type": {
57842
+ "text": "void"
57843
+ }
57844
+ },
57845
+ "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."
57846
+ },
57187
57847
  {
57188
57848
  "kind": "method",
57189
57849
  "name": "renderDismissIcon",
@@ -57747,6 +58407,15 @@
57747
58407
  "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.",
57748
58408
  "fieldName": "modal"
57749
58409
  },
58410
+ {
58411
+ "name": "persistent",
58412
+ "type": {
58413
+ "text": "boolean"
58414
+ },
58415
+ "default": "false",
58416
+ "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.",
58417
+ "fieldName": "persistent"
58418
+ },
57750
58419
  {
57751
58420
  "name": "placement",
57752
58421
  "type": {
@@ -72946,7 +73615,7 @@
72946
73615
  "text": "boolean"
72947
73616
  },
72948
73617
  "privacy": "private",
72949
- "description": "Whether this render can tell a table with no readings from one it has not\nresolved yet.\n\n**Unknown is not empty, which is what an empty state must never say.**\n`for` names an id and resolving an id wants a document, so a server has\nnone and a hydrating render must not look either. Without this the server\ndrew \"No readings\" over a table holding ninety days of them, a crawler read\nthat sentence, and the strip flipped to a full one on hydration: the fault\n`MixinCollection` names for a slotted collection, arriving through the one\nchannel that mixin cannot see.\n\nThe same shape as `childrenKnown`, asked of a tree that can answer about\nids rather than of one that holds children. An id that resolves to nothing\nin a browser is still known, and still empty: a `for` naming no table\nshould say so rather than sit blank, which is why this asks\n`searchableById` and not `elementById`.",
73618
+ "description": "Whether this render can tell a table with no readings from one it has not\nresolved yet.\n\n**Unknown is not empty, which is what an empty state must never say.**\n`for` names an id and resolving an id wants a document, so a server has\nnone and a hydrating render must not look either. Without this the server\ndrew \"No readings\" over a table holding ninety days of them, a crawler read\nthat sentence, and the strip flipped to a full one on hydration: the fault\n`MixinCollection` names for a slotted collection, arriving through the one\nchannel that mixin cannot see.\n\nThe same shape as `childrenKnown`, asked of a tree that can answer about\nids rather than of one that holds children. An id that resolves to nothing\nin a browser is still known, and still empty: a `for` naming no table\nshould say so rather than sit blank, which is why this asks\n`searchableById` and not `elementById`.\n\n`readingsKnown` asks it for every chart, and for `data` too, which a\nserver does not draw.",
72950
73619
  "readonly": true
72951
73620
  },
72952
73621
  {
@@ -73146,6 +73815,19 @@
73146
73815
  "module": "src/mixins/mixin-chart-source/mixin-chart-source.ts"
73147
73816
  }
73148
73817
  },
73818
+ {
73819
+ "kind": "field",
73820
+ "name": "data",
73821
+ "type": {
73822
+ "text": "ChartData | undefined"
73823
+ },
73824
+ "default": "undefined",
73825
+ "description": "The readings as data, in the shape of a table, where the page has no\ntable to point `for` at. `for` wins where both are set.\n\n```js\nchart.data = {\n caption: 'Sessions by channel',\n columns: ['Month', 'Direct', 'Referral'],\n rows: [['Jan', 10, 4], ['Feb', 20, 8]],\n}\n```\n\nThe first column holds each row's label and every column after it a\nseries, as in a table. A cell is a number, words, `null` for a blank,\nor `{ value, text }` for a number shown as words, such as `$128k`. A\nnumber is shown in `locale`.\n\n**A table is still the better source where the page can show one**:\nit reads with no script and before hydration, and a reader can sort and\ncopy it. Data is drawn on the client only, so a server serves the\nframe, and the summary, the keys and the readout are then the whole of\nwhat a screen reader is given. Set a new object to redraw: the chart\ndoes not look inside the one it has.",
73826
+ "inheritedFrom": {
73827
+ "name": "MixinChartSource",
73828
+ "module": "src/mixins/mixin-chart-source/mixin-chart-source.ts"
73829
+ }
73830
+ },
73149
73831
  {
73150
73832
  "kind": "field",
73151
73833
  "name": "for",
@@ -73282,6 +73964,19 @@
73282
73964
  "module": "src/mixins/mixin-chart-source/mixin-chart-source.ts"
73283
73965
  }
73284
73966
  },
73967
+ {
73968
+ "kind": "field",
73969
+ "name": "readingsKnown",
73970
+ "type": {
73971
+ "text": "boolean"
73972
+ },
73973
+ "description": "Whether the readings have been looked for: false on the server and\nwhile hydrating, where no table is resolved and no data is read. A\nchart says it has no readings only once this is true.",
73974
+ "readonly": true,
73975
+ "inheritedFrom": {
73976
+ "name": "MixinChartSource",
73977
+ "module": "src/mixins/mixin-chart-source/mixin-chart-source.ts"
73978
+ }
73979
+ },
73285
73980
  {
73286
73981
  "kind": "field",
73287
73982
  "name": "sourceRows",
@@ -82633,7 +83328,7 @@
82633
83328
  "declarations": [
82634
83329
  {
82635
83330
  "kind": "class",
82636
- "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.",
83331
+ "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.",
82637
83332
  "name": "HelixHeadlessLightbox",
82638
83333
  "cssProperties": [
82639
83334
  {
@@ -83017,6 +83712,13 @@
83017
83712
  "readonly": true,
83018
83713
  "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, })"
83019
83714
  },
83715
+ {
83716
+ "kind": "field",
83717
+ "name": "scope",
83718
+ "privacy": "protected",
83719
+ "readonly": true,
83720
+ "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, })"
83721
+ },
83020
83722
  {
83021
83723
  "kind": "field",
83022
83724
  "name": "zoomer",
@@ -83257,6 +83959,25 @@
83257
83959
  ],
83258
83960
  "description": "`+` and `-` zoom in and out by half again, and `0` puts the item back. Returns whether it was one."
83259
83961
  },
83962
+ {
83963
+ "kind": "method",
83964
+ "name": "panKey",
83965
+ "privacy": "private",
83966
+ "return": {
83967
+ "type": {
83968
+ "text": "boolean"
83969
+ }
83970
+ },
83971
+ "parameters": [
83972
+ {
83973
+ "name": "key",
83974
+ "type": {
83975
+ "text": "string"
83976
+ }
83977
+ }
83978
+ ],
83979
+ "description": "The arrow keys on a zoomed item, which move about it rather than to\nanother item. Returns whether it was one."
83980
+ },
83260
83981
  {
83261
83982
  "kind": "method",
83262
83983
  "name": "zoomIn",
@@ -83310,7 +84031,60 @@
83310
84031
  "name": "handleBackdrop",
83311
84032
  "privacy": "private",
83312
84033
  "readonly": true,
83313
- "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."
84034
+ "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."
84035
+ },
84036
+ {
84037
+ "kind": "field",
84038
+ "name": "pressedAt",
84039
+ "type": {
84040
+ "text": "{ x: number; y: number } | undefined"
84041
+ },
84042
+ "privacy": "private",
84043
+ "description": "Where the last press began, so a press that dragged closes nothing."
84044
+ },
84045
+ {
84046
+ "kind": "field",
84047
+ "name": "handlePointerDown",
84048
+ "privacy": "private",
84049
+ "readonly": true
84050
+ },
84051
+ {
84052
+ "kind": "method",
84053
+ "name": "dragged",
84054
+ "privacy": "private",
84055
+ "return": {
84056
+ "type": {
84057
+ "text": "boolean"
84058
+ }
84059
+ },
84060
+ "parameters": [
84061
+ {
84062
+ "name": "event",
84063
+ "type": {
84064
+ "text": "MouseEvent"
84065
+ }
84066
+ }
84067
+ ],
84068
+ "description": "Whether the press moved further than a click does, as a swipe or a pan does."
84069
+ },
84070
+ {
84071
+ "kind": "method",
84072
+ "name": "onEmptyArea",
84073
+ "privacy": "private",
84074
+ "return": {
84075
+ "type": {
84076
+ "text": "boolean"
84077
+ }
84078
+ },
84079
+ "parameters": [
84080
+ {
84081
+ "name": "event",
84082
+ "type": {
84083
+ "text": "MouseEvent"
84084
+ }
84085
+ }
84086
+ ],
84087
+ "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."
83314
84088
  },
83315
84089
  {
83316
84090
  "kind": "method",
@@ -84439,6 +85213,24 @@
84439
85213
  ],
84440
85214
  "description": "Zooms to `scale` about the middle of the box, held to the range."
84441
85215
  },
85216
+ {
85217
+ "kind": "method",
85218
+ "name": "panBy",
85219
+ "return": {
85220
+ "type": {
85221
+ "text": "boolean"
85222
+ }
85223
+ },
85224
+ "parameters": [
85225
+ {
85226
+ "name": "by",
85227
+ "type": {
85228
+ "text": "Offset"
85229
+ }
85230
+ }
85231
+ ],
85232
+ "description": "Moves a zoomed item by `by`, in pixels, never so far that an edge comes\ninside the box. Returns whether it moved."
85233
+ },
84442
85234
  {
84443
85235
  "kind": "method",
84444
85236
  "name": "reset",
@@ -84811,7 +85603,7 @@
84811
85603
  "declarations": [
84812
85604
  {
84813
85605
  "kind": "class",
84814
- "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.",
85606
+ "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.\n\n**`data` takes the readings as data** where the page has no table to point\n`for` at, in a table's shape: the column headings, then one row per reading\nwith its label first. A table is still the better source where the page can\nshow one, since it reads before any script runs.\n\n**A chart with nothing to draw says so.** A table with no readings shows\n`empty-text`, \"No readings\", in the plot, and `loading` shows `loading-text`\nthere until readings arrive. The `empty` and `loading` slots take markup in\ntheir place, such as a link to add the first reading.",
84815
85607
  "name": "HelixHeadlessLineChart",
84816
85608
  "cssProperties": [
84817
85609
  {
@@ -84844,6 +85636,10 @@
84844
85636
  "description": "The rule at zero, where zero is inside the range.",
84845
85637
  "name": "baseline"
84846
85638
  },
85639
+ {
85640
+ "description": "The words in place of the drawing when the table has no readings: the `empty` slot, falling back to `empty-text`. Not drawn while the table cannot be read yet, on the server and during hydration.",
85641
+ "name": "empty"
85642
+ },
84847
85643
  {
84848
85644
  "description": "One rule across the plot, under `gridlines`.",
84849
85645
  "name": "gridline"
@@ -84872,6 +85668,10 @@
84872
85668
  "description": "The readout: a polite live region that says the reading the keys moved to. Hide it visually.",
84873
85669
  "name": "live"
84874
85670
  },
85671
+ {
85672
+ "description": "The words in place of the drawing while `loading` is set and there are no readings: the `loading` slot, falling back to `loading-text`.",
85673
+ "name": "loading"
85674
+ },
84875
85675
  {
84876
85676
  "description": "The invisible point the tooltip is anchored to.",
84877
85677
  "name": "mark"
@@ -84969,6 +85769,16 @@
84969
85769
  "name": "tooltip-value"
84970
85770
  }
84971
85771
  ],
85772
+ "slots": [
85773
+ {
85774
+ "description": "Content shown in place of the drawing when the table has no readings, such as a link to add the first. Falls back to `empty-text`.",
85775
+ "name": "empty"
85776
+ },
85777
+ {
85778
+ "description": "Content shown in place of the drawing while `loading` is set and there are no readings yet. Falls back to `loading-text`.",
85779
+ "name": "loading"
85780
+ }
85781
+ ],
84972
85782
  "members": [
84973
85783
  {
84974
85784
  "kind": "field",
@@ -85429,6 +86239,70 @@
85429
86239
  },
85430
86240
  "description": "What a pointer resting on a reading shows.\n\nA seam over `drawTooltip`, which holds the markup every chart shares. The\nusual reason to override is arrangement: every cell of the row is already\nthere, including the columns nothing was plotted from."
85431
86241
  },
86242
+ {
86243
+ "kind": "field",
86244
+ "name": "emptyText",
86245
+ "type": {
86246
+ "text": "string"
86247
+ },
86248
+ "default": "'No readings'",
86249
+ "description": "The words shown in place of the drawing when the table has no readings,\nand the fallback of the `empty` slot.",
86250
+ "attribute": "empty-text",
86251
+ "helix": {
86252
+ "words": true
86253
+ },
86254
+ "inheritedFrom": {
86255
+ "name": "MixinChartStatus",
86256
+ "module": "src/mixins/mixin-chart-status/mixin-chart-status.ts"
86257
+ }
86258
+ },
86259
+ {
86260
+ "kind": "field",
86261
+ "name": "loading",
86262
+ "type": {
86263
+ "text": "boolean"
86264
+ },
86265
+ "default": "false",
86266
+ "description": "Whether the readings are still on their way. The chart shows\n`loading-text` in place of an empty drawing until it has readings.\n\nReflected, so a stylesheet can treat the chart while it waits. A chart\nthat already has readings keeps drawing them, so a refresh does not\nblank it.",
86267
+ "attribute": "loading",
86268
+ "reflects": true,
86269
+ "inheritedFrom": {
86270
+ "name": "MixinChartStatus",
86271
+ "module": "src/mixins/mixin-chart-status/mixin-chart-status.ts"
86272
+ }
86273
+ },
86274
+ {
86275
+ "kind": "field",
86276
+ "name": "loadingText",
86277
+ "type": {
86278
+ "text": "string"
86279
+ },
86280
+ "default": "'Loading readings'",
86281
+ "description": "The words shown in place of the drawing while `loading` is set and\nthere are no readings yet, and the fallback of the `loading` slot.",
86282
+ "attribute": "loading-text",
86283
+ "helix": {
86284
+ "words": true
86285
+ },
86286
+ "inheritedFrom": {
86287
+ "name": "MixinChartStatus",
86288
+ "module": "src/mixins/mixin-chart-status/mixin-chart-status.ts"
86289
+ }
86290
+ },
86291
+ {
86292
+ "kind": "method",
86293
+ "name": "renderStatus",
86294
+ "privacy": "protected",
86295
+ "return": {
86296
+ "type": {
86297
+ "text": "TemplateResult | typeof nothing"
86298
+ }
86299
+ },
86300
+ "description": "What stands in the plot while there is nothing to draw: the `loading`\nline, the `empty` line, or nothing while the table cannot be read yet.\n\n`dir=\"auto\"`, so words in a right-to-left script read their own way in\na plot that holds itself left to right, as Scatter Chart's does.",
86301
+ "inheritedFrom": {
86302
+ "name": "MixinChartStatus",
86303
+ "module": "src/mixins/mixin-chart-status/mixin-chart-status.ts"
86304
+ }
86305
+ },
85432
86306
  {
85433
86307
  "kind": "field",
85434
86308
  "name": "source",
@@ -85452,6 +86326,19 @@
85452
86326
  "module": "src/mixins/mixin-chart-source/mixin-chart-source.ts"
85453
86327
  }
85454
86328
  },
86329
+ {
86330
+ "kind": "field",
86331
+ "name": "data",
86332
+ "type": {
86333
+ "text": "ChartData | undefined"
86334
+ },
86335
+ "default": "undefined",
86336
+ "description": "The readings as data, in the shape of a table, where the page has no\ntable to point `for` at. `for` wins where both are set.\n\n```js\nchart.data = {\n caption: 'Sessions by channel',\n columns: ['Month', 'Direct', 'Referral'],\n rows: [['Jan', 10, 4], ['Feb', 20, 8]],\n}\n```\n\nThe first column holds each row's label and every column after it a\nseries, as in a table. A cell is a number, words, `null` for a blank,\nor `{ value, text }` for a number shown as words, such as `$128k`. A\nnumber is shown in `locale`.\n\n**A table is still the better source where the page can show one**:\nit reads with no script and before hydration, and a reader can sort and\ncopy it. Data is drawn on the client only, so a server serves the\nframe, and the summary, the keys and the readout are then the whole of\nwhat a screen reader is given. Set a new object to redraw: the chart\ndoes not look inside the one it has.",
86337
+ "inheritedFrom": {
86338
+ "name": "MixinChartSource",
86339
+ "module": "src/mixins/mixin-chart-source/mixin-chart-source.ts"
86340
+ }
86341
+ },
85455
86342
  {
85456
86343
  "kind": "field",
85457
86344
  "name": "for",
@@ -85588,6 +86475,19 @@
85588
86475
  "module": "src/mixins/mixin-chart-source/mixin-chart-source.ts"
85589
86476
  }
85590
86477
  },
86478
+ {
86479
+ "kind": "field",
86480
+ "name": "readingsKnown",
86481
+ "type": {
86482
+ "text": "boolean"
86483
+ },
86484
+ "description": "Whether the readings have been looked for: false on the server and\nwhile hydrating, where no table is resolved and no data is read. A\nchart says it has no readings only once this is true.",
86485
+ "readonly": true,
86486
+ "inheritedFrom": {
86487
+ "name": "MixinChartSource",
86488
+ "module": "src/mixins/mixin-chart-source/mixin-chart-source.ts"
86489
+ }
86490
+ },
85591
86491
  {
85592
86492
  "kind": "field",
85593
86493
  "name": "sourceRows",
@@ -86155,6 +87055,45 @@
86155
87055
  "description": "Whether the range always includes zero.\n\nAbsent measures from the data's own extent, which is what a line is for.\nSet it where the distance from nothing is the point rather than the shape,\nand accept that a series which never approaches zero becomes a flat rule\nnear the top of the box.",
86156
87056
  "fieldName": "zero"
86157
87057
  },
87058
+ {
87059
+ "name": "empty-text",
87060
+ "type": {
87061
+ "text": "string"
87062
+ },
87063
+ "default": "'No readings'",
87064
+ "description": "The words shown in place of the drawing when the table has no readings,\nand the fallback of the `empty` slot.",
87065
+ "fieldName": "emptyText",
87066
+ "inheritedFrom": {
87067
+ "name": "MixinChartStatus",
87068
+ "module": "src/mixins/mixin-chart-status/mixin-chart-status.ts"
87069
+ }
87070
+ },
87071
+ {
87072
+ "name": "loading",
87073
+ "type": {
87074
+ "text": "boolean"
87075
+ },
87076
+ "default": "false",
87077
+ "description": "Whether the readings are still on their way. The chart shows\n`loading-text` in place of an empty drawing until it has readings.\n\nReflected, so a stylesheet can treat the chart while it waits. A chart\nthat already has readings keeps drawing them, so a refresh does not\nblank it.",
87078
+ "fieldName": "loading",
87079
+ "inheritedFrom": {
87080
+ "name": "MixinChartStatus",
87081
+ "module": "src/mixins/mixin-chart-status/mixin-chart-status.ts"
87082
+ }
87083
+ },
87084
+ {
87085
+ "name": "loading-text",
87086
+ "type": {
87087
+ "text": "string"
87088
+ },
87089
+ "default": "'Loading readings'",
87090
+ "description": "The words shown in place of the drawing while `loading` is set and\nthere are no readings yet, and the fallback of the `loading` slot.",
87091
+ "fieldName": "loadingText",
87092
+ "inheritedFrom": {
87093
+ "name": "MixinChartStatus",
87094
+ "module": "src/mixins/mixin-chart-status/mixin-chart-status.ts"
87095
+ }
87096
+ },
86158
87097
  {
86159
87098
  "name": "for",
86160
87099
  "type": {
@@ -86209,6 +87148,10 @@
86209
87148
  }
86210
87149
  ],
86211
87150
  "mixins": [
87151
+ {
87152
+ "name": "MixinChartStatus",
87153
+ "package": "@fusion.dev/helix-core"
87154
+ },
86212
87155
  {
86213
87156
  "name": "MixinChartSource",
86214
87157
  "package": "@fusion.dev/helix-core"
@@ -91556,7 +92499,7 @@
91556
92499
  "declarations": [
91557
92500
  {
91558
92501
  "kind": "class",
91559
- "description": "Draws two concentric circles: a track and a moving arc. The track shows the\narc as a proportion of a whole, and costs one element.\n\n**The center is a slot, empty by default.** Put your logo there once, where\nyour app wraps the loader. When nothing is slotted, nothing extra is\nrendered.\n\nSlotted content does not rotate. Only the arc moves, so a logo stays\nreadable.\n\nThe role is set on the host through `ElementInternals`. A `role` in the\nshadow root would leave the host itself without a role in the light DOM, and\na `role` attribute on the host would be missing from React server-rendered\nmarkup.\n\n**`for` names the region being loaded**, and the loader sets\n`aria-busy=\"true\"` on it for as long as the loader is on the page, so a\nscreen reader waits for the region rather than reading it half filled. Two\nloaders in one region hold it busy until the last one leaves. A region drawn\nafter the loader is marked when it arrives.\n\n**`delay` keeps a quick load from flashing a loader.** The loader stays\nhidden, and silent, for that many milliseconds, and appears only if the work\nis still going. While it waits it carries `:state(waiting)`.",
92502
+ "description": "Draws two concentric circles: a track and a moving arc. The track shows the\narc as a proportion of a whole, and costs one element.\n\n**For work whose length is known, use `Progress` with `shape=\"ring\"`.** It\ndraws the same ring filled to the value, says the value as a progress bar\ndoes, and says when the work is complete. A loader claims no proportion, so\nit takes no value.\n\n**The center is a slot, empty by default.** Put your logo there once, where\nyour app wraps the loader. When nothing is slotted, nothing extra is\nrendered.\n\nSlotted content does not rotate. Only the arc moves, so a logo stays\nreadable.\n\nThe role is set on the host through `ElementInternals`. A `role` in the\nshadow root would leave the host itself without a role in the light DOM, and\na `role` attribute on the host would be missing from React server-rendered\nmarkup.\n\n**`for` names the region being loaded**, and the loader sets\n`aria-busy=\"true\"` on it for as long as the loader is on the page, so a\nscreen reader waits for the region rather than reading it half filled. Two\nloaders in one region hold it busy until the last one leaves. A region drawn\nafter the loader is marked when it arrives.\n\n**`delay` keeps a quick load from flashing a loader.** The loader stays\nhidden, and silent, for that many milliseconds, and appears only if the work\nis still going. While it waits it carries `:state(waiting)`.",
91560
92503
  "name": "HelixHeadlessLoader",
91561
92504
  "cssParts": [
91562
92505
  {
@@ -106127,7 +107070,7 @@
106127
107070
  "declarations": [
106128
107071
  {
106129
107072
  "kind": "class",
106130
- "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.",
107073
+ "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.",
106131
107074
  "name": "HelixHeadlessNavigation",
106132
107075
  "cssParts": [
106133
107076
  {
@@ -106165,7 +107108,7 @@
106165
107108
  "name": "indicator",
106166
107109
  "privacy": "private",
106167
107110
  "readonly": true,
106168
- "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'), })"
107111
+ "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'), })"
106169
107112
  },
106170
107113
  {
106171
107114
  "kind": "field",
@@ -106230,7 +107173,7 @@
106230
107173
  "text": "HTMLElement[]"
106231
107174
  },
106232
107175
  "privacy": "private",
106233
- "description": "The destinations the consumer slotted.",
107176
+ "description": "The destinations the consumer slotted, and the items of a slotted list in\nplace of the list.",
106234
107177
  "readonly": true
106235
107178
  },
106236
107179
  {
@@ -108468,7 +109411,7 @@
108468
109411
  "declarations": [
108469
109412
  {
108470
109413
  "kind": "class",
108471
- "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.",
109414
+ "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.",
108472
109415
  "name": "HelixHeadlessNotifications",
108473
109416
  "cssParts": [
108474
109417
  {
@@ -108799,6 +109742,25 @@
108799
109742
  "readonly": true,
108800
109743
  "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."
108801
109744
  },
109745
+ {
109746
+ "kind": "method",
109747
+ "name": "leave",
109748
+ "privacy": "private",
109749
+ "return": {
109750
+ "type": {
109751
+ "text": "void"
109752
+ }
109753
+ },
109754
+ "parameters": [
109755
+ {
109756
+ "name": "event",
109757
+ "type": {
109758
+ "text": "KeyboardEvent"
109759
+ }
109760
+ }
109761
+ ],
109762
+ "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."
109763
+ },
108802
109764
  {
108803
109765
  "kind": "method",
108804
109766
  "name": "rove",
@@ -121960,7 +122922,7 @@
121960
122922
  "declarations": [
121961
122923
  {
121962
122924
  "kind": "class",
121963
- "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```",
122925
+ "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```",
121964
122926
  "name": "HelixHeadlessPopover",
121965
122927
  "cssProperties": [
121966
122928
  {
@@ -122273,7 +123235,7 @@
122273
123235
  },
122274
123236
  "privacy": "private",
122275
123237
  "default": "false",
122276
- "description": "Whether a reader has pressed the trigger, which is after any hydration."
123238
+ "description": "Whether the trigger may be told, from a frame after the first render or a reader's press."
122277
123239
  },
122278
123240
  {
122279
123241
  "kind": "field",
@@ -122293,7 +123255,7 @@
122293
123255
  "text": "void"
122294
123256
  }
122295
123257
  },
122296
- "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."
123258
+ "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."
122297
123259
  },
122298
123260
  {
122299
123261
  "kind": "field",
@@ -123013,7 +123975,7 @@
123013
123975
  "declarations": [
123014
123976
  {
123015
123977
  "kind": "class",
123016
- "description": "Determinate by default. Set `indeterminate` for a task whose total is not\nknown yet. Use `Loader` for a short wait or one with no place of its own on\nthe page.\n\nThe indeterminate bar runs a segment across the track and does not fill, so\nit shows that work is happening without claiming a proportion.\n`aria-valuenow` is omitted in that state, which is the platform's signal for\nthe same thing.\n\nThe fill is a fraction of the track, written as a custom property.\n\n**Reaching `max` is said and sent.** When the value arrives at `max` from\nbelow, the bar says `complete-label`, \"Complete\" by default, in a polite\n`live` region and sends `helix-complete`, so a reader hears that the work is\ndone and a page can move on. A bar that starts full says nothing, and an\nempty `complete-label` keeps it quiet. The `complete` custom state is set\nwhile the bar is full.",
123978
+ "description": "Determinate by default. Set `indeterminate` for a task whose total is not\nknown yet. Use `Loader` for a short wait or one with no place of its own on\nthe page.\n\nThe indeterminate bar runs a segment across the track and does not fill, so\nit shows that work is happening without claiming a proportion.\n`aria-valuenow` is omitted in that state, which is the platform's signal for\nthe same thing.\n\nThe fill is a fraction of the track, written as a custom property.\n\n**The reading is said in the words the bar would show**: a whole percentage\nof the range in `locale`, the reading `format-options` writes, or\n`value-text`, as `aria-valuetext` beside the number.\n\n**Words set in the default slot are drawn on the bar**, or in the middle of a\nring, such as `62%` or `3 of 8`, and are what the bar says as its reading\nwhere `value-text` is not set. While there are any, the bar carries\n`:state(content)`, so a sheet can make room for them.\n\n**Reaching `max` is said and sent.** When the value arrives at `max` from\nbelow, the bar says `complete-label`, \"Complete\" by default, in a polite\n`live` region and sends `helix-complete`, so a reader hears that the work is\ndone and a page can move on. A bar that starts full says nothing, and an\nempty `complete-label` keeps it quiet. The `complete` custom state is set\nwhile the bar is full.",
123017
123979
  "name": "HelixHeadlessProgress",
123018
123980
  "cssProperties": [
123019
123981
  {
@@ -123022,6 +123984,10 @@
123022
123984
  }
123023
123985
  ],
123024
123986
  "cssParts": [
123987
+ {
123988
+ "description": "The box holding the words of the default slot, over the track or in the middle of the ring. Carries `--progress-fraction`.",
123989
+ "name": "content"
123990
+ },
123025
123991
  {
123026
123992
  "description": "The unfilled circle under the ring's filled arc.",
123027
123993
  "name": "groove"
@@ -123044,6 +124010,10 @@
123044
124010
  }
123045
124011
  ],
123046
124012
  "slots": [
124013
+ {
124014
+ "description": "Words drawn on the bar, or in the middle of a ring, such as the reading. Said as the reading where `value-text` is not set.",
124015
+ "name": ""
124016
+ },
123047
124017
  {
123048
124018
  "description": "A visible label. Its words name the progress bar in place of `label`.",
123049
124019
  "name": "label"
@@ -123079,7 +124049,7 @@
123079
124049
  "type": {
123080
124050
  "text": "Intl.NumberFormatOptions | undefined"
123081
124051
  },
123082
- "description": "`Intl.NumberFormat` options the reading is written with, as React Aria's\nMeter and ProgressBar take them: a unit, a currency, or a number of\ndecimals. Written as JSON in the attribute.\n\n```html\n<helix-progress value=\"18\" max=\"32\" format-options='{\"style\":\"unit\",\"unit\":\"gigabyte\"}'></helix-progress>\n```\n\nA `percent` style writes the share of the range, and any other the value\nitself, so the example says \"18 GB\". Absent is a whole percentage. The\nwords are announced as well as shown. `value-text` still wins.",
124052
+ "description": "`Intl.NumberFormat` options the reading is written with, as React Aria's\nMeter and ProgressBar take them: a unit, a currency, or a number of\ndecimals. Written as JSON in the attribute.\n\n```html\n<helix-progress value=\"18\" max=\"32\" format-options='{\"style\":\"unit\",\"unit\":\"gigabyte\"}'></helix-progress>\n```\n\nA `percent` style writes the share of the range, and any other the value\nitself, so the example says \"18 GB\". Absent is a whole percentage. The\nwords are announced whether or not `show-value` shows them. `value-text`\nstill wins.",
123083
124053
  "attribute": "format-options"
123084
124054
  },
123085
124055
  {
@@ -123240,6 +124210,13 @@
123240
124210
  "readonly": true,
123241
124211
  "description": "A label's words changed, so the name is written again."
123242
124212
  },
124213
+ {
124214
+ "kind": "field",
124215
+ "name": "reworded",
124216
+ "privacy": "private",
124217
+ "readonly": true,
124218
+ "description": "The words on the bar changed, so the reading is said again and the state set."
124219
+ },
123243
124220
  {
123244
124221
  "kind": "field",
123245
124222
  "name": "tier",
@@ -123605,7 +124582,7 @@
123605
124582
  "type": {
123606
124583
  "text": "Intl.NumberFormatOptions | undefined"
123607
124584
  },
123608
- "description": "`Intl.NumberFormat` options the reading is written with, as React Aria's\nMeter and ProgressBar take them: a unit, a currency, or a number of\ndecimals. Written as JSON in the attribute.\n\n```html\n<helix-progress value=\"18\" max=\"32\" format-options='{\"style\":\"unit\",\"unit\":\"gigabyte\"}'></helix-progress>\n```\n\nA `percent` style writes the share of the range, and any other the value\nitself, so the example says \"18 GB\". Absent is a whole percentage. The\nwords are announced as well as shown. `value-text` still wins.",
124585
+ "description": "`Intl.NumberFormat` options the reading is written with, as React Aria's\nMeter and ProgressBar take them: a unit, a currency, or a number of\ndecimals. Written as JSON in the attribute.\n\n```html\n<helix-progress value=\"18\" max=\"32\" format-options='{\"style\":\"unit\",\"unit\":\"gigabyte\"}'></helix-progress>\n```\n\nA `percent` style writes the share of the range, and any other the value\nitself, so the example says \"18 GB\". Absent is a whole percentage. The\nwords are announced whether or not `show-value` shows them. `value-text`\nstill wins.",
123609
124586
  "fieldName": "formatOptions"
123610
124587
  },
123611
124588
  {
@@ -123694,6 +124671,10 @@
123694
124671
  "description": "The value is at `max` and the bar is not indeterminate.",
123695
124672
  "name": "complete"
123696
124673
  },
124674
+ {
124675
+ "description": "Words are set in the default slot.",
124676
+ "name": "content"
124677
+ },
123697
124678
  {
123698
124679
  "description": "Set one frame after the first render. Transitions wait for it, so an element does not animate its own arrival.",
123699
124680
  "name": "settled",
@@ -129894,7 +130875,7 @@
129894
130875
  "declarations": [
129895
130876
  {
129896
130877
  "kind": "class",
129897
- "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.",
130878
+ "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.\n\n**`data` takes the readings as data** where the page has no table to point\n`for` at, in a table's shape: the column headings, then one row per reading\nwith its label first. A table is still the better source where the page can\nshow one, since it reads before any script runs.\n\n**A chart with nothing to draw says so.** A table with no readings shows\n`empty-text`, \"No readings\", in the plot, and `loading` shows `loading-text`\nthere until readings arrive. The `empty` and `loading` slots take markup in\ntheir place, such as a link to add the first reading.",
129898
130879
  "name": "HelixHeadlessScatterChart",
129899
130880
  "cssProperties": [
129900
130881
  {
@@ -129915,6 +130896,10 @@
129915
130896
  }
129916
130897
  ],
129917
130898
  "cssParts": [
130899
+ {
130900
+ "description": "The words in place of the drawing when the table has no readings: the `empty` slot, falling back to `empty-text`. Not drawn while the table cannot be read yet, on the server and during hydration.",
130901
+ "name": "empty"
130902
+ },
129918
130903
  {
129919
130904
  "description": "One line across the plot, drawn when `gridlines` is set.",
129920
130905
  "name": "gridline"
@@ -129923,6 +130908,10 @@
129923
130908
  "description": "The readout: a polite live region that says the row the keys moved to. Hide it visually.",
129924
130909
  "name": "live"
129925
130910
  },
130911
+ {
130912
+ "description": "The words in place of the drawing while `loading` is set and there are no readings: the `loading` slot, falling back to `loading-text`.",
130913
+ "name": "loading"
130914
+ },
129926
130915
  {
129927
130916
  "description": "The invisible point the tooltip is anchored to.",
129928
130917
  "name": "mark"
@@ -130044,6 +131033,16 @@
130044
131033
  "name": "y-tick"
130045
131034
  }
130046
131035
  ],
131036
+ "slots": [
131037
+ {
131038
+ "description": "Content shown in place of the drawing when the table has no readings, such as a link to add the first. Falls back to `empty-text`.",
131039
+ "name": "empty"
131040
+ },
131041
+ {
131042
+ "description": "Content shown in place of the drawing while `loading` is set and there are no readings yet. Falls back to `loading-text`.",
131043
+ "name": "loading"
131044
+ }
131045
+ ],
130047
131046
  "members": [
130048
131047
  {
130049
131048
  "kind": "field",
@@ -130350,6 +131349,70 @@
130350
131349
  "privacy": "private",
130351
131350
  "readonly": true
130352
131351
  },
131352
+ {
131353
+ "kind": "field",
131354
+ "name": "emptyText",
131355
+ "type": {
131356
+ "text": "string"
131357
+ },
131358
+ "default": "'No readings'",
131359
+ "description": "The words shown in place of the drawing when the table has no readings,\nand the fallback of the `empty` slot.",
131360
+ "attribute": "empty-text",
131361
+ "helix": {
131362
+ "words": true
131363
+ },
131364
+ "inheritedFrom": {
131365
+ "name": "MixinChartStatus",
131366
+ "module": "src/mixins/mixin-chart-status/mixin-chart-status.ts"
131367
+ }
131368
+ },
131369
+ {
131370
+ "kind": "field",
131371
+ "name": "loading",
131372
+ "type": {
131373
+ "text": "boolean"
131374
+ },
131375
+ "default": "false",
131376
+ "description": "Whether the readings are still on their way. The chart shows\n`loading-text` in place of an empty drawing until it has readings.\n\nReflected, so a stylesheet can treat the chart while it waits. A chart\nthat already has readings keeps drawing them, so a refresh does not\nblank it.",
131377
+ "attribute": "loading",
131378
+ "reflects": true,
131379
+ "inheritedFrom": {
131380
+ "name": "MixinChartStatus",
131381
+ "module": "src/mixins/mixin-chart-status/mixin-chart-status.ts"
131382
+ }
131383
+ },
131384
+ {
131385
+ "kind": "field",
131386
+ "name": "loadingText",
131387
+ "type": {
131388
+ "text": "string"
131389
+ },
131390
+ "default": "'Loading readings'",
131391
+ "description": "The words shown in place of the drawing while `loading` is set and\nthere are no readings yet, and the fallback of the `loading` slot.",
131392
+ "attribute": "loading-text",
131393
+ "helix": {
131394
+ "words": true
131395
+ },
131396
+ "inheritedFrom": {
131397
+ "name": "MixinChartStatus",
131398
+ "module": "src/mixins/mixin-chart-status/mixin-chart-status.ts"
131399
+ }
131400
+ },
131401
+ {
131402
+ "kind": "method",
131403
+ "name": "renderStatus",
131404
+ "privacy": "protected",
131405
+ "return": {
131406
+ "type": {
131407
+ "text": "TemplateResult | typeof nothing"
131408
+ }
131409
+ },
131410
+ "description": "What stands in the plot while there is nothing to draw: the `loading`\nline, the `empty` line, or nothing while the table cannot be read yet.\n\n`dir=\"auto\"`, so words in a right-to-left script read their own way in\na plot that holds itself left to right, as Scatter Chart's does.",
131411
+ "inheritedFrom": {
131412
+ "name": "MixinChartStatus",
131413
+ "module": "src/mixins/mixin-chart-status/mixin-chart-status.ts"
131414
+ }
131415
+ },
130353
131416
  {
130354
131417
  "kind": "field",
130355
131418
  "name": "source",
@@ -130373,6 +131436,19 @@
130373
131436
  "module": "src/mixins/mixin-chart-source/mixin-chart-source.ts"
130374
131437
  }
130375
131438
  },
131439
+ {
131440
+ "kind": "field",
131441
+ "name": "data",
131442
+ "type": {
131443
+ "text": "ChartData | undefined"
131444
+ },
131445
+ "default": "undefined",
131446
+ "description": "The readings as data, in the shape of a table, where the page has no\ntable to point `for` at. `for` wins where both are set.\n\n```js\nchart.data = {\n caption: 'Sessions by channel',\n columns: ['Month', 'Direct', 'Referral'],\n rows: [['Jan', 10, 4], ['Feb', 20, 8]],\n}\n```\n\nThe first column holds each row's label and every column after it a\nseries, as in a table. A cell is a number, words, `null` for a blank,\nor `{ value, text }` for a number shown as words, such as `$128k`. A\nnumber is shown in `locale`.\n\n**A table is still the better source where the page can show one**:\nit reads with no script and before hydration, and a reader can sort and\ncopy it. Data is drawn on the client only, so a server serves the\nframe, and the summary, the keys and the readout are then the whole of\nwhat a screen reader is given. Set a new object to redraw: the chart\ndoes not look inside the one it has.",
131447
+ "inheritedFrom": {
131448
+ "name": "MixinChartSource",
131449
+ "module": "src/mixins/mixin-chart-source/mixin-chart-source.ts"
131450
+ }
131451
+ },
130376
131452
  {
130377
131453
  "kind": "field",
130378
131454
  "name": "for",
@@ -130509,6 +131585,19 @@
130509
131585
  "module": "src/mixins/mixin-chart-source/mixin-chart-source.ts"
130510
131586
  }
130511
131587
  },
131588
+ {
131589
+ "kind": "field",
131590
+ "name": "readingsKnown",
131591
+ "type": {
131592
+ "text": "boolean"
131593
+ },
131594
+ "description": "Whether the readings have been looked for: false on the server and\nwhile hydrating, where no table is resolved and no data is read. A\nchart says it has no readings only once this is true.",
131595
+ "readonly": true,
131596
+ "inheritedFrom": {
131597
+ "name": "MixinChartSource",
131598
+ "module": "src/mixins/mixin-chart-source/mixin-chart-source.ts"
131599
+ }
131600
+ },
130512
131601
  {
130513
131602
  "kind": "field",
130514
131603
  "name": "sourceRows",
@@ -131035,6 +132124,45 @@
131035
132124
  "description": "Draws each series' line of best fit across the plot, by least squares, in\nthe series' color: the regression line a reader would otherwise draw by\neye.\n\nAbsent draws none. A series with fewer than two points, or with every\npoint at one measure across, has no line to draw. The summary already\ngives each series' correlation, which says how near the points are to it.",
131036
132125
  "fieldName": "trend"
131037
132126
  },
132127
+ {
132128
+ "name": "empty-text",
132129
+ "type": {
132130
+ "text": "string"
132131
+ },
132132
+ "default": "'No readings'",
132133
+ "description": "The words shown in place of the drawing when the table has no readings,\nand the fallback of the `empty` slot.",
132134
+ "fieldName": "emptyText",
132135
+ "inheritedFrom": {
132136
+ "name": "MixinChartStatus",
132137
+ "module": "src/mixins/mixin-chart-status/mixin-chart-status.ts"
132138
+ }
132139
+ },
132140
+ {
132141
+ "name": "loading",
132142
+ "type": {
132143
+ "text": "boolean"
132144
+ },
132145
+ "default": "false",
132146
+ "description": "Whether the readings are still on their way. The chart shows\n`loading-text` in place of an empty drawing until it has readings.\n\nReflected, so a stylesheet can treat the chart while it waits. A chart\nthat already has readings keeps drawing them, so a refresh does not\nblank it.",
132147
+ "fieldName": "loading",
132148
+ "inheritedFrom": {
132149
+ "name": "MixinChartStatus",
132150
+ "module": "src/mixins/mixin-chart-status/mixin-chart-status.ts"
132151
+ }
132152
+ },
132153
+ {
132154
+ "name": "loading-text",
132155
+ "type": {
132156
+ "text": "string"
132157
+ },
132158
+ "default": "'Loading readings'",
132159
+ "description": "The words shown in place of the drawing while `loading` is set and\nthere are no readings yet, and the fallback of the `loading` slot.",
132160
+ "fieldName": "loadingText",
132161
+ "inheritedFrom": {
132162
+ "name": "MixinChartStatus",
132163
+ "module": "src/mixins/mixin-chart-status/mixin-chart-status.ts"
132164
+ }
132165
+ },
131038
132166
  {
131039
132167
  "name": "for",
131040
132168
  "type": {
@@ -131089,6 +132217,10 @@
131089
132217
  }
131090
132218
  ],
131091
132219
  "mixins": [
132220
+ {
132221
+ "name": "MixinChartStatus",
132222
+ "package": "@fusion.dev/helix-core"
132223
+ },
131092
132224
  {
131093
132225
  "name": "MixinChartSource",
131094
132226
  "package": "@fusion.dev/helix-core"
@@ -141468,7 +142600,7 @@
141468
142600
  "declarations": [
141469
142601
  {
141470
142602
  "kind": "class",
141471
- "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`.",
142603
+ "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. |",
141472
142604
  "name": "HelixHeadlessSplitter",
141473
142605
  "cssProperties": [
141474
142606
  {
@@ -141692,6 +142824,71 @@
141692
142824
  "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.",
141693
142825
  "attribute": "position"
141694
142826
  },
142827
+ {
142828
+ "kind": "field",
142829
+ "name": "primary",
142830
+ "type": {
142831
+ "text": "'end' | 'start' | undefined"
142832
+ },
142833
+ "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.",
142834
+ "attribute": "primary"
142835
+ },
142836
+ {
142837
+ "kind": "field",
142838
+ "name": "lengths",
142839
+ "type": {
142840
+ "text": "ResizeObserver | undefined"
142841
+ },
142842
+ "privacy": "private",
142843
+ "description": "Watches this element's length along its axis while `primary` is set."
142844
+ },
142845
+ {
142846
+ "kind": "field",
142847
+ "name": "length",
142848
+ "type": {
142849
+ "text": "number"
142850
+ },
142851
+ "privacy": "private",
142852
+ "default": "0",
142853
+ "description": "The length along the axis last seen, in pixels."
142854
+ },
142855
+ {
142856
+ "kind": "method",
142857
+ "name": "watchLength",
142858
+ "privacy": "private",
142859
+ "return": {
142860
+ "type": {
142861
+ "text": "void"
142862
+ }
142863
+ },
142864
+ "description": "Starts or stops watching the length, according to `primary`, and holds\nthe primary pane's size in pixels as the length changes."
142865
+ },
142866
+ {
142867
+ "kind": "method",
142868
+ "name": "holdPrimary",
142869
+ "privacy": "private",
142870
+ "return": {
142871
+ "type": {
142872
+ "text": "void"
142873
+ }
142874
+ },
142875
+ "parameters": [
142876
+ {
142877
+ "name": "length",
142878
+ "type": {
142879
+ "text": "number"
142880
+ }
142881
+ }
142882
+ ],
142883
+ "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."
142884
+ },
142885
+ {
142886
+ "kind": "field",
142887
+ "name": "handlePaneKeys",
142888
+ "privacy": "private",
142889
+ "readonly": true,
142890
+ "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."
142891
+ },
141695
142892
  {
141696
142893
  "kind": "field",
141697
142894
  "name": "snap",
@@ -142640,6 +143837,14 @@
142640
143837
  "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.",
142641
143838
  "fieldName": "position"
142642
143839
  },
143840
+ {
143841
+ "name": "primary",
143842
+ "type": {
143843
+ "text": "'end' | 'start' | undefined"
143844
+ },
143845
+ "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.",
143846
+ "fieldName": "primary"
143847
+ },
142643
143848
  {
142644
143849
  "name": "snap",
142645
143850
  "type": {
@@ -151940,7 +153145,7 @@
151940
153145
  "declarations": [
151941
153146
  {
151942
153147
  "kind": "class",
151943
- "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.",
153148
+ "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.",
151944
153149
  "name": "HelixHeadlessTabs",
151945
153150
  "cssParts": [
151946
153151
  {
@@ -152081,6 +153286,16 @@
152081
153286
  "privacy": "private",
152082
153287
  "readonly": true
152083
153288
  },
153289
+ {
153290
+ "kind": "field",
153291
+ "name": "held",
153292
+ "type": {
153293
+ "text": "string[]"
153294
+ },
153295
+ "privacy": "private",
153296
+ "default": "[]",
153297
+ "description": "The values of the tabs the last pairing read, to tell a removed tab from one not yet here."
153298
+ },
152084
153299
  {
152085
153300
  "kind": "method",
152086
153301
  "name": "sync",
@@ -152092,6 +153307,32 @@
152092
153307
  },
152093
153308
  "description": "Pushes the current value down to whichever tab and panel own it."
152094
153309
  },
153310
+ {
153311
+ "kind": "field",
153312
+ "name": "focused",
153313
+ "type": {
153314
+ "text": "HelixHeadlessTab | undefined"
153315
+ },
153316
+ "privacy": "private",
153317
+ "description": "The tab that last had focus, so its removal can hand focus on."
153318
+ },
153319
+ {
153320
+ "kind": "field",
153321
+ "name": "handleFocusIn",
153322
+ "privacy": "private",
153323
+ "readonly": true
153324
+ },
153325
+ {
153326
+ "kind": "method",
153327
+ "name": "refocus",
153328
+ "privacy": "private",
153329
+ "return": {
153330
+ "type": {
153331
+ "text": "void"
153332
+ }
153333
+ },
153334
+ "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."
153335
+ },
152095
153336
  {
152096
153337
  "kind": "field",
152097
153338
  "name": "handleSlotChange",
@@ -170768,13 +172009,13 @@
170768
172009
  },
170769
172010
  "parameters": [
170770
172011
  {
170771
- "name": "{\n content,\n description,\n heading,\n labeled,\n progress,\n}",
172012
+ "name": "{\n content,\n description,\n heading,\n labeled,\n loose = null,\n progress,\n}",
170772
172013
  "type": {
170773
172014
  "text": "StopWords"
170774
172015
  }
170775
172016
  }
170776
172017
  ],
170777
- "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."
172018
+ "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."
170778
172019
  }
170779
172020
  ],
170780
172021
  "exports": [
@@ -170794,7 +172035,7 @@
170794
172035
  "declarations": [
170795
172036
  {
170796
172037
  "kind": "class",
170797
- "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.",
172038
+ "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`.",
170798
172039
  "name": "HelixHeadlessTour",
170799
172040
  "cssProperties": [
170800
172041
  {
@@ -171110,6 +172351,26 @@
171110
172351
  "privacy": "private",
171111
172352
  "readonly": true
171112
172353
  },
172354
+ {
172355
+ "kind": "field",
172356
+ "name": "revealed",
172357
+ "type": {
172358
+ "text": "HTMLElement | undefined"
172359
+ },
172360
+ "privacy": "private",
172361
+ "description": "The target last scrolled into view, so a render that moved nothing scrolls nothing."
172362
+ },
172363
+ {
172364
+ "kind": "method",
172365
+ "name": "reveal",
172366
+ "privacy": "private",
172367
+ "return": {
172368
+ "type": {
172369
+ "text": "void"
172370
+ }
172371
+ },
172372
+ "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."
172373
+ },
171113
172374
  {
171114
172375
  "kind": "field",
171115
172376
  "name": "returnFocus",
@@ -171997,7 +173258,7 @@
171997
173258
  "declarations": [
171998
173259
  {
171999
173260
  "kind": "class",
172000
- "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.",
173261
+ "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.",
172001
173262
  "name": "HelixHeadlessTourStop",
172002
173263
  "cssParts": [
172003
173264
  {
@@ -173967,7 +175228,7 @@
173967
175228
  "declarations": [
173968
175229
  {
173969
175230
  "kind": "class",
173970
- "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.",
175231
+ "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.",
173971
175232
  "name": "HelixHeadlessTree",
173972
175233
  "cssParts": [
173973
175234
  {
@@ -174271,6 +175532,40 @@
174271
175532
  },
174272
175533
  "privacy": "private"
174273
175534
  },
175535
+ {
175536
+ "kind": "field",
175537
+ "name": "focused",
175538
+ "type": {
175539
+ "text": "HelixHeadlessTreeItem | undefined"
175540
+ },
175541
+ "privacy": "private",
175542
+ "description": "The item that last had focus, so its removal can hand focus on."
175543
+ },
175544
+ {
175545
+ "kind": "field",
175546
+ "name": "handleFocusIn",
175547
+ "privacy": "private",
175548
+ "readonly": true
175549
+ },
175550
+ {
175551
+ "kind": "method",
175552
+ "name": "refocus",
175553
+ "privacy": "private",
175554
+ "return": {
175555
+ "type": {
175556
+ "text": "void"
175557
+ }
175558
+ },
175559
+ "parameters": [
175560
+ {
175561
+ "name": "records",
175562
+ "type": {
175563
+ "text": "MutationRecord[]"
175564
+ }
175565
+ }
175566
+ ],
175567
+ "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."
175568
+ },
174274
175569
  {
174275
175570
  "kind": "field",
174276
175571
  "name": "items",
@@ -183130,6 +184425,6 @@
183130
184425
  ],
183131
184426
  "helix": {
183132
184427
  "package": "@fusion.dev/helix-headless",
183133
- "version": "0.151.0"
184428
+ "version": "0.153.0"
183134
184429
  }
183135
184430
  }