@fusion.dev/helix-core 0.182.1 → 0.183.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/custom-elements.json +1677 -349
  2. package/dist/controllers/aria-forward-controller/aria-forward-controller.d.ts +4 -0
  3. package/dist/controllers/virtualize-controller/heights.d.ts +7 -0
  4. package/dist/controllers/virtualize-controller/heights.js +7 -0
  5. package/dist/controllers/virtualize-controller/virtualize-controller.d.ts +24 -0
  6. package/dist/controllers/virtualize-controller/virtualize-controller.js +40 -20
  7. package/dist/controllers/virtualize-controller/waterfall.d.ts +66 -0
  8. package/dist/controllers/virtualize-controller/waterfall.js +137 -0
  9. package/dist/helix-element/helix-element.d.ts +11 -1
  10. package/dist/helix-element/helix-element.js +7 -6
  11. package/dist/helix-element/mark-rules.d.ts +119 -0
  12. package/dist/helix-element/mark-rules.js +4 -0
  13. package/dist/helix-form-element/helix-form-element-base.d.ts +264 -0
  14. package/dist/helix-form-element/helix-form-element-base.js +173 -0
  15. package/dist/helix-form-element/helix-form-element.d.ts +8 -226
  16. package/dist/helix-form-element/helix-form-element.js +2 -157
  17. package/dist/index.d.ts +3 -0
  18. package/dist/index.js +3 -0
  19. package/dist/mixins/mixin-chart-source/mixin-chart-source.js +1 -6
  20. package/dist/mixins/mixin-chart-status/mixin-chart-status.js +1 -6
  21. package/dist/mixins/mixin-collection/mixin-collection.js +1 -6
  22. package/dist/mixins/mixin-controller-active/mixin-controller-active.js +1 -6
  23. package/dist/mixins/mixin-controller-checked/mixin-controller-checked.js +1 -6
  24. package/dist/mixins/mixin-controller-open/mixin-controller-open.js +1 -6
  25. package/dist/mixins/mixin-controller-value/mixin-controller-value.js +1 -6
  26. package/dist/mixins/mixin-dismissible/mixin-dismissible.js +1 -6
  27. package/dist/mixins/mixin-field/mixin-field.js +1 -6
  28. package/dist/mixins/mixin-picker-editing/mixin-picker-editing.js +1 -6
  29. package/dist/mixins/mixin-picker-feedback/mixin-picker-feedback.js +1 -6
  30. package/dist/mixins/mixin-picker-field/mixin-picker-field.js +1 -6
  31. package/dist/mixins/mixin-segmented-field/mixin-segmented-field.js +1 -6
  32. package/dist/mixins/mixin-selectable-item/mixin-selectable-item.js +1 -6
  33. package/dist/mixins/mixin-tokens/mixin-tokens.js +1 -6
  34. package/dist/mixins/mixin-viewport/mixin-viewport.js +1 -6
  35. package/dist/utils/audit-name/audit-name.d.ts +3 -3
  36. package/dist/utils/audit-name/audit-name.js +7 -2
  37. package/dist/utils/implicit-submit/implicit-submit.js +4 -4
  38. package/dist/version.d.ts +1 -1
  39. package/dist/version.js +1 -1
  40. package/package.json +5 -4
@@ -5787,6 +5787,16 @@
5787
5787
  "default": "0",
5788
5788
  "description": "The estimate the sums were built against, so a change to it rebuilds."
5789
5789
  },
5790
+ {
5791
+ "kind": "field",
5792
+ "name": "changes",
5793
+ "type": {
5794
+ "text": "number"
5795
+ },
5796
+ "privacy": "private",
5797
+ "default": "0",
5798
+ "description": "Counts each change to a height, for a placement built from them."
5799
+ },
5790
5800
  {
5791
5801
  "kind": "method",
5792
5802
  "name": "at",
@@ -5853,6 +5863,16 @@
5853
5863
  ],
5854
5864
  "description": "The room items `[0, index)` take."
5855
5865
  },
5866
+ {
5867
+ "kind": "method",
5868
+ "name": "stamp",
5869
+ "return": {
5870
+ "type": {
5871
+ "text": "string"
5872
+ }
5873
+ },
5874
+ "description": "Says which heights these are: a placement built from a stamp it was\ngiven again holds, and one built from another stamp is out of date."
5875
+ },
5856
5876
  {
5857
5877
  "kind": "method",
5858
5878
  "name": "total",
@@ -6476,6 +6496,75 @@
6476
6496
  },
6477
6497
  "description": "Whether this pass places by measurement: offered, and wanted or needed."
6478
6498
  },
6499
+ {
6500
+ "kind": "method",
6501
+ "name": "laned",
6502
+ "privacy": "private",
6503
+ "return": {
6504
+ "type": {
6505
+ "text": "Waterfall | undefined"
6506
+ }
6507
+ },
6508
+ "parameters": [
6509
+ {
6510
+ "name": "total",
6511
+ "type": {
6512
+ "text": "number"
6513
+ }
6514
+ }
6515
+ ],
6516
+ "description": "The waterfall the host lays its items out in, placed by the heights known now."
6517
+ },
6518
+ {
6519
+ "kind": "method",
6520
+ "name": "startOf",
6521
+ "privacy": "private",
6522
+ "return": {
6523
+ "type": {
6524
+ "text": "number"
6525
+ }
6526
+ },
6527
+ "parameters": [
6528
+ {
6529
+ "name": "index",
6530
+ "type": {
6531
+ "text": "number"
6532
+ }
6533
+ },
6534
+ {
6535
+ "name": "total",
6536
+ "type": {
6537
+ "text": "number"
6538
+ }
6539
+ }
6540
+ ],
6541
+ "description": "Where item `index` starts down the set, before any drift: after the items\nbefore it, or in its column of a waterfall, where the starts never go back\nup either."
6542
+ },
6543
+ {
6544
+ "kind": "method",
6545
+ "name": "indexAt",
6546
+ "privacy": "private",
6547
+ "return": {
6548
+ "type": {
6549
+ "text": "number"
6550
+ }
6551
+ },
6552
+ "parameters": [
6553
+ {
6554
+ "name": "offset",
6555
+ "type": {
6556
+ "text": "number"
6557
+ }
6558
+ },
6559
+ {
6560
+ "name": "total",
6561
+ "type": {
6562
+ "text": "number"
6563
+ }
6564
+ }
6565
+ ],
6566
+ "description": "The item at `offset`: the last to start at or before it, or in a\nwaterfall the first to reach past it."
6567
+ },
6479
6568
  {
6480
6569
  "kind": "method",
6481
6570
  "name": "placed",
@@ -6703,202 +6792,297 @@
6703
6792
  },
6704
6793
  {
6705
6794
  "kind": "javascript-module",
6706
- "path": "src/events/action.ts",
6795
+ "path": "src/controllers/virtualize-controller/waterfall.ts",
6707
6796
  "declarations": [
6708
6797
  {
6709
6798
  "kind": "class",
6710
- "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.",
6711
- "name": "HelixActionEvent",
6799
+ "description": "Where each item of a waterfall stands: a set laid out down several columns\nof one width, each item under the shortest column so far, as a masonry wall\nof photos is.\n\n**Its own module, which a host hands to `VirtualizeController`**, so the\nhosts that window a single column carry none of it. The controller asks it\nwhich items reach the box and where each one starts, and the host draws each\nitem at its column and its start.\n\n**Placed in the order of the set, each item under the column that ends\nhighest**, the leftmost of a tie, as React Aria's `WaterfallLayout` and\nTanStack Virtual's lanes place them. So an item's start is never above the\nstart of the item before it, and the first item to reach any offset is found\nby a binary search, as one column finds it.\n\nSizes are the controller's: what was measured, or the estimate, each with\nthe gap below it.",
6800
+ "name": "Waterfall",
6712
6801
  "members": [
6713
6802
  {
6714
6803
  "kind": "field",
6715
- "name": "eventName",
6804
+ "name": "lanes",
6716
6805
  "type": {
6717
- "text": "string"
6806
+ "text": "number"
6718
6807
  },
6719
- "static": true,
6720
- "readonly": true,
6721
- "default": "'helix-action'"
6722
- }
6723
- ],
6724
- "superclass": {
6725
- "name": "Event",
6726
- "module": "src/events/action.ts"
6727
- },
6728
- "helix": {}
6729
- }
6730
- ],
6731
- "exports": [
6732
- {
6733
- "kind": "js",
6734
- "name": "HelixActionEvent",
6735
- "declaration": {
6736
- "name": "HelixActionEvent",
6737
- "module": "src/events/action.ts"
6738
- }
6739
- }
6740
- ]
6741
- },
6742
- {
6743
- "kind": "javascript-module",
6744
- "path": "src/events/activate.ts",
6745
- "declarations": [
6746
- {
6747
- "kind": "class",
6748
- "description": "A set has made a different child current.\n\nThe notification half of `helix-before-activate`, dispatched after the state\nhas moved, so `currentTarget.active` is the new value and the detail is a fact\nrather than a proposal. `previous` is the value that was current before, where\nthe set knows it, as Web Awesome's `wa-video-change` carries both.\n\n**Not cancelable**, for the reason every notification here is not: the\ndecision was taken by the event before it, and a second refusable event for\none transition is two answers to one question.\n\n**Prefixed, and it has to be.** `activate` unprefixed is not in any\n`*EventMap` in the DOM library, checked rather than assumed, but the prefix is\nwhat stops an event dispatched inside a shadow root and retargeted to the host\nbeing mistaken for something the host's own contents sent.",
6749
- "name": "HelixActivateEvent",
6750
- "members": [
6808
+ "default": "1",
6809
+ "description": "How many columns the items are laid out in, at least one."
6810
+ },
6751
6811
  {
6752
6812
  "kind": "field",
6753
- "name": "eventName",
6813
+ "name": "starts",
6754
6814
  "type": {
6755
- "text": "string"
6815
+ "text": "number[]"
6756
6816
  },
6757
- "static": true,
6758
- "readonly": true,
6759
- "default": "'helix-activate'"
6760
- }
6761
- ],
6762
- "superclass": {
6763
- "name": "CustomEvent",
6764
- "module": "src/events/activate.ts"
6765
- },
6766
- "helix": {}
6767
- }
6768
- ],
6769
- "exports": [
6770
- {
6771
- "kind": "js",
6772
- "name": "HelixActivateEvent",
6773
- "declaration": {
6774
- "name": "HelixActivateEvent",
6775
- "module": "src/events/activate.ts"
6776
- }
6777
- }
6778
- ]
6779
- },
6780
- {
6781
- "kind": "javascript-module",
6782
- "path": "src/events/aura-fallback.ts",
6783
- "declarations": [
6784
- {
6785
- "kind": "class",
6786
- "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.",
6787
- "name": "HelixAuraFallbackEvent",
6788
- "members": [
6817
+ "privacy": "private",
6818
+ "default": "[]",
6819
+ "description": "Where each item starts, in pixels from the top of the set."
6820
+ },
6789
6821
  {
6790
6822
  "kind": "field",
6791
- "name": "eventName",
6823
+ "name": "columns",
6792
6824
  "type": {
6793
- "text": "string"
6825
+ "text": "number[]"
6794
6826
  },
6795
- "static": true,
6796
- "readonly": true,
6797
- "default": "'helix-aura-fallback'"
6798
- }
6799
- ],
6800
- "superclass": {
6801
- "name": "CustomEvent",
6802
- "module": "src/events/aura-fallback.ts"
6803
- },
6804
- "helix": {}
6805
- }
6806
- ],
6807
- "exports": [
6808
- {
6809
- "kind": "js",
6810
- "name": "HelixAuraFallbackEvent",
6811
- "declaration": {
6812
- "name": "HelixAuraFallbackEvent",
6813
- "module": "src/events/aura-fallback.ts"
6814
- }
6815
- }
6816
- ]
6817
- },
6818
- {
6819
- "kind": "javascript-module",
6820
- "path": "src/events/band.ts",
6821
- "declarations": [
6822
- {
6823
- "kind": "class",
6824
- "description": "A reading moved into another band: a meter whose value crossed `low`,\n`high` or `optimum` into `good`, `fair` or `poor`.\n\nSent once for each crossing, not on every value, so a listener can say the\nchange aloud or recolor something else on the page. Not cancelable, since\nthe reading has already moved. Bubbles and is composed.",
6825
- "name": "HelixBandEvent",
6826
- "members": [
6827
+ "privacy": "private",
6828
+ "default": "[]",
6829
+ "description": "The column each item stands in."
6830
+ },
6827
6831
  {
6828
6832
  "kind": "field",
6829
- "name": "eventName",
6833
+ "name": "sizes",
6830
6834
  "type": {
6831
- "text": "string"
6835
+ "text": "number[]"
6832
6836
  },
6833
- "static": true,
6834
- "readonly": true,
6835
- "default": "'helix-band'"
6836
- }
6837
- ],
6838
- "superclass": {
6839
- "name": "CustomEvent",
6840
- "module": "src/events/band.ts"
6841
- },
6842
- "helix": {}
6843
- }
6844
- ],
6845
- "exports": [
6846
- {
6847
- "kind": "js",
6848
- "name": "HelixBandEvent",
6849
- "declaration": {
6850
- "name": "HelixBandEvent",
6851
- "module": "src/events/band.ts"
6852
- }
6853
- }
6854
- ]
6855
- },
6856
- {
6857
- "kind": "javascript-module",
6858
- "path": "src/events/before-activate.ts",
6859
- "declarations": [
6860
- {
6861
- "kind": "class",
6862
- "description": "A set is about to make a different child current, and can be refused.\n\n**Not a generic `helix-change`.** `Tabs` moving to another tab, `Tree` marking\nanother row and `Steps` advancing are not a value changing, they are a set\nchoosing, and the platform's word for a committed value would say the wrong\nthing. `active` names which child is current, so `activate` is the verb, and\nunlike `change` the platform has no claim on it.\n\n**This fires before the state moves.** Inside a handler `currentTarget.active`\nstill holds the previous value, and `detail.value` is a proposal another\nlistener may refuse, so a consumer who only wants to know which child is\ncurrent listens for `helix-activate` instead. `helix-select` is not that\nnotification either: it fires when an item is *chosen*, not when `active` is\nassigned.\n\nThe shape is the one `MixinControllerOpen` already has, a cancelable request\nand a plain notification after the state has moved.",
6863
- "name": "HelixBeforeActivateEvent",
6864
- "members": [
6837
+ "privacy": "private",
6838
+ "default": "[]",
6839
+ "description": "How much room each item takes, with the gap below it."
6840
+ },
6865
6841
  {
6866
6842
  "kind": "field",
6867
- "name": "eventName",
6843
+ "name": "reach",
6844
+ "type": {
6845
+ "text": "number[]"
6846
+ },
6847
+ "privacy": "private",
6848
+ "default": "[]",
6849
+ "description": "How far down the set the items `[0, i]` reach, the furthest of their ends."
6850
+ },
6851
+ {
6852
+ "kind": "field",
6853
+ "name": "extent",
6854
+ "type": {
6855
+ "text": "number"
6856
+ },
6857
+ "privacy": "private",
6858
+ "default": "0",
6859
+ "description": "How long the set is: where its longest column ends."
6860
+ },
6861
+ {
6862
+ "kind": "field",
6863
+ "name": "built",
6868
6864
  "type": {
6869
6865
  "text": "string"
6870
6866
  },
6871
- "static": true,
6872
- "readonly": true,
6873
- "default": "'helix-before-activate'"
6867
+ "privacy": "private",
6868
+ "default": "''",
6869
+ "description": "What the placement was built from, so it is built again only when that changes."
6870
+ },
6871
+ {
6872
+ "kind": "method",
6873
+ "name": "place",
6874
+ "return": {
6875
+ "type": {
6876
+ "text": "void"
6877
+ }
6878
+ },
6879
+ "parameters": [
6880
+ {
6881
+ "name": "count",
6882
+ "type": {
6883
+ "text": "number"
6884
+ }
6885
+ },
6886
+ {
6887
+ "name": "size",
6888
+ "type": {
6889
+ "text": "(index: number) => number"
6890
+ }
6891
+ },
6892
+ {
6893
+ "name": "stamp",
6894
+ "type": {
6895
+ "text": "string"
6896
+ }
6897
+ }
6898
+ ],
6899
+ "description": "Places `count` items whose sizes `size` gives, unless `stamp` says the\nsizes, the count and the columns are the ones already placed."
6900
+ },
6901
+ {
6902
+ "kind": "method",
6903
+ "name": "start",
6904
+ "return": {
6905
+ "type": {
6906
+ "text": "number"
6907
+ }
6908
+ },
6909
+ "parameters": [
6910
+ {
6911
+ "name": "index",
6912
+ "type": {
6913
+ "text": "number"
6914
+ }
6915
+ }
6916
+ ],
6917
+ "description": "Where item `index` starts, and where the set ends for an index past it."
6918
+ },
6919
+ {
6920
+ "kind": "method",
6921
+ "name": "lane",
6922
+ "return": {
6923
+ "type": {
6924
+ "text": "number"
6925
+ }
6926
+ },
6927
+ "parameters": [
6928
+ {
6929
+ "name": "index",
6930
+ "type": {
6931
+ "text": "number"
6932
+ }
6933
+ }
6934
+ ],
6935
+ "description": "The column item `index` stands in."
6936
+ },
6937
+ {
6938
+ "kind": "method",
6939
+ "name": "length",
6940
+ "return": {
6941
+ "type": {
6942
+ "text": "number"
6943
+ }
6944
+ },
6945
+ "description": "How long the set is, where its longest column ends."
6946
+ },
6947
+ {
6948
+ "kind": "method",
6949
+ "name": "from",
6950
+ "return": {
6951
+ "type": {
6952
+ "text": "number"
6953
+ }
6954
+ },
6955
+ "parameters": [
6956
+ {
6957
+ "name": "offset",
6958
+ "type": {
6959
+ "text": "number"
6960
+ }
6961
+ }
6962
+ ],
6963
+ "description": "The first item that reaches past `offset`, or the count where none does."
6964
+ },
6965
+ {
6966
+ "kind": "method",
6967
+ "name": "to",
6968
+ "return": {
6969
+ "type": {
6970
+ "text": "number"
6971
+ }
6972
+ },
6973
+ "parameters": [
6974
+ {
6975
+ "name": "offset",
6976
+ "type": {
6977
+ "text": "number"
6978
+ }
6979
+ }
6980
+ ],
6981
+ "description": "The first item that starts at or past `offset`, so every item before it starts above."
6982
+ },
6983
+ {
6984
+ "kind": "method",
6985
+ "name": "search",
6986
+ "privacy": "private",
6987
+ "return": {
6988
+ "type": {
6989
+ "text": "number"
6990
+ }
6991
+ },
6992
+ "parameters": [
6993
+ {
6994
+ "name": "sorted",
6995
+ "type": {
6996
+ "text": "readonly number[]"
6997
+ }
6998
+ },
6999
+ {
7000
+ "name": "offset",
7001
+ "type": {
7002
+ "text": "number"
7003
+ }
7004
+ }
7005
+ ],
7006
+ "description": "The first index whose number in `sorted` is past `offset`."
7007
+ },
7008
+ {
7009
+ "kind": "method",
7010
+ "name": "step",
7011
+ "return": {
7012
+ "type": {
7013
+ "text": "number | undefined"
7014
+ }
7015
+ },
7016
+ "parameters": [
7017
+ {
7018
+ "name": "key",
7019
+ "type": {
7020
+ "text": "string"
7021
+ }
7022
+ },
7023
+ {
7024
+ "name": "at",
7025
+ "type": {
7026
+ "text": "number"
7027
+ }
7028
+ },
7029
+ {
7030
+ "name": "count",
7031
+ "type": {
7032
+ "text": "number"
7033
+ }
7034
+ },
7035
+ {
7036
+ "name": "page",
7037
+ "type": {
7038
+ "text": "number"
7039
+ }
7040
+ }
7041
+ ],
7042
+ "description": "Which item a key moves to from `at`, in a set of `count` items, or\n`undefined` for a key it does not take or where there is no item that way:\n\n- Down and Up move to the next or the previous item in the same column.\n- `next` and `previous` move to the column beside, to its item that sits\n beside this one the most, or the nearest above where none does. Which\n of Left and Right is `next` is the caller's, for a right-to-left page.\n- Page Down and Page Up move down or up the same column by `page` pixels,\n to the item there, or the last item that way."
7043
+ },
7044
+ {
7045
+ "kind": "method",
7046
+ "name": "size",
7047
+ "privacy": "private",
7048
+ "return": {
7049
+ "type": {
7050
+ "text": "number"
7051
+ }
7052
+ },
7053
+ "parameters": [
7054
+ {
7055
+ "name": "index",
7056
+ "type": {
7057
+ "text": "number"
7058
+ }
7059
+ }
7060
+ ],
7061
+ "description": "How much room item `index` takes down its column, with the gap below it."
6874
7062
  }
6875
7063
  ],
6876
- "superclass": {
6877
- "name": "CustomEvent",
6878
- "module": "src/events/before-activate.ts"
6879
- },
6880
7064
  "helix": {}
6881
7065
  }
6882
7066
  ],
