@fusion.dev/helix-core 0.223.1 → 0.224.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.
- package/custom-elements.json +1 -1
- package/dist/controllers/reorder-controller/reorder-controller.js +2 -3
- package/dist/events/before-activate.d.ts +3 -1
- package/dist/events/before-change.d.ts +2 -0
- package/dist/events/before-check.d.ts +31 -0
- package/dist/events/before-check.js +11 -0
- package/dist/events/before-close.d.ts +5 -1
- package/dist/events/before-filter.d.ts +17 -0
- package/dist/events/before-filter.js +11 -0
- package/dist/events/before-listen.d.ts +5 -1
- package/dist/events/before-navigate.d.ts +16 -0
- package/dist/events/before-navigate.js +11 -0
- package/dist/events/before-open.d.ts +2 -0
- package/dist/events/before-pin.d.ts +5 -1
- package/dist/events/before-reorder.d.ts +2 -0
- package/dist/events/before-resize.d.ts +5 -1
- package/dist/events/before-select.d.ts +19 -0
- package/dist/events/before-select.js +11 -0
- package/dist/events/before-sort.d.ts +19 -0
- package/dist/events/before-sort.js +11 -0
- package/dist/events/check.d.ts +15 -0
- package/dist/events/{caret.js → check.js} +3 -3
- package/dist/events/details.d.ts +11 -514
- package/dist/events/events.d.ts +27 -170
- package/dist/events/events.js +13 -165
- package/dist/events/expand.d.ts +2 -1
- package/dist/events/filter.d.ts +3 -4
- package/dist/events/filter.js +1 -1
- package/dist/events/found.d.ts +1 -1
- package/dist/events/names.d.ts +5 -16
- package/dist/events/names.js +11 -15
- package/dist/events/navigate.d.ts +3 -5
- package/dist/events/navigate.js +1 -1
- package/dist/events/reorder.d.ts +12 -13
- package/dist/events/reorder.js +1 -1
- package/dist/events/select.d.ts +4 -4
- package/dist/events/select.js +1 -1
- package/dist/events/sort.d.ts +3 -9
- package/dist/events/sort.js +1 -1
- package/dist/helix-element/helix-element.d.ts +31 -14
- package/dist/helix-element/helix-element.js +25 -3
- package/dist/helix-element/react-audit-off.d.ts +3 -1
- package/dist/helix-element/react-audit-off.js +1 -0
- package/dist/helix-element/react-audit.d.ts +22 -0
- package/dist/helix-element/react-audit.js +18 -0
- package/dist/helix-element/react-bridge.d.ts +34 -1
- package/dist/helix-element/react-bridge.js +33 -9
- package/dist/helix-element/react-root.d.ts +2 -0
- package/dist/helix-element/react-root.js +9 -0
- package/dist/helix-form-element/helix-form-element-base.js +12 -12
- package/dist/helix-form-element/helix-form-element.js +4 -3
- package/dist/index.d.ts +4 -2
- package/dist/index.js +4 -2
- package/dist/mixins/mixin-controller-checked/mixin-controller-checked.d.ts +3 -3
- package/dist/mixins/mixin-controller-checked/mixin-controller-checked.js +2 -2
- package/dist/mixins/mixin-field/mixin-field.js +9 -8
- package/dist/mixins/mixin-picker-feedback/mixin-picker-feedback.js +3 -2
- package/dist/mixins/mixin-picker-field/mixin-picker-field.js +4 -3
- package/dist/mixins/mixin-segmented-field/mixin-segmented-field.js +5 -4
- package/dist/mixins/mixin-selectable-item/mixin-selectable-item.d.ts +1 -1
- package/dist/mixins/mixin-selectable-item/mixin-selectable-item.js +2 -2
- package/dist/utils/audit-children/audit-children.d.ts +1 -1
- package/dist/utils/audit-name/audit-name.js +12 -1
- package/dist/utils/controls/controls.js +6 -1
- package/dist/utils/draw-icon/draw-icon.d.ts +1 -1
- package/dist/utils/follow-link/follow-link.d.ts +1 -1
- package/dist/utils/report-runtime/report-runtime.d.ts +5 -0
- package/dist/utils/tell-disclosure/tell-disclosure.d.ts +6 -3
- package/dist/utils/ticker/ticker.d.ts +5 -0
- package/dist/version.d.ts +4 -5
- package/dist/version.js +1 -1
- package/package.json +6 -6
- package/dist/events/action.d.ts +0 -12
- package/dist/events/action.js +0 -6
- package/dist/events/aura-fallback.d.ts +0 -12
- package/dist/events/aura-fallback.js +0 -11
- package/dist/events/band.d.ts +0 -13
- package/dist/events/band.js +0 -11
- package/dist/events/before-collapse.d.ts +0 -6
- package/dist/events/before-collapse.js +0 -11
- package/dist/events/before-edit.d.ts +0 -6
- package/dist/events/before-edit.js +0 -11
- package/dist/events/before-move.d.ts +0 -17
- package/dist/events/before-move.js +0 -11
- package/dist/events/before-panel-resize.d.ts +0 -13
- package/dist/events/before-panel-resize.js +0 -11
- package/dist/events/before-paste.d.ts +0 -13
- package/dist/events/before-paste.js +0 -11
- package/dist/events/before-reconnect.d.ts +0 -14
- package/dist/events/before-reconnect.js +0 -11
- package/dist/events/before-relabel.d.ts +0 -15
- package/dist/events/before-relabel.js +0 -11
- package/dist/events/before-split.d.ts +0 -12
- package/dist/events/before-split.js +0 -11
- package/dist/events/before-toggle.d.ts +0 -23
- package/dist/events/before-toggle.js +0 -11
- package/dist/events/canvas-edit.d.ts +0 -16
- package/dist/events/canvas-edit.js +0 -11
- package/dist/events/canvas-pan.d.ts +0 -13
- package/dist/events/canvas-pan.js +0 -11
- package/dist/events/canvas-view.d.ts +0 -14
- package/dist/events/canvas-view.js +0 -11
- package/dist/events/canvas-zoom.d.ts +0 -6
- package/dist/events/canvas-zoom.js +0 -11
- package/dist/events/caret.d.ts +0 -17
- package/dist/events/collapse.d.ts +0 -12
- package/dist/events/collapse.js +0 -11
- package/dist/events/connect.d.ts +0 -14
- package/dist/events/connect.js +0 -11
- package/dist/events/console.d.ts +0 -13
- package/dist/events/console.js +0 -11
- package/dist/events/create.d.ts +0 -18
- package/dist/events/create.js +0 -11
- package/dist/events/device-button.d.ts +0 -14
- package/dist/events/device-button.js +0 -11
- package/dist/events/device-key.d.ts +0 -16
- package/dist/events/device-key.js +0 -11
- package/dist/events/device-screenshot.d.ts +0 -13
- package/dist/events/device-screenshot.js +0 -10
- package/dist/events/device-scroll.d.ts +0 -14
- package/dist/events/device-scroll.js +0 -11
- package/dist/events/device-swipe.d.ts +0 -15
- package/dist/events/device-swipe.js +0 -11
- package/dist/events/device-tap.d.ts +0 -13
- package/dist/events/device-tap.js +0 -11
- package/dist/events/device-text.d.ts +0 -13
- package/dist/events/device-text.js +0 -11
- package/dist/events/device-touch.d.ts +0 -15
- package/dist/events/device-touch.js +0 -11
- package/dist/events/edit.d.ts +0 -12
- package/dist/events/edit.js +0 -11
- package/dist/events/end.d.ts +0 -9
- package/dist/events/end.js +0 -6
- package/dist/events/facet.d.ts +0 -17
- package/dist/events/facet.js +0 -11
- package/dist/events/filtered.d.ts +0 -12
- package/dist/events/filtered.js +0 -11
- package/dist/events/graph-filter.d.ts +0 -10
- package/dist/events/graph-filter.js +0 -11
- package/dist/events/graph-layout.d.ts +0 -10
- package/dist/events/graph-layout.js +0 -11
- package/dist/events/graph-pan.d.ts +0 -9
- package/dist/events/graph-pan.js +0 -11
- package/dist/events/graph-part-change.d.ts +0 -10
- package/dist/events/graph-part-change.js +0 -11
- package/dist/events/graph-ready.d.ts +0 -8
- package/dist/events/graph-ready.js +0 -6
- package/dist/events/graph-signal.d.ts +0 -11
- package/dist/events/graph-signal.js +0 -11
- package/dist/events/graph-zoom.d.ts +0 -6
- package/dist/events/graph-zoom.js +0 -11
- package/dist/events/history.d.ts +0 -16
- package/dist/events/history.js +0 -11
- package/dist/events/map-cluster.d.ts +0 -15
- package/dist/events/map-cluster.js +0 -11
- package/dist/events/map-pan.d.ts +0 -18
- package/dist/events/map-pan.js +0 -11
- package/dist/events/map-part-change.d.ts +0 -16
- package/dist/events/map-part-change.js +0 -11
- package/dist/events/map-ready.d.ts +0 -15
- package/dist/events/map-ready.js +0 -6
- package/dist/events/map-rotate.d.ts +0 -9
- package/dist/events/map-rotate.js +0 -11
- package/dist/events/map-tilt.d.ts +0 -9
- package/dist/events/map-tilt.js +0 -11
- package/dist/events/map-zoom.d.ts +0 -13
- package/dist/events/map-zoom.js +0 -11
- package/dist/events/move.d.ts +0 -11
- package/dist/events/move.js +0 -11
- package/dist/events/next.d.ts +0 -23
- package/dist/events/next.js +0 -11
- package/dist/events/panel-resize.d.ts +0 -12
- package/dist/events/panel-resize.js +0 -11
- package/dist/events/pasted.d.ts +0 -6
- package/dist/events/pasted.js +0 -11
- package/dist/events/press.d.ts +0 -19
- package/dist/events/press.js +0 -11
- package/dist/events/preview.d.ts +0 -14
- package/dist/events/preview.js +0 -11
- package/dist/events/previous.d.ts +0 -6
- package/dist/events/previous.js +0 -11
- package/dist/events/range-change.d.ts +0 -10
- package/dist/events/range-change.js +0 -11
- package/dist/events/read.d.ts +0 -19
- package/dist/events/read.js +0 -11
- package/dist/events/reconnect.d.ts +0 -6
- package/dist/events/reconnect.js +0 -11
- package/dist/events/reject.d.ts +0 -13
- package/dist/events/reject.js +0 -11
- package/dist/events/relabel.d.ts +0 -6
- package/dist/events/relabel.js +0 -11
- package/dist/events/remove.d.ts +0 -12
- package/dist/events/remove.js +0 -11
- package/dist/events/reordered.d.ts +0 -12
- package/dist/events/reordered.js +0 -11
- package/dist/events/sample-end.d.ts +0 -5
- package/dist/events/sample-end.js +0 -6
- package/dist/events/sample-start.d.ts +0 -18
- package/dist/events/sample-start.js +0 -6
- package/dist/events/scrolled.d.ts +0 -32
- package/dist/events/scrolled.js +0 -11
- package/dist/events/selected.d.ts +0 -12
- package/dist/events/selected.js +0 -11
- package/dist/events/send.d.ts +0 -18
- package/dist/events/send.js +0 -11
- package/dist/events/shortcut.d.ts +0 -13
- package/dist/events/shortcut.js +0 -11
- package/dist/events/sorted.d.ts +0 -15
- package/dist/events/sorted.js +0 -11
- package/dist/events/split.d.ts +0 -12
- package/dist/events/split.js +0 -11
- package/dist/events/stop.d.ts +0 -12
- package/dist/events/stop.js +0 -6
- package/dist/events/strands-fallback.d.ts +0 -13
- package/dist/events/strands-fallback.js +0 -11
- package/dist/events/terminal-bell.d.ts +0 -13
- package/dist/events/terminal-bell.js +0 -6
- package/dist/events/terminal-input.d.ts +0 -14
- package/dist/events/terminal-input.js +0 -11
- package/dist/events/terminal-link.d.ts +0 -15
- package/dist/events/terminal-link.js +0 -11
- package/dist/events/terminal-resize.d.ts +0 -13
- package/dist/events/terminal-resize.js +0 -11
- package/dist/events/terminal-restart.d.ts +0 -11
- package/dist/events/terminal-restart.js +0 -10
- package/dist/events/terminal-title.d.ts +0 -12
- package/dist/events/terminal-title.js +0 -11
- package/dist/events/toggle.d.ts +0 -15
- package/dist/events/toggle.js +0 -11
- package/dist/events/tour-ask.d.ts +0 -16
- package/dist/events/tour-ask.js +0 -11
- package/dist/events/tour-status.d.ts +0 -14
- package/dist/events/tour-status.js +0 -11
- package/dist/events/typing.d.ts +0 -10
- package/dist/events/typing.js +0 -11
|
@@ -1,11 +1,9 @@
|
|
|
1
1
|
import type { NavigateDetail } from './details.js';
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
3
|
+
* A component moved the view it is showing.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
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";
|
package/dist/events/navigate.js
CHANGED
package/dist/events/reorder.d.ts
CHANGED
|
@@ -1,22 +1,21 @@
|
|
|
1
1
|
import type { ReorderDetail } from './details.js';
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
3
|
+
* A row, an item, or a column moved to a new place.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
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
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
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`
|
|
19
|
-
*
|
|
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";
|
package/dist/events/reorder.js
CHANGED
package/dist/events/select.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import type { SelectDetail } from './details.js';
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
3
|
+
* A set holds a different selection.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
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";
|
package/dist/events/select.js
CHANGED
package/dist/events/sort.d.ts
CHANGED
|
@@ -1,15 +1,9 @@
|
|
|
1
1
|
import type { SortDetail } from './details.js';
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
3
|
+
* The rows are in a different order.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
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";
|
package/dist/events/sort.js
CHANGED
|
@@ -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
|
|
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
|
-
|
|
26
|
-
|
|
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
|
|
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;
|
|
@@ -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.
|
|
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
|
|
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
|
|
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
|
-
|
|
49
|
+
mark = reactMarkOf(one.host);
|
|
47
50
|
}
|
|
48
|
-
const
|
|
49
|
-
|
|
50
|
-
if (!
|
|
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
|
-
|
|
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,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.
|
|
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.
|
|
70
|
+
internalsOf(this).ariaDisabled = this.isDisabled ? 'true' : null;
|
|
71
71
|
}
|
|
72
72
|
applyValidity() {
|
|
73
73
|
if (this.customValidity === '') {
|
|
74
|
-
this.
|
|
74
|
+
internalsOf(this).setValidity({});
|
|
75
75
|
return;
|
|
76
76
|
}
|
|
77
|
-
this.
|
|
77
|
+
internalsOf(this).setValidity({ customError: true }, this.customValidity, this.focusTarget ?? undefined);
|
|
78
78
|
}
|
|
79
79
|
get validity() {
|
|
80
80
|
this.runPendingUpdate();
|
|
81
|
-
return this.
|
|
81
|
+
return internalsOf(this).validity;
|
|
82
82
|
}
|
|
83
83
|
get validationMessage() {
|
|
84
84
|
this.runPendingUpdate();
|
|
85
|
-
return this.
|
|
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.
|
|
102
|
+
return internalsOf(this).willValidate;
|
|
103
103
|
}
|
|
104
104
|
checkValidity() {
|
|
105
105
|
this.runPendingUpdate();
|
|
106
|
-
return this.
|
|
106
|
+
return internalsOf(this).checkValidity();
|
|
107
107
|
}
|
|
108
108
|
reportValidity() {
|
|
109
109
|
this.runPendingUpdate();
|
|
110
110
|
this.applyValidity();
|
|
111
|
-
return this.
|
|
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.
|
|
153
|
+
return internalsOf(this).form;
|
|
154
154
|
}
|
|
155
155
|
get labels() {
|
|
156
|
-
return this.
|
|
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
|
|
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.
|
|
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.
|
|
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
|
|
45
|
-
export {
|
|
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 {
|
|
45
|
-
export {
|
|
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';
|