@fusion.dev/helix-headless 0.30.2 → 0.32.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. package/custom-elements.json +2171 -152
  2. package/dist/accordion/item/accordion-item.d.ts +2 -0
  3. package/dist/app-header/root/app-header-root.d.ts +2 -0
  4. package/dist/area-chart/root/area-chart-root.d.ts +1 -0
  5. package/dist/bar-chart/root/bar-chart-root.d.ts +2 -0
  6. package/dist/bar-chart/root/bar-chart-root.js +4 -1
  7. package/dist/carousel/root/carousel-root.d.ts +1 -0
  8. package/dist/carousel/root/carousel-root.js +14 -9
  9. package/dist/chat/root/chat-root.d.ts +12 -0
  10. package/dist/chat/root/chat-root.js +4 -0
  11. package/dist/checkbox/root/checkbox-root.d.ts +6 -0
  12. package/dist/checkbox/root/checkbox-root.js +4 -1
  13. package/dist/checkbox-group/root/checkbox-group-root.d.ts +2 -0
  14. package/dist/color-input/root/color-input-root.d.ts +3 -0
  15. package/dist/combobox/root/combobox-root.d.ts +3 -0
  16. package/dist/command/root/command-root.d.ts +2 -0
  17. package/dist/data-table/root/data-table-root.d.ts +16 -0
  18. package/dist/data-table/root/data-table-root.js +13 -5
  19. package/dist/date-input/root/date-input-root.d.ts +10 -0
  20. package/dist/date-input/root/date-input-root.js +6 -2
  21. package/dist/date-picker/root/date-picker-root.d.ts +7 -0
  22. package/dist/date-picker/root/date-picker-root.js +12 -6
  23. package/dist/dialog/root/dialog-root.d.ts +2 -0
  24. package/dist/donut-chart/root/donut-chart-root.d.ts +2 -0
  25. package/dist/donut-chart/root/donut-chart-root.js +3 -2
  26. package/dist/drawer/root/drawer-root.d.ts +2 -0
  27. package/dist/drilldown/item/drilldown-item.d.ts +36 -1
  28. package/dist/drilldown/item/drilldown-item.js +30 -3
  29. package/dist/file-input/root/file-input-root.d.ts +2 -0
  30. package/dist/filter-input/menu/filter-menu.d.ts +16 -0
  31. package/dist/filter-input/menu/filter-menu.js +30 -4
  32. package/dist/filter-input/root/filter-input-root.d.ts +3 -0
  33. package/dist/heatmap/root/heatmap-root.d.ts +1 -0
  34. package/dist/input/root/input-root.d.ts +3 -0
  35. package/dist/input/root/input-root.js +1 -1
  36. package/dist/line-chart/root/line-chart-root.d.ts +1 -0
  37. package/dist/listbox/root/listbox-root.d.ts +2 -0
  38. package/dist/megamenu/root/megamenu-root.d.ts +2 -0
  39. package/dist/menu/root/menu-root.d.ts +5 -0
  40. package/dist/menu/root/menu-root.js +1 -0
  41. package/dist/meter/root/meter-root.d.ts +12 -4
  42. package/dist/meter/root/meter-root.js +10 -6
  43. package/dist/notifications/group/notification-group.d.ts +2 -0
  44. package/dist/notifications/notification/notification.d.ts +4 -0
  45. package/dist/notifications/root/notifications-root.d.ts +2 -0
  46. package/dist/number-input/root/number-input-root.d.ts +2 -0
  47. package/dist/object-inspector/root/object-inspector-root.d.ts +1 -0
  48. package/dist/object-inspector/root/object-inspector-root.js +5 -4
  49. package/dist/option/root/option-root.d.ts +4 -0
  50. package/dist/option/root/option-root.js +4 -1
  51. package/dist/pagination/root/pagination-root.d.ts +5 -0
  52. package/dist/pagination/root/pagination-root.js +2 -2
  53. package/dist/pagination/size/pagination-size.d.ts +27 -3
  54. package/dist/pagination/size/pagination-size.js +16 -2
  55. package/dist/pin-input/root/pin-input-root.d.ts +2 -0
  56. package/dist/popover/root/popover-root.d.ts +2 -0
  57. package/dist/radio/group/radio-group.d.ts +2 -0
  58. package/dist/radio/root/radio-root.d.ts +2 -0
  59. package/dist/rating/root/rating-root.d.ts +2 -0
  60. package/dist/scatter-chart/root/scatter-chart-root.d.ts +2 -0
  61. package/dist/scatter-chart/root/scatter-chart-root.js +1 -1
  62. package/dist/scroll-area/root/scroll-area-root.d.ts +6 -0
  63. package/dist/scroll-area/root/scroll-area-root.js +4 -3
  64. package/dist/select/root/select-root.d.ts +3 -0
  65. package/dist/slider/root/slider-root.d.ts +2 -0
  66. package/dist/speed-dial/root/speed-dial-root.d.ts +2 -0
  67. package/dist/switch/root/switch-root.d.ts +3 -0
  68. package/dist/table/column/table-column.d.ts +16 -2
  69. package/dist/table/column/table-column.js +3 -8
  70. package/dist/tabs/panel/tab-panel.d.ts +2 -0
  71. package/dist/tabs/tab/tab.d.ts +2 -0
  72. package/dist/textarea/root/textarea-root.d.ts +2 -0
  73. package/dist/time-input/root/time-input-root.d.ts +6 -0
  74. package/dist/time-input/root/time-input-root.js +2 -0
  75. package/dist/time-picker/root/time-picker-root.d.ts +20 -5
  76. package/dist/time-picker/root/time-picker-root.js +30 -11
  77. package/dist/toggle/group/toggle-group.d.ts +2 -0
  78. package/dist/toggle/root/toggle-root.d.ts +2 -0
  79. package/dist/tooltip/root/tooltip-root.d.ts +2 -0
  80. package/dist/tour/stop/tour-stop.d.ts +5 -0
  81. package/dist/tour/stop/tour-stop.js +11 -0
  82. package/dist/tree/item/tree-item.d.ts +3 -0
  83. package/dist/video/root/video-root.d.ts +1 -0
  84. package/dist/video/root/video-root.js +1 -1
  85. package/dist/video-playlist/item/video-playlist-item.d.ts +1 -0
  86. package/dist/video-playlist/item/video-playlist-item.js +1 -1
  87. package/package.json +5 -5
  88. package/types/jsx.d.ts +2000 -26
  89. package/types/vue.d.ts +17 -4