6883
7067
  "exports": [
6884
7068
  {
6885
7069
  "kind": "js",
6886
- "name": "HelixBeforeActivateEvent",
7070
+ "name": "Waterfall",
6887
7071
  "declaration": {
6888
- "name": "HelixBeforeActivateEvent",
6889
- "module": "src/events/before-activate.ts"
7072
+ "name": "Waterfall",
7073
+ "module": "src/controllers/virtualize-controller/waterfall.ts"
6890
7074
  }
6891
7075
  }
6892
7076
  ]
6893
7077
  },
6894
7078
  {
6895
7079
  "kind": "javascript-module",
6896
- "path": "src/events/before-change.ts",
7080
+ "path": "src/events/action.ts",
6897
7081
  "declarations": [
6898
7082
  {
6899
7083
  "kind": "class",
6900
- "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.",
6901
- "name": "HelixBeforeChangeEvent",
7084
+ "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.",
7085
+ "name": "HelixActionEvent",
6902
7086
  "members": [
6903
7087
  {
6904
7088
  "kind": "field",
@@ -6908,12 +7092,12 @@
6908
7092
  },
6909
7093
  "static": true,
6910
7094
  "readonly": true,
6911
- "default": "'helix-before-change'"
7095
+ "default": "'helix-action'"
6912
7096
  }
6913
7097
  ],
6914
7098
  "superclass": {
6915
- "name": "CustomEvent",
6916
- "module": "src/events/before-change.ts"
7099
+ "name": "Event",
7100
+ "module": "src/events/action.ts"
6917
7101
  },
6918
7102
  "helix": {}
6919
7103
  }
@@ -6921,22 +7105,22 @@
6921
7105
  "exports": [
6922
7106
  {
6923
7107
  "kind": "js",
6924
- "name": "HelixBeforeChangeEvent",
7108
+ "name": "HelixActionEvent",
6925
7109
  "declaration": {
6926
- "name": "HelixBeforeChangeEvent",
6927
- "module": "src/events/before-change.ts"
7110
+ "name": "HelixActionEvent",
7111
+ "module": "src/events/action.ts"
6928
7112
  }
6929
7113
  }
6930
7114
  ]
6931
7115
  },
6932
7116
  {
6933
7117
  "kind": "javascript-module",
6934
- "path": "src/events/before-close.ts",
7118
+ "path": "src/events/activate.ts",
6935
7119
  "declarations": [
6936
7120
  {
6937
7121
  "kind": "class",
6938
- "description": "Fired when an element is about to close. See `HelixBeforeOpenEvent`.",
6939
- "name": "HelixBeforeCloseEvent",
7122
+ "description": "A set has made a different child current.\n\nThe notification half of `helix-before-activate`, dispatched after the state\nhas moved, so `currentTarget.active` is the new value and the detail is a fact\nrather than a proposal. `previous` is the value that was current before, where\nthe set knows it, as Web Awesome's `wa-video-change` carries both.\n\n**Not cancelable**, for the reason every notification here is not: the\ndecision was taken by the event before it, and a second refusable event for\none transition is two answers to one question.\n\n**Prefixed, and it has to be.** `activate` unprefixed is not in any\n`*EventMap` in the DOM library, checked rather than assumed, but the prefix is\nwhat stops an event dispatched inside a shadow root and retargeted to the host\nbeing mistaken for something the host's own contents sent.",
7123
+ "name": "HelixActivateEvent",
6940
7124
  "members": [
6941
7125
  {
6942
7126
  "kind": "field",
@@ -6946,12 +7130,12 @@
6946
7130
  },
6947
7131
  "static": true,
6948
7132
  "readonly": true,
6949
- "default": "'helix-before-close'"
7133
+ "default": "'helix-activate'"
6950
7134
  }
6951
7135
  ],
6952
7136
  "superclass": {
6953
7137
  "name": "CustomEvent",
6954
- "module": "src/events/before-close.ts"
7138
+ "module": "src/events/activate.ts"
6955
7139
  },
6956
7140
  "helix": {}
6957
7141
  }
@@ -6959,22 +7143,22 @@
6959
7143
  "exports": [
6960
7144
  {
6961
7145
  "kind": "js",
6962
- "name": "HelixBeforeCloseEvent",
7146
+ "name": "HelixActivateEvent",
6963
7147
  "declaration": {
6964
- "name": "HelixBeforeCloseEvent",
6965
- "module": "src/events/before-close.ts"
7148
+ "name": "HelixActivateEvent",
7149
+ "module": "src/events/activate.ts"
6966
7150
  }
6967
7151
  }
6968
7152
  ]
6969
7153
  },
6970
7154
  {
6971
7155
  "kind": "javascript-module",
6972
- "path": "src/events/before-collapse.ts",
7156
+ "path": "src/events/aura-fallback.ts",
6973
7157
  "declarations": [
6974
7158
  {
6975
7159
  "kind": "class",
6976
- "description": "A pane is about to collapse or reopen, and can be refused.",
6977
- "name": "HelixBeforeCollapseEvent",
7160
+ "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.",
7161
+ "name": "HelixAuraFallbackEvent",
6978
7162
  "members": [
6979
7163
  {
6980
7164
  "kind": "field",
@@ -6984,12 +7168,12 @@
6984
7168
  },
6985
7169
  "static": true,
6986
7170
  "readonly": true,
6987
- "default": "'helix-before-collapse'"
7171
+ "default": "'helix-aura-fallback'"
6988
7172
  }
6989
7173
  ],
6990
7174
  "superclass": {
6991
7175
  "name": "CustomEvent",
6992
- "module": "src/events/before-collapse.ts"
7176
+ "module": "src/events/aura-fallback.ts"
6993
7177
  },
6994
7178
  "helix": {}
6995
7179
  }
@@ -6997,22 +7181,22 @@
6997
7181
  "exports": [
6998
7182
  {
6999
7183
  "kind": "js",
7000
- "name": "HelixBeforeCollapseEvent",
7184
+ "name": "HelixAuraFallbackEvent",
7001
7185
  "declaration": {
7002
- "name": "HelixBeforeCollapseEvent",
7003
- "module": "src/events/before-collapse.ts"
7186
+ "name": "HelixAuraFallbackEvent",
7187
+ "module": "src/events/aura-fallback.ts"
7004
7188
  }
7005
7189
  }
7006
7190
  ]
7007
7191
  },
7008
7192
  {
7009
7193
  "kind": "javascript-module",
7010
- "path": "src/events/before-edit.ts",
7194
+ "path": "src/events/band.ts",
7011
7195
  "declarations": [
7012
7196
  {
7013
7197
  "kind": "class",
7014
- "description": "Source is about to be edited, and can be refused.",
7015
- "name": "HelixBeforeEditEvent",
7198
+ "description": "A reading moved into another band: a meter whose value crossed `low`,\n`high` or `optimum` into `good`, `fair` or `poor`.\n\nSent once for each crossing, not on every value, so a listener can say the\nchange aloud or recolor something else on the page. Not cancelable, since\nthe reading has already moved. Bubbles and is composed.",
7199
+ "name": "HelixBandEvent",
7016
7200
  "members": [
7017
7201
  {
7018
7202
  "kind": "field",
@@ -7022,12 +7206,12 @@
7022
7206
  },
7023
7207
  "static": true,
7024
7208
  "readonly": true,
7025
- "default": "'helix-before-edit'"
7209
+ "default": "'helix-band'"
7026
7210
  }
7027
7211
  ],
7028
7212
  "superclass": {
7029
7213
  "name": "CustomEvent",
7030
- "module": "src/events/before-edit.ts"
7214
+ "module": "src/events/band.ts"
7031
7215
  },
7032
7216
  "helix": {}
7033
7217
  }
@@ -7035,23 +7219,213 @@
7035
7219
  "exports": [
7036
7220
  {
7037
7221
  "kind": "js",
7038
- "name": "HelixBeforeEditEvent",
7222
+ "name": "HelixBandEvent",
7039
7223
  "declaration": {
7040
- "name": "HelixBeforeEditEvent",
7041
- "module": "src/events/before-edit.ts"
7224
+ "name": "HelixBandEvent",
7225
+ "module": "src/events/band.ts"
7042
7226
  }
7043
7227
  }
7044
7228
  ]
7045
7229
  },
