@fusion.dev/helix 0.58.0 → 0.59.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.
@@ -2782,7 +2782,7 @@
2782
2782
  "text": "string"
2783
2783
  },
2784
2784
  "default": "''",
2785
- "description": "The id of the table to read.\n\nResolved through `getRootNode()`, so a chart inside another component's\nshadow root names a table in that root rather than in the document. A\n`<table>` or anything built from grid roles, including `helix-table`.\n\n**In React this arrives as a property and not as an attribute**, the way\n`Tooltip.for` does, so it does not reflect and nothing styles on it.",
2785
+ "description": "The id of the table to read.\n\nNames a table in the same tree, so a chart inside another component's\nshadow root reads a table in that root rather than one in the document. A\n`<table>` or anything built from grid roles, including `helix-table`.\n\n**In React this arrives as a property and not as an attribute**, the way\n`Tooltip.for` does, so it does not reflect and nothing styles on it.",
2786
2786
  "attribute": "for",
2787
2787
  "inheritedFrom": {
2788
2788
  "name": "MixinChartSource",
@@ -3656,7 +3656,7 @@
3656
3656
  "text": "string"
3657
3657
  },
3658
3658
  "default": "''",
3659
- "description": "The id of the table to read.\n\nResolved through `getRootNode()`, so a chart inside another component's\nshadow root names a table in that root rather than in the document. A\n`<table>` or anything built from grid roles, including `helix-table`.\n\n**In React this arrives as a property and not as an attribute**, the way\n`Tooltip.for` does, so it does not reflect and nothing styles on it.",
3659
+ "description": "The id of the table to read.\n\nNames a table in the same tree, so a chart inside another component's\nshadow root reads a table in that root rather than one in the document. A\n`<table>` or anything built from grid roles, including `helix-table`.\n\n**In React this arrives as a property and not as an attribute**, the way\n`Tooltip.for` does, so it does not reflect and nothing styles on it.",
3660
3660
  "fieldName": "for",
3661
3661
  "inheritedFrom": {
3662
3662
  "name": "MixinChartSource",
@@ -4291,15 +4291,6 @@
4291
4291
  "default": "{ alpha: true, antialias: false, depth: false, powerPreference: 'low-power', stencil: false, }",
4292
4292
  "description": "What every context is asked for, here rather than at two call sites."
4293
4293
  },
4294
- {
4295
- "kind": "field",
4296
- "name": "frame",
4297
- "type": {
4298
- "text": "number"
4299
- },
4300
- "privacy": "private",
4301
- "default": "0"
4302
- },
4303
4294
  {
4304
4295
  "kind": "field",
4305
4296
  "name": "elapsed",
@@ -4309,15 +4300,6 @@
4309
4300
  "privacy": "private",
4310
4301
  "default": "0"
4311
4302
  },
4312
- {
4313
- "kind": "field",
4314
- "name": "last",
4315
- "type": {
4316
- "text": "number"
4317
- },
4318
- "privacy": "private",
4319
- "default": "0"
4320
- },
4321
4303
  {
4322
4304
  "kind": "field",
4323
4305
  "name": "width",
@@ -4393,29 +4375,11 @@
4393
4375
  },
4394
4376
  {
4395
4377
  "kind": "field",
4396
- "name": "motion",
4397
- "type": {
4398
- "text": "MediaQueryList | undefined"
4399
- },
4400
- "privacy": "private"
4401
- },
4402
- {
4403
- "kind": "field",
4404
- "name": "visible",
4405
- "type": {
4406
- "text": "IntersectionObserver | undefined"
4407
- },
4408
- "privacy": "private"
4409
- },
4410
- {
4411
- "kind": "field",
4412
- "name": "onScreen",
4413
- "type": {
4414
- "text": "boolean"
4415
- },
4378
+ "name": "gate",
4416
4379
  "privacy": "private",
4417
- "default": "false",
4418
- "description": "What the intersection observer last said, kept because it says so only on\na change: every other path to `play` has to ask it."
4380
+ "readonly": true,
4381
+ "default": "new PaintGateController(this, { canRun: () => !!this.gl && !this.gl.isContextLost() && this.width > 0 && this.opened, onFrame: (delta) => { this.advance(delta) }, onMotion: (reduced) => { /* The still frame is drawn rather than assumed, because the canvas holds whatever was on it when the loop stopped and mid-drift is not the opening shape. `Orb` does the same, on the same two arms. */ if (reduced) { this.paintOnce() } }, onResize: () => { this.resized() }, })",
4382
+ "description": "Whether anybody is looking, and the loop that draws for them.\n\n**Four reasons to refuse a frame that the gate cannot know**: a context it\nwas never given, one the browser has taken, a drawing buffer no measurement\nhas sized, and an opening frame still owed. The first two draw nothing at\nall and the last two draw at the wrong scale, which `measure` and `opened`\neach have their own note about."
4419
4383
  },
