@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.
Files changed (103) hide show
  1. package/custom-elements.json +48397 -26631
  2. package/dist/announcement/root/announcement-root.d.ts +19 -5
  3. package/dist/area-chart/index.d.ts +1 -0
  4. package/dist/area-chart/index.js +1 -0
  5. package/dist/area-chart/root/area-chart-root.d.ts +182 -0
  6. package/dist/area-chart/root/area-chart-root.js +205 -0
  7. package/dist/carousel/root/carousel-root.d.ts +1 -0
  8. package/dist/carousel/root/carousel-root.js +18 -2
  9. package/dist/chat/index.d.ts +1 -1
  10. package/dist/chat/message/chat-message.d.ts +7 -0
  11. package/dist/chat/message/chat-message.js +2 -1
  12. package/dist/chat/root/chat-root.d.ts +195 -4
  13. package/dist/chat/root/chat-root.js +316 -23
  14. package/dist/checkbox-group/root/checkbox-group-root.d.ts +2 -0
  15. package/dist/checkbox-group/root/checkbox-group-root.js +12 -2
  16. package/dist/code-block/index.d.ts +1 -0
  17. package/dist/code-block/index.js +1 -0
  18. package/dist/code-block/patch.d.ts +62 -0
  19. package/dist/code-block/patch.js +93 -0
  20. package/dist/code-block/root/code-block-root.d.ts +82 -17
  21. package/dist/code-block/root/code-block-root.js +83 -6
  22. package/dist/color-picker/root/color-picker-root.d.ts +4 -3
  23. package/dist/color-picker/root/color-picker-root.js +4 -1
  24. package/dist/data-table/root/data-table-root.d.ts +195 -23
  25. package/dist/data-table/root/data-table-root.js +308 -27
  26. package/dist/description-list/index.d.ts +2 -0
  27. package/dist/description-list/index.js +2 -0
  28. package/dist/description-list/item/description-list-item.d.ts +39 -0
  29. package/dist/description-list/item/description-list-item.js +26 -0
  30. package/dist/description-list/root/description-list-root.d.ts +56 -0
  31. package/dist/description-list/root/description-list-root.js +21 -0
  32. package/dist/element-events.generated.js +27 -6
  33. package/dist/filter-input/chip/filter-chip.d.ts +114 -0
  34. package/dist/filter-input/chip/filter-chip.js +61 -0
  35. package/dist/filter-input/field/filter-field.d.ts +128 -0
  36. package/dist/filter-input/field/filter-field.js +70 -0
  37. package/dist/filter-input/grammar.d.ts +96 -0
  38. package/dist/filter-input/grammar.js +133 -0
  39. package/dist/filter-input/index.d.ts +5 -0
  40. package/dist/filter-input/index.js +5 -0
  41. package/dist/filter-input/menu/filter-menu.d.ts +153 -0
  42. package/dist/filter-input/menu/filter-menu.js +164 -0
  43. package/dist/filter-input/operator/filter-operator.d.ts +105 -0
  44. package/dist/filter-input/operator/filter-operator.js +39 -0
  45. package/dist/filter-input/root/filter-input-root.d.ts +118 -9
  46. package/dist/filter-input/root/filter-input-root.js +96 -2
  47. package/dist/format-date/root/format-date-root.js +1 -1
  48. package/dist/index.d.ts +5 -0
  49. package/dist/index.js +5 -0
  50. package/dist/line-chart/root/line-chart-root.d.ts +9 -2
  51. package/dist/listbox/root/listbox-root.d.ts +8 -7
  52. package/dist/listbox/root/listbox-root.js +7 -2
  53. package/dist/menu/item/menu-item.d.ts +54 -6
  54. package/dist/menu/item/menu-item.js +31 -6
  55. package/dist/menu/root/menu-root.d.ts +23 -0
  56. package/dist/menu/root/menu-root.js +13 -2
  57. package/dist/notifications/group/notification-group.d.ts +129 -0
  58. package/dist/notifications/group/notification-group.js +106 -0
  59. package/dist/notifications/index.d.ts +1 -0
  60. package/dist/notifications/index.js +1 -0
  61. package/dist/notifications/notification/notification.d.ts +39 -13
  62. package/dist/notifications/notification/notification.js +11 -8
  63. package/dist/notifications/root/notifications-root.d.ts +57 -1
  64. package/dist/notifications/root/notifications-root.js +35 -4
  65. package/dist/number-input/root/number-input-root.d.ts +21 -1
  66. package/dist/number-input/root/number-input-root.js +18 -5
  67. package/dist/object-inspector/index.d.ts +1 -0
  68. package/dist/object-inspector/index.js +1 -0
  69. package/dist/object-inspector/root/object-inspector-root.d.ts +183 -0
  70. package/dist/object-inspector/root/object-inspector-root.js +348 -0
  71. package/dist/outline/root/outline-root.d.ts +16 -1
  72. package/dist/outline/root/outline-root.js +27 -9
  73. package/dist/radio/group/radio-group.d.ts +1 -0
  74. package/dist/scatter-chart/index.d.ts +1 -0
  75. package/dist/scatter-chart/index.js +1 -0
  76. package/dist/scatter-chart/root/scatter-chart-root.d.ts +144 -0
  77. package/dist/scatter-chart/root/scatter-chart-root.js +205 -0
  78. package/dist/skip-link/index.d.ts +1 -0
  79. package/dist/skip-link/index.js +1 -0
  80. package/dist/skip-link/root/skip-link-root.d.ts +81 -0
  81. package/dist/skip-link/root/skip-link-root.js +58 -0
  82. package/dist/speed-dial/root/speed-dial-root.d.ts +1 -0
  83. package/dist/speed-dial/root/speed-dial-root.js +6 -2
  84. package/dist/steps/root/steps-root.d.ts +1 -0
  85. package/dist/table/column/table-column.d.ts +79 -0
  86. package/dist/table/column/table-column.js +125 -5
  87. package/dist/table/root/table-root.d.ts +2 -0
  88. package/dist/table/root/table-root.js +12 -3
  89. package/dist/time-picker/root/time-picker-root.d.ts +9 -0
  90. package/dist/time-picker/root/time-picker-root.js +5 -0
  91. package/dist/toast/root/toast-root.d.ts +2 -0
  92. package/dist/tooltip/root/tooltip-root.js +1 -1
  93. package/dist/tour/root/tour-root.d.ts +1 -0
  94. package/dist/tree/item/tree-item.d.ts +7 -4
  95. package/dist/tree/item/tree-item.js +4 -1
  96. package/dist/video/root/video-root.d.ts +23 -1
  97. package/dist/video/root/video-root.js +42 -22
  98. package/dist/virtual-list/root/virtual-list-root.d.ts +10 -6
  99. package/dist/virtual-list/root/virtual-list-root.js +10 -4
  100. package/package.json +5 -5
  101. package/types/jsx.d.ts +4535 -346
  102. package/types/svelte.d.ts +11 -0
  103. 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 [...(this.children ?? [])].filter((child) => 'isTableColumn' in child && child.isTableColumn === true);
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(...[...this.children].filter((child) => !columns.has(child)));
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 in
18
- * `firstUpdated` because the server cannot inspect children. The server renders
19
- * the node as a leaf and the twisty appears on hydration, which is the harmless
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 after first render.
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
- * Rebuilds the copies from whatever the consumer has slotted.
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 assigned = event.target.assignedElements();
69
- this.media = assigned
70
- .filter((node) => node instanceof HTMLSourceElement || node instanceof HTMLTrackElement)
71
- .map((node) => {
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
- const video = this.video;
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.captionTracks;
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`, once the document exists to read.
78
+ * Reads the source named by `for`, before the render that draws it.
77
79
  *
78
- * `firstUpdated` rather than `connectedCallback`, per the server rules: the
79
- * shim has attributes and no tree, so `getElementById` is undefined there.
80
- * A source that is missing or not an array leaves the list empty rather than
81
- * throwing, because a consumer whose data has not arrived yet is the ordinary
82
- * case and an empty list says so by itself.
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.read();
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.22.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.22.0",
49
- "@fusion.dev/helix-icons": "0.22.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.22.0",
55
- "@fusion.dev/helix-testing": "0.22.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",