7046
7230
  {
7047
7231
  "kind": "javascript-module",
7048
- "path": "src/events/before-move.ts",
7232
+ "path": "src/events/before-activate.ts",
7049
7233
  "declarations": [
7050
7234
  {
7051
7235
  "kind": "class",
7052
- "description": "Cards are about to move, and can be refused.\n\n**This is the controlled half, the way `helix-before-open` is for a\ndialog.** A board moves its own cards by default, writing `x` and `y` onto\neach one the way an input writes its own value. A consumer who keeps the\npositions in their own state calls `preventDefault()` here, writes what the\ndetail says into that state, and renders the cards where it puts them.\n\nSent for every step of a drag, so a controlled board follows the pointer\nrather than jumping on the drop.",
7053
- "name": "HelixBeforeMoveEvent",
7054
- "members": [
7236
+ "description": "A set is about to make a different child current, and can be refused.\n\n**Not a generic `helix-change`.** `Tabs` moving to another tab, `Tree` marking\nanother row and `Steps` advancing are not a value changing, they are a set\nchoosing, and the platform's word for a committed value would say the wrong\nthing. `active` names which child is current, so `activate` is the verb, and\nunlike `change` the platform has no claim on it.\n\n**This fires before the state moves.** Inside a handler `currentTarget.active`\nstill holds the previous value, and `detail.value` is a proposal another\nlistener may refuse, so a consumer who only wants to know which child is\ncurrent listens for `helix-activate` instead. `helix-select` is not that\nnotification either: it fires when an item is *chosen*, not when `active` is\nassigned.\n\nThe shape is the one `MixinControllerOpen` already has, a cancelable request\nand a plain notification after the state has moved.",
7237
+ "name": "HelixBeforeActivateEvent",
7238
+ "members": [
7239
+ {
7240
+ "kind": "field",
7241
+ "name": "eventName",
7242
+ "type": {
7243
+ "text": "string"
7244
+ },
7245
+ "static": true,
7246
+ "readonly": true,
7247
+ "default": "'helix-before-activate'"
7248
+ }
7249
+ ],
7250
+ "superclass": {
7251
+ "name": "CustomEvent",
7252
+ "module": "src/events/before-activate.ts"
7253
+ },
7254
+ "helix": {}
7255
+ }
7256
+ ],
7257
+ "exports": [
7258
+ {
7259
+ "kind": "js",
7260
+ "name": "HelixBeforeActivateEvent",
7261
+ "declaration": {
7262
+ "name": "HelixBeforeActivateEvent",
7263
+ "module": "src/events/before-activate.ts"
7264
+ }
7265
+ }
7266
+ ]
7267
+ },
7268
+ {
7269
+ "kind": "javascript-module",
7270
+ "path": "src/events/before-change.ts",
7271
+ "declarations": [
7272
+ {
7273
+ "kind": "class",
7274
+ "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.",
7275
+ "name": "HelixBeforeChangeEvent",
7276
+ "members": [
7277
+ {
7278
+ "kind": "field",
7279
+ "name": "eventName",
7280
+ "type": {
7281
+ "text": "string"
7282
+ },
7283
+ "static": true,
7284
+ "readonly": true,
7285
+ "default": "'helix-before-change'"
7286
+ }
7287
+ ],
7288
+ "superclass": {
7289
+ "name": "CustomEvent",
7290
+ "module": "src/events/before-change.ts"
7291
+ },
7292
+ "helix": {}
7293
+ }
7294
+ ],
7295
+ "exports": [
7296
+ {
7297
+ "kind": "js",
7298
+ "name": "HelixBeforeChangeEvent",
7299
+ "declaration": {
7300
+ "name": "HelixBeforeChangeEvent",
7301
+ "module": "src/events/before-change.ts"
7302
+ }
7303
+ }
7304
+ ]
7305
+ },
7306
+ {
7307
+ "kind": "javascript-module",
7308
+ "path": "src/events/before-close.ts",
7309
+ "declarations": [
7310
+ {
7311
+ "kind": "class",
7312
+ "description": "Fired when an element is about to close. See `HelixBeforeOpenEvent`.",
7313
+ "name": "HelixBeforeCloseEvent",
7314
+ "members": [
7315
+ {
7316
+ "kind": "field",
7317
+ "name": "eventName",
7318
+ "type": {
7319
+ "text": "string"
7320
+ },
7321
+ "static": true,
7322
+ "readonly": true,
7323
+ "default": "'helix-before-close'"
7324
+ }
7325
+ ],
7326
+ "superclass": {
7327
+ "name": "CustomEvent",
7328
+ "module": "src/events/before-close.ts"
7329
+ },
7330
+ "helix": {}
7331
+ }
7332
+ ],
7333
+ "exports": [
7334
+ {
7335
+ "kind": "js",
7336
+ "name": "HelixBeforeCloseEvent",
7337
+ "declaration": {
7338
+ "name": "HelixBeforeCloseEvent",
7339
+ "module": "src/events/before-close.ts"
7340
+ }
7341
+ }
7342
+ ]
7343
+ },
7344
+ {
7345
+ "kind": "javascript-module",
7346
+ "path": "src/events/before-collapse.ts",
7347
+ "declarations": [
7348
+ {
7349
+ "kind": "class",
7350
+ "description": "A pane is about to collapse or reopen, and can be refused.",
7351
+ "name": "HelixBeforeCollapseEvent",
7352
+ "members": [
7353
+ {
7354
+ "kind": "field",
7355
+ "name": "eventName",
7356
+ "type": {
7357
+ "text": "string"
7358
+ },
7359
+ "static": true,
7360
+ "readonly": true,
7361
+ "default": "'helix-before-collapse'"
7362
+ }
7363
+ ],
7364
+ "superclass": {
7365
+ "name": "CustomEvent",
7366
+ "module": "src/events/before-collapse.ts"
7367
+ },
7368
+ "helix": {}
7369
+ }
7370
+ ],
7371
+ "exports": [
7372
+ {
7373
+ "kind": "js",
7374
+ "name": "HelixBeforeCollapseEvent",
7375
+ "declaration": {
7376
+ "name": "HelixBeforeCollapseEvent",
7377
+ "module": "src/events/before-collapse.ts"
7378
+ }
7379
+ }
7380
+ ]
7381
+ },
7382
+ {
7383
+ "kind": "javascript-module",
7384
+ "path": "src/events/before-edit.ts",
7385
+ "declarations": [
7386
+ {
7387
+ "kind": "class",
7388
+ "description": "Source is about to be edited, and can be refused.",
7389
+ "name": "HelixBeforeEditEvent",
7390
+ "members": [
7391
+ {
7392
+ "kind": "field",
7393
+ "name": "eventName",
7394
+ "type": {
7395
+ "text": "string"
7396
+ },
7397
+ "static": true,
7398
+ "readonly": true,
7399
+ "default": "'helix-before-edit'"
7400
+ }
7401
+ ],
7402
+ "superclass": {
7403
+ "name": "CustomEvent",
7404
+ "module": "src/events/before-edit.ts"
7405
+ },
7406
+ "helix": {}
7407
+ }
7408
+ ],
7409
+ "exports": [
7410
+ {
7411
+ "kind": "js",
7412
+ "name": "HelixBeforeEditEvent",
7413
+ "declaration": {
7414
+ "name": "HelixBeforeEditEvent",
7415
+ "module": "src/events/before-edit.ts"
7416
+ }
7417
+ }
7418
+ ]
7419
+ },
7420
+ {
7421
+ "kind": "javascript-module",
7422
+ "path": "src/events/before-move.ts",
7423
+ "declarations": [
7424
+ {
7425
+ "kind": "class",
7426
+ "description": "Cards are about to move, and can be refused.\n\n**This is the controlled half, the way `helix-before-open` is for a\ndialog.** A board moves its own cards by default, writing `x` and `y` onto\neach one the way an input writes its own value. A consumer who keeps the\npositions in their own state calls `preventDefault()` here, writes what the\ndetail says into that state, and renders the cards where it puts them.\n\nSent for every step of a drag, so a controlled board follows the pointer\nrather than jumping on the drop.",
7427
+ "name": "HelixBeforeMoveEvent",
7428
+ "members": [
7055
7429
  {
7056
7430
  "kind": "field",
7057
7431
  "name": "eventName",
@@ -11757,6 +12131,17 @@
11757
12131
  ],
11758
12132
  "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."
11759
12133
  },
12134
+ {
12135
+ "kind": "field",
12136
+ "name": "markRules",
12137
+ "type": {
12138
+ "text": "readonly string[]"
12139
+ },
12140
+ "privacy": "protected",
12141
+ "static": true,
12142
+ "default": "[]",
12143
+ "description": "The rules from `mark-rules.ts` for the marks this element writes in its\nown shadow root: `data-scroller`, `data-virtual`, `data-spoken` and\n`data-mirror`.\n\nA component that writes a mark names its rule here, and a subclass\ninherits the list. One that writes none takes only the three rules every\nshadow root gets, which is what keeps the other four out of a Button."
12144
+ },
11760
12145
  {
11761
12146
  "kind": "method",
11762
12147
  "name": "finalizeStyles",
@@ -11776,7 +12161,7 @@
11776
12161
  }
11777
12162
  }
11778
12163
  ],
11779
- "description": "Prepends the shadow-root reset to every subclass's styles, so no component\nhas to remember to include it."
12164
+ "description": "Prepends the shadow-root reset to every subclass's styles, so no component\nhas to remember to include it, with the rules for the marks it writes."
11780
12165
  },
11781
12166
  {
11782
12167
  "kind": "method",
@@ -11854,6 +12239,82 @@
11854
12239
  }
11855
12240
  ]
11856
12241
  },
12242
+ {
12243
+ "kind": "javascript-module",
12244
+ "path": "src/helix-element/mark-rules.ts",
12245
+ "declarations": [
12246
+ {
12247
+ "kind": "variable",
12248
+ "name": "SCROLLER_RULE",
12249
+ "type": {
12250
+ "text": "string"
12251
+ },
12252
+ "default": "'[data-scroller]{overflow:auto}'",
12253
+ "description": "Makes an element a scroll container, where a component says it is one.\n\n**A box that scrolls is the headless tier's, and the headless tier had no way to say\nso.** `overflow` is what creates a scrollport: without it `scrollTop` is\npermanently zero and every scroll API on the element is inert. So a component\nthat reads `scrollTop` and cannot declare `overflow` is one whose behavior\nlives in somebody else's stylesheet.\n\nMeasured before deciding: `helix-headless-scroll-area`, the component whose\nentire purpose is scrolling, computes `overflow-y: visible` on its viewport\nwith `scrollHeight` equal to `clientHeight`. Standing alone it is a div, and\nthe virtual list is worse because it *acts* on the reading.\n\n**It goes in `core` rather than in a stylesheet**, with `BOX_SIZING`,\n`HIDDEN` and `SETTLED`, which are the token-free structural rules `core`\nships into every shadow root. \"The headless tier has no CSS\" has never meant\n`core` has none; it means `helix/headless` must not depend on\n`@fusion.dev/helix-styles`, and a rule with no token in it does not.\n\n**And a rule rather than an inline style, which was the first idea and is\nwrong.** An inline `style` on a rendered part outranks every author rule\nshort of `!important`, so a consumer wanting `overflow: hidden` on that part\nwould have to fight it and would need `!important` of their own. A shadow rule\nloses to a document rule, so `::part(viewport) { overflow: … }` from a\nconsumer simply wins, which is the right way round.\n\nBoth axes, and nothing else. Which *kind* of scrolling, how much room,\n`overscroll-behavior`, `scroll-snap`, a gutter, a scrollbar treatment: those\nare decisions and stay in `helix/styled`. This is only the mechanism, and the\nstyled sheet is prepended-after so it overrides at equal specificity anyway.\n\n**A component marks a box whose scroll state it reads, and no other**, which\nis narrower than \"every box that ends up scrolling\". `Megamenu`'s panel\nscrolls, and only because the styled tier gives it a `max-block-size`: that is\na decision, the `overflow` that serves it belongs with it, and the headless\ntier never asks the panel where it is scrolled to. Marking it anyway moved a\nheading four pixels, because `overflow` establishes a block formatting context\nand margins that had been collapsing stopped. A mechanism with a layout\nconsequence is one to apply exactly where it is needed.\n\n`ScrollArea`, `VirtualList`, `Carousel`, `ObjectInspector`, `Chat` and a\n`windowed` `DataTable` mark theirs, each reading `scrollTop` or `scrollLeft`\nand acting on the answer. The last two took their `overflow` from their\nstyled sheet until they were marked, so the window each drew was inert on a\npage that loads only `helix/headless`; marking them moved nothing on the\nstyled tier, where both boxes already scrolled."
12254
+ },
12255
+ {
12256
+ "kind": "variable",
12257
+ "name": "VIRTUAL_RULE",
12258
+ "type": {
12259
+ "text": "string"
12260
+ },
12261
+ "default": "'[data-virtual]{overflow-anchor:none}'",
12262
+ "description": "A box whose rows are drawn and taken away as it scrolls, which\n`VirtualizeController` marks `data-virtual` once it watches it.\n\n**The browser's scroll anchoring fights the window.** Chromium keeps the\ncontent a reader was looking at in place when what is above it changes, and\na virtual window changes exactly that on every move: the spacer above grows\nand the rows are swapped. Measured on a 500 row list scrolled to 330, the\noffset went to 138, then 522, then back to 330 before it settled, and the\nlist reported four ranges for one scroll. The window already keeps the rows\nwhere they belong, so anchoring has nothing left to do here but move them."
12263
+ },
12264
+ {
12265
+ "kind": "variable",
12266
+ "name": "SPOKEN_RULE",
12267
+ "type": {
12268
+ "text": "string"
12269
+ },
12270
+ "default": "'[data-spoken]{position:absolute;inline-size:1px;block-size:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}'",
12271
+ "description": "Words a screen reader reads where the eye reads something else, which a\ncomponent marks `data-spoken`: `⇧⌘P` in Kbd is read as `Shift Command P`.\n\nThe drawn text is `aria-hidden` and the words sit beside it, in no box the\neye sees. The rule takes the words out of the layout and paints none of\nthem, and names no token, so it belongs with the mechanisms here. Without\nit a page that loads only `helix/headless` showed both."
12272
+ },
12273
+ {
12274
+ "kind": "variable",
12275
+ "name": "MIRROR_RULE",
12276
+ "type": {
12277
+ "text": "string"
12278
+ },
12279
+ "default": "':host(:dir(rtl)) [data-mirror]{scale:-1 1}'",
12280
+ "description": "Turns a drawing that runs along the line of text, or a glyph that points\nalong it, round with it on a right-to-left page.\n\n**A chart computes its geometry from the left, because an SVG's coordinates\ndo.** `x` grows rightward whatever `direction` says, while the words around a\ndrawing are HTML written in logical properties and turn on their own. Before\nthis, a bar chart on an Arabic page wrote Q4 to Q1 from the left under\ncolumns still drawn Q1 to Q4, so each name stood under its mirror's column.\n\n**A rule rather than a second set of coordinates, and three things decide\nit.** A server renders the same markup whichever way the page reads, so the\ndrawing it sends is right before a script runs. Everything drawn on a mark\nturns with it: a column rounded at its far end, a gradient toward its base,\nthe hole a ring terminus cuts, each of which arithmetic would have to mirror\nagain in every stylesheet that draws one. And it follows `dir` when it\nchanges, which a render would only do on its next update.\n\n**About the vertical axis, never the horizontal.** Up is more in every\nscript, so a value keeps its height and only the run along the line turns.\nThe numbers are text beside the drawing rather than inside it, so they read\nthe right way round.\n\n**Keyed on `:dir()`, which is what every sheet here mirrors a caret with.**\nThe pointer arithmetic that has to agree with it asks the computed\n`direction`, the question the table and the splitter already ask, and the two\npart only where a sheet sets `direction` without `dir`.\n\nA component marks the drawing with `data-mirror`, and a drawing with no line\nof text to follow is left unmarked: a whole ring's slices run clockwise from\ntwelve, which is a clock's convention and not a script's. `scale` rather than\n`transform`, so a consumer's `transform` on the same part composes with it,\nand a consumer's `scale` there wins, a shadow rule losing to a document one.\n\n**A glyph that points along the line is the same case, marked the same\nway**: a caret meaning next or previous, the one between two crumbs, a shut\ndisclosure. The component drawing it knows what it means, so the headless\ntier points it the right way with no stylesheet at all. Before the mark each\nstyled sheet turned its own and a headless page had to know to, which the\ncarousel's and the pagination's did not. A glyph a *sheet* stands on its side\nis that sheet's to turn: a tree draws its chevron pointing down, and a mark\nwould come out right under a `transform: rotate()`, which applies before\n`scale`, and do nothing under the `rotate` property, which applies after it.\nA glyph for playing media is left unmarked too, a tape running one way\nwhatever the script, and so is a picture of a key."
12281
+ }
12282
+ ],
12283
+ "exports": [
12284
+ {
12285
+ "kind": "js",
12286
+ "name": "SCROLLER_RULE",
12287
+ "declaration": {
12288
+ "name": "SCROLLER_RULE",
12289
+ "module": "src/helix-element/mark-rules.ts"
12290
+ }
12291
+ },
12292
+ {
12293
+ "kind": "js",
12294
+ "name": "VIRTUAL_RULE",
12295
+ "declaration": {
12296
+ "name": "VIRTUAL_RULE",
12297
+ "module": "src/helix-element/mark-rules.ts"
12298
+ }
12299
+ },
12300
+ {
12301
+ "kind": "js",
12302
+ "name": "SPOKEN_RULE",
12303
+ "declaration": {
12304
+ "name": "SPOKEN_RULE",
12305
+ "module": "src/helix-element/mark-rules.ts"
12306
+ }
12307
+ },
12308
+ {
12309
+ "kind": "js",
12310
+ "name": "MIRROR_RULE",
12311
+ "declaration": {
12312
+ "name": "MIRROR_RULE",
12313
+ "module": "src/helix-element/mark-rules.ts"
12314
+ }
12315
+ }
12316
+ ]
12317
+ },
11857
12318
  {
11858
12319
  "kind": "javascript-module",
11859
12320
  "path": "src/helix-element/react-audit-off.ts",
@@ -12081,12 +12542,12 @@
12081
12542
  },