4420
4384
  {
4421
4385
  "kind": "field",
@@ -4427,15 +4391,6 @@
4427
4391
  "default": "{ height: 1, left: 0, top: 0, width: 1 }",
4428
4392
  "description": "The element's box, cached.\n\n**Never read per event.** `getBoundingClientRect` forces a synchronous\nlayout, and a pointer emits events far faster than the display refreshes: a\n1000Hz mouse flushed layout a thousand times a second to compute a number\nthat only changes when the page reflows. Refreshed from the resize observer\nand from scroll, both of which are exactly when it can go stale, and never\nfrom the handler that reads it."
4429
4393
  },
4430
- {
4431
- "kind": "field",
4432
- "name": "sized",
4433
- "type": {
4434
- "text": "ResizeObserver | undefined"
4435
- },
4436
- "privacy": "private",
4437
- "description": "Watches the element's own size, so no frame has to ask for it."
4438
- },
4439
4394
  {
4440
4395
  "kind": "field",
4441
4396
  "name": "opened",
@@ -4522,7 +4477,7 @@
4522
4477
  "name": "handleLost",
4523
4478
  "privacy": "private",
4524
4479
  "readonly": true,
4525
- "description": "Stops for a context the browser has taken, and asks for it back.\n\n**Taken on a GPU reset, and past the cap** of about sixteen, where the\nbrowser drops the oldest context for the newest while its aura is still on\nscreen. `tick` books its own next frame, so the loop went on at 30 frames a\nsecond against a context that draws nothing, and nothing made the program\nagain once the context came back: the aura never recovered.\n\n**The canvas is hidden until then, because a lost one is not reliably\ntransparent.** Measured 15 Sep 2026: headless Chromium painted a plain\ncanvas white with a broken-image glyph in its corner, force-lost and on a\ncrashed GPU process alike, while this one came out clear there and on\nMetal, and the landing page once held a spent one's last frame (`build`\nhas it). Hidden, it shows what a machine with no WebGL is shown, the host's\ngradient, whatever the engine does with a lost canvas.\n\n`preventDefault` is the asking: a browser restores only a context whose\nloss was canceled."
4480
+ "description": "Stops for a context the browser has taken, and asks for it back.\n\n**Taken on a GPU reset, and past the cap** of about sixteen, where the\nbrowser drops the oldest context for the newest while its aura is still on\nscreen. Unstopped, the loop runs at 30 frames a second against a context\nthat draws nothing, and nothing makes the program again once the context\ncomes back: the aura never recovers.\n\n**The canvas is hidden until then, because a lost one is not reliably\ntransparent.** Measured 15 Sep 2026: headless Chromium painted a plain\ncanvas white with a broken-image glyph in its corner, force-lost and on a\ncrashed GPU process alike, while this one came out clear there and on\nMetal, and the landing page once held a spent one's last frame (`build`\nhas it). Hidden, it shows what a machine with no WebGL is shown, the host's\ngradient, whatever the engine does with a lost canvas.\n\n`preventDefault` is the asking: a browser restores only a context whose\nloss was canceled."
4526
4481
  },
4527
4482
  {
4528
4483
  "kind": "field",
@@ -4575,7 +4530,7 @@
4575
4530
  "text": "boolean"
4576
4531
  }
4577
4532
  },
4578
- "description": "Re-reads the box and resizes the drawing buffer to match.\n\n**Called from the observer, never from the frame.** `clientWidth` is a\nlayout read, and doing it in `tick` meant a forced synchronous layout on\nevery single frame to learn a number that changes when the box changes and\nat no other time. A `ResizeObserver` is told when that is.\n\nReturns whether the drawing buffer was resized, which is the same question\nas whether it was cleared, and so whether the caller owes it a frame."
4533
+ "description": "Re-reads the box and resizes the drawing buffer to match.\n\n**Called from the observer, never from the frame.** `clientWidth` is a\nlayout read, and doing it per frame meant a forced synchronous layout on\nevery single frame to learn a number that changes when the box changes and\nat no other time. The gate's `ResizeObserver` is told when that is.\n\nReturns whether the drawing buffer was resized, which is the same question\nas whether it was cleared, and so whether the caller owes it a frame."
4579
4534
  },
4580
4535
  {
4581
4536
  "kind": "method",
@@ -4587,6 +4542,17 @@
4587
4542
  }
4588
4543
  }
4589
4544
  },
