@fusion.dev/helix-core 0.144.0 → 0.145.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.
@@ -889,6 +889,161 @@
889
889
  }
890
890
  ]
891
891
  },
892
+ {
893
+ "kind": "javascript-module",
894
+ "path": "src/controllers/countdown-controller/countdown-controller.ts",
895
+ "declarations": [
896
+ {
897
+ "kind": "class",
898
+ "description": "A lifetime that pauses: a message that dismisses itself after a time, and\nholds that time while a reader is on it.\n\nToast's items and Announcement each dismiss themselves after `duration`,\nand each stops the clock while the pointer or focus is on the message, so a\nreader partway through is not cut off. Resuming continues from what was\nleft rather than starting over.\n\n**Holds are counted, not flagged.** Hover and focus stop the same clock and\nare independent: a pointer can leave while focus stays. Uncounted, a reader\nwho tabs into a message and then moves the pointer off it has the clock\nrestarted underneath them. Only the last one out starts it again.\n\n**Leaving the page pauses it**, keeping the time already spent, and drops\nthe holds, since a pointer or focus on a detached element never leaves it.\nComing back does not resume on its own: the host says whether it should,\nsuch as only while it is still showing. `DelayController` is the other wait\nin core, for a wait that starts over and forgets itself on leaving.",
899
+ "name": "CountdownController",
900
+ "members": [
901
+ {
902
+ "kind": "field",
903
+ "name": "startedAt",
904
+ "type": {
905
+ "text": "number | undefined"
906
+ },
907
+ "privacy": "private",
908
+ "description": "When the current run began, or nothing while the clock is stopped."
909
+ },
910
+ {
911
+ "kind": "field",
912
+ "name": "remaining",
913
+ "type": {
914
+ "text": "number | undefined"
915
+ },
916
+ "privacy": "private",
917
+ "description": "What is left of the time, so resuming continues rather than restarts."
918
+ },
919
+ {
920
+ "kind": "field",
921
+ "name": "timer",
922
+ "type": {
923
+ "text": "ReturnType<typeof setTimeout> | undefined"
924
+ },
925
+ "privacy": "private"
926
+ },
927
+ {
928
+ "kind": "field",
929
+ "name": "holds",
930
+ "type": {
931
+ "text": "number"
932
+ },
933
+ "privacy": "private",
934
+ "default": "0",
935
+ "description": "How many reasons there are to hold the clock."
936
+ },
937
+ {
938
+ "kind": "field",
939
+ "name": "running",
940
+ "type": {
941
+ "text": "boolean"
942
+ },
943
+ "description": "Whether the clock is running now.",
944
+ "readonly": true
945
+ },
946
+ {
947
+ "kind": "method",
948
+ "name": "hostConnected",
949
+ "return": {
950
+ "type": {
951
+ "text": "void"
952
+ }
953
+ }
954
+ },
955
+ {
956
+ "kind": "method",
957
+ "name": "hostDisconnected",
958
+ "return": {
959
+ "type": {
960
+ "text": "void"
961
+ }
962
+ }
963
+ },
964
+ {
965
+ "kind": "method",
966
+ "name": "start",
967
+ "return": {
968
+ "type": {
969
+ "text": "void"
970
+ }
971
+ },
972
+ "parameters": [
973
+ {
974
+ "name": "ms",
975
+ "type": {
976
+ "text": "number | undefined"
977
+ }
978
+ }
979
+ ],
980
+ "description": "Starts the clock at `ms`. Nothing, zero or less starts nothing."
981
+ },
982
+ {
983
+ "kind": "method",
984
+ "name": "pause",
985
+ "return": {
986
+ "type": {
987
+ "text": "void"
988
+ }
989
+ },
990
+ "description": "Stops the clock and keeps the time that is left."
991
+ },
992
+ {
993
+ "kind": "method",
994
+ "name": "resume",
995
+ "return": {
996
+ "type": {
997
+ "text": "void"
998
+ }
999
+ },
1000
+ "description": "Runs the clock again from where it stopped."
1001
+ },
1002
+ {
1003
+ "kind": "method",
1004
+ "name": "cancel",
1005
+ "return": {
1006
+ "type": {
1007
+ "text": "void"
1008
+ }
1009
+ },
1010
+ "description": "Stops the clock where it is, as a dismissal does."
1011
+ },
1012
+ {
1013
+ "kind": "method",
1014
+ "name": "hold",
1015
+ "return": {
1016
+ "type": {
1017
+ "text": "void"
1018
+ }
1019
+ },
1020
+ "description": "One more reason to hold the clock, such as a pointer arriving."
1021
+ },
1022
+ {
1023
+ "kind": "method",
1024
+ "name": "release",
1025
+ "return": {
1026
+ "type": {
1027
+ "text": "void"
1028
+ }
1029
+ },
1030
+ "description": "One reason fewer, and the clock runs again once none is left."
1031
+ }
1032
+ ],
1033
+ "helix": {}
1034
+ }
1035
+ ],
1036
+ "exports": [
1037
+ {
1038
+ "kind": "js",
1039
+ "name": "CountdownController",
1040
+ "declaration": {
1041
+ "name": "CountdownController",
1042
+ "module": "src/controllers/countdown-controller/countdown-controller.ts"
1043
+ }
1044
+ }
1045
+ ]
1046
+ },
892
1047
  {
893
1048
  "kind": "javascript-module",
894
1049
  "path": "src/controllers/cue-controller/cue-controller.ts",
@@ -2406,13 +2561,12 @@
2406
2561
  },
2407
2562
  {
2408
2563
  "kind": "field",
2409
- "name": "origin",
2564
+ "name": "originOf",
2410
2565
  "type": {
2411
- "text": "'focus' | 'selection'"
2566
+ "text": "() => KeyboardOrigin"
2412
2567
  },
2413
2568
  "privacy": "private",
2414
- "readonly": true,
2415
- "default": "origin"
2569
+ "readonly": true
2416
2570
  },
2417
2571
  {
2418
2572
  "kind": "field",
@@ -2461,6 +2615,16 @@
2461
2615
  "readonly": true,
2462
2616
  "default": "new Typeahead()"
2463
2617
  },