12082
12543
  {
12083
12544
  "kind": "javascript-module",
12084
- "path": "src/helix-form-element/helix-form-element.ts",
12545
+ "path": "src/helix-form-element/helix-form-element-base.ts",
12085
12546
  "declarations": [
12086
12547
  {
12087
12548
  "kind": "class",
12088
- "description": "`HelixFormElement` is a class because the browser reads `formAssociated` from\nthe constructor during element upgrade, and a mixin or controller cannot\nsupply it.\n\n`internals` comes from `HelixElement`, which attaches it for every component.\n`attachInternals()` throws on a second call, so only one class attaches it.\n\nThe class carries only what every form participant needs. `value` and the\nreset and restore callbacks are added with the first input component.\n\n**The validity API is the platform's, read through `internals`**, so\n`checkValidity()`, `reportValidity()` and `setCustomValidity()` work on the\nhost as they do on a native control. A custom message is laid over whatever\nthe control itself reports, which is why `setValidity` is wrapped below.\n\n**Focus goes to the control's first tab stop**, for `focus()` and for a\npress on a `<label>` that names the host. A host is not focusable itself, so\nwithout this a label press focused nothing on half the controls.",
12089
- "name": "HelixFormElement",
12549
+ "description": "`HelixFormElementBase` carries form ownership, `disabled` and the fieldset\nthat disables it, `name`, focus, and the validity API with a custom message\nas its only verdict. `HelixFormElement` extends it with what a control that\njudges its own value needs: the wrapped `setValidity`, `feedback` from a\nfield, and the `input` and `change` announcements.\n\n**Two classes, because a button pays for the half it never calls.** Button\nreports nothing through `setValidity` and holds no value, so a message from\n`setCustomValidity` is the whole of its verdict, the same as on a native\n`<button>`. Measured on the styled Button bundled alone, October 7, 2026:\nthe validating half was 347 of its 12,973 bytes brotli.\n\nA family extends this one only where it never calls\n`internals.setValidity` and takes no `MixinField`. Every other control\nextends `HelixFormElement`.",
12550
+ "name": "HelixFormElementBase",
12090
12551
  "members": [
12091
12552
  {
12092
12553
  "kind": "field",
@@ -12108,7 +12569,845 @@
12108
12569
  "default": "false",
12109
12570
  "description": "Whether the control is disabled and cannot be used.\n\nReflected, because the styled tier selects on it, and mirrored to\n`aria-disabled` rather than removing the element from the accessibility\ntree, so a screen reader can still announce that the control exists.\n\nThe mirror itself is in `willUpdate` below, here rather than in each\ncontrol, because here is where `disabled` is.",
12110
12571
  "attribute": "disabled",
12111
- "reflects": true
12572
+ "reflects": true
12573
+ },
12574
+ {
12575
+ "kind": "field",
12576
+ "name": "formDisabled",
12577
+ "type": {
12578
+ "text": "boolean"
12579
+ },
12580
+ "privacy": "protected",
12581
+ "default": "false",
12582
+ "description": "Whether an ancestor `<fieldset disabled>` has switched this control off.\n\nThe platform tells a form-associated element through `formDisabledCallback`\nand nothing else does, so without this a control inside a disabled fieldset\nstays fully typeable and announces itself as enabled.\n\nThe submission half is already the platform's: measured, the fieldset's\ncontrols are absent from the form's entry list and the host matches\n`:disabled`, so the value never goes anywhere. What is missing without this\nis everything a reader can see or touch.\n\nState rather than the `disabled` property. Writing that would reflect an\nattribute the consumer's server markup does not have, which React reports\non hydration and does not patch up, and it would also silently overwrite\nwhat the consumer set."
12583
+ },
12584
+ {
12585
+ "kind": "method",
12586
+ "name": "formDisabledCallback",
12587
+ "return": {
12588
+ "type": {
12589
+ "text": "void"
12590
+ }
12591
+ },
12592
+ "parameters": [
12593
+ {
12594
+ "name": "disabled",
12595
+ "type": {
12596
+ "text": "boolean"
12597
+ }
12598
+ }
12599
+ ],
12600
+ "description": "Called by the browser when an ancestor fieldset is disabled or enabled.\n\n**The argument is the effective state, and taking it whole is what latched\nevery control in the library.** The platform calls this for the element's\nown `disabled` as well as for a fieldset, and our own arrives here at the\nworst possible moment: reflecting `disabled` to the attribute happens\ninside Lit's `update()`, the UA fires this synchronously from that write,\nand a reactive write during an update is a change-in-update Lit does not\nre-render for. So `formDisabled` ran exactly one update behind forever.\n\nMeasured on Slider, logging what `render` saw:\n\n```\nset true disabled true formDisabled false isDisabled true\nset false disabled false formDisabled true isDisabled true <- stale\n(no third render)\n```\n\nThe host came out right every time, `disabled` false, `:disabled` not\nmatching, and the inner control kept the attribute, so a control disabled\nonce could never be re-enabled. It only shows when something re-enables,\nwhich is the same shape of bug `inheritDisabled` was written for.\n\nOur own half is already in `this.disabled` and `isDisabled` is an or, so\nthis records only what the fieldset adds. That also removes the write\nentirely on the own-disabled path rather than moving it.\n\nThe one case this cannot see is a control that is disabled itself *and*\ninside a disabled fieldset, whose own `disabled` is then removed: the\neffective state does not change, so the platform does not call again, and\nthe fieldset's hold is not recorded. There is no callback to learn it from\nand reading `:disabled` here would answer about the attribute we are in the\nmiddle of removing."
12601
+ },
12602
+ {
12603
+ "kind": "field",
12604
+ "name": "heldByFieldset",
12605
+ "type": {
12606
+ "text": "boolean"
12607
+ },
12608
+ "privacy": "private",
12609
+ "description": "Whether an ancestor `<fieldset disabled>` holds the control, outside its\nfirst `<legend>`, read from the tree.\n\nFor the one case the callback cannot report: a control disabled itself and\nby a fieldset, whose own `disabled` is then removed. The effective state does\nnot change, so the platform does not call, and the fieldset's hold has to\nbe read.",
12610
+ "readonly": true
12611
+ },
12612
+ {
12613
+ "kind": "method",
12614
+ "name": "formResetCallback",
12615
+ "return": {
12616
+ "type": {
12617
+ "text": "void"
12618
+ }
12619
+ },
12620
+ "description": "Called by the browser when the form is reset. It does nothing here, and\nevery override calls it.\n\n**A chain rather than a leaf**, because more than one layer owes a reset\nsomething: the value mixin its default, and the field mixin beneath it the\nforgetting of a reader's past attempt, whose message otherwise showed over\nthe emptied control the moment the form was reset."
12621
+ },
12622
+ {
12623
+ "kind": "field",
12624
+ "name": "name",
12625
+ "type": {
12626
+ "text": "string"
12627
+ },
12628
+ "default": "''",
12629
+ "description": "The name the control's value is submitted under.\n\n**Reflected, and it is the exception to \"reflect only what CSS selects\non\".** The platform builds a form's entry list from the `name` *content\nattribute*, not from the property, so a control named through the property\nsubmitted under no name at all and was silently dropped. Measured: two\ninputs in one form, one named by attribute and one by property, and the\nform carried a single entry.\n\nSafe for a React consumer, which is what the rule is protecting: React\nrenders a custom element's props as attributes on the server, so the name\nis already in the markup being hydrated and reflecting it writes what is\nthere. It is only a change to the markup when a consumer assigns it\nimperatively later, and nothing is hydrating by then.\n\nHere rather than on each control.",
12630
+ "attribute": "name",
12631
+ "reflects": true
12632
+ },
12633
+ {
12634
+ "kind": "field",
12635
+ "name": "customValidity",
12636
+ "type": {
12637
+ "text": "string"
12638
+ },
12639
+ "privacy": "protected",
12640
+ "default": "''",
12641
+ "description": "The message `setCustomValidity` was given."
12642
+ },
12643
+ {
12644
+ "kind": "method",
12645
+ "name": "applyValidity",
12646
+ "privacy": "protected",
12647
+ "return": {
12648
+ "type": {
12649
+ "text": "void"
12650
+ }
12651
+ },
12652
+ "description": "Hands the platform the control's verdict, anchored where focus can go.\n\nHere the verdict is the custom message alone. `HelixFormElement` lays the\nmessage over what the control itself reported."
12653
+ },
12654
+ {
12655
+ "kind": "field",
12656
+ "name": "validity",
12657
+ "type": {
12658
+ "text": "ValidityState"
12659
+ },
12660
+ "description": "Whether the control meets its constraints, and why not.",
12661
+ "readonly": true,
12662
+ "helix": {
12663
+ "references": [
12664
+ {
12665
+ "label": "ElementInternals.validity",
12666
+ "url": "https://developer.mozilla.org/docs/Web/API/ElementInternals/validity"
12667
+ }
12668
+ ]
12669
+ }
12670
+ },
12671
+ {
12672
+ "kind": "field",
12673
+ "name": "validationMessage",
12674
+ "type": {
12675
+ "text": "string"
12676
+ },
12677
+ "description": "The message the browser would show for the control, or an empty string.",
12678
+ "readonly": true
12679
+ },
12680
+ {
12681
+ "kind": "field",
12682
+ "name": "updateRunning",
12683
+ "type": {
12684
+ "text": "boolean"
12685
+ },
12686
+ "privacy": "private",
12687
+ "default": "false",
12688
+ "description": "Whether an update is running, so `runPendingUpdate` never starts one inside another."
12689
+ },
12690
+ {
12691
+ "kind": "method",
12692
+ "name": "performUpdate",
12693
+ "privacy": "protected",
12694
+ "return": {
12695
+ "type": {
12696
+ "text": "void"
12697
+ }
12698
+ },
12699
+ "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`.",
12700
+ "inheritedFrom": {
12701
+ "name": "HelixElement",
12702
+ "module": "src/helix-element/helix-element.ts"
12703
+ }
12704
+ },
12705
+ {
12706
+ "kind": "method",
12707
+ "name": "runPendingUpdate",
12708
+ "privacy": "protected",
12709
+ "return": {
12710
+ "type": {
12711
+ "text": "void"
12712
+ }
12713
+ },
12714
+ "description": "Runs an update that is on its way, so the verdict read next is the one\nfor what the control holds now.\n\n**A control reports its verdict as it updates, and an update waits for a\nmicrotask**, so a script that wrote `value` and asked at once was answered\nabout the value before: measured on Time Input, `value = '18:00'` past a\n`max` of 17:00 and `checkValidity()` returned true until `updateComplete`.\nA native control answers about the value it was just given, so the\nquestions a script can ask run the pending update first. Lit's\n`performUpdate` is the documented way to run one synchronously.\n\nProtected for a control that submits on its own, which has to hand the\nform the verdict for what it holds now: Pin Input's `autosubmit`."
12715
+ },
12716
+ {
12717
+ "kind": "field",
12718
+ "name": "willValidate",
12719
+ "type": {
12720
+ "text": "boolean"
12721
+ },
12722
+ "description": "Whether the control is checked when its form is submitted.",
12723
+ "readonly": true
12724
+ },
12725
+ {
12726
+ "kind": "method",
12727
+ "name": "checkValidity",
12728
+ "return": {
12729
+ "type": {
12730
+ "text": "boolean"
12731
+ }
12732
+ },
12733
+ "description": "Returns whether the control is valid, and fires `invalid` on it when it is\nnot. The control shows no message for it: `reportValidity()` does that."
12734
+ },
12735
+ {
12736
+ "kind": "method",
12737
+ "name": "reportValidity",
12738
+ "return": {
12739
+ "type": {
12740
+ "text": "boolean"
12741
+ }
12742
+ },
12743
+ "description": "Returns whether the control is valid, and when it is not, fires `invalid`\nand shows the browser's message at the control."
12744
+ },
12745
+ {
12746
+ "kind": "method",
12747
+ "name": "setCustomValidity",
12748
+ "return": {
12749
+ "type": {
12750
+ "text": "void"
12751
+ }
12752
+ },
12753
+ "parameters": [
12754
+ {
12755
+ "name": "message",
12756
+ "type": {
12757
+ "text": "string"
12758
+ }
12759
+ }
12760
+ ],
12761
+ "description": "Marks the control invalid with `message`, or clears that with an empty\nstring, as on a native control. The form does not submit while it is set."
12762
+ },
12763
+ {
12764
+ "kind": "field",
12765
+ "name": "focusTarget",
12766
+ "type": {
12767
+ "text": "HTMLElement | null"
12768
+ },
12769
+ "privacy": "protected",
12770
+ "description": "The element focus goes to: the control's first tab stop, or `null` where\nthere is none.\n\nRead through shadow roots and slots, so a group lands on the member that\nholds its tab stop, which is the chosen radio in a radio group.",
12771
+ "readonly": true
12772
+ },
12773
+ {
12774
+ "kind": "method",
12775
+ "name": "focus",
12776
+ "return": {
12777
+ "type": {
12778
+ "text": "void"
12779
+ }
12780
+ },
12781
+ "parameters": [
12782
+ {
12783
+ "name": "options",
12784
+ "optional": true,
12785
+ "type": {
12786
+ "text": "FocusOptions"
12787
+ }
12788
+ }
12789
+ ],
12790
+ "description": "Moves focus to the control, as focusing a native control does."
12791
+ },
12792
+ {
12793
+ "kind": "field",
12794
+ "name": "focusFromLabel",
12795
+ "privacy": "private",
12796
+ "readonly": true,
12797
+ "description": "Focuses the control when its `<label>` is pressed.\n\nThe label sends the host a click of the browser's own after trying to\nfocus it, and a host that is not focusable takes nothing from that try.\nOnly a click that starts at the host and that the browser sent: one from\ninside has landed where it meant to, and `click()` from a script does not\nfocus a native control either."
12798
+ },
12799
+ {
12800
+ "kind": "field",
12801
+ "name": "refreshAnchor",
12802
+ "privacy": "private",
12803
+ "readonly": true,
12804
+ "description": "Re-anchors the verdict as the form checks it, because the control's\nmembers may have rendered since it last reported, and the anchor read then\nwas the best there was."
12805
+ },
12806
+ {
12807
+ "kind": "field",
12808
+ "name": "unwatchLabels",
12809
+ "type": {
12810
+ "text": "(() => void) | undefined"
12811
+ },
12812
+ "privacy": "private",
12813
+ "description": "Stops listening for the labels in this control's tree."
12814
+ },
12815
+ {
12816
+ "kind": "field",
12817
+ "name": "form",
12818
+ "type": {
12819
+ "text": "HTMLFormElement | null"
12820
+ },
12821
+ "description": "The form the control belongs to, or `null`.",
12822
+ "readonly": true,
12823
+ "helix": {
12824
+ "references": [
12825
+ {
12826
+ "label": "form-associated custom elements",
12827
+ "url": "https://html.spec.whatwg.org/multipage/custom-elements.html#form-associated-custom-elements"
12828
+ }
12829
+ ]
12830
+ }
12831
+ },
12832
+ {
12833
+ "kind": "field",
12834
+ "name": "labels",
12835
+ "type": {
12836
+ "text": "NodeList"
12837
+ },
12838
+ "description": "The labels associated with the control.",
12839
+ "readonly": true,
12840
+ "helix": {
12841
+ "references": [
12842
+ {
12843
+ "label": "form-associated custom elements",
12844
+ "url": "https://html.spec.whatwg.org/multipage/custom-elements.html#form-associated-custom-elements"
12845
+ }
12846
+ ]
12847
+ }
12848
+ },
12849
+ {
12850
+ "kind": "field",
12851
+ "name": "tier",
12852
+ "type": {
12853
+ "text": "string"
12854
+ },
12855
+ "static": true,
12856
+ "default": "'helix-headless-'",
12857
+ "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.",
12858
+ "inheritedFrom": {
12859
+ "name": "HelixElement",
12860
+ "module": "src/helix-element/helix-element.ts"
12861
+ }
12862
+ },
12863
+ {
12864
+ "kind": "method",
12865
+ "name": "tag",
12866
+ "privacy": "protected",
12867
+ "return": {
12868
+ "type": {
12869
+ "text": "StaticValue"
12870
+ }
12871
+ },
12872
+ "parameters": [
12873
+ {
12874
+ "name": "name",
12875
+ "type": {
12876
+ "text": "string"
12877
+ }
12878
+ }
12879
+ ],
12880
+ "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.",
12881
+ "inheritedFrom": {
12882
+ "name": "HelixElement",
12883
+ "module": "src/helix-element/helix-element.ts"
12884
+ }
12885
+ },
12886
+ {
12887
+ "kind": "method",
12888
+ "name": "partNamed",
12889
+ "privacy": "protected",
12890
+ "return": {
12891
+ "type": {
12892
+ "text": "T | null"
12893
+ }
12894
+ },
12895
+ "parameters": [
12896
+ {
12897
+ "name": "name",
12898
+ "type": {
12899
+ "text": "string"
12900
+ }
12901
+ }
12902
+ ],
12903
+ "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.",
12904
+ "inheritedFrom": {
12905
+ "name": "HelixElement",
12906
+ "module": "src/helix-element/helix-element.ts"
12907
+ }
12908
+ },
12909
+ {
12910
+ "kind": "field",
12911
+ "name": "internals",
12912
+ "type": {
12913
+ "text": "ElementInternals"
12914
+ },
12915
+ "privacy": "protected",
12916
+ "readonly": true,
12917
+ "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.",
12918
+ "inheritedFrom": {
12919
+ "name": "HelixElement",
12920
+ "module": "src/helix-element/helix-element.ts"
12921
+ }
12922
+ },
12923
+ {
12924
+ "kind": "method",
12925
+ "name": "toggleState",
12926
+ "privacy": "protected",
12927
+ "return": {
12928
+ "type": {
12929
+ "text": "void"
12930
+ }
12931
+ },
12932
+ "parameters": [
12933
+ {
12934
+ "name": "name",
12935
+ "type": {
12936
+ "text": "string"
12937
+ }
12938
+ },
12939
+ {
12940
+ "name": "on",
12941
+ "type": {
12942
+ "text": "boolean"
12943
+ }
12944
+ }
12945
+ ],
12946
+ "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.",
12947
+ "inheritedFrom": {
12948
+ "name": "HelixElement",
12949
+ "module": "src/helix-element/helix-element.ts"
12950
+ }
12951
+ },
12952
+ {
12953
+ "kind": "field",
12954
+ "name": "whenSettled",
12955
+ "type": {
12956
+ "text": "Promise<void>"
12957
+ },
12958
+ "readonly": true,
12959
+ "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.",
12960
+ "default": "new Promise<void>((resolve) => { this.resolveSettled = resolve })",
12961
+ "inheritedFrom": {
12962
+ "name": "HelixElement",
12963
+ "module": "src/helix-element/helix-element.ts"
12964
+ }
12965
+ },
12966
+ {
12967
+ "kind": "field",
12968
+ "name": "resolveSettled",
12969
+ "type": {
12970
+ "text": "() => void"
12971
+ },
12972
+ "privacy": "private",
12973
+ "description": "Resolves `whenSettled`, once, from the frame that records the state.",
12974
+ "inheritedFrom": {
12975
+ "name": "HelixElement",
12976
+ "module": "src/helix-element/helix-element.ts"
12977
+ }
12978
+ },
12979
+ {
12980
+ "kind": "field",
12981
+ "name": "fromServer",
12982
+ "type": {
12983
+ "text": "boolean"
12984
+ },
12985
+ "privacy": "private",
12986
+ "default": "false",
12987
+ "description": "Whether the shadow root was a server's, parsed from declarative shadow DOM.",
12988
+ "inheritedFrom": {
12989
+ "name": "HelixElement",
12990
+ "module": "src/helix-element/helix-element.ts"
12991
+ }
12992
+ },
12993
+ {
12994
+ "kind": "field",
12995
+ "name": "hydrating",
12996
+ "type": {
12997
+ "text": "boolean"
12998
+ },
12999
+ "privacy": "protected",
13000
+ "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.",
13001
+ "readonly": true,
13002
+ "inheritedFrom": {
13003
+ "name": "HelixElement",
13004
+ "module": "src/helix-element/helix-element.ts"
13005
+ }
13006
+ },
13007
+ {
13008
+ "kind": "field",
13009
+ "name": "serverRendered",
13010
+ "type": {
13011
+ "text": "boolean"
13012
+ },
13013
+ "privacy": "protected",
13014
+ "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.",
13015
+ "readonly": true,
13016
+ "inheritedFrom": {
13017
+ "name": "HelixElement",
13018
+ "module": "src/helix-element/helix-element.ts"
13019
+ }
13020
+ },
13021
+ {
13022
+ "kind": "method",
13023
+ "name": "finishHydration",
13024
+ "privacy": "protected",
13025
+ "return": {
13026
+ "type": {
13027
+ "text": "void"
13028
+ }
13029
+ },
13030
+ "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.",
13031
+ "inheritedFrom": {
13032
+ "name": "HelixElement",
13033
+ "module": "src/helix-element/helix-element.ts"
13034
+ }
13035
+ },
13036
+ {
13037
+ "kind": "field",
13038
+ "name": "childrenKnown",
13039
+ "type": {
13040
+ "text": "boolean"
13041
+ },
13042
+ "privacy": "protected",
13043
+ "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.",
13044
+ "readonly": true,
13045
+ "inheritedFrom": {
13046
+ "name": "HelixElement",
13047
+ "module": "src/helix-element/helix-element.ts"
13048
+ }
13049
+ },
13050
+ {
13051
+ "kind": "field",
13052
+ "name": "knownChildren",
13053
+ "type": {
13054
+ "text": "Element[]"
13055
+ },
13056
+ "privacy": "protected",
13057
+ "description": "The children a render may read: all of them where they are known, and none otherwise.",
13058
+ "readonly": true,
13059
+ "inheritedFrom": {
13060
+ "name": "HelixElement",
13061
+ "module": "src/helix-element/helix-element.ts"
13062
+ }
13063
+ },
13064
+ {
13065
+ "kind": "field",
13066
+ "name": "assignsByName",
13067
+ "type": {
13068
+ "text": "boolean"
13069
+ },
13070
+ "privacy": "protected",
13071
+ "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.",
13072
+ "readonly": true,
13073
+ "inheritedFrom": {
13074
+ "name": "HelixElement",
13075
+ "module": "src/helix-element/helix-element.ts"
13076
+ }
13077
+ },
13078
+ {
13079
+ "kind": "method",
13080
+ "name": "route",
13081
+ "privacy": "protected",
13082
+ "return": {
13083
+ "type": {
13084
+ "text": "void"
13085
+ }
13086
+ },
13087
+ "parameters": [
13088
+ {
13089
+ "name": "child",
13090
+ "type": {
13091
+ "text": "Element"
13092
+ }
13093
+ },
13094
+ {
13095
+ "name": "name",
13096
+ "type": {
13097
+ "text": "string | undefined"
13098
+ }
13099
+ }
13100
+ ],
13101
+ "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.",
13102
+ "inheritedFrom": {
13103
+ "name": "HelixElement",
13104
+ "module": "src/helix-element/helix-element.ts"
13105
+ }
13106
+ },
13107
+ {
13108
+ "kind": "field",
13109
+ "name": "stopInner",
13110
+ "privacy": "protected",
13111
+ "readonly": true,
13112
+ "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.",
13113
+ "inheritedFrom": {
13114
+ "name": "HelixElement",
13115
+ "module": "src/helix-element/helix-element.ts"
13116
+ }
13117
+ },
13118
+ {
13119
+ "kind": "method",
13120
+ "name": "relayNativeEvent",
13121
+ "privacy": "protected",
13122
+ "return": {
13123
+ "type": {
13124
+ "text": "void"
13125
+ }
13126
+ },
13127
+ "parameters": [
13128
+ {
13129
+ "name": "event",
13130
+ "type": {
13131
+ "text": "Event"
13132
+ }
13133
+ },
13134
+ {
13135
+ "name": "init",
13136
+ "optional": true,
13137
+ "type": {
13138
+ "text": "EventInit"
13139
+ }
13140
+ }
13141
+ ],
13142
+ "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.",
13143
+ "inheritedFrom": {
13144
+ "name": "HelixElement",
13145
+ "module": "src/helix-element/helix-element.ts"
13146
+ }
13147
+ },
13148
+ {
13149
+ "kind": "field",
13150
+ "name": "markRules",
13151
+ "type": {
13152
+ "text": "readonly string[]"
13153
+ },
13154
+ "privacy": "protected",
13155
+ "static": true,
13156
+ "default": "[]",
13157
+ "description": "The rules from `mark-rules.ts` for the marks this element writes in its\nown shadow root: `data-scroller`, `data-virtual`, `data-spoken` and\n`data-mirror`.\n\nA component that writes a mark names its rule here, and a subclass\ninherits the list. One that writes none takes only the three rules every\nshadow root gets, which is what keeps the other four out of a Button.",
13158
+ "inheritedFrom": {
13159
+ "name": "HelixElement",
13160
+ "module": "src/helix-element/helix-element.ts"
13161
+ }
13162
+ },
13163
+ {
13164
+ "kind": "method",
13165
+ "name": "finalizeStyles",
13166
+ "privacy": "protected",
13167
+ "static": true,
13168
+ "return": {
13169
+ "type": {
13170
+ "text": "CSSResultOrNative[]"
13171
+ }
13172
+ },
13173
+ "parameters": [
13174
+ {
13175
+ "name": "styles",
13176
+ "optional": true,
13177
+ "type": {
13178
+ "text": "CSSResultOrNative | CSSResultOrNative[]"
13179
+ }
13180
+ }
13181
+ ],
13182
+ "description": "Prepends the shadow-root reset to every subclass's styles, so no component\nhas to remember to include it, with the rules for the marks it writes.",
13183
+ "inheritedFrom": {
13184
+ "name": "HelixElement",
13185
+ "module": "src/helix-element/helix-element.ts"
13186
+ }
13187
+ }
13188
+ ],
13189
+ "attributes": [
13190
+ {
13191
+ "name": "disabled",
13192
+ "type": {
13193
+ "text": "boolean"
13194
+ },
13195
+ "default": "false",
13196
+ "description": "Whether the control is disabled and cannot be used.\n\nReflected, because the styled tier selects on it, and mirrored to\n`aria-disabled` rather than removing the element from the accessibility\ntree, so a screen reader can still announce that the control exists.\n\nThe mirror itself is in `willUpdate` below, here rather than in each\ncontrol, because here is where `disabled` is.",
13197
+ "fieldName": "disabled"
13198
+ },
13199
+ {
13200
+ "name": "name",
13201
+ "type": {
13202
+ "text": "string"
13203
+ },
13204
+ "default": "''",
13205
+ "description": "The name the control's value is submitted under.\n\n**Reflected, and it is the exception to \"reflect only what CSS selects\non\".** The platform builds a form's entry list from the `name` *content\nattribute*, not from the property, so a control named through the property\nsubmitted under no name at all and was silently dropped. Measured: two\ninputs in one form, one named by attribute and one by property, and the\nform carried a single entry.\n\nSafe for a React consumer, which is what the rule is protecting: React\nrenders a custom element's props as attributes on the server, so the name\nis already in the markup being hydrated and reflecting it writes what is\nthere. It is only a change to the markup when a consumer assigns it\nimperatively later, and nothing is hydrating by then.\n\nHere rather than on each control.",
13206
+ "fieldName": "name"
13207
+ }
13208
+ ],
13209
+ "superclass": {
13210
+ "name": "HelixElement",
13211
+ "module": "/src/helix-element/helix-element.js"
13212
+ },
13213
+ "summary": "Base for a form element that reports no validity of its own, as a native button does.",
13214
+ "helix": {
13215
+ "since": "0.176.0",
13216
+ "status": "experimental",
13217
+ "documentation": "https://fusion.dev/helix/docs/tiers",
13218
+ "tier": "core"
13219
+ },
13220
+ "cssStates": [
13221
+ {
13222
+ "description": "Set one frame after the first render. Transitions wait for it, so an element does not animate its own arrival.",
13223
+ "name": "settled",
13224
+ "inheritedFrom": {
13225
+ "name": "HelixElement",
13226
+ "module": "src/helix-element/helix-element.ts"
13227
+ }
13228
+ }
13229
+ ]
13230
+ }
13231
+ ],
13232
+ "exports": [
13233
+ {
13234
+ "kind": "js",
13235
+ "name": "HelixFormElementBase",
13236
+ "declaration": {
13237
+ "name": "HelixFormElementBase",
13238
+ "module": "src/helix-form-element/helix-form-element-base.ts"
13239
+ }
13240
+ }
13241
+ ]
13242
+ },
13243
+ {
13244
+ "kind": "javascript-module",
13245
+ "path": "src/helix-form-element/helix-form-element.ts",
13246
+ "declarations": [
13247
+ {
13248
+ "kind": "class",
13249
+ "description": "`HelixFormElement` is a class because the browser reads `formAssociated` from\nthe constructor during element upgrade, and a mixin or controller cannot\nsupply it.\n\n`internals` comes from `HelixElement`, which attaches it for every component.\n`attachInternals()` throws on a second call, so only one class attaches it.\n\nThe class carries only what every form participant needs. `value` and the\nreset and restore callbacks are added with the first input component.\n\n**The validity API is the platform's, read through `internals`**, so\n`checkValidity()`, `reportValidity()` and `setCustomValidity()` work on the\nhost as they do on a native control. A custom message is laid over whatever\nthe control itself reports, which is why `setValidity` is wrapped below.\n\n**Focus goes to the control's first tab stop**, for `focus()` and for a\npress on a `<label>` that names the host. A host is not focusable itself, so\nwithout this a label press focused nothing on half the controls.\n\nOwnership, `disabled`, `name`, focus and the validity API are\n`HelixFormElementBase`'s, which a control that reports no verdict of its\nown, as Button does, extends directly.",
13250
+ "name": "HelixFormElement",
13251
+ "members": [
13252
+ {
13253
+ "kind": "method",
13254
+ "name": "announceInput",
13255
+ "privacy": "protected",
13256
+ "return": {
13257
+ "type": {
13258
+ "text": "void"
13259
+ }
13260
+ },
13261
+ "description": "Announces `input` from the host, the way the control it stands for would.\n\nComposed, as the native one is: `input` crosses shadow boundaries by\nspecification, so a consumer listening above a composition hears it."
13262
+ },
13263
+ {
13264
+ "kind": "method",
13265
+ "name": "announceChange",
13266
+ "privacy": "protected",
13267
+ "return": {
13268
+ "type": {
13269
+ "text": "void"
13270
+ }
13271
+ },
13272
+ "description": "Announces `change` from the host, the way the control it stands for would.\n\n**Not composed, and that is the shape of the native event rather than a\nchoice made here.** `change` stops at a shadow boundary, so a composed\ncontrol hears its inner control's and relays it under the same name from\nits own host, which is what `onChange` binds. Every control here that\ncommits a value announces it through this, whether the commit came from an\ninner control's own `change`, a step, a scrub or a completed code, so the\nevent is one shape in one place."
13273
+ },
13274
+ {
13275
+ "kind": "field",
13276
+ "name": "reportValidityTo",
13277
+ "type": {
13278
+ "text": "ElementInternals['setValidity']"
13279
+ },
13280
+ "privacy": "private",
13281
+ "readonly": true,
13282
+ "description": "The platform's own `setValidity`, which the wrapper above calls.",
13283
+ "default": "report"
13284
+ },
13285
+ {
13286
+ "kind": "field",
13287
+ "name": "reported",
13288
+ "type": {
13289
+ "text": "Reported"
13290
+ },
13291
+ "privacy": "private",
13292
+ "default": "{ anchor: undefined, flags: {}, message: '' }",
13293
+ "description": "What the control last reported, before any custom error is laid over it."
13294
+ },
13295
+ {
13296
+ "kind": "field",
13297
+ "name": "appliedFeedback",
13298
+ "type": {
13299
+ "text": "string"
13300
+ },
13301
+ "privacy": "private",
13302
+ "default": "''",
13303
+ "description": "The `validityFeedback` the platform was last told about."
13304
+ },
13305
+ {
13306
+ "kind": "method",
13307
+ "name": "applyValidity",
13308
+ "privacy": "protected",
13309
+ "return": {
13310
+ "type": {
13311
+ "text": "void"
13312
+ }
13313
+ },
13314
+ "description": "Hands the platform the control's own verdict with any custom error on top,\nanchored where focus can go.",
13315
+ "inheritedFrom": {
13316
+ "name": "HelixFormElementBase",
13317
+ "module": "src/helix-form-element/helix-form-element-base.ts"
13318
+ }
13319
+ },
13320
+ {
13321
+ "kind": "method",
13322
+ "name": "validationAnchor",
13323
+ "privacy": "protected",
13324
+ "return": {
13325
+ "type": {
13326
+ "text": "HTMLElement | undefined"
13327
+ }
13328
+ },
13329
+ "parameters": [
13330
+ {
13331
+ "name": "anchor",
13332
+ "optional": true,
13333
+ "type": {
13334
+ "text": "HTMLElement"
13335
+ }
13336
+ }
13337
+ ],
13338
+ "description": "Where the browser points its bubble: the anchor a control gave if focus\ncan go there, and its first tab stop otherwise.\n\nA group anchors on a part that holds its members and cannot take focus,\nand the platform then refuses the submission, logs that the control is\nnot focusable, and leaves the reader on the submit button."
13339
+ },
13340
+ {
13341
+ "kind": "method",
13342
+ "name": "checkValidity",
13343
+ "return": {
13344
+ "type": {
13345
+ "text": "boolean"
13346
+ }
13347
+ },
13348
+ "description": "Returns whether the control is valid, and fires `invalid` on it when it is\nnot. The control shows no message for it: `reportValidity()` does that.",
13349
+ "inheritedFrom": {
13350
+ "name": "HelixFormElementBase",
13351
+ "module": "src/helix-form-element/helix-form-element-base.ts"
13352
+ }
13353
+ },
13354
+ {
13355
+ "kind": "field",
13356
+ "name": "checkInProgress",
13357
+ "type": {
13358
+ "text": "boolean"
13359
+ },
13360
+ "privacy": "private",
13361
+ "default": "false",
13362
+ "description": "Whether `checkValidity()` is running, set only for the `invalid` it fires."
13363
+ },
13364
+ {
13365
+ "kind": "method",
13366
+ "name": "formAssociatedCallback",
13367
+ "return": {
13368
+ "type": {
13369
+ "text": "void"
13370
+ }
13371
+ },
13372
+ "parameters": [
13373
+ {
13374
+ "name": "form",
13375
+ "type": {
13376
+ "text": "HTMLFormElement | null"
13377
+ }
13378
+ }
13379
+ ],
13380
+ "description": "Called by the browser when the control's form changes: watches the new\nform's `checkValidity()`, as connecting does for the form it starts in."
13381
+ },
13382
+ {
13383
+ "kind": "field",
13384
+ "name": "formAssociated",
13385
+ "type": {
13386
+ "text": "boolean"
13387
+ },
13388
+ "static": true,
13389
+ "readonly": true,
13390
+ "default": "true",
13391
+ "description": "Opts the element into form ownership, labels, and submission.",
13392
+ "inheritedFrom": {
13393
+ "name": "HelixFormElementBase",
13394
+ "module": "src/helix-form-element/helix-form-element-base.ts"
13395
+ }
13396
+ },
13397
+ {
13398
+ "kind": "field",
13399
+ "name": "disabled",
13400
+ "type": {
13401
+ "text": "boolean"
13402
+ },
13403
+ "default": "false",
13404
+ "description": "Whether the control is disabled and cannot be used.\n\nReflected, because the styled tier selects on it, and mirrored to\n`aria-disabled` rather than removing the element from the accessibility\ntree, so a screen reader can still announce that the control exists.\n\nThe mirror itself is in `willUpdate` below, here rather than in each\ncontrol, because here is where `disabled` is.",
13405
+ "attribute": "disabled",
13406
+ "reflects": true,
13407
+ "inheritedFrom": {
13408
+ "name": "HelixFormElementBase",
13409
+ "module": "src/helix-form-element/helix-form-element-base.ts"
13410
+ }
12112
13411
  },
12113
13412
  {
12114
13413
  "kind": "field",
@@ -12118,7 +13417,11 @@
12118
13417
  },
12119
13418
  "privacy": "protected",
12120
13419
  "default": "false",
12121
- "description": "Whether an ancestor `<fieldset disabled>` has switched this control off.\n\nThe platform tells a form-associated element through `formDisabledCallback`\nand nothing else does, so without this a control inside a disabled fieldset\nstays fully typeable and announces itself as enabled.\n\nThe submission half is already the platform's: measured, the fieldset's\ncontrols are absent from the form's entry list and the host matches\n`:disabled`, so the value never goes anywhere. What is missing without this\nis everything a reader can see or touch.\n\nState rather than the `disabled` property. Writing that would reflect an\nattribute the consumer's server markup does not have, which React reports\non hydration and does not patch up, and it would also silently overwrite\nwhat the consumer set."
13420
+ "description": "Whether an ancestor `<fieldset disabled>` has switched this control off.\n\nThe platform tells a form-associated element through `formDisabledCallback`\nand nothing else does, so without this a control inside a disabled fieldset\nstays fully typeable and announces itself as enabled.\n\nThe submission half is already the platform's: measured, the fieldset's\ncontrols are absent from the form's entry list and the host matches\n`:disabled`, so the value never goes anywhere. What is missing without this\nis everything a reader can see or touch.\n\nState rather than the `disabled` property. Writing that would reflect an\nattribute the consumer's server markup does not have, which React reports\non hydration and does not patch up, and it would also silently overwrite\nwhat the consumer set.",
13421
+ "inheritedFrom": {
13422
+ "name": "HelixFormElementBase",
13423
+ "module": "src/helix-form-element/helix-form-element-base.ts"
13424
+ }
12122
13425
  },
12123
13426
  {
12124
13427
  "kind": "method",
@@ -12136,7 +13439,11 @@
12136
13439
  }
12137
13440
  }
12138
13441
  ],
12139
- "description": "Called by the browser when an ancestor fieldset is disabled or enabled.\n\n**The argument is the effective state, and taking it whole is what latched\nevery control in the library.** The platform calls this for the element's\nown `disabled` as well as for a fieldset, and our own arrives here at the\nworst possible moment: reflecting `disabled` to the attribute happens\ninside Lit's `update()`, the UA fires this synchronously from that write,\nand a reactive write during an update is a change-in-update Lit does not\nre-render for. So `formDisabled` ran exactly one update behind forever.\n\nMeasured on Slider, logging what `render` saw:\n\n```\nset true disabled true formDisabled false isDisabled true\nset false disabled false formDisabled true isDisabled true <- stale\n(no third render)\n```\n\nThe host came out right every time, `disabled` false, `:disabled` not\nmatching, and the inner control kept the attribute, so a control disabled\nonce could never be re-enabled. It only shows when something re-enables,\nwhich is the same shape of bug `inheritDisabled` was written for.\n\nOur own half is already in `this.disabled` and `isDisabled` is an or, so\nthis records only what the fieldset adds. That also removes the write\nentirely on the own-disabled path rather than moving it.\n\nThe one case this cannot see is a control that is disabled itself *and*\ninside a disabled fieldset, whose own `disabled` is then removed: the\neffective state does not change, so the platform does not call again, and\nthe fieldset's hold is not recorded. There is no callback to learn it from\nand reading `:disabled` here would answer about the attribute we are in the\nmiddle of removing."
13442
+ "description": "Called by the browser when an ancestor fieldset is disabled or enabled.\n\n**The argument is the effective state, and taking it whole is what latched\nevery control in the library.** The platform calls this for the element's\nown `disabled` as well as for a fieldset, and our own arrives here at the\nworst possible moment: reflecting `disabled` to the attribute happens\ninside Lit's `update()`, the UA fires this synchronously from that write,\nand a reactive write during an update is a change-in-update Lit does not\nre-render for. So `formDisabled` ran exactly one update behind forever.\n\nMeasured on Slider, logging what `render` saw:\n\n```\nset true disabled true formDisabled false isDisabled true\nset false disabled false formDisabled true isDisabled true <- stale\n(no third render)\n```\n\nThe host came out right every time, `disabled` false, `:disabled` not\nmatching, and the inner control kept the attribute, so a control disabled\nonce could never be re-enabled. It only shows when something re-enables,\nwhich is the same shape of bug `inheritDisabled` was written for.\n\nOur own half is already in `this.disabled` and `isDisabled` is an or, so\nthis records only what the fieldset adds. That also removes the write\nentirely on the own-disabled path rather than moving it.\n\nThe one case this cannot see is a control that is disabled itself *and*\ninside a disabled fieldset, whose own `disabled` is then removed: the\neffective state does not change, so the platform does not call again, and\nthe fieldset's hold is not recorded. There is no callback to learn it from\nand reading `:disabled` here would answer about the attribute we are in the\nmiddle of removing.",
13443
+ "inheritedFrom": {
13444
+ "name": "HelixFormElementBase",
13445
+ "module": "src/helix-form-element/helix-form-element-base.ts"
13446
+ }
12140
13447
  },