4545
+ {
4546
+ "kind": "method",
4547
+ "name": "resized",
4548
+ "privacy": "private",
4549
+ "return": {
4550
+ "type": {
4551
+ "text": "void"
4552
+ }
4553
+ },
4554
+ "description": "The box changed, which is the one moment the buffer is re-measured.\n\n**A resize repaints unconditionally rather than asking.** `measure` clears\nthe drawing buffer whenever it resizes it, because assigning `canvas.width`\nis a reset and not a hint. `paintOnce` declines while the loop holds a\nframe, which is right for a property change the loop is about to draw\nanyway and wrong here: the canvas is already transparent by the time it\ndeclines, so the fallback gradient underneath showed through until the next\nframe landed. One frame, on every reflow that changed the box."
4555
+ },
4590
4556
  {
4591
4557
  "kind": "method",
4592
4558
  "name": "open",
@@ -4615,34 +4581,35 @@
4615
4581
  "privacy": "private",
4616
4582
  "static": true,
4617
4583
  "readonly": true,
4618
- "description": "The shortest gap between two painted frames, for a field nobody points at.\n\n**A drifting field does not need the display's rate and a pointer does.**\n`tick` advances on `(now - this.last) / 1000`, so motion is wall-clock: at\nhalf the frames the field moves the same distance in the same time, sampled\nmore coarsely. `delta` is already clamped at 0.05, which is a floor of 20\nframes a second, and 30 sits inside that with room. A cap at 15 would land\non the clamp and the field would genuinely drag, which is the failure that\nwould be misdiagnosed as choppiness.\n\n**`interactive` is the exception and it is the whole exception.** The\nelement eases `presence` toward the pointer on a 50ms rise constant, so at\n33ms a frame the entire response is one or two samples and the follow reads\nas a lag rather than a lightness. Every field on the landing page leaves\n`interactive` unset; the only one that sets it is the lab on\n`/helix/aura`, where it is a toggle a reader chose. So the cap applies where\nnothing is being followed and lifts where something is.\n\n**The cost scales with the count.** Three fields run on the landing page,\none per transparent run, and with the frame limiter off they drew 2,654\ntimes in three seconds against 1,276 for one: each instance draws once per\ncallback. Capping the two that nobody points at is most of that back."
4584
+ "description": "The shortest gap between two painted frames, in seconds, for a field nobody\npoints at.\n\n**A drifting field does not need the display's rate and a pointer does.**\nThe field advances on the gate's own step, so motion is wall-clock: at half\nthe frames it moves the same distance in the same time, sampled more\ncoarsely. That step is clamped at `MAX_FRAME_STEP`, which is a floor of 20\nframes a second, and 30 sits inside that with room. A cap at 15 would land\non the clamp and the field would genuinely drag, which is the failure that\nwould be misdiagnosed as choppiness.\n\n**`interactive` is the exception and it is the whole exception.** The\nelement eases `presence` toward the pointer on a 50ms rise constant, so at\n33ms a frame the entire response is one or two samples and the follow reads\nas a lag rather than a lightness. Every field on the landing page leaves\n`interactive` unset; the only one that sets it is the lab on\n`/helix/aura`, where it is a toggle a reader chose. So the cap applies where\nnothing is being followed and lifts where something is.\n\n**The cost scales with the count.** Three fields run on the landing page,\none per transparent run, and with the frame limiter off they drew 2,654\ntimes in three seconds against 1,276 for one: each instance draws once per\ncallback. Capping the two that nobody points at is most of that back."
4619
4585
  },
4620
4586
  {
4621
4587
  "kind": "field",
4622
- "name": "tick",
4588
+ "name": "held",
4589
+ "type": {
4590
+ "text": "number"
4591
+ },
4623
4592
  "privacy": "private",
4624
- "readonly": true
4593
+ "default": "0",
4594
+ "description": "What the skipped frames were worth, in seconds, spent on the next one drawn.\n\nDropping it instead would make the field move at a fraction of wall-clock\nspeed, which is the thing the cap is written not to do: a capped frame is\nthe same motion sampled more coarsely and not less motion. Held rather than\nmeasured from a stamp, because the gate owns the clock."
4625
4595
  },