2618
+ {
2619
+ "kind": "field",
2620
+ "name": "origin",
2621
+ "type": {
2622
+ "text": "'focus' | 'selection'"
2623
+ },
2624
+ "privacy": "private",
2625
+ "description": "Where this press starts from, read again on every press.",
2626
+ "readonly": true
2627
+ },
2464
2628
  {
2465
2629
  "kind": "method",
2466
2630
  "name": "arrive",
@@ -4217,7 +4381,7 @@
4217
4381
  "declarations": [
4218
4382
  {
4219
4383
  "kind": "class",
4220
- "description": "Works out which slice of a long set is worth rendering.\n\n**A controller and not an element, which is the whole reason it is here.**\nTable, Listbox, Combobox and Tree each need windowing *inside* themselves,\nand an element would make each of them nest one in its own shadow root: a\nlistbox whose options are inside a `<helix-virtual-list>` is a listbox whose\noptions are no longer its children, so its own keyboard, its own selection\nand its own ARIA all have a stranger in the middle of them.\n\n**A windowed set still reports its true length, and each row its true\nposition.** This is the part virtualization usually gets wrong and the reason\nthe arithmetic lives somewhere shared. A reader on row 4,000 of 10,000 must\nhear \"4,000 of 10,000\", so `aria-setsize` is the count and `aria-posinset` is\nthe real index, never the position within the rendered slice. The window is a\nrendering decision and the set is a fact, and a component that lets the first\noverwrite the second has told a screen reader the list is twelve long.\n\n**The spacers are what make the scrollbar honest.** Rendering twelve rows in\na box that should scroll for ten thousand gives a thumb the size of the\ntrack, so the room the absent rows would have taken is left as padding before\nand after. A reader dragging that thumb is dragging against the real length.\n\n**What it does not do, and the reason is narrower than it first looks.** True\nvirtualization means never creating the rows that are not on screen, and that\nneeds the set as *data*. Two channels are shut: a consumer's items arrive as\nlight-DOM children, which exist by the time this could decide not to create\nthem, and an `items` property cannot survive React hydration, which skips\nevery property it would have to apply imperatively (see `bindReactHandler`,\nand the note in the rules that objects and functions have that bug and are\nnot fixed).\n\n**A third channel is open.** Data as *text*\nin the markup, a `<script type=\"application/json\">` child or an attribute, is\nneither a property nor a node per row: React's hydration bug cannot touch text\nit renders as a child, a server emits it, and the node count is one. The\ncharts already read data out of the document this way, `for=\"<id>\"` at a real\n`<table>`, so the pattern is in the library rather than being invented for\nthis.\n\nSo the thing actually blocked is the *row template*. Turning an item into\nmarkup wants either a render function, which is a function property and dies\non the same bug, or a `<template>` with named holes, which survives because it\nis markup and which no component here asks anyone to write. That is a decision\nabout what this library is willing to look like, not a platform limit, and it\nis open at #71.\n\nSo what this buys is the expensive half rather than all of it: the rows\noutside the window are not laid out and not painted, which is where the time\ngoes in a long list, and the node count stays. That is worth having and it is\nnot worth calling something it is not. An element that windows children it\nwas handed is not a virtual list, whatever it is named.\n\n**One estimate, not per-row measurement.** Measuring every row to place it is\nhow a virtual list ends up reading the layout it is trying to avoid, and it\nis what makes them jump: a row taller than its estimate shifts everything\nafter it at the moment it renders. A fixed estimate is a straight line\nbetween scroll offset and index, which never disagrees with itself. Rows of\ngenuinely different heights are a different component and a harder one.",
4384
+ "description": "Works out which slice of a long set is worth rendering.\n\n**A controller and not an element, which is the whole reason it is here.**\nTable, Listbox, Combobox and Tree each need windowing *inside* themselves,\nand an element would make each of them nest one in its own shadow root: a\nlistbox whose options are inside a `<helix-virtual-list>` is a listbox whose\noptions are no longer its children, so its own keyboard, its own selection\nand its own ARIA all have a stranger in the middle of them.\n\n**A windowed set still reports its true length, and each row its true\nposition.** This is the part virtualization usually gets wrong and the reason\nthe arithmetic lives somewhere shared. A reader on row 4,000 of 10,000 must\nhear \"4,000 of 10,000\", so `aria-setsize` is the count and `aria-posinset` is\nthe real index, never the position within the rendered slice. The window is a\nrendering decision and the set is a fact, and a component that lets the first\noverwrite the second has told a screen reader the list is twelve long.\n\n**The spacers are what make the scrollbar honest.** Rendering twelve rows in\na box that should scroll for ten thousand gives a thumb the size of the\ntrack, so the room the absent rows would have taken is left as padding before\nand after. A reader dragging that thumb is dragging against the real length.\n\n**The set arrives as data**, which is what lets a host create only the rows\nin the window. A host takes it through a property (an `items` array, which\n`applyReactProperties` carries across React hydration with every other object\nproperty) or as text in the markup (a `<script type=\"application/json\">`\nnamed by `for`, which a server emits and which is one node whatever the\nrow count). A host that is handed its rows as light-DOM children still gets\nthe expensive half from this: the rows outside the window are not laid out\nand not painted, and the node count stays.\n\n**One estimate, not per-row measurement.** Measuring every row to place it is\nhow a virtual list ends up reading the layout it is trying to avoid, and it\nis what makes them jump: a row taller than its estimate shifts everything\nafter it at the moment it renders. A fixed estimate is a straight line\nbetween scroll offset and index, which never disagrees with itself. Rows of\ngenuinely different heights are a different component and a harder one.",
4221
4385
  "name": "VirtualizeController",
4222
4386
  "members": [
4223
4387
  {
@@ -4440,6 +4604,45 @@
4440
4604
  ],
4441
4605
  "description": "The measured version, which asks where each item starts rather than dividing.\n\nThe scan for `last` walks forward from `first` rather than searching,\nbecause it stops at the bottom of the viewport: it is bounded by what fits\non screen plus the overscan, whatever the set's length."
4442
4606
  },
4607
+ {
4608
+ "kind": "method",
4609
+ "name": "visible",
4610
+ "return": {
4611
+ "type": {
4612
+ "text": "{ first: number; last: number }"
4613
+ }
4614
+ },
4615
+ "description": "The items on screen, with no overscan: `first` is the item at the top of\nthe box and `last` is one past the item at its bottom, so\n`items.slice(first, last)` is what a reader sees.\n\nFor a host that reports what is visible, where `window` is what is drawn.\nAn empty span (`first === last`) while the box has no height or the set\nno items."
4616
+ },
4617
+ {
4618
+ "kind": "method",
4619
+ "name": "remaining",
4620
+ "return": {
4621
+ "type": {
4622
+ "text": "number"
4623
+ }
4624
+ },
4625
+ "description": "How much of the set lies below the bottom of the box, in pixels.\n\nFor a host that asks for more items as a reader nears the end. Read from\nthe arithmetic and not from `scrollHeight`, which also counts whatever the\nhost draws around the rows."
4626
+ },
4627
+ {
4628
+ "kind": "method",
4629
+ "name": "spacers",
4630
+ "return": {
4631
+ "type": {
4632
+ "text": "{ after: number; before: number }"
4633
+ }
4634
+ },
4635
+ "parameters": [
4636
+ {
4637
+ "name": "kept",
4638
+ "optional": true,
4639
+ "type": {
4640
+ "text": "number"
4641
+ }
4642
+ }
4643
+ ],
4644
+ "description": "The two spacers' heights for the window, with item `kept` drawn too.\n\nFor a host that keeps an item outside the window drawn, the row holding\nfocus say. The item takes its own room out of the spacer on its side, so\nthe scrollbar still measures the set. Every host that keeps a focused row\nasks this, so the arithmetic is written once."
4645
+ },
4443
4646
  {
4444
4647
  "kind": "method",
4445
4648
  "name": "hostUpdated",
@@ -4504,9 +4707,34 @@
4504
4707
  {
4505
4708
  "name": "inset",
4506
4709
  "default": "0"
4710
+ },
4711
+ {
4712
+ "name": "{ align = 'nearest', behavior }",
4713
+ "default": "{}",
4714
+ "type": {
4715
+ "text": "RevealOptions"
4716
+ }
4717
+ }
4718
+ ],
4719
+ "description": "Scrolls the box to show item `index`.\n\nBy default the least distance that shows it whole, for a host moving focus\nto an item outside the window, whose own element cannot be scrolled to\nbecause it is not drawn where it belongs. `inset` is how far into the box\nthe items start, for a heading that sticks at its top and covers that much\nof every item scrolled under it.\n\n`align` puts the item at the box's `start`, `center` or `end` instead, and\n`behavior` is the platform's, for a host whose consumer asked to be taken\nto an item. A smooth scroll moves the window through the box's own\n`scroll` events, the same as a reader scrolling."
4720
+ },
4721
+ {
4722
+ "kind": "method",
4723
+ "name": "offsetOf",
4724
+ "return": {
4725
+ "type": {
4726
+ "text": "number"
4727
+ }
4728
+ },
4729
+ "parameters": [
4730
+ {
4731
+ "name": "index",
4732
+ "type": {
4733
+ "text": "number"
4734
+ }
4507
4735
  }
4508
4736
  ],
4509
- "description": "Scrolls the box the least distance that shows item `index` whole.\n\nFor a host moving focus to an item outside the window, whose own element\ncannot be scrolled to because it is not drawn where it belongs. `inset` is\nhow far into the box the items start, for a heading that sticks at its\ntop and covers that much of every item scrolled under it."
4737
+ "description": "Where item `index` starts along the scroll axis, in pixels from the top of\nthe set: what was measured above it, or the estimate."
4510
4738
  },
4511
4739
  {
4512
4740
  "kind": "method",
@@ -5534,8 +5762,8 @@
5534
5762
  },
5535
5763
  {
5536
5764
  "kind": "class",
5537
- "description": "A sandbox's panel is about to change height, and can be refused.\n\nThe sibling of `helix-before-split`, and named for the divider rather than for\nthe axis because a reader binding one of the two is choosing which divider they\ncare about. `value` is pixels here and a percentage there, which is what each\nproperty already publishes.",
5538
- "name": "HelixBeforePanelResizeEvent",
5765
+ "description": "The divider between a sandbox's panes settled somewhere new.\n\nThe notification half of `helix-before-split`, sent once `split` has moved,\nwith the lead pane's new share. Not cancelable: the decision was the\nrequest's.",
5766
+ "name": "HelixSplitEvent",
5539
5767
  "members": [
5540
5768
  {
5541
5769
  "kind": "field",
@@ -5545,7 +5773,7 @@
5545
5773
  },
5546
5774
  "static": true,
5547
5775
  "readonly": true,
5548
- "default": "'helix-before-panel-resize'"
5776
+ "default": "'helix-split'"
5549
5777
  }
5550
5778
  ],
5551
5779
  "superclass": {
@@ -5556,8 +5784,8 @@
5556
5784
  },
5557
5785
  {
5558
5786
  "kind": "class",
5559
- "description": "A pane is about to collapse or reopen, and can be refused.",
5560
- "name": "HelixBeforeCollapseEvent",
5787
+ "description": "A sandbox's panel is about to change height, and can be refused.\n\nThe sibling of `helix-before-split`, and named for the divider rather than for\nthe axis because a reader binding one of the two is choosing which divider they\ncare about. `value` is pixels here and a percentage there, which is what each\nproperty already publishes.",
5788
+ "name": "HelixBeforePanelResizeEvent",
5561
5789
  "members": [
5562
5790
  {
5563
5791
  "kind": "field",
@@ -5567,7 +5795,7 @@
5567
5795
  },
5568
5796
  "static": true,
5569
5797
  "readonly": true,
5570
- "default": "'helix-before-collapse'"
5798
+ "default": "'helix-before-panel-resize'"
5571
5799
  }
5572
5800
  ],
5573
5801
  "superclass": {
@@ -5578,8 +5806,8 @@
5578
5806
  },
5579
5807
  {
5580
5808
  "kind": "class",
5581
- "description": "A pane shut or reopened.\n\nThe notification half of `helix-before-collapse`, sent once `collapsed` has\nmoved. `detail.value` is the side that is shut, or empty where both panes\nare open. Not cancelable: the decision was the request's.",
5582
- "name": "HelixCollapseEvent",
5809
+ "description": "A sandbox's panel settled at a new height.\n\nThe notification half of `helix-before-panel-resize`, sent once `panelSize`\nhas moved, with the height in pixels. Not cancelable: the decision was the\nrequest's.",
5810
+ "name": "HelixPanelResizeEvent",
5583
5811
  "members": [
5584
5812
  {
5585
5813
  "kind": "field",
@@ -5589,7 +5817,7 @@
5589
5817
  },
5590
5818
  "static": true,
5591
5819
  "readonly": true,
5592
- "default": "'helix-collapse'"
5820
+ "default": "'helix-panel-resize'"
5593
5821
  }
5594
5822
  ],
5595
5823
  "superclass": {
@@ -5600,8 +5828,8 @@
5600
5828
  },
5601
5829
  {
5602
5830
  "kind": "class",
5603
- "description": "Source is about to be edited, and can be refused.",
5604
- "name": "HelixBeforeEditEvent",
5831
+ "description": "A pane is about to collapse or reopen, and can be refused.",
5832
+ "name": "HelixBeforeCollapseEvent",
5605
5833
  "members": [
5606
5834
  {
5607
5835
  "kind": "field",
@@ -5611,7 +5839,7 @@
5611
5839
  },
5612
5840
  "static": true,
5613
5841
  "readonly": true,
5614
- "default": "'helix-before-edit'"
5842
+ "default": "'helix-before-collapse'"
5615
5843
  }
5616
5844
  ],
5617
5845
  "superclass": {
@@ -5622,8 +5850,8 @@
5622
5850
  },
5623
5851
  {
5624
5852
  "kind": "class",
5625
- "description": "A value is about to change, and the change can be refused.\n\n**The request half of every value control.** It announces the value being\n*proposed*, before anything moves, so a listener calling `preventDefault()`\nrefuses it and the control stays where it was. That is how a consumer takes\none decision without declaring a mode, which is what 294 settled: the element\nalways owns and applies its state, and refusing is the way to take it over.\n\n**The notification is native and separate.** Once this has gone out and the\nvalue has moved, the control announces it again under the platform's own\nname, `input` while a reader is editing and `change` when they are done, so\n`onChange` in React and `onchange=` in HTML both reach it and\n`currentTarget.value` is correct by the time a handler reads it. This event\ncarries the detail because at the moment it fires the value is not on the\nelement yet.\n\n**`announcesInput` picks which native notification fires, not which name this\ncarries.** Granularity is the platform's own distinction, `input` against\n`change`; the request is always this one event.",
5626
- "name": "HelixBeforeChangeEvent",
5853
+ "description": "A pane shut or reopened.\n\nThe notification half of `helix-before-collapse`, sent once `collapsed` has\nmoved. `detail.value` is the side that is shut, or empty where both panes\nare open. Not cancelable: the decision was the request's.",
5854
+ "name": "HelixCollapseEvent",
5627
5855
  "members": [
5628
5856
  {
5629
5857
  "kind": "field",
@@ -5633,7 +5861,7 @@
5633
5861
  },
5634
5862
  "static": true,
5635
5863
  "readonly": true,
5636
- "default": "'helix-before-change'"
5864
+ "default": "'helix-collapse'"
5637
5865
  }
5638
5866
  ],
5639
5867
  "superclass": {
@@ -5644,8 +5872,8 @@
5644
5872
  },
5645
5873
  {
5646
5874
  "kind": "class",
5647
- "description": "A checked state is about to change, and the change can be refused.\n\n**Its own event rather than a `helix-before-change` carrying a boolean.**\nThrough the value event the state arrives as `String(checked)`, so a consumer\nreceives the string `\"false\"`, which is truthy, and a test asserting the value\npasses on that bug. A control whose state is a boolean wants an event with a\ntyped boolean in it.\n\nThe notification is native, as it is for a value: the control relays `change`\nfrom the inner input and announces `input` beside it, so `onChange` reads\n`currentTarget.checked` and gets a boolean from the platform.\n\nIt also ends a collision: Checkbox Group listened for its boxes' change and\ndispatched its own under the same name from the same host, so it needed\n`stopImmediatePropagation` to keep a consumer from receiving one box's boolean\nalongside the whole set. Two names, two facts.",
5648
- "name": "HelixBeforeToggleEvent",
5875
+ "description": "Source is about to be edited, and can be refused.",
5876
+ "name": "HelixBeforeEditEvent",
5649
5877
  "members": [
5650
5878
  {
5651
5879
  "kind": "field",
@@ -5655,7 +5883,7 @@
5655
5883
  },
5656
5884
  "static": true,
5657
5885
  "readonly": true,
5658
- "default": "'helix-before-toggle'"
5886
+ "default": "'helix-before-edit'"
5659
5887
  }
5660
5888
  ],
5661
5889
  "superclass": {
@@ -5666,8 +5894,8 @@
5666
5894
  },
5667
5895
  {
5668
5896
  "kind": "class",
5669
- "description": "The reader asked for something the list does not hold.\n\nCancelable, and announced before anything is applied, because the options are\nthe consumer's own light DOM and no component here writes into it. What the\ncontrol can do is say what was asked for and take the value; putting an\noption in the list, or a row in a database, is the consumer's, and a consumer\nwho validates first refuses this and adds nothing.\n\nThe detail carries the text as typed, not a slug of it. Trimming or lowering\nit here would be this element deciding what a name means, and a consumer who\nwants an identifier can make one from what they were given.",
5670
- "name": "HelixCreateEvent",
5897
+ "description": "Source was edited.\n\nThe notification half of `helix-before-edit`, sent once the pane holds the\nnew source, with that source. Not cancelable: the decision was the\nrequest's.",
5898
+ "name": "HelixEditEvent",
5671
5899
  "members": [
5672
5900
  {
5673
5901
  "kind": "field",
@@ -5677,7 +5905,7 @@
5677
5905
  },
5678
5906
  "static": true,
5679
5907
  "readonly": true,
5680
- "default": "'helix-create'"
5908
+ "default": "'helix-edit'"
5681
5909
  }
5682
5910
  ],
5683
5911
  "superclass": {
@@ -5688,8 +5916,8 @@
5688
5916
  },
5689
5917
  {
5690
5918
  "kind": "class",
5691
- "description": "Something was copied to the clipboard.\n\nNot cancelable, and deliberately: it is announced after the write, because a\nclipboard write is a permission the platform may refuse and there is nothing\nuseful to report until it has either happened or not.",
5692
- "name": "HelixCopyEvent",
5919
+ "description": "A value is about to change, and the change can be refused.\n\n**The request half of every value control.** It announces the value being\n*proposed*, before anything moves, so a listener calling `preventDefault()`\nrefuses it and the control stays where it was. That is how a consumer takes\none decision without declaring a mode, which is what 294 settled: the element\nalways owns and applies its state, and refusing is the way to take it over.\n\n**The notification is native and separate.** Once this has gone out and the\nvalue has moved, the control announces it again under the platform's own\nname, `input` while a reader is editing and `change` when they are done, so\n`onChange` in React and `onchange=` in HTML both reach it and\n`currentTarget.value` is correct by the time a handler reads it. This event\ncarries the detail because at the moment it fires the value is not on the\nelement yet.\n\n**`announcesInput` picks which native notification fires, not which name this\ncarries.** Granularity is the platform's own distinction, `input` against\n`change`; the request is always this one event.",
5920
+ "name": "HelixBeforeChangeEvent",
5693
5921
  "members": [
5694
5922
  {
5695
5923
  "kind": "field",
@@ -5699,7 +5927,7 @@
5699
5927
  },
5700
5928
  "static": true,
5701
5929
  "readonly": true,
5702
- "default": "'helix-copy'"
5930
+ "default": "'helix-before-change'"
5703
5931
  }
5704
5932
  ],
5705
5933
  "superclass": {
@@ -5710,8 +5938,8 @@
5710
5938
  },
5711
5939
  {
5712
5940
  "kind": "class",
5713
- "description": "Fired when something being previewed writes to the console.\n\nCarries text rather than the logged values. The preview is a separate\ndocument, so what arrives has crossed `postMessage` and been through\nstructured clone: a DOM node or a function does not survive that, and half a\nvalue is worse than a string of it.",
5714
- "name": "HelixConsoleEvent",
5941
+ "description": "A checked state is about to change, and the change can be refused.\n\n**Its own event rather than a `helix-before-change` carrying a boolean.**\nThrough the value event the state arrives as `String(checked)`, so a consumer\nreceives the string `\"false\"`, which is truthy, and a test asserting the value\npasses on that bug. A control whose state is a boolean wants an event with a\ntyped boolean in it.\n\nThe notification is native, as it is for a value: the control relays `change`\nfrom the inner input and announces `input` beside it, so `onChange` reads\n`currentTarget.checked` and gets a boolean from the platform.\n\nIt also ends a collision: Checkbox Group listened for its boxes' change and\ndispatched its own under the same name from the same host, so it needed\n`stopImmediatePropagation` to keep a consumer from receiving one box's boolean\nalongside the whole set. Two names, two facts.",
5942
+ "name": "HelixBeforeToggleEvent",
5715
5943
  "members": [
5716
5944
  {
5717
5945
  "kind": "field",
@@ -5721,7 +5949,7 @@
5721
5949
  },
5722
5950
  "static": true,
5723
5951
  "readonly": true,
5724
- "default": "'helix-console'"
5952
+ "default": "'helix-before-toggle'"
5725
5953
  }
5726
5954
  ],
5727
5955
  "superclass": {
@@ -5732,8 +5960,8 @@
5732
5960
  },
5733
5961
  {
5734
5962
  "kind": "class",
5735
- "description": "Fired when something reports how much room its content actually needs.\n\n**A measurement crossing a boundary the measurer is on the far side of.** A\nsandboxed preview is its own document: nothing outside it can read the height\nof what it drew, because the frame is opaque and a box sized from the outside\nonly ever reports the box. So the document measures itself and says so, and\nthis is what it says it with.\n\nA number rather than a box, because the width is the container's to decide and\nonly the block size follows the content. A consumer that wants to act on it\nclamps it: what arrives is what was drawn, which for an empty example is\nnearly nothing and for a long one is more than a page.",
5736
- "name": "HelixResizeEvent",
5963
+ "description": "The reader asked for something the list does not hold.\n\nCancelable, and announced before anything is applied, because the options are\nthe consumer's own light DOM and no component here writes into it. What the\ncontrol can do is say what was asked for and take the value; putting an\noption in the list, or a row in a database, is the consumer's, and a consumer\nwho validates first refuses this and adds nothing.\n\nThe detail carries the text as typed, not a slug of it. Trimming or lowering\nit here would be this element deciding what a name means, and a consumer who\nwants an identifier can make one from what they were given.",
5964
+ "name": "HelixCreateEvent",
5737
5965
  "members": [
5738
5966
  {
5739
5967
  "kind": "field",
@@ -5743,7 +5971,7 @@
5743
5971
  },
5744
5972
  "static": true,
5745
5973
  "readonly": true,
5746
- "default": "'helix-resize'"
5974
+ "default": "'helix-create'"
5747
5975
  }
5748
5976
  ],
5749
5977
  "superclass": {
@@ -5754,8 +5982,8 @@
5754
5982
  },
5755
5983
  {
5756
5984
  "kind": "class",
5757
- "description": "Fired when a header crosses the threshold between resting at the top of the\npage and floating over it.\n\n**The threshold lives in a custom state, and is announced rather than\nreflected.** A `data-scrolled` on the host is an attribute nobody rendered: a\nserver sends the element without it and the element adds it on upgrade, so a\nframework hydrating the page finds markup that no longer matches what it sent.\nA custom state is deliberately not in the DOM and therefore not something a\nhydration pass can disagree with.\n\nThat closes the observability an attribute would accidentally provide. A\n`MutationObserver` can watch an attribute and there is no equivalent for\n`ElementInternals.states`, so a component holding a boolean nothing can read\nis a component with a private opinion its consumers demonstrably need: the\nbar's own backdrop is drawn by the page around it, and the page has to know\nwhen to light it.\n\nNot cancelable. It reports where the page is rather than asking permission to\nbe there, and refusing it would leave the state and the announcement\ndisagreeing.\n\nThe hysteresis stays inside the header, which is the point of announcing at\nall: a consumer listening to `scroll` itself would be a second opinion on\nwhen the page counts as scrolled, and the two would part company at the eight\npixels of travel this waits for.",
5758
- "name": "HelixScrolledEvent",
5985
+ "description": "An aura stopped drawing its shader and shows its gradient, and says why.\n\nSent each time it falls back, from the aura, which then matches\n`:state(fallback)` until it draws again. Not cancelable: there is nothing\nleft to refuse.",
5986
+ "name": "HelixAuraFallbackEvent",
5759
5987
  "members": [
5760
5988
  {
5761
5989
  "kind": "field",
@@ -5765,7 +5993,7 @@
5765
5993
  },
5766
5994
  "static": true,
5767
5995
  "readonly": true,
5768
- "default": "'helix-scrolled'"
5996
+ "default": "'helix-aura-fallback'"
5769
5997
  }
5770
5998
  ],
5771
5999
  "superclass": {
@@ -5776,8 +6004,8 @@
5776
6004
  },
5777
6005
  {
5778
6006
  "kind": "class",
5779
- "description": "Fired when the cursor moves in a text editor.\n\nNot cancelable, unlike everything else here. The others announce something\nabout to happen and a listener can refuse it; this one reports where the\ncaret already is, and there is nothing left to refuse.\n\nIt fires on every keystroke and every arrow press, which is why the status\nbar reads it from the DOM rather than through a framework's state: routing a\ncaret position through React would re-render the workbench on every cursor\nmove.",
5780
- "name": "HelixCaretEvent",
6007
+ "description": "A reader cleared the value: an input's clear button emptied the field, or a\nclearable rating went back to unrated.\n\nSent after the value is cleared, and after the `input` and `change` the\nclear sends. Carries nothing, because the value is the cleared one.",
6008
+ "name": "HelixClearEvent",
5781
6009
  "members": [
5782
6010
  {
5783
6011
  "kind": "field",
@@ -5787,7 +6015,315 @@
5787
6015
  },
5788
6016
  "static": true,
5789
6017
  "readonly": true,
5790
- "default": "'helix-caret'"
6018
+ "default": "'helix-clear'"
6019
+ }
6020
+ ],
6021
+ "superclass": {
6022
+ "name": "Event",
6023
+ "module": "src/events/events.ts"
6024
+ },
6025
+ "helix": {}
6026
+ },
6027
+ {
6028
+ "kind": "class",
6029
+ "description": "A press put nothing on the clipboard: the browser did not allow the write,\nsuch as on a page without the clipboard permission, or there was nothing to\ncopy.",
6030
+ "name": "HelixCopyErrorEvent",
6031
+ "members": [
6032
+ {
6033
+ "kind": "field",
6034
+ "name": "eventName",
6035
+ "type": {
6036
+ "text": "string"
6037
+ },
6038
+ "static": true,
6039
+ "readonly": true,
6040
+ "default": "'helix-copy-error'"
6041
+ }
6042
+ ],
6043
+ "superclass": {
6044
+ "name": "Event",
6045
+ "module": "src/events/events.ts"
6046
+ },
6047
+ "helix": {}
6048
+ },
6049
+ {
6050
+ "kind": "class",
6051
+ "description": "A reader asked for more items: a feed's or a table's `load-more` button, or\na list scrolled near its end. Append them, and set `loading` while they are\non their way.\n\nCarries nothing, because what comes next is the consumer's to know. Not\ncancelable: nothing is loaded until the consumer loads it.",
6052
+ "name": "HelixLoadMoreEvent",
6053
+ "members": [
6054
+ {
6055
+ "kind": "field",
6056
+ "name": "eventName",
6057
+ "type": {
6058
+ "text": "string"
6059
+ },
6060
+ "static": true,
6061
+ "readonly": true,
6062
+ "default": "'helix-load-more'"
6063
+ }
6064
+ ],
6065
+ "superclass": {
6066
+ "name": "Event",
6067
+ "module": "src/events/events.ts"
6068
+ },
6069
+ "helix": {}
6070
+ },
6071
+ {
6072
+ "kind": "class",
6073
+ "description": "A lazy branch opened and asks for its children: a tree item with `lazy`.\nSent from the item, so `target` is the branch to fill.\n\nCarries nothing, because the children are the consumer's to fetch. Not\ncancelable: the branch is already open, and says it is busy until children\narrive.",
6074
+ "name": "HelixLoadEvent",
6075
+ "members": [
6076
+ {
6077
+ "kind": "field",
6078
+ "name": "eventName",
6079
+ "type": {
6080
+ "text": "string"
6081
+ },
6082
+ "static": true,
6083
+ "readonly": true,
6084
+ "default": "'helix-load'"
6085
+ }
6086
+ ],
6087
+ "superclass": {
6088
+ "name": "Event",
6089
+ "module": "src/events/events.ts"
6090
+ },
6091
+ "helix": {}
6092
+ },
6093
+ {
6094
+ "kind": "class",
6095
+ "description": "The items on screen changed: a virtual list was scrolled or resized, or its\nitems changed. Carries the new range, which the list's `range` also holds.\nNot cancelable: the list has already moved.",
6096
+ "name": "HelixRangeChangeEvent",
6097
+ "members": [
6098
+ {
6099
+ "kind": "field",
6100
+ "name": "eventName",
6101
+ "type": {
6102
+ "text": "string"
6103
+ },
6104
+ "static": true,
6105
+ "readonly": true,
6106
+ "default": "'helix-range-change'"
6107
+ }
6108
+ ],
6109
+ "superclass": {
6110
+ "name": "CustomEvent",
6111
+ "module": "src/events/events.ts"
6112
+ },
6113
+ "helix": {}
6114
+ },
6115
+ {
6116
+ "kind": "class",
6117
+ "description": "Rows opened or closed in place: a data table's tree of rows. Carries every\nopen row's key, separated by commas, which the table's `expanded` also\nholds. Not cancelable: the rows have already moved.",
6118
+ "name": "HelixExpandEvent",
6119
+ "members": [
6120
+ {
6121
+ "kind": "field",
6122
+ "name": "eventName",
6123
+ "type": {
6124
+ "text": "string"
6125
+ },
6126
+ "static": true,
6127
+ "readonly": true,
6128
+ "default": "'helix-expand'"
6129
+ }
6130
+ ],
6131
+ "superclass": {
6132
+ "name": "CustomEvent",
6133
+ "module": "src/events/events.ts"
6134
+ },
6135
+ "helix": {}
6136
+ },
6137
+ {
6138
+ "kind": "class",
6139
+ "description": "A sequence played to its last entry and stopped there: a video playlist\nwith no `repeat`. Carries nothing, because the playlist still holds the last\nentry. Not cancelable: playback has already ended.",
6140
+ "name": "HelixEndEvent",
6141
+ "members": [
6142
+ {
6143
+ "kind": "field",
6144
+ "name": "eventName",
6145
+ "type": {
6146
+ "text": "string"
6147
+ },
6148
+ "static": true,
6149
+ "readonly": true,
6150
+ "default": "'helix-end'"
6151
+ }
6152
+ ],
6153
+ "superclass": {
6154
+ "name": "Event",
6155
+ "module": "src/events/events.ts"
6156
+ },
6157
+ "helix": {}
6158
+ },
6159
+ {
6160
+ "kind": "class",
6161
+ "description": "The user started or stopped writing: a chat composer, for a typing\nindicator on the other side. Carries which, as the composer's `typing` does.\nNot cancelable: it reports what the user did.",
6162
+ "name": "HelixTypingEvent",
6163
+ "members": [
6164
+ {
6165
+ "kind": "field",
6166
+ "name": "eventName",
6167
+ "type": {
6168
+ "text": "string"
6169
+ },
6170
+ "static": true,
6171
+ "readonly": true,
6172
+ "default": "'helix-typing'"
6173
+ }
6174
+ ],
6175
+ "superclass": {
6176
+ "name": "CustomEvent",
6177
+ "module": "src/events/events.ts"
6178
+ },
6179
+ "helix": {}
6180
+ },
6181
+ {
6182
+ "kind": "class",
6183
+ "description": "A reader acted on a row: Enter on a list row, or a press in a list that\nselects nothing. Sent from the row, so `target` is the row acted on.\n\nCarries nothing, because the row is the whole of the answer. Not cancelable:\na row with a link follows it and sends nothing, so there is no default left\nto refuse.",
6184
+ "name": "HelixActionEvent",
6185
+ "members": [
6186
+ {
6187
+ "kind": "field",
6188
+ "name": "eventName",
6189
+ "type": {
6190
+ "text": "string"
6191
+ },
6192
+ "static": true,
6193
+ "readonly": true,
6194
+ "default": "'helix-action'"
6195
+ }
6196
+ ],
6197
+ "superclass": {
6198
+ "name": "Event",
6199
+ "module": "src/events/events.ts"
6200
+ },
6201
+ "helix": {}
6202
+ },
6203
+ {
6204
+ "kind": "class",
6205
+ "description": "A checked state changed after `helix-before-toggle` let it: a map layer\nshown or hidden from the layers menu. Sent from what changed, with the state\nit now holds.\n\n**Not the native `toggle`.** That one is a `ToggleEvent` saying a popover or\na `<details>` opened or closed, with `newState` of `open` or `closed`, and a\nlayer shown on a map is neither: it is the request's own verb without\n`before`, carrying the same `checked` the request did.",
6206
+ "name": "HelixToggleEvent",
6207
+ "members": [
6208
+ {
6209
+ "kind": "field",
6210
+ "name": "eventName",
6211
+ "type": {
6212
+ "text": "string"
6213
+ },
6214
+ "static": true,
6215
+ "readonly": true,
6216
+ "default": "'helix-toggle'"
6217
+ }
6218
+ ],
6219
+ "superclass": {
6220
+ "name": "CustomEvent",
6221
+ "module": "src/events/events.ts"
6222
+ },
6223
+ "helix": {}
6224
+ },
6225
+ {
6226
+ "kind": "class",
6227
+ "description": "Something was copied to the clipboard.\n\nNot cancelable, and deliberately: it is announced after the write, because a\nclipboard write is a permission the platform may refuse and there is nothing\nuseful to report until it has either happened or not.",
6228
+ "name": "HelixCopyEvent",
6229
+ "members": [
6230
+ {
6231
+ "kind": "field",
6232
+ "name": "eventName",
6233
+ "type": {
6234
+ "text": "string"
6235
+ },
6236
+ "static": true,
6237
+ "readonly": true,
6238
+ "default": "'helix-copy'"
6239
+ }
6240
+ ],
6241
+ "superclass": {
6242
+ "name": "CustomEvent",
6243
+ "module": "src/events/events.ts"
6244
+ },
6245
+ "helix": {}
6246
+ },
6247
+ {
6248
+ "kind": "class",
6249
+ "description": "Fired when something being previewed writes to the console.\n\nCarries text rather than the logged values. The preview is a separate\ndocument, so what arrives has crossed `postMessage` and been through\nstructured clone: a DOM node or a function does not survive that, and half a\nvalue is worse than a string of it.",
6250
+ "name": "HelixConsoleEvent",
6251
+ "members": [
6252
+ {
6253
+ "kind": "field",
6254
+ "name": "eventName",
6255
+ "type": {
6256
+ "text": "string"
6257
+ },
6258
+ "static": true,
6259
+ "readonly": true,
6260
+ "default": "'helix-console'"
6261
+ }
6262
+ ],
6263
+ "superclass": {
6264
+ "name": "CustomEvent",
6265
+ "module": "src/events/events.ts"
6266
+ },
6267
+ "helix": {}
6268
+ },
6269
+ {
6270
+ "kind": "class",
6271
+ "description": "Fired when something reports how much room its content actually needs.\n\n**A measurement crossing a boundary the measurer is on the far side of.** A\nsandboxed preview is its own document: nothing outside it can read the height\nof what it drew, because the frame is opaque and a box sized from the outside\nonly ever reports the box. So the document measures itself and says so, and\nthis is what it says it with.\n\nA number rather than a box, because the width is the container's to decide and\nonly the block size follows the content. A consumer that wants to act on it\nclamps it: what arrives is what was drawn, which for an empty example is\nnearly nothing and for a long one is more than a page.",
6272
+ "name": "HelixResizeEvent",
6273
+ "members": [
6274
+ {
6275
+ "kind": "field",
6276
+ "name": "eventName",
6277
+ "type": {
6278
+ "text": "string"
6279
+ },
6280
+ "static": true,
6281
+ "readonly": true,
6282
+ "default": "'helix-resize'"
6283
+ }
6284
+ ],
6285
+ "superclass": {
6286
+ "name": "CustomEvent",
6287
+ "module": "src/events/events.ts"
6288
+ },
6289
+ "helix": {}
6290
+ },
6291
+ {
6292
+ "kind": "class",
6293
+ "description": "Fired when a header crosses the threshold between resting at the top of the\npage and floating over it.\n\n**The threshold lives in a custom state, and is announced rather than\nreflected.** A `data-scrolled` on the host is an attribute nobody rendered: a\nserver sends the element without it and the element adds it on upgrade, so a\nframework hydrating the page finds markup that no longer matches what it sent.\nA custom state is deliberately not in the DOM and therefore not something a\nhydration pass can disagree with.\n\nThat closes the observability an attribute would accidentally provide. A\n`MutationObserver` can watch an attribute and there is no equivalent for\n`ElementInternals.states`, so a component holding a boolean nothing can read\nis a component with a private opinion its consumers demonstrably need: the\nbar's own backdrop is drawn by the page around it, and the page has to know\nwhen to light it.\n\nNot cancelable. It reports where the page is rather than asking permission to\nbe there, and refusing it would leave the state and the announcement\ndisagreeing.\n\nThe hysteresis stays inside the header, which is the point of announcing at\nall: a consumer listening to `scroll` itself would be a second opinion on\nwhen the page counts as scrolled, and the two would part company at the eight\npixels of travel this waits for.",
6294
+ "name": "HelixScrolledEvent",
6295
+ "members": [
6296
+ {
6297
+ "kind": "field",
6298
+ "name": "eventName",
6299
+ "type": {
6300
+ "text": "string"
6301
+ },
6302
+ "static": true,
6303
+ "readonly": true,
6304
+ "default": "'helix-scrolled'"
6305
+ }
6306
+ ],
6307
+ "superclass": {
6308
+ "name": "CustomEvent",
6309
+ "module": "src/events/events.ts"
6310
+ },
6311
+ "helix": {}
6312
+ },
6313
+ {
6314
+ "kind": "class",
6315
+ "description": "Fired when the cursor moves in a text editor.\n\nNot cancelable, unlike everything else here. The others announce something\nabout to happen and a listener can refuse it; this one reports where the\ncaret already is, and there is nothing left to refuse.\n\nIt fires on every keystroke and every arrow press, which is why the status\nbar reads it from the DOM rather than through a framework's state: routing a\ncaret position through React would re-render the workbench on every cursor\nmove.",
6316
+ "name": "HelixCaretEvent",
6317
+ "members": [
6318
+ {
6319
+ "kind": "field",
6320
+ "name": "eventName",
6321
+ "type": {
6322
+ "text": "string"
6323
+ },
6324
+ "static": true,
6325
+ "readonly": true,
6326
+ "default": "'helix-caret'"
5791
6327
  }
5792
6328
  ],
5793
6329
  "superclass": {
@@ -6339,193 +6875,305 @@
6339
6875
  },
6340
6876
  {
6341
6877
  "kind": "js",
6342
- "name": "HelixGraphPanEvent",
6878
+ "name": "HelixGraphPanEvent",
6879
+ "declaration": {
6880
+ "name": "HelixGraphPanEvent",
6881
+ "module": "src/events/events.ts"
6882
+ }
6883
+ },
6884
+ {
6885
+ "kind": "js",
6886
+ "name": "HelixGraphZoomEvent",
6887
+ "declaration": {
6888
+ "name": "HelixGraphZoomEvent",
6889
+ "module": "src/events/events.ts"
6890
+ }
6891
+ },
6892
+ {
6893
+ "kind": "js",
6894
+ "name": "HelixGraphLayoutEvent",
6895
+ "declaration": {
6896
+ "name": "HelixGraphLayoutEvent",
6897
+ "module": "src/events/events.ts"
6898
+ }
6899
+ },
6900
+ {
6901
+ "kind": "js",
6902
+ "name": "HelixGraphPartChangeEvent",
6903
+ "declaration": {
6904
+ "name": "HelixGraphPartChangeEvent",
6905
+ "module": "src/events/events.ts"
6906
+ }
6907
+ },
6908
+ {
6909
+ "kind": "js",
6910
+ "name": "HelixGraphSignalEvent",
6911
+ "declaration": {
6912
+ "name": "HelixGraphSignalEvent",
6913
+ "module": "src/events/events.ts"
6914
+ }
6915
+ },
6916
+ {
6917
+ "kind": "js",
6918
+ "name": "HelixGraphReadyEvent",
6919
+ "declaration": {
6920
+ "name": "HelixGraphReadyEvent",
6921
+ "module": "src/events/events.ts"
6922
+ }
6923
+ },
6924
+ {
6925
+ "kind": "js",
6926
+ "name": "HelixGraphFilterEvent",
6927
+ "declaration": {
6928
+ "name": "HelixGraphFilterEvent",
6929
+ "module": "src/events/events.ts"
6930
+ }
6931
+ },
6932
+ {
6933
+ "kind": "js",
6934
+ "name": "HelixMapRotateEvent",
6935
+ "declaration": {
6936
+ "name": "HelixMapRotateEvent",
6937
+ "module": "src/events/events.ts"
6938
+ }
6939
+ },
6940
+ {
6941
+ "kind": "js",
6942
+ "name": "HelixMapTiltEvent",
6943
+ "declaration": {
6944
+ "name": "HelixMapTiltEvent",
6945
+ "module": "src/events/events.ts"
6946
+ }
6947
+ },
6948
+ {
6949
+ "kind": "js",
6950
+ "name": "HelixMapPartChangeEvent",
6951
+ "declaration": {
6952
+ "name": "HelixMapPartChangeEvent",
6953
+ "module": "src/events/events.ts"
6954
+ }
6955
+ },
6956
+ {
6957
+ "kind": "js",
6958
+ "name": "HelixMapClusterEvent",
6959
+ "declaration": {
6960
+ "name": "HelixMapClusterEvent",
6961
+ "module": "src/events/events.ts"
6962
+ }
6963
+ },
6964
+ {
6965
+ "kind": "js",
6966
+ "name": "HelixMapReadyEvent",
6967
+ "declaration": {
6968
+ "name": "HelixMapReadyEvent",
6969
+ "module": "src/events/events.ts"
6970
+ }
6971
+ },
6972
+ {
6973
+ "kind": "js",
6974
+ "name": "HelixBeforePinEvent",
6975
+ "declaration": {
6976
+ "name": "HelixBeforePinEvent",
6977
+ "module": "src/events/events.ts"
6978
+ }
6979
+ },
6980
+ {
6981
+ "kind": "js",
6982
+ "name": "HelixPinEvent",
6983
+ "declaration": {
6984
+ "name": "HelixPinEvent",
6985
+ "module": "src/events/events.ts"
6986
+ }
6987
+ },
6988
+ {
6989
+ "kind": "js",
6990
+ "name": "HelixBeforeResizeEvent",
6343
6991
  "declaration": {
6344
- "name": "HelixGraphPanEvent",
6992
+ "name": "HelixBeforeResizeEvent",
6345
6993
  "module": "src/events/events.ts"
6346
6994
  }
6347
6995
  },
6348
6996
  {
6349
6997
  "kind": "js",
6350
- "name": "HelixGraphZoomEvent",
6998
+ "name": "HelixResizedEvent",
6351
6999
  "declaration": {
6352
- "name": "HelixGraphZoomEvent",
7000
+ "name": "HelixResizedEvent",
6353
7001
  "module": "src/events/events.ts"
6354
7002
  }
6355
7003
  },
6356
7004
  {
6357
7005
  "kind": "js",
6358
- "name": "HelixGraphLayoutEvent",
7006
+ "name": "HelixBeforeSplitEvent",
6359
7007
  "declaration": {
6360
- "name": "HelixGraphLayoutEvent",
7008
+ "name": "HelixBeforeSplitEvent",
6361
7009
  "module": "src/events/events.ts"
6362
7010
  }
6363
7011
  },
6364
7012
  {
6365
7013
  "kind": "js",
6366
- "name": "HelixGraphPartChangeEvent",
7014
+ "name": "HelixSplitEvent",
6367
7015
  "declaration": {
6368
- "name": "HelixGraphPartChangeEvent",
7016
+ "name": "HelixSplitEvent",
6369
7017
  "module": "src/events/events.ts"
6370
7018
  }
6371
7019
  },
6372
7020
  {
6373
7021
  "kind": "js",
6374
- "name": "HelixGraphSignalEvent",
7022
+ "name": "HelixBeforePanelResizeEvent",
6375
7023
  "declaration": {
6376
- "name": "HelixGraphSignalEvent",
7024
+ "name": "HelixBeforePanelResizeEvent",
6377
7025
  "module": "src/events/events.ts"
6378
7026
  }
6379
7027
  },
6380
7028
  {
6381
7029
  "kind": "js",
6382
- "name": "HelixGraphReadyEvent",
7030
+ "name": "HelixPanelResizeEvent",
6383
7031
  "declaration": {
6384
- "name": "HelixGraphReadyEvent",
7032
+ "name": "HelixPanelResizeEvent",
6385
7033
  "module": "src/events/events.ts"
6386
7034
  }
6387
7035
  },
6388
7036
  {
6389
7037
  "kind": "js",
6390
- "name": "HelixGraphFilterEvent",
7038
+ "name": "HelixBeforeCollapseEvent",
6391
7039
  "declaration": {
6392
- "name": "HelixGraphFilterEvent",
7040
+ "name": "HelixBeforeCollapseEvent",
6393
7041
  "module": "src/events/events.ts"
6394
7042
  }
6395
7043
  },
6396
7044
  {
6397
7045
  "kind": "js",
6398
- "name": "HelixMapRotateEvent",
7046
+ "name": "HelixCollapseEvent",
6399
7047
  "declaration": {
6400
- "name": "HelixMapRotateEvent",
7048
+ "name": "HelixCollapseEvent",
6401
7049
  "module": "src/events/events.ts"
6402
7050
  }
6403
7051
  },
6404
7052
  {
6405
7053
  "kind": "js",
6406
- "name": "HelixMapTiltEvent",
7054
+ "name": "HelixBeforeEditEvent",
6407
7055
  "declaration": {
6408
- "name": "HelixMapTiltEvent",
7056
+ "name": "HelixBeforeEditEvent",
6409
7057
  "module": "src/events/events.ts"
6410
7058
  }
6411
7059
  },
6412
7060
  {
6413
7061
  "kind": "js",
6414
- "name": "HelixMapPartChangeEvent",
7062
+ "name": "HelixEditEvent",
6415
7063
  "declaration": {
6416
- "name": "HelixMapPartChangeEvent",
7064
+ "name": "HelixEditEvent",
6417
7065
  "module": "src/events/events.ts"
6418
7066
  }
6419
7067
  },
6420
7068
  {
6421
7069
  "kind": "js",
6422
- "name": "HelixMapClusterEvent",
7070
+ "name": "HelixBeforeChangeEvent",
6423
7071
  "declaration": {
6424
- "name": "HelixMapClusterEvent",
7072
+ "name": "HelixBeforeChangeEvent",
6425
7073
  "module": "src/events/events.ts"
6426
7074
  }
6427
7075
  },
6428
7076
  {
6429
7077
  "kind": "js",
6430
- "name": "HelixMapReadyEvent",
7078
+ "name": "HelixBeforeToggleEvent",
6431
7079
  "declaration": {
6432
- "name": "HelixMapReadyEvent",
7080
+ "name": "HelixBeforeToggleEvent",
6433
7081
  "module": "src/events/events.ts"
6434
7082
  }
6435
7083
  },
6436
7084
  {
6437
7085
  "kind": "js",
6438
- "name": "HelixBeforePinEvent",
7086
+ "name": "HelixCreateEvent",
6439
7087
  "declaration": {
6440
- "name": "HelixBeforePinEvent",
7088
+ "name": "HelixCreateEvent",
6441
7089
  "module": "src/events/events.ts"
6442
7090
  }
6443
7091
  },
6444
7092
  {
6445
7093
  "kind": "js",
6446
- "name": "HelixPinEvent",
7094
+ "name": "HelixAuraFallbackEvent",
6447
7095
  "declaration": {
6448
- "name": "HelixPinEvent",
7096
+ "name": "HelixAuraFallbackEvent",
6449
7097
  "module": "src/events/events.ts"
6450
7098
  }
6451
7099
  },
6452
7100
  {
6453
7101
  "kind": "js",
6454
- "name": "HelixBeforeResizeEvent",
7102
+ "name": "HelixClearEvent",
6455
7103
  "declaration": {
6456
- "name": "HelixBeforeResizeEvent",
7104
+ "name": "HelixClearEvent",
6457
7105
  "module": "src/events/events.ts"
6458
7106
  }
6459
7107
  },
6460
7108
  {
6461
7109
  "kind": "js",
6462
- "name": "HelixResizedEvent",
7110
+ "name": "HelixCopyErrorEvent",
6463
7111
  "declaration": {
6464
- "name": "HelixResizedEvent",
7112
+ "name": "HelixCopyErrorEvent",
6465
7113
  "module": "src/events/events.ts"
6466
7114
  }
6467
7115
  },
6468
7116
  {
6469
7117
  "kind": "js",
6470
- "name": "HelixBeforeSplitEvent",
7118
+ "name": "HelixLoadMoreEvent",
6471
7119
  "declaration": {
6472
- "name": "HelixBeforeSplitEvent",
7120
+ "name": "HelixLoadMoreEvent",
6473
7121
  "module": "src/events/events.ts"
6474
7122
  }
6475
7123
  },
6476
7124
  {
6477
7125
  "kind": "js",
6478
- "name": "HelixBeforePanelResizeEvent",
7126
+ "name": "HelixLoadEvent",
6479
7127
  "declaration": {
6480
- "name": "HelixBeforePanelResizeEvent",
7128
+ "name": "HelixLoadEvent",
6481
7129
  "module": "src/events/events.ts"
6482
7130
  }
6483
7131
  },
6484
7132
  {
6485
7133
  "kind": "js",
6486
- "name": "HelixBeforeCollapseEvent",
7134
+ "name": "HelixRangeChangeEvent",
6487
7135
  "declaration": {
6488
- "name": "HelixBeforeCollapseEvent",
7136
+ "name": "HelixRangeChangeEvent",
6489
7137
  "module": "src/events/events.ts"
6490
7138
  }
6491
7139
  },
6492
7140
  {
6493
7141
  "kind": "js",
6494
- "name": "HelixCollapseEvent",
7142
+ "name": "HelixExpandEvent",
6495
7143
  "declaration": {
6496
- "name": "HelixCollapseEvent",
7144
+ "name": "HelixExpandEvent",
6497
7145
  "module": "src/events/events.ts"
6498
7146
  }
6499
7147
  },
6500
7148
  {
6501
7149
  "kind": "js",
6502
- "name": "HelixBeforeEditEvent",
7150
+ "name": "HelixEndEvent",
6503
7151
  "declaration": {
6504
- "name": "HelixBeforeEditEvent",
7152
+ "name": "HelixEndEvent",
6505
7153
  "module": "src/events/events.ts"
6506
7154
  }
6507
7155
  },
6508
7156
  {
6509
7157
  "kind": "js",
6510
- "name": "HelixBeforeChangeEvent",
7158
+ "name": "HelixTypingEvent",
6511
7159
  "declaration": {
6512
- "name": "HelixBeforeChangeEvent",
7160
+ "name": "HelixTypingEvent",
6513
7161
  "module": "src/events/events.ts"
6514
7162
  }
6515
7163
  },
6516
7164
  {
6517
7165
  "kind": "js",
6518
- "name": "HelixBeforeToggleEvent",
7166
+ "name": "HelixActionEvent",
6519
7167
  "declaration": {
6520
- "name": "HelixBeforeToggleEvent",
7168
+ "name": "HelixActionEvent",
6521
7169
  "module": "src/events/events.ts"
6522
7170
  }
6523
7171
  },
6524
7172
  {
6525
7173
  "kind": "js",
6526
- "name": "HelixCreateEvent",
7174
+ "name": "HelixToggleEvent",
6527
7175
  "declaration": {
6528
- "name": "HelixCreateEvent",
7176
+ "name": "HelixToggleEvent",
6529
7177
  "module": "src/events/events.ts"
6530
7178
  }
6531
7179
  },
@@ -7098,7 +7746,25 @@
7098
7746
  }
7099
7747
  }
