@fusion.dev/helix 0.161.0 → 0.162.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.
@@ -6628,18 +6628,6 @@
6628
6628
  }
6629
6629
  }
6630
6630
  },
6631
- {
6632
- "kind": "method",
6633
- "name": "drawsInSoftware",
6634
- "privacy": "private",
6635
- "static": true,
6636
- "return": {
6637
- "type": {
6638
- "text": "boolean"
6639
- }
6640
- },
6641
- "description": "Whether WebGL here is drawn on the CPU, asked before one is drawn into.\n\n**The shader costs what a GPU makes it cheap to ask for.** The note at the\ntop of this file measures it: on Metal the browser shares the compiled\nprogram and each aura after the first draws its opening frame in about 2ms,\nwhile under SwiftShader nothing is shared and each one compiles the pipeline\nagain for about 450ms. Measured again 15 Sep 2026 on a page of 720 pixel\nauras, SwiftShader against the same page with this check in place: the worst\nframe gap went 568ms to 50ms with one aura, 1626ms to 34ms with three and\n3200ms to 42ms with six, and a page of three or six ran at 13 frames a\nsecond before and at the display's own rate after. What that buys is a field\na reader barely sees behind content, against a gradient ramped from the same\ntokens. So the software path takes the fallback.\n\n**The unmasked name is the only one that answers.** `gl.RENDERER` is masked\nto `WebKit WebGL` on Chromium, the same string on SwiftShader and on Metal,\nand `WEBGL_debug_renderer_info` is what lifts the mask.\n\n**An unreadable renderer draws**, which is the safe direction and not the\ntidy one. The extension is optional and is withheld deliberately: Firefox's\n`privacy.resistFingerprinting` and Safari's equivalent both drop it, and a\nbrowser may drop it at any time, since a GPU name is a fingerprinting\nsurface. Treating \"we cannot tell\" as software would take the shader away\nfrom every reader on a machine that hides its hardware, which is a real GPU\nfar more often than not. Treating it as hardware costs a machine that hides\na software renderer the 450ms, which is the cost the component has today.\n\n**A probe context of its own, and given straight back.** Asking the\nelement's own canvas would spend it: `build` below is written around a\ncanvas whose context was force-lost never yielding a working one again, and\nthe probe has to release what it took or a page of auras runs the browser\ninto its cap of about sixteen. One pixel by one, and released through\n`WEBGL_lose_context` the same way `drop` does.\n\n**The same attributes the real context asks for**, because they are part of\nthe question: `powerPreference` can select a different adapter, so a probe\nasking for a high-performance context would name a GPU the drawing one is\nnever given.\n\n**Asked per context rather than once for the page.** The answer is not\nfixed: a GPU process that crashes takes the page down to SwiftShader for\nthe rest of its life, and an aura rebuilding after that should get the\ncurrent answer rather than the one from before. It costs a context creation\nand two calls, measured 15 Sep 2026 at about 2ms under SwiftShader and 2ms\non Metal, against the 450ms and 135ms first draws it stands in front of, and\nit happens once per context rather than once per frame."
6642
- },
6643
6631
  {
6644
6632
  "kind": "method",
6645
6633
  "name": "build",
@@ -100077,6 +100065,14 @@
100077
100065
  "module": "src/steps/index.js"
100078
100066
  }
100079
100067
  },
100068
+ {
100069
+ "kind": "js",
100070
+ "name": "*",
100071
+ "declaration": {
100072
+ "name": "*",
100073
+ "module": "src/strands/index.js"
100074
+ }
100075
+ },
100080
100076
  {
100081
100077
  "kind": "js",
100082
100078
  "name": "*",
@@ -189007,6 +189003,2498 @@
189007
189003
  }
189008
189004
  ]
189009
189005
  },