12141
13448
  {
12142
13449
  "kind": "field",
@@ -12146,7 +13453,11 @@
12146
13453
  },
12147
13454
  "privacy": "private",
12148
13455
  "description": "Whether an ancestor `<fieldset disabled>` holds the control, outside its\nfirst `<legend>`, read from the tree.\n\nFor the one case the callback cannot report: a control disabled itself and\nby a fieldset, whose own `disabled` is then removed. The effective state does\nnot change, so the platform does not call, and the fieldset's hold has to\nbe read.",
12149
- "readonly": true
13456
+ "readonly": true,
13457
+ "inheritedFrom": {
13458
+ "name": "HelixFormElementBase",
13459
+ "module": "src/helix-form-element/helix-form-element-base.ts"
13460
+ }
12150
13461
  },
12151
13462
  {
12152
13463
  "kind": "method",
@@ -12156,29 +13467,11 @@
12156
13467
  "text": "void"
12157
13468
  }
12158
13469
  },
12159
- "description": "Called by the browser when the form is reset. It does nothing here, and\nevery override calls it.\n\n**A chain rather than a leaf**, because more than one layer owes a reset\nsomething: the value mixin its default, and the field mixin beneath it the\nforgetting of a reader's past attempt, whose message otherwise showed over\nthe emptied control the moment the form was reset."
12160
- },
12161
- {
12162
- "kind": "method",
12163
- "name": "announceInput",
12164
- "privacy": "protected",
12165
- "return": {
12166
- "type": {
12167
- "text": "void"
12168
- }
12169
- },
12170
- "description": "Announces `input` from the host, the way the control it stands for would.\n\nComposed, as the native one is: `input` crosses shadow boundaries by\nspecification, so a consumer listening above a composition hears it."
12171
- },
12172
- {
12173
- "kind": "method",
12174
- "name": "announceChange",
12175
- "privacy": "protected",
12176
- "return": {
12177
- "type": {
12178
- "text": "void"
12179
- }
12180
- },
12181
- "description": "Announces `change` from the host, the way the control it stands for would.\n\n**Not composed, and that is the shape of the native event rather than a\nchoice made here.** `change` stops at a shadow boundary, so a composed\ncontrol hears its inner control's and relays it under the same name from\nits own host, which is what `onChange` binds. Every control here that\ncommits a value announces it through this, whether the commit came from an\ninner control's own `change`, a step, a scrub or a completed code, so the\nevent is one shape in one place."
13470
+ "description": "Called by the browser when the form is reset. It does nothing here, and\nevery override calls it.\n\n**A chain rather than a leaf**, because more than one layer owes a reset\nsomething: the value mixin its default, and the field mixin beneath it the\nforgetting of a reader's past attempt, whose message otherwise showed over\nthe emptied control the moment the form was reset.",
13471
+ "inheritedFrom": {
13472
+ "name": "HelixFormElementBase",
13473
+ "module": "src/helix-form-element/helix-form-element-base.ts"
13474
+ }
12182
13475
  },