@@ -59,6 +59,22 @@ import '../../menu/index.js';
59
59
  * @slot trigger - The control that opens the menu. A `Button` is the usual one.
60
60
  *
61
61
  * @event {HelixFacetEvent} helix-facet - Fired when a field's values change. Cancelable: refusing it takes the decision and nothing moves.
62
+ *
63
+ * @csspart divider - The rule between a field's comparisons and its values.
64
+ * @csspart divider-content - What is set into the rule.
65
+ * @csspart divider-line - The rule itself.
66
+ * @csspart entry - One row: a field, its comparison, an operator or a value.
67
+ * @csspart entry-item - The row itself.
68
+ * @csspart entry-mark - The trailing mark: a tick on a chosen value, a caret on a field.
69
+ * @csspart entry-start - The leading column.
70
+ * @csspart menu - The menu the fields are offered in.
71
+ * @csspart menu-back - The control that returns from a field's page.
72
+ * @csspart menu-back-mark - The glyph on the back control.
73
+ * @csspart menu-empty - Shown when there are no fields to offer.
74
+ * @csspart menu-header - The bar above a field's page, holding the way back and its name.
75
+ * @csspart menu-loading - Shown while the fields are still on their way.
76
+ * @csspart menu-surface - The floating panel the menu is drawn on.
77
+ * @csspart menu-title - The name of the field whose page is showing.
62
78
  */