7100
7748
  ],
7101
- "description": "The prop React would be holding for this event, if it is holding one.\n\n**A relayed native event needs a different answer from one of ours, and\ngetting it wrong doubles every call.** Measured against React 19.2.8:\n\n```\nonhelix-before-change <- helix-before-change REACHED (React binds it with addEventListener)\nonChange <- change REACHED (React's delegated root listener)\nonLoad <- load not reached\nonError <- error not reached\nonEnded <- ended not reached\n```\n\nReact binds a hyphenated prop directly on the element, so our own events are\nreached by name and are safe to bind again: same type, same callback, same\ncapture flag is a no-op by specification. A native name is different. React\nrecognizes `onChange` and `onLoad` as its own registration names and attaches\nnothing to the element for either; it relies on a delegated listener at the\nroot, which sees an event only if it **bubbles**, and on a non-delegated list\nit sets up for `<video>`, `<audio>` and `<img>` and never for a custom\nelement.\n\nSo a bubbling relay already arrives and must not be bound again: React's\nlistener is at the root rather than on the element, so nothing deduplicates\nit and the consumer's handler runs twice. A non-bubbling relay arrives\nnowhere, and is the bug this exists to close: `<helix-avatar>` relays `load`\nand `error`, `<helix-video>` relays `ended`, `play` and `pause`, all of them\ndeclared public API and all of them otherwise silent in React.\n\nThe name is React's own casing, `onError` rather than `onerror`, because that\nis what a consumer writes and therefore what is in the props bag. Every\nnative we relay is a single word, so capitalising the first letter is the\nwhole of the rule; a two-word name like `loadeddata` would be `onLoadedData`\nand needs the list extending rather than the rule generalising."
7749
+ "description": "The prop React would be holding for this event, if it is holding one.\n\n**A relayed native event needs a different answer from one of ours, and\ngetting it wrong doubles every call.** Measured against React 19.2.8:\n\n```\nonhelix-before-change <- helix-before-change REACHED (React binds it with addEventListener)\nonChange <- change REACHED (React's delegated root listener)\nonLoad <- load not reached\nonError <- error not reached\nonEnded <- ended not reached\n```\n\nReact binds a hyphenated prop directly on the element, so our own events are\nreached by name and are safe to bind again: same type, same callback, same\ncapture flag is a no-op by specification. A native name is different. React\nrecognizes `onChange` and `onLoad` as its own registration names and attaches\nnothing to the element for either; it relies on a delegated listener at the\nroot, which sees an event only if it **bubbles**, and on a non-delegated list\nit sets up for `<video>`, `<audio>` and `<img>` and never for a custom\nelement.\n\nSo a bubbling relay already arrives and must not be bound again: React's\nlistener is at the root rather than on the element, so nothing deduplicates\nit and the consumer's handler runs twice. A non-bubbling relay arrives\nnowhere, and is the bug this exists to close: `<helix-avatar>` relays `load`\nand `error`, `<helix-video>` relays `ended`, `play` and `pause`, all of them\ndeclared public API and all of them otherwise silent in React.\n\nThe name is React's own casing, `onError` rather than `onerror`, because that\nis what a consumer writes and therefore what is in the props bag. See\n`reactNativeProp`."
7750
+ },
7751
+ {
7752
+ "kind": "function",
7753
+ "name": "reactNativeProp",
7754
+ "return": {
7755
+ "type": {
7756
+ "text": "string"
7757
+ }
7758
+ },
7759
+ "parameters": [
7760
+ {
7761
+ "name": "type",
7762
+ "type": {
7763
+ "text": "string"
7764
+ }
7765
+ }
7766
+ ],
7767
+ "description": "The prop React reads for a native event: `onError` for `error`, and\n`onTimeUpdate` for `timeupdate`.\n\nThe JSX typings name the same props, so a consumer writes what this binds."
7102
7768
  },