12183
13476
  {
12184
13477
  "kind": "field",
@@ -12189,28 +13482,11 @@
12189
13482
  "default": "''",
12190
13483
  "description": "The name the control's value is submitted under.\n\n**Reflected, and it is the exception to \"reflect only what CSS selects\non\".** The platform builds a form's entry list from the `name` *content\nattribute*, not from the property, so a control named through the property\nsubmitted under no name at all and was silently dropped. Measured: two\ninputs in one form, one named by attribute and one by property, and the\nform carried a single entry.\n\nSafe for a React consumer, which is what the rule is protecting: React\nrenders a custom element's props as attributes on the server, so the name\nis already in the markup being hydrated and reflecting it writes what is\nthere. It is only a change to the markup when a consumer assigns it\nimperatively later, and nothing is hydrating by then.\n\nHere rather than on each control.",
12191
13484
  "attribute": "name",
12192
- "reflects": true
12193
- },
12194
- {
12195
- "kind": "field",
12196
- "name": "reportValidityTo",
12197
- "type": {
12198
- "text": "ElementInternals['setValidity']"
12199
- },
12200
- "privacy": "private",
12201
- "readonly": true,
12202
- "description": "The platform's own `setValidity`, which the wrapper above calls.",
12203
- "default": "report"
12204
- },
12205
- {
12206
- "kind": "field",
12207
- "name": "reported",
12208
- "type": {
12209
- "text": "Reported"
12210
- },
12211
- "privacy": "private",
12212
- "default": "{ anchor: undefined, flags: {}, message: '' }",
12213
- "description": "What the control last reported, before any custom error is laid over it."
13485
+ "reflects": true,
13486
+ "inheritedFrom": {
13487
+ "name": "HelixFormElementBase",
13488
+ "module": "src/helix-form-element/helix-form-element-base.ts"
13489
+ }
12214
13490
  },