4626
4596
  {
4627
4597
  "kind": "method",
4628
- "name": "play",
4598
+ "name": "advance",
4629
4599
  "privacy": "private",
4630
4600
  "return": {
4631
4601
  "type": {
4632
4602
  "text": "void"
4633
4603
  }
4634
4604
  },
4635
- "description": "Starts the loop, where it is wanted and can be ended.\n\n**Never while detached.** `tick` books its own next frame, so the only\nthing that ends the loop is `stop`, and a disconnection is the last time\n`stop` is called. Everything that plays is canceled or disconnected there,\nand this holds for whatever callback was already on its way.\n\n**Nor off screen, whoever asks.** The observer is the one caller that\nknows, and a tab coming back, a resize and a restored context all play\ntoo. An aura 2600 pixels below the fold booked no frame at rest and one on\nevery frame after its tab came back, until it had been scrolled in and out\nagain. Nor on a lost context, which draws nothing."
4636
- },
4637
- {
4638
- "kind": "method",
4639
- "name": "stop",
4640
- "privacy": "private",
4641
- "return": {
4642
- "type": {
4643
- "text": "void"
4605
+ "parameters": [
4606
+ {
4607
+ "name": "delta",
4608
+ "type": {
4609
+ "text": "number"
4610
+ }
4644
4611
  }
4645
- }
4612
+ ]
4646
4613
  },
4647
4614
  {
4648
4615
  "kind": "field",
@@ -4726,19 +4693,6 @@
4726
4693
  "privacy": "private",
4727
4694
  "readonly": true
4728
4695
  },
4729
- {
4730
- "kind": "field",
4731
- "name": "handleMotion",
4732
- "privacy": "private",
4733
- "readonly": true,
4734
- "description": "Answers the preference changing, rather than only its value at setup.\n\n**The query was created and never listened to**, so the preference was read\nat `play` and at the pointer and nowhere else. `tick` books its own next\nframe with no check of its own, which means a reader who turned reduce-motion\non while the page was open kept a full-page shader running for the rest of\nit: the one reader the promise at the top of this file is about, and the one\nit was broken for. The other direction failed the quieter way, a field frozen\non its opening frame until a scroll or a tab switch happened to ask again.\n\nThe still frame is drawn rather than assumed, because the canvas holds\nwhatever was on it when the loop stopped and mid-drift is not the opening\nshape. `Orb` does the same, on the same two arms."
4735
- },
4736
- {
4737
- "kind": "field",
4738
- "name": "handleVisibility",
4739
- "privacy": "private",
4740
- "readonly": true
4741
- },
4742
4696
  {
4743
4697
  "kind": "field",
4744
4698
  "name": "handleScroll",
@@ -7404,7 +7358,7 @@
7404
7358
  "text": "string"
7405
7359
  },
7406
7360
  "default": "''",
7407
- "description": "The id of the table to read.\n\nResolved through `getRootNode()`, so a chart inside another component's\nshadow root names a table in that root rather than in the document. A\n`<table>` or anything built from grid roles, including `helix-table`.\n\n**In React this arrives as a property and not as an attribute**, the way\n`Tooltip.for` does, so it does not reflect and nothing styles on it.",
7361
+ "description": "The id of the table to read.\n\nNames a table in the same tree, so a chart inside another component's\nshadow root reads a table in that root rather than one in the document. A\n`<table>` or anything built from grid roles, including `helix-table`.\n\n**In React this arrives as a property and not as an attribute**, the way\n`Tooltip.for` does, so it does not reflect and nothing styles on it.",
7408
7362
  "attribute": "for",
7409
7363
  "inheritedFrom": {
7410
7364
  "name": "MixinChartSource",
@@ -8253,7 +8207,7 @@
8253
8207
  "text": "string"
8254
8208
  },
8255
8209
  "default": "''",
8256
- "description": "The id of the table to read.\n\nResolved through `getRootNode()`, so a chart inside another component's\nshadow root names a table in that root rather than in the document. A\n`<table>` or anything built from grid roles, including `helix-table`.\n\n**In React this arrives as a property and not as an attribute**, the way\n`Tooltip.for` does, so it does not reflect and nothing styles on it.",
8210
+ "description": "The id of the table to read.\n\nNames a table in the same tree, so a chart inside another component's\nshadow root reads a table in that root rather than one in the document. A\n`<table>` or anything built from grid roles, including `helix-table`.\n\n**In React this arrives as a property and not as an attribute**, the way\n`Tooltip.for` does, so it does not reflect and nothing styles on it.",
8257
8211
  "fieldName": "for",
8258
8212
  "inheritedFrom": {
8259
8213
  "name": "MixinChartSource",
@@ -11252,7 +11206,7 @@
11252
11206
  "text": "HTMLElement | null"
11253
11207
  }
11254
11208
  },
11255
- "description": "The element this button commands, or nothing.\n\nLooked up in the button's own root rather than in the document, so a button\ninside somebody else's shadow root finds a target in that same root and not\na coincidence in the page.",
11209
+ "description": "The element this button commands, or nothing.",
11256
11210
  "inheritedFrom": {
11257
11211
  "name": "HelixHeadlessButton",
11258
11212
  "module": "src/button/root/button-root.ts"
@@ -25208,7 +25162,7 @@
25208
25162
  "text": "string[]"
25209
25163
  },
25210
25164
  "privacy": "private",
25211
- "description": "The presets, as written, with anything that is not a color dropped.",
25165
+ "description": "The presets, as written, with anything that is not a color dropped.\n\nSplit on the commas between colors and never inside one, so\n`rgba(34,197,94,.5)` stays one swatch rather than four fragments none of\nwhich parses.",
25212
25166
  "readonly": true,
25213
25167
  "inheritedFrom": {
25214
25168
  "name": "HelixHeadlessColorPicker",
@@ -30579,7 +30533,7 @@
30579
30533
  "text": "HTMLElement | null"
30580
30534
  }
30581
30535
  },
30582
- "description": "The element this button commands, or nothing.\n\nLooked up in the button's own root rather than in the document, so a button\ninside somebody else's shadow root finds a target in that same root and not\na coincidence in the page.",
30536
+ "description": "The element this button commands, or nothing.",
30583
30537
  "inheritedFrom": {
30584
30538
  "name": "HelixHeadlessButton",
30585
30539
  "module": "src/button/root/button-root.ts"
@@ -41720,7 +41674,7 @@
41720
41674
  "text": "string"
41721
41675
  },
41722
41676
  "default": "''",
41723
- "description": "The id of the table to read.\n\nResolved through `getRootNode()`, so a chart inside another component's\nshadow root names a table in that root rather than in the document. A\n`<table>` or anything built from grid roles, including `helix-table`.\n\n**In React this arrives as a property and not as an attribute**, the way\n`Tooltip.for` does, so it does not reflect and nothing styles on it.",
41677
+ "description": "The id of the table to read.\n\nNames a table in the same tree, so a chart inside another component's\nshadow root reads a table in that root rather than one in the document. A\n`<table>` or anything built from grid roles, including `helix-table`.\n\n**In React this arrives as a property and not as an attribute**, the way\n`Tooltip.for` does, so it does not reflect and nothing styles on it.",
41724
41678
  "attribute": "for",