7103
7769
  {
7104
7770
  "kind": "function",
@@ -7167,6 +7833,14 @@
7167
7833
  "module": "src/helix-element/react-bridge.ts"
7168
7834
  }
7169
7835
  },
7836
+ {
7837
+ "kind": "js",
7838
+ "name": "reactNativeProp",
7839
+ "declaration": {
7840
+ "name": "reactNativeProp",
7841
+ "module": "src/helix-element/react-bridge.ts"
7842
+ }
7843
+ },
7170
7844
  {
7171
7845
  "kind": "js",
7172
7846
  "name": "bindReactHandler",
@@ -8100,6 +8774,22 @@
8100
8774
  "module": "./controllers/copy-controller/copy-controller.js"
8101
8775
  }
8102
8776
  },
8777
+ {
8778
+ "kind": "js",
8779
+ "name": "CountdownController",
8780
+ "declaration": {
8781
+ "name": "CountdownController",
8782
+ "module": "./controllers/countdown-controller/countdown-controller.js"
8783
+ }
8784
+ },
8785
+ {
8786
+ "kind": "js",
8787
+ "name": "CountdownOptions",
8788
+ "declaration": {
8789
+ "name": "CountdownOptions",
8790
+ "module": "./controllers/countdown-controller/countdown-controller.js"
8791
+ }
8792
+ },
8103
8793
  {
8104
8794
  "kind": "js",
8105
8795
  "name": "activeCue",
@@ -8332,6 +9022,14 @@
8332
9022
  "module": "./controllers/keyboard-navigation-controller/keyboard-navigation-controller.js"
8333
9023
  }