12215
13491
  {
12216
13492
  "kind": "field",
@@ -12218,50 +13494,13 @@
12218
13494
  "type": {
12219
13495
  "text": "string"
12220
13496
  },
12221
- "privacy": "private",
12222
- "default": "''",
12223
- "description": "The message `setCustomValidity` was given."
12224
- },
12225
- {
12226
- "kind": "field",
12227
- "name": "appliedFeedback",
12228
- "type": {
12229
- "text": "string"
12230
- },
12231
- "privacy": "private",
12232
- "default": "''",
12233
- "description": "The `validityFeedback` the platform was last told about."
12234
- },
12235
- {
12236
- "kind": "method",
12237
- "name": "applyValidity",
12238
- "privacy": "private",
12239
- "return": {
12240
- "type": {
12241
- "text": "void"
12242
- }
12243
- },
12244
- "description": "Hands the platform the control's own verdict with any custom error on top,\nanchored where focus can go."
12245
- },
12246
- {
12247
- "kind": "method",
12248
- "name": "validationAnchor",
12249
13497
  "privacy": "protected",
12250
- "return": {
12251
- "type": {
12252
- "text": "HTMLElement | undefined"
12253
- }
12254
- },
12255
- "parameters": [
12256
- {
12257
- "name": "anchor",
12258
- "optional": true,
12259
- "type": {
12260
- "text": "HTMLElement"
12261
- }
12262
- }
12263
- ],
12264
- "description": "Where the browser points its bubble: the anchor a control gave if focus\ncan go there, and its first tab stop otherwise.\n\nA group anchors on a part that holds its members and cannot take focus,\nand the platform then refuses the submission, logs that the control is\nnot focusable, and leaves the reader on the submit button."
13498
+ "default": "''",
13499
+ "description": "The message `setCustomValidity` was given.",
13500
+ "inheritedFrom": {
13501
+ "name": "HelixFormElementBase",
13502
+ "module": "src/helix-form-element/helix-form-element-base.ts"
13503
+ }
12265
13504
  },
12266
13505
  {
12267
13506
  "kind": "field",
@@ -12278,6 +13517,10 @@
12278
13517
  "url": "https://developer.mozilla.org/docs/Web/API/ElementInternals/validity"
12279
13518
  }
12280
13519
  ]
13520
+ },
13521
+ "inheritedFrom": {
13522
+ "name": "HelixFormElementBase",
13523
+ "module": "src/helix-form-element/helix-form-element-base.ts"
12281
13524
  }
12282
13525
  },
12283
13526
  {
@@ -12287,7 +13530,11 @@
12287
13530
  "text": "string"
12288
13531
  },
12289
13532
  "description": "The message the browser would show for the control, or an empty string.",
12290
- "readonly": true
13533
+ "readonly": true,
13534
+ "inheritedFrom": {
13535
+ "name": "HelixFormElementBase",
13536
+ "module": "src/helix-form-element/helix-form-element-base.ts"
13537
+ }
12291
13538
  },
12292
13539
  {
12293
13540
  "kind": "field",
@@ -12297,7 +13544,11 @@
12297
13544
  },
12298
13545
  "privacy": "private",
12299
13546
  "default": "false",
12300
- "description": "Whether an update is running, so `runPendingUpdate` never starts one inside another."
13547
+ "description": "Whether an update is running, so `runPendingUpdate` never starts one inside another.",
13548
+ "inheritedFrom": {
13549
+ "name": "HelixFormElementBase",
13550
+ "module": "src/helix-form-element/helix-form-element-base.ts"
13551
+ }
12301
13552
  },
12302
13553
  {
12303
13554
  "kind": "method",
@@ -12323,7 +13574,11 @@
12323
13574
  "text": "void"
12324
13575
  }
12325
13576
  },
12326
- "description": "Runs an update that is on its way, so the verdict read next is the one\nfor what the control holds now.\n\n**A control reports its verdict as it updates, and an update waits for a\nmicrotask**, so a script that wrote `value` and asked at once was answered\nabout the value before: measured on Time Input, `value = '18:00'` past a\n`max` of 17:00 and `checkValidity()` returned true until `updateComplete`.\nA native control answers about the value it was just given, so the\nquestions a script can ask run the pending update first. Lit's\n`performUpdate` is the documented way to run one synchronously.\n\nProtected for a control that submits on its own, which has to hand the\nform the verdict for what it holds now: Pin Input's `autosubmit`."
13577
+ "description": "Runs an update that is on its way, so the verdict read next is the one\nfor what the control holds now.\n\n**A control reports its verdict as it updates, and an update waits for a\nmicrotask**, so a script that wrote `value` and asked at once was answered\nabout the value before: measured on Time Input, `value = '18:00'` past a\n`max` of 17:00 and `checkValidity()` returned true until `updateComplete`.\nA native control answers about the value it was just given, so the\nquestions a script can ask run the pending update first. Lit's\n`performUpdate` is the documented way to run one synchronously.\n\nProtected for a control that submits on its own, which has to hand the\nform the verdict for what it holds now: Pin Input's `autosubmit`.",
13578
+ "inheritedFrom": {
13579
+ "name": "HelixFormElementBase",
13580
+ "module": "src/helix-form-element/helix-form-element-base.ts"
13581
+ }
12327
13582
  },
12328
13583
  {
12329
13584
  "kind": "field",
@@ -12332,27 +13587,11 @@
12332
13587
  "text": "boolean"
12333
13588
  },
12334
13589
  "description": "Whether the control is checked when its form is submitted.",
12335
- "readonly": true
12336
- },
12337
- {
12338
- "kind": "method",
12339
- "name": "checkValidity",
12340
- "return": {
12341
- "type": {
12342
- "text": "boolean"
12343
- }
12344
- },
12345
- "description": "Returns whether the control is valid, and fires `invalid` on it when it is\nnot. The control shows no message for it: `reportValidity()` does that."
12346
- },
12347
- {
12348
- "kind": "field",
12349
- "name": "checkInProgress",
12350
- "type": {
12351
- "text": "boolean"
12352
- },
12353
- "privacy": "private",
12354
- "default": "false",
12355
- "description": "Whether `checkValidity()` is running, set only for the `invalid` it fires."
13590
+ "readonly": true,
13591
+ "inheritedFrom": {
13592
+ "name": "HelixFormElementBase",
13593
+ "module": "src/helix-form-element/helix-form-element-base.ts"
13594
+ }
12356
13595
  },
12357
13596
  {
12358
13597
  "kind": "method",
@@ -12362,7 +13601,11 @@
12362
13601
  "text": "boolean"
12363
13602
  }
12364
13603
  },
12365
- "description": "Returns whether the control is valid, and when it is not, fires `invalid`\nand shows the browser's message at the control."
13604
+ "description": "Returns whether the control is valid, and when it is not, fires `invalid`\nand shows the browser's message at the control.",
13605
+ "inheritedFrom": {
13606
+ "name": "HelixFormElementBase",
13607
+ "module": "src/helix-form-element/helix-form-element-base.ts"
13608
+ }
12366
13609
  },
12367
13610
  {
12368
13611
  "kind": "method",
@@ -12380,7 +13623,11 @@
12380
13623
  }
12381
13624
  }
12382
13625
  ],
12383
- "description": "Marks the control invalid with `message`, or clears that with an empty\nstring, as on a native control. The form does not submit while it is set."
13626
+ "description": "Marks the control invalid with `message`, or clears that with an empty\nstring, as on a native control. The form does not submit while it is set.",
13627
+ "inheritedFrom": {
13628
+ "name": "HelixFormElementBase",
13629
+ "module": "src/helix-form-element/helix-form-element-base.ts"
13630
+ }
12384
13631
  },
12385
13632
  {
12386
13633
  "kind": "field",
@@ -12390,7 +13637,11 @@
12390
13637
  },
12391
13638
  "privacy": "protected",
12392
13639
  "description": "The element focus goes to: the control's first tab stop, or `null` where\nthere is none.\n\nRead through shadow roots and slots, so a group lands on the member that\nholds its tab stop, which is the chosen radio in a radio group.",
12393
- "readonly": true
13640
+ "readonly": true,
13641
+ "inheritedFrom": {
13642
+ "name": "HelixFormElementBase",
13643
+ "module": "src/helix-form-element/helix-form-element-base.ts"
13644
+ }
12394
13645
  },
12395
13646
  {
12396
13647
  "kind": "method",
@@ -12409,21 +13660,33 @@
12409
13660
  }
12410
13661
  }
12411
13662
  ],
