@fusion.dev/helix-core 0.223.1 → 0.225.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 (235) hide show
  1. package/custom-elements.json +1 -1
  2. package/dist/controllers/reorder-controller/reorder-controller.js +2 -3
  3. package/dist/events/before-activate.d.ts +3 -1
  4. package/dist/events/before-change.d.ts +2 -0
  5. package/dist/events/before-check.d.ts +31 -0
  6. package/dist/events/before-check.js +11 -0
  7. package/dist/events/before-close.d.ts +5 -1
  8. package/dist/events/before-filter.d.ts +17 -0
  9. package/dist/events/before-filter.js +11 -0
  10. package/dist/events/before-listen.d.ts +5 -1
  11. package/dist/events/before-navigate.d.ts +16 -0
  12. package/dist/events/before-navigate.js +11 -0
  13. package/dist/events/before-open.d.ts +2 -0
  14. package/dist/events/before-pin.d.ts +5 -1
  15. package/dist/events/before-reorder.d.ts +2 -0
  16. package/dist/events/before-resize.d.ts +5 -1
  17. package/dist/events/before-select.d.ts +19 -0
  18. package/dist/events/before-select.js +11 -0
  19. package/dist/events/before-sort.d.ts +19 -0
  20. package/dist/events/before-sort.js +11 -0
  21. package/dist/events/check.d.ts +15 -0
  22. package/dist/events/{caret.js → check.js} +3 -3
  23. package/dist/events/details.d.ts +11 -514
  24. package/dist/events/events.d.ts +27 -170
  25. package/dist/events/events.js +13 -165
  26. package/dist/events/expand.d.ts +2 -1
  27. package/dist/events/filter.d.ts +3 -4
  28. package/dist/events/filter.js +1 -1
  29. package/dist/events/found.d.ts +1 -1
  30. package/dist/events/names.d.ts +5 -16
  31. package/dist/events/names.js +11 -15
  32. package/dist/events/navigate.d.ts +3 -5
  33. package/dist/events/navigate.js +1 -1
  34. package/dist/events/reorder.d.ts +12 -13
  35. package/dist/events/reorder.js +1 -1
  36. package/dist/events/select.d.ts +4 -4
  37. package/dist/events/select.js +1 -1
  38. package/dist/events/sort.d.ts +3 -9
  39. package/dist/events/sort.js +1 -1
  40. package/dist/helix-element/helix-element.d.ts +31 -14
  41. package/dist/helix-element/helix-element.js +25 -3
  42. package/dist/helix-element/react-audit-off.d.ts +3 -1
  43. package/dist/helix-element/react-audit-off.js +1 -0
  44. package/dist/helix-element/react-audit.d.ts +22 -0
  45. package/dist/helix-element/react-audit.js +18 -0
  46. package/dist/helix-element/react-bridge.d.ts +34 -1
  47. package/dist/helix-element/react-bridge.js +33 -9
  48. package/dist/helix-element/react-root.d.ts +2 -0
  49. package/dist/helix-element/react-root.js +9 -0
  50. package/dist/helix-form-element/helix-form-element-base.js +12 -12
  51. package/dist/helix-form-element/helix-form-element.js +4 -3
  52. package/dist/index.d.ts +4 -2
  53. package/dist/index.js +4 -2
  54. package/dist/mixins/mixin-controller-checked/mixin-controller-checked.d.ts +3 -3
  55. package/dist/mixins/mixin-controller-checked/mixin-controller-checked.js +2 -2
  56. package/dist/mixins/mixin-field/mixin-field.js +9 -8
  57. package/dist/mixins/mixin-picker-feedback/mixin-picker-feedback.js +3 -2
  58. package/dist/mixins/mixin-picker-field/mixin-picker-field.js +4 -3
  59. package/dist/mixins/mixin-segmented-field/mixin-segmented-field.js +5 -4
  60. package/dist/mixins/mixin-selectable-item/mixin-selectable-item.d.ts +1 -1
  61. package/dist/mixins/mixin-selectable-item/mixin-selectable-item.js +2 -2
  62. package/dist/utils/audit-children/audit-children.d.ts +1 -1
  63. package/dist/utils/audit-name/audit-name.js +12 -1
  64. package/dist/utils/controls/controls.js +6 -1
  65. package/dist/utils/draw-icon/draw-icon.d.ts +1 -1
  66. package/dist/utils/follow-link/follow-link.d.ts +1 -1
  67. package/dist/utils/report-runtime/report-runtime.d.ts +5 -0
  68. package/dist/utils/tell-disclosure/tell-disclosure.d.ts +6 -3
  69. package/dist/utils/ticker/ticker.d.ts +5 -0
  70. package/dist/version.d.ts +4 -5
  71. package/dist/version.js +1 -1
  72. package/package.json +6 -6
  73. package/dist/events/action.d.ts +0 -12
  74. package/dist/events/action.js +0 -6
  75. package/dist/events/aura-fallback.d.ts +0 -12
  76. package/dist/events/aura-fallback.js +0 -11
  77. package/dist/events/band.d.ts +0 -13
  78. package/dist/events/band.js +0 -11
  79. package/dist/events/before-collapse.d.ts +0 -6
  80. package/dist/events/before-collapse.js +0 -11
  81. package/dist/events/before-edit.d.ts +0 -6
  82. package/dist/events/before-edit.js +0 -11
  83. package/dist/events/before-move.d.ts +0 -17
  84. package/dist/events/before-move.js +0 -11
  85. package/dist/events/before-panel-resize.d.ts +0 -13
  86. package/dist/events/before-panel-resize.js +0 -11
  87. package/dist/events/before-paste.d.ts +0 -13
  88. package/dist/events/before-paste.js +0 -11
  89. package/dist/events/before-reconnect.d.ts +0 -14
  90. package/dist/events/before-reconnect.js +0 -11
  91. package/dist/events/before-relabel.d.ts +0 -15
  92. package/dist/events/before-relabel.js +0 -11
  93. package/dist/events/before-split.d.ts +0 -12
  94. package/dist/events/before-split.js +0 -11
  95. package/dist/events/before-toggle.d.ts +0 -23
  96. package/dist/events/before-toggle.js +0 -11
  97. package/dist/events/canvas-edit.d.ts +0 -16
  98. package/dist/events/canvas-edit.js +0 -11
  99. package/dist/events/canvas-pan.d.ts +0 -13
  100. package/dist/events/canvas-pan.js +0 -11
  101. package/dist/events/canvas-view.d.ts +0 -14
  102. package/dist/events/canvas-view.js +0 -11
  103. package/dist/events/canvas-zoom.d.ts +0 -6
  104. package/dist/events/canvas-zoom.js +0 -11
  105. package/dist/events/caret.d.ts +0 -17
  106. package/dist/events/collapse.d.ts +0 -12
  107. package/dist/events/collapse.js +0 -11
  108. package/dist/events/connect.d.ts +0 -14
  109. package/dist/events/connect.js +0 -11
  110. package/dist/events/console.d.ts +0 -13
  111. package/dist/events/console.js +0 -11
  112. package/dist/events/create.d.ts +0 -18
  113. package/dist/events/create.js +0 -11
  114. package/dist/events/device-button.d.ts +0 -14
  115. package/dist/events/device-button.js +0 -11
  116. package/dist/events/device-key.d.ts +0 -16
  117. package/dist/events/device-key.js +0 -11
  118. package/dist/events/device-screenshot.d.ts +0 -13
  119. package/dist/events/device-screenshot.js +0 -10
  120. package/dist/events/device-scroll.d.ts +0 -14
  121. package/dist/events/device-scroll.js +0 -11
  122. package/dist/events/device-swipe.d.ts +0 -15
  123. package/dist/events/device-swipe.js +0 -11
  124. package/dist/events/device-tap.d.ts +0 -13
  125. package/dist/events/device-tap.js +0 -11
  126. package/dist/events/device-text.d.ts +0 -13
  127. package/dist/events/device-text.js +0 -11
  128. package/dist/events/device-touch.d.ts +0 -15
  129. package/dist/events/device-touch.js +0 -11
  130. package/dist/events/edit.d.ts +0 -12
  131. package/dist/events/edit.js +0 -11
  132. package/dist/events/end.d.ts +0 -9
  133. package/dist/events/end.js +0 -6
  134. package/dist/events/facet.d.ts +0 -17
  135. package/dist/events/facet.js +0 -11
  136. package/dist/events/filtered.d.ts +0 -12
  137. package/dist/events/filtered.js +0 -11
  138. package/dist/events/graph-filter.d.ts +0 -10
  139. package/dist/events/graph-filter.js +0 -11
  140. package/dist/events/graph-layout.d.ts +0 -10
  141. package/dist/events/graph-layout.js +0 -11
  142. package/dist/events/graph-pan.d.ts +0 -9
  143. package/dist/events/graph-pan.js +0 -11
  144. package/dist/events/graph-part-change.d.ts +0 -10
  145. package/dist/events/graph-part-change.js +0 -11
  146. package/dist/events/graph-ready.d.ts +0 -8
  147. package/dist/events/graph-ready.js +0 -6
  148. package/dist/events/graph-signal.d.ts +0 -11
  149. package/dist/events/graph-signal.js +0 -11
  150. package/dist/events/graph-zoom.d.ts +0 -6
  151. package/dist/events/graph-zoom.js +0 -11
  152. package/dist/events/history.d.ts +0 -16
  153. package/dist/events/history.js +0 -11
  154. package/dist/events/map-cluster.d.ts +0 -15
  155. package/dist/events/map-cluster.js +0 -11
  156. package/dist/events/map-pan.d.ts +0 -18
  157. package/dist/events/map-pan.js +0 -11
  158. package/dist/events/map-part-change.d.ts +0 -16
  159. package/dist/events/map-part-change.js +0 -11
  160. package/dist/events/map-ready.d.ts +0 -15
  161. package/dist/events/map-ready.js +0 -6
  162. package/dist/events/map-rotate.d.ts +0 -9
  163. package/dist/events/map-rotate.js +0 -11
  164. package/dist/events/map-tilt.d.ts +0 -9
  165. package/dist/events/map-tilt.js +0 -11
  166. package/dist/events/map-zoom.d.ts +0 -13
  167. package/dist/events/map-zoom.js +0 -11
  168. package/dist/events/move.d.ts +0 -11
  169. package/dist/events/move.js +0 -11
  170. package/dist/events/next.d.ts +0 -23
  171. package/dist/events/next.js +0 -11
  172. package/dist/events/panel-resize.d.ts +0 -12
  173. package/dist/events/panel-resize.js +0 -11
  174. package/dist/events/pasted.d.ts +0 -6
  175. package/dist/events/pasted.js +0 -11
  176. package/dist/events/press.d.ts +0 -19
  177. package/dist/events/press.js +0 -11
  178. package/dist/events/preview.d.ts +0 -14
  179. package/dist/events/preview.js +0 -11
  180. package/dist/events/previous.d.ts +0 -6
  181. package/dist/events/previous.js +0 -11
  182. package/dist/events/range-change.d.ts +0 -10
  183. package/dist/events/range-change.js +0 -11
  184. package/dist/events/read.d.ts +0 -19
  185. package/dist/events/read.js +0 -11
  186. package/dist/events/reconnect.d.ts +0 -6
  187. package/dist/events/reconnect.js +0 -11
  188. package/dist/events/reject.d.ts +0 -13
  189. package/dist/events/reject.js +0 -11
  190. package/dist/events/relabel.d.ts +0 -6
  191. package/dist/events/relabel.js +0 -11
  192. package/dist/events/remove.d.ts +0 -12
  193. package/dist/events/remove.js +0 -11
  194. package/dist/events/reordered.d.ts +0 -12
  195. package/dist/events/reordered.js +0 -11
  196. package/dist/events/sample-end.d.ts +0 -5
  197. package/dist/events/sample-end.js +0 -6
  198. package/dist/events/sample-start.d.ts +0 -18
  199. package/dist/events/sample-start.js +0 -6
  200. package/dist/events/scrolled.d.ts +0 -32
  201. package/dist/events/scrolled.js +0 -11
  202. package/dist/events/selected.d.ts +0 -12
  203. package/dist/events/selected.js +0 -11
  204. package/dist/events/send.d.ts +0 -18
  205. package/dist/events/send.js +0 -11
  206. package/dist/events/shortcut.d.ts +0 -13
  207. package/dist/events/shortcut.js +0 -11
  208. package/dist/events/sorted.d.ts +0 -15
  209. package/dist/events/sorted.js +0 -11
  210. package/dist/events/split.d.ts +0 -12
  211. package/dist/events/split.js +0 -11
  212. package/dist/events/stop.d.ts +0 -12
  213. package/dist/events/stop.js +0 -6
  214. package/dist/events/strands-fallback.d.ts +0 -13
  215. package/dist/events/strands-fallback.js +0 -11
  216. package/dist/events/terminal-bell.d.ts +0 -13
  217. package/dist/events/terminal-bell.js +0 -6
  218. package/dist/events/terminal-input.d.ts +0 -14
  219. package/dist/events/terminal-input.js +0 -11
  220. package/dist/events/terminal-link.d.ts +0 -15
  221. package/dist/events/terminal-link.js +0 -11
  222. package/dist/events/terminal-resize.d.ts +0 -13
  223. package/dist/events/terminal-resize.js +0 -11
  224. package/dist/events/terminal-restart.d.ts +0 -11
  225. package/dist/events/terminal-restart.js +0 -10
  226. package/dist/events/terminal-title.d.ts +0 -12
  227. package/dist/events/terminal-title.js +0 -11
  228. package/dist/events/toggle.d.ts +0 -15
  229. package/dist/events/toggle.js +0 -11
  230. package/dist/events/tour-ask.d.ts +0 -16
  231. package/dist/events/tour-ask.js +0 -11
  232. package/dist/events/tour-status.d.ts +0 -14
  233. package/dist/events/tour-status.js +0 -11
  234. package/dist/events/typing.d.ts +0 -10
  235. package/dist/events/typing.js +0 -11