8334
9024
  },
9025
+ {
9026
+ "kind": "js",
9027
+ "name": "KeyboardOrigin",
9028
+ "declaration": {
9029
+ "name": "KeyboardOrigin",
9030
+ "module": "./controllers/keyboard-navigation-controller/keyboard-navigation-controller.js"
9031
+ }
9032
+ },
8335
9033
  {
8336
9034
  "kind": "js",
8337
9035
  "name": "NavigableItem",
@@ -8596,6 +9294,14 @@
8596
9294
  "module": "./events/element-events.js"
8597
9295
  }
8598
9296
  },
9297
+ {
9298
+ "kind": "js",
9299
+ "name": "AuraFallbackDetail",
9300
+ "declaration": {
9301
+ "name": "AuraFallbackDetail",
9302
+ "module": "./events/events.js"
9303
+ }
9304
+ },
8599
9305
  {
8600
9306
  "kind": "js",
8601
9307
  "name": "CanvasView",
@@ -8716,6 +9422,14 @@
8716
9422
  "module": "./events/events.js"
8717
9423
  }
8718
9424
  },
9425
+ {
9426
+ "kind": "js",
9427
+ "name": "HelixActionEvent",
9428
+ "declaration": {
9429
+ "name": "HelixActionEvent",
9430
+ "module": "./events/events.js"
9431
+ }
9432
+ },
8719
9433
  {
8720
9434
  "kind": "js",
8721
9435
  "name": "HelixActivateEvent",
@@ -8724,6 +9438,14 @@
8724
9438
  "module": "./events/events.js"
8725
9439
  }
