@fusion.dev/helix-headless 0.22.0 → 0.24.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 +48397 -26631
- package/dist/announcement/root/announcement-root.d.ts +19 -5
- package/dist/area-chart/index.d.ts +1 -0
- package/dist/area-chart/index.js +1 -0
- package/dist/area-chart/root/area-chart-root.d.ts +182 -0
- package/dist/area-chart/root/area-chart-root.js +205 -0
- package/dist/carousel/root/carousel-root.d.ts +1 -0
- package/dist/carousel/root/carousel-root.js +18 -2
- package/dist/chat/index.d.ts +1 -1
- package/dist/chat/message/chat-message.d.ts +7 -0
- package/dist/chat/message/chat-message.js +2 -1
- package/dist/chat/root/chat-root.d.ts +195 -4
- package/dist/chat/root/chat-root.js +316 -23
- package/dist/checkbox-group/root/checkbox-group-root.d.ts +2 -0
- package/dist/checkbox-group/root/checkbox-group-root.js +12 -2
- package/dist/code-block/index.d.ts +1 -0
- package/dist/code-block/index.js +1 -0
- package/dist/code-block/patch.d.ts +62 -0
- package/dist/code-block/patch.js +93 -0
- package/dist/code-block/root/code-block-root.d.ts +82 -17
- package/dist/code-block/root/code-block-root.js +83 -6
- package/dist/color-picker/root/color-picker-root.d.ts +4 -3
- package/dist/color-picker/root/color-picker-root.js +4 -1
- package/dist/data-table/root/data-table-root.d.ts +195 -23
- package/dist/data-table/root/data-table-root.js +308 -27
- package/dist/description-list/index.d.ts +2 -0
- package/dist/description-list/index.js +2 -0
- package/dist/description-list/item/description-list-item.d.ts +39 -0
- package/dist/description-list/item/description-list-item.js +26 -0
- package/dist/description-list/root/description-list-root.d.ts +56 -0
- package/dist/description-list/root/description-list-root.js +21 -0
- package/dist/element-events.generated.js +27 -6
- package/dist/filter-input/chip/filter-chip.d.ts +114 -0
- package/dist/filter-input/chip/filter-chip.js +61 -0
- package/dist/filter-input/field/filter-field.d.ts +128 -0
- package/dist/filter-input/field/filter-field.js +70 -0
- package/dist/filter-input/grammar.d.ts +96 -0
- package/dist/filter-input/grammar.js +133 -0
- package/dist/filter-input/index.d.ts +5 -0
- package/dist/filter-input/index.js +5 -0
- package/dist/filter-input/menu/filter-menu.d.ts +153 -0
- package/dist/filter-input/menu/filter-menu.js +164 -0
- package/dist/filter-input/operator/filter-operator.d.ts +105 -0
- package/dist/filter-input/operator/filter-operator.js +39 -0
- package/dist/filter-input/root/filter-input-root.d.ts +118 -9
- package/dist/filter-input/root/filter-input-root.js +96 -2
- package/dist/format-date/root/format-date-root.js +1 -1
- package/dist/index.d.ts +5 -0
- package/dist/index.js +5 -0
- package/dist/line-chart/root/line-chart-root.d.ts +9 -2
- package/dist/listbox/root/listbox-root.d.ts +8 -7
- package/dist/listbox/root/listbox-root.js +7 -2
- package/dist/menu/item/menu-item.d.ts +54 -6
- package/dist/menu/item/menu-item.js +31 -6
- package/dist/menu/root/menu-root.d.ts +23 -0
- package/dist/menu/root/menu-root.js +13 -2
- package/dist/notifications/group/notification-group.d.ts +129 -0
- package/dist/notifications/group/notification-group.js +106 -0
- package/dist/notifications/index.d.ts +1 -0
- package/dist/notifications/index.js +1 -0
- package/dist/notifications/notification/notification.d.ts +39 -13
- package/dist/notifications/notification/notification.js +11 -8
- package/dist/notifications/root/notifications-root.d.ts +57 -1
- package/dist/notifications/root/notifications-root.js +35 -4
- package/dist/number-input/root/number-input-root.d.ts +21 -1
- package/dist/number-input/root/number-input-root.js +18 -5
- package/dist/object-inspector/index.d.ts +1 -0
- package/dist/object-inspector/index.js +1 -0
- package/dist/object-inspector/root/object-inspector-root.d.ts +183 -0
- package/dist/object-inspector/root/object-inspector-root.js +348 -0
- package/dist/outline/root/outline-root.d.ts +16 -1
- package/dist/outline/root/outline-root.js +27 -9
- package/dist/radio/group/radio-group.d.ts +1 -0
- package/dist/scatter-chart/index.d.ts +1 -0
- package/dist/scatter-chart/index.js +1 -0
- package/dist/scatter-chart/root/scatter-chart-root.d.ts +144 -0
- package/dist/scatter-chart/root/scatter-chart-root.js +205 -0
- package/dist/skip-link/index.d.ts +1 -0
- package/dist/skip-link/index.js +1 -0
- package/dist/skip-link/root/skip-link-root.d.ts +81 -0
- package/dist/skip-link/root/skip-link-root.js +58 -0
- package/dist/speed-dial/root/speed-dial-root.d.ts +1 -0
- package/dist/speed-dial/root/speed-dial-root.js +6 -2
- package/dist/steps/root/steps-root.d.ts +1 -0
- package/dist/table/column/table-column.d.ts +79 -0
- package/dist/table/column/table-column.js +125 -5
- package/dist/table/root/table-root.d.ts +2 -0
- package/dist/table/root/table-root.js +12 -3
- package/dist/time-picker/root/time-picker-root.d.ts +9 -0
- package/dist/time-picker/root/time-picker-root.js +5 -0
- package/dist/toast/root/toast-root.d.ts +2 -0
- package/dist/tooltip/root/tooltip-root.js +1 -1
- package/dist/tour/root/tour-root.d.ts +1 -0
- package/dist/tree/item/tree-item.d.ts +7 -4
- package/dist/tree/item/tree-item.js +4 -1
- package/dist/video/root/video-root.d.ts +23 -1
- package/dist/video/root/video-root.js +42 -22
- package/dist/virtual-list/root/virtual-list-root.d.ts +10 -6
- package/dist/virtual-list/root/virtual-list-root.js +10 -4
- package/package.json +5 -5
- package/types/jsx.d.ts +4535 -346
- package/types/svelte.d.ts +11 -0
- package/types/vue.d.ts +737 -39
|
@@ -85,6 +85,8 @@ export declare class HelixHeadlessTable extends HelixHeadlessTable_base {
|
|
|
85
85
|
* assignment has not happened.
|
|
86
86
|
*/
|
|
87
87
|
static shadowRootOptions: ShadowRootInit;
|
|
88
|
+
/** The rows: every child that is not a column, which is what the body slot is assigned. */
|
|
89
|
+
protected get slotted(): Element[];
|
|
88
90
|
private assign;
|
|
89
91
|
protected updated(changed: PropertyValues): void;
|
|
90
92
|
protected render(): TemplateResult;
|
|
@@ -17,7 +17,7 @@ let HelixHeadlessTable = class HelixHeadlessTable extends MixinCollection(HelixE
|
|
|
17
17
|
};
|
|
18
18
|
}
|
|
19
19
|
get tableColumns() {
|
|
20
|
-
return
|
|
20
|
+
return this.knownChildren.filter((child) => 'isTableColumn' in child && child.isTableColumn === true);
|
|
21
21
|
}
|
|
22
22
|
get template() {
|
|
23
23
|
const declared = this.tableColumns;
|
|
@@ -30,15 +30,24 @@ let HelixHeadlessTable = class HelixHeadlessTable extends MixinCollection(HelixE
|
|
|
30
30
|
...HelixElement.shadowRootOptions,
|
|
31
31
|
slotAssignment: 'manual',
|
|
32
32
|
}; }
|
|
33
|
+
get slotted() {
|
|
34
|
+
const columns = new Set(this.tableColumns);
|
|
35
|
+
return [...(this.children ?? [])].filter((child) => !columns.has(child));
|
|
36
|
+
}
|
|
33
37
|
assign() {
|
|
38
|
+
if (this.assignsByName) {
|
|
39
|
+
for (const column of this.tableColumns) {
|
|
40
|
+
this.route(column, 'columns');
|
|
41
|
+
}
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
34
44
|
const head = this.renderRoot?.querySelector('slot[name="columns"]');
|
|
35
45
|
const body = this.renderRoot?.querySelector('slot:not([name])');
|
|
36
46
|
if (!head || !body) {
|
|
37
47
|
return;
|
|
38
48
|
}
|
|
39
|
-
const columns = new Set(this.tableColumns);
|
|
40
49
|
head.assign(...this.tableColumns);
|
|
41
|
-
body.assign(...
|
|
50
|
+
body.assign(...this.slotted);
|
|
42
51
|
}
|
|
43
52
|
updated(changed) {
|
|
44
53
|
super.updated(changed);
|
|
@@ -195,6 +195,15 @@ export declare class HelixHeadlessTimePicker extends HelixHeadlessTimePicker_bas
|
|
|
195
195
|
private halfBarred;
|
|
196
196
|
/** The times held, which is a list whether or not a mode is set. */
|
|
197
197
|
private get held();
|
|
198
|
+
/**
|
|
199
|
+
* The list's own `input`, stopped at the boundary.
|
|
200
|
+
*
|
|
201
|
+
* It is composed, so it crosses out of this shadow root on its own, and this
|
|
202
|
+
* element announces the time itself: a page listening here heard two `input`s
|
|
203
|
+
* for one choice, the second from the list inside, after the `change` that
|
|
204
|
+
* should have been the last word. Found running the events example.
|
|
205
|
+
*/
|
|
206
|
+
private readonly handleListInput;
|
|
198
207
|
/**
|
|
199
208
|
* Takes what the list announced and constrains it to what the mode allows.
|
|
200
209
|
*
|
|
@@ -46,6 +46,9 @@ let HelixHeadlessTimePicker = class HelixHeadlessTimePicker extends MixinControl
|
|
|
46
46
|
this.min = '00:00';
|
|
47
47
|
this.readOnly = false;
|
|
48
48
|
this.required = false;
|
|
49
|
+
this.handleListInput = (event) => {
|
|
50
|
+
event.stopPropagation();
|
|
51
|
+
};
|
|
49
52
|
this.handleChange = (event) => {
|
|
50
53
|
event.stopPropagation();
|
|
51
54
|
if (this.isDisabled) {
|
|
@@ -225,6 +228,7 @@ let HelixHeadlessTimePicker = class HelixHeadlessTimePicker extends MixinControl
|
|
|
225
228
|
event.stopPropagation();
|
|
226
229
|
this.moveColumn(part, event.detail.value);
|
|
227
230
|
}}
|
|
231
|
+
@input=${this.handleListInput}
|
|
228
232
|
>
|
|
229
233
|
${values.map((one) => html `<${this.tag('option')} part="option"
|
|
230
234
|
exportparts="description: option-description, item: option-item, label: option-label, text: option-text" value=${one} ?disabled=${barred(one)}
|
|
@@ -259,6 +263,7 @@ let HelixHeadlessTimePicker = class HelixHeadlessTimePicker extends MixinControl
|
|
|
259
263
|
?multiple=${this.mode !== undefined}
|
|
260
264
|
.value=${this.value}
|
|
261
265
|
@helix-before-change=${this.handleChange}
|
|
266
|
+
@input=${this.handleListInput}
|
|
262
267
|
>
|
|
263
268
|
${this.times.map((minutes) => {
|
|
264
269
|
const at = fromMinutes(minutes);
|
|
@@ -36,6 +36,8 @@ import { type PropertyValues, type TemplateResult } from 'lit';
|
|
|
36
36
|
*
|
|
37
37
|
* @slot - The messages, as `helix-toast-item` elements.
|
|
38
38
|
*
|
|
39
|
+
* @event {HelixDismissEvent} helix-dismiss - A message asking to go, by its control or by its timer, dispatched by the message and heard here because the stack is what a consumer holds. Cancelable: refusing it takes the decision and the message stays.
|
|
40
|
+
*
|
|
39
41
|
* @csspart region - The stack the messages are in.
|
|
40
42
|
*/
|
|
41
43
|
export declare class HelixHeadlessToast extends HelixElement {
|
|
@@ -48,7 +48,7 @@ let HelixHeadlessTooltip = class HelixHeadlessTooltip extends MixinControllerOpe
|
|
|
48
48
|
this.timer = setTimeout(() => this.release(), this.delayOut);
|
|
49
49
|
};
|
|
50
50
|
this.showNow = (event) => {
|
|
51
|
-
const focused = event.target;
|
|
51
|
+
const focused = event.composedPath()[0] ?? event.target;
|
|
52
52
|
if (focused instanceof Element && !focused.matches(':focus-visible')) {
|
|
53
53
|
return;
|
|
54
54
|
}
|
|
@@ -31,6 +31,7 @@ import type { HelixHeadlessTourStop } from '../stop/tour-stop.js';
|
|
|
31
31
|
* @event {HelixBeforeCloseEvent} helix-before-close - Fired before the reader leaves early. Cancelable: refusing it takes the decision and nothing moves.
|
|
32
32
|
* @event {HelixCompleteEvent} helix-complete - Fired when the last stop is
|
|
33
33
|
* finished.
|
|
34
|
+
* @event {HelixTourAskEvent} helix-tour-ask - A stop's own controls asking the tour to move, dispatched by the stop and heard here because the tour is what moves.
|
|
34
35
|
* @event {Event} toggle - Says the state moved, carrying `newState` and `oldState`.
|
|
35
36
|
*
|
|
36
37
|
* @csspart spotlight - The box over the current target, which paints the scrim.
|
|
@@ -14,9 +14,9 @@ declare const HelixHeadlessTreeItem_base: (new (...args: any[]) => import("@fusi
|
|
|
14
14
|
* An element rather than a slot, because it owns state: whether it is open,
|
|
15
15
|
* selected, and whether it holds focus.
|
|
16
16
|
*
|
|
17
|
-
* A branch is any item with something slotted into `children`, detected
|
|
18
|
-
*
|
|
19
|
-
*
|
|
17
|
+
* A branch is any item with something slotted into `children`, detected on the
|
|
18
|
+
* client because the server cannot inspect children. The server renders the
|
|
19
|
+
* node as a leaf and the twisty appears on hydration, which is the harmless
|
|
20
20
|
* direction.
|
|
21
21
|
*
|
|
22
22
|
* **`href` makes the row itself the link.** With the anchor slotted into the
|
|
@@ -100,7 +100,10 @@ export declare class HelixHeadlessTreeItem extends HelixHeadlessTreeItem_base {
|
|
|
100
100
|
/**
|
|
101
101
|
* Whether anything is slotted into `children`.
|
|
102
102
|
*
|
|
103
|
-
* Read
|
|
103
|
+
* Read from the children before each render, so the first one draws the
|
|
104
|
+
* twisty, and from the slot, which is what hears a child arrive later. Not on
|
|
105
|
+
* the server, where `children` is undefined, nor while hydrating what one
|
|
106
|
+
* sent.
|
|
104
107
|
*/
|
|
105
108
|
private branch;
|
|
106
109
|
protected firstUpdated(changed: PropertyValues): void;
|
|
@@ -40,8 +40,8 @@ let HelixHeadlessTreeItem = class HelixHeadlessTreeItem extends MixinControllerO
|
|
|
40
40
|
}
|
|
41
41
|
firstUpdated(changed) {
|
|
42
42
|
super.firstUpdated(changed);
|
|
43
|
+
this.finishHydration();
|
|
43
44
|
const slot = this.renderRoot.querySelector('slot[name="children"]');
|
|
44
|
-
this.branch = (slot?.assignedElements().length ?? 0) > 0;
|
|
45
45
|
slot?.addEventListener('slotchange', () => {
|
|
46
46
|
this.branch = slot.assignedElements().length > 0;
|
|
47
47
|
});
|
|
@@ -97,6 +97,9 @@ let HelixHeadlessTreeItem = class HelixHeadlessTreeItem extends MixinControllerO
|
|
|
97
97
|
willUpdate(changed) {
|
|
98
98
|
super.willUpdate(changed);
|
|
99
99
|
this.toggleState('selected', this.selected);
|
|
100
|
+
if (this.children !== undefined && !this.hydrating) {
|
|
101
|
+
this.branch = [...this.children].some((child) => child.slot === 'children');
|
|
102
|
+
}
|
|
100
103
|
}
|
|
101
104
|
render() {
|
|
102
105
|
const linked = this.href !== '';
|
|
@@ -460,14 +460,23 @@ export declare class HelixHeadlessVideo extends HelixElement {
|
|
|
460
460
|
private takeScrub;
|
|
461
461
|
/** The volume rail's new level, stopped for the reason `takeScrub` carries. */
|
|
462
462
|
private takeVolume;
|
|
463
|
+
/** Whether the first set of copies has been read from the children. */
|
|
464
|
+
private mediaRead;
|
|
463
465
|
/**
|
|
464
|
-
*
|
|
466
|
+
* The copies to make of what the default slot is given.
|
|
465
467
|
*
|
|
466
468
|
* The attribute list is explicit rather than a blind copy of every attribute:
|
|
467
469
|
* these are two elements with a known and small surface, and copying anything
|
|
468
470
|
* a consumer happened to put on one would carry their framework's own markers
|
|
469
471
|
* into a shadow root that has no use for them.
|
|
470
472
|
*/
|
|
473
|
+
private copiesOf;
|
|
474
|
+
/**
|
|
475
|
+
* Rebuilds the copies when what is slotted changes after the first read.
|
|
476
|
+
*
|
|
477
|
+
* The same set again is not a change. A video reloads for every new list, and
|
|
478
|
+
* the first `slotchange` reports the children this element already read.
|
|
479
|
+
*/
|
|
471
480
|
private readonly handleMedia;
|
|
472
481
|
private readonly handleLoaded;
|
|
473
482
|
private readonly handleTime;
|
|
@@ -632,6 +641,19 @@ export declare class HelixHeadlessVideo extends HelixElement {
|
|
|
632
641
|
private readonly handleRemoteState;
|
|
633
642
|
connectedCallback(): void;
|
|
634
643
|
disconnectedCallback(): void;
|
|
644
|
+
/** The caption tracks among the copies, named as the menu names them. */
|
|
645
|
+
private captions;
|
|
646
|
+
/**
|
|
647
|
+
* Finds the caption tracks among the copies, before the render that draws
|
|
648
|
+
* them.
|
|
649
|
+
*
|
|
650
|
+
* By the platform's own reading of `kind`, which is what makes a `<track>` a
|
|
651
|
+
* caption at all: missing is `subtitles` and anything it does not know is
|
|
652
|
+
* `metadata`. Read from the video's tracks after the render instead, the count
|
|
653
|
+
* arrived a render late and asked for one more. Choosing one still goes
|
|
654
|
+
* through the video's tracks, which hold them in the same order.
|
|
655
|
+
*/
|
|
656
|
+
protected willUpdate(changed: PropertyValues): void;
|
|
635
657
|
protected firstUpdated(changed: PropertyValues): void;
|
|
636
658
|
/**
|
|
637
659
|
* Mirrors playback onto the host as `data-playing`.
|
|
@@ -64,24 +64,12 @@ let HelixHeadlessVideo = class HelixHeadlessVideo extends HelixElement {
|
|
|
64
64
|
this.remoteAvailable = false;
|
|
65
65
|
this.remoteConnected = false;
|
|
66
66
|
this.media = [];
|
|
67
|
+
this.mediaRead = false;
|
|
67
68
|
this.handleMedia = (event) => {
|
|
68
|
-
const
|
|
69
|
-
this.media
|
|
70
|
-
.
|
|
71
|
-
|
|
72
|
-
const tag = node instanceof HTMLTrackElement ? 'track' : 'source';
|
|
73
|
-
const names = tag === 'track'
|
|
74
|
-
? ['default', 'kind', 'label', 'src', 'srclang']
|
|
75
|
-
: ['media', 'sizes', 'src', 'srcset', 'type'];
|
|
76
|
-
const attrs = {};
|
|
77
|
-
for (const name of names) {
|
|
78
|
-
const value = node.getAttribute(name);
|
|
79
|
-
if (value !== null) {
|
|
80
|
-
attrs[name] = value;
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
return { attrs, tag };
|
|
84
|
-
});
|
|
69
|
+
const next = this.copiesOf(event.target.assignedElements());
|
|
70
|
+
if (JSON.stringify(next) !== JSON.stringify(this.media)) {
|
|
71
|
+
this.media = next;
|
|
72
|
+
}
|
|
85
73
|
};
|
|
86
74
|
this.handleLoaded = () => {
|
|
87
75
|
const video = this.video;
|
|
@@ -92,7 +80,6 @@ let HelixHeadlessVideo = class HelixHeadlessVideo extends HelixElement {
|
|
|
92
80
|
if (video.videoWidth > 0 && video.videoHeight > 0) {
|
|
93
81
|
this.style.setProperty('--video-intrinsic-ratio', `${video.videoWidth} / ${video.videoHeight}`);
|
|
94
82
|
}
|
|
95
|
-
this.captionCount = this.captionTracks.length;
|
|
96
83
|
const track = video.textTracks[0];
|
|
97
84
|
if (track) {
|
|
98
85
|
if (track.mode === 'showing') {
|
|
@@ -229,6 +216,7 @@ let HelixHeadlessVideo = class HelixHeadlessVideo extends HelixElement {
|
|
|
229
216
|
this.handleRemoteState = () => {
|
|
230
217
|
this.remoteConnected = this.video?.remote?.state === 'connected';
|
|
231
218
|
};
|
|
219
|
+
this.captions = [];
|
|
232
220
|
}
|
|
233
221
|
get localFile() {
|
|
234
222
|
if (this.src === '') {
|
|
@@ -395,6 +383,24 @@ let HelixHeadlessVideo = class HelixHeadlessVideo extends HelixElement {
|
|
|
395
383
|
video.volume = Number(event.target.value);
|
|
396
384
|
video.muted = false;
|
|
397
385
|
}
|
|
386
|
+
copiesOf(elements) {
|
|
387
|
+
return elements
|
|
388
|
+
.filter((node) => node instanceof HTMLSourceElement || node instanceof HTMLTrackElement)
|
|
389
|
+
.map((node) => {
|
|
390
|
+
const tag = node instanceof HTMLTrackElement ? 'track' : 'source';
|
|
391
|
+
const names = tag === 'track'
|
|
392
|
+
? ['default', 'kind', 'label', 'src', 'srclang']
|
|
393
|
+
: ['media', 'sizes', 'src', 'srcset', 'type'];
|
|
394
|
+
const attrs = {};
|
|
395
|
+
for (const name of names) {
|
|
396
|
+
const value = node.getAttribute(name);
|
|
397
|
+
if (value !== null) {
|
|
398
|
+
attrs[name] = value;
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
return { attrs, tag };
|
|
402
|
+
});
|
|
403
|
+
}
|
|
398
404
|
claimSession() {
|
|
399
405
|
if (typeof navigator === 'undefined' || !navigator.mediaSession) {
|
|
400
406
|
return;
|
|
@@ -533,8 +539,24 @@ let HelixHeadlessVideo = class HelixHeadlessVideo extends HelixElement {
|
|
|
533
539
|
}
|
|
534
540
|
}
|
|
535
541
|
}
|
|
542
|
+
willUpdate(changed) {
|
|
543
|
+
super.willUpdate(changed);
|
|
544
|
+
if (!this.mediaRead && this.children !== undefined && !this.hydrating) {
|
|
545
|
+
this.mediaRead = true;
|
|
546
|
+
this.media = this.copiesOf([...this.children].filter((child) => child.slot === ''));
|
|
547
|
+
}
|
|
548
|
+
if (changed.has('media')) {
|
|
549
|
+
this.captions = this.media
|
|
550
|
+
.filter((one) => one.tag === 'track' &&
|
|
551
|
+
(one.attrs.kind === undefined ||
|
|
552
|
+
['captions', 'subtitles'].includes(one.attrs.kind.toLowerCase())))
|
|
553
|
+
.map((one) => ({ label: one.attrs.label ?? '', language: one.attrs.srclang ?? '' }));
|
|
554
|
+
this.captionCount = this.captions.length;
|
|
555
|
+
}
|
|
556
|
+
}
|
|
536
557
|
firstUpdated(changed) {
|
|
537
558
|
super.firstUpdated?.(changed);
|
|
559
|
+
this.finishHydration();
|
|
538
560
|
const video = this.video;
|
|
539
561
|
if (video) {
|
|
540
562
|
this.silent = video.muted;
|
|
@@ -549,9 +571,7 @@ let HelixHeadlessVideo = class HelixHeadlessVideo extends HelixElement {
|
|
|
549
571
|
this.toggleAttribute('data-playing', this.playing);
|
|
550
572
|
this.toggleAttribute('data-idle', this.idle && this.playing);
|
|
551
573
|
if (changed.has('media')) {
|
|
552
|
-
|
|
553
|
-
video?.load();
|
|
554
|
-
this.captionCount = this.captionTracks.length;
|
|
574
|
+
this.video?.load();
|
|
555
575
|
}
|
|
556
576
|
}
|
|
557
577
|
renderExtra(one) {
|
|
@@ -639,7 +659,7 @@ let HelixHeadlessVideo = class HelixHeadlessVideo extends HelixElement {
|
|
|
639
659
|
</button>`;
|
|
640
660
|
}
|
|
641
661
|
renderCaptions() {
|
|
642
|
-
const tracks = this.
|
|
662
|
+
const tracks = this.captions;
|
|
643
663
|
if (this.captionCount === 0) {
|
|
644
664
|
return nothing;
|
|
645
665
|
}
|
|
@@ -61,6 +61,8 @@ export declare class HelixHeadlessVirtualList extends HelixElement {
|
|
|
61
61
|
* Empty on a server, which has nothing to read.
|
|
62
62
|
*/
|
|
63
63
|
private rows;
|
|
64
|
+
/** The `for` that `rows` came from, so it is read again only when that changes. */
|
|
65
|
+
private readFor;
|
|
64
66
|
private readonly virtualize;
|
|
65
67
|
/**
|
|
66
68
|
* The rows in the tree, each with the item it drew.
|
|
@@ -73,14 +75,16 @@ export declare class HelixHeadlessVirtualList extends HelixElement {
|
|
|
73
75
|
*/
|
|
74
76
|
private drawn;
|
|
75
77
|
/**
|
|
76
|
-
* Reads the source named by `for`,
|
|
78
|
+
* Reads the source named by `for`, before the render that draws it.
|
|
77
79
|
*
|
|
78
|
-
*
|
|
79
|
-
*
|
|
80
|
-
*
|
|
81
|
-
*
|
|
82
|
-
* case and an empty list says
|
|
80
|
+
* Not on the server, per the server rules: the shim has attributes and no
|
|
81
|
+
* tree, so `getElementById` is undefined there. Nor while hydrating what a
|
|
82
|
+
* server sent, which it drew with nothing read. A source that is missing or
|
|
83
|
+
* not an array leaves the list empty rather than throwing, because a consumer
|
|
84
|
+
* whose data has not arrived yet is the ordinary case and an empty list says
|
|
85
|
+
* so by itself.
|
|
83
86
|
*/
|
|
87
|
+
protected willUpdate(changed: PropertyValues): void;
|
|
84
88
|
protected firstUpdated(changed: PropertyValues): void;
|
|
85
89
|
protected updated(changed: PropertyValues): void;
|
|
86
90
|
private read;
|
|
@@ -29,15 +29,21 @@ let HelixHeadlessVirtualList = class HelixHeadlessVirtualList extends HelixEleme
|
|
|
29
29
|
index: Number(element.dataset.index),
|
|
30
30
|
}));
|
|
31
31
|
}
|
|
32
|
+
willUpdate(changed) {
|
|
33
|
+
super.willUpdate(changed);
|
|
34
|
+
if (this.readFor !== this.for &&
|
|
35
|
+
typeof this.ownerDocument?.getElementById === 'function' &&
|
|
36
|
+
!this.hydrating) {
|
|
37
|
+
this.readFor = this.for;
|
|
38
|
+
this.read();
|
|
39
|
+
}
|
|
40
|
+
}
|
|
32
41
|
firstUpdated(changed) {
|
|
33
42
|
super.firstUpdated?.(changed);
|
|
34
|
-
this.
|
|
43
|
+
this.finishHydration();
|
|
35
44
|
}
|
|
36
45
|
updated(changed) {
|
|
37
46
|
super.updated?.(changed);
|
|
38
|
-
if (changed.has('for')) {
|
|
39
|
-
this.read();
|
|
40
|
-
}
|
|
41
47
|
this.virtualize.measure();
|
|
42
48
|
this.place();
|
|
43
49
|
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fusion.dev/helix-headless",
|
|
3
3
|
"description": "Headless component tier. Structure, accessibility, state, and form participation. No styling.",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.24.0",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Ross Sheppard <ross.sheppard@fusion.dev>",
|
|
7
7
|
"repository": {
|
|
@@ -45,14 +45,14 @@
|
|
|
45
45
|
},
|
|
46
46
|
"bugs": "https://github.com/project-fusion/fusion/issues",
|
|
47
47
|
"dependencies": {
|
|
48
|
-
"@fusion.dev/helix-core": "0.
|
|
49
|
-
"@fusion.dev/helix-icons": "0.
|
|
48
|
+
"@fusion.dev/helix-core": "0.24.0",
|
|
49
|
+
"@fusion.dev/helix-icons": "0.24.0",
|
|
50
50
|
"uqr": "^0.1.3"
|
|
51
51
|
},
|
|
52
52
|
"devDependencies": {
|
|
53
53
|
"@custom-elements-manifest/analyzer": "^0.11.0",
|
|
54
|
-
"@fusion.dev/helix-cem": "0.
|
|
55
|
-
"@fusion.dev/helix-testing": "0.
|
|
54
|
+
"@fusion.dev/helix-cem": "0.24.0",
|
|
55
|
+
"@fusion.dev/helix-testing": "0.24.0",
|
|
56
56
|
"@fusion.dev/scripts": "0.0.0-dev",
|
|
57
57
|
"@happy-dom/global-registrator": "^20.0.0",
|
|
58
58
|
"@lit-labs/ssr": "^3.3.0",
|