@@ -1,11 +1,9 @@
1
1
  import type { NavigateDetail } from './details.js';
2
2
  /**
3
- * Fired when a component moves the view it is showing, rather than its value.
3
+ * A component moved the view it is showing.
4
4
  *
5
- * A calendar paging to another month is not choosing a date, and the two have
6
- * to be separable: a consumer driving the view needs to hear that it moved
7
- * without being told the answer changed. `helix-change` belongs to the value,
8
- * and giving it both jobs would make either one unusable on its own.
5
+ * The notification after `helix-before-navigate`, sent once the view has moved,
6
+ * with where it is now. Not cancelable: the decision was the request's.
9
7
  */
10
8
  export declare class HelixNavigateEvent extends CustomEvent<NavigateDetail> {
11
9
  static readonly eventName = "helix-navigate";
@@ -3,7 +3,7 @@ export class HelixNavigateEvent extends CustomEvent {
3
3
  constructor(detail) {
4
4
  super(HelixNavigateEvent.eventName, {
5
5
  bubbles: true,
6
- cancelable: true,
6
+ cancelable: false,
7
7
  composed: true,
8
8
  detail,
9
9
  });
@@ -1,22 +1,21 @@
1
1
  import type { ReorderDetail } from './details.js';
2
2
  /**
3
- * Fired when you ask for a row, an item, or a column to move to a new place.
3
+ * A row, an item, or a column moved to a new place.
4
4
  *
5
- * **For rows and items, you move them.** Helix moves no element it does not
6
- * own, so a list or a data table sends this after `helix-before-reorder`, and
7
- * you move your data to the order in `keys`. Calling `preventDefault()` says
8
- * the move did not happen, and the element tells a screen reader it was
9
- * canceled.
5
+ * The notification after `helix-before-reorder`, with every key in the new
6
+ * order. Not cancelable: the decision was the request's.
10
7
  *
11
- * **For Data Table's columns, the table moves them.** Calling
12
- * `preventDefault()` leaves the columns where they were, so you can store the
13
- * order in a URL or a preference and decide it yourself, the way a server-side
14
- * sort takes `helix-sort`. `value` is the whole order as fields separated by
15
- * spaces, which is what `order` takes.
8
+ * **For rows and items, you move them.** Helix moves no element it does not own,
9
+ * so a list or a data table sends this once the move stands, and you move your
10
+ * data to the order in `keys`.
11
+ *
12
+ * **For Data Table's columns, the table has moved them** by the time this
13
+ * arrives, and `value` is the whole order as fields separated by spaces, which
14
+ * is what `order` holds.
16
15
  *
17
16
  * `kind` says which of the three moved, since a data table sends this for its
18
- * rows and for its columns. `helix-sort` orders rows by a column, and this
19
- * moves one row or column by hand.
17
+ * rows and for its columns. `helix-sort` reports rows ordered by a column, and
18
+ * this reports one row or column moved by hand.
20
19
  */
21
20
  export declare class HelixReorderEvent extends CustomEvent<ReorderDetail> {
22
21
  static readonly eventName = "helix-reorder";
@@ -3,7 +3,7 @@ export class HelixReorderEvent extends CustomEvent {
3
3
  constructor(detail) {
4
4
  super(HelixReorderEvent.eventName, {
5
5
  bubbles: true,
6
- cancelable: true,
6
+ cancelable: false,
7
7
  composed: true,
8
8
  detail,
9
9
  });
@@ -1,10 +1,10 @@
1
1
  import type { SelectDetail } from './details.js';
2
2
  /**
3
- * Fired when the reader selects an item in a set.
3
+ * A set holds a different selection.
4
4
  *
5
- * Bubbles and is composed, because this is how a set coordinates: a tree, a
6
- * tab list and a toggle group all learn which of their children was chosen by
7
- * hearing it arrive.
5
+ * The notification after a `helix-before-select` that asked to change what is
6
+ * selected, sent once the selection has moved, with the selection now in
7
+ * force. Not cancelable: the decision was the request's.
8
8
  */
9
9
  export declare class HelixSelectEvent extends CustomEvent<SelectDetail> {
10
10
  static readonly eventName = "helix-select";
@@ -3,7 +3,7 @@ export class HelixSelectEvent extends CustomEvent {
3
3
  constructor(detail) {
4
4
  super(HelixSelectEvent.eventName, {
5
5
  bubbles: true,
6
- cancelable: true,
6
+ cancelable: false,
7
7
  composed: true,
8
8
  detail,
9
9
  });
@@ -1,15 +1,9 @@
1
1
  import type { SortDetail } from './details.js';
2
2
  /**
3
- * Fired when the reader asks for a different order.
3
+ * The rows are in a different order.
4
4
  *
5
- * Cancelable, and refusing it leaves the order alone, which is what makes a
6
- * server-side sort expressible: the consumer refuses the local reorder, fetches,
7
- * and hands back a new set. This is the element reporting that a heading was
8
- * clicked, before it acts on it.
9
- *
10
- * Not `helix-change`: nothing about the data changed, only the order it is read
11
- * in, and a consumer listening for changes to a value should not hear a sort.
12
- * That is the same distinction `helix-filter` is drawn on.
5
+ * The notification after `helix-before-sort`, sent once `sort` has moved, with
6
+ * the order now in force. Not cancelable: the decision was the request's.
13
7
  */
14
8
  export declare class HelixSortEvent extends CustomEvent<SortDetail> {
15
9
  static readonly eventName = "helix-sort";
@@ -3,7 +3,7 @@ export class HelixSortEvent extends CustomEvent {
3
3
  constructor(detail) {
4
4
  super(HelixSortEvent.eventName, {
5
5
  bubbles: true,
6
- cancelable: true,
6
+ cancelable: false,
7
7
  composed: true,
8
8
  detail,
9
9
  });
@@ -1,5 +1,22 @@
1
1
  import { type CSSResultOrNative, LitElement, type PropertyValues } from 'lit';
2
2
  import type { StaticValue } from 'lit/static-html.js';
3
+ /**
4
+ * @internal The `ElementInternals` an element attached: the role, the name,
5
+ * the states and the form value it sets without touching the DOM.
6
+ *
7
+ * **Off the element, as the platform means them to be.** `attachInternals`
8
+ * throws on a second call so that only the element holds its internals. Kept
9
+ * on the element as a property, `protected` in the types and a plain field at
10
+ * run time, any script could call `element.internals.setFormValue()` or set
11
+ * its role. The headless and styled tiers subclass this class from other
12
+ * packages, so no member is private to every class that needs them; a
13
+ * module-scoped map takes them off the element's surface, and this is how a
14
+ * subclass reaches its own.
15
+ *
16
+ * Available during server rendering. Lit's shim implements `attachInternals`,
17
+ * so nothing here needs a guard.
18
+ */
19
+ export declare const internalsOf: (element: HelixElement) => ElementInternals;
3
20
  /**
4
21
  * @summary Base class every Helix element extends.
5
22
  *
@@ -84,19 +101,6 @@ export declare class HelixElement extends LitElement {
84
101
  * rather than a null an optional chain swallows.
85
102
  */
86
103
  protected partNamed<T extends Element = HTMLElement>(name: string): T | null;
87
- /**
88
- * The element's semantics, set without touching the DOM.
89
- *
90
- * `ElementInternals` sets the implicit role, which an author's own `role`
91
- * attribute still overrides, and it writes no attribute. Setting `role` on the
92
- * host directly would: that is an attribute the element gives itself after it
93
- * upgrades, which a React consumer's server markup never had, and hydration
94
- * reports it as a mismatch.
95
- *
96
- * Available during server rendering. Lit's shim implements `attachInternals`,
97
- * so nothing here needs a guard.
98
- */
99
- protected readonly internals: ElementInternals;
100
104
  /**
101
105
  * Records a boolean fact about this element as a custom state.
102
106
  *
@@ -288,6 +292,19 @@ export declare class HelixElement extends LitElement {
288
292
  * shadow root gets, which is what keeps the other four out of a Button.
289
293
  */
290
294
  protected static markRules: readonly string[];
295
+ /**
296
+ * Each attribute Lit observes, and each camelCase property's name in lower
297
+ * case.
298
+ *
299
+ * React writes an attribute for a prop on an element that is not defined yet,
300
+ * and on a server, and HTML lowers its name. So `defaultPosition={16}` arrives
301
+ * as `defaultposition`, which names no property Lit knows, and the value was
302
+ * dropped with no error. `attributeChangedCallback` reads the lowered name as
303
+ * the property's own attribute, so either spelling works in either order.
304
+ */
305
+ static get observedAttributes(): string[];
306
+ /** @internal Called by the browser when an observed attribute changes. */
307
+ attributeChangedCallback(name: string, old: string | null, value: string | null): void;
291
308
  /**
292
309
  * Prepends the shadow-root reset to every subclass's styles, so no component
293
310
  * has to remember to include it, with the rules for the marks it writes.
@@ -312,7 +329,7 @@ export declare class HelixElement extends LitElement {
312
329
  * **Before the render, because `firstUpdated` is too late.** A value
313
330
  * assigned there schedules a second update as the first one finishes, which
314
331
  * Lit's development build reports as `change-in-update`: Command's
315
- * `filterMatch` did in the Hartley app until October 14, 2026. A hydrating
332
+ * `filterMatch` did in a desktop app until October 14, 2026. A hydrating
316
333
  * render has to be the server's, so that element looks in `firstUpdated`,
317
334
  * where `finishHydration` asks for the update after it anyway.
318
335
  */
@@ -7,6 +7,9 @@ const BOX_SIZING = '*,::before,::after{box-sizing:border-box}';
7
7
  const HIDDEN = ":host([hidden]:not([hidden='until-found'])){display:none}";
8
8
  const SETTLED = ':host(:not(:state(settled))),:host(:not(:state(settled))) *{transition:none!important}';
9
9
  const BASE = unsafeCSS(BOX_SIZING + HIDDEN + SETTLED);
10
+ const attached = new WeakMap();
11
+ export const internalsOf = (element) => attached.get(element);
12
+ const LOWERED = new WeakMap();
10
13
  export class HelixElement extends LitElement {
11
14
  static { this.tier = 'helix-headless-'; }
12
15
  tag(name) {
@@ -22,8 +25,9 @@ export class HelixElement extends LitElement {
22
25
  : null;
23
26
  }
24
27
  toggleState(name, on) {
25
- if ('states' in this.internals) {
26
- this.internals.states[on ? 'add' : 'delete'](name);
28
+ const internals = internalsOf(this);
29
+ if ('states' in internals) {
30
+ internals.states[on ? 'add' : 'delete'](name);
27
31
  }
28
32
  }
29
33
  constructor() {
@@ -35,7 +39,7 @@ export class HelixElement extends LitElement {
35
39
  event.stopPropagation();
36
40
  }
37
41
  };
38
- this.internals = this.attachInternals();
42
+ attached.set(this, this.attachInternals());
39
43
  this.whenSettled = new Promise((resolve) => {
40
44
  this.resolveSettled = resolve;
41
45
  });
@@ -89,6 +93,24 @@ export class HelixElement extends LitElement {
89
93
  }));
90
94
  }
91
95
  static { this.markRules = []; }
96
+ static get observedAttributes() {
97
+ const attributes = super.observedAttributes;
98
+ const lowered = new Map();
99
+ for (const [name, options] of this.elementProperties) {
100
+ const attribute = options.attribute;
101
+ if (typeof name === 'string' && typeof attribute === 'string') {
102
+ const spelled = name.toLowerCase();
103
+ if (spelled !== attribute && !attributes.includes(spelled)) {
104
+ lowered.set(spelled, attribute);
105
+ }
106
+ }
107
+ }
108
+ LOWERED.set(this, lowered);
109
+ return [...attributes, ...lowered.keys()];
110
+ }
111
+ attributeChangedCallback(name, old, value) {
112
+ super.attributeChangedCallback(LOWERED.get(this.constructor)?.get(name) ?? name, old, value);
113
+ }
92
114
  static finalizeStyles(styles) {
93
115
  const marks = this.markRules;
94
116
  return [
@@ -1,4 +1,4 @@
1
- import type { auditReactProps as audit } from './react-audit.js';
1
+ import type { auditReactProps as audit, auditReactMissing as missing } from './react-audit.js';
2
2
  /**
3
3
  * The React prop audit in a production build: nothing.
4
4
  *
@@ -9,3 +9,5 @@ import type { auditReactProps as audit } from './react-audit.js';
9
9
  * `react-audit.ts`.
10
10
  */
11
11
  export declare const auditReactProps: typeof audit;
12
+ /** The missing-props error in a production build: nothing. See `react-audit.ts`. */
13
+ export declare const auditReactMissing: typeof missing;
@@ -1 +1,2 @@
1
1
  export const auditReactProps = () => { };
2
+ export const auditReactMissing = () => { };
@@ -18,3 +18,25 @@
18
18
  * binds it as an event named `:helix-open`.
19
19
  */
20
20
  export declare const auditReactProps: (host: EventTarget, props: Record<string, unknown>) => void;
21
+ /**
22
+ * Says so when React has a root on the page and no element found its props.
23
+ *
24
+ * **The bridge's one silent failure.** It finds React's props by a prefix of
25
+ * React's own, so the day React renames that key every `onhelix-*` handler on
26
+ * a server-rendered page is dead again, and every object property a server
27
+ * dropped stays unset, with nothing in the console. The bridge calls this for
28
+ * an element whose window closed in a document carrying React's root mark,
29
+ * where no element has found a props bag, with the window it looked for and
30
+ * the mark, whose suffix is that React's own.
31
+ *
32
+ * **Only for an element React renders.** It has to sit in the document's own
33
+ * tree, never in a shadow root, which is where Lit renders most of this
34
+ * library's elements and where React holds nothing, and under the node React
35
+ * made its root in. A page whose React island renders no Helix element keeps
36
+ * its static ones outside that node, and is told nothing.
37
+ *
38
+ * **An error, once a page.** It means the elements cannot work with the React
39
+ * installed, which is a failure of the page rather than advice, and it is
40
+ * printed as `console.error` so a run that fails on the console fails here.
41
+ */
42
+ export declare const auditReactMissing: (host: Node, window: number, mark: string) => void;
@@ -1,6 +1,7 @@
1
1
  import { eventsForTag } from '../events/element-events.js';
2
2
  import { helixEventNames } from '../events/names.js';
3
3
  import { reportRuntime } from '../utils/report-runtime/report-runtime.js';
4
+ import { insideReact } from './react-root.js';
4
5
  const audited = new WeakSet();
5
6
  const REMOVED = new Set(['onActiveChange', 'onCheckedChange', 'onOpenChange', 'onValueChange']);
6
7
  export const auditReactProps = (host, props) => {
@@ -54,3 +55,20 @@ export const auditReactProps = (host, props) => {
54
55
  }
55
56
  }
56
57
  };
58
+ const told = new Set();
59
+ export const auditReactMissing = (host, window, mark) => {
60
+ if (told.has(mark) || host.getRootNode() !== host.ownerDocument || !insideReact(host)) {
61
+ return;
62
+ }
63
+ told.add(mark);
64
+ reportRuntime({
65
+ kind: 'react-props-missing',
66
+ level: 'error',
67
+ message: `React has a root on this page, and no Helix element found the props React holds for it ` +
68
+ `within ${window} ms. Helix reads them under a key starting \`__reactProps$\`, and this ` +
69
+ 'React no longer writes one. `onhelix-*` handlers on a server-rendered page will not run, and ' +
70
+ 'object properties the server could not write will not arrive. Pin React to a version in the ' +
71
+ 'range https://fusion.dev/helix/docs/using-the-elements states, and report the one installed.',
72
+ tag: host instanceof Element ? host.localName : undefined,
73
+ });
74
+ };
@@ -18,11 +18,44 @@ export declare const reactPropsOf: (node: EventTarget) => Record<string, unknown
18
18
  * set.
19
19
  */
20
20
  export declare const lookForReact: (host: LitElement, applied: boolean) => void;
21
+ /**
22
+ * Resolves once React has hydrated an element, and soon after where React
23
+ * will not.
24
+ *
25
+ * **For a write onto markup a server rendered.** React compares a node's
26
+ * attributes with the server's as it begins hydrating that node, and writes
27
+ * the node's props as it completes it, after every node inside it. So once
28
+ * the element holds React's props, it and every node in it have been
29
+ * compared, and an attribute written then is no mismatch. Popover, Menu and
30
+ * Megamenu write `aria-expanded` onto a plain slotted trigger, and before
31
+ * October 25, 2026 they wrote it a frame after their first render. On a page
32
+ * whose definitions load before `hydrateRoot`, that frame came before React
33
+ * reached the trigger, and React reported "some attributes of the server
34
+ * rendered HTML didn't match the client properties", measured against React
35
+ * 19.3.1 with Megamenu and Popover.
36
+ *
37
+ * **A page whose mark has not arrived yet is waited for, for `LOOK_FOR`.** An
38
+ * app that defines the elements and calls `hydrateRoot` after a gap, an
39
+ * awaited import or a fetch, has no mark when the frame comes, and Megamenu
40
+ * and Popover were written to early on exactly such a page. So a page without
41
+ * the mark is looked at for the bridge's own window, and one that gains it is
42
+ * waited for as any other. A page that calls `hydrateRoot` later than that is
43
+ * still written to early, and a page without React pays the window once. On
44
+ * the site, which defers registration past hydration, React held the
45
+ * megamenu's props 7 to 33 ms after marking the page and 187 to 562 ms before
46
+ * the element's first frame, six loads, so it waits for nothing.
47
+ *
48
+ * Resolves for an element outside the node React renders into. Asked on the
49
+ * bridge's own interval, on a timer and never a frame, for the reason
50
+ * `LOOK_EVERY` gives.
51
+ */
52
+ export declare const untilReactHydrated: (host: Element) => Promise<void>;
21
53
  /**
22
54
  * The prop React would be holding for this event, if it is holding one.
23
55
  *
24
56
  * **A relayed native event needs a different answer from one of ours, and
25
- * getting it wrong doubles every call.** Measured against React 19.2.8:
57
+ * getting it wrong doubles every call.** Measured against React 19.3.1 on
58
+ * October 25, 2026, on a client mount, as it was on 19.2.8 before it:
26
59
  *
27
60
  * ```
28
61
  * onhelix-before-change <- helix-before-change REACHED (React binds it with addEventListener)
@@ -1,4 +1,5 @@
1
- import { auditReactProps } from '@fusion.dev/helix-core/audits/react';
1
+ import { auditReactMissing, auditReactProps } from '@fusion.dev/helix-core/audits/react';
2
+ import { insideReact } from './react-root.js';
2
3
  const REACT_PROPS = '__reactProps$';
3
4
  let reactPropsKey;
4
5
  export const reactPropsOf = (node) => {
@@ -15,17 +16,19 @@ export const reactPropsOf = (node) => {
15
16
  };
16
17
  const REACT_LISTENING = '_reactListening';
17
18
  const REACT_EVENTS = '__reactEvents$';
18
- const reactOnPage = (node) => Object.keys(node.ownerDocument ?? node).some((key) => key.startsWith(REACT_LISTENING) || key.startsWith(REACT_EVENTS));
19
+ const reactMarkOf = (node) => Object.keys(node.ownerDocument ?? node).find((key) => key.startsWith(REACT_LISTENING) || key.startsWith(REACT_EVENTS));
19
20
  const LOOK_EVERY = 16;
20
21
  const LOOK_FOR = 96;
21
22
  const looking = [];
23
+ const found = new Set();
22
24
  let ticks = 0;
23
25
  let booked = false;
24
- const take = (host, applied) => {
26
+ const take = (host, applied, mark) => {
25
27
  const props = reactPropsOf(host);
26
28
  if (props === undefined) {
27
29
  return false;
28
30
  }
31
+ found.add(mark);
29
32
  if (!applied) {
30
33
  applyReactProperties(host);
31
34
  }
@@ -37,17 +40,20 @@ const tick = () => {
37
40
  ticks += 1;
38
41
  const now = performance.now();
39
42
  let page;
40
- let react = false;
43
+ let mark;
41
44
  let kept = 0;
42
45
  for (const one of looking) {
43
46
  const own = one.host.ownerDocument ?? one.host;
44
47
  if (own !== page) {
45
48
  page = own;
46
- react = reactOnPage(one.host);
49
+ mark = reactMarkOf(one.host);
47
50
  }
48
- const done = (react && take(one.host, false)) ||
49
- (ticks - one.after >= LOOK_FOR / LOOK_EVERY && now - one.since >= LOOK_FOR);
50
- if (!done) {
51
+ const taken = mark !== undefined && take(one.host, false, mark);
52
+ const over = ticks - one.after >= LOOK_FOR / LOOK_EVERY && now - one.since >= LOOK_FOR;
53
+ if (!taken && over && mark !== undefined && !found.has(mark)) {
54
+ auditReactMissing(one.host, LOOK_FOR, mark);
55
+ }
56
+ if (!(taken || over)) {
51
57
  looking[kept] = one;
52
58
  kept += 1;
53
59
  }
@@ -62,11 +68,29 @@ const book = () => {
62
68
  }
63
69
  };
64
70
  export const lookForReact = (host, applied) => {
65
- if (!(reactOnPage(host) && take(host, applied))) {
71
+ const mark = reactMarkOf(host);
72
+ if (!(mark !== undefined && take(host, applied, mark))) {
66
73
  looking.push({ after: ticks, host, since: performance.now() });
67
74
  book();
68
75
  }
69
76
  };
77
+ const HYDRATION_BOUND = 5000;
78
+ export const untilReactHydrated = (host) => new Promise((done) => {
79
+ const since = performance.now();
80
+ const look = () => {
81
+ const waited = performance.now() - since;
82
+ const marked = reactMarkOf(host) !== undefined;
83
+ if ((!marked && waited >= LOOK_FOR) ||
84
+ reactPropsOf(host) !== undefined ||
85
+ (marked && !insideReact(host)) ||
86
+ waited >= HYDRATION_BOUND) {
87
+ done();
88
+ return;
89
+ }
90
+ setTimeout(look, LOOK_EVERY);
91
+ };
92
+ look();
93
+ });
70
94
  const REACT_WIRES = new Set(['scroll', 'scrollend']);
71
95
  export const reactPropFor = (event) => {
72
96
  if (event.type.includes('-')) {
@@ -0,0 +1,2 @@
1
+ /** Whether a node is in the tree React renders into, its root's container or below it. */
2
+ export declare const insideReact: (host: Node) => boolean;
@@ -0,0 +1,9 @@
1
+ const REACT_CONTAINER = '__reactContainer$';
2
+ export const insideReact = (host) => {
3
+ for (let node = host.parentNode; node !== null; node = node.parentNode) {
4
+ if (Object.keys(node).some((key) => key.startsWith(REACT_CONTAINER))) {
5
+ return true;
6
+ }
7
+ }
8
+ return false;
9
+ };
@@ -1,6 +1,6 @@
1
1
  import { __decorate } from "tslib";
2
2
  import { property, state } from 'lit/decorators.js';
3
- import { HelixElement } from '../helix-element/helix-element.js';
3
+ import { HelixElement, internalsOf } from '../helix-element/helix-element.js';
4
4
  import { watchLabels } from '../utils/watch-labels/watch-labels.js';
5
5
  const isTabStop = (element) => element instanceof HTMLElement &&
6
6
  element.tabIndex >= 0 &&
@@ -38,7 +38,7 @@ export class HelixFormElementBase extends HelixElement {
38
38
  }
39
39
  };
40
40
  this.refreshAnchor = () => {
41
- if (!this.internals.validity.valid) {
41
+ if (!internalsOf(this).validity.valid) {
42
42
  this.applyValidity();
43
43
  }
44
44
  };
@@ -67,22 +67,22 @@ export class HelixFormElementBase extends HelixElement {
67
67
  if (changed.get('disabled') === true && !this.disabled && this.isConnected) {
68
68
  this.formDisabled = this.heldByFieldset;
69
69
  }
70
- this.internals.ariaDisabled = this.isDisabled ? 'true' : null;
70
+ internalsOf(this).ariaDisabled = this.isDisabled ? 'true' : null;
71
71
  }
72
72
  applyValidity() {
73
73
  if (this.customValidity === '') {
74
- this.internals.setValidity({});
74
+ internalsOf(this).setValidity({});
75
75
  return;
76
76
  }
77
- this.internals.setValidity({ customError: true }, this.customValidity, this.focusTarget ?? undefined);
77
+ internalsOf(this).setValidity({ customError: true }, this.customValidity, this.focusTarget ?? undefined);
78
78
  }
79
79
  get validity() {
80
80
  this.runPendingUpdate();
81
- return this.internals.validity;
81
+ return internalsOf(this).validity;
82
82
  }
83
83
  get validationMessage() {
84
84
  this.runPendingUpdate();
85
- return this.internals.validationMessage;
85
+ return internalsOf(this).validationMessage;
86
86
  }
87
87
  performUpdate() {
88
88
  this.updateRunning = true;
@@ -99,16 +99,16 @@ export class HelixFormElementBase extends HelixElement {
99
99
  }
100
100
  }
101
101
  get willValidate() {
102
- return this.internals.willValidate;
102
+ return internalsOf(this).willValidate;
103
103
  }
104
104
  checkValidity() {
105
105
  this.runPendingUpdate();
106
- return this.internals.checkValidity();
106
+ return internalsOf(this).checkValidity();
107
107
  }
108
108
  reportValidity() {
109
109
  this.runPendingUpdate();
110
110
  this.applyValidity();
111
- return this.internals.reportValidity();
111
+ return internalsOf(this).reportValidity();
112
112
  }
113
113
  setCustomValidity(message) {
114
114
  this.customValidity = message;
@@ -150,10 +150,10 @@ export class HelixFormElementBase extends HelixElement {
150
150
  this.click();
151
151
  }
152
152
  get form() {
153
- return this.internals.form;
153
+ return internalsOf(this).form;
154
154
  }
155
155
  get labels() {
156
- return this.internals.labels;
156
+ return internalsOf(this).labels;
157
157
  }
158
158
  }
159
159
  __decorate([
@@ -1,3 +1,4 @@
1
+ import { internalsOf } from '../helix-element/helix-element.js';
1
2
  import { HelixFormElementBase } from './helix-form-element-base.js';
2
3
  const VALIDITY_FLAGS = [
3
4
  'badInput',
@@ -50,7 +51,7 @@ export class HelixFormElement extends HelixFormElementBase {
50
51
  this.reported = { anchor: undefined, flags: {}, message: '' };
51
52
  this.appliedFeedback = '';
52
53
  this.checkInProgress = false;
53
- const internals = this.internals;
54
+ const internals = internalsOf(this);
54
55
  const report = internals.setValidity.bind(internals);
55
56
  this.reportValidityTo = report;
56
57
  internals.setValidity = (flags, message, anchor) => {
@@ -90,7 +91,7 @@ export class HelixFormElement extends HelixFormElementBase {
90
91
  this.runPendingUpdate();
91
92
  this.checkInProgress = true;
92
93
  try {
93
- return this.internals.checkValidity();
94
+ return internalsOf(this).checkValidity();
94
95
  }
95
96
  finally {
96
97
  this.checkInProgress = false;
@@ -101,7 +102,7 @@ export class HelixFormElement extends HelixFormElementBase {
101
102
  }
102
103
  connectedCallback() {
103
104
  super.connectedCallback();
104
- watchFormChecks(this.internals.form);
105
+ watchFormChecks(internalsOf(this).form);
105
106
  }
106
107
  formAssociatedCallback(form) {
107
108
  watchFormChecks(form);
package/dist/index.d.ts CHANGED
@@ -41,9 +41,11 @@ export { UpgradeController, type UpgradeOptions, } from './controllers/upgrade-c
41
41
  export { type Rendered, VirtualizeController, type VirtualizeOptions, type Window as VirtualizeWindow, } from './controllers/virtualize-controller/virtualize-controller.js';
42
42
  export { Waterfall } from './controllers/virtualize-controller/waterfall.js';
43
43
  export { eventsForTag, registerElementEvents } from './events/element-events.js';
44
- export { type ActivateDetail, type AuraFallbackDetail, type BandDetail, type CanvasView, type CaretDetail, type ChangeDetail, type CompleteDetail, type ConnectDetail, type ConsoleDetail, type CopyDetail, type CreateDetail, type DeviceButton, type DeviceButtonDetail, type DeviceKeyDetail, type DeviceScrollDetail, type DeviceSwipeDetail, type DeviceTapDetail, type DeviceTextDetail, type DeviceTouchDetail, type DismissDetail, type FacetDetail, type FilterDetail, type FoundDetail, type GraphFilterDetail, type GraphLayoutDetail, type GraphPartChangeDetail, type GraphSignalDetail, HelixActionEvent, HelixActivateEvent, HelixAuraFallbackEvent, HelixBandEvent, HelixBeforeActivateEvent, HelixBeforeChangeEvent, HelixBeforeCloseEvent, HelixBeforeCollapseEvent, HelixBeforeEditEvent, HelixBeforeListenEvent, HelixBeforeMoveEvent, HelixBeforeOpenEvent, HelixBeforePanelResizeEvent, HelixBeforePasteEvent, HelixBeforePinEvent, HelixBeforeReconnectEvent, HelixBeforeRelabelEvent, HelixBeforeReorderEvent, HelixBeforeResizeEvent, HelixBeforeSplitEvent, HelixBeforeToggleEvent, HelixCanvasEditEvent, HelixCanvasPanEvent, HelixCanvasViewEvent, HelixCanvasZoomEvent, HelixCaretEvent, HelixClearEvent, HelixCollapseEvent, HelixCompleteEvent, HelixConnectEvent, HelixConsoleEvent, HelixCopyErrorEvent, HelixCopyEvent, HelixCreateEvent, HelixDeviceButtonEvent, HelixDeviceKeyEvent, HelixDeviceScreenshotEvent, HelixDeviceScrollEvent, HelixDeviceSwipeEvent, HelixDeviceTapEvent, HelixDeviceTextEvent, HelixDeviceTouchEvent, HelixDismissEvent, HelixEditEvent, HelixEndEvent, HelixExpandEvent, HelixFacetEvent, HelixFilterEvent, HelixFilteredEvent, HelixFoundEvent, HelixGraphFilterEvent, HelixGraphLayoutEvent, HelixGraphPanEvent, HelixGraphPartChangeEvent, HelixGraphReadyEvent, HelixGraphSignalEvent, HelixGraphZoomEvent, HelixHistoryEvent, HelixListenEvent, HelixLoadEvent, HelixLoadMoreEvent, HelixMapClusterEvent, HelixMapPanEvent, HelixMapPartChangeEvent, HelixMapReadyEvent, HelixMapRotateEvent, HelixMapTiltEvent, HelixMapZoomEvent, HelixMoveEvent, HelixNavigateEvent, HelixNextEvent, HelixPanelResizeEvent, HelixPastedEvent, HelixPinEvent, HelixPlotChangeEvent, HelixPlotTurnEvent, HelixPressEvent, HelixPreviewEvent, HelixPreviousEvent, HelixRangeChangeEvent, HelixReadEvent, HelixReadingChangeEvent, HelixReadingPressEvent, HelixReconnectEvent, HelixRejectEvent, HelixRelabelEvent, HelixRemoveEvent, HelixReorderEvent, HelixReorderedEvent, HelixResizedEvent, HelixResizeEvent, HelixSampleEndEvent, HelixSampleStartEvent, HelixScrolledEvent, HelixSelectEvent, HelixSelectedEvent, HelixSendEvent, HelixShortcutEvent, HelixSortEvent, HelixSortedEvent, HelixSplitEvent, HelixStopEvent, HelixStrandsFallbackEvent, HelixTerminalBellEvent, HelixTerminalInputEvent, HelixTerminalLinkEvent, HelixTerminalResizeEvent, HelixTerminalRestartEvent, HelixTerminalTitleEvent, HelixToggleEvent, HelixTourAskEvent, HelixTourStatusEvent, HelixTypingEvent, type ListenDetail, type MapClusterDetail, type MapPanDetail, type MapPartChangeDetail, type MapRotateDetail, type MapTiltDetail, type MapZoomDetail, type MoveDetail, type NavigateDetail, type OpenDetail, type PasteDetail, type PlotChangeDetail, type PlotTurnDetail, type PressDetail, type PressPointerType, type RangeDetail, type ReadDetail, type ReadingDetail, type ReconnectDetail, type Refusal, type RefusedFile, type RejectDetail, type RelabelDetail, type RemoveDetail, type ReorderDetail, type ResizeDetail, type ScrolledDetail, type SelectDetail, type SendDetail, type ShortcutDetail, type SkipDetail, type SortDetail, type StrandsFallbackDetail, type TerminalInputDetail, type TerminalLinkDetail, type TerminalResizeDetail, type TerminalTitleDetail, type ToggleDetail, type TourStatusDetail, type TypingDetail, type ViewportPanDetail, type ViewportZoomDetail, } from './events/events.js';
45
- export { HelixElement, whenHydrated } from './helix-element/helix-element.js';
44
+ export { type ActivateDetail, type ChangeDetail, type CheckDetail, type CompleteDetail, type CopyDetail, type DismissDetail, type FilterDetail, type FoundDetail, HelixActivateEvent, HelixBeforeActivateEvent, HelixBeforeChangeEvent, HelixBeforeCheckEvent, HelixBeforeCloseEvent, HelixBeforeFilterEvent, HelixBeforeListenEvent, HelixBeforeNavigateEvent, HelixBeforeOpenEvent, HelixBeforePinEvent, HelixBeforeReorderEvent, HelixBeforeResizeEvent, HelixBeforeSelectEvent, HelixBeforeSortEvent, HelixCheckEvent, HelixClearEvent, HelixCompleteEvent, HelixCopyErrorEvent, HelixCopyEvent, HelixDismissEvent, HelixExpandEvent, HelixFilterEvent, HelixFoundEvent, HelixListenEvent, HelixLoadEvent, HelixLoadMoreEvent, HelixNavigateEvent, HelixPinEvent, HelixPlotChangeEvent, HelixPlotTurnEvent, HelixReadingChangeEvent, HelixReadingPressEvent, HelixReorderEvent, HelixResizedEvent, HelixResizeEvent, HelixSelectEvent, HelixSortEvent, type ListenDetail, type NavigateDetail, type OpenDetail, type PlotChangeDetail, type PlotTurnDetail, type PressPointerType, type ReadingDetail, type ReorderDetail, type ResizeDetail, type SelectDetail, type SortDetail, type ViewportPanDetail, type ViewportZoomDetail, } from './events/events.js';
45
+ export { helixEventNames, registerEventNames } from './events/names.js';
46
+ export { HelixElement, internalsOf, whenHydrated } from './helix-element/helix-element.js';
46
47
  export { LAYERS_RULE, MIRROR_RULE, SCROLLER_RULE, SPOKEN_RULE, TOUCHES_RULE, VIRTUAL_RULE, } from './helix-element/mark-rules.js';
48
+ export { untilReactHydrated } from './helix-element/react-bridge.js';
47
49
  export { HelixFormElement } from './helix-form-element/helix-form-element.js';
48
50
  export { HelixFormElementBase } from './helix-form-element/helix-form-element-base.js';
49
51
  export { MixinChartSource, type MixinChartSourceInterface, PALETTE, PLOT_HEIGHT, PLOT_WIDTH, POSITION_LABEL, READINGS_PAGE, seriesIndex, seriesNames, } from './mixins/mixin-chart-source/mixin-chart-source.js';
package/dist/index.js CHANGED
@@ -41,9 +41,11 @@ export { UpgradeController, } from './controllers/upgrade-controller/upgrade-con
41
41
  export { VirtualizeController, } from './controllers/virtualize-controller/virtualize-controller.js';
42
42
  export { Waterfall } from './controllers/virtualize-controller/waterfall.js';
43
43
  export { eventsForTag, registerElementEvents } from './events/element-events.js';
44
- export { HelixActionEvent, HelixActivateEvent, HelixAuraFallbackEvent, HelixBandEvent, HelixBeforeActivateEvent, HelixBeforeChangeEvent, HelixBeforeCloseEvent, HelixBeforeCollapseEvent, HelixBeforeEditEvent, HelixBeforeListenEvent, HelixBeforeMoveEvent, HelixBeforeOpenEvent, HelixBeforePanelResizeEvent, HelixBeforePasteEvent, HelixBeforePinEvent, HelixBeforeReconnectEvent, HelixBeforeRelabelEvent, HelixBeforeReorderEvent, HelixBeforeResizeEvent, HelixBeforeSplitEvent, HelixBeforeToggleEvent, HelixCanvasEditEvent, HelixCanvasPanEvent, HelixCanvasViewEvent, HelixCanvasZoomEvent, HelixCaretEvent, HelixClearEvent, HelixCollapseEvent, HelixCompleteEvent, HelixConnectEvent, HelixConsoleEvent, HelixCopyErrorEvent, HelixCopyEvent, HelixCreateEvent, HelixDeviceButtonEvent, HelixDeviceKeyEvent, HelixDeviceScreenshotEvent, HelixDeviceScrollEvent, HelixDeviceSwipeEvent, HelixDeviceTapEvent, HelixDeviceTextEvent, HelixDeviceTouchEvent, HelixDismissEvent, HelixEditEvent, HelixEndEvent, HelixExpandEvent, HelixFacetEvent, HelixFilterEvent, HelixFilteredEvent, HelixFoundEvent, HelixGraphFilterEvent, HelixGraphLayoutEvent, HelixGraphPanEvent, HelixGraphPartChangeEvent, HelixGraphReadyEvent, HelixGraphSignalEvent, HelixGraphZoomEvent, HelixHistoryEvent, HelixListenEvent, HelixLoadEvent, HelixLoadMoreEvent, HelixMapClusterEvent, HelixMapPanEvent, HelixMapPartChangeEvent, HelixMapReadyEvent, HelixMapRotateEvent, HelixMapTiltEvent, HelixMapZoomEvent, HelixMoveEvent, HelixNavigateEvent, HelixNextEvent, HelixPanelResizeEvent, HelixPastedEvent, HelixPinEvent, HelixPlotChangeEvent, HelixPlotTurnEvent, HelixPressEvent, HelixPreviewEvent, HelixPreviousEvent, HelixRangeChangeEvent, HelixReadEvent, HelixReadingChangeEvent, HelixReadingPressEvent, HelixReconnectEvent, HelixRejectEvent, HelixRelabelEvent, HelixRemoveEvent, HelixReorderEvent, HelixReorderedEvent, HelixResizedEvent, HelixResizeEvent, HelixSampleEndEvent, HelixSampleStartEvent, HelixScrolledEvent, HelixSelectEvent, HelixSelectedEvent, HelixSendEvent, HelixShortcutEvent, HelixSortEvent, HelixSortedEvent, HelixSplitEvent, HelixStopEvent, HelixStrandsFallbackEvent, HelixTerminalBellEvent, HelixTerminalInputEvent, HelixTerminalLinkEvent, HelixTerminalResizeEvent, HelixTerminalRestartEvent, HelixTerminalTitleEvent, HelixToggleEvent, HelixTourAskEvent, HelixTourStatusEvent, HelixTypingEvent, } from './events/events.js';
45
- export { HelixElement, whenHydrated } from './helix-element/helix-element.js';
44
+ export { HelixActivateEvent, HelixBeforeActivateEvent, HelixBeforeChangeEvent, HelixBeforeCheckEvent, HelixBeforeCloseEvent, HelixBeforeFilterEvent, HelixBeforeListenEvent, HelixBeforeNavigateEvent, HelixBeforeOpenEvent, HelixBeforePinEvent, HelixBeforeReorderEvent, HelixBeforeResizeEvent, HelixBeforeSelectEvent, HelixBeforeSortEvent, HelixCheckEvent, HelixClearEvent, HelixCompleteEvent, HelixCopyErrorEvent, HelixCopyEvent, HelixDismissEvent, HelixExpandEvent, HelixFilterEvent, HelixFoundEvent, HelixListenEvent, HelixLoadEvent, HelixLoadMoreEvent, HelixNavigateEvent, HelixPinEvent, HelixPlotChangeEvent, HelixPlotTurnEvent, HelixReadingChangeEvent, HelixReadingPressEvent, HelixReorderEvent, HelixResizedEvent, HelixResizeEvent, HelixSelectEvent, HelixSortEvent, } from './events/events.js';
45
+ export { helixEventNames, registerEventNames } from './events/names.js';
46
+ export { HelixElement, internalsOf, whenHydrated } from './helix-element/helix-element.js';
46
47
  export { LAYERS_RULE, MIRROR_RULE, SCROLLER_RULE, SPOKEN_RULE, TOUCHES_RULE, VIRTUAL_RULE, } from './helix-element/mark-rules.js';
48
+ export { untilReactHydrated } from './helix-element/react-bridge.js';
47
49
  export { HelixFormElement } from './helix-form-element/helix-form-element.js';
48
50
  export { HelixFormElementBase } from './helix-form-element/helix-form-element-base.js';
49
51
  export { MixinChartSource, PALETTE, PLOT_HEIGHT, PLOT_WIDTH, POSITION_LABEL, READINGS_PAGE, seriesIndex, seriesNames, } from './mixins/mixin-chart-source/mixin-chart-source.js';