41725
41679
  "inheritedFrom": {
41726
41680
  "name": "MixinChartSource",
@@ -42371,7 +42325,7 @@
42371
42325
  "text": "string"
42372
42326
  },
42373
42327
  "default": "''",
42374
- "description": "The id of the table to read.\n\nResolved through `getRootNode()`, so a chart inside another component's\nshadow root names a table in that root rather than in the document. A\n`<table>` or anything built from grid roles, including `helix-table`.\n\n**In React this arrives as a property and not as an attribute**, the way\n`Tooltip.for` does, so it does not reflect and nothing styles on it.",
42328
+ "description": "The id of the table to read.\n\nNames a table in the same tree, so a chart inside another component's\nshadow root reads a table in that root rather than one in the document. A\n`<table>` or anything built from grid roles, including `helix-table`.\n\n**In React this arrives as a property and not as an attribute**, the way\n`Tooltip.for` does, so it does not reflect and nothing styles on it.",
42375
42329
  "fieldName": "for",
42376
42330
  "inheritedFrom": {
42377
42331
  "name": "MixinChartSource",
@@ -54734,7 +54688,7 @@
54734
54688
  "text": "string"
54735
54689
  },
54736
54690
  "default": "''",
54737
- "description": "The id of the table to read.\n\nResolved through `getRootNode()`, so a chart inside another component's\nshadow root names a table in that root rather than in the document. A\n`<table>` or anything built from grid roles, including `helix-table`.\n\n**In React this arrives as a property and not as an attribute**, the way\n`Tooltip.for` does, so it does not reflect and nothing styles on it.",
54691
+ "description": "The id of the table to read.\n\nNames a table in the same tree, so a chart inside another component's\nshadow root reads a table in that root rather than one in the document. A\n`<table>` or anything built from grid roles, including `helix-table`.\n\n**In React this arrives as a property and not as an attribute**, the way\n`Tooltip.for` does, so it does not reflect and nothing styles on it.",
54738
54692
  "attribute": "for",
54739
54693
  "inheritedFrom": {
54740
54694
  "name": "MixinChartSource",
@@ -55003,7 +54957,7 @@
55003
54957
  "text": "boolean"
55004
54958
  },
55005
54959
  "privacy": "private",
55006
- "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 document rather than of a\ntree. An id that resolves to nothing in a browser is still known, and still\nempty: a `for` naming no table should say so rather than sit blank.",
54960
+ "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`.",
55007
54961
  "readonly": true,
55008
54962
  "inheritedFrom": {
55009
54963
  "name": "HelixHeadlessHeatmap",
@@ -55511,7 +55465,7 @@
55511
55465
  "text": "string"
55512
55466
  },
55513
55467
  "default": "''",
55514
- "description": "The id of the table to read.\n\nResolved through `getRootNode()`, so a chart inside another component's\nshadow root names a table in that root rather than in the document. A\n`<table>` or anything built from grid roles, including `helix-table`.\n\n**In React this arrives as a property and not as an attribute**, the way\n`Tooltip.for` does, so it does not reflect and nothing styles on it.",
55468
+ "description": "The id of the table to read.\n\nNames a table in the same tree, so a chart inside another component's\nshadow root reads a table in that root rather than one in the document. A\n`<table>` or anything built from grid roles, including `helix-table`.\n\n**In React this arrives as a property and not as an attribute**, the way\n`Tooltip.for` does, so it does not reflect and nothing styles on it.",
55515
55469
  "fieldName": "for",
55516
55470
  "inheritedFrom": {
55517
55471
  "name": "MixinChartSource",
@@ -56075,7 +56029,7 @@
56075
56029
  "text": "HTMLElement | null"
56076
56030
  }
56077
56031
  },
56078
- "description": "The element this button commands, or nothing.\n\nLooked up in the button's own root rather than in the document, so a button\ninside somebody else's shadow root finds a target in that same root and not\na coincidence in the page.",
56032
+ "description": "The element this button commands, or nothing.",
56079
56033
  "inheritedFrom": {
56080
56034
  "name": "HelixHeadlessButton",
56081
56035
  "module": "src/button/root/button-root.ts"
@@ -61747,7 +61701,7 @@
61747
61701
  "text": "string"
61748
61702
  },
61749
61703
  "default": "''",
61750
- "description": "The id of the table to take the names from.\n\nResolved through `getRootNode()`, so a legend inside another component's\nshadow root names a table in that root rather than in the document.\n\n**In React this arrives as a property and not as an attribute**, the way\n`Tooltip.for` does, so it does not reflect and nothing styles on it.",
61704
+ "description": "The id of the table to take the names from.\n\nNames a table in the same tree, so a legend inside another component's\nshadow root reads a table in that root rather than one in the document.\n\n**In React this arrives as a property and not as an attribute**, the way\n`Tooltip.for` does, so it does not reflect and nothing styles on it.",
61751
61705
  "attribute": "for",
