@fusion.dev/helix-headless 0.36.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.
@@ -18626,7 +18626,7 @@
18626
18626
  "helix": {
18627
18627
  "category": "forms",
18628
18628
  "since": "0.1.0",
18629
- "status": "experimental",
18629
+ "status": "stable",
18630
18630
  "documentation": "https://fusion.dev/helix/components/color-input",
18631
18631
  "aliases": [
18632
18632
  "ColorField",
@@ -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",
@@ -29079,7 +29079,7 @@
29079
29079
  "helix": {
29080
29080
  "category": "forms",
29081
29081
  "since": "0.1.0",
29082
- "status": "experimental",
29082
+ "status": "stable",
29083
29083
  "documentation": "https://fusion.dev/helix/components/date-input",
29084
29084
  "aliases": [
29085
29085
  "DatePicker",
@@ -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
  }
@@ -46900,7 +46904,7 @@
46900
46904
  "text": "boolean"
46901
46905
  },
46902
46906
  "default": "false",
46903
- "description": "Whether the field refuses input while still submitting its value.\n\n**The attribute is `readonly`, which is the platform's spelling.** A\ncamelCase property needs an explicit `attribute`, and dash-casing a word\nHTML writes as one costs what an attribute always costs here: nothing\nwarns. `<helix-input readonly>` is what anybody who has written HTML types;\nagainst `read-only` it parses to no property at all, and the field stays\neditable with no error anywhere. Measured on the dash-cased form, `readOnly`\ncame back `false`.\n\nA part was renamed for\nthe same kind of reason: there is no `helix-v` tag, so no consumer is\nholding the old spelling, and this is free today and a deprecation after\nthe first release.",
46907
+ "description": "Whether the field refuses input while still submitting its value.\n\n**The attribute is `readonly`, which is the platform's spelling.** A\ncamelCase property needs an explicit `attribute`, and dash-casing a word\nHTML writes as one costs what an attribute always costs here: nothing\nwarns. `<helix-input readonly>` is what anybody who has written HTML types;\nagainst `read-only` it parses to no property at all, and the field stays\neditable with no error anywhere. Measured on the dash-cased form, `readOnly`\ncame back `false`.",
46904
46908
  "attribute": "readonly",
46905
46909
  "reflects": true
46906
46910
  },
@@ -48039,7 +48043,7 @@
48039
48043
  "text": "boolean"
48040
48044
  },
48041
48045
  "default": "false",
48042
- "description": "Whether the field refuses input while still submitting its value.\n\n**The attribute is `readonly`, which is the platform's spelling.** A\ncamelCase property needs an explicit `attribute`, and dash-casing a word\nHTML writes as one costs what an attribute always costs here: nothing\nwarns. `<helix-input readonly>` is what anybody who has written HTML types;\nagainst `read-only` it parses to no property at all, and the field stays\neditable with no error anywhere. Measured on the dash-cased form, `readOnly`\ncame back `false`.\n\nA part was renamed for\nthe same kind of reason: there is no `helix-v` tag, so no consumer is\nholding the old spelling, and this is free today and a deprecation after\nthe first release.",
48046
+ "description": "Whether the field refuses input while still submitting its value.\n\n**The attribute is `readonly`, which is the platform's spelling.** A\ncamelCase property needs an explicit `attribute`, and dash-casing a word\nHTML writes as one costs what an attribute always costs here: nothing\nwarns. `<helix-input readonly>` is what anybody who has written HTML types;\nagainst `read-only` it parses to no property at all, and the field stays\neditable with no error anywhere. Measured on the dash-cased form, `readOnly`\ncame back `false`.",
48043
48047
  "fieldName": "readOnly"
48044
48048
  },