189006
+ {
189007
+ "kind": "javascript-module",
189008
+ "path": "src/strands/index.ts",
189009
+ "declarations": [],
189010
+ "exports": [
189011
+ {
189012
+ "kind": "js",
189013
+ "name": "*",
189014
+ "declaration": {
189015
+ "name": "*",
189016
+ "module": "src/strands/root/strands-root.js"
189017
+ }
189018
+ },
189019
+ {
189020
+ "kind": "js",
189021
+ "name": "*",
189022
+ "declaration": {
189023
+ "name": "*",
189024
+ "module": "src/strands/stop/strands-stop.js"
189025
+ }
189026
+ }
189027
+ ]
189028
+ },
189029
+ {
189030
+ "kind": "javascript-module",
189031
+ "path": "src/strands/palette.ts",
189032
+ "declarations": [
189033
+ {
189034
+ "kind": "variable",
189035
+ "name": "RESTING_PALETTE",
189036
+ "type": {
189037
+ "text": "StrandsPalette"
189038
+ },
189039
+ "default": "{ glow: [0.88, 0.88, 0.88], ground: [0, 0, 0], light: false, peak: [1, 1, 1], tint: [0.6, 0.6, 0.6], }",
189040
+ "description": "The default theme's dark page, ink on black, which is drawn until a read."
189041
+ },
189042
+ {
189043
+ "kind": "function",
189044
+ "name": "paletteOf",
189045
+ "return": {
189046
+ "type": {
189047
+ "text": "StrandsPalette"
189048
+ }
189049
+ },
189050
+ "parameters": [
189051
+ {
189052
+ "name": "style",
189053
+ "type": {
189054
+ "text": "StrandsPaletteStyle"
189055
+ },
189056
+ "description": "The canvas's computed style."
189057
+ },
189058
+ {
189059
+ "name": "read",
189060
+ "type": {
189061
+ "text": "(value: string) => ColorBytes | undefined"
189062
+ },
189063
+ "description": "Turns a resolved color into bytes, `undefined` where it cannot."
189064
+ }
189065
+ ],
189066
+ "description": "The palette, from the colors the canvas's stylesheet resolved for it.\n\n**Carried on color properties of the canvas, which a canvas never paints**,\nthe way `Aura` carries its ramp: a custom property is handed back as the\ntext that was written, and a color property is resolved by the engine first.\nRead there, each color takes the `--strands-*` hook a page wrote anywhere\nabove the element, and the token otherwise:\n\n- `color`: `--strands-glow`, or `primary`.\n- `text-decoration-color`: `--strands-tint`, or `info`.\n- `outline-color`: `--strands-ground`, or the background.\n- `caret-color` and `column-rule-color`: `--strands-peak`, or the dark and\n the light page's own peak.\n\n**The ground says which way the page runs**, read from its luminance rather\nthan asked of the color mode, which is a private token this tier may not\nreach for. A dark page adds light toward a bright peak; a light page darkens\ntoward a deep one, because light added to near-white is invisible."
189067
+ }
189068
+ ],
189069
+ "exports": [
189070
+ {
189071
+ "kind": "js",
189072
+ "name": "RESTING_PALETTE",
189073
+ "declaration": {
189074
+ "name": "RESTING_PALETTE",
189075
+ "module": "src/strands/palette.ts"
189076
+ }
189077
+ },
189078
+ {
189079
+ "kind": "js",
189080
+ "name": "paletteOf",
189081
+ "declaration": {
189082
+ "name": "paletteOf",
189083
+ "module": "src/strands/palette.ts"
189084
+ }
189085
+ }
189086
+ ]
189087
+ },
189088
+ {
189089
+ "kind": "javascript-module",
189090
+ "path": "src/strands/path.ts",
189091
+ "declarations": [
189092
+ {
189093
+ "kind": "variable",
189094
+ "name": "MAX_POINTS",
189095
+ "type": {
189096
+ "text": "number"
189097
+ },
189098
+ "default": "96",
189099
+ "description": "The most points a path may carry, which is the length of the shader's\nuniform array.\n\nWebGL2 guarantees 256 vertex uniform vectors, and this takes 96 of them. A\npage-long ribbon spends one point per half screen, so 96 covers a page more\nthan forty screens long; a longer one keeps its first 96 points and fades."
189100
+ },
189101
+ {
189102
+ "kind": "function",
189103
+ "name": "boxPath",
189104
+ "return": {
189105
+ "type": {
189106
+ "text": "PathPoint[]"
189107
+ }
189108
+ },
189109
+ "parameters": [
189110
+ {
189111
+ "name": "variant",
189112
+ "type": {
189113
+ "text": "StrandsVariant"
189114
+ },
189115
+ "description": "The form to draw."
189116
+ },
189117
+ {
189118
+ "name": "at",
189119
+ "type": {
189120
+ "text": "number | undefined"
189121
+ },
189122
+ "description": "Where it sits across the box, as a share of the width. A wave crosses the whole width and does not read it."
189123
+ },
189124
+ {
189125
+ "name": "height",
189126
+ "type": {
189127
+ "text": "number"
189128
+ },
189129
+ "description": "The box's height, in CSS pixels. Its width needs no argument: `x` is a share of it."
189130
+ }
189131
+ ],
189132
+ "description": "The ribbon drawn inside its own box, which is what an element without\n`travel` shows."
189133
+ },
189134
+ {
189135
+ "kind": "function",
189136
+ "name": "pagePath",
189137
+ "return": {
189138
+ "type": {
189139
+ "text": "PathPoint[]"
189140
+ }
189141
+ },
189142
+ "parameters": [
189143
+ {
189144
+ "name": "stops",
189145
+ "type": {
189146
+ "text": "readonly PlacedStop[]"
189147
+ },
189148
+ "description": "The resolved stops, in any order."
189149
+ },
189150
+ {
189151
+ "name": "fill",
189152
+ "type": {
189153
+ "text": "StrandsVariant"
189154
+ },
189155
+ "description": "The root's own form, for the stretches no stop claims."
189156
+ },
189157
+ {
189158
+ "name": "width",
189159
+ "type": {
189160
+ "text": "number"
189161
+ },
189162
+ "description": "The viewport's width, in CSS pixels."
189163
+ },
189164
+ {
189165
+ "name": "height",
189166
+ "type": {
189167
+ "text": "number"
189168
+ },
189169
+ "description": "The viewport's height, in CSS pixels."
189170
+ },
189171
+ {
189172
+ "name": "page",
189173
+ "type": {
189174
+ "text": "number"
189175
+ },
189176
+ "description": "The page's height, in CSS pixels."
189177
+ }
189178
+ ],
189179
+ "description": "The ribbon laid down a whole page, which is what an element with `travel`\nshows.\n\nEach stop places its form at its target, in page order. Between two stops\nthe ribbon fills the gap with soft S-curves in `fill`'s place, except\nbetween two waves, where it turns off screen so each wave reads alone.\nWithout stops, `fill` runs the length of the page: a fan opens the page and\na ribbon follows it, waves cross every screen and a third, and a ribbon\nmeanders the whole way. After a last wave the ribbon does not come back, so\nthe page ends on the wave."
189180
+ },
189181
+ {
189182
+ "kind": "function",
189183
+ "name": "catmull",
189184
+ "return": {
189185
+ "type": {
189186
+ "text": "number"
189187
+ }
189188
+ },
189189
+ "parameters": [
189190
+ {
189191
+ "name": "p0",
189192
+ "type": {
189193
+ "text": "number"
189194
+ }
189195
+ },
189196
+ {
189197
+ "name": "p1",
189198
+ "type": {
189199
+ "text": "number"
189200
+ }
189201
+ },
189202
+ {
189203
+ "name": "p2",
189204
+ "type": {
189205
+ "text": "number"
189206
+ }
189207
+ },
189208
+ {
189209
+ "name": "p3",
189210
+ "type": {
189211
+ "text": "number"
189212
+ }
189213
+ },
189214
+ {
189215
+ "name": "f",
189216
+ "type": {
189217
+ "text": "number"
189218
+ }
189219
+ }
189220
+ ],
189221
+ "description": "One coordinate of a uniform Catmull-Rom segment, the same one the shader runs."
189222
+ },
189223
+ {
189224
+ "kind": "function",
189225
+ "name": "lookup",
189226
+ "return": {
189227
+ "type": {
189228
+ "text": "Float32Array"
189229
+ }
189230
+ },
189231
+ "parameters": [
189232
+ {
189233
+ "name": "points",
189234
+ "type": {
189235
+ "text": "readonly PathPoint[]"
189236
+ }
189237
+ }
189238
+ ],
189239
+ "description": "The centerline's `y` at even steps of its parameter, for finding which\nstretch is on screen.\n\nTwenty-four samples a segment, which is finer than any segment is tall on a\nscreen, and computed once a layout rather than once a frame."
189240
+ },
189241
+ {
189242
+ "kind": "function",
189243
+ "name": "visibleRange",
189244
+ "return": {
189245
+ "type": {
189246
+ "text": "readonly [number, number]"
189247
+ }
189248
+ },
189249
+ "parameters": [
189250
+ {
189251
+ "name": "table",
189252
+ "type": {
189253
+ "text": "Float32Array"
189254
+ }
189255
+ },
189256
+ {
189257
+ "name": "top",
189258
+ "type": {
189259
+ "text": "number"
189260
+ }
189261
+ },
189262
+ {
189263
+ "name": "bottom",
189264
+ "type": {
189265
+ "text": "number"
189266
+ }
189267
+ }
189268
+ ],
189269
+ "description": "The stretch of the path that lies between `top` and `bottom`, as a range of\nits parameter.\n\nDrawing only that stretch is what keeps a page-long ribbon as fine as a\nscreen-sized one: the same number of segments, spent where a reader looks.\nA path that does not reach the window answers an empty range."
189270
+ }
189271
+ ],
189272
+ "exports": [
189273
+ {
189274
+ "kind": "js",
189275
+ "name": "MAX_POINTS",
189276
+ "declaration": {
189277
+ "name": "MAX_POINTS",
189278
+ "module": "src/strands/path.ts"
189279
+ }
189280
+ },
189281
+ {
189282
+ "kind": "js",
189283
+ "name": "boxPath",
189284
+ "declaration": {
189285
+ "name": "boxPath",
189286
+ "module": "src/strands/path.ts"
189287
+ }
189288
+ },
189289
+ {
189290
+ "kind": "js",
189291
+ "name": "pagePath",
189292
+ "declaration": {
189293
+ "name": "pagePath",
189294
+ "module": "src/strands/path.ts"
189295
+ }
189296
+ },
189297
+ {
189298
+ "kind": "js",
189299
+ "name": "catmull",
189300
+ "declaration": {
189301
+ "name": "catmull",
189302
+ "module": "src/strands/path.ts"
189303
+ }
189304
+ },
189305
+ {
189306
+ "kind": "js",
189307
+ "name": "lookup",
189308
+ "declaration": {
189309
+ "name": "lookup",
189310
+ "module": "src/strands/path.ts"
189311
+ }
189312
+ },
189313
+ {
189314
+ "kind": "js",
189315
+ "name": "visibleRange",
189316
+ "declaration": {
189317
+ "name": "visibleRange",
189318
+ "module": "src/strands/path.ts"
189319
+ }
189320
+ }
189321
+ ]
189322
+ },
189323
+ {
189324
+ "kind": "javascript-module",
189325
+ "path": "src/strands/renderer.ts",
189326
+ "declarations": [
189327
+ {
189328
+ "kind": "variable",
189329
+ "name": "MAX_STRANDS",
189330
+ "type": {
189331
+ "text": "number"
189332
+ },
189333
+ "default": "340",
189334
+ "description": "The most strands a ribbon draws, at `density` 1."
189335
+ },
189336
+ {
189337
+ "kind": "variable",
189338
+ "name": "MIN_STRANDS",
189339
+ "type": {
189340
+ "text": "number"
189341
+ },
189342
+ "default": "60",
189343
+ "description": "The fewest, at `density` 0. Fewer stops reading as a ribbon at all."
189344
+ },
189345
+ {
189346
+ "kind": "class",
189347
+ "description": "The pipeline, on one context: strands and dust added into a float buffer,\ntwo levels of bloom, and the composite over the page color.\n\n**Created whole or not at all.** `create` answers `null` when any program\nfails to link, so the element has one question to ask and one fallback to\ntake, and never draws half a pipeline.\n\n**Float buffers where the GPU offers them, and eight bits where it does not.**\nLight is added strand by strand, and a hot bend sums far past `1`; an eight\nbit buffer clips it, so there the energy is scaled down on the way in and\nback up in the composite, which keeps the bend hot at the cost of some\ngradation in the dimmest strands.",
189348
+ "name": "StrandsRenderer",
189349
+ "members": [
189350
+ {
189351
+ "kind": "field",
189352
+ "name": "gl",
189353
+ "type": {
189354
+ "text": "WebGL2RenderingContext"
189355
+ },
189356
+ "privacy": "private",
189357
+ "readonly": true,
189358
+ "default": "gl"
189359
+ },
189360
+ {
189361
+ "kind": "field",
189362
+ "name": "line",
189363
+ "type": {
189364
+ "text": "Program"
189365
+ },
189366
+ "privacy": "private",
189367
+ "readonly": true
189368
+ },
189369
+ {
189370
+ "kind": "field",
189371
+ "name": "dust",
189372
+ "type": {
189373
+ "text": "Program"
189374
+ },
189375
+ "privacy": "private",
189376
+ "readonly": true
189377
+ },
189378
+ {
189379
+ "kind": "field",
189380
+ "name": "down",
189381
+ "type": {
189382
+ "text": "Program"
189383
+ },
189384
+ "privacy": "private",
189385
+ "readonly": true
189386
+ },
189387
+ {
189388
+ "kind": "field",
189389
+ "name": "blur",
189390
+ "type": {
189391
+ "text": "Program"
189392
+ },
189393
+ "privacy": "private",
189394
+ "readonly": true
189395
+ },
189396
+ {
189397
+ "kind": "field",
189398
+ "name": "composite",
189399
+ "type": {
189400
+ "text": "Program"
189401
+ },
189402
+ "privacy": "private",
189403
+ "readonly": true
189404
+ },
189405
+ {
189406
+ "kind": "field",
189407
+ "name": "ribbon",
189408
+ "type": {
189409
+ "text": "WebGLVertexArrayObject"
189410
+ },
189411
+ "privacy": "private",
189412
+ "readonly": true
189413
+ },
189414
+ {
189415
+ "kind": "field",
189416
+ "name": "empty",
189417
+ "type": {
189418
+ "text": "WebGLVertexArrayObject"
189419
+ },
189420
+ "privacy": "private",
189421
+ "readonly": true
189422
+ },
189423
+ {
189424
+ "kind": "field",
189425
+ "name": "buffers",
189426
+ "type": {
189427
+ "text": "WebGLBuffer[]"
189428
+ },
189429
+ "privacy": "private",
189430
+ "readonly": true
189431
+ },
189432
+ {
189433
+ "kind": "field",
189434
+ "name": "half",
189435
+ "type": {
189436
+ "text": "boolean"
189437
+ },
189438
+ "privacy": "private",
189439
+ "readonly": true
189440
+ },
189441
+ {
189442
+ "kind": "field",
189443
+ "name": "scale",
189444
+ "type": {
189445
+ "text": "number"
189446
+ },
189447
+ "privacy": "private",
189448
+ "readonly": true
189449
+ },
189450
+ {
189451
+ "kind": "field",
189452
+ "name": "targets",
189453
+ "type": {
189454
+ "text": "{\n far: Target\n farSwap: Target\n near: Target\n nearSwap: Target\n scene: Target\n } | null"
189455
+ },
189456
+ "privacy": "private",
189457
+ "default": "null"
189458
+ },
189459
+ {
189460
+ "kind": "method",
189461
+ "name": "create",
189462
+ "static": true,
189463
+ "return": {
189464
+ "type": {
189465
+ "text": "StrandsRenderer | null"
189466
+ }
189467
+ },
189468
+ "parameters": [
189469
+ {
189470
+ "name": "gl",
189471
+ "type": {
189472
+ "text": "WebGL2RenderingContext"
189473
+ }
189474
+ }
189475
+ ],
189476
+ "description": "The pipeline on `gl`, or `null` when a program does not link, which the\nelement answers with its gradient."
189477
+ },
189478
+ {
189479
+ "kind": "method",
189480
+ "name": "resize",
189481
+ "return": {
189482
+ "type": {
189483
+ "text": "boolean"
189484
+ }
189485
+ },
189486
+ "parameters": [
189487
+ {
189488
+ "name": "width",
189489
+ "type": {
189490
+ "text": "number"
189491
+ }
189492
+ },
189493
+ {
189494
+ "name": "height",
189495
+ "type": {
189496
+ "text": "number"
189497
+ }
189498
+ }
189499
+ ],
189500
+ "description": "Sizes the buffers to the drawing buffer. The bloom runs at a quarter and a\ntwelfth of it, which is where a glow's width lives and a twentieth of the\nfill."
189501
+ },
189502
+ {
189503
+ "kind": "method",
189504
+ "name": "dispose",
189505
+ "return": {
189506
+ "type": {
189507
+ "text": "void"
189508
+ }
189509
+ },
189510
+ "description": "Deletes everything made on the context, ahead of losing it."
189511
+ },
189512
+ {
189513
+ "kind": "method",
189514
+ "name": "release",
189515
+ "privacy": "private",
189516
+ "return": {
189517
+ "type": {
189518
+ "text": "void"
189519
+ }
189520
+ }
189521
+ },
189522
+ {
189523
+ "kind": "method",
189524
+ "name": "target",
189525
+ "privacy": "private",
189526
+ "return": {
189527
+ "type": {
189528
+ "text": "Target | null"
189529
+ }
189530
+ },
189531
+ "parameters": [
189532
+ {
189533
+ "name": "width",
189534
+ "type": {
189535
+ "text": "number"
189536
+ }
189537
+ },
189538
+ {
189539
+ "name": "height",
189540
+ "type": {
189541
+ "text": "number"
189542
+ }
189543
+ }
189544
+ ]
189545
+ },
189546
+ {
189547
+ "kind": "method",
189548
+ "name": "use",
189549
+ "privacy": "private",
189550
+ "return": {
189551
+ "type": {
189552
+ "text": "void"
189553
+ }
189554
+ },
189555
+ "parameters": [
189556
+ {
189557
+ "name": "program",
189558
+ "type": {
189559
+ "text": "Program"
189560
+ }
189561
+ },
189562
+ {
189563
+ "name": "frame",
189564
+ "type": {
189565
+ "text": "StrandsFrame"
189566
+ }
189567
+ }
189568
+ ],
189569
+ "description": "The uniforms every strand and speck reads."
189570
+ },
189571
+ {
189572
+ "kind": "method",
189573
+ "name": "shrink",
189574
+ "privacy": "private",
189575
+ "return": {
189576
+ "type": {
189577
+ "text": "void"
189578
+ }
189579
+ },
189580
+ "parameters": [
189581
+ {
189582
+ "name": "from",
189583
+ "type": {
189584
+ "text": "Target"
189585
+ }
189586
+ },
189587
+ {
189588
+ "name": "into",
189589
+ "type": {
189590
+ "text": "Target"
189591
+ }
189592
+ }
189593
+ ]
189594
+ },
189595
+ {
189596
+ "kind": "method",
189597
+ "name": "smear",
189598
+ "privacy": "private",
189599
+ "return": {
189600
+ "type": {
189601
+ "text": "void"
189602
+ }
189603
+ },
189604
+ "parameters": [
189605
+ {
189606
+ "name": "target",
189607
+ "type": {
189608
+ "text": "Target"
189609
+ }
189610
+ },
189611
+ {
189612
+ "name": "swap",
189613
+ "type": {
189614
+ "text": "Target"
189615
+ }
189616
+ },
189617
+ {
189618
+ "name": "radius",
189619
+ "type": {
189620
+ "text": "number"
189621
+ }
189622
+ }
189623
+ ],
189624
+ "description": "A separable blur of `target`, through `swap` and back."
189625
+ },
189626
+ {
189627
+ "kind": "method",
189628
+ "name": "pass",
189629
+ "privacy": "private",
189630
+ "return": {
189631
+ "type": {
189632
+ "text": "void"
189633
+ }
189634
+ },
189635
+ "parameters": [
189636
+ {
189637
+ "name": "program",
189638
+ "type": {
189639
+ "text": "Program"
189640
+ }
189641
+ },
189642
+ {
189643
+ "name": "into",
189644
+ "type": {
189645
+ "text": "Target"
189646
+ }
189647
+ },
189648
+ {
189649
+ "name": "bind",
189650
+ "type": {
189651
+ "text": "() => void"
189652
+ }
189653
+ }
189654
+ ]
189655
+ },
189656
+ {
189657
+ "kind": "method",
189658
+ "name": "texture",
189659
+ "privacy": "private",
189660
+ "return": {
189661
+ "type": {
189662
+ "text": "void"
189663
+ }
189664
+ },
189665
+ "parameters": [
189666
+ {
189667
+ "name": "program",
189668
+ "type": {
189669
+ "text": "Program"
189670
+ }
189671
+ },
189672
+ {
189673
+ "name": "name",
189674
+ "type": {
189675
+ "text": "string"
189676
+ }
189677
+ },
189678
+ {
189679
+ "name": "unit",
189680
+ "type": {
189681
+ "text": "number"
189682
+ }
189683
+ },
189684
+ {
189685
+ "name": "from",
189686
+ "type": {
189687
+ "text": "Target"
189688
+ }
189689
+ }
189690
+ ]
189691
+ },
189692
+ {
189693
+ "kind": "method",
189694
+ "name": "vec3",
189695
+ "privacy": "private",
189696
+ "return": {
189697
+ "type": {
189698
+ "text": "void"
189699
+ }
189700
+ },
189701
+ "parameters": [
189702
+ {
189703
+ "name": "program",
189704
+ "type": {
189705
+ "text": "Program"
189706
+ }
189707
+ },
189708
+ {
189709
+ "name": "name",
189710
+ "type": {
189711
+ "text": "string"
189712
+ }
189713
+ },
189714
+ {
189715
+ "name": "value",
189716
+ "type": {
189717
+ "text": "readonly [number, number, number]"
189718
+ }
189719
+ }
189720
+ ]
189721
+ },
189722
+ {
189723
+ "kind": "method",
189724
+ "name": "float",
189725
+ "privacy": "private",
189726
+ "return": {
189727
+ "type": {
189728
+ "text": "void"
189729
+ }
189730
+ },
189731
+ "parameters": [
189732
+ {
189733
+ "name": "program",
189734
+ "type": {
189735
+ "text": "Program"
189736
+ }
189737
+ },
189738
+ {
189739
+ "name": "name",
189740
+ "type": {
189741
+ "text": "string"
189742
+ }
189743
+ },
189744
+ {
189745
+ "name": "value",
189746
+ "type": {
189747
+ "text": "number"
189748
+ }
189749
+ }
189750
+ ]
189751
+ }
189752
+ ],
189753
+ "helix": {}
189754
+ }
189755
+ ],
189756
+ "exports": [
189757
+ {
189758
+ "kind": "js",
189759
+ "name": "MAX_STRANDS",
189760
+ "declaration": {
189761
+ "name": "MAX_STRANDS",
189762
+ "module": "src/strands/renderer.ts"
189763
+ }
189764
+ },
189765
+ {
189766
+ "kind": "js",
189767
+ "name": "MIN_STRANDS",
189768
+ "declaration": {
189769
+ "name": "MIN_STRANDS",
189770
+ "module": "src/strands/renderer.ts"
189771
+ }
189772
+ },
189773
+ {
189774
+ "kind": "js",
189775
+ "name": "StrandsRenderer",
189776
+ "declaration": {
189777
+ "name": "StrandsRenderer",
189778
+ "module": "src/strands/renderer.ts"
189779
+ }
189780
+ }
189781
+ ]
189782
+ },
189783
+ {
189784
+ "kind": "javascript-module",
189785
+ "path": "src/strands/root/strands-root.css.ts",
189786
+ "declarations": [
189787
+ {
189788
+ "kind": "variable",
189789
+ "name": "styles"
189790
+ }
189791
+ ],
189792
+ "exports": [
189793
+ {
189794
+ "kind": "js",
189795
+ "name": "styles",
189796
+ "declaration": {
189797
+ "name": "styles",
189798
+ "module": "src/strands/root/strands-root.css.ts"
189799
+ }
189800
+ }
189801
+ ]
189802
+ },
189803
+ {
189804
+ "kind": "javascript-module",
189805
+ "path": "src/strands/root/strands-root.ts",
189806
+ "declarations": [
189807
+ {
189808
+ "kind": "class",
189809
+ "description": "Hundreds of thin strands are drawn as one ribbon, and the light they add\ntogether is bloomed, so where they converge the ribbon burns hot. The ribbon\nmoves on its own all the time: it sways and breathes, its strands wave and\nroll over one another, and light runs along them.\n\nIts palette comes from the tokens. The strands are `--helix-color-primary`,\na few are `--helix-color-info` for depth, and the page they light is\n`--helix-color-background`. On a light page the light becomes ink, because\nlight added to near-white cannot be seen.\n\n**Three forms, set with `variant`.** `fan` is a tight, bright bend with its\narms opening to the right. `ribbon`, the default, is a broad, soft ribbon in\nlong curves. `waves` is sharp strands crossing the full width.\n\n**In its own box, by default.** The element fills the box it is given, the\nway an image does, and `at` places the fan's bend or the ribbon's axis across\nit. Content placed inside sits over the ribbon, in the `content` part.\n\n**Down the whole page, with `travel`.** The element fixes itself behind the\npage, on `--helix-layer-beneath`, and lays one ribbon from the top of the page to the\nbottom, so scrolling travels along it. Put `helix-strands-stop` elements\ninside to pin a form to a section: each names an element with `for` and says\nwhich form the ribbon takes there. Between stops the ribbon fills the gap in\nits own `variant`, and between two waves it turns off screen so each wave\nreads alone. Set `z-index` on the element to move it.\n\nThe ribbon stops moving in these cases:\n- `prefers-reduced-motion` is set. The element shows one still frame, and in\n `travel` still follows the scroll, without easing.\n- The element is off screen or in a background tab.\n\nIt shows a gradient from the same tokens in these cases, and matches\n`:state(fallback)` and sends `helix-strands-fallback` with the reason:\n- The renderer draws on the CPU, such as a headless browser or a machine with\n no usable GPU.\n- There is no WebGL, or the browser took the drawing context back.\n\nStrands is styled only and has behavior, as `Aura` does: its behavior is\ndrawing to a canvas, so there is no structure for a headless version to hold.",
189810
+ "name": "HelixStrands",
189811
+ "cssProperties": [
189812
+ {
189813
+ "description": "The color of most strands. Defaults to `--helix-color-primary`.",
189814
+ "name": "--strands-glow"
189815
+ },
189816
+ {
189817
+ "description": "The page the light is added to. Defaults to `--helix-color-background`.",
189818
+ "name": "--strands-ground"
189819
+ },
189820
+ {
189821
+ "description": "The hottest strands, and on a light page the ink the light darkens toward. Defaults to `--helix-color-primary-hover` on a dark page and `--helix-color-primary-active` on a light one.",
189822
+ "name": "--strands-peak"
189823
+ },
189824
+ {
189825
+ "description": "The color of a few strands, for depth. Defaults to `--helix-color-info`.",
189826
+ "name": "--strands-tint"
189827
+ }
189828
+ ],
189829
+ "cssParts": [
189830
+ {
189831
+ "description": "The surface the ribbon draws into.",
189832
+ "name": "canvas"
189833
+ },
189834
+ {
189835
+ "description": "The box over the ribbon that holds the content. It covers the element.",
189836
+ "name": "content"
189837
+ }
189838
+ ],
189839
+ "slots": [
189840
+ {
189841
+ "description": "Content drawn over the ribbon, such as a heading, and the `helix-strands-stop` elements that pin its forms in `travel`.",
189842
+ "name": ""
189843
+ }
189844
+ ],
189845
+ "members": [
189846
+ {
189847
+ "kind": "field",
189848
+ "name": "at",
189849
+ "type": {
189850
+ "text": "number | undefined"
189851
+ },
189852
+ "description": "Where the form sits across the box, as a share of the width: the fan's\nbend or the ribbon's axis. `0` is the left edge and `1` the right. A wave\ncrosses the whole width and does not read it. Unset, a fan bends at `0.4`\nand a ribbon runs down the middle.\n\n**A share rather than a length**, so the ribbon keeps its place when the\nbox changes shape. Read inside a box only; in `travel` each stop has its\nown.",
189853
+ "attribute": "at"
189854
+ },
189855
+ {
189856
+ "kind": "field",
189857
+ "name": "density",
189858
+ "type": {
189859
+ "text": "number"
189860
+ },
189861
+ "default": "0.8",
189862
+ "description": "How many strands the ribbon has, from `0`, sixty, to `1`, three hundred and\nforty. Clamped to that range.",
189863
+ "attribute": "density"
189864
+ },
189865
+ {
189866
+ "kind": "field",
189867
+ "name": "gain",
189868
+ "type": {
189869
+ "text": "number"
189870
+ },
189871
+ "default": "1",
189872
+ "description": "Overall brightness, as a multiplier on the light.",
189873
+ "attribute": "gain"
189874
+ },
189875
+ {
189876
+ "kind": "field",
189877
+ "name": "softness",
189878
+ "type": {
189879
+ "text": "number"
189880
+ },
189881
+ "default": "0.55",
189882
+ "description": "The share of strands drawn out of focus where the ribbon is wide, from `0`,\nevery strand sharp, to `1`, every one soft. Clamped to that range. A tight\nform, such as a fan's bend or a wave, stays sharp whatever this says.",
189883
+ "attribute": "softness"
189884
+ },
189885
+ {
189886
+ "kind": "field",
189887
+ "name": "speed",
189888
+ "type": {
189889
+ "text": "number"
189890
+ },
189891
+ "default": "1",
189892
+ "description": "How fast the ribbon moves, as a multiplier on time. `0` holds it still.",
189893
+ "attribute": "speed"
189894
+ },
189895
+ {
189896
+ "kind": "field",
189897
+ "name": "spread",
189898
+ "type": {
189899
+ "text": "number"
189900
+ },
189901
+ "default": "1",
189902
+ "description": "How wide the ribbon is, as a multiplier on each form's own width.",
189903
+ "attribute": "spread"
189904
+ },
189905
+ {
189906
+ "kind": "field",
189907
+ "name": "travel",
189908
+ "type": {
189909
+ "text": "boolean"
189910
+ },
189911
+ "default": "false",
189912
+ "description": "Whether the ribbon is laid down the whole page, so scrolling travels along\nit.\n\nReflected because the stylesheet selects on it: in `travel` the host fixes\nitself to the viewport, behind the page.",
189913
+ "attribute": "travel",
189914
+ "reflects": true
189915
+ },
189916
+ {
189917
+ "kind": "field",
189918
+ "name": "variant",
189919
+ "type": {
189920
+ "text": "'fan' | 'ribbon' | 'waves' | undefined"
189921
+ },
189922
+ "description": "The form the ribbon takes. When it is not set, the form is `ribbon`. In\n`travel`, the form of every stretch no stop claims.",
189923
+ "attribute": "variant"
189924
+ },
189925
+ {
189926
+ "kind": "field",
189927
+ "name": "palette",
189928
+ "type": {
189929
+ "text": "StrandsPalette"
189930
+ },
189931
+ "privacy": "private",
189932
+ "default": "{ ...RESTING_PALETTE }",
189933
+ "description": "The colors, resolved from what the canvas carries. Aura's approach, in `readPalette`."
189934
+ },
189935
+ {
189936
+ "kind": "field",
189937
+ "name": "carried",
189938
+ "type": {
189939
+ "text": "{ canvas: HTMLCanvasElement; style: CSSStyleDeclaration; text: string } | null"
189940
+ },
189941
+ "privacy": "private",
189942
+ "default": "null",
189943
+ "description": "The canvas's live computed style, and the five colors it last carried."
189944
+ },
189945
+ {
189946
+ "kind": "field",
189947
+ "name": "fallback",
189948
+ "type": {
189949
+ "text": "HelixStrandsFallbackEvent['detail']['reason'] | undefined"
189950
+ },
189951
+ "privacy": "private",
189952
+ "description": "Why the gradient shows, while it does, or `undefined` while the ribbon draws."
189953
+ },
189954
+ {
189955
+ "kind": "field",
189956
+ "name": "refused",
189957
+ "type": {
189958
+ "text": "HelixStrandsFallbackEvent['detail']['reason']"
189959
+ },
189960
+ "privacy": "private",
189961
+ "default": "'unavailable'",
189962
+ "description": "Why the last `build` drew nothing, for the fallback it leads to."
189963
+ },
189964
+ {
189965
+ "kind": "field",
189966
+ "name": "canvas",
189967
+ "type": {
189968
+ "text": "HTMLCanvasElement | null"
189969
+ },
189970
+ "privacy": "private",
189971
+ "default": "null"
189972
+ },
189973
+ {
189974
+ "kind": "field",
189975
+ "name": "gl",
189976
+ "type": {
189977
+ "text": "WebGL2RenderingContext | null"
189978
+ },
189979
+ "privacy": "private",
189980
+ "default": "null"
189981
+ },
189982
+ {
189983
+ "kind": "field",
189984
+ "name": "renderer",
189985
+ "type": {
189986
+ "text": "StrandsRenderer | null"
189987
+ },
189988
+ "privacy": "private",
189989
+ "default": "null"
189990
+ },
189991
+ {
189992
+ "kind": "field",
189993
+ "name": "release",
189994
+ "type": {
189995
+ "text": "number"
189996
+ },
189997
+ "privacy": "private",
189998
+ "default": "0",
189999
+ "description": "The pending context release, or `0`. Canceled by a reconnection."
190000
+ },
190001
+ {
190002
+ "kind": "field",
190003
+ "name": "CONTEXT",
190004
+ "type": {
190005
+ "text": "WebGLContextAttributes"
190006
+ },
190007
+ "privacy": "private",
190008
+ "static": true,
190009
+ "readonly": true,
190010
+ "default": "{ alpha: true, antialias: false, depth: false, powerPreference: 'low-power', stencil: false, }",
190011
+ "description": "What every context is asked for, the same as Aura's and the probe's."
190012
+ },
190013
+ {
190014
+ "kind": "field",
190015
+ "name": "elapsed",
190016
+ "type": {
190017
+ "text": "number"
190018
+ },
190019
+ "privacy": "private",
190020
+ "default": "0",
190021
+ "description": "Seconds of motion so far, accumulated so a paused tab resumes where it was."
190022
+ },
190023
+ {
190024
+ "kind": "field",
190025
+ "name": "width",
190026
+ "type": {
190027
+ "text": "number"
190028
+ },
190029
+ "privacy": "private",
190030
+ "default": "0",
190031
+ "description": "The drawing buffer, in device pixels, and the ratio it was sized at."
190032
+ },
190033
+ {
190034
+ "kind": "field",
190035
+ "name": "height",
190036
+ "type": {
190037
+ "text": "number"
190038
+ },
190039
+ "privacy": "private",
190040
+ "default": "0"
190041
+ },
190042
+ {
190043
+ "kind": "field",
190044
+ "name": "dpr",
190045
+ "type": {
190046
+ "text": "number"
190047
+ },
190048
+ "privacy": "private",
190049
+ "default": "1"
190050
+ },
190051
+ {
190052
+ "kind": "field",
190053
+ "name": "box",
190054
+ "type": {
190055
+ "text": "object"
190056
+ },
190057
+ "privacy": "private",
190058
+ "default": "{ height: 1, width: 1 }",
190059
+ "description": "The element's box, in CSS pixels, from the last measurement."
190060
+ },
190061
+ {
190062
+ "kind": "field",
190063
+ "name": "points",
190064
+ "privacy": "private",
190065
+ "readonly": true,
190066
+ "default": "new Float32Array(MAX_POINTS * 4)",
190067
+ "description": "The path, padded to the shader's array, and how many points are in use."
190068
+ },
190069
+ {
190070
+ "kind": "field",
190071
+ "name": "count",
190072
+ "type": {
190073
+ "text": "number"
190074
+ },
190075
+ "privacy": "private",
190076
+ "default": "0"
190077
+ },
190078
+ {
190079
+ "kind": "field",
190080
+ "name": "table",
190081
+ "type": {
190082
+ "text": "Float32Array"
190083
+ },
190084
+ "privacy": "private",
190085
+ "default": "new Float32Array(1)",
190086
+ "description": "In `travel`, the path's `y` at even steps of its parameter."
190087
+ },
190088
+ {
190089
+ "kind": "field",
190090
+ "name": "offset",
190091
+ "type": {
190092
+ "text": "number"
190093
+ },
190094
+ "privacy": "private",
190095
+ "default": "0",
190096
+ "description": "In `travel`, the scroll position the ribbon is drawn at, easing toward the page's."
190097
+ },
190098
+ {
190099
+ "kind": "field",
190100
+ "name": "opened",
190101
+ "type": {
190102
+ "text": "boolean"
190103
+ },
190104
+ "privacy": "private",
190105
+ "default": "false",
190106
+ "description": "Whether the opening frame has been drawn. Aura's settle: see `open`."
190107
+ },
190108
+ {
190109
+ "kind": "field",
190110
+ "name": "opening",
190111
+ "type": {
190112
+ "text": "number"
190113
+ },
190114
+ "privacy": "private",
190115
+ "default": "0"
190116
+ },
190117
+ {
190118
+ "kind": "field",
190119
+ "name": "openBy",
190120
+ "type": {
190121
+ "text": "number"
190122
+ },
190123
+ "privacy": "private",
190124
+ "default": "0"
190125
+ },
190126
+ {
190127
+ "kind": "field",
190128
+ "name": "laying",
190129
+ "type": {
190130
+ "text": "number"
190131
+ },
190132
+ "privacy": "private",
190133
+ "default": "0",
190134
+ "description": "A layout booked for the next frame, so a burst of changes lays out once."
190135
+ },
190136
+ {
190137
+ "kind": "field",
190138
+ "name": "pageObserver",
190139
+ "type": {
190140
+ "text": "ResizeObserver | null"
190141
+ },
190142
+ "privacy": "private",
190143
+ "default": "null",
190144
+ "description": "In `travel`, what tells the element that the page or its stops moved."
190145
+ },
190146
+ {
190147
+ "kind": "field",
190148
+ "name": "stopObserver",
190149
+ "type": {
190150
+ "text": "MutationObserver | null"
190151
+ },
190152
+ "privacy": "private",
190153
+ "default": "null"
190154
+ },
190155
+ {
190156
+ "kind": "field",
190157
+ "name": "gate",
190158
+ "privacy": "private",
190159
+ "readonly": true,
190160
+ "default": "new PaintGateController(this, { canRun: () => !!this.gl && !this.gl.isContextLost() && this.width > 0 && this.opened, onFrame: (delta) => { this.advance(delta) }, onMotion: (reduced) => { if (reduced) { this.paintOnce() } }, onResize: () => { this.resized() }, })"
190161
+ },
190162
+ {
190163
+ "kind": "method",
190164
+ "name": "start",
190165
+ "privacy": "private",
190166
+ "return": {
190167
+ "type": {
190168
+ "text": "void"
190169
+ }
190170
+ },
190171
+ "description": "Everything the canvas needs, from either lifecycle. Aura's `start`, line for line in intent."
190172
+ },
190173
+ {
190174
+ "kind": "method",
190175
+ "name": "build",
190176
+ "privacy": "private",
190177
+ "return": {
190178
+ "type": {
190179
+ "text": "boolean"
190180
+ }
190181
+ },
190182
+ "description": "The context and the pipeline, from whatever canvas can still give one. A\nspent canvas is replaced rather than re-asked, for the reason Aura's\n`build` records."
190183
+ },
190184
+ {
190185
+ "kind": "method",
190186
+ "name": "prepare",
190187
+ "privacy": "private",
190188
+ "return": {
190189
+ "type": {
190190
+ "text": "boolean"
190191
+ }
190192
+ },
190193
+ "description": "The pipeline on the context already held, which a restored context comes back to alone."
190194
+ },
190195
+ {
190196
+ "kind": "field",
190197
+ "name": "drop",
190198
+ "privacy": "private",
190199
+ "readonly": true,
190200
+ "description": "Gives the context back, once nothing has claimed the element again. Aura's `drop`."
190201
+ },
190202
+ {
190203
+ "kind": "field",
190204
+ "name": "handleLost",
190205
+ "privacy": "private",
190206
+ "readonly": true,
190207
+ "description": "Stops for a context the browser took, hides the canvas, and asks for it back."
190208
+ },
190209
+ {
190210
+ "kind": "field",
190211
+ "name": "handleRestored",
190212
+ "privacy": "private",
190213
+ "readonly": true,
190214
+ "description": "Draws again on the context the browser gave back."
190215
+ },
190216
+ {
190217
+ "kind": "method",
190218
+ "name": "fallBack",
190219
+ "privacy": "private",
190220
+ "return": {
190221
+ "type": {
190222
+ "text": "void"
190223
+ }
190224
+ },
190225
+ "parameters": [
190226
+ {
190227
+ "name": "reason",
190228
+ "type": {
190229
+ "text": "HelixStrandsFallbackEvent['detail']['reason']"
190230
+ }
190231
+ }
190232
+ ],
190233
+ "description": "Shows the gradient, and says so once each time it starts to."
190234
+ },
190235
+ {
190236
+ "kind": "method",
190237
+ "name": "readPalette",
190238
+ "privacy": "private",
190239
+ "return": {
190240
+ "type": {
190241
+ "text": "void"
190242
+ }
190243
+ },
190244
+ "description": "The colors, converted only when the text the canvas carries moved."
190245
+ },
190246
+ {
190247
+ "kind": "field",
190248
+ "name": "handleRestyle",
190249
+ "privacy": "private",
190250
+ "readonly": true,
190251
+ "description": "One frame for a stopped loop, once a color the canvas carries has moved."
190252
+ },
190253
+ {
190254
+ "kind": "method",
190255
+ "name": "measure",
190256
+ "privacy": "private",
190257
+ "return": {
190258
+ "type": {
190259
+ "text": "boolean"
190260
+ }
190261
+ },
190262
+ "description": "Re-reads the box and resizes the drawing buffer to match. Called from the\ngate's observer, never per frame, and an empty box is layout that has not\nhappened: Aura's `measure` records both.\n\n**A ratio under Aura's**, 0.75 of the device's up to two, because a strand\nis a line rather than a field and the bloom hides the rest; the buffer's\nedge and pixel ceilings then apply as they do there."
190263
+ },
190264
+ {
190265
+ "kind": "method",
190266
+ "name": "layout",
190267
+ "privacy": "private",
190268
+ "return": {
190269
+ "type": {
190270
+ "text": "void"
190271
+ }
190272
+ },
190273
+ "description": "Lays the path out again: inside the box, or down the page from the stops.\n\nCheap, a few dozen points and a table of a few hundred numbers, so it runs\non any change that could move the path rather than working out which did."
190274
+ },
190275
+ {
190276
+ "kind": "method",
190277
+ "name": "placedStops",
190278
+ "privacy": "private",
190279
+ "return": {
190280
+ "type": {
190281
+ "text": "PlacedStop[]"
190282
+ }
190283
+ },
190284
+ "description": "The stops inside, each with its target's place on the page. A stop naming nothing is skipped."
190285
+ },
190286
+ {
190287
+ "kind": "method",
190288
+ "name": "watchPage",
190289
+ "privacy": "private",
190290
+ "return": {
190291
+ "type": {
190292
+ "text": "void"
190293
+ }
190294
+ },
190295
+ "parameters": [
190296
+ {
190297
+ "name": "on",
190298
+ "type": {
190299
+ "text": "boolean"
190300
+ }
190301
+ }
190302
+ ],
190303
+ "description": "In `travel`, follows the page: the scroll it travels along, the page's\nheight and its sections moving, and the stops being changed."
190304
+ },
190305
+ {
190306
+ "kind": "field",
190307
+ "name": "relayout",
190308
+ "privacy": "private",
190309
+ "readonly": true,
190310
+ "description": "A layout on the next frame, once, however many changes asked for one."
190311
+ },
190312
+ {
190313
+ "kind": "field",
190314
+ "name": "handleScroll",
190315
+ "privacy": "private",
190316
+ "readonly": true,
190317
+ "description": "The page scrolled. A running loop eases toward it on its own; a stopped\none, for a reader who asked for no motion, jumps there and paints once."
190318
+ },
190319
+ {
190320
+ "kind": "method",
190321
+ "name": "paint",
190322
+ "privacy": "private",
190323
+ "return": {
190324
+ "type": {
190325
+ "text": "void"
190326
+ }
190327
+ }
190328
+ },
190329
+ {
190330
+ "kind": "method",
190331
+ "name": "resized",
190332
+ "privacy": "private",
190333
+ "return": {
190334
+ "type": {
190335
+ "text": "void"
190336
+ }
190337
+ },
190338
+ "description": "The box changed: measure, and repaint at once, because resizing cleared the buffer."
190339
+ },
190340
+ {
190341
+ "kind": "method",
190342
+ "name": "open",
190343
+ "privacy": "private",
190344
+ "return": {
190345
+ "type": {
190346
+ "text": "void"
190347
+ }
190348
+ },
190349
+ "description": "The opening frame, one animation frame after the box last changed. Aura's `open`."
190350
+ },
190351
+ {
190352
+ "kind": "method",
190353
+ "name": "paintOnce",
190354
+ "privacy": "private",
190355
+ "return": {
190356
+ "type": {
190357
+ "text": "void"
190358
+ }
190359
+ },
190360
+ "description": "One frame, now, for a change that has to show while the loop is stopped."
190361
+ },
190362
+ {
190363
+ "kind": "field",
190364
+ "name": "CAPPED",
190365
+ "privacy": "private",
190366
+ "static": true,
190367
+ "readonly": true,
190368
+ "description": "The shortest gap between two frames, in seconds, while nothing is being\nfollowed. Aura's cap, for Aura's reason: a drifting ribbon does not need\nthe display's rate."
190369
+ },
190370
+ {
190371
+ "kind": "field",
190372
+ "name": "held",
190373
+ "type": {
190374
+ "text": "number"
190375
+ },
190376
+ "privacy": "private",
190377
+ "default": "0",
190378
+ "description": "What the skipped frames were worth, spent on the next one drawn."
190379
+ },
190380
+ {
190381
+ "kind": "method",
190382
+ "name": "advance",
190383
+ "privacy": "private",
190384
+ "return": {
190385
+ "type": {
190386
+ "text": "void"
190387
+ }
190388
+ },
190389
+ "parameters": [
190390
+ {
190391
+ "name": "delta",
190392
+ "type": {
190393
+ "text": "number"
190394
+ }
190395
+ }
190396
+ ]
190397
+ },
190398
+ {
190399
+ "kind": "field",
190400
+ "name": "tier",
190401
+ "type": {
190402
+ "text": "string"
190403
+ },
190404
+ "static": true,
190405
+ "default": "'helix-headless-'",
190406
+ "description": "The prefix this tier registers its elements under.\n\n**A component that renders another renders its own tier's version of it**,\nso `helix-headless-pagination-size` composes `helix-headless-select` and\n`helix-pagination-size` composes `helix-select`. One template says\n`${this.tag('select')}` and each tier answers with its own name.\n\n**The public tag may not be the composed one, in either tier.** Using it\ncosts three things: the name means two different things depending on what a\nconsumer imported, the headless tier composes an element it does not ship,\nand the composition cannot be tested there at all, because there is no\n`helix-select` on that tier to test it against.\n\n**A prefix rather than an override per composition**, which was the first\nplan and does not compile. An override re-renders the fragment from the\nsubclass, and the fragment reads members the base keeps private:\n`PaginationSize` alone would have had to widen `options`, `current` and\n`handleChange` to `protected` so a subclass could say the same thing again.\nSixteen families of that is a lot of encapsulation spent on saying one\nword differently.",
190407
+ "inheritedFrom": {
190408
+ "name": "HelixElement",
190409
+ "module": "src/helix-element/helix-element.ts"
190410
+ }
190411
+ },
190412
+ {
190413
+ "kind": "method",
190414
+ "name": "tag",
190415
+ "privacy": "protected",
190416
+ "return": {
190417
+ "type": {
190418
+ "text": "StaticValue"
190419
+ }
190420
+ },
190421
+ "parameters": [
190422
+ {
190423
+ "name": "name",
190424
+ "type": {
190425
+ "text": "string"
190426
+ }
190427
+ }
190428
+ ],
190429
+ "description": "One composed tag, as a static value a template can interpolate.\n\nWhat `unsafeStatic` returns, safe by construction: the name is a literal in\nour own source and the prefix is one of two strings this class defines.\nCalled per render and not cached, which costs nothing, because\n`static-html` keys its template cache on the joined string rather than on\nthe object.\n\n**Written out rather than imported, for every element that never renders\none.** `lit/static-html.js` declares no side effects, so importing\n`unsafeStatic` alone kept the module's three `withStatic` calls in every\nbundle: about 210 bytes gzipped on each of the families that compose no\ntag, Divider and Badge among them. The value is lit's cross-copy protocol,\nkeyed by `Symbol.for('')` so that two copies of lit on a page read each\nother's, and a spec holds it equal to `unsafeStatic`'s.",
190430
+ "inheritedFrom": {
190431
+ "name": "HelixElement",
190432
+ "module": "src/helix-element/helix-element.ts"
190433
+ }
190434
+ },
190435
+ {
190436
+ "kind": "method",
190437
+ "name": "partNamed",
190438
+ "privacy": "protected",
190439
+ "return": {
190440
+ "type": {
190441
+ "text": "T | null"
190442
+ }
190443
+ },
190444
+ "parameters": [
190445
+ {
190446
+ "name": "name",
190447
+ "type": {
190448
+ "text": "string"
190449
+ }
190450
+ }
190451
+ ],
190452
+ "description": "One of this element's own parts, by name, or null where it is not rendered.\n\nNot `part`, which every element already has: `Element.part` is the\n`DOMTokenList` of the names the element itself carries, and a method under\nthat name is a type error on every subclass.\n\n**One guard for every lookup.** Lit's server shim has no `querySelector`\non the render root, so a lookup reached during a server render, from a\ngetter a template reads or from `willUpdate`, throws there and nowhere\nelse. Four spellings of the same guard had grown across the library, and\na fifth site with none. Null on the server, which is what the rest of the\ncode already treats a part that has not rendered as.\n\n**`~=` and not `=`.** A part drawn in a state carries a second name while\nthe state holds, `part=\"page page-current\"`, and an exact match stops\nfinding it for exactly as long as it is the one that matters.\n\n`helix component`'s `selectors` reads these calls the way it reads a\n`querySelector('[part=\"x\"]')`, so a name nothing renders is a finding\nrather than a null an optional chain swallows.",
190453
+ "inheritedFrom": {
190454
+ "name": "HelixElement",
190455
+ "module": "src/helix-element/helix-element.ts"
190456
+ }
190457
+ },
190458
+ {
190459
+ "kind": "field",
190460
+ "name": "internals",
190461
+ "type": {
190462
+ "text": "ElementInternals"
190463
+ },
190464
+ "privacy": "protected",
190465
+ "readonly": true,
190466
+ "description": "The element's semantics, set without touching the DOM.\n\n`ElementInternals` sets the implicit role, which an author's own `role`\nattribute still overrides, and it writes no attribute. Setting `role` on the\nhost directly would: that is an attribute the element gives itself after it\nupgrades, which a React consumer's server markup never had, and hydration\nreports it as a mismatch.\n\nAvailable during server rendering. Lit's shim implements `attachInternals`,\nso nothing here needs a guard.",
190467
+ "inheritedFrom": {
190468
+ "name": "HelixElement",
190469
+ "module": "src/helix-element/helix-element.ts"
190470
+ }
190471
+ },
190472
+ {
190473
+ "kind": "method",
190474
+ "name": "toggleState",
190475
+ "privacy": "protected",
190476
+ "return": {
190477
+ "type": {
190478
+ "text": "void"
190479
+ }
190480
+ },
190481
+ "parameters": [
190482
+ {
190483
+ "name": "name",
190484
+ "type": {
190485
+ "text": "string"
190486
+ }
190487
+ },
190488
+ {
190489
+ "name": "on",
190490
+ "type": {
190491
+ "text": "boolean"
190492
+ }
190493
+ }
190494
+ ],
190495
+ "description": "Records a boolean fact about this element as a custom state.\n\n**The host belongs to whoever rendered it, and a component's own\nbookkeeping may not be kept there.** An attribute written on the first\nupdate is markup a consumer's server never sent, so a React consumer\nhydrates a DOM that has gained attributes since and reports a mismatch it\nwill not patch up. A custom state is not in the DOM at all: it carries the\nfact to a stylesheet through `:state()` and leaves the markup alone, so the\nserver's output and the client's agree by construction.\n\n`SETTLED` carries the long version of that argument; `checked`, `open`,\n`invalid` and `has-label` are recorded the same way, each of them a state a\n`default-*` attribute resolves before React reaches the node.\n\n**Deferring the definitions is not a fix and could not be.** Importing them\nfrom an effect so the upgrades fall the other side of hydration works only\nwhile hydration is one pass: anything that splits it, a streamed segment or\na suspended boundary, puts an upgrade back inside the window. Timing cannot\nbe the guarantee when the fact is kept somewhere React reconciles.\n\nFeature-tested rather than assumed, the way `hostAria` tests element\nreferences. An engine without `CustomStateSet` records nothing and keeps\nwhatever the resting rule draws, which is the safe direction to fail.\n\n**The engines the test is for are browsers**: Safari below 17.4 and Firefox\nbelow 126, where the write is a `TypeError`, so a component bypassing this\nfails to render rather than rendering without whatever the state draws.\nLit's server shim sets `states`, so the guard passes there and records a\nstate nothing reads, which is harmless.",
190496
+ "inheritedFrom": {
190497
+ "name": "HelixElement",
190498
+ "module": "src/helix-element/helix-element.ts"
190499
+ }
190500
+ },
190501
+ {
190502
+ "kind": "field",
190503
+ "name": "whenSettled",
190504
+ "type": {
190505
+ "text": "Promise<void>"
190506
+ },
190507
+ "readonly": true,
190508
+ "description": "Resolves a frame after the first update, when transitions are switched on.\n\n**Named `whenSettled` because `settled` is taken four times over**, by\nImage, Splitter and both color controls, none of them about transitions. A\nbase class takes the name every subclass then cannot use.\n\n**The state it reports cannot be watched, which is why this exists.** A\ncustom state is deliberately not in the DOM, so there is no\n`MutationObserver` equivalent for `ElementInternals.states`. Await this\ninstead.\n\nSeparate from `updateComplete`, which resolves in the microtask checkpoint\nthe suppression is still active in. That is the distinction `readyToMove`\nin `@fusion.dev/helix-testing` is written around.\n\nIt never resolves where `requestAnimationFrame` never fires, which is a\nserver, a hidden tab, and happy-dom. Callers that must not hang there race\nit against a timeout, as the happy-dom harness's `readyToMove` does. The\nbrowser harness's awaits it alone: a browser always runs the frame, and a\ntimer beside it was a bet on how long one takes, which a busy run lost.",
190509
+ "default": "new Promise<void>((resolve) => { this.resolveSettled = resolve })",
190510
+ "inheritedFrom": {
190511
+ "name": "HelixElement",
190512
+ "module": "src/helix-element/helix-element.ts"
190513
+ }
190514
+ },
190515
+ {
190516
+ "kind": "field",
190517
+ "name": "resolveSettled",
190518
+ "type": {
190519
+ "text": "() => void"
190520
+ },
190521
+ "privacy": "private",
190522
+ "description": "Resolves `whenSettled`, once, from the frame that records the state.",
190523
+ "inheritedFrom": {
190524
+ "name": "HelixElement",
190525
+ "module": "src/helix-element/helix-element.ts"
190526
+ }
190527
+ },
190528
+ {
190529
+ "kind": "field",
190530
+ "name": "fromServer",
190531
+ "type": {
190532
+ "text": "boolean"
190533
+ },
190534
+ "privacy": "private",
190535
+ "default": "false",
190536
+ "description": "Whether the shadow root was a server's, parsed from declarative shadow DOM.",
190537
+ "inheritedFrom": {
190538
+ "name": "HelixElement",
190539
+ "module": "src/helix-element/helix-element.ts"
190540
+ }
190541
+ },
190542
+ {
190543
+ "kind": "field",
190544
+ "name": "hydrating",
190545
+ "type": {
190546
+ "text": "boolean"
190547
+ },
190548
+ "privacy": "protected",
190549
+ "description": "Whether this update is hydrating a server's markup, and so has to render\nexactly what the server rendered.\n\n**Lit hydrates by assuming the markup already shows the first render.** A\nvalue that differs is recorded and never written, so the page keeps the\nserver's, and a template that differs throws. The server has no children,\nso anything a component reads from its children waits for the update after\nhydration, which `finishHydration` asks for. Without a server's markup the\nfirst render reads them and there is one render.",
190550
+ "readonly": true,
190551
+ "inheritedFrom": {
190552
+ "name": "HelixElement",
190553
+ "module": "src/helix-element/helix-element.ts"
190554
+ }
190555
+ },
190556
+ {
190557
+ "kind": "field",
190558
+ "name": "serverRendered",
190559
+ "type": {
190560
+ "text": "boolean"
190561
+ },
190562
+ "privacy": "protected",
190563
+ "description": "Whether this element hydrated a server's markup rather than rendering its own.\n\nFor what happened before hydration and cannot be heard after it: an image\nthe parser fetched fires `load` or `error` before any listener exists, so a\ncomponent asks the image instead, once, when this is true.",
190564
+ "readonly": true,
190565
+ "inheritedFrom": {
190566
+ "name": "HelixElement",
190567
+ "module": "src/helix-element/helix-element.ts"
190568
+ }
190569
+ },
190570
+ {
190571
+ "kind": "method",
190572
+ "name": "finishHydration",
190573
+ "privacy": "protected",
190574
+ "return": {
190575
+ "type": {
190576
+ "text": "void"
190577
+ }
190578
+ },
190579
+ "description": "Asks for the update a hydration put off, so the reads it skipped happen.\n\nCalled from `firstUpdated`, the end of the hydrating update. The render it\nschedules can only follow that one, which is the exception Lit's\nchange-in-update warning names, and it happens only on a page a server\nrendered.",
190580
+ "inheritedFrom": {
190581
+ "name": "HelixElement",
190582
+ "module": "src/helix-element/helix-element.ts"
190583
+ }
190584
+ },
190585
+ {
190586
+ "kind": "field",
190587
+ "name": "childrenKnown",
190588
+ "type": {
190589
+ "text": "boolean"
190590
+ },
190591
+ "privacy": "protected",
190592
+ "description": "Whether this render can know the children.\n\nA server cannot: its element shim carries attributes and no tree, so\n`children` is undefined there. A render hydrating what a server sent must\nnot, because it has to be the server's render. Anywhere else it can. A\ncomponent whose render depends on its children reads them through\n`knownChildren`, and treats \"not known\" as its own answer rather than as\n\"none\": a list that renders its empty state because nobody has looked yet is\nthe one thing an empty state must never do.",
190593
+ "readonly": true,
190594
+ "inheritedFrom": {
190595
+ "name": "HelixElement",
190596
+ "module": "src/helix-element/helix-element.ts"
190597
+ }
190598
+ },
190599
+ {
190600
+ "kind": "field",
190601
+ "name": "knownChildren",
190602
+ "type": {
190603
+ "text": "Element[]"
190604
+ },
190605
+ "privacy": "protected",
190606
+ "description": "The children a render may read: all of them where they are known, and none otherwise.",
190607
+ "readonly": true,
190608
+ "inheritedFrom": {
190609
+ "name": "HelixElement",
190610
+ "module": "src/helix-element/helix-element.ts"
190611
+ }
190612
+ },
190613
+ {
190614
+ "kind": "field",
190615
+ "name": "assignsByName",
190616
+ "type": {
190617
+ "text": "boolean"
190618
+ },
190619
+ "privacy": "protected",
190620
+ "description": "Whether this element's slots route by name although it asked to assign them\nby hand.\n\n**A declarative shadow root is always the by-name kind.** HTML has no way to\nask for manual assignment, so a component that assigns by hand and hydrates\na server's root gets one where `slot.assign()` does nothing, and its\nchildren land wherever their `slot` attribute sends them. The way through is\nto write that attribute, which is what `route` does. Only there: on a root\nthis element made, assignment stays manual and the consumer's markup is\nnever touched, which is what a React consumer's hydration requires.",
190621
+ "readonly": true,
190622
+ "inheritedFrom": {
190623
+ "name": "HelixElement",
190624
+ "module": "src/helix-element/helix-element.ts"
190625
+ }
190626
+ },
190627
+ {
190628
+ "kind": "method",
190629
+ "name": "route",
190630
+ "privacy": "protected",
190631
+ "return": {
190632
+ "type": {
190633
+ "text": "void"
190634
+ }
190635
+ },
190636
+ "parameters": [
190637
+ {
190638
+ "name": "child",
190639
+ "type": {
190640
+ "text": "Element"
190641
+ }
190642
+ },
190643
+ {
190644
+ "name": "name",
190645
+ "type": {
190646
+ "text": "string | undefined"
190647
+ }
190648
+ }
190649
+ ],
190650
+ "description": "Sends a child to a slot by name, on a root that routes by name.\n\n`undefined` is the default slot. Written only when it differs, so routing\nthe same child again on every update writes nothing.",
190651
+ "inheritedFrom": {
190652
+ "name": "HelixElement",
190653
+ "module": "src/helix-element/helix-element.ts"
190654
+ }
190655
+ },
190656
+ {
190657
+ "kind": "field",
190658
+ "name": "stopInner",
190659
+ "privacy": "protected",
190660
+ "readonly": true,
190661
+ "description": "Stops an inner control's own announcement at this element's boundary.\n\n**A composed control is one control to a consumer, and the natives had no\nequivalent of the stop the prefixed events already get.** `<helix-select>`\nrenders a `<helix-listbox>`, and both announce: the listbox dispatches\n`input` and `change` from its own host, `input` is composed by\nspecification, and a consumer listening on the select therefore heard one\nchoice twice. Measured before this existed, on the styled tier, one choice\non the inner listbox: select `input` twice and `change` three times,\ncombobox, date input, time input and color input twice each. `Command` was\nthe only one that was right, because it happened to reach for\n`stopImmediatePropagation` for a different reason.\n\nBound on the child in the parent's template, so it runs while the event is\nstill at the child and before it can cross. The guard is for the case where\na component binds this on itself: an element must never stop its own\nannouncement, which is the one it exists to make.\n\nThis is the same job the `helix-before-*` handlers do with their own\n`stopPropagation`, and it is separate rather than folded into them because\na consumer may legitimately refuse a request without the notification ever\nhappening: the two travel at different times and one can be absent.",
190662
+ "inheritedFrom": {
190663
+ "name": "HelixElement",
190664
+ "module": "src/helix-element/helix-element.ts"
190665
+ }
190666
+ },
190667
+ {
190668
+ "kind": "method",
190669
+ "name": "relayNativeEvent",
190670
+ "privacy": "protected",
190671
+ "return": {
190672
+ "type": {
190673
+ "text": "void"
190674
+ }
190675
+ },
190676
+ "parameters": [
190677
+ {
190678
+ "name": "event",
190679
+ "type": {
190680
+ "text": "Event"
190681
+ }
190682
+ },
190683
+ {
190684
+ "name": "init",
190685
+ "optional": true,
190686
+ "type": {
190687
+ "text": "EventInit"
190688
+ }
190689
+ }
190690
+ ],
190691
+ "description": "Re-emits a native event from the host, under its own name.\n\nA native event fired by an inner `<input>` or `<textarea>` is not composed,\nso it stops at the shadow boundary and a consumer listening on\n`<helix-input>` hears nothing. Re-dispatching it from the host is what\nmakes the component behave like the control it wraps.\n\nThe relayed event keeps the native name deliberately. `change` is `change`,\nwhich is what a consumer already knows to listen for, and it is what\nreaches React: its synthetic system claims `onChange` and wires it to that\nname, so a prefixed one would never arrive.\n\n`composed` is not forced. It defaults to the original event's own value, so\na relayed `change` stops at the next shadow boundary exactly as a native\none would. Pass it explicitly only where escaping is the intent, and say so\nwhere you do.",
190692
+ "inheritedFrom": {
190693
+ "name": "HelixElement",
190694
+ "module": "src/helix-element/helix-element.ts"
190695
+ }
190696
+ },
190697
+ {
190698
+ "kind": "method",
190699
+ "name": "finalizeStyles",
190700
+ "privacy": "protected",
190701
+ "static": true,
190702
+ "return": {
190703
+ "type": {
190704
+ "text": "CSSResultOrNative[]"
190705
+ }
190706
+ },
190707
+ "parameters": [
190708
+ {
190709
+ "name": "styles",
190710
+ "optional": true,
190711
+ "type": {
190712
+ "text": "CSSResultOrNative | CSSResultOrNative[]"
190713
+ }
190714
+ }
190715
+ ],
190716
+ "description": "Prepends the shadow-root reset to every subclass's styles, so no component\nhas to remember to include it.",
190717
+ "inheritedFrom": {
190718
+ "name": "HelixElement",
190719
+ "module": "src/helix-element/helix-element.ts"
190720
+ }
190721
+ },
190722
+ {
190723
+ "kind": "method",
190724
+ "name": "performUpdate",
190725
+ "privacy": "protected",
190726
+ "return": {
190727
+ "type": {
190728
+ "text": "void"
190729
+ }
190730
+ },
190731
+ "description": "The first update, timed where a page asked to measure what the components\ncost, and a property read where it did not: see `reportRender`.",
190732
+ "inheritedFrom": {
190733
+ "name": "HelixElement",
190734
+ "module": "src/helix-element/helix-element.ts"
190735
+ }
190736
+ }
190737
+ ],
190738
+ "events": [
190739
+ {
190740
+ "type": {
190741
+ "text": "HelixStrandsFallbackEvent"
190742
+ },
190743
+ "description": "Fired each time the element stops drawing its ribbon and shows its gradient, with the reason.",
190744
+ "name": "helix-strands-fallback",
190745
+ "reactProp": "onhelix-strands-fallback"
190746
+ }
190747
+ ],
190748
+ "attributes": [
190749
+ {
190750
+ "name": "at",
190751
+ "type": {
190752
+ "text": "number | undefined"
190753
+ },
190754
+ "description": "Where the form sits across the box, as a share of the width: the fan's\nbend or the ribbon's axis. `0` is the left edge and `1` the right. A wave\ncrosses the whole width and does not read it. Unset, a fan bends at `0.4`\nand a ribbon runs down the middle.\n\n**A share rather than a length**, so the ribbon keeps its place when the\nbox changes shape. Read inside a box only; in `travel` each stop has its\nown.",
190755
+ "fieldName": "at"
190756
+ },
190757
+ {
190758
+ "name": "density",
190759
+ "type": {
190760
+ "text": "number"
190761
+ },
190762
+ "default": "0.8",
190763
+ "description": "How many strands the ribbon has, from `0`, sixty, to `1`, three hundred and\nforty. Clamped to that range.",
190764
+ "fieldName": "density"
190765
+ },
190766
+ {
190767
+ "name": "gain",
190768
+ "type": {
190769
+ "text": "number"
190770
+ },
190771
+ "default": "1",
190772
+ "description": "Overall brightness, as a multiplier on the light.",
190773
+ "fieldName": "gain"
190774
+ },
190775
+ {
190776
+ "name": "softness",
190777
+ "type": {
190778
+ "text": "number"
190779
+ },
190780
+ "default": "0.55",
190781
+ "description": "The share of strands drawn out of focus where the ribbon is wide, from `0`,\nevery strand sharp, to `1`, every one soft. Clamped to that range. A tight\nform, such as a fan's bend or a wave, stays sharp whatever this says.",
190782
+ "fieldName": "softness"
190783
+ },
190784
+ {
190785
+ "name": "speed",
190786
+ "type": {
190787
+ "text": "number"
190788
+ },
190789
+ "default": "1",
190790
+ "description": "How fast the ribbon moves, as a multiplier on time. `0` holds it still.",
190791
+ "fieldName": "speed"
190792
+ },
190793
+ {
190794
+ "name": "spread",
190795
+ "type": {
190796
+ "text": "number"
190797
+ },
190798
+ "default": "1",
190799
+ "description": "How wide the ribbon is, as a multiplier on each form's own width.",
190800
+ "fieldName": "spread"
190801
+ },
190802
+ {
190803
+ "name": "travel",
190804
+ "type": {
190805
+ "text": "boolean"
190806
+ },
190807
+ "default": "false",
190808
+ "description": "Whether the ribbon is laid down the whole page, so scrolling travels along\nit.\n\nReflected because the stylesheet selects on it: in `travel` the host fixes\nitself to the viewport, behind the page.",
190809
+ "fieldName": "travel"
190810
+ },
190811
+ {
190812
+ "name": "variant",
190813
+ "type": {
190814
+ "text": "'fan' | 'ribbon' | 'waves' | undefined"
190815
+ },
190816
+ "description": "The form the ribbon takes. When it is not set, the form is `ribbon`. In\n`travel`, the form of every stretch no stop claims.",
190817
+ "fieldName": "variant"
190818
+ }
190819
+ ],
190820
+ "cssStates": [
190821
+ {
190822
+ "description": "The element shows its gradient: the renderer draws on the CPU, there is no WebGL, or the browser took the context back. Cleared once the ribbon draws again.",
190823
+ "name": "fallback"
190824
+ },
190825
+ {
190826
+ "description": "Set one frame after the first render. Transitions wait for it, so an element does not animate its own arrival.",
190827
+ "name": "settled",
190828
+ "inheritedFrom": {
190829
+ "name": "HelixElement",
190830
+ "module": "src/helix-element/helix-element.ts"
190831
+ }
190832
+ }
190833
+ ],
190834
+ "superclass": {
190835
+ "name": "HelixElement",
190836
+ "package": "@fusion.dev/helix-core"
190837
+ },
190838
+ "summary": "A ribbon of fine strands of light, drawn in your theme's colors, in its own box or down a whole page.",
190839
+ "helix": {
190840
+ "category": "media",
190841
+ "since": "0.147.0",
190842
+ "status": "experimental",
190843
+ "documentation": "https://fusion.dev/helix/components/strands",
190844
+ "aliases": [
190845
+ "Ribbon",
190846
+ "Filaments",
190847
+ "Light strands",
190848
+ "Fibers"
190849
+ ],
190850
+ "tier": "styled",
190851
+ "group": "Strands",
190852
+ "part": "Root",
190853
+ "examples": [
190854
+ {
190855
+ "description": "A soft ribbon of strands, sized to the box that holds it.",
190856
+ "slug": "preview"
190857
+ },
190858
+ {
190859
+ "description": "A fan bending at a quarter of the width, and another at three quarters.",
190860
+ "slug": "at"
190861
+ },
190862
+ {
190863
+ "description": "Strands drawn in the success color, with the info color for depth, set with the color hooks.",
190864
+ "slug": "colors"
190865
+ },
190866
+ {
190867
+ "description": "A sparse, sharp ribbon beside a dense, soft one.",
190868
+ "slug": "density-and-softness"
190869
+ },
190870
+ {
190871
+ "description": "One ribbon down the whole page: a fan through the opening section, soft ribbon after it, and a wave above the last section.",
190872
+ "slug": "travel"
190873
+ },
190874
+ {
190875
+ "description": "The three forms: a bright fan, a soft ribbon, and sharp waves.",
190876
+ "slug": "variants"
190877
+ }
190878
+ ],
190879
+ "source": "helix/styled/src/strands"
190880
+ },
190881
+ "tagName": "helix-strands",
190882
+ "customElement": true,
190883
+ "modulePath": "src/strands/root/strands-root.ts",
190884
+ "definitionPath": "src/strands/root/strands-root.ts"
190885
+ }
190886
+ ],
190887
+ "exports": [
190888
+ {
190889
+ "kind": "js",
190890
+ "name": "HelixStrands",
190891
+ "declaration": {
190892
+ "name": "HelixStrands",
190893
+ "module": "src/strands/root/strands-root.ts"
190894
+ }
190895
+ },
190896
+ {
190897
+ "kind": "custom-element-definition",
190898
+ "name": "helix-strands",
190899
+ "declaration": {
190900
+ "name": "HelixStrands",
190901
+ "module": "src/strands/root/strands-root.ts"
190902
+ }
190903
+ }
190904
+ ]
190905
+ },
190906
+ {
190907
+ "kind": "javascript-module",
190908
+ "path": "src/strands/shader.ts",
190909
+ "declarations": [
190910
+ {
190911
+ "kind": "variable",
190912
+ "name": "LINE_VERTEX",
190913
+ "default": "`#version 300 es layout(location = 0) in vec2 aVert; layout(location = 1) in float aId; uniform float uDpr; uniform float uSoftness; uniform vec3 uGlow; uniform vec3 uTint; uniform vec3 uPeak; out float vSide; out vec3 vColor; ${PATH} void main() { float id = aId; float r5 = h1(id + 7.77); float r6 = h1(id + 9.19); float r7 = h1(id + 11.3); float t = mix(uT.x, uT.y, aVert.x); vec3 info; vec3 unused; vec3 a = strandAt(id, t, info); vec3 b = strandAt(id, t + (uT.y - uT.x) / 700.0, unused); vec2 tg = b.xy - a.xy; tg = length(tg) > 1e-4 ? normalize(tg) : vec2(0.0, 1.0); vec2 nrm = vec2(-tg.y, tg.x); float soft = smoothstep(0.06, 0.28, info.y) * step(1.0 - uSoftness, r6); float base = mix(0.35, 1.3, r7 * r7) * uDpr * (1.0 + 0.3 * a.z); float w = max(base + soft * mix(8.0, 36.0, r6) * uDpr, 1.0); float drawW = w + 2.5 * uDpr; vec2 res = uView * uDpr; vec2 px = a.xy * uDpr + nrm * aVert.y * drawW * 0.5; gl_Position = vec4(px.x / res.x * 2.0 - 1.0, 1.0 - px.y / res.y * 2.0, 0.0, 1.0); vSide = aVert.y * drawW / w; float shimmer = 0.5 + 0.5 * sin(info.z * 0.044 - uTime * (2.0 + 2.0 * r5) + r6 * 6.283); shimmer *= shimmer; float bright = mix(0.25, 1.0, pow(r5, 1.4)); float energy = min(base, w) / w; float depth = 0.7 + 0.3 * a.z; vec3 col = mix(uGlow, uTint, step(0.83, r6) * 0.9); col = mix(col, uPeak, step(0.93, r7) * 0.6); vColor = col * energy * info.x * (0.35 + 0.65 * shimmer) * bright * depth; } `",
190914
+ "description": "Each strand as a ribbon of quads, wide enough to anti-alias and to blur."
190915
+ },
190916
+ {
190917
+ "kind": "variable",
190918
+ "name": "LINE_FRAGMENT",
190919
+ "default": "`#version 300 es precision highp float; in float vSide; in vec3 vColor; uniform float uScale; out vec4 outColor; void main() { outColor = vec4(vColor * exp(-vSide * vSide * 2.4) * uScale, 1.0); } `",
190920
+ "description": "A soft profile across the ribbon, added into the buffer."
190921
+ },
190922
+ {
190923
+ "kind": "variable",
190924
+ "name": "DUST_VERTEX",
190925
+ "default": "`#version 300 es uniform float uDpr; uniform float uStrands; uniform vec3 uGlow; uniform vec3 uPeak; out vec3 vColor; ${PATH} void main() { float id = float(gl_VertexID); float sid = floor(h1(id + 0.5) * uStrands); float r = h1(id + 2.3); float r2 = h1(id + 4.1); float t = mix(uT.x, uT.y, fract(r + uTime * 0.003 * (0.3 + r2))); vec3 info; vec3 a = strandAt(sid, t, info); vec2 off = (vec2(h1(id + 6.1), h1(id + 8.3)) - 0.5) * (24.0 + (150.0 + info.y * uView.x) * h1(id + 9.7)); vec2 res = uView * uDpr; vec2 px = (a.xy + off) * uDpr; gl_Position = vec4(px.x / res.x * 2.0 - 1.0, 1.0 - px.y / res.y * 2.0, 0.0, 1.0); gl_PointSize = mix(1.2, 3.4, r2 * r2) * uDpr; float tw = 0.35 + 0.65 * (0.5 + 0.5 * sin(uTime * (0.5 + 1.8 * r) + r2 * 40.0)); vColor = mix(uGlow, uPeak, 0.55) * tw * mix(0.2, 0.9, r) * info.x * 0.8; } `",
190926
+ "description": "Specks drifting along the strands, thickest where the ribbon is bright."
190927
+ },
190928
+ {
190929
+ "kind": "variable",
190930
+ "name": "DUST_FRAGMENT",
190931
+ "default": "`#version 300 es precision highp float; in vec3 vColor; uniform float uScale; out vec4 outColor; void main() { vec2 c = gl_PointCoord - 0.5; outColor = vec4(vColor * exp(-dot(c, c) * 16.0) * uScale, 1.0); } `"
190932
+ },
190933
+ {
190934
+ "kind": "variable",
190935
+ "name": "QUAD_VERTEX",
190936
+ "default": "`#version 300 es out vec2 vUv; void main() { vec2 p = vec2((gl_VertexID << 1) & 2, gl_VertexID & 2); vUv = p; gl_Position = vec4(p * 2.0 - 1.0, 0.0, 1.0); } `",
190937
+ "description": "One triangle over the whole target, from three vertex ids and no buffer."
190938
+ },
190939
+ {
190940
+ "kind": "variable",
190941
+ "name": "DOWN_FRAGMENT",
190942
+ "default": "`#version 300 es precision highp float; in vec2 vUv; uniform sampler2D uSource; uniform vec2 uTexel; out vec4 outColor; void main() { vec3 c = texture(uSource, vUv + uTexel * vec2(-1.0, -1.0)).rgb + texture(uSource, vUv + uTexel * vec2(1.0, -1.0)).rgb + texture(uSource, vUv + uTexel * vec2(-1.0, 1.0)).rgb + texture(uSource, vUv + uTexel * vec2(1.0, 1.0)).rgb; outColor = vec4(c * 0.25, 1.0); } `",
190943
+ "description": "Four bilinear taps, a box filter at half the step for the price of four reads."
190944
+ },
190945
+ {
190946
+ "kind": "variable",
190947
+ "name": "BLUR_FRAGMENT",
190948
+ "default": "`#version 300 es precision highp float; in vec2 vUv; uniform sampler2D uSource; uniform vec2 uStep; out vec4 outColor; void main() { vec3 c = texture(uSource, vUv).rgb * 0.2270; c += (texture(uSource, vUv + uStep * 1.3846).rgb + texture(uSource, vUv - uStep * 1.3846).rgb) * 0.3162; c += (texture(uSource, vUv + uStep * 3.2308).rgb + texture(uSource, vUv - uStep * 3.2308).rgb) * 0.0703; outColor = vec4(c, 1.0); } `",
190949
+ "description": "A nine-tap Gaussian in five reads, along one axis."
190950
+ },
190951
+ {
190952
+ "kind": "variable",
190953
+ "name": "COMPOSITE_FRAGMENT",
190954
+ "default": "`#version 300 es precision highp float; in vec2 vUv; uniform sampler2D uScene; uniform sampler2D uNear; uniform sampler2D uFar; uniform vec3 uGround; uniform vec3 uInk; uniform float uLight; uniform float uGain; out vec4 outColor; float hash(vec2 p) { return fract(sin(dot(p, vec2(12.9898, 78.233))) * 43758.5453); } void main() { vec3 e = texture(uScene, vUv).rgb + texture(uNear, vUv).rgb * 1.1 + texture(uFar, vUv).rgb * 0.9; e *= uGain; vec3 dark = 1.0 - (1.0 - uGround) * exp(-e); float lum = dot(e, vec3(0.3, 0.55, 0.15)); vec3 light = mix(uGround, uInk, 1.0 - exp(-lum * 1.4)); vec3 c = mix(dark, light, uLight); c += (hash(gl_FragCoord.xy) - 0.5) / 255.0; outColor = vec4(c, 1.0); } `",
190955
+ "description": "The light and its bloom over the page color.\n\nOn a dark page the light is screened onto the ground, so it saturates to\nthe peak rather than clipping. On a light page added light is invisible, so\nthe same energy darkens the ground toward the peak as ink. A step of noise\nunder a code value hides the banding a slow gradient shows on eight bits."
190956
+ }
190957
+ ],
190958
+ "exports": [
190959
+ {
190960
+ "kind": "js",
190961
+ "name": "LINE_VERTEX",
190962
+ "declaration": {
190963
+ "name": "LINE_VERTEX",
190964
+ "module": "src/strands/shader.ts"
190965
+ }
190966
+ },
190967
+ {
190968
+ "kind": "js",
190969
+ "name": "LINE_FRAGMENT",
190970
+ "declaration": {
190971
+ "name": "LINE_FRAGMENT",
190972
+ "module": "src/strands/shader.ts"
190973
+ }
190974
+ },
190975
+ {
190976
+ "kind": "js",
190977
+ "name": "DUST_VERTEX",
190978
+ "declaration": {
190979
+ "name": "DUST_VERTEX",
190980
+ "module": "src/strands/shader.ts"
190981
+ }
190982
+ },
190983
+ {
190984
+ "kind": "js",
190985
+ "name": "DUST_FRAGMENT",
190986
+ "declaration": {
190987
+ "name": "DUST_FRAGMENT",
190988
+ "module": "src/strands/shader.ts"
190989
+ }
190990
+ },
190991
+ {
190992
+ "kind": "js",
190993
+ "name": "QUAD_VERTEX",
190994
+ "declaration": {
190995
+ "name": "QUAD_VERTEX",
190996
+ "module": "src/strands/shader.ts"
190997
+ }
190998
+ },
190999
+ {
191000
+ "kind": "js",
191001
+ "name": "DOWN_FRAGMENT",
191002
+ "declaration": {
191003
+ "name": "DOWN_FRAGMENT",
191004
+ "module": "src/strands/shader.ts"
191005
+ }
191006
+ },
191007
+ {
191008
+ "kind": "js",
191009
+ "name": "BLUR_FRAGMENT",
191010
+ "declaration": {
191011
+ "name": "BLUR_FRAGMENT",
191012
+ "module": "src/strands/shader.ts"
191013
+ }
191014
+ },
191015
+ {
191016
+ "kind": "js",
191017
+ "name": "COMPOSITE_FRAGMENT",
191018
+ "declaration": {
191019
+ "name": "COMPOSITE_FRAGMENT",
191020
+ "module": "src/strands/shader.ts"
191021
+ }
191022
+ }
191023
+ ]
191024
+ },
191025
+ {
191026
+ "kind": "javascript-module",
191027
+ "path": "src/strands/stop/strands-stop.css.ts",
191028
+ "declarations": [
191029
+ {
191030
+ "kind": "variable",
191031
+ "name": "styles"
191032
+ }
191033
+ ],
191034
+ "exports": [
191035
+ {
191036
+ "kind": "js",
191037
+ "name": "styles",
191038
+ "declaration": {
191039
+ "name": "styles",
191040
+ "module": "src/strands/stop/strands-stop.css.ts"
191041
+ }
191042
+ }
191043
+ ]
191044
+ },
191045
+ {
191046
+ "kind": "javascript-module",
191047
+ "path": "src/strands/stop/strands-stop.ts",
191048
+ "declarations": [
191049
+ {
191050
+ "kind": "class",
191051
+ "description": "Placed inside a `helix-strands` with `travel`, a stop names an element with\n`for` and says which form the ribbon takes when the page reaches it: a `fan`\nbending through it, a `ribbon` passing through `at`, or `waves` crossing at\nits top edge. The stops are read in page order, whatever order they are\nwritten in, and a stop naming no element is skipped.\n\nA stop draws nothing itself and is never shown.\n\n**Every property is reflected**, because the parent watches its stops'\nattributes to lay the ribbon out again: a change made from script reaches the\npage as a change made in markup does. None has a default, so a stop writes\nnothing it was not given.",
191052
+ "name": "HelixStrandsStop",
191053
+ "members": [
191054
+ {
191055
+ "kind": "field",
191056
+ "name": "at",
191057
+ "type": {
191058
+ "text": "number | undefined"
191059
+ },
191060
+ "description": "Where the form sits across the page, as a share of the width: the fan's\nbend or the ribbon's axis. A wave crosses the whole width and does not\nread it. Unset, a fan bends at `0.4` and a ribbon runs down the middle.",
191061
+ "attribute": "at",
191062
+ "reflects": true
191063
+ },
191064
+ {
191065
+ "kind": "field",
191066
+ "name": "for",
191067
+ "type": {
191068
+ "text": "string | undefined"
191069
+ },
191070
+ "description": "The id of the element the form is pinned to, in the same tree as the stop.",
191071
+ "attribute": "for",
191072
+ "reflects": true
191073
+ },
191074
+ {
191075
+ "kind": "field",
191076
+ "name": "variant",
191077
+ "type": {
191078
+ "text": "'fan' | 'ribbon' | 'waves' | undefined"
191079
+ },
191080
+ "description": "The form the ribbon takes at the element. When it is not set, the form is `ribbon`.",
191081
+ "attribute": "variant",
191082
+ "reflects": true
191083
+ },
191084
+ {
191085
+ "kind": "field",
191086
+ "name": "tier",
191087
+ "type": {
191088
+ "text": "string"
191089
+ },
191090
+ "static": true,
191091
+ "default": "'helix-headless-'",
191092
+ "description": "The prefix this tier registers its elements under.\n\n**A component that renders another renders its own tier's version of it**,\nso `helix-headless-pagination-size` composes `helix-headless-select` and\n`helix-pagination-size` composes `helix-select`. One template says\n`${this.tag('select')}` and each tier answers with its own name.\n\n**The public tag may not be the composed one, in either tier.** Using it\ncosts three things: the name means two different things depending on what a\nconsumer imported, the headless tier composes an element it does not ship,\nand the composition cannot be tested there at all, because there is no\n`helix-select` on that tier to test it against.\n\n**A prefix rather than an override per composition**, which was the first\nplan and does not compile. An override re-renders the fragment from the\nsubclass, and the fragment reads members the base keeps private:\n`PaginationSize` alone would have had to widen `options`, `current` and\n`handleChange` to `protected` so a subclass could say the same thing again.\nSixteen families of that is a lot of encapsulation spent on saying one\nword differently.",
191093
+ "inheritedFrom": {
191094
+ "name": "HelixElement",
191095
+ "module": "src/helix-element/helix-element.ts"
191096
+ }
191097
+ },
191098
+ {
191099
+ "kind": "method",
191100
+ "name": "tag",
191101
+ "privacy": "protected",
191102
+ "return": {
191103
+ "type": {
191104
+ "text": "StaticValue"
191105
+ }
191106
+ },
191107
+ "parameters": [
191108
+ {
191109
+ "name": "name",
191110
+ "type": {
191111
+ "text": "string"
191112
+ }
191113
+ }
191114
+ ],
191115
+ "description": "One composed tag, as a static value a template can interpolate.\n\nWhat `unsafeStatic` returns, safe by construction: the name is a literal in\nour own source and the prefix is one of two strings this class defines.\nCalled per render and not cached, which costs nothing, because\n`static-html` keys its template cache on the joined string rather than on\nthe object.\n\n**Written out rather than imported, for every element that never renders\none.** `lit/static-html.js` declares no side effects, so importing\n`unsafeStatic` alone kept the module's three `withStatic` calls in every\nbundle: about 210 bytes gzipped on each of the families that compose no\ntag, Divider and Badge among them. The value is lit's cross-copy protocol,\nkeyed by `Symbol.for('')` so that two copies of lit on a page read each\nother's, and a spec holds it equal to `unsafeStatic`'s.",
191116
+ "inheritedFrom": {
191117
+ "name": "HelixElement",
191118
+ "module": "src/helix-element/helix-element.ts"
191119
+ }
191120
+ },
191121
+ {
191122
+ "kind": "method",
191123
+ "name": "partNamed",
191124
+ "privacy": "protected",
191125
+ "return": {
191126
+ "type": {
191127
+ "text": "T | null"
191128
+ }
191129
+ },
191130
+ "parameters": [
191131
+ {
191132
+ "name": "name",
191133
+ "type": {
191134
+ "text": "string"
191135
+ }
191136
+ }
191137
+ ],
191138
+ "description": "One of this element's own parts, by name, or null where it is not rendered.\n\nNot `part`, which every element already has: `Element.part` is the\n`DOMTokenList` of the names the element itself carries, and a method under\nthat name is a type error on every subclass.\n\n**One guard for every lookup.** Lit's server shim has no `querySelector`\non the render root, so a lookup reached during a server render, from a\ngetter a template reads or from `willUpdate`, throws there and nowhere\nelse. Four spellings of the same guard had grown across the library, and\na fifth site with none. Null on the server, which is what the rest of the\ncode already treats a part that has not rendered as.\n\n**`~=` and not `=`.** A part drawn in a state carries a second name while\nthe state holds, `part=\"page page-current\"`, and an exact match stops\nfinding it for exactly as long as it is the one that matters.\n\n`helix component`'s `selectors` reads these calls the way it reads a\n`querySelector('[part=\"x\"]')`, so a name nothing renders is a finding\nrather than a null an optional chain swallows.",
191139
+ "inheritedFrom": {
191140
+ "name": "HelixElement",
191141
+ "module": "src/helix-element/helix-element.ts"
191142
+ }
191143
+ },
191144
+ {
191145
+ "kind": "field",
191146
+ "name": "internals",
191147
+ "type": {
191148
+ "text": "ElementInternals"
191149
+ },
191150
+ "privacy": "protected",
191151
+ "readonly": true,
191152
+ "description": "The element's semantics, set without touching the DOM.\n\n`ElementInternals` sets the implicit role, which an author's own `role`\nattribute still overrides, and it writes no attribute. Setting `role` on the\nhost directly would: that is an attribute the element gives itself after it\nupgrades, which a React consumer's server markup never had, and hydration\nreports it as a mismatch.\n\nAvailable during server rendering. Lit's shim implements `attachInternals`,\nso nothing here needs a guard.",
191153
+ "inheritedFrom": {
191154
+ "name": "HelixElement",
191155
+ "module": "src/helix-element/helix-element.ts"
191156
+ }
191157
+ },
191158
+ {
191159
+ "kind": "method",
191160
+ "name": "toggleState",
191161
+ "privacy": "protected",
191162
+ "return": {
191163
+ "type": {
191164
+ "text": "void"
191165
+ }
191166
+ },
191167
+ "parameters": [
191168
+ {
191169
+ "name": "name",
191170
+ "type": {
191171
+ "text": "string"
191172
+ }
191173
+ },
191174
+ {
191175
+ "name": "on",
191176
+ "type": {
191177
+ "text": "boolean"
191178
+ }
191179
+ }
191180
+ ],
191181
+ "description": "Records a boolean fact about this element as a custom state.\n\n**The host belongs to whoever rendered it, and a component's own\nbookkeeping may not be kept there.** An attribute written on the first\nupdate is markup a consumer's server never sent, so a React consumer\nhydrates a DOM that has gained attributes since and reports a mismatch it\nwill not patch up. A custom state is not in the DOM at all: it carries the\nfact to a stylesheet through `:state()` and leaves the markup alone, so the\nserver's output and the client's agree by construction.\n\n`SETTLED` carries the long version of that argument; `checked`, `open`,\n`invalid` and `has-label` are recorded the same way, each of them a state a\n`default-*` attribute resolves before React reaches the node.\n\n**Deferring the definitions is not a fix and could not be.** Importing them\nfrom an effect so the upgrades fall the other side of hydration works only\nwhile hydration is one pass: anything that splits it, a streamed segment or\na suspended boundary, puts an upgrade back inside the window. Timing cannot\nbe the guarantee when the fact is kept somewhere React reconciles.\n\nFeature-tested rather than assumed, the way `hostAria` tests element\nreferences. An engine without `CustomStateSet` records nothing and keeps\nwhatever the resting rule draws, which is the safe direction to fail.\n\n**The engines the test is for are browsers**: Safari below 17.4 and Firefox\nbelow 126, where the write is a `TypeError`, so a component bypassing this\nfails to render rather than rendering without whatever the state draws.\nLit's server shim sets `states`, so the guard passes there and records a\nstate nothing reads, which is harmless.",
191182
+ "inheritedFrom": {
191183
+ "name": "HelixElement",
191184
+ "module": "src/helix-element/helix-element.ts"
191185
+ }
191186
+ },
191187
+ {
191188
+ "kind": "field",
191189
+ "name": "whenSettled",
191190
+ "type": {
191191
+ "text": "Promise<void>"
191192
+ },
191193
+ "readonly": true,
191194
+ "description": "Resolves a frame after the first update, when transitions are switched on.\n\n**Named `whenSettled` because `settled` is taken four times over**, by\nImage, Splitter and both color controls, none of them about transitions. A\nbase class takes the name every subclass then cannot use.\n\n**The state it reports cannot be watched, which is why this exists.** A\ncustom state is deliberately not in the DOM, so there is no\n`MutationObserver` equivalent for `ElementInternals.states`. Await this\ninstead.\n\nSeparate from `updateComplete`, which resolves in the microtask checkpoint\nthe suppression is still active in. That is the distinction `readyToMove`\nin `@fusion.dev/helix-testing` is written around.\n\nIt never resolves where `requestAnimationFrame` never fires, which is a\nserver, a hidden tab, and happy-dom. Callers that must not hang there race\nit against a timeout, as the happy-dom harness's `readyToMove` does. The\nbrowser harness's awaits it alone: a browser always runs the frame, and a\ntimer beside it was a bet on how long one takes, which a busy run lost.",
191195
+ "default": "new Promise<void>((resolve) => { this.resolveSettled = resolve })",
191196
+ "inheritedFrom": {
191197
+ "name": "HelixElement",
191198
+ "module": "src/helix-element/helix-element.ts"
191199
+ }
191200
+ },
191201
+ {
191202
+ "kind": "field",
191203
+ "name": "resolveSettled",
191204
+ "type": {
191205
+ "text": "() => void"
191206
+ },
191207
+ "privacy": "private",
191208
+ "description": "Resolves `whenSettled`, once, from the frame that records the state.",
191209
+ "inheritedFrom": {
191210
+ "name": "HelixElement",
191211
+ "module": "src/helix-element/helix-element.ts"
191212
+ }
191213
+ },
191214
+ {
191215
+ "kind": "field",
191216
+ "name": "fromServer",
191217
+ "type": {
191218
+ "text": "boolean"
191219
+ },
191220
+ "privacy": "private",
191221
+ "default": "false",
191222
+ "description": "Whether the shadow root was a server's, parsed from declarative shadow DOM.",
191223
+ "inheritedFrom": {
191224
+ "name": "HelixElement",
191225
+ "module": "src/helix-element/helix-element.ts"
191226
+ }
191227
+ },
191228
+ {
191229
+ "kind": "field",
191230
+ "name": "hydrating",
191231
+ "type": {
191232
+ "text": "boolean"
191233
+ },
191234
+ "privacy": "protected",
191235
+ "description": "Whether this update is hydrating a server's markup, and so has to render\nexactly what the server rendered.\n\n**Lit hydrates by assuming the markup already shows the first render.** A\nvalue that differs is recorded and never written, so the page keeps the\nserver's, and a template that differs throws. The server has no children,\nso anything a component reads from its children waits for the update after\nhydration, which `finishHydration` asks for. Without a server's markup the\nfirst render reads them and there is one render.",
191236
+ "readonly": true,
191237
+ "inheritedFrom": {
191238
+ "name": "HelixElement",
191239
+ "module": "src/helix-element/helix-element.ts"
191240
+ }
191241
+ },
191242
+ {
191243
+ "kind": "field",
191244
+ "name": "serverRendered",
191245
+ "type": {
191246
+ "text": "boolean"
191247
+ },
191248
+ "privacy": "protected",
191249
+ "description": "Whether this element hydrated a server's markup rather than rendering its own.\n\nFor what happened before hydration and cannot be heard after it: an image\nthe parser fetched fires `load` or `error` before any listener exists, so a\ncomponent asks the image instead, once, when this is true.",
191250
+ "readonly": true,
191251
+ "inheritedFrom": {
191252
+ "name": "HelixElement",
191253
+ "module": "src/helix-element/helix-element.ts"
191254
+ }
191255
+ },
191256
+ {
191257
+ "kind": "method",
191258
+ "name": "finishHydration",
191259
+ "privacy": "protected",
191260
+ "return": {
191261
+ "type": {
191262
+ "text": "void"
191263
+ }
191264
+ },
191265
+ "description": "Asks for the update a hydration put off, so the reads it skipped happen.\n\nCalled from `firstUpdated`, the end of the hydrating update. The render it\nschedules can only follow that one, which is the exception Lit's\nchange-in-update warning names, and it happens only on a page a server\nrendered.",
191266
+ "inheritedFrom": {
191267
+ "name": "HelixElement",
191268
+ "module": "src/helix-element/helix-element.ts"
191269
+ }
191270
+ },
191271
+ {
191272
+ "kind": "field",
191273
+ "name": "childrenKnown",
191274
+ "type": {
191275
+ "text": "boolean"
191276
+ },
191277
+ "privacy": "protected",
191278
+ "description": "Whether this render can know the children.\n\nA server cannot: its element shim carries attributes and no tree, so\n`children` is undefined there. A render hydrating what a server sent must\nnot, because it has to be the server's render. Anywhere else it can. A\ncomponent whose render depends on its children reads them through\n`knownChildren`, and treats \"not known\" as its own answer rather than as\n\"none\": a list that renders its empty state because nobody has looked yet is\nthe one thing an empty state must never do.",
191279
+ "readonly": true,
191280
+ "inheritedFrom": {
191281
+ "name": "HelixElement",
191282
+ "module": "src/helix-element/helix-element.ts"
191283
+ }
191284
+ },
191285
+ {
191286
+ "kind": "field",
191287
+ "name": "knownChildren",
191288
+ "type": {
191289
+ "text": "Element[]"
191290
+ },
191291
+ "privacy": "protected",
191292
+ "description": "The children a render may read: all of them where they are known, and none otherwise.",
191293
+ "readonly": true,
191294
+ "inheritedFrom": {
191295
+ "name": "HelixElement",
191296
+ "module": "src/helix-element/helix-element.ts"
191297
+ }
191298
+ },
191299
+ {
191300
+ "kind": "field",
191301
+ "name": "assignsByName",
191302
+ "type": {
191303
+ "text": "boolean"
191304
+ },
191305
+ "privacy": "protected",
191306
+ "description": "Whether this element's slots route by name although it asked to assign them\nby hand.\n\n**A declarative shadow root is always the by-name kind.** HTML has no way to\nask for manual assignment, so a component that assigns by hand and hydrates\na server's root gets one where `slot.assign()` does nothing, and its\nchildren land wherever their `slot` attribute sends them. The way through is\nto write that attribute, which is what `route` does. Only there: on a root\nthis element made, assignment stays manual and the consumer's markup is\nnever touched, which is what a React consumer's hydration requires.",
191307
+ "readonly": true,
191308
+ "inheritedFrom": {
191309
+ "name": "HelixElement",
191310
+ "module": "src/helix-element/helix-element.ts"
191311
+ }
191312
+ },
191313
+ {
191314
+ "kind": "method",
191315
+ "name": "route",
191316
+ "privacy": "protected",
191317
+ "return": {
191318
+ "type": {
191319
+ "text": "void"
191320
+ }
191321
+ },
191322
+ "parameters": [
191323
+ {
191324
+ "name": "child",
191325
+ "type": {
191326
+ "text": "Element"
191327
+ }
191328
+ },
191329
+ {
191330
+ "name": "name",
191331
+ "type": {
191332
+ "text": "string | undefined"
191333
+ }
191334
+ }
191335
+ ],
191336
+ "description": "Sends a child to a slot by name, on a root that routes by name.\n\n`undefined` is the default slot. Written only when it differs, so routing\nthe same child again on every update writes nothing.",
191337
+ "inheritedFrom": {
191338
+ "name": "HelixElement",
191339
+ "module": "src/helix-element/helix-element.ts"
191340
+ }
191341
+ },
191342
+ {
191343
+ "kind": "field",
191344
+ "name": "stopInner",
191345
+ "privacy": "protected",
191346
+ "readonly": true,
191347
+ "description": "Stops an inner control's own announcement at this element's boundary.\n\n**A composed control is one control to a consumer, and the natives had no\nequivalent of the stop the prefixed events already get.** `<helix-select>`\nrenders a `<helix-listbox>`, and both announce: the listbox dispatches\n`input` and `change` from its own host, `input` is composed by\nspecification, and a consumer listening on the select therefore heard one\nchoice twice. Measured before this existed, on the styled tier, one choice\non the inner listbox: select `input` twice and `change` three times,\ncombobox, date input, time input and color input twice each. `Command` was\nthe only one that was right, because it happened to reach for\n`stopImmediatePropagation` for a different reason.\n\nBound on the child in the parent's template, so it runs while the event is\nstill at the child and before it can cross. The guard is for the case where\na component binds this on itself: an element must never stop its own\nannouncement, which is the one it exists to make.\n\nThis is the same job the `helix-before-*` handlers do with their own\n`stopPropagation`, and it is separate rather than folded into them because\na consumer may legitimately refuse a request without the notification ever\nhappening: the two travel at different times and one can be absent.",
191348
+ "inheritedFrom": {
191349
+ "name": "HelixElement",
191350
+ "module": "src/helix-element/helix-element.ts"
191351
+ }
191352
+ },
191353
+ {
191354
+ "kind": "method",
191355
+ "name": "relayNativeEvent",
191356
+ "privacy": "protected",
191357
+ "return": {
191358
+ "type": {
191359
+ "text": "void"
191360
+ }
191361
+ },
191362
+ "parameters": [
191363
+ {
191364
+ "name": "event",
191365
+ "type": {
191366
+ "text": "Event"
191367
+ }
191368
+ },
191369
+ {
191370
+ "name": "init",
191371
+ "optional": true,
191372
+ "type": {
191373
+ "text": "EventInit"
191374
+ }
191375
+ }
191376
+ ],
191377
+ "description": "Re-emits a native event from the host, under its own name.\n\nA native event fired by an inner `<input>` or `<textarea>` is not composed,\nso it stops at the shadow boundary and a consumer listening on\n`<helix-input>` hears nothing. Re-dispatching it from the host is what\nmakes the component behave like the control it wraps.\n\nThe relayed event keeps the native name deliberately. `change` is `change`,\nwhich is what a consumer already knows to listen for, and it is what\nreaches React: its synthetic system claims `onChange` and wires it to that\nname, so a prefixed one would never arrive.\n\n`composed` is not forced. It defaults to the original event's own value, so\na relayed `change` stops at the next shadow boundary exactly as a native\none would. Pass it explicitly only where escaping is the intent, and say so\nwhere you do.",
191378
+ "inheritedFrom": {
191379
+ "name": "HelixElement",
191380
+ "module": "src/helix-element/helix-element.ts"
191381
+ }
191382
+ },
191383
+ {
191384
+ "kind": "method",
191385
+ "name": "finalizeStyles",
191386
+ "privacy": "protected",
191387
+ "static": true,
191388
+ "return": {
191389
+ "type": {
191390
+ "text": "CSSResultOrNative[]"
191391
+ }
191392
+ },
191393
+ "parameters": [
191394
+ {
191395
+ "name": "styles",
191396
+ "optional": true,
191397
+ "type": {
191398
+ "text": "CSSResultOrNative | CSSResultOrNative[]"
191399
+ }
191400
+ }
191401
+ ],
191402
+ "description": "Prepends the shadow-root reset to every subclass's styles, so no component\nhas to remember to include it.",
191403
+ "inheritedFrom": {
191404
+ "name": "HelixElement",
191405
+ "module": "src/helix-element/helix-element.ts"
191406
+ }
191407
+ },
191408
+ {
191409
+ "kind": "method",
191410
+ "name": "performUpdate",
191411
+ "privacy": "protected",
191412
+ "return": {
191413
+ "type": {
191414
+ "text": "void"
191415
+ }
191416
+ },
191417
+ "description": "The first update, timed where a page asked to measure what the components\ncost, and a property read where it did not: see `reportRender`.",
191418
+ "inheritedFrom": {
191419
+ "name": "HelixElement",
191420
+ "module": "src/helix-element/helix-element.ts"
191421
+ }
191422
+ }
191423
+ ],
191424
+ "attributes": [
191425
+ {
191426
+ "name": "at",
191427
+ "type": {
191428
+ "text": "number | undefined"
191429
+ },
191430
+ "description": "Where the form sits across the page, as a share of the width: the fan's\nbend or the ribbon's axis. A wave crosses the whole width and does not\nread it. Unset, a fan bends at `0.4` and a ribbon runs down the middle.",
191431
+ "fieldName": "at"
191432
+ },
191433
+ {
191434
+ "name": "for",
191435
+ "type": {
191436
+ "text": "string | undefined"
191437
+ },
191438
+ "description": "The id of the element the form is pinned to, in the same tree as the stop.",
191439
+ "fieldName": "for"
191440
+ },
191441
+ {
191442
+ "name": "variant",
191443
+ "type": {
191444
+ "text": "'fan' | 'ribbon' | 'waves' | undefined"
191445
+ },
191446
+ "description": "The form the ribbon takes at the element. When it is not set, the form is `ribbon`.",
191447
+ "fieldName": "variant"
191448
+ }
191449
+ ],
191450
+ "superclass": {
191451
+ "name": "HelixElement",
191452
+ "package": "@fusion.dev/helix-core"
191453
+ },
191454
+ "summary": "Pins a form of the ribbon to a section of the page.",
191455
+ "helix": {
191456
+ "since": "0.147.0",
191457
+ "status": "experimental",
191458
+ "documentation": "https://fusion.dev/helix/components/strands",
191459
+ "tier": "styled",
191460
+ "group": "Strands",
191461
+ "part": "Stop"
191462
+ },
191463
+ "tagName": "helix-strands-stop",
191464
+ "customElement": true,
191465
+ "cssStates": [
191466
+ {
191467
+ "description": "Set one frame after the first render. Transitions wait for it, so an element does not animate its own arrival.",
191468
+ "name": "settled",
191469
+ "inheritedFrom": {
191470
+ "name": "HelixElement",
191471
+ "module": "src/helix-element/helix-element.ts"
191472
+ }
191473
+ }
191474
+ ],
191475
+ "modulePath": "src/strands/stop/strands-stop.ts",
191476
+ "definitionPath": "src/strands/stop/strands-stop.ts"
191477
+ }
191478
+ ],
191479
+ "exports": [
191480
+ {
191481
+ "kind": "js",
191482
+ "name": "HelixStrandsStop",
191483
+ "declaration": {
191484
+ "name": "HelixStrandsStop",
191485
+ "module": "src/strands/stop/strands-stop.ts"
191486
+ }
191487
+ },
191488
+ {
191489
+ "kind": "custom-element-definition",
191490
+ "name": "helix-strands-stop",
191491
+ "declaration": {
191492
+ "name": "HelixStrandsStop",
191493
+ "module": "src/strands/stop/strands-stop.ts"
191494
+ }
191495
+ }
191496
+ ]
191497
+ },
189010
191498
  {
189011
191499
  "kind": "javascript-module",
189012
191500
  "path": "src/switch/index.ts",
@@ -238352,6 +240840,6 @@
238352
240840
  ],
238353
240841
  "helix": {
238354
240842
  "package": "@fusion.dev/helix",
238355
- "version": "0.161.0"
240843
+ "version": "0.162.0"
238356
240844
  }
238357
240845
  }