61752
61706
  "inheritedFrom": {
61753
61707
  "name": "HelixHeadlessLegend",
@@ -62172,7 +62126,7 @@
62172
62126
  "text": "string"
62173
62127
  },
62174
62128
  "default": "''",
62175
- "description": "The id of the table to take the names from.\n\nResolved through `getRootNode()`, so a legend inside another component's\nshadow root names a table in that root rather than in the document.\n\n**In React this arrives as a property and not as an attribute**, the way\n`Tooltip.for` does, so it does not reflect and nothing styles on it.",
62129
+ "description": "The id of the table to take the names from.\n\nNames a table in the same tree, so a legend inside another component's\nshadow root reads a table in that root rather than one in the document.\n\n**In React this arrives as a property and not as an attribute**, the way\n`Tooltip.for` does, so it does not reflect and nothing styles on it.",
62176
62130
  "fieldName": "for",
62177
62131
  "inheritedFrom": {
62178
62132
  "name": "HelixHeadlessLegend",
@@ -62444,7 +62398,7 @@
62444
62398
  "text": "string"
62445
62399
  },
62446
62400
  "default": "''",
62447
- "description": "The id of the table to read.\n\nResolved through `getRootNode()`, so a chart inside another component's\nshadow root names a table in that root rather than in the document. A\n`<table>` or anything built from grid roles, including `helix-table`.\n\n**In React this arrives as a property and not as an attribute**, the way\n`Tooltip.for` does, so it does not reflect and nothing styles on it.",
62401
+ "description": "The id of the table to read.\n\nNames a table in the same tree, so a chart inside another component's\nshadow root reads a table in that root rather than one in the document. A\n`<table>` or anything built from grid roles, including `helix-table`.\n\n**In React this arrives as a property and not as an attribute**, the way\n`Tooltip.for` does, so it does not reflect and nothing styles on it.",
62448
62402
  "attribute": "for",
62449
62403
  "inheritedFrom": {
62450
62404
  "name": "MixinChartSource",
@@ -63276,7 +63230,7 @@
63276
63230
  "text": "string"
63277
63231
  },
63278
63232
  "default": "''",
63279
- "description": "The id of the table to read.\n\nResolved through `getRootNode()`, so a chart inside another component's\nshadow root names a table in that root rather than in the document. A\n`<table>` or anything built from grid roles, including `helix-table`.\n\n**In React this arrives as a property and not as an attribute**, the way\n`Tooltip.for` does, so it does not reflect and nothing styles on it.",
63233
+ "description": "The id of the table to read.\n\nNames a table in the same tree, so a chart inside another component's\nshadow root reads a table in that root rather than one in the document. A\n`<table>` or anything built from grid roles, including `helix-table`.\n\n**In React this arrives as a property and not as an attribute**, the way\n`Tooltip.for` does, so it does not reflect and nothing styles on it.",
63280
63234
  "fieldName": "for",
63281
63235
  "inheritedFrom": {
63282
63236
  "name": "MixinChartSource",
@@ -79826,54 +79780,11 @@
79826
79780
  },
79827
79781
  {
79828
79782
  "kind": "field",
79829
- "name": "motion",
79830
- "type": {
79831
- "text": "MediaQueryList | undefined"
79832
- },
79833
- "privacy": "private"
79834
- },
79835
- {
79836
- "kind": "field",
79837
- "name": "visible",
79838
- "type": {
79839
- "text": "IntersectionObserver | undefined"
79840
- },
79841
- "privacy": "private"
79842
- },
79843
- {
79844
- "kind": "field",
79845
- "name": "sized",
79846
- "type": {
79847
- "text": "ResizeObserver | undefined"
79848
- },
79849
- "privacy": "private"
79850
- },
79851
- {
79852
- "kind": "field",
79853
- "name": "frame",
79854
- "type": {
79855
- "text": "number"
79856
- },
79857
- "privacy": "private",
79858
- "default": "0"
79859
- },
79860
- {
79861
- "kind": "field",
79862
- "name": "running",
79863
- "type": {
79864
- "text": "boolean"
79865
- },
79783
+ "name": "gate",
79866
79784
  "privacy": "private",
79867
- "default": "false"
79868
- },
79869
- {
79870
- "kind": "field",
79871
- "name": "onScreen",
79872
- "type": {
79873
- "text": "boolean"
79874
- },
79875
- "privacy": "private",
79876
- "default": "false"
79785
+ "readonly": true,
79786
+ "default": "new PaintGateController(this, { canRun: () => !!this.context && !this.lost, onFrame: (delta) => { this.paint(delta) }, onMotion: (reduced) => { if (reduced) { this.phase = STILL_PHASE this.morphAt = 0 this.paint(0) } }, onResize: () => { this.measure() this.paint(0) }, })",
79787
+ "description": "Whether anybody is looking, and the loop that draws for them.\n\nA context it has not been given and one the browser has taken are both\nreasons to draw nothing that the gate cannot see, so they are said here.\n\nEvery frame paints: a settled orb has movement of its own in every state,\nand only the gate's own three answers stop it."
79877
79788
  },
79878
79789
  {
79879
79790
  "kind": "field",
@@ -79933,15 +79844,6 @@
79933
79844
  "text": "number"
79934
79845
  }