12412
- "description": "Moves focus to the control, as focusing a native control does."
13663
+ "description": "Moves focus to the control, as focusing a native control does.",
13664
+ "inheritedFrom": {
13665
+ "name": "HelixFormElementBase",
13666
+ "module": "src/helix-form-element/helix-form-element-base.ts"
13667
+ }
12413
13668
  },
12414
13669
  {
12415
13670
  "kind": "field",
12416
13671
  "name": "focusFromLabel",
12417
13672
  "privacy": "private",
12418
13673
  "readonly": true,
12419
- "description": "Focuses the control when its `<label>` is pressed.\n\nThe label sends the host a click of the browser's own after trying to\nfocus it, and a host that is not focusable takes nothing from that try.\nOnly a click that starts at the host and that the browser sent: one from\ninside has landed where it meant to, and `click()` from a script does not\nfocus a native control either."
13674
+ "description": "Focuses the control when its `<label>` is pressed.\n\nThe label sends the host a click of the browser's own after trying to\nfocus it, and a host that is not focusable takes nothing from that try.\nOnly a click that starts at the host and that the browser sent: one from\ninside has landed where it meant to, and `click()` from a script does not\nfocus a native control either.",
13675
+ "inheritedFrom": {
13676
+ "name": "HelixFormElementBase",
13677
+ "module": "src/helix-form-element/helix-form-element-base.ts"
13678
+ }
12420
13679
  },
12421
13680
  {
12422
13681
  "kind": "field",
12423
13682
  "name": "refreshAnchor",
12424
13683
  "privacy": "private",
12425
13684
  "readonly": true,
12426
- "description": "Re-anchors the verdict as the form checks it, because the control's\nmembers may have rendered since it last reported, and the anchor read then\nwas the best there was."
13685
+ "description": "Re-anchors the verdict as the form checks it, because the control's\nmembers may have rendered since it last reported, and the anchor read then\nwas the best there was.",
13686
+ "inheritedFrom": {
13687
+ "name": "HelixFormElementBase",
13688
+ "module": "src/helix-form-element/helix-form-element-base.ts"
13689
+ }
12427
13690
  },
12428
13691
  {
12429
13692
  "kind": "field",
@@ -12432,25 +13695,11 @@
12432
13695
  "text": "(() => void) | undefined"
12433
13696
  },
12434
13697
  "privacy": "private",
12435
- "description": "Stops listening for the labels in this control's tree."
12436
- },
12437
- {
12438
- "kind": "method",
12439
- "name": "formAssociatedCallback",
12440
- "return": {
12441
- "type": {
12442
- "text": "void"
12443
- }
12444
- },
12445
- "parameters": [
12446
- {
12447
- "name": "form",
12448
- "type": {
12449
- "text": "HTMLFormElement | null"
12450
- }
12451
- }
12452
- ],
12453
- "description": "Called by the browser when the control's form changes: watches the new\nform's `checkValidity()`, as connecting does for the form it starts in."
13698
+ "description": "Stops listening for the labels in this control's tree.",
13699
+ "inheritedFrom": {
13700
+ "name": "HelixFormElementBase",
13701
+ "module": "src/helix-form-element/helix-form-element-base.ts"
13702
+ }
12454
13703
  },
12455
13704
  {
12456
13705
  "kind": "field",
@@ -12467,6 +13716,10 @@
12467
13716
  "url": "https://html.spec.whatwg.org/multipage/custom-elements.html#form-associated-custom-elements"
12468
13717
  }
12469
13718
  ]
13719
+ },
13720
+ "inheritedFrom": {
13721
+ "name": "HelixFormElementBase",
13722
+ "module": "src/helix-form-element/helix-form-element-base.ts"
12470
13723
  }
12471
13724
  },
12472
13725
  {
@@ -12484,6 +13737,10 @@
12484
13737
  "url": "https://html.spec.whatwg.org/multipage/custom-elements.html#form-associated-custom-elements"
12485
13738
  }
12486
13739
  ]
13740
+ },
13741
+ "inheritedFrom": {
13742
+ "name": "HelixFormElementBase",
13743
+ "module": "src/helix-form-element/helix-form-element-base.ts"
12487
13744
  }
12488
13745
  },
12489
13746
  {
@@ -12785,6 +14042,21 @@
12785
14042
  "module": "src/helix-element/helix-element.ts"
12786
14043
  }
12787
14044
  },
14045
+ {
14046
+ "kind": "field",
14047
+ "name": "markRules",
14048
+ "type": {
14049
+ "text": "readonly string[]"
14050
+ },
14051
+ "privacy": "protected",
14052
+ "static": true,
14053
+ "default": "[]",
14054
+ "description": "The rules from `mark-rules.ts` for the marks this element writes in its\nown shadow root: `data-scroller`, `data-virtual`, `data-spoken` and\n`data-mirror`.\n\nA component that writes a mark names its rule here, and a subclass\ninherits the list. One that writes none takes only the three rules every\nshadow root gets, which is what keeps the other four out of a Button.",
14055
+ "inheritedFrom": {
14056
+ "name": "HelixElement",
14057
+ "module": "src/helix-element/helix-element.ts"
14058
+ }
14059
+ },
12788
14060
  {
12789
14061
  "kind": "method",
12790
14062
  "name": "finalizeStyles",
@@ -12804,7 +14076,7 @@
12804
14076
  }
12805
14077
  }
12806
14078
  ],
12807
- "description": "Prepends the shadow-root reset to every subclass's styles, so no component\nhas to remember to include it.",
14079
+ "description": "Prepends the shadow-root reset to every subclass's styles, so no component\nhas to remember to include it, with the rules for the marks it writes.",
12808
14080
  "inheritedFrom": {
12809
14081
  "name": "HelixElement",
12810
14082
  "module": "src/helix-element/helix-element.ts"
@@ -12812,6 +14084,17 @@
12812
14084
  }
12813
14085
  ],
12814
14086
  "events": [],
14087
+ "superclass": {
14088
+ "name": "HelixFormElementBase",
14089
+ "module": "/src/helix-form-element/helix-form-element-base.js"
14090
+ },
14091
+ "summary": "Base for every element that participates in a form and judges what it holds.",
14092
+ "helix": {
14093
+ "since": "0.1.0",
14094
+ "status": "experimental",
14095
+ "documentation": "https://fusion.dev/helix/docs/tiers",
14096
+ "tier": "core"
14097
+ },
12815
14098
  "attributes": [
12816
14099
  {
12817
14100
  "name": "disabled",
@@ -12820,7 +14103,11 @@
12820
14103
  },
12821
14104
  "default": "false",
12822
14105
  "description": "Whether the control is disabled and cannot be used.\n\nReflected, because the styled tier selects on it, and mirrored to\n`aria-disabled` rather than removing the element from the accessibility\ntree, so a screen reader can still announce that the control exists.\n\nThe mirror itself is in `willUpdate` below, here rather than in each\ncontrol, because here is where `disabled` is.",
12823
- "fieldName": "disabled"
14106
+ "fieldName": "disabled",
14107
+ "inheritedFrom": {
14108
+ "name": "HelixFormElementBase",
14109
+ "module": "src/helix-form-element/helix-form-element-base.ts"
14110
+ }
12824
14111
  },
12825
14112
  {
12826
14113
  "name": "name",
@@ -12829,20 +14116,13 @@
12829
14116
  },
12830
14117
  "default": "''",
12831
14118
  "description": "The name the control's value is submitted under.\n\n**Reflected, and it is the exception to \"reflect only what CSS selects\non\".** The platform builds a form's entry list from the `name` *content\nattribute*, not from the property, so a control named through the property\nsubmitted under no name at all and was silently dropped. Measured: two\ninputs in one form, one named by attribute and one by property, and the\nform carried a single entry.\n\nSafe for a React consumer, which is what the rule is protecting: React\nrenders a custom element's props as attributes on the server, so the name\nis already in the markup being hydrated and reflecting it writes what is\nthere. It is only a change to the markup when a consumer assigns it\nimperatively later, and nothing is hydrating by then.\n\nHere rather than on each control.",
12832
- "fieldName": "name"
14119
+ "fieldName": "name",
14120
+ "inheritedFrom": {
14121
+ "name": "HelixFormElementBase",
14122
+ "module": "src/helix-form-element/helix-form-element-base.ts"
14123
+ }
12833
14124
  }
12834
14125
  ],
12835
- "superclass": {
12836
- "name": "HelixElement",
12837
- "module": "/src/helix-element/helix-element.js"
12838
- },
12839
- "summary": "Base for every element that participates in a form.",
12840
- "helix": {
12841
- "since": "0.1.0",
12842
- "status": "experimental",
12843
- "documentation": "https://fusion.dev/helix/docs/tiers",
12844
- "tier": "core"
12845
- },
12846
14126
  "cssStates": [
12847
14127
  {
12848
14128
  "description": "Set one frame after the first render. Transitions wait for it, so an element does not animate its own arrival.",
@@ -13615,6 +14895,14 @@
13615
14895
  "module": "./controllers/virtualize-controller/virtualize-controller.js"
13616
14896
  }
13617
14897
  },
14898
+ {
14899
+ "kind": "js",
14900
+ "name": "Waterfall",
14901
+ "declaration": {
14902
+ "name": "Waterfall",
14903
+ "module": "./controllers/virtualize-controller/waterfall.js"
14904
+ }
14905
+ },
13618
14906
  {
13619
14907
  "kind": "js",
13620
14908
  "name": "eventsForTag",
@@ -14815,6 +16103,38 @@
14815
16103
  "module": "./helix-element/helix-element.js"
14816
16104
  }
14817
16105
  },
16106
+ {
16107
+ "kind": "js",
16108
+ "name": "MIRROR_RULE",
16109
+ "declaration": {
16110
+ "name": "MIRROR_RULE",
16111
+ "module": "./helix-element/mark-rules.js"
16112
+ }
16113
+ },
16114
+ {
16115
+ "kind": "js",
16116
+ "name": "SCROLLER_RULE",
16117
+ "declaration": {
16118
+ "name": "SCROLLER_RULE",
16119
+ "module": "./helix-element/mark-rules.js"
16120
+ }
16121
+ },
16122
+ {
16123
+ "kind": "js",
16124
+ "name": "SPOKEN_RULE",
16125
+ "declaration": {
16126
+ "name": "SPOKEN_RULE",
16127
+ "module": "./helix-element/mark-rules.js"
16128
+ }
16129
+ },
16130
+ {
16131
+ "kind": "js",
16132
+ "name": "VIRTUAL_RULE",
16133
+ "declaration": {
16134
+ "name": "VIRTUAL_RULE",
16135
+ "module": "./helix-element/mark-rules.js"
16136
+ }
16137
+ },
14818
16138
  {
14819
16139
  "kind": "js",
14820
16140
  "name": "HelixFormElement",
@@ -14823,6 +16143,14 @@
14823
16143
  "module": "./helix-form-element/helix-form-element.js"
14824
16144
  }
14825
16145
  },
16146
+ {
16147
+ "kind": "js",
16148
+ "name": "HelixFormElementBase",
16149
+ "declaration": {
16150
+ "name": "HelixFormElementBase",
16151
+ "module": "./helix-form-element/helix-form-element-base.js"
16152
+ }
16153
+ },
14826
16154
  {
14827
16155
  "kind": "js",
14828
16156
  "name": "MixinChartSource",
@@ -24789,7 +26117,7 @@
24789
26117
  }
24790
26118
  }
24791
26119
  ],
24792
- "description": "Warns once, through the runtime channel, when a control has no accessible\nname: none on the host, and none on the control inside it.\n\n**Read a task after the control first renders**, so a label that arrives in\nthe same pass counts: slotted, written by a framework beside the control, or\nforwarded from a `<label for>`. One timer serves every control that asked in\nthat task, and an element is read once in its life, so a name taken away\nlater is not reported.\n\n**In a development build only.** Every field and Button calls it, so in\nproduction it would cost each of them about 450 bytes gzip for a sentence\nmeant for the person writing the page. Core imports it as `#audit-name`,\nwhich `package.json` resolves here under the `development` condition (Vite\nand webpack in development, `bun --conditions development`,\n`node --conditions=development`) and to `audit-name-off.ts`, which does\nnothing, everywhere else. Like every runtime warning it reports through the\none channel, and a project that wants the console quiet tells\n`@fusion.dev/helix-diagnostics` with `core.warnings: false`.\n\n`control` returns the control inside the host, `null` where the host is the\ncontrol, or `undefined` where the control is not drawn at the moment of the\nread: the host is then read again the next time it asks.\n\n`also` answers for a name the component gave through its internals, which no\nattribute shows. `fix` is the sentence that says how to name it. `shown` is\nthe part where the control shows its value or its placeholder, whose words\nare no name."
26120
+ "description": "Warns once, through the runtime channel, when a control has no accessible\nname: none on the host, and none on the control inside it.\n\n**Read a task after the control first renders**, so a label that arrives in\nthe same pass counts: slotted, written by a framework beside the control, or\nforwarded from a `<label for>`. One timer serves every control that asked in\nthat task, and an element is read once in its life, so a name taken away\nlater is not reported.\n\n**In a development build only.** Every field and Button calls it, so in\nproduction it would cost each of them about 450 bytes gzip for a sentence\nmeant for the person writing the page. Core imports it as `#audit-name`,\nwhich `package.json` resolves here under the `development` condition (Vite\nand webpack in development, `bun --conditions development`,\n`node --conditions=development`) and to `audit-name-off.ts`, which does\nnothing, everywhere else. Like every runtime warning it reports through the\none channel, and a project that wants the console quiet tells\n`@fusion.dev/helix-diagnostics` with `core.warnings: false`.\n\n`control` returns the control inside the host, `null` where the host is the\ncontrol, or `undefined` where the control is not drawn at the moment of the\nread: the host is then read again the next time it asks.\n\n`also` answers for a name the component gave through its internals, which no\nattribute shows. `fix` is the sentence that says how to name it, or its key\nin `FIXES`. `shown` is the part where the control shows its value or its\nplaceholder, whose words are no name."
24793
26121
  }
24794
26122
  ],
24795
26123
  "exports": [
@@ -34094,7 +35422,7 @@
34094
35422
  "type": {
34095
35423
  "text": "string"
34096
35424
  },
34097
- "default": "'0.182.1'",
35425
+ "default": "'0.183.0'",
34098
35426
  "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."
34099
35427
  }
34100
35428
  ],
@@ -34730,6 +36058,6 @@
34730
36058
  ],
34731
36059
  "helix": {
34732
36060
  "package": "@fusion.dev/helix-core",
34733
- "version": "0.182.1"
36061
+ "version": "0.183.0"
34734
36062
  }
34735
36063
  }