8726
9440
  },
9441
+ {
9442
+ "kind": "js",
9443
+ "name": "HelixAuraFallbackEvent",
9444
+ "declaration": {
9445
+ "name": "HelixAuraFallbackEvent",
9446
+ "module": "./events/events.js"
9447
+ }
9448
+ },
8727
9449
  {
8728
9450
  "kind": "js",
8729
9451
  "name": "HelixBeforeActivateEvent",
@@ -8876,6 +9598,14 @@
8876
9598
  "module": "./events/events.js"
8877
9599
  }
8878
9600
  },
9601
+ {
9602
+ "kind": "js",
9603
+ "name": "HelixClearEvent",
9604
+ "declaration": {
9605
+ "name": "HelixClearEvent",
9606
+ "module": "./events/events.js"
9607
+ }
9608
+ },
8879
9609
  {
8880
9610
  "kind": "js",
8881
9611
  "name": "HelixCollapseEvent",
@@ -8908,6 +9638,14 @@
8908
9638
  "module": "./events/events.js"
8909
9639
  }
8910
9640
  },
9641
+ {
9642
+ "kind": "js",
9643
+ "name": "HelixCopyErrorEvent",
9644
+ "declaration": {
9645
+ "name": "HelixCopyErrorEvent",
9646
+ "module": "./events/events.js"
9647
+ }
9648
+ },
8911
9649
  {
8912
9650
  "kind": "js",
8913
9651
  "name": "HelixCopyEvent",
@@ -8932,6 +9670,30 @@
8932
9670
  "module": "./events/events.js"
8933
9671
  }