79935
79846
  },
79936
- {
79937
- "kind": "field",
79938
- "name": "last",
79939
- "type": {
79940
- "text": "number"
79941
- },
79942
- "privacy": "private",
79943
- "default": "0"
79944
- },
79945
79847
  {
79946
79848
  "kind": "method",
79947
79849
  "name": "start",
@@ -80004,38 +79906,6 @@
80004
79906
  }
80005
79907
  }
80006
79908
  },
80007
- {
80008
- "kind": "method",
80009
- "name": "play",
80010
- "privacy": "private",
80011
- "return": {
80012
- "type": {
80013
- "text": "void"
80014
- }
80015
- }
80016
- },
80017
- {
80018
- "kind": "method",
80019
- "name": "stop",
80020
- "privacy": "private",
80021
- "return": {
80022
- "type": {
80023
- "text": "void"
80024
- }
80025
- }
80026
- },
80027
- {
80028
- "kind": "field",
80029
- "name": "tick",
80030
- "privacy": "private",
80031
- "readonly": true
80032
- },
80033
- {
80034
- "kind": "field",
80035
- "name": "handleVisibility",
80036
- "privacy": "private",
80037
- "readonly": true
80038
- },
80039
79909
  {
80040
79910
  "kind": "field",
80041
79911
  "name": "handleLost",
@@ -80050,12 +79920,6 @@
80050
79920
  "readonly": true,
80051
79921
  "description": "Draws again on the canvas the browser gave back.\n\n**Sized again, because it comes back in its default state.** Found 15 Sep\n2026 by crashing the GPU process under headless Chromium: the transform\n`measure` sets came back the identity, and `measure` sets it only when the\nbox changes. At twice the density that is an orb drawn at half its size in\nthe top left corner, for as long as the box holds still."
80052
79922
  },
80053
- {
80054
- "kind": "field",
80055
- "name": "handleMotion",
80056
- "privacy": "private",
80057
- "readonly": true
80058
- },
80059
79923
  {
80060
79924
  "kind": "method",
80061
79925
  "name": "paint",
@@ -81084,7 +80948,7 @@
81084
80948
  "text": "{ link: HTMLAnchorElement; target: Element }[]"
81085
80949
  },
81086
80950
  "privacy": "private",
81087
- "description": "What each link points at, paired with the link, skipping anything missing.",
80951
+ "description": "What each link points at, paired with the link, skipping anything missing.\n\nThe fragment is decoded first because these are `href`s and not ids. The\nlookup is the tree's alone: this intercepts no press, so it has no\nnavigation to agree with, and a section it cannot see is one it is not\ndescribing.",
81088
80952
  "readonly": true,
81089
80953
  "inheritedFrom": {
81090
80954
  "name": "HelixHeadlessOutline",
@@ -96798,7 +96662,7 @@
96798
96662
  "text": "string"
96799
96663
  },
96800
96664
  "default": "''",
96801
- "description": "The id of the table to read.\n\nResolved through `getRootNode()`, so a chart inside another component's\nshadow root names a table in that root rather than in the document. A\n`<table>` or anything built from grid roles, including `helix-table`.\n\n**In React this arrives as a property and not as an attribute**, the way\n`Tooltip.for` does, so it does not reflect and nothing styles on it.",
96665
+ "description": "The id of the table to read.\n\nNames a table in the same tree, so a chart inside another component's\nshadow root reads a table in that root rather than one in the document. A\n`<table>` or anything built from grid roles, including `helix-table`.\n\n**In React this arrives as a property and not as an attribute**, the way\n`Tooltip.for` does, so it does not reflect and nothing styles on it.",
96802
96666
  "attribute": "for",
96803
96667
  "inheritedFrom": {
96804
96668
  "name": "MixinChartSource",
@@ -97480,7 +97344,7 @@
97480
97344
  "text": "string"
97481
97345
  },
97482
97346
  "default": "''",
97483
- "description": "The id of the table to read.\n\nResolved through `getRootNode()`, so a chart inside another component's\nshadow root names a table in that root rather than in the document. A\n`<table>` or anything built from grid roles, including `helix-table`.\n\n**In React this arrives as a property and not as an attribute**, the way\n`Tooltip.for` does, so it does not reflect and nothing styles on it.",
97347
+ "description": "The id of the table to read.\n\nNames a table in the same tree, so a chart inside another component's\nshadow root reads a table in that root rather than one in the document. A\n`<table>` or anything built from grid roles, including `helix-table`.\n\n**In React this arrives as a property and not as an attribute**, the way\n`Tooltip.for` does, so it does not reflect and nothing styles on it.",
97484
97348
  "fieldName": "for",
97485
97349
  "inheritedFrom": {
97486
97350
  "name": "MixinChartSource",
@@ -101264,7 +101128,7 @@
101264
101128
  "text": "HTMLElement | null"
101265
101129
  },
101266
101130
  "privacy": "private",