48045
48049
  {
@@ -48205,7 +48209,7 @@
48205
48209
  "helix": {
48206
48210
  "category": "forms",
48207
48211
  "since": "0.1.0",
48208
- "status": "experimental",
48212
+ "status": "stable",
48209
48213
  "documentation": "https://fusion.dev/helix/components/input",
48210
48214
  "aliases": [
48211
48215
  "TextField",
@@ -51333,6 +51337,10 @@
51333
51337
  "description": "The options, and any groups of them.",
51334
51338
  "name": ""
51335
51339
  },
51340
+ {
51341
+ "description": "The mark in the filter's field. Left empty, a magnifier is drawn.",
51342
+ "name": "filter-icon"
51343
+ },
51336
51344
  {
51337
51345
  "description": "Richer than a string.",
51338
51346
  "name": "hint"
@@ -52971,7 +52979,7 @@
52971
52979
  "helix": {
52972
52980
  "category": "forms",
52973
52981
  "since": "0.1.0",
52974
- "status": "experimental",
52982
+ "status": "stable",
52975
52983
  "documentation": "https://fusion.dev/helix/components/listbox",
52976
52984
  "aliases": [
52977
52985
  "Options",
@@ -53526,7 +53534,7 @@
53526
53534
  "text": "number"
53527
53535
  },
53528
53536
  "default": "640",
53529
- "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`.",
53530
53538
  "attribute": "full-below"
53531
53539
  },
53532
53540
  {
@@ -54259,7 +54267,7 @@
54259
54267
  "text": "number"
54260
54268
  },
54261
54269
  "default": "640",
54262
- "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`.",
54263
54271
  "fieldName": "fullBelow"
54264
54272
  },
54265
54273
  {
@@ -54315,6 +54323,10 @@
54315
54323
  }
54316
54324
  ],
54317
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
+ },
54318
54330
  {
54319
54331
  "description": "While the panel is open, which is when the trigger reads as current.",
54320
54332
  "name": "open"
@@ -54342,7 +54354,7 @@
54342
54354
  "helix": {
54343
54355
  "category": "navigation",
54344
54356
  "since": "0.1.0",
54345
- "status": "experimental",
54357
+ "status": "stable",
54346
54358
  "documentation": "https://fusion.dev/helix/components/megamenu",
54347
54359
  "aliases": [
54348
54360
  "Mega menu",
@@ -61270,7 +61282,7 @@
61270
61282
  "helix": {
61271
61283
  "category": "forms",
61272
61284
  "since": "0.1.0",
61273
- "status": "experimental",
61285
+ "status": "stable",
61274
61286
  "documentation": "https://fusion.dev/helix/components/number-input",
61275
61287
  "aliases": [
61276
61288
  "NumberField",
@@ -63941,11 +63953,11 @@
63941
63953
  "events": [
63942
63954
  {
63943
63955
  "type": {
63944
- "text": "HelixBeforeActivateEvent"
63956
+ "text": "HelixActivateEvent"
63945
63957
  },
63946
- "description": "The section being read has changed, carrying its id as the value. Cancelable: refusing it takes the decision and nothing moves.",
63947
- "name": "helix-before-activate",
63948
- "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"
63949
63961
  }
63950
63962
  ],
63951
63963
  "attributes": [
@@ -76123,7 +76135,7 @@
76123
76135
  "helix": {
76124
76136
  "category": "forms",
76125
76137
  "since": "0.1.0",
76126
- "status": "experimental",
76138
+ "status": "stable",
76127
76139
  "documentation": "https://fusion.dev/helix/components/select",
76128
76140
  "aliases": [
76129
76141
  "Dropdown",
@@ -93142,7 +93154,7 @@
93142
93154
  "helix": {
93143
93155
  "category": "forms",
93144
93156
  "since": "0.1.0",
93145
- "status": "experimental",
93157
+ "status": "stable",
93146
93158
  "documentation": "https://fusion.dev/helix/components/time-input",
93147
93159
  "aliases": [
93148
93160
  "TimeField",
@@ -100129,7 +100141,7 @@
100129
100141
  "helix": {
100130
100142
  "category": "overlays",
100131
100143
  "since": "0.1.0",
100132
- "status": "experimental",
100144
+ "status": "stable",
100133
100145
  "documentation": "https://fusion.dev/helix/components/tooltip",
100134
100146
  "aliases": [
100135
100147
  "Hint",
@@ -33,7 +33,7 @@ declare const HelixHeadlessColorInput_base: (new (...args: any[]) => import("@fu
33
33
  * itself.
34
34
  *
35
35
  * @since 0.1.0
36
- * @status experimental
36
+ * @status stable
37
37
  * @category forms
38
38
  * @aliases ColorField, ColourInput, InputColor
39
39
  * @documentation https://fusion.dev/helix/components/color-input
@@ -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}
@@ -18,7 +18,7 @@ declare const HelixHeadlessDateInput_base: (new (...args: any[]) => import("@fus
18
18
  * worth keeping: a real text field.
19
19
  *
20
20
  * @since 0.1.0
21
- * @status experimental
21
+ * @status stable
22
22
  * @category forms
23
23
  * @aliases DatePicker, DateField, InputDate
24
24
  * @documentation https://fusion.dev/helix/components/date-input
@@ -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'],
@@ -25,7 +25,7 @@ declare const HelixHeadlessInput_base: (new (...args: any[]) => import("@fusion.
25
25
  * input and its `validity` is copied onto the host.
26
26
  *
27
27
  * @since 0.1.0
28
- * @status experimental
28
+ * @status stable
29
29
  * @category forms
30
30
  * @aliases TextField, Field, TextInput
31
31
  * @documentation https://fusion.dev/helix/components/input
@@ -104,11 +104,6 @@ export declare class HelixHeadlessInput extends HelixHeadlessInput_base {
104
104
  * against `read-only` it parses to no property at all, and the field stays
105
105
  * editable with no error anywhere. Measured on the dash-cased form, `readOnly`
106
106
  * came back `false`.
107
- *
108
- * A part was renamed for
109
- * the same kind of reason: there is no `helix-v` tag, so no consumer is
110
- * holding the old spelling, and this is free today and a deprecation after
111
- * the first release.
112
107
  */
113
108
  readOnly: boolean;
114
109
  /**
@@ -20,12 +20,13 @@ declare const HelixHeadlessListbox_base: (new (...args: any[]) => import("@fusio
20
20
  * `aria-activedescendant` names it while focus stays on the list.
21
21
  *
22
22
  * @since 0.1.0
23
- * @status experimental
23
+ * @status stable
24
24
  * @category forms
25
25
  * @aliases Options, Select list
26
26
  * @documentation https://fusion.dev/helix/components/listbox
27
27
  *
28
28
  * @slot - The options, and any groups of them.
29
+ * @slot filter-icon - The mark in the filter's field. Left empty, a magnifier is drawn.
29
30
  * @slot hint - Richer than a string.
30
31
  * @slot label - Richer than a string.
31
32
  *
@@ -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();
@@ -32,7 +32,7 @@ declare const HelixHeadlessNumberInput_base: (new (...args: any[]) => import("@f
32
32
  * not corrected under their hands.
33
33
  *
34
34
  * @since 0.1.0
35
- * @status experimental
35
+ * @status stable
36
36
  * @category forms
37
37
  * @aliases NumberField, Stepper, InputNumber
38
38
  * @documentation https://fusion.dev/helix/components/number-input
@@ -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() {
@@ -21,7 +21,7 @@ declare const HelixHeadlessSelect_base: (new (...args: any[]) => import("@fusion
21
21
  * a second place the answer lives.
22
22
  *
23
23
  * @since 0.1.0
24
- * @status experimental
24
+ * @status stable
25
25
  * @category forms
26
26
  * @aliases Dropdown, Picker
27
27
  * @documentation https://fusion.dev/helix/components/select
@@ -26,7 +26,7 @@ declare const HelixHeadlessTimeInput_base: (new (...args: any[]) => import("@fus
26
26
  * back and `Intl` has no parser to make it so.
27
27
  *
28
28
  * @since 0.1.0
29
- * @status experimental
29
+ * @status stable
30
30
  * @category forms
31
31
  * @aliases TimeField, InputTime
32
32
  * @documentation https://fusion.dev/helix/components/time-input
@@ -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.36.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.36.0",
50
- "@fusion.dev/helix-icons": "0.36.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.36.0",
56
- "@fusion.dev/helix-testing": "0.36.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;
@@ -7676,12 +7694,7 @@ HTML writes as one costs what an attribute always costs here: nothing
7676
7694
  warns. `<helix-input readonly>` is what anybody who has written HTML types;
7677
7695
  against `read-only` it parses to no property at all, and the field stays
7678
7696
  editable with no error anywhere. Measured on the dash-cased form, `readOnly`
7679
- came back `false`.
7680
-
7681
- A part was renamed for
7682
- the same kind of reason: there is no `helix-v` tag, so no consumer is
7683
- holding the old spelling, and this is free today and a deprecation after
7684
- the first release. */
7697
+ came back `false`. */
7685
7698
  readonly?: (HelixHeadlessInput["readOnly"]) | undefined;
7686
7699
  /** Whether the field refuses input while still submitting its value.
7687
7700
 
@@ -7691,12 +7704,7 @@ HTML writes as one costs what an attribute always costs here: nothing
7691
7704
  warns. `<helix-input readonly>` is what anybody who has written HTML types;
7692
7705
  against `read-only` it parses to no property at all, and the field stays
7693
7706
  editable with no error anywhere. Measured on the dash-cased form, `readOnly`
7694
- came back `false`.
7695
-
7696
- A part was renamed for
7697
- the same kind of reason: there is no `helix-v` tag, so no consumer is
7698
- holding the old spelling, and this is free today and a deprecation after
7699
- the first release. */
7707
+ came back `false`. */
7700
7708
  readOnly?: (HelixHeadlessInput["readOnly"]) | undefined;
7701
7709
  /** Whether a password field offers a toggle that shows what was typed.
7702
7710
 
@@ -7840,12 +7848,7 @@ HTML writes as one costs what an attribute always costs here: nothing
7840
7848
  warns. `<helix-input readonly>` is what anybody who has written HTML types;
7841
7849
  against `read-only` it parses to no property at all, and the field stays
7842
7850
  editable with no error anywhere. Measured on the dash-cased form, `readOnly`
7843
- came back `false`.
7844
-
7845
- A part was renamed for
7846
- the same kind of reason: there is no `helix-v` tag, so no consumer is
7847
- holding the old spelling, and this is free today and a deprecation after
7848
- the first release. */
7851
+ came back `false`. */
7849
7852
  "bool:readonly"?: (HelixHeadlessInput["readOnly"]) | undefined;
7850
7853
  /** Whether the field refuses input while still submitting its value.
7851
7854
 
@@ -7855,12 +7858,7 @@ HTML writes as one costs what an attribute always costs here: nothing
7855
7858
  warns. `<helix-input readonly>` is what anybody who has written HTML types;
7856
7859
  against `read-only` it parses to no property at all, and the field stays
7857
7860
  editable with no error anywhere. Measured on the dash-cased form, `readOnly`
7858
- came back `false`.
7859
-
7860
- A part was renamed for
7861
- the same kind of reason: there is no `helix-v` tag, so no consumer is
7862
- holding the old spelling, and this is free today and a deprecation after
7863
- the first release. */
7861
+ came back `false`. */
7864
7862
  "prop:readOnly"?: (HelixHeadlessInput["readOnly"]) | undefined;
7865
7863
  /** Whether a password field offers a toggle that shows what was typed.
7866
7864
 
@@ -8679,8 +8677,16 @@ fits.
8679
8677
  a band is not a question of paint: a band is not placed against the trigger,
8680
8678
  so the controller has to be told not to measure, and that decision is here
8681
8679
  whatever the stylesheet says. Writing the width in both places would be one
8682
- number in two languages, drifting the first time either moved. This sets
8683
- `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`. */
8684
8690
  "full-below"?: (HelixHeadlessMegamenu["fullBelow"] | `${number}`) | undefined;
8685
8691
  /** The width, in pixels, under which a card becomes a band. Zero never does.
8686
8692
 
@@ -8695,8 +8701,16 @@ fits.
8695
8701
  a band is not a question of paint: a band is not placed against the trigger,
8696
8702
  so the controller has to be told not to measure, and that decision is here
8697
8703
  whatever the stylesheet says. Writing the width in both places would be one
8698
- number in two languages, drifting the first time either moved. This sets
8699
- `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`. */
8700
8714
  fullBelow?: (HelixHeadlessMegamenu["fullBelow"]) | undefined;
8701
8715
  /** The section's name, which names the default trigger and the panel. */
8702
8716
  label?: (HelixHeadlessMegamenu["label"]) | undefined;
@@ -8772,8 +8786,16 @@ fits.
8772
8786
  a band is not a question of paint: a band is not placed against the trigger,
8773
8787
  so the controller has to be told not to measure, and that decision is here
8774
8788
  whatever the stylesheet says. Writing the width in both places would be one
8775
- number in two languages, drifting the first time either moved. This sets
8776
- `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`. */
8777
8799
  "attr:full-below"?: (HelixHeadlessMegamenu["fullBelow"] | `${number}`) | undefined;
8778
8800
  /** The width, in pixels, under which a card becomes a band. Zero never does.
8779
8801
 
@@ -8788,8 +8810,16 @@ fits.
8788
8810
  a band is not a question of paint: a band is not placed against the trigger,
8789
8811
  so the controller has to be told not to measure, and that decision is here
8790
8812
  whatever the stylesheet says. Writing the width in both places would be one
8791
- number in two languages, drifting the first time either moved. This sets
8792
- `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`. */
8793
8823
  "prop:fullBelow"?: (HelixHeadlessMegamenu["fullBelow"]) | undefined;
8794
8824
  /** The section's name, which names the default trigger and the panel. */
8795
8825
  "prop:label"?: (HelixHeadlessMegamenu["label"]) | undefined;
@@ -10250,9 +10280,9 @@ export type HelixHeadlessOutlineElementEvent<E = Event> = TypedEvent<
10250
10280
  HelixHeadlessOutline,
10251
10281
  E
10252
10282
  >;
10253
- /** `helix-before-activate` event type */
10254
- export type HelixHeadlessOutlineHelixBeforeActivateElementEvent =
10255
- HelixHeadlessOutlineElementEvent<HelixBeforeActivateEvent>;
10283
+ /** `helix-activate` event type */
10284
+ export type HelixHeadlessOutlineHelixActivateElementEvent =
10285
+ HelixHeadlessOutlineElementEvent<HelixActivateEvent>;
10256
10286
 
10257
10287
  export type HelixHeadlessOutlineProps = {
10258
10288
  /** How a click on one of these links travels to its section.
@@ -10285,9 +10315,9 @@ a little more: without it the current section changes as a heading slides
10285
10315
  under the chrome rather than as it reaches the top of what can be seen. */
10286
10316
  offset?: (HelixHeadlessOutline["offset"]) | undefined;
10287
10317
 
10288
- /** The section being read has changed, carrying its id as the value. Cancelable: refusing it takes the decision and nothing moves. */
10289
- "onhelix-before-activate"?: ((
10290
- 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,
10291
10321
  ) => void) | undefined;
10292
10322
  };
10293
10323
 
@@ -10321,9 +10351,9 @@ The reading line. A page with a sticky masthead sets this to its height, or
10321
10351
  a little more: without it the current section changes as a heading slides
10322
10352
  under the chrome rather than as it reaches the top of what can be seen. */
10323
10353
  "prop:offset"?: (HelixHeadlessOutline["offset"]) | undefined;
10324
- /** The section being read has changed, carrying its id as the value. Cancelable: refusing it takes the decision and nothing moves. */
10325
- "on:helix-before-activate"?: ((
10326
- 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,
10327
10357
  ) => void) | undefined;
10328
10358
 
10329
10359
  /** Set the innerHTML of the element */
@@ -20405,6 +20435,15 @@ export type CustomElements = {
20405
20435
  *
20406
20436
  * A comma is therefore not available inside an option's value, which is the
20407
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.
20408
20447
  * - `placeholder`: Text shown while nothing has been chosen.
20409
20448
  * - `remove-label`/`removeLabel`: What a tag's remove control is called, since the mark has no name.
20410
20449
  * - `suggest`: Whether the field finishes the word as it is typed.
@@ -22698,6 +22737,7 @@ export type CustomElements = {
22698
22737
  *
22699
22738
  * These can be used to apply styling when a component is in a given state.
22700
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.
22701
22741
  * - `settled`: Set a frame after the first render. Transitions are held off until it is, so an element never animates its own arrival.
22702
22742
  */
22703
22743
  "helix-headless-drilldown": Partial<
@@ -24554,11 +24594,6 @@ export type CustomElements = {
24554
24594
  * against `read-only` it parses to no property at all, and the field stays
24555
24595
  * editable with no error anywhere. Measured on the dash-cased form, `readOnly`
24556
24596
  * came back `false`.
24557
- *
24558
- * A part was renamed for
24559
- * the same kind of reason: there is no `helix-v` tag, so no consumer is
24560
- * holding the old spelling, and this is free today and a deprecation after
24561
- * the first release.
24562
24597
  * - `reveal`: Whether a password field offers a toggle that shows what was typed.
24563
24598
  *
24564
24599
  * Ignored on every other type. A reveal on an email field would be a button
@@ -25418,6 +25453,7 @@ export type CustomElements = {
25418
25453
  * Areas where markup can be added to the component.
25419
25454
  *
25420
25455
  * - `(default)`: The options, and any groups of them.
25456
+ * - `filter-icon`: The mark in the filter's field. Left empty, a magnifier is drawn.
25421
25457
  * - `hint`: Richer than a string.
25422
25458
  * - `label`: Richer than a string.
25423
25459
  *
@@ -25638,8 +25674,16 @@ export type CustomElements = {
25638
25674
  * a band is not a question of paint: a band is not placed against the trigger,
25639
25675
  * so the controller has to be told not to measure, and that decision is here
25640
25676
  * whatever the stylesheet says. Writing the width in both places would be one
25641
- * number in two languages, drifting the first time either moved. This sets
25642
- * `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`.
25643
25687
  * - `label`: The section's name, which names the default trigger and the panel.
25644
25688
  * - `open-on`/`openOn`: Whether hovering the trigger opens the panel, or only a press does.
25645
25689
  *
@@ -25739,6 +25783,7 @@ export type CustomElements = {
25739
25783
  *
25740
25784
  * These can be used to apply styling when a component is in a given state.
25741
25785
  *
25786
+ * - `narrow`: While the page is under `full-below`, so the panel is a band whether or not one was asked for.
25742
25787
  * - `open`: While the panel is open, which is when the trigger reads as current.
25743
25788
  * - `settled`: Set a frame after the first render. Transitions are held off until it is, so an element never animates its own arrival.
25744
25789
  */
@@ -27368,7 +27413,7 @@ export type CustomElements = {
27368
27413
  *
27369
27414
  * Events that will be emitted by the component.
27370
27415
  *
27371
- * - `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.
27372
27417
  *
27373
27418
  * ## Slots
27374
27419
  *
@@ -37863,6 +37908,15 @@ export type CustomElementsSolidJs = {
37863
37908
  *
37864
37909
  * A comma is therefore not available inside an option's value, which is the
37865
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.
37866
37920
  * - `placeholder`: Text shown while nothing has been chosen.
37867
37921
  * - `remove-label`/`removeLabel`: What a tag's remove control is called, since the mark has no name.
37868
37922
  * - `suggest`: Whether the field finishes the word as it is typed.
@@ -40183,6 +40237,7 @@ export type CustomElementsSolidJs = {
40183
40237
  *
40184
40238
  * These can be used to apply styling when a component is in a given state.
40185
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.
40186
40241
  * - `settled`: Set a frame after the first render. Transitions are held off until it is, so an element never animates its own arrival.
40187
40242
  */
40188
40243
  "helix-headless-drilldown": Partial<
@@ -42064,11 +42119,6 @@ export type CustomElementsSolidJs = {
42064
42119
  * against `read-only` it parses to no property at all, and the field stays
42065
42120
  * editable with no error anywhere. Measured on the dash-cased form, `readOnly`
42066
42121
  * came back `false`.
42067
- *
42068
- * A part was renamed for
42069
- * the same kind of reason: there is no `helix-v` tag, so no consumer is
42070
- * holding the old spelling, and this is free today and a deprecation after
42071
- * the first release.
42072
42122
  * - `reveal`: Whether a password field offers a toggle that shows what was typed.
42073
42123
  *
42074
42124
  * Ignored on every other type. A reveal on an email field would be a button
@@ -42946,6 +42996,7 @@ export type CustomElementsSolidJs = {
42946
42996
  * Areas where markup can be added to the component.
42947
42997
  *
42948
42998
  * - `(default)`: The options, and any groups of them.
42999
+ * - `filter-icon`: The mark in the filter's field. Left empty, a magnifier is drawn.
42949
43000
  * - `hint`: Richer than a string.
42950
43001
  * - `label`: Richer than a string.
42951
43002
  *
@@ -43172,8 +43223,16 @@ export type CustomElementsSolidJs = {
43172
43223
  * a band is not a question of paint: a band is not placed against the trigger,
43173
43224
  * so the controller has to be told not to measure, and that decision is here
43174
43225
  * whatever the stylesheet says. Writing the width in both places would be one
43175
- * number in two languages, drifting the first time either moved. This sets
43176
- * `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`.
43177
43236
  * - `label`: The section's name, which names the default trigger and the panel.
43178
43237
  * - `open-on`/`openOn`: Whether hovering the trigger opens the panel, or only a press does.
43179
43238
  *
@@ -43273,6 +43332,7 @@ export type CustomElementsSolidJs = {
43273
43332
  *
43274
43333
  * These can be used to apply styling when a component is in a given state.
43275
43334
  *
43335
+ * - `narrow`: While the page is under `full-below`, so the panel is a band whether or not one was asked for.
43276
43336
  * - `open`: While the panel is open, which is when the trigger reads as current.
43277
43337
  * - `settled`: Set a frame after the first render. Transitions are held off until it is, so an element never animates its own arrival.
43278
43338
  */
@@ -44924,7 +44984,7 @@ export type CustomElementsSolidJs = {
44924
44984
  *
44925
44985
  * Events that will be emitted by the component.
44926
44986
  *
44927
- * - `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.
44928
44988
  *
44929
44989
  * ## Slots
44930
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;
@@ -3958,12 +3967,7 @@ HTML writes as one costs what an attribute always costs here: nothing
3958
3967
  warns. `<helix-input readonly>` is what anybody who has written HTML types;
3959
3968
  against `read-only` it parses to no property at all, and the field stays
3960
3969
  editable with no error anywhere. Measured on the dash-cased form, `readOnly`
3961
- came back `false`.
3962
-
3963
- A part was renamed for
3964
- the same kind of reason: there is no `helix-v` tag, so no consumer is
3965
- holding the old spelling, and this is free today and a deprecation after
3966
- the first release. */
3970
+ came back `false`. */
3967
3971
  readonly?: (HelixHeadlessInput["readOnly"]) | undefined;
3968
3972
  /** Whether the field refuses input while still submitting its value.
3969
3973
 
@@ -3973,12 +3977,7 @@ HTML writes as one costs what an attribute always costs here: nothing
3973
3977
  warns. `<helix-input readonly>` is what anybody who has written HTML types;
3974
3978
  against `read-only` it parses to no property at all, and the field stays
3975
3979
  editable with no error anywhere. Measured on the dash-cased form, `readOnly`
3976
- came back `false`.
3977
-
3978
- A part was renamed for
3979
- the same kind of reason: there is no `helix-v` tag, so no consumer is
3980
- holding the old spelling, and this is free today and a deprecation after
3981
- the first release. */
3980
+ came back `false`. */
3982
3981
  readOnly?: (HelixHeadlessInput["readOnly"]) | undefined;
3983
3982
  /** Whether a password field offers a toggle that shows what was typed.
3984
3983
 
@@ -4455,8 +4454,16 @@ fits.
4455
4454
  a band is not a question of paint: a band is not placed against the trigger,
4456
4455
  so the controller has to be told not to measure, and that decision is here
4457
4456
  whatever the stylesheet says. Writing the width in both places would be one
4458
- number in two languages, drifting the first time either moved. This sets
4459
- `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`. */
4460
4467
  "full-below"?: (HelixHeadlessMegamenu["fullBelow"] | `${number}`) | undefined;
4461
4468
  /** The width, in pixels, under which a card becomes a band. Zero never does.
4462
4469
 
@@ -4471,8 +4478,16 @@ fits.
4471
4478
  a band is not a question of paint: a band is not placed against the trigger,
4472
4479
  so the controller has to be told not to measure, and that decision is here
4473
4480
  whatever the stylesheet says. Writing the width in both places would be one
4474
- number in two languages, drifting the first time either moved. This sets
4475
- `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`. */
4476
4491
  fullBelow?: (HelixHeadlessMegamenu["fullBelow"]) | undefined;
4477
4492
  /** The section's name, which names the default trigger and the panel. */
4478
4493
  label?: (HelixHeadlessMegamenu["label"]) | undefined;
@@ -5257,9 +5272,9 @@ export type HelixHeadlessOutlineElementEvent<E = Event> = TypedEvent<
5257
5272
  HelixHeadlessOutline,
5258
5273
  E
5259
5274
  >;
5260
- /** `helix-before-activate` event type */
5261
- export type HelixHeadlessOutlineHelixBeforeActivateElementEvent =
5262
- HelixHeadlessOutlineElementEvent<HelixBeforeActivateEvent>;
5275
+ /** `helix-activate` event type */
5276
+ export type HelixHeadlessOutlineHelixActivateElementEvent =
5277
+ HelixHeadlessOutlineElementEvent<HelixActivateEvent>;
5263
5278
 
5264
5279
  export type HelixHeadlessOutlineVueProps = {
5265
5280
  /** How a click on one of these links travels to its section.
@@ -5294,8 +5309,8 @@ under the chrome rather than as it reaches the top of what can be seen. */
5294
5309
  };
5295
5310
 
5296
5311
  export type HelixHeadlessOutlineVueEvents = {
5297
- /** The section being read has changed, carrying its id as the value. Cancelable: refusing it takes the decision and nothing moves. */
5298
- "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;
5299
5314
  };
5300
5315
 
5301
5316
  /** `HelixHeadlessPagination` component event */