8934
9672
  },
9673
+ {
9674
+ "kind": "js",
9675
+ "name": "HelixEditEvent",
9676
+ "declaration": {
9677
+ "name": "HelixEditEvent",
9678
+ "module": "./events/events.js"
9679
+ }
9680
+ },
9681
+ {
9682
+ "kind": "js",
9683
+ "name": "HelixEndEvent",
9684
+ "declaration": {
9685
+ "name": "HelixEndEvent",
9686
+ "module": "./events/events.js"
9687
+ }
9688
+ },
9689
+ {
9690
+ "kind": "js",
9691
+ "name": "HelixExpandEvent",
9692
+ "declaration": {
9693
+ "name": "HelixExpandEvent",
9694
+ "module": "./events/events.js"
9695
+ }
9696
+ },
8935
9697
  {
8936
9698
  "kind": "js",
8937
9699
  "name": "HelixFacetEvent",
@@ -9020,6 +9782,22 @@
9020
9782
  "module": "./events/events.js"
9021
9783
  }
9022
9784
  },
9785
+ {
9786
+ "kind": "js",
9787
+ "name": "HelixLoadEvent",
9788
+ "declaration": {
9789
+ "name": "HelixLoadEvent",
9790
+ "module": "./events/events.js"
9791
+ }
9792
+ },
9793
+ {
9794
+ "kind": "js",
9795
+ "name": "HelixLoadMoreEvent",
9796
+ "declaration": {
9797
+ "name": "HelixLoadMoreEvent",
9798
+ "module": "./events/events.js"
9799
+ }
9800
+ },
9023
9801
  {
9024
9802
  "kind": "js",
9025
9803
  "name": "HelixMapClusterEvent",
@@ -9100,6 +9878,14 @@
9100
9878
  "module": "./events/events.js"
9101
9879
  }
9102
9880
  },
9881
+ {
9882
+ "kind": "js",
9883
+ "name": "HelixPanelResizeEvent",
9884
+ "declaration": {
9885
+ "name": "HelixPanelResizeEvent",
9886
+ "module": "./events/events.js"
9887
+ }
9888
+ },
9103
9889
  {
9104
9890
  "kind": "js",
9105
9891
  "name": "HelixPinEvent",
@@ -9116,6 +9902,14 @@
9116
9902
  "module": "./events/events.js"
9117
9903
  }
9118
9904
  },
9905
+ {
9906
+ "kind": "js",
9907
+ "name": "HelixRangeChangeEvent",
9908
+ "declaration": {
9909
+ "name": "HelixRangeChangeEvent",
9910
+ "module": "./events/events.js"
9911
+ }
9912
+ },
9119
9913
  {
9120
9914
  "kind": "js",
9121
9915
  "name": "HelixReadEvent",
@@ -9260,6 +10054,22 @@
9260
10054
  "module": "./events/events.js"
9261
10055
  }
9262
10056
  },
10057
+ {
10058
+ "kind": "js",
10059
+ "name": "HelixSplitEvent",
10060
+ "declaration": {
10061
+ "name": "HelixSplitEvent",
10062
+ "module": "./events/events.js"
10063
+ }
10064
+ },
10065
+ {
10066
+ "kind": "js",
10067
+ "name": "HelixToggleEvent",
10068
+ "declaration": {
10069
+ "name": "HelixToggleEvent",
10070
+ "module": "./events/events.js"
10071
+ }
10072
+ },
9263
10073
  {
9264
10074
  "kind": "js",
9265
10075
  "name": "HelixTourAskEvent",
@@ -9268,6 +10078,14 @@
9268
10078
  "module": "./events/events.js"
9269
10079
  }
9270
10080
  },
10081
+ {
10082
+ "kind": "js",
10083
+ "name": "HelixTypingEvent",
10084
+ "declaration": {
10085
+ "name": "HelixTypingEvent",
10086
+ "module": "./events/events.js"
10087
+ }
10088
+ },
9271
10089
  {
9272
10090
  "kind": "js",
9273
10091
  "name": "MapClusterDetail",
@@ -9340,6 +10158,14 @@
9340
10158
  "module": "./events/events.js"
9341
10159
  }