101267
- "description": "The element `href` names, looked up in the tree this link sits in.",
101131
+ "description": "The element `href` names, looked up the way the browser would.\n\n`orDocument`, which no other caller of `elementById` passes and which that\noption is written for: a press handled here has to land where following the\nanchor would, and the platform resolves a fragment against the document\nwhatever tree the anchor is in. A skip link inside an app shell's shadow\nroot pointing at the page's `#main` is the arrangement that needs it.\n\nThe fragment is decoded first because this is an `href` and not an id.",
101268
101132
  "readonly": true,
101269
101133
  "inheritedFrom": {
101270
101134
  "name": "HelixHeadlessSkipLink",
@@ -128415,7 +128279,7 @@
128415
128279
  "text": "string"
128416
128280
  },
128417
128281
  "default": "''",
128418
- "description": "The id of the element this describes, in this tooltip's own tree.\n\nSet it and the tooltip stops wrapping: it renders no trigger, listens on\nthe element it names, and points its bubble there. Leave it unset and the\ndefault slot is the trigger, which is the older form.\n\nResolved through `getRootNode()`, so a tooltip inside another component's\nshadow root names an element in that root rather than in the document.\n\n**In React this arrives as a property and not as an attribute**, which is\nworth knowing before someone reads the DOM and thinks it did not take.\nMeasured against React 19.2.8: `for` exists on the prototype, so React sets\n`element.for = 'save'` and writes nothing to the markup, where `content`\nand `placement`, which are not properties on the class at that moment, come\nthrough as attributes. Both paths reach the same place through Lit, so\nnothing is broken by it; a `[for]` selector would find nothing, which is\nwhy this does not reflect and nothing styles on it.",
128282
+ "description": "The id of the element this describes, in this tooltip's own tree.\n\nSet it and the tooltip stops wrapping: it renders no trigger, listens on\nthe element it names, and points its bubble there. Leave it unset and the\ndefault slot is the trigger, which is the older form.\n\nNames an element in the same tree, so a tooltip inside another component's\nshadow root points at one in that root rather than one in the document.\n\n**In React this arrives as a property and not as an attribute**, which is\nworth knowing before someone reads the DOM and thinks it did not take.\nMeasured against React 19.2.8: `for` exists on the prototype, so React sets\n`element.for = 'save'` and writes nothing to the markup, where `content`\nand `placement`, which are not properties on the class at that moment, come\nthrough as attributes. Both paths reach the same place through Lit, so\nnothing is broken by it; a `[for]` selector would find nothing, which is\nwhy this does not reflect and nothing styles on it.",
128419
128283
  "attribute": "for",
128420
128284
  "inheritedFrom": {
128421
128285
  "name": "HelixHeadlessTooltip",
@@ -128554,7 +128418,7 @@
128554
128418
  "text": "HTMLElement | null"
128555
128419
  },
128556
128420
  "privacy": "private",
128557
- "description": "The element `for` names, or null.\n\n`getRootNode()` rather than `document`, which is what makes this work inside\nanother component: an id is unique to a tree, and a tooltip in a shadow root\nnames an element in that root. Client only, since the server has no tree to\nsearch.",
128421
+ "description": "The element `for` names, or null.",
128558
128422
  "readonly": true,
128559
128423
  "inheritedFrom": {
128560
128424
  "name": "HelixHeadlessTooltip",
@@ -129229,7 +129093,7 @@
129229
129093
  "text": "string"
129230
129094
  },
129231
129095
  "default": "''",
129232
- "description": "The id of the element this describes, in this tooltip's own tree.\n\nSet it and the tooltip stops wrapping: it renders no trigger, listens on\nthe element it names, and points its bubble there. Leave it unset and the\ndefault slot is the trigger, which is the older form.\n\nResolved through `getRootNode()`, so a tooltip inside another component's\nshadow root names an element in that root rather than in the document.\n\n**In React this arrives as a property and not as an attribute**, which is\nworth knowing before someone reads the DOM and thinks it did not take.\nMeasured against React 19.2.8: `for` exists on the prototype, so React sets\n`element.for = 'save'` and writes nothing to the markup, where `content`\nand `placement`, which are not properties on the class at that moment, come\nthrough as attributes. Both paths reach the same place through Lit, so\nnothing is broken by it; a `[for]` selector would find nothing, which is\nwhy this does not reflect and nothing styles on it.",
129096
+ "description": "The id of the element this describes, in this tooltip's own tree.\n\nSet it and the tooltip stops wrapping: it renders no trigger, listens on\nthe element it names, and points its bubble there. Leave it unset and the\ndefault slot is the trigger, which is the older form.\n\nNames an element in the same tree, so a tooltip inside another component's\nshadow root points at one in that root rather than one in the document.\n\n**In React this arrives as a property and not as an attribute**, which is\nworth knowing before someone reads the DOM and thinks it did not take.\nMeasured against React 19.2.8: `for` exists on the prototype, so React sets\n`element.for = 'save'` and writes nothing to the markup, where `content`\nand `placement`, which are not properties on the class at that moment, come\nthrough as attributes. Both paths reach the same place through Lit, so\nnothing is broken by it; a `[for]` selector would find nothing, which is\nwhy this does not reflect and nothing styles on it.",
129233
129097
  "fieldName": "for",
129234
129098
  "inheritedFrom": {
129235
129099
  "name": "HelixHeadlessTooltip",