@fusion.dev/helix-headless 0.37.0 → 0.38.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.
@@ -20391,7 +20391,7 @@
20391
20391
  "text": "boolean"
20392
20392
  },
20393
20393
  "default": "false",
20394
- "description": "Whether more than one option can be chosen.\n\nThe list already does the work: `value` comes apart on commas, a press\ntoggles rather than replaces, and the arrows move without choosing. What\nthis adds is the tags, and keeping the panel open between picks.\n\nA comma is therefore not available inside an option's value, which is the\nlistbox's contract and not this element's to change.",
20394
+ "description": "Whether more than one option can be chosen.\n\nThe list already does the work: `value` comes apart on commas, a press\ntoggles rather than replaces, and the arrows move without choosing. What\nthis adds is the tags, and keeping the panel open between picks.\n\nA comma is therefore not available inside an option's value, which is the\nlistbox's contract and not this element's to change.\n\n**The list is told, and the field is not.** `aria-multiselectable` belongs\nto `listbox`, `grid`, `tree` and `tablist`, and `combobox` dropped it in\nARIA 1.2; the list sets it on itself through `ElementInternals`, where a\nreader on the field hears it through `aria-controls`. This element wrote it\nonto its own `role=\"combobox\"` input as well, which an audit reports as a\nproperty the role does not support and no spec here ever asserted: the one\nthat covers this says in as many words that telling the list is what this\nelement is responsible for.",
20395
20395
  "attribute": "multiple"
20396
20396
  },
20397
20397
  {
@@ -21987,7 +21987,7 @@
21987
21987
  "text": "boolean"
21988
21988
  },
21989
21989
  "default": "false",
21990
- "description": "Whether more than one option can be chosen.\n\nThe list already does the work: `value` comes apart on commas, a press\ntoggles rather than replaces, and the arrows move without choosing. What\nthis adds is the tags, and keeping the panel open between picks.\n\nA comma is therefore not available inside an option's value, which is the\nlistbox's contract and not this element's to change.",
21990
+ "description": "Whether more than one option can be chosen.\n\nThe list already does the work: `value` comes apart on commas, a press\ntoggles rather than replaces, and the arrows move without choosing. What\nthis adds is the tags, and keeping the panel open between picks.\n\nA comma is therefore not available inside an option's value, which is the\nlistbox's contract and not this element's to change.\n\n**The list is told, and the field is not.** `aria-multiselectable` belongs\nto `listbox`, `grid`, `tree` and `tablist`, and `combobox` dropped it in\nARIA 1.2; the list sets it on itself through `ElementInternals`, where a\nreader on the field hears it through `aria-controls`. This element wrote it\nonto its own `role=\"combobox\"` input as well, which an audit reports as a\nproperty the role does not support and no spec here ever asserted: the one\nthat covers this says in as many words that telling the list is what this\nelement is responsible for.",
21991
21991
  "fieldName": "multiple"
21992
21992
  },