63
79
  export declare class HelixHeadlessFilterMenu extends HelixElement {
64
80
  /**
@@ -115,19 +115,38 @@ let HelixHeadlessFilterMenu = class HelixHeadlessFilterMenu extends HelixElement
115
115
  const divider = this.tag('divider');
116
116
  const menu = this.tag('menu');
117
117
  const item = this.tag('menu-item');
118
- return html `<${menu} label=${this.label} @helix-select=${this.handleSelect}>
118
+ return html `<${menu}
119
+ part="menu"
120
+ exportparts="back: menu-back, back-mark: menu-back-mark, empty: menu-empty, header: menu-header,
121
+ loading: menu-loading, surface: menu-surface, title: menu-title"
122
+ label=${this.label}
123
+ @helix-select=${this.handleSelect}
124
+ >
119
125
  <slot name="trigger" slot="trigger"></slot>
120
126
  ${this.fields.map((field) => {
121
127
  const { label, name, operators, values } = field.vocabulary;
122
128
  const ticked = this.picked.get(name) ?? new Set();
123
129
  const using = this.operatorFor(field);
124
130
  const offered = using?.arity === 'none' ? [] : values;
125
- return html `<${item} data-facet="field" data-field=${name}>
131
+ return html `<${item}
132
+ part="entry"
133
+ exportparts="item: entry-item, mark: entry-mark, start: entry-start"
134
+ data-facet="field"
135
+ data-field=${name}
136
+ >
126
137
  ${label}
127
138
  ${operators.length > 1
128
- ? html `<${item} slot="submenu" data-facet="comparison" data-field=${name}>
139
+ ? html `<${item}
140
+ part="entry"
141
+ exportparts="item: entry-item, mark: entry-mark, start: entry-start"
142
+ slot="submenu"
143
+ data-facet="comparison"
144
+ data-field=${name}
145
+ >
129
146
  ${using?.label ?? ''}
130
147
  ${operators.map((operator) => html `<${item}
148
+ part="entry"
149
+ exportparts="item: entry-item, mark: entry-mark, start: entry-start"
131
150
  slot="submenu"
132
151
  checkable
133
152
  exclusive
@@ -139,9 +158,16 @@ let HelixHeadlessFilterMenu = class HelixHeadlessFilterMenu extends HelixElement
139
158
  </${item}>`
140
159
  : nothing}
141
160
  ${operators.length > 1 && offered.length > 0
142
- ? html `<${divider} slot="submenu" announced></${divider}>`
161
+ ? html `<${divider}
162
+ part="divider"
163
+ exportparts="content: divider-content, line: divider-line"
164
+ slot="submenu"
165
+ announced
166
+ ></${divider}>`
143
167
  : nothing}
144
168
  ${offered.map((option) => html `<${item}
169
+ part="entry"
170
+ exportparts="item: entry-item, mark: entry-mark, start: entry-start"
145
171
  slot="submenu"
146
172
  checkable
147
173
  ?exclusive=${using?.arity === 'one'}
@@ -113,6 +113,9 @@ declare const HelixHeadlessFilterInput_base: (new (...args: any[]) => import("@f
113
113
  * @csspart rest - How many tokens did not fit. A `<button>` with `expandable`, a `<span>` without it.
114
114
  * @csspart surface - The floating panel the suggestions sit in.
115
115
  * @csspart tags - The row the tokens sit in.
116
+ *
117
+ * @cssstate invalid - While there is feedback to show: the platform's verdict, or the consumer's `feedback`.
118
+ * @cssstate open - While the suggestions are open.
116
119
  */
117
120
  export declare class HelixHeadlessFilterInput extends HelixHeadlessFilterInput_base {
118
121
  protected readonly aria: AriaForwardController;
@@ -49,6 +49,7 @@ declare const HelixHeadlessHeatmap_base: typeof HelixElement & (new (...args: an
49
49
  * @csspart summary - The middle slot's box.
50
50
  * @csspart tooltip - The bubble, forwarded from `Tooltip`.
51
51
  * @csspart tooltip-anchor - The `Tooltip` element itself.
52
+ * @csspart tooltip-arrow - The bubble's point, forwarded from `Tooltip`.
52
53
  * @csspart tooltip-cell - One column's name and value inside the tooltip.
53
54
  * @csspart tooltip-label - The reading's own name inside the tooltip.
54
55
  * @csspart tooltip-name - A column's name inside the tooltip.
@@ -44,6 +44,9 @@ declare const HelixHeadlessInput_base: (new (...args: any[]) => import("@fusion.
44
44
  * @csspart hint - Help under the field, while nothing is wrong.
45
45
  * @csspart label - The question, over the field.
46
46
  * @csspart reveal - The button that shows and hides a password.
47
+ * @csspart reveal-pressed - The reveal button while the password shows, beside `reveal`.
48
+ *
49
+ * @cssstate invalid - While there is feedback to show: the platform's verdict, or the consumer's `feedback`.
47
50
  */
48
51
  export declare class HelixHeadlessInput extends HelixHeadlessInput_base {
49
52
  protected readonly aria: AriaForwardController;
@@ -159,7 +159,7 @@ let HelixHeadlessInput = class HelixHeadlessInput extends MixinControllerValue(M
159
159
  : nothing}
160
160
  ${this.reveal && this.type === 'password'
161
161
  ? html `<button
162
- part="reveal"
162
+ part="reveal${this.revealed ? ' reveal-pressed' : ''}"
163
163
  type="button"
164
164
  aria-label=${this.revealLabel}
165
165
  aria-pressed=${this.revealed ? 'true' : 'false'}
@@ -55,6 +55,7 @@ declare const HelixHeadlessLineChart_base: typeof HelixElement & (new (...args:
55
55
  * @csspart terminus - The mark on one series' last reading.
56
56
  * @csspart tooltip - The bubble, forwarded from `Tooltip`.
57
57
  * @csspart tooltip-anchor - The `Tooltip` element itself.
58
+ * @csspart tooltip-arrow - The bubble's point, forwarded from `Tooltip`.
58
59
  * @csspart tooltip-cell - One column's name and value inside the tooltip.
59
60
  * @csspart tooltip-label - The reading's own name inside the tooltip.
60
61
  * @csspart tooltip-name - A column's name inside the tooltip.
@@ -44,6 +44,8 @@ declare const HelixHeadlessListbox_base: (new (...args: any[]) => import("@fusio
44
44
  * @csspart loading - Shown while the options are still on their way.
45
45
  * @csspart search - The region holding the field that narrows the list.
46
46
  * @csspart search-field - The field itself.
47
+ *
48
+ * @cssstate invalid - While there is feedback to show: the platform's verdict, or the consumer's `feedback`.
47
49
  */
48
50
  export declare class HelixHeadlessListbox extends HelixHeadlessListbox_base {
49
51
  protected readonly aria: AriaForwardController;
@@ -37,6 +37,8 @@ declare const HelixHeadlessMegamenu_base: (new (...args: any[]) => import("@fusi
37
37
  * @csspart trigger - The default trigger, where none was slotted.
38
38
  *
39
39
  * @cssproperty --megamenu-top - Where the panel starts, measured from the bar above it.
40
+ *
41
+ * @cssstate open - While the panel is open, which is when the trigger reads as current.
40
42
  */
41
43
  export declare class HelixHeadlessMegamenu extends HelixHeadlessMegamenu_base {
42
44
  /**
@@ -43,6 +43,11 @@ declare const HelixHeadlessMenu_base: (new (...args: any[]) => import("@fusion.d
43
43
  * @csspart loading - Shown while the items are still on their way.
44
44
  * @csspart surface - The floating panel the menu is drawn on.
45
45
  * @csspart title - The name of the submenu that is showing.
46
+ *
47
+ * @cssstate drilled - While a submenu's page is showing rather than the menu's own, so what is not a row can leave with the page it was on.
48
+ * @cssstate mark - While a row on the page showing can be ticked or leads to a page, so the trailing column is held open for every row.
49
+ * @cssstate open - While the menu is open.
50
+ * @cssstate start - While a row on the page showing has something in its leading column, so that column is held open for every row.
46
51
  */
47
52
  export declare class HelixHeadlessMenu extends HelixHeadlessMenu_base {
48
53
  /**
@@ -156,6 +156,7 @@ let HelixHeadlessMenu = class HelixHeadlessMenu extends MixinCollection(MixinCon
156
156
  }
157
157
  this.mark(item, this.drilldown.atRoot);
158
158
  }
159
+ this.toggleState('drilled', !this.drilldown.atRoot);
159
160
  this.markColumns();
160
161
  }
161
162
  markColumns() {
@@ -25,6 +25,11 @@ export type MeterBand = 'fair' | 'good' | 'poor';
25
25
  *
26
26
  * @csspart groove - The unfilled circle, in `ring` and `arc`.
27
27
  * @csspart indicator - The part of it the value fills.
28
+ * @csspart indicator-fair - The fill while the reading is in a band beside the good one, beside `indicator`.
29
+ * @csspart indicator-good - The fill while the reading is in the good band, beside `indicator`.
30
+ * @csspart indicator-over - The fill while the value is past the top, beside `indicator`.
31
+ * @csspart indicator-poor - The fill while the reading is two bands from the good one, beside `indicator`.
32
+ * @csspart indicator-under - The fill while the value is below the floor, beside `indicator`.
28
33
  * @csspart tick - A mark at `low` or at `high`.
29
34
  * @csspart track - The whole range, or the drawing in `ring` and `arc`.
30
35
  * @csspart value - The reading, under `show-value`.
@@ -58,8 +63,10 @@ export declare class HelixHeadlessMeter extends HelixElement {
58
63
  * again is a worse API than letting them say it.
59
64
  *
60
65
  * Not reflected. Nothing selects on it: the band reaches the stylesheet as
61
- * `data-band` on the fill, because that is the element being colored, so
62
- * reflecting here would write an attribute onto the host for no reader.
66
+ * `data-band` on the fill, because that is the element being colored, and a
67
+ * stylesheet outside as `indicator-good`, `-fair` or `-poor` among the fill's
68
+ * part names, so reflecting here would write an attribute onto the host for
69
+ * no reader.
63
70
  */
64
71
  band?: MeterBand;
65
72
  /**
@@ -156,8 +163,9 @@ export declare class HelixHeadlessMeter extends HelixElement {
156
163
  * "you are over" is worse than no meter for the one case anybody checks it in.
157
164
  *
158
165
  * The bar still stops at its end, because that is what an end is. The words
159
- * and the accessible reading carry the truth, and `data-beyond` is on the fill
160
- * so a consumer can say more about it.
166
+ * and the accessible reading carry the truth, and the fill carries
167
+ * `indicator-over` or `indicator-under` among its part names so a consumer can
168
+ * say more about it.
161
169
  */
162
170
  private get ratio();
163
171
  /** Whether the value is past an end, which the bar itself cannot show. */
@@ -78,6 +78,8 @@ let HelixHeadlessMeter = class HelixHeadlessMeter extends HelixElement {
78
78
  }
79
79
  renderRound() {
80
80
  const bounds = this.thresholds;
81
+ const band = this.computedBand;
82
+ const beyond = this.beyond;
81
83
  const { max, min } = this.span;
82
84
  const sweep = this.shape === 'arc' ? 75 : 100;
83
85
  const along = (value) => ((value - min) / (max - min)) * sweep;
@@ -92,16 +94,18 @@ let HelixHeadlessMeter = class HelixHeadlessMeter extends HelixElement {
92
94
  <circle part="tick" pathLength="100" style="--meter-along: ${along(bounds.high)}" />`
93
95
  : nothing}
94
96
  <circle
95
- part="indicator"
97
+ part="indicator${band ? { fair: ' indicator-fair', good: ' indicator-good', poor: ' indicator-poor' }[band] : ''}${beyond ? { over: ' indicator-over', under: ' indicator-under' }[beyond] : ''}"
96
98
  pathLength="100"
97
- data-band=${this.computedBand ?? nothing}
98
- data-beyond=${this.beyond ?? nothing}
99
+ data-band=${band ?? nothing}
100
+ data-beyond=${beyond ?? nothing}
99
101
  style="--meter-along: ${this.fraction * sweep}"
100
102
  />
101
103
  </svg>`;
102
104
  }
103
105
  render() {
104
106
  const bounds = this.thresholds;
107
+ const band = this.computedBand;
108
+ const beyond = this.beyond;
105
109
  const { max, min } = this.span;
106
110
  const at = (value) => `${((value - min) / (max - min)) * 100}%`;
107
111
  return html `${this.shape
@@ -112,9 +116,9 @@ let HelixHeadlessMeter = class HelixHeadlessMeter extends HelixElement {
112
116
  <span part="tick" style="--meter-at: ${at(bounds.high)}"></span>`
113
117
  : nothing}
114
118
  <div
115
- part="indicator"
116
- data-band=${this.computedBand ?? nothing}
117
- data-beyond=${this.beyond ?? nothing}
119
+ part="indicator${band ? { fair: ' indicator-fair', good: ' indicator-good', poor: ' indicator-poor' }[band] : ''}${beyond ? { over: ' indicator-over', under: ' indicator-under' }[beyond] : ''}"
120
+ data-band=${band ?? nothing}
121
+ data-beyond=${beyond ?? nothing}
118
122
  style="--meter-fraction: ${this.fraction}"
119
123
  ></div>
120
124
  </div>`}
@@ -45,6 +45,8 @@ declare const HelixHeadlessNotificationGroup_base: (new (...args: any[]) => impo
45
45
  * @csspart items - The region holding the notifications.
46
46
  * @csspart label - What the group is called.
47
47
  * @csspart trigger - The control that collapses and expands, where collapsible.
48
+ *
49
+ * @cssstate open - While the group shows every notification in it rather than the first.
48
50
  */
49
51
  export declare class HelixHeadlessNotificationGroup extends HelixHeadlessNotificationGroup_base {
50
52
  /**
@@ -59,6 +59,10 @@ import '../../format-date/index.js';
59
59
  * @csspart media - The leading slot's box.
60
60
  * @csspart time - When it happened, read the way a person reads one.
61
61
  * @csspart trailing - The column holding the time and the controls.
62
+ *
63
+ * @cssstate actions - While the actions slot holds something, so the words above make room for it.
64
+ * @cssstate controls - While it can be dismissed, so the time makes way for the control under a pointer.
65
+ * @cssstate read - While it has been read.
62
66
  */
63
67
  export declare class HelixHeadlessNotification extends HelixElement {
64
68
  /**
@@ -43,6 +43,8 @@ declare const HelixHeadlessNotifications_base: (new (...args: any[]) => import("
43
43
  * @csspart list - The list itself.
44
44
  * @csspart loading - Shown while the feed is still on its way.
45
45
  * @csspart mark-all - The control that marks everything read.
46
+ *
47
+ * @cssstate media - While a notification in the list holds something in its media slot, so every row keeps that column.
46
48
  */
47
49
  export declare class HelixHeadlessNotifications extends HelixHeadlessNotifications_base {
48
50
  /**
@@ -53,6 +53,8 @@ declare const HelixHeadlessNumberInput_base: (new (...args: any[]) => import("@f
53
53
  * @csspart increment - The control that steps up.
54
54
  * @csspart increment-mark - The glyph on the step up control.
55
55
  * @csspart label - The name over the field, which is also the scrub grip.
56
+ *
57
+ * @cssstate invalid - While there is feedback to show: the platform's verdict, or the consumer's `feedback`.
56
58
  */
57
59
  export declare class HelixHeadlessNumberInput extends HelixHeadlessNumberInput_base {
58
60
  protected readonly aria: AriaForwardController;
@@ -77,6 +77,7 @@ interface Row {
77
77
  * @csspart null - A `null`.
78
78
  * @csspart number - A number.
79
79
  * @csspart row - One entry, a tree item.
80
+ * @csspart row-active - The entry the keyboard is on, beside `row`.
80
81
  * @csspart string - A string, in quotes.
81
82
  * @csspart summary - The brackets standing for a branch's contents.
82
83
  * @csspart toggle - The caret on a branch: down when open, across when closed.
@@ -32,7 +32,7 @@ let HelixHeadlessObjectInspector = class HelixHeadlessObjectInspector extends He
32
32
  count: () => this.rows.length,
33
33
  estimate: () => 24,
34
34
  measured: () => this.windowed,
35
- rows: () => [...(this.renderRoot?.querySelectorAll('[part="row"]') ?? [])].map((element) => ({ element, index: Number(element.dataset.index) })),
35
+ rows: () => [...(this.renderRoot?.querySelectorAll('[part~="row"]') ?? [])].map((element) => ({ element, index: Number(element.dataset.index) })),
36
36
  });
37
37
  this.rows = [];
38
38
  this.copier = new CopyController(this);
@@ -189,7 +189,7 @@ let HelixHeadlessObjectInspector = class HelixHeadlessObjectInspector extends He
189
189
  scrollItemIntoView(row);
190
190
  return;
191
191
  }
192
- const drawn = [...(tree?.querySelectorAll('[part="row"]') ?? [])];
192
+ const drawn = [...(tree?.querySelectorAll('[part~="row"]') ?? [])];
193
193
  const first = drawn[0];
194
194
  const last = drawn.at(-1);
195
195
  if (!tree || !this.windowed || !first || !last || attempts === 0) {
@@ -255,12 +255,13 @@ let HelixHeadlessObjectInspector = class HelixHeadlessObjectInspector extends He
255
255
  return html `<span part="string">${String(value)}</span>`;
256
256
  }
257
257
  renderRow(row, index) {
258
+ const active = index === this.active;
258
259
  return html `<div
259
- part="row"
260
+ part="row${active ? ' row-active' : ''}"
260
261
  role="treeitem"
261
262
  id=${`row-${index}`}
262
263
  data-index=${index}
263
- ?data-active=${index === this.active}
264
+ ?data-active=${active}
264
265
  aria-level=${row.depth + 1}
265
266
  aria-posinset=${row.position}
266
267
  aria-setsize=${row.siblings}
@@ -54,8 +54,12 @@ export declare const optionsAmong: (elements: readonly Element[]) => HelixHeadle
54
54
  *
55
55
  * @csspart description - The caption under the words, when there is one.
56
56
  * @csspart item - The row.
57
+ * @csspart item-active - The row the keyboard is on, beside `item`.
58
+ * @csspart item-selected - The row of a chosen option, beside `item`.
57
59
  * @csspart label - The words.
58
60
  * @csspart text - The words and the caption under them, as one column.
61
+ *
62
+ * @cssstate selected - While the option is chosen.
59
63
  */
60
64
  export declare class HelixHeadlessOption extends HelixElement {
61
65
  /**
@@ -52,7 +52,10 @@ let HelixHeadlessOption = class HelixHeadlessOption extends HelixElement {
52
52
  this.internals.ariaDisabled = this.disabled ? 'true' : null;
53
53
  this.internals.ariaDescription =
54
54
  this.alternate !== '' && this.alternateLabel !== '' ? this.alternateLabel : null;
55
- return html `<div part="item" @click=${() => this.select()}>
55
+ return html `<div
56
+ part="item${this.selected ? ' item-selected' : ''}${this.active ? ' item-active' : ''}"
57
+ @click=${() => this.select()}
58
+ >
56
59
  <slot name="start"></slot>
57
60
  <span part="text">
58
61
  <span part="label"><slot></slot></span>
@@ -55,8 +55,11 @@ import { type PropertyValues, type TemplateResult } from 'lit';
55
55
  * @csspart mark - The glyph on a first, previous, next or last control, where none is slotted.
56
56
  * @csspart next - The control that moves forward one page.
57
57
  * @csspart page - The control for one page.
58
+ * @csspart page-current - The page you are on, beside `page`.
58
59
  * @csspart previous - The control that moves back one page.
59
60
  * @csspart status - The reading of where you are, in `compact`.
61
+ *
62
+ * @cssstate empty - While there is one page or none, which is nothing to page through.
60
63
  */
61
64
  export declare class HelixHeadlessPagination extends HelixElement {
62
65
  /**
@@ -277,6 +280,8 @@ export declare class HelixHeadlessPagination extends HelixElement {
277
280
  * `aria-current="page"` is what says which one you are on, and it stays a
278
281
  * control rather than becoming text: a reader who tabs into the run and finds
279
282
  * the current page missing from it has lost the only landmark in the row.
283
+ * `page-current` says the same to a stylesheet, which the attribute cannot:
284
+ * nothing can follow `::part()` to read it.
280
285
  */
281
286
  private renderPage;
282
287
  /**
@@ -136,7 +136,7 @@ let HelixHeadlessPagination = class HelixHeadlessPagination extends HelixElement
136
136
  return html `<li part="item">
137
137
  ${this.href
138
138
  ? html `<a
139
- part="page"
139
+ part="page${current ? ' page-current' : ''}"
140
140
  href=${fill(this.href, page, this.count)}
141
141
  aria-current=${current ? 'page' : nothing}
142
142
  aria-label=${name}
@@ -144,7 +144,7 @@ let HelixHeadlessPagination = class HelixHeadlessPagination extends HelixElement
144
144
  >${shown}</a
145
145
  >`
146
146
  : html `<button
147
- part="page"
147
+ part="page${current ? ' page-current' : ''}"
148
148
  type="button"
149
149
  aria-current=${current ? 'page' : nothing}
150
150
  aria-label=${name}
@@ -40,9 +40,33 @@ import '../../select/index.js';
40
40
  * @event {HelixBeforeChangeEvent} helix-before-change - Fired before the size changes, and cancelable. The only way to refuse one.
41
41
  *
42
42
  * @csspart control - The select.
43
- * @csspart label - The words beside the number, forwarded from the select.
44
- * @csspart trigger - The closed control, forwarded from the select.
45
- * @csspart value - The chosen size inside the trigger, forwarded from the select.
43
+ * @csspart control-feedback - What is wrong with it.
44
+ * @csspart control-hint - Help under the trigger.
45
+ * @csspart control-indicator - The caret saying the control opens.
46
+ * @csspart control-label - The words beside the number.
47
+ * @csspart control-listbox - The list inside it.
48
+ * @csspart control-listbox-empty - Shown when a filter has hidden everything.
49
+ * @csspart control-listbox-feedback - What is wrong with the list.
50
+ * @csspart control-listbox-filter-icon - The mark beside the filter field.
51
+ * @csspart control-listbox-filter-mark - The glyph beside the filter field, where none is slotted.
52
+ * @csspart control-listbox-hint - Help under the list.
53
+ * @csspart control-listbox-items - The list itself.
54
+ * @csspart control-listbox-label - The question, over the list.
55
+ * @csspart control-listbox-loading - Shown while the options are still on their way.
56
+ * @csspart control-listbox-search - The region holding the field that narrows the list.
57
+ * @csspart control-listbox-search-field - The field itself.
58
+ * @csspart control-surface - The floating panel.
59
+ * @csspart control-trigger - The closed control, which says what size is chosen.
60
+ * @csspart control-value - The chosen size inside the trigger.
61
+ * @csspart option - One size on offer.
62
+ * @csspart option-description - The caption under the number, when there is one.
63
+ * @csspart option-item - The row.
64
+ * @csspart option-item-active - The row the keyboard is on.
65
+ * @csspart option-item-selected - The row of the size chosen.
66
+ * @csspart option-label - The number.
67
+ * @csspart option-text - The number and the caption, as one column.
68
+ *
69
+ * @cssstate empty - While there are no sizes to offer.
46
70
  */
47
71
  export declare class HelixHeadlessPaginationSize extends HelixElement {
48
72
  /**
@@ -72,12 +72,26 @@ let HelixHeadlessPaginationSize = class HelixHeadlessPaginationSize extends Heli
72
72
  const option = this.tag('option');
73
73
  return html `<${select}
74
74
  part="control"
75
- exportparts="label, trigger, value"
75
+ exportparts="feedback: control-feedback, hint: control-hint, indicator: control-indicator,
76
+ label: control-label, listbox: control-listbox, listbox-empty: control-listbox-empty,
77
+ listbox-feedback: control-listbox-feedback, listbox-filter-icon: control-listbox-filter-icon,
78
+ listbox-filter-mark: control-listbox-filter-mark, listbox-hint: control-listbox-hint,
79
+ listbox-items: control-listbox-items, listbox-label: control-listbox-label,
80
+ listbox-loading: control-listbox-loading, listbox-search: control-listbox-search,
81
+ listbox-search-field: control-listbox-search-field, surface: control-surface,
82
+ trigger: control-trigger, value: control-value"
76
83
  label=${this.label}
77
84
  .value=${String(this.current)}
78
85
  @helix-before-change=${this.handleChange}
79
86
  >
80
- ${this.options.map((size) => html `<${option} value=${String(size)}>${this.numbers(size)}</${option}>`)}
87
+ ${this.options.map((size) => html `<${option}
88
+ part="option"
89
+ exportparts="description: option-description, item: option-item,
90
+ item-active: option-item-active, item-selected: option-item-selected,
91
+ label: option-label, text: option-text"
92
+ value=${String(size)}
93
+ >${this.numbers(size)}</${option}
94
+ >`)}
81
95
  </${select}>`;
82
96
  }
83
97
  render() {
@@ -43,6 +43,8 @@ declare const HelixHeadlessPinInput_base: (new (...args: any[]) => import("@fusi
43
43
  * @csspart field - The row of boxes.
44
44
  * @csspart hint - Help under the boxes, while nothing is wrong.
45
45
  * @csspart label - The question, over the boxes.
46
+ *
47
+ * @cssstate invalid - While there is feedback to show: the platform's verdict, or the consumer's `feedback`.
46
48
  */
47
49
  export declare class HelixHeadlessPinInput extends HelixHeadlessPinInput_base {
48
50
  protected readonly aria: AriaForwardController;
@@ -41,6 +41,8 @@ declare const HelixHeadlessPopover_base: (new (...args: any[]) => import("@fusio
41
41
  *
42
42
  * @csspart content - The scrolling region inside the panel.
43
43
  * @csspart popover - The panel.
44
+ *
45
+ * @cssstate open - While the popover is open.
44
46
  */
45
47
  export declare class HelixHeadlessPopover extends HelixHeadlessPopover_base {
46
48
  /**
@@ -43,6 +43,8 @@ declare const HelixHeadlessRadioGroup_base: (new (...args: any[]) => import("@fu
43
43
  * @csspart hint - Help under the set.
44
44
  * @csspart items - The choices, which is what `orientation` lays out.
45
45
  * @csspart label - The question, over the set.
46
+ *
47
+ * @cssstate invalid - While there is feedback to show: the platform's verdict, or the consumer's `feedback`.
46
48
  */
47
49
  export declare class HelixHeadlessRadioGroup extends HelixHeadlessRadioGroup_base {
48
50
  /**
@@ -38,6 +38,8 @@ import { type PropertyValues, type TemplateResult } from 'lit';
38
38
  * @csspart item - The button, which is the whole row.
39
39
  * @csspart label - The words beside it.
40
40
  * @csspart mark - The dot inside it.
41
+ *
42
+ * @cssstate selected - While it is the one chosen.
41
43
  */
42
44
  export declare class HelixHeadlessRadio extends HelixElement {
43
45
  /**
@@ -42,6 +42,8 @@ declare const HelixHeadlessRating_base: (new (...args: any[]) => import("@fusion
42
42
  * @cssproperty --rating-part - How much of the next mark is filled, 0 to 1.
43
43
  * @cssproperty --rating-step - The width of one step, as a fraction of a mark.
44
44
  * @cssproperty --rating-steps - How many steps one mark is divided into.
45
+ *
46
+ * @cssstate invalid - While there is feedback to show: the platform's verdict, or the consumer's `feedback`.
45
47
  */
46
48
  export declare class HelixHeadlessRating extends HelixHeadlessRating_base {
47
49
  protected readonly announcesInput = false;
@@ -56,10 +56,12 @@ declare const HelixHeadlessScatterChart_base: typeof HelixElement & (new (...arg
56
56
  * @csspart mark - The invisible point the tooltip is anchored to.
57
57
  * @csspart plot - The drawing.
58
58
  * @csspart point - One row, as a point.
59
+ * @csspart point-active - A point of the row a pointer is asking about, beside `point`.
59
60
  * @csspart summary - How strongly the measures relate, for a reader who cannot see the points.
60
61
  * @csspart svg - The drawing surface the rules sit on.
61
62
  * @csspart tooltip - The bubble, forwarded from `Tooltip`.
62
63
  * @csspart tooltip-anchor - The `Tooltip` element itself.
64
+ * @csspart tooltip-arrow - The bubble's point, forwarded from `Tooltip`.
63
65
  * @csspart tooltip-cell - One column's name and value inside the tooltip.
64
66
  * @csspart tooltip-label - The row's own name inside the tooltip.
65
67
  * @csspart tooltip-name - A column's name inside the tooltip.
@@ -160,7 +160,7 @@ let HelixHeadlessScatterChart = class HelixHeadlessScatterChart extends MixinCha
160
160
  return html `<span
161
161
  data-series=${index}
162
162
  ?data-active=${point.row === at}
163
- part="point"
163
+ part="point${point.row === at ? ' point-active' : ''}"
164
164
  style=${`--chart-series: var(--chart-series-${index}); --chart-point-x: ${point.x}%; --chart-point-y: ${point.y}%`}
165
165
  ></span>`;
166
166
  })}
@@ -36,6 +36,12 @@ declare const EDGES: readonly ['block-start', 'block-end', 'inline-start', 'inli
36
36
  *
37
37
  * @csspart edges - Where the sideways edge cues are drawn.
38
38
  * @csspart viewport - The scrolling box.
39
+ *
40
+ * @cssstate more-block-end - While there is more to scroll to past the block end.
41
+ * @cssstate more-block-start - While there is more to scroll back to before the block start.
42
+ * @cssstate more-inline-end - While there is more to scroll to past the inline end.
43
+ * @cssstate more-inline-start - While there is more to scroll back to before the inline start.
44
+ * @cssstate scrolls - While the content is larger than the viewport, on either axis.
39
45
  */
40
46
  export declare class HelixHeadlessScrollArea extends HelixElement {
41
47
  /**
@@ -79,9 +79,10 @@ let HelixHeadlessScrollArea = class HelixHeadlessScrollArea extends HelixElement
79
79
  updated(changed) {
80
80
  super.updated?.(changed);
81
81
  this.toggleState('scrolls', this.scrolls);
82
- for (const edge of EDGES) {
83
- this.toggleState(`more-${edge}`, this.more.includes(edge));
84
- }
82
+ this.toggleState('more-block-start', this.more.includes('block-start'));
83
+ this.toggleState('more-block-end', this.more.includes('block-end'));
84
+ this.toggleState('more-inline-start', this.more.includes('inline-start'));
85
+ this.toggleState('more-inline-end', this.more.includes('inline-end'));
85
86
  }
86
87
  render() {
87
88
  return html `<div
@@ -58,6 +58,9 @@ declare const HelixHeadlessSelect_base: (new (...args: any[]) => import("@fusion
58
58
  * @csspart surface - The floating panel.
59
59
  * @csspart trigger - The closed control, which says what is chosen.
60
60
  * @csspart value - The chosen option's text inside the trigger.
61
+ *
62
+ * @cssstate invalid - While there is feedback to show: the platform's verdict, or the consumer's `feedback`.
63
+ * @cssstate open - While the list is open.
61
64
  */
62
65
  export declare class HelixHeadlessSelect extends HelixHeadlessSelect_base {
63
66
  protected readonly aria: AriaForwardController;
@@ -47,6 +47,8 @@ declare const HelixHeadlessSlider_base: (new (...args: any[]) => import("@fusion
47
47
  * @cssproperty --slider-from - Where the filled span starts, as a percentage of the track.
48
48
  * @cssproperty --slider-marker-at - Where one marker sits, as a percentage of the track.
49
49
  * @cssproperty --slider-to - Where the filled span ends, as a percentage of the track.
50
+ *
51
+ * @cssstate invalid - While there is feedback to show: the platform's verdict, or the consumer's `feedback`.
50
52
  */
51
53
  export declare class HelixHeadlessSlider extends HelixHeadlessSlider_base {
52
54
  protected readonly aria: AriaForwardController;
@@ -43,6 +43,8 @@ declare const HelixHeadlessSpeedDial_base: (new (...args: any[]) => import("@fus
43
43
  *
44
44
  * @csspart actions - The region the actions are drawn in.
45
45
  * @csspart trigger - The default trigger, where none was slotted.
46
+ *
47
+ * @cssstate open - While the actions are out.
46
48
  */
47
49
  export declare class HelixHeadlessSpeedDial extends HelixHeadlessSpeedDial_base {
48
50
  /**
@@ -40,6 +40,9 @@ declare const HelixHeadlessSwitch_base: (new (...args: any[]) => import("@fusion
40
40
  * @csspart label - The words beside it.
41
41
  * @csspart thumb - The part that moves.
42
42
  * @csspart track - The groove the thumb travels in.
43
+ *
44
+ * @cssstate checked - While it is on.
45
+ * @cssstate invalid - While there is feedback to show: the platform's verdict, or the consumer's `feedback`.
43
46
  */
44
47
  export declare class HelixHeadlessSwitch extends HelixHeadlessSwitch_base {
45
48
  protected readonly aria: AriaForwardController;