9342
10160
  },
10161
+ {
10162
+ "kind": "js",
10163
+ "name": "RangeDetail",
10164
+ "declaration": {
10165
+ "name": "RangeDetail",
10166
+ "module": "./events/events.js"
10167
+ }
10168
+ },
9343
10169
  {
9344
10170
  "kind": "js",
9345
10171
  "name": "ReadDetail",
@@ -9460,6 +10286,14 @@
9460
10286
  "module": "./events/events.js"
9461
10287
  }
9462
10288
  },
10289
+ {
10290
+ "kind": "js",
10291
+ "name": "TypingDetail",
10292
+ "declaration": {
10293
+ "name": "TypingDetail",
10294
+ "module": "./events/events.js"
10295
+ }
10296
+ },
9463
10297
  {
9464
10298
  "kind": "js",
9465
10299
  "name": "ViewportPanDetail",
@@ -10596,6 +11430,14 @@
10596
11430
  "module": "./utils/platform/platform.js"
10597
11431
  }
10598
11432
  },
11433
+ {
11434
+ "kind": "js",
11435
+ "name": "rangeAdd",
11436
+ "declaration": {
11437
+ "name": "rangeAdd",
11438
+ "module": "./utils/range-add/range-add.js"
11439
+ }
11440
+ },
10599
11441
  {
10600
11442
  "kind": "js",
10601
11443
  "name": "ColorBytes",
@@ -19004,7 +19846,7 @@
19004
19846
  }
19005
19847
  }
19006
19848
  ],
19007
- "description": "Draws an icon that was imported by name, rather than looked up by string.\n\n**`<helix-icon name=\"play\">` indexes the whole icon set at runtime.** Its\nrender is `icons[this.name]`, and no bundler can shake a dynamic index, so\nevery consumer of any component that renders one ships all of the generated\npath data: measured at 50,814 bytes raw and 15,010 gzipped for 102 icons, and\ngrowing about 147 gzipped bytes per icon added. A named import ships one path\nand is checked when the package compiles rather than by a name lookup later.\n\nThat element still earns its place as *public* API, where a consumer writes a\nname in markup and a lookup is the only thing that can work. What it should\nnot be is how this library draws its own marks.\n\n**There is no `part` option, and there cannot be.** A part name behind an\ninterpolation is a part the manifest cannot see, so the component's own\nstylesheet matches nothing and the part stops being\nAPI. `Trend` needs one and therefore writes its `<svg>` out with a literal\n`part=\"icon\"`, which is the honest cost: a helper can carry everything except\nthe thing static analysis has to read.\n\n`data-glyph` rather than a class, because the sizing lives in\n`helix/styled/src/shared/glyph/glyph.css` and a component's own `--icon-size`\ndeclarations have to keep working untouched: the variable was read by\n`helix-icon`, and now it is read by the rule that sheet carries. Without it\nevery one of those declarations would go quietly dead and every mark in six\nfamilies would change size."
19849
+ "description": "Draws an icon that was imported by name, rather than looked up by string.\n\n**`<helix-icon name=\"play\">` looks its glyph up in a registry at runtime.**\nThe registry holds the whole set once `@fusion.dev/helix-headless/icon`\nregisters it, and no bundler can shake a lookup by string, so every consumer\nof any component that renders one ships all of the generated path data: measured at 50,814 bytes raw and 15,010 gzipped for 102 icons, and\ngrowing about 147 gzipped bytes per icon added. A named import ships one path\nand is checked when the package compiles rather than by a name lookup later.\n\nThat element still earns its place as *public* API, where a consumer writes a\nname in markup and a lookup is the only thing that can work, and\n`@fusion.dev/helix-headless/icon/root` names glyphs without registering the\nset. What it should not be is how this library draws its own marks.\n\n**There is no `part` option, and there cannot be.** A part name behind an\ninterpolation is a part the manifest cannot see, so the component's own\nstylesheet matches nothing and the part stops being\nAPI. `Trend` needs one and therefore writes its `<svg>` out with a literal\n`part=\"icon\"`, which is the honest cost: a helper can carry everything except\nthe thing static analysis has to read.\n\n`data-glyph` rather than a class, because the sizing lives in\n`helix/styled/src/shared/glyph/glyph.css` and a component's own `--icon-size`\ndeclarations have to keep working untouched: the variable was read by\n`helix-icon`, and now it is read by the rule that sheet carries. Without it\nevery one of those declarations would go quietly dead and every mark in six\nfamilies would change size."
19008
19850
  }
19009
19851
  ],
19010
19852
  "exports": [
@@ -20078,6 +20920,58 @@
20078
20920
  }
20079
20921
  ]
20080
20922
  },
20923
+ {
20924
+ "kind": "javascript-module",
20925
+ "path": "src/utils/range-add/range-add.ts",
20926
+ "declarations": [
20927
+ {
20928
+ "kind": "function",
20929
+ "name": "rangeAdd",
20930
+ "return": {
20931
+ "type": {
20932
+ "text": "string[] | null"
20933
+ }
20934
+ },
20935
+ "parameters": [
20936
+ {
20937
+ "name": "values",
20938
+ "type": {
20939
+ "text": "readonly string[]"
20940
+ }
20941
+ },
20942
+ {
20943
+ "name": "shown",
20944
+ "type": {
20945
+ "text": "readonly string[]"
20946
+ }
20947
+ },
20948
+ {
20949
+ "name": "from",
20950
+ "type": {
20951
+ "text": "number"
20952
+ }
20953
+ },
20954
+ {
20955
+ "name": "to",
20956
+ "type": {
20957
+ "text": "number"
20958
+ }
20959
+ }
20960
+ ],
20961
+ "description": "The selection after Shift with Home or End: every option shown from the\nhighlight to the end the key went to, added after what was selected, or\n`null` where nothing new is taken in.\n\n`from` is where the highlight was, as an index into `shown`, or `-1` for no\nhighlight, which takes in the end alone. `to` is the end the key went to.\nAPG's multiple-selection listbox, and the same rule over a data table's\nrows."
20962
+ }
20963
+ ],
20964
+ "exports": [
20965
+ {
20966
+ "kind": "js",
20967
+ "name": "rangeAdd",
20968
+ "declaration": {
20969
+ "name": "rangeAdd",
20970
+ "module": "src/utils/range-add/range-add.ts"
20971
+ }
20972
+ }
20973
+ ]
20974
+ },
20081
20975
  {
20082
20976
  "kind": "javascript-module",
20083
20977
  "path": "src/utils/read-color/read-color.ts",
@@ -20322,7 +21216,7 @@
20322
21216
  }
20323
21217
  }
20324
21218
  ],
20325
- "description": "Writes elements onto an ARIA element-reflection property of `target`, or\nclears it, and says whether the property is now this caller's.\n\nElement references, because the words are in the light DOM and the panel in\na shadow root, which an IDREF cannot cross. Nothing is written where the\nengine has no reflection, which keeps the fallback name, and the answer is\nthen `owned` as it was. **An empty list clears the property only where the\ncaller wrote it**, which `owned` says, so a name another hand wrote stays.\n\nDialog and Drawer name their panel by its header this way, Popover by its\nfirst heading, Dialog describes itself by its body, and a Tour stop names\nand describes its panel."
21219
+ "description": "Writes elements onto an ARIA element-reflection property of `target`, or\nclears it, and says whether the property is now this caller's.\n\nElement references, because the words are in the light DOM and the panel in\na shadow root, which an IDREF cannot cross. Nothing is written where the\nengine has no reflection, which keeps the fallback name, and the answer is\nthen `owned` as it was. **An empty list clears the property only where the\ncaller wrote it**, which `owned` says, so a name another hand wrote stays.\n\nDialog and Drawer name their panel by its header this way, Popover by its\nfirst heading, Dialog describes itself by its body, a Tour stop names and\ndescribes its panel, and a Tab points its control at the panel it shows."
20326
21220
  },
20327
21221
  {
20328
21222
  "kind": "function",
@@ -22129,7 +23023,7 @@
22129
23023
  }
22130
23024
  }
22131
23025
  ],
22132
- "description": "A time written the way the reader's locale writes one.\n\n`Intl` decides between a twelve and a twenty-four hour clock, because that is\na property of the locale rather than of any component: `en-US` gets `2:30 PM`\nand `en-GB` gets `14:30` without either being configured. There is no flag to\nforce one, deliberately. A product that needs to override its reader's own\nconvention has a locale problem rather than a component one, and the value is\n24 hour regardless.\n\nA value this cannot read is handed back unchanged, so a field showing what is\nbeing typed shows the letters rather than blanking under the reader. Minute\nprecision, as `valueAsMinutes` reads: `writeClock` is the same writing to the\nsecond."
23026
+ "description": "A time written the way the reader's locale writes one.\n\n`Intl` decides between a twelve and a twenty-four hour clock, because that is\na property of the locale rather than of any component: `en-US` gets `2:30 PM`\nand `en-GB` gets `14:30` without either being configured. This function takes\nno flag to force one. A family that offers the choice, such as Time Picker\nand Time Input with `hour-cycle`, passes it in the locale, as its `-u-hc-`\nextension (`en-US-u-hc-h23`). The value is 24 hour regardless.\n\nA value this cannot read is handed back unchanged, so a field showing what is\nbeing typed shows the letters rather than blanking under the reader. Minute\nprecision, as `valueAsMinutes` reads: `writeClock` is the same writing to the\nsecond."
22133
23027
  },
22134
23028
  {
22135
23029
  "kind": "function",
@@ -22314,7 +23208,7 @@
22314
23208
  "type": {
22315
23209
  "text": "string"
22316
23210
  },
22317
- "default": "'0.144.0'",
23211
+ "default": "'0.145.0'",
22318
23212
  "description": "The version of the package this file ships in.\n\n**Written by `fusion/scripts/version.mjs`** wherever it writes the package's\n`package.json`, and stamped back into the repository beside it after a\nrelease, so the two never disagree; a spec beside this holds them to it.\nNothing else in the running code knows which release it is."
22319
23213
  }
22320
23214
  ],
@@ -22332,6 +23226,6 @@
22332
23226
  ],
22333
23227
  "helix": {
22334
23228
  "package": "@fusion.dev/helix-core",
22335
- "version": "0.144.0"
23229
+ "version": "0.145.0"
22336
23230
  }
22337
23231
  }