21993
21993
  {
@@ -22242,7 +22242,7 @@
22242
22242
  "helix": {
22243
22243
  "category": "forms",
22244
22244
  "since": "0.1.0",
22245
- "status": "experimental",
22245
+ "status": "stable",
22246
22246
  "documentation": "https://fusion.dev/helix/components/combobox",
22247
22247
  "aliases": [
22248
22248
  "Autocomplete",
@@ -34311,7 +34311,7 @@
34311
34311
  "helix": {
34312
34312
  "category": "overlays",
34313
34313
  "since": "0.1.0",
34314
- "status": "experimental",
34314
+ "status": "stable",
34315
34315
  "documentation": "https://fusion.dev/helix/components/drawer",
34316
34316
  "aliases": [
34317
34317
  "Sheet",
@@ -34873,7 +34873,7 @@
34873
34873
  "summary": "One row of a drill-down, which may hold a page of its own.",
34874
34874
  "helix": {
34875
34875
  "since": "0.1.0",
34876
- "status": "experimental",
34876
+ "status": "stable",
34877
34877
  "documentation": "https://fusion.dev/helix/components/drilldown",
34878
34878
  "aliases": [
34879
34879
  "Panel item",
@@ -35639,6 +35639,20 @@
35639
35639
  }
35640
35640
  }
35641
35641
  ],
35642
+ "cssStates": [
35643
+ {
35644
+ "description": "While a row's page is showing rather than the top one, so a frame around this can answer the depth it is at.",
35645
+ "name": "drilled"
35646
+ },
35647
+ {
35648
+ "description": "Set a frame after the first render. Transitions are held off until it is, so an element never animates its own arrival.",
35649
+ "name": "settled",
35650
+ "inheritedFrom": {
35651
+ "name": "HelixElement",
35652
+ "module": "src/helix-element/helix-element.ts"
35653
+ }
35654
+ }
35655
+ ],
35642
35656
  "mixins": [
35643
35657
  {
35644
35658
  "name": "MixinCollection",
@@ -35653,7 +35667,7 @@
35653
35667
  "helix": {
35654
35668
  "category": "navigation",
35655
35669
  "since": "0.1.0",
35656
- "status": "experimental",
35670
+ "status": "stable",
35657
35671
  "documentation": "https://fusion.dev/helix/components/drilldown",
35658
35672
  "aliases": [
35659
35673
  "Panel",
@@ -35673,16 +35687,6 @@
35673
35687
  },
35674
35688
  "tagName": "helix-headless-drilldown",
35675
35689
  "customElement": true,
35676
- "cssStates": [
35677
- {
35678
- "description": "Set a frame after the first render. Transitions are held off until it is, so an element never animates its own arrival.",
35679
- "name": "settled",
35680
- "inheritedFrom": {
35681
- "name": "HelixElement",
35682
- "module": "src/helix-element/helix-element.ts"
35683
- }
35684
- }
35685
- ],
35686
35690
  "modulePath": "src/drilldown/root/drilldown-root.ts",
35687
35691
  "definitionPath": "src/drilldown/root/drilldown-root.ts"
35688
35692
  }
@@ -53530,7 +53534,7 @@
53530
53534
  "text": "number"
53531
53535
  },
53532
53536
  "default": "640",
53533
- "description": "The width, in pixels, under which a card becomes a band. Zero never does.\n\nA card is a panel hung off one word, and there is no room to hang anything\noff a word on a phone: the columns do not shrink past\n`--megamenu-column-size`, so four of them stay four of them and the panel\nruns off the side of the screen rather than reflowing. Below this it takes\nthe whole width and its columns stack, which is the only arrangement that\nfits.\n\n**In script rather than a media query, and only once.** Whether the panel is\na band is not a question of paint: a band is not placed against the trigger,\nso the controller has to be told not to measure, and that decision is here\nwhatever the stylesheet says. Writing the width in both places would be one\nnumber in two languages, drifting the first time either moved. This sets\n`data-narrow` on the host and the stylesheet arranges itself off that.",
53537
+ "description": "The width, in pixels, under which a card becomes a band. Zero never does.\n\nA card is a panel hung off one word, and there is no room to hang anything\noff a word on a phone: the columns do not shrink past\n`--megamenu-column-size`, so four of them stay four of them and the panel\nruns off the side of the screen rather than reflowing. Below this it takes\nthe whole width and its columns stack, which is the only arrangement that\nfits.\n\n**In script rather than a media query, and only once.** Whether the panel is\na band is not a question of paint: a band is not placed against the trigger,\nso the controller has to be told not to measure, and that decision is here\nwhatever the stylesheet says. Writing the width in both places would be one\nnumber in two languages, drifting the first time either moved. This records\n`:state(narrow)` on the host and the stylesheet arranges itself off that.\n\n**A custom state and never `data-narrow`, which is what it was.** The width\nis read in `connectedCallback`, so on a phone this is true on the very first\nupdate: an attribute written there is markup a consumer's server never sent,\nwhich React reports as a mismatch and answers by rebuilding the subtree. The\nnarrow exception the server specs describe covers a mirror that can only\nbecome true long after hydration, and a viewport measured before the first\npaint is the opposite case. See `MixinControllerOpen` on `open`.",
53534
53538
  "attribute": "full-below"
53535
53539
  },
53536
53540
  {
@@ -54263,7 +54267,7 @@
54263
54267
  "text": "number"
54264
54268
  },
54265
54269
  "default": "640",
54266
- "description": "The width, in pixels, under which a card becomes a band. Zero never does.\n\nA card is a panel hung off one word, and there is no room to hang anything\noff a word on a phone: the columns do not shrink past\n`--megamenu-column-size`, so four of them stay four of them and the panel\nruns off the side of the screen rather than reflowing. Below this it takes\nthe whole width and its columns stack, which is the only arrangement that\nfits.\n\n**In script rather than a media query, and only once.** Whether the panel is\na band is not a question of paint: a band is not placed against the trigger,\nso the controller has to be told not to measure, and that decision is here\nwhatever the stylesheet says. Writing the width in both places would be one\nnumber in two languages, drifting the first time either moved. This sets\n`data-narrow` on the host and the stylesheet arranges itself off that.",
54270
+ "description": "The width, in pixels, under which a card becomes a band. Zero never does.\n\nA card is a panel hung off one word, and there is no room to hang anything\noff a word on a phone: the columns do not shrink past\n`--megamenu-column-size`, so four of them stay four of them and the panel\nruns off the side of the screen rather than reflowing. Below this it takes\nthe whole width and its columns stack, which is the only arrangement that\nfits.\n\n**In script rather than a media query, and only once.** Whether the panel is\na band is not a question of paint: a band is not placed against the trigger,\nso the controller has to be told not to measure, and that decision is here\nwhatever the stylesheet says. Writing the width in both places would be one\nnumber in two languages, drifting the first time either moved. This records\n`:state(narrow)` on the host and the stylesheet arranges itself off that.\n\n**A custom state and never `data-narrow`, which is what it was.** The width\nis read in `connectedCallback`, so on a phone this is true on the very first\nupdate: an attribute written there is markup a consumer's server never sent,\nwhich React reports as a mismatch and answers by rebuilding the subtree. The\nnarrow exception the server specs describe covers a mirror that can only\nbecome true long after hydration, and a viewport measured before the first\npaint is the opposite case. See `MixinControllerOpen` on `open`.",
54267
54271
  "fieldName": "fullBelow"
54268
54272
  },
54269
54273
  {
@@ -54319,6 +54323,10 @@
54319
54323
  }
54320
54324
  ],
54321
54325
  "cssStates": [
54326
+ {
54327
+ "description": "While the page is under `full-below`, so the panel is a band whether or not one was asked for.",
54328
+ "name": "narrow"
54329
+ },
54322
54330
  {
54323
54331
  "description": "While the panel is open, which is when the trigger reads as current.",
54324
54332
  "name": "open"
@@ -54346,7 +54354,7 @@
54346
54354
  "helix": {
54347
54355
  "category": "navigation",
54348
54356
  "since": "0.1.0",
54349
- "status": "experimental",
54357
+ "status": "stable",
54350
54358
  "documentation": "https://fusion.dev/helix/components/megamenu",
54351
54359
  "aliases": [
54352
54360
  "Mega menu",
@@ -63945,11 +63953,11 @@
63945
63953
  "events": [
63946
63954
  {
63947
63955
  "type": {
63948
- "text": "HelixBeforeActivateEvent"
63956
+ "text": "HelixActivateEvent"
63949
63957
  },
63950
- "description": "The section being read has changed, carrying its id as the value. Cancelable: refusing it takes the decision and nothing moves.",
63951
- "name": "helix-before-activate",
63952
- "reactProp": "onhelix-before-activate"
63958
+ "description": "The section being read has changed, carrying its id as the value. An announcement: it is read off where the page is scrolled to, so there is no decision here to take.",
63959
+ "name": "helix-activate",
63960
+ "reactProp": "onhelix-activate"
63953
63961
  }
63954
63962
  ],
63955
63963
  "attributes": [
@@ -100133,7 +100141,7 @@
100133
100141
  "helix": {
100134
100142
  "category": "overlays",
100135
100143
  "since": "0.1.0",
100136
- "status": "experimental",
100144
+ "status": "stable",
100137
100145
  "documentation": "https://fusion.dev/helix/components/tooltip",
100138
100146
  "aliases": [
100139
100147
  "Hint",
@@ -34,7 +34,7 @@ declare const HelixHeadlessCombobox_base: (new (...args: any[]) => import("@fusi
34
34
  * row and fires the event; adding the option is the consumer's.
35
35
  *
36
36
  * @since 0.1.0
37
- * @status experimental
37
+ * @status stable
38
38
  * @category forms
39
39
  * @aliases Autocomplete, Typeahead, Search select
40
40
  * @documentation https://fusion.dev/helix/components/combobox
@@ -134,6 +134,15 @@ export declare class HelixHeadlessCombobox extends HelixHeadlessCombobox_base {
134
134
  *
135
135
  * A comma is therefore not available inside an option's value, which is the
136
136
  * listbox's contract and not this element's to change.
137
+ *
138
+ * **The list is told, and the field is not.** `aria-multiselectable` belongs
139
+ * to `listbox`, `grid`, `tree` and `tablist`, and `combobox` dropped it in
140
+ * ARIA 1.2; the list sets it on itself through `ElementInternals`, where a
141
+ * reader on the field hears it through `aria-controls`. This element wrote it
142
+ * onto its own `role="combobox"` input as well, which an audit reports as a
143
+ * property the role does not support and no spec here ever asserted: the one
144
+ * that covers this says in as many words that telling the list is what this
145
+ * element is responsible for.
137
146
  */
138
147
  multiple: boolean;
139
148
  /**
@@ -304,7 +304,6 @@ let HelixHeadlessCombobox = class HelixHeadlessCombobox extends MixinControllerO
304
304
  aria-autocomplete=${this.suggest ? 'both' : 'list'}
305
305
  aria-expanded=${this.open ? 'true' : 'false'}
306
306
  aria-describedby=${this.describedBy ?? nothing}
307
- aria-multiselectable=${this.multiple ? 'true' : nothing}
308
307
  placeholder=${(this.chosen.length > 0 ? '' : this.placeholder) || nothing}
309
308
  ?disabled=${this.isDisabled}
310
309
  .value=${this.multiple || this.open ? this.suggestion || this.typed : this.word}
@@ -29,7 +29,7 @@ declare const HelixHeadlessDrawer_base: (new (...args: any[]) => import("@fusion
29
29
  * ```
30
30
  *
31
31
  * @since 0.1.0
32
- * @status experimental
32
+ * @status stable
33
33
  * @category overlays
34
34
  * @aliases Sheet, Sidebar, Panel, Off-canvas
35
35
  * @documentation https://fusion.dev/helix/components/drawer
@@ -24,7 +24,7 @@ import { nothing, type PropertyValues, type TemplateResult } from 'lit';
24
24
  * pressed. Not on the server, which cannot see the children and so cannot know.
25
25
  *
26
26
  * @since 0.1.0
27
- * @status experimental
27
+ * @status stable
28
28
  * @aliases Panel item, Drill row
29
29
  * @documentation https://fusion.dev/helix/components/drilldown
30
30
  *
@@ -27,7 +27,7 @@ declare const HelixHeadlessDrilldown_base: (new (...args: any[]) => import("@fus
27
27
  * shares.
28
28
  *
29
29
  * @since 0.1.0
30
- * @status experimental
30
+ * @status stable
31
31
  * @category navigation
32
32
  * @aliases Panel, Nested list, Drill-in
33
33
  * @documentation https://fusion.dev/helix/components/drilldown
@@ -43,6 +43,8 @@ declare const HelixHeadlessDrilldown_base: (new (...args: any[]) => import("@fus
43
43
  * @csspart loading - Shown while the entries are still on their way.
44
44
  * @csspart page - The region the rows are in.
45
45
  * @csspart title - The name of the page showing.
46
+ *
47
+ * @cssstate drilled - While a row's page is showing rather than the top one, so a frame around this can answer the depth it is at.
46
48
  */
47
49
  export declare class HelixHeadlessDrilldown extends HelixHeadlessDrilldown_base {
48
50
  /**
@@ -123,7 +123,7 @@ let HelixHeadlessDrilldown = class HelixHeadlessDrilldown extends MixinCollectio
123
123
  this.mark(child, page, page === null);
124
124
  }
125
125
  this.placeTabStop();
126
- this.toggleAttribute('data-drilled', !this.drilldown.atRoot);
126
+ this.toggleState('drilled', !this.drilldown.atRoot);
127
127
  if (this.direction === undefined) {
128
128
  this.removeAttribute('data-direction');
129
129
  }
@@ -86,7 +86,7 @@ registerElementEvents({
86
86
  'helix-headless-number-input': ['change', 'helix-before-change', 'input'],
87
87
  'helix-headless-object-inspector': ['helix-copy'],
88
88
  'helix-headless-option': ['helix-select'],
89
- 'helix-headless-outline': ['helix-before-activate'],
89
+ 'helix-headless-outline': ['helix-activate'],
90
90
  'helix-headless-pagination': ['helix-navigate'],
91
91
  'helix-headless-pagination-size': ['helix-before-change'],
92
92
  'helix-headless-pin-input': ['change', 'helix-before-change', 'helix-complete', 'input'],
@@ -21,7 +21,7 @@ declare const HelixHeadlessMegamenu_base: (new (...args: any[]) => import("@fusi
21
21
  * expects to sweep along a row and see each section.
22
22
  *
23
23
  * @since 0.1.0
24
- * @status experimental
24
+ * @status stable
25
25
  * @category navigation
26
26
  * @aliases Mega menu, Flyout, Nav panel
27
27
  * @documentation https://fusion.dev/helix/components/megamenu
@@ -38,6 +38,7 @@ declare const HelixHeadlessMegamenu_base: (new (...args: any[]) => import("@fusi
38
38
  *
39
39
  * @cssproperty --megamenu-top - Where the panel starts, measured from the bar above it.
40
40
  *
41
+ * @cssstate narrow - While the page is under `full-below`, so the panel is a band whether or not one was asked for.
41
42
  * @cssstate open - While the panel is open, which is when the trigger reads as current.
42
43
  */
43
44
  export declare class HelixHeadlessMegamenu extends HelixHeadlessMegamenu_base {
@@ -55,8 +56,16 @@ export declare class HelixHeadlessMegamenu extends HelixHeadlessMegamenu_base {
55
56
  * a band is not a question of paint: a band is not placed against the trigger,
56
57
  * so the controller has to be told not to measure, and that decision is here
57
58
  * whatever the stylesheet says. Writing the width in both places would be one
58
- * number in two languages, drifting the first time either moved. This sets
59
- * `data-narrow` on the host and the stylesheet arranges itself off that.
59
+ * number in two languages, drifting the first time either moved. This records
60
+ * `:state(narrow)` on the host and the stylesheet arranges itself off that.
61
+ *
62
+ * **A custom state and never `data-narrow`, which is what it was.** The width
63
+ * is read in `connectedCallback`, so on a phone this is true on the very first
64
+ * update: an attribute written there is markup a consumer's server never sent,
65
+ * which React reports as a mismatch and answers by rebuilding the subtree. The
66
+ * narrow exception the server specs describe covers a mirror that can only
67
+ * become true long after hydration, and a viewport measured before the first
68
+ * paint is the opposite case. See `MixinControllerOpen` on `open`.
60
69
  */
61
70
  fullBelow: number;
62
71
  /**
@@ -189,7 +189,7 @@ let HelixHeadlessMegamenu = class HelixHeadlessMegamenu extends MixinControllerO
189
189
  if (changed.has('fullBelow')) {
190
190
  this.watchWidth();
191
191
  }
192
- this.toggleAttribute('data-narrow', this.narrow);
192
+ this.toggleState('narrow', this.narrow);
193
193
  this.tellTrigger();
194
194
  if (this.open) {
195
195
  this.band();
@@ -24,7 +24,7 @@ import { type PropertyValues, type TemplateResult } from 'lit';
24
24
  *
25
25
  * @slot - The links, as anchors with fragment hrefs.
26
26
  *
27
- * @event {HelixBeforeActivateEvent} helix-before-activate - The section being read has changed, carrying its id as the value. Cancelable: refusing it takes the decision and nothing moves.
27
+ * @event {HelixActivateEvent} helix-activate - The section being read has changed, carrying its id as the value. An announcement: it is read off where the page is scrolled to, so there is no decision here to take.
28
28
  *
29
29
  * @csspart indicator - The mark that travels to the section being read.
30
30
  * @csspart nav - The navigation landmark.
@@ -4,7 +4,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
4
4
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
5
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6
6
  };
7
- import { customElement, HelixBeforeActivateEvent, HelixElement, IndicatorController, } from '@fusion.dev/helix-core';
7
+ import { customElement, HelixActivateEvent, HelixElement, IndicatorController, } from '@fusion.dev/helix-core';
8
8
  import { html } from 'lit';
9
9
  import { property, state } from 'lit/decorators.js';
10
10
  let HelixHeadlessOutline = class HelixHeadlessOutline extends HelixElement {
@@ -116,7 +116,7 @@ let HelixHeadlessOutline = class HelixHeadlessOutline extends HelixElement {
116
116
  const next = active?.target.id ?? '';
117
117
  if (next !== this.reading) {
118
118
  this.reading = next;
119
- this.dispatchEvent(new HelixBeforeActivateEvent({ value: next }));
119
+ this.dispatchEvent(new HelixActivateEvent({ value: next }));
120
120
  }
121
121
  }
122
122
  get atEnd() {
@@ -38,7 +38,7 @@ declare const HelixHeadlessTooltip_base: (new (...args: any[]) => import("@fusio
38
38
  * been used.
39
39
  *
40
40
  * @since 0.1.0
41
- * @status experimental
41
+ * @status stable
42
42
  * @category overlays
43
43
  * @aliases Hint, Popup label
44
44
  * @documentation https://fusion.dev/helix/components/tooltip
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.37.0",
4
+ "version": "0.38.0",
5
5
  "license": "MIT",
6
6
  "author": "Ross Sheppard <ross.sheppard@fusion.dev>",
7
7
  "repository": {
@@ -46,14 +46,14 @@
46
46
  },
47
47
  "bugs": "https://github.com/project-fusion/fusion/issues",
48
48
  "dependencies": {
49
- "@fusion.dev/helix-core": "0.37.0",
50
- "@fusion.dev/helix-icons": "0.37.0",
49
+ "@fusion.dev/helix-core": "0.38.0",
50
+ "@fusion.dev/helix-icons": "0.38.0",
51
51
  "uqr": "^0.1.3"
52
52
  },
53
53
  "devDependencies": {
54
54
  "@custom-elements-manifest/analyzer": "^0.11.0",
55
- "@fusion.dev/helix-cem": "0.37.0",
56
- "@fusion.dev/helix-testing": "0.37.0",
55
+ "@fusion.dev/helix-cem": "0.38.0",
56
+ "@fusion.dev/helix-testing": "0.38.0",
57
57
  "@fusion.dev/scripts": "0.0.0-dev",
58
58
  "@happy-dom/global-registrator": "^20.0.0",
59
59
  "@lit-labs/ssr": "^4.1.0",
package/types/jsx.d.ts CHANGED
@@ -3283,7 +3283,16 @@ toggles rather than replaces, and the arrows move without choosing. What
3283
3283
  this adds is the tags, and keeping the panel open between picks.
3284
3284
 
3285
3285
  A comma is therefore not available inside an option's value, which is the
3286
- listbox's contract and not this element's to change. */
3286
+ listbox's contract and not this element's to change.
3287
+
3288
+ **The list is told, and the field is not.** `aria-multiselectable` belongs
3289
+ to `listbox`, `grid`, `tree` and `tablist`, and `combobox` dropped it in
3290
+ ARIA 1.2; the list sets it on itself through `ElementInternals`, where a
3291
+ reader on the field hears it through `aria-controls`. This element wrote it
3292
+ onto its own `role="combobox"` input as well, which an audit reports as a
3293
+ property the role does not support and no spec here ever asserted: the one
3294
+ that covers this says in as many words that telling the list is what this
3295
+ element is responsible for. */
3287
3296
  multiple?: (HelixHeadlessCombobox["multiple"]) | undefined;
3288
3297
  /** Text shown while nothing has been chosen. */
3289
3298
  placeholder?: (HelixHeadlessCombobox["placeholder"]) | undefined;
@@ -3449,7 +3458,16 @@ toggles rather than replaces, and the arrows move without choosing. What
3449
3458
  this adds is the tags, and keeping the panel open between picks.
3450
3459
 
3451
3460
  A comma is therefore not available inside an option's value, which is the
3452
- listbox's contract and not this element's to change. */
3461
+ listbox's contract and not this element's to change.
3462
+
3463
+ **The list is told, and the field is not.** `aria-multiselectable` belongs
3464
+ to `listbox`, `grid`, `tree` and `tablist`, and `combobox` dropped it in
3465
+ ARIA 1.2; the list sets it on itself through `ElementInternals`, where a
3466
+ reader on the field hears it through `aria-controls`. This element wrote it
3467
+ onto its own `role="combobox"` input as well, which an audit reports as a
3468
+ property the role does not support and no spec here ever asserted: the one
3469
+ that covers this says in as many words that telling the list is what this
3470
+ element is responsible for. */
3453
3471
  "prop:multiple"?: (HelixHeadlessCombobox["multiple"]) | undefined;
3454
3472
  /** Text shown while nothing has been chosen. */
3455
3473
  "prop:placeholder"?: (HelixHeadlessCombobox["placeholder"]) | undefined;
@@ -8659,8 +8677,16 @@ fits.
8659
8677
  a band is not a question of paint: a band is not placed against the trigger,
8660
8678
  so the controller has to be told not to measure, and that decision is here
8661
8679
  whatever the stylesheet says. Writing the width in both places would be one
8662
- number in two languages, drifting the first time either moved. This sets
8663
- `data-narrow` on the host and the stylesheet arranges itself off that. */
8680
+ number in two languages, drifting the first time either moved. This records
8681
+ `:state(narrow)` on the host and the stylesheet arranges itself off that.
8682
+
8683
+ **A custom state and never `data-narrow`, which is what it was.** The width
8684
+ is read in `connectedCallback`, so on a phone this is true on the very first
8685
+ update: an attribute written there is markup a consumer's server never sent,
8686
+ which React reports as a mismatch and answers by rebuilding the subtree. The
8687
+ narrow exception the server specs describe covers a mirror that can only
8688
+ become true long after hydration, and a viewport measured before the first
8689
+ paint is the opposite case. See `MixinControllerOpen` on `open`. */
8664
8690
  "full-below"?: (HelixHeadlessMegamenu["fullBelow"] | `${number}`) | undefined;
8665
8691
  /** The width, in pixels, under which a card becomes a band. Zero never does.
8666
8692
 
@@ -8675,8 +8701,16 @@ fits.
8675
8701
  a band is not a question of paint: a band is not placed against the trigger,
8676
8702
  so the controller has to be told not to measure, and that decision is here
8677
8703
  whatever the stylesheet says. Writing the width in both places would be one
8678
- number in two languages, drifting the first time either moved. This sets
8679
- `data-narrow` on the host and the stylesheet arranges itself off that. */
8704
+ number in two languages, drifting the first time either moved. This records
8705
+ `:state(narrow)` on the host and the stylesheet arranges itself off that.
8706
+
8707
+ **A custom state and never `data-narrow`, which is what it was.** The width
8708
+ is read in `connectedCallback`, so on a phone this is true on the very first
8709
+ update: an attribute written there is markup a consumer's server never sent,
8710
+ which React reports as a mismatch and answers by rebuilding the subtree. The
8711
+ narrow exception the server specs describe covers a mirror that can only
8712
+ become true long after hydration, and a viewport measured before the first
8713
+ paint is the opposite case. See `MixinControllerOpen` on `open`. */
8680
8714
  fullBelow?: (HelixHeadlessMegamenu["fullBelow"]) | undefined;
8681
8715
  /** The section's name, which names the default trigger and the panel. */
8682
8716
  label?: (HelixHeadlessMegamenu["label"]) | undefined;
@@ -8752,8 +8786,16 @@ fits.
8752
8786
  a band is not a question of paint: a band is not placed against the trigger,
8753
8787
  so the controller has to be told not to measure, and that decision is here
8754
8788
  whatever the stylesheet says. Writing the width in both places would be one
8755
- number in two languages, drifting the first time either moved. This sets
8756
- `data-narrow` on the host and the stylesheet arranges itself off that. */
8789
+ number in two languages, drifting the first time either moved. This records
8790
+ `:state(narrow)` on the host and the stylesheet arranges itself off that.
8791
+
8792
+ **A custom state and never `data-narrow`, which is what it was.** The width
8793
+ is read in `connectedCallback`, so on a phone this is true on the very first
8794
+ update: an attribute written there is markup a consumer's server never sent,
8795
+ which React reports as a mismatch and answers by rebuilding the subtree. The
8796
+ narrow exception the server specs describe covers a mirror that can only
8797
+ become true long after hydration, and a viewport measured before the first
8798
+ paint is the opposite case. See `MixinControllerOpen` on `open`. */
8757
8799
  "attr:full-below"?: (HelixHeadlessMegamenu["fullBelow"] | `${number}`) | undefined;
8758
8800
  /** The width, in pixels, under which a card becomes a band. Zero never does.
8759
8801
 
@@ -8768,8 +8810,16 @@ fits.
8768
8810
  a band is not a question of paint: a band is not placed against the trigger,
8769
8811
  so the controller has to be told not to measure, and that decision is here
8770
8812
  whatever the stylesheet says. Writing the width in both places would be one
8771
- number in two languages, drifting the first time either moved. This sets
8772
- `data-narrow` on the host and the stylesheet arranges itself off that. */
8813
+ number in two languages, drifting the first time either moved. This records
8814
+ `:state(narrow)` on the host and the stylesheet arranges itself off that.
8815
+
8816
+ **A custom state and never `data-narrow`, which is what it was.** The width
8817
+ is read in `connectedCallback`, so on a phone this is true on the very first
8818
+ update: an attribute written there is markup a consumer's server never sent,
8819
+ which React reports as a mismatch and answers by rebuilding the subtree. The
8820
+ narrow exception the server specs describe covers a mirror that can only
8821
+ become true long after hydration, and a viewport measured before the first
8822
+ paint is the opposite case. See `MixinControllerOpen` on `open`. */
8773
8823
  "prop:fullBelow"?: (HelixHeadlessMegamenu["fullBelow"]) | undefined;
8774
8824
  /** The section's name, which names the default trigger and the panel. */
8775
8825
  "prop:label"?: (HelixHeadlessMegamenu["label"]) | undefined;
@@ -10230,9 +10280,9 @@ export type HelixHeadlessOutlineElementEvent<E = Event> = TypedEvent<
10230
10280
  HelixHeadlessOutline,
10231
10281
  E
10232
10282
  >;
10233
- /** `helix-before-activate` event type */
10234
- export type HelixHeadlessOutlineHelixBeforeActivateElementEvent =
10235
- HelixHeadlessOutlineElementEvent<HelixBeforeActivateEvent>;
10283
+ /** `helix-activate` event type */
10284
+ export type HelixHeadlessOutlineHelixActivateElementEvent =
10285
+ HelixHeadlessOutlineElementEvent<HelixActivateEvent>;
10236
10286
 
10237
10287
  export type HelixHeadlessOutlineProps = {
10238
10288
  /** How a click on one of these links travels to its section.
@@ -10265,9 +10315,9 @@ a little more: without it the current section changes as a heading slides
10265
10315
  under the chrome rather than as it reaches the top of what can be seen. */
10266
10316
  offset?: (HelixHeadlessOutline["offset"]) | undefined;
10267
10317
 
10268
- /** The section being read has changed, carrying its id as the value. Cancelable: refusing it takes the decision and nothing moves. */
10269
- "onhelix-before-activate"?: ((
10270
- e: HelixHeadlessOutlineHelixBeforeActivateElementEvent,
10318
+ /** The section being read has changed, carrying its id as the value. An announcement: it is read off where the page is scrolled to, so there is no decision here to take. */
10319
+ "onhelix-activate"?: ((
10320
+ e: HelixHeadlessOutlineHelixActivateElementEvent,
10271
10321
  ) => void) | undefined;
10272
10322
  };
10273
10323
 
@@ -10301,9 +10351,9 @@ The reading line. A page with a sticky masthead sets this to its height, or
10301
10351
  a little more: without it the current section changes as a heading slides
10302
10352
  under the chrome rather than as it reaches the top of what can be seen. */
10303
10353
  "prop:offset"?: (HelixHeadlessOutline["offset"]) | undefined;
10304
- /** The section being read has changed, carrying its id as the value. Cancelable: refusing it takes the decision and nothing moves. */
10305
- "on:helix-before-activate"?: ((
10306
- e: HelixHeadlessOutlineHelixBeforeActivateElementEvent,
10354
+ /** The section being read has changed, carrying its id as the value. An announcement: it is read off where the page is scrolled to, so there is no decision here to take. */
10355
+ "on:helix-activate"?: ((
10356
+ e: HelixHeadlessOutlineHelixActivateElementEvent,
10307
10357
  ) => void) | undefined;
10308
10358
 
10309
10359
  /** Set the innerHTML of the element */
@@ -20385,6 +20435,15 @@ export type CustomElements = {
20385
20435
  *
20386
20436
  * A comma is therefore not available inside an option's value, which is the
20387
20437
  * listbox's contract and not this element's to change.
20438
+ *
20439
+ * **The list is told, and the field is not.** `aria-multiselectable` belongs
20440
+ * to `listbox`, `grid`, `tree` and `tablist`, and `combobox` dropped it in
20441
+ * ARIA 1.2; the list sets it on itself through `ElementInternals`, where a
20442
+ * reader on the field hears it through `aria-controls`. This element wrote it
20443
+ * onto its own `role="combobox"` input as well, which an audit reports as a
20444
+ * property the role does not support and no spec here ever asserted: the one
20445
+ * that covers this says in as many words that telling the list is what this
20446
+ * element is responsible for.
20388
20447
  * - `placeholder`: Text shown while nothing has been chosen.
20389
20448
  * - `remove-label`/`removeLabel`: What a tag's remove control is called, since the mark has no name.
20390
20449
  * - `suggest`: Whether the field finishes the word as it is typed.
@@ -22678,6 +22737,7 @@ export type CustomElements = {
22678
22737
  *
22679
22738
  * These can be used to apply styling when a component is in a given state.
22680
22739
  *
22740
+ * - `drilled`: While a row's page is showing rather than the top one, so a frame around this can answer the depth it is at.
22681
22741
  * - `settled`: Set a frame after the first render. Transitions are held off until it is, so an element never animates its own arrival.
22682
22742
  */
22683
22743
  "helix-headless-drilldown": Partial<
@@ -25614,8 +25674,16 @@ export type CustomElements = {
25614
25674
  * a band is not a question of paint: a band is not placed against the trigger,
25615
25675
  * so the controller has to be told not to measure, and that decision is here
25616
25676
  * whatever the stylesheet says. Writing the width in both places would be one
25617
- * number in two languages, drifting the first time either moved. This sets
25618
- * `data-narrow` on the host and the stylesheet arranges itself off that.
25677
+ * number in two languages, drifting the first time either moved. This records
25678
+ * `:state(narrow)` on the host and the stylesheet arranges itself off that.
25679
+ *
25680
+ * **A custom state and never `data-narrow`, which is what it was.** The width
25681
+ * is read in `connectedCallback`, so on a phone this is true on the very first
25682
+ * update: an attribute written there is markup a consumer's server never sent,
25683
+ * which React reports as a mismatch and answers by rebuilding the subtree. The
25684
+ * narrow exception the server specs describe covers a mirror that can only
25685
+ * become true long after hydration, and a viewport measured before the first
25686
+ * paint is the opposite case. See `MixinControllerOpen` on `open`.
25619
25687
  * - `label`: The section's name, which names the default trigger and the panel.
25620
25688
  * - `open-on`/`openOn`: Whether hovering the trigger opens the panel, or only a press does.
25621
25689
  *
@@ -25715,6 +25783,7 @@ export type CustomElements = {
25715
25783
  *
25716
25784
  * These can be used to apply styling when a component is in a given state.
25717
25785
  *
25786
+ * - `narrow`: While the page is under `full-below`, so the panel is a band whether or not one was asked for.
25718
25787
  * - `open`: While the panel is open, which is when the trigger reads as current.
25719
25788
  * - `settled`: Set a frame after the first render. Transitions are held off until it is, so an element never animates its own arrival.
25720
25789
  */
@@ -27344,7 +27413,7 @@ export type CustomElements = {
27344
27413
  *
27345
27414
  * Events that will be emitted by the component.
27346
27415
  *
27347
- * - `helix-before-activate`: The section being read has changed, carrying its id as the value. Cancelable: refusing it takes the decision and nothing moves.
27416
+ * - `helix-activate`: The section being read has changed, carrying its id as the value. An announcement: it is read off where the page is scrolled to, so there is no decision here to take.
27348
27417
  *
27349
27418
  * ## Slots
27350
27419
  *
@@ -37839,6 +37908,15 @@ export type CustomElementsSolidJs = {
37839
37908
  *
37840
37909
  * A comma is therefore not available inside an option's value, which is the
37841
37910
  * listbox's contract and not this element's to change.
37911
+ *
37912
+ * **The list is told, and the field is not.** `aria-multiselectable` belongs
37913
+ * to `listbox`, `grid`, `tree` and `tablist`, and `combobox` dropped it in
37914
+ * ARIA 1.2; the list sets it on itself through `ElementInternals`, where a
37915
+ * reader on the field hears it through `aria-controls`. This element wrote it
37916
+ * onto its own `role="combobox"` input as well, which an audit reports as a
37917
+ * property the role does not support and no spec here ever asserted: the one
37918
+ * that covers this says in as many words that telling the list is what this
37919
+ * element is responsible for.
37842
37920
  * - `placeholder`: Text shown while nothing has been chosen.
37843
37921
  * - `remove-label`/`removeLabel`: What a tag's remove control is called, since the mark has no name.
37844
37922
  * - `suggest`: Whether the field finishes the word as it is typed.
@@ -40159,6 +40237,7 @@ export type CustomElementsSolidJs = {
40159
40237
  *
40160
40238
  * These can be used to apply styling when a component is in a given state.
40161
40239
  *
40240
+ * - `drilled`: While a row's page is showing rather than the top one, so a frame around this can answer the depth it is at.
40162
40241
  * - `settled`: Set a frame after the first render. Transitions are held off until it is, so an element never animates its own arrival.
40163
40242
  */
40164
40243
  "helix-headless-drilldown": Partial<
@@ -43144,8 +43223,16 @@ export type CustomElementsSolidJs = {
43144
43223
  * a band is not a question of paint: a band is not placed against the trigger,
43145
43224
  * so the controller has to be told not to measure, and that decision is here
43146
43225
  * whatever the stylesheet says. Writing the width in both places would be one
43147
- * number in two languages, drifting the first time either moved. This sets
43148
- * `data-narrow` on the host and the stylesheet arranges itself off that.
43226
+ * number in two languages, drifting the first time either moved. This records
43227
+ * `:state(narrow)` on the host and the stylesheet arranges itself off that.
43228
+ *
43229
+ * **A custom state and never `data-narrow`, which is what it was.** The width
43230
+ * is read in `connectedCallback`, so on a phone this is true on the very first
43231
+ * update: an attribute written there is markup a consumer's server never sent,
43232
+ * which React reports as a mismatch and answers by rebuilding the subtree. The
43233
+ * narrow exception the server specs describe covers a mirror that can only
43234
+ * become true long after hydration, and a viewport measured before the first
43235
+ * paint is the opposite case. See `MixinControllerOpen` on `open`.
43149
43236
  * - `label`: The section's name, which names the default trigger and the panel.
43150
43237
  * - `open-on`/`openOn`: Whether hovering the trigger opens the panel, or only a press does.
43151
43238
  *
@@ -43245,6 +43332,7 @@ export type CustomElementsSolidJs = {
43245
43332
  *
43246
43333
  * These can be used to apply styling when a component is in a given state.
43247
43334
  *
43335
+ * - `narrow`: While the page is under `full-below`, so the panel is a band whether or not one was asked for.
43248
43336
  * - `open`: While the panel is open, which is when the trigger reads as current.
43249
43337
  * - `settled`: Set a frame after the first render. Transitions are held off until it is, so an element never animates its own arrival.
43250
43338
  */
@@ -44896,7 +44984,7 @@ export type CustomElementsSolidJs = {
44896
44984
  *
44897
44985
  * Events that will be emitted by the component.
44898
44986
  *
44899
- * - `helix-before-activate`: The section being read has changed, carrying its id as the value. Cancelable: refusing it takes the decision and nothing moves.
44987
+ * - `helix-activate`: The section being read has changed, carrying its id as the value. An announcement: it is read off where the page is scrolled to, so there is no decision here to take.
44900
44988
  *
44901
44989
  * ## Slots
44902
44990
  *
package/types/vue.d.ts CHANGED
@@ -159,11 +159,11 @@ import type {
159
159
  HelixResizeEvent,
160
160
  HelixShortcutEvent,
161
161
  HelixReadEvent,
162
- HelixBeforeActivateEvent,
162
+ HelixActivateEvent,
163
163
  HelixCompleteEvent,
164
164
  HelixBeforeCollapseEvent,
165
165
  HelixBeforeResizeEvent,
166
- HelixActivateEvent,
166
+ HelixBeforeActivateEvent,
167
167
  HelixTourAskEvent,
168
168
  HelixNextEvent,
169
169
  HelixPreviousEvent,
@@ -1724,7 +1724,16 @@ toggles rather than replaces, and the arrows move without choosing. What
1724
1724
  this adds is the tags, and keeping the panel open between picks.
1725
1725
 
1726
1726
  A comma is therefore not available inside an option's value, which is the
1727
- listbox's contract and not this element's to change. */
1727
+ listbox's contract and not this element's to change.
1728
+
1729
+ **The list is told, and the field is not.** `aria-multiselectable` belongs
1730
+ to `listbox`, `grid`, `tree` and `tablist`, and `combobox` dropped it in
1731
+ ARIA 1.2; the list sets it on itself through `ElementInternals`, where a
1732
+ reader on the field hears it through `aria-controls`. This element wrote it
1733
+ onto its own `role="combobox"` input as well, which an audit reports as a
1734
+ property the role does not support and no spec here ever asserted: the one
1735
+ that covers this says in as many words that telling the list is what this
1736
+ element is responsible for. */
1728
1737
  multiple?: (HelixHeadlessCombobox["multiple"]) | undefined;
1729
1738
  /** Text shown while nothing has been chosen. */
1730
1739
  placeholder?: (HelixHeadlessCombobox["placeholder"]) | undefined;
@@ -4445,8 +4454,16 @@ fits.
4445
4454
  a band is not a question of paint: a band is not placed against the trigger,
4446
4455
  so the controller has to be told not to measure, and that decision is here
4447
4456
  whatever the stylesheet says. Writing the width in both places would be one
4448
- number in two languages, drifting the first time either moved. This sets
4449
- `data-narrow` on the host and the stylesheet arranges itself off that. */
4457
+ number in two languages, drifting the first time either moved. This records
4458
+ `:state(narrow)` on the host and the stylesheet arranges itself off that.
4459
+
4460
+ **A custom state and never `data-narrow`, which is what it was.** The width
4461
+ is read in `connectedCallback`, so on a phone this is true on the very first
4462
+ update: an attribute written there is markup a consumer's server never sent,
4463
+ which React reports as a mismatch and answers by rebuilding the subtree. The
4464
+ narrow exception the server specs describe covers a mirror that can only
4465
+ become true long after hydration, and a viewport measured before the first
4466
+ paint is the opposite case. See `MixinControllerOpen` on `open`. */
4450
4467
  "full-below"?: (HelixHeadlessMegamenu["fullBelow"] | `${number}`) | undefined;
4451
4468
  /** The width, in pixels, under which a card becomes a band. Zero never does.
4452
4469
 
@@ -4461,8 +4478,16 @@ fits.
4461
4478
  a band is not a question of paint: a band is not placed against the trigger,
4462
4479
  so the controller has to be told not to measure, and that decision is here
4463
4480
  whatever the stylesheet says. Writing the width in both places would be one
4464
- number in two languages, drifting the first time either moved. This sets
4465
- `data-narrow` on the host and the stylesheet arranges itself off that. */
4481
+ number in two languages, drifting the first time either moved. This records
4482
+ `:state(narrow)` on the host and the stylesheet arranges itself off that.
4483
+
4484
+ **A custom state and never `data-narrow`, which is what it was.** The width
4485
+ is read in `connectedCallback`, so on a phone this is true on the very first
4486
+ update: an attribute written there is markup a consumer's server never sent,
4487
+ which React reports as a mismatch and answers by rebuilding the subtree. The
4488
+ narrow exception the server specs describe covers a mirror that can only
4489
+ become true long after hydration, and a viewport measured before the first
4490
+ paint is the opposite case. See `MixinControllerOpen` on `open`. */
4466
4491
  fullBelow?: (HelixHeadlessMegamenu["fullBelow"]) | undefined;
4467
4492
  /** The section's name, which names the default trigger and the panel. */
4468
4493
  label?: (HelixHeadlessMegamenu["label"]) | undefined;
@@ -5247,9 +5272,9 @@ export type HelixHeadlessOutlineElementEvent<E = Event> = TypedEvent<
5247
5272
  HelixHeadlessOutline,
5248
5273
  E
5249
5274
  >;
5250
- /** `helix-before-activate` event type */
5251
- export type HelixHeadlessOutlineHelixBeforeActivateElementEvent =
5252
- HelixHeadlessOutlineElementEvent<HelixBeforeActivateEvent>;
5275
+ /** `helix-activate` event type */
5276
+ export type HelixHeadlessOutlineHelixActivateElementEvent =
5277
+ HelixHeadlessOutlineElementEvent<HelixActivateEvent>;
5253
5278
 
5254
5279
  export type HelixHeadlessOutlineVueProps = {
5255
5280
  /** How a click on one of these links travels to its section.
@@ -5284,8 +5309,8 @@ under the chrome rather than as it reaches the top of what can be seen. */
5284
5309
  };
5285
5310
 
5286
5311
  export type HelixHeadlessOutlineVueEvents = {
5287
- /** The section being read has changed, carrying its id as the value. Cancelable: refusing it takes the decision and nothing moves. */
5288
- "helix-before-activate": HelixHeadlessOutlineHelixBeforeActivateElementEvent;
5312
+ /** The section being read has changed, carrying its id as the value. An announcement: it is read off where the page is scrolled to, so there is no decision here to take. */
5313
+ "helix-activate": HelixHeadlessOutlineHelixActivateElementEvent;
5289
5314
  };
5290
5315
 
5291
5316
  /** `HelixHeadlessPagination` component event */