@fusion.dev/helix-headless 0.147.0 → 0.148.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 (141) hide show
  1. package/custom-elements.json +4512 -790
  2. package/dist/accordion/item/accordion-item.d.ts +5 -2
  3. package/dist/accordion/item/accordion-item.js +11 -7
  4. package/dist/accordion/root/accordion-root.js +4 -6
  5. package/dist/announcement/root/announcement-root.d.ts +56 -5
  6. package/dist/announcement/root/announcement-root.js +124 -21
  7. package/dist/area-chart/root/area-chart-root.js +3 -4
  8. package/dist/badge/count.d.ts +14 -0
  9. package/dist/badge/count.js +20 -0
  10. package/dist/badge/root/badge-root.js +8 -22
  11. package/dist/blockquote/root/blockquote-root.d.ts +66 -8
  12. package/dist/blockquote/root/blockquote-root.js +85 -8
  13. package/dist/breadcrumbs/breadcrumb/breadcrumb.js +2 -2
  14. package/dist/button-group/arrows.d.ts +14 -0
  15. package/dist/button-group/arrows.js +10 -0
  16. package/dist/button-group/root/button-group-root.d.ts +141 -3
  17. package/dist/button-group/root/button-group-root.js +142 -2
  18. package/dist/canvas/edge-pan.d.ts +61 -0
  19. package/dist/canvas/edge-pan.js +63 -0
  20. package/dist/canvas/node/canvas-node.d.ts +12 -2
  21. package/dist/canvas/node/canvas-node.js +6 -2
  22. package/dist/canvas/root/canvas-document.d.ts +10 -0
  23. package/dist/canvas/root/canvas-document.js +1 -0
  24. package/dist/canvas/root/canvas-root.d.ts +107 -5
  25. package/dist/canvas/root/canvas-root.js +140 -36
  26. package/dist/canvas/snap.d.ts +42 -0
  27. package/dist/canvas/snap.js +32 -0
  28. package/dist/carousel/root/carousel-root.d.ts +4 -3
  29. package/dist/carousel/root/carousel-root.js +2 -6
  30. package/dist/chat/root/chat-root.d.ts +13 -3
  31. package/dist/chat/root/chat-root.js +2 -6
  32. package/dist/checkbox-group/root/checkbox-group-root.d.ts +13 -0
  33. package/dist/checkbox-group/root/checkbox-group-root.js +18 -10
  34. package/dist/checkbox-group/select-all.d.ts +11 -0
  35. package/dist/checkbox-group/select-all.js +5 -0
  36. package/dist/code-block/root/code-block-root.d.ts +8 -6
  37. package/dist/code-block/root/code-block-root.js +4 -3
  38. package/dist/color-picker/root/color-picker-root.js +6 -12
  39. package/dist/color-picker/wheel.d.ts +11 -0
  40. package/dist/color-picker/wheel.js +9 -0
  41. package/dist/combobox/root/combobox-root.d.ts +70 -11
  42. package/dist/combobox/root/combobox-root.js +68 -18
  43. package/dist/command/root/command-root.d.ts +4 -3
  44. package/dist/data-table/root/data-table-root.js +17 -44
  45. package/dist/description-list/item/description-list-item.d.ts +4 -0
  46. package/dist/description-list/item/description-list-item.js +7 -1
  47. package/dist/divider/root/divider-root.d.ts +45 -16
  48. package/dist/divider/root/divider-root.js +28 -4
  49. package/dist/drilldown/item/drilldown-item.js +3 -4
  50. package/dist/element-events.generated.js +1 -0
  51. package/dist/empty/root/empty-root.d.ts +17 -3
  52. package/dist/empty/root/empty-root.js +29 -5
  53. package/dist/file-input/root/file-input-root.js +3 -4
  54. package/dist/file-input/status.js +2 -1
  55. package/dist/filter-input/chip/filter-chip.js +2 -3
  56. package/dist/format-date/fields.d.ts +20 -0
  57. package/dist/format-date/fields.js +14 -0
  58. package/dist/format-date/options.d.ts +2 -1
  59. package/dist/format-date/options.js +9 -38
  60. package/dist/format-date/root/format-date-root.d.ts +35 -3
  61. package/dist/format-date/root/format-date-root.js +24 -32
  62. package/dist/graph/root/graph-root.d.ts +23 -5
  63. package/dist/graph/root/graph-root.js +17 -20
  64. package/dist/heatmap/root/heatmap-root.d.ts +12 -0
  65. package/dist/heatmap/root/heatmap-root.js +26 -11
  66. package/dist/image/root/image-root.d.ts +11 -0
  67. package/dist/kbd/root/kbd-root.js +1 -2
  68. package/dist/legend/root/legend-root.js +4 -17
  69. package/dist/list/root/list-root.js +8 -22
  70. package/dist/listbox/root/listbox-root.d.ts +119 -24
  71. package/dist/listbox/root/listbox-root.js +130 -132
  72. package/dist/map/marker/map-marker.d.ts +2 -1
  73. package/dist/map/root/map-root.d.ts +40 -2
  74. package/dist/map/root/map-root.js +64 -23
  75. package/dist/megamenu/root/megamenu-root.js +4 -11
  76. package/dist/menu/root/menu-root.d.ts +2 -2
  77. package/dist/navigation/root/navigation-root.js +5 -8
  78. package/dist/notifications/group/notification-group.d.ts +8 -1
  79. package/dist/notifications/group/notification-group.js +12 -6
  80. package/dist/notifications/notification/notification.d.ts +12 -1
  81. package/dist/notifications/notification/notification.js +3 -1
  82. package/dist/notifications/root/notifications-root.d.ts +41 -5
  83. package/dist/notifications/root/notifications-root.js +27 -7
  84. package/dist/object-inspector/root/object-inspector-root.d.ts +5 -1
  85. package/dist/object-inspector/root/object-inspector-root.js +21 -11
  86. package/dist/pagination/size/pagination-size.d.ts +1 -0
  87. package/dist/pagination/size/pagination-size.js +1 -1
  88. package/dist/pin-input/code.d.ts +23 -0
  89. package/dist/pin-input/code.js +25 -0
  90. package/dist/pin-input/root/pin-input-root.js +9 -23
  91. package/dist/qr-code/root/qr-code-root.d.ts +14 -3
  92. package/dist/qr-code/root/qr-code-root.js +19 -5
  93. package/dist/scatter-chart/measures.d.ts +22 -0
  94. package/dist/scatter-chart/measures.js +11 -0
  95. package/dist/scatter-chart/root/scatter-chart-root.d.ts +2 -6
  96. package/dist/scatter-chart/root/scatter-chart-root.js +6 -19
  97. package/dist/select/root/select-root.d.ts +56 -8
  98. package/dist/select/root/select-root.js +33 -9
  99. package/dist/speed-dial/group/speed-dial-group.d.ts +48 -0
  100. package/dist/speed-dial/group/speed-dial-group.js +43 -0
  101. package/dist/speed-dial/index.d.ts +1 -0
  102. package/dist/speed-dial/index.js +1 -0
  103. package/dist/speed-dial/item/speed-dial-item.d.ts +26 -1
  104. package/dist/speed-dial/item/speed-dial-item.js +41 -3
  105. package/dist/speed-dial/long-press.d.ts +50 -0
  106. package/dist/speed-dial/long-press.js +48 -0
  107. package/dist/speed-dial/root/speed-dial-root.d.ts +80 -1
  108. package/dist/speed-dial/root/speed-dial-root.js +114 -5
  109. package/dist/splitter/root/splitter-root.d.ts +7 -3
  110. package/dist/splitter/root/splitter-root.js +16 -3
  111. package/dist/table/cell/table-cell.d.ts +8 -1
  112. package/dist/table/cell/table-cell.js +6 -2
  113. package/dist/table/grid-controller.d.ts +117 -0
  114. package/dist/table/grid-controller.js +293 -0
  115. package/dist/table/root/table-root.d.ts +47 -3
  116. package/dist/table/root/table-root.js +81 -24
  117. package/dist/table/row/table-row.d.ts +13 -1
  118. package/dist/table/row/table-row.js +20 -6
  119. package/dist/tag/group/tag-group.js +6 -15
  120. package/dist/time-picker/root/time-picker-root.d.ts +1 -0
  121. package/dist/time-picker/root/time-picker-root.js +3 -0
  122. package/dist/toast/item/toast-item.d.ts +6 -3
  123. package/dist/toast/item/toast-item.js +1 -0
  124. package/dist/toast/root/toast-root.d.ts +13 -1
  125. package/dist/toast/root/toast-root.js +20 -14
  126. package/dist/toggle/group/toggle-group.js +3 -5
  127. package/dist/toolbar/root/toolbar-root.d.ts +31 -0
  128. package/dist/toolbar/root/toolbar-root.js +39 -8
  129. package/dist/tooltip/root/tooltip-root.js +1 -2
  130. package/dist/video/root/video-root.d.ts +11 -0
  131. package/dist/video/root/video-root.js +15 -1
  132. package/dist/virtual-list/root/virtual-list-root.js +6 -18
  133. package/lint.json +1 -1
  134. package/package.json +5 -5
  135. package/types/jsx.d.ts +2005 -266
  136. package/types/svelte.d.ts +1 -0
  137. package/types/vue.d.ts +338 -62
  138. package/dist/kbd/keys.d.ts +0 -29
  139. package/dist/kbd/keys.js +0 -52
  140. package/dist/tooltip/focus-target.d.ts +0 -6
  141. package/dist/tooltip/focus-target.js +0 -9
@@ -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, HelixBeforeChangeEvent, HelixElement, KeyboardNavigationController, requestChange, SourceController, seriesIndex, seriesKey, typeaheadBy, } from '@fusion.dev/helix-core';
7
+ import { customElement, focusItemOf, HelixElement, KeyboardNavigationController, requestValue, SourceController, seriesIndex, seriesKey, typeaheadBy, } from '@fusion.dev/helix-core';
8
8
  import { html, nothing } from 'lit';
9
9
  import { property, state } from 'lit/decorators.js';
10
10
  import { isHidden, namesIn, toggledNames } from '../hidden-series.js';
@@ -19,14 +19,7 @@ let HelixHeadlessLegend = class HelixHeadlessLegend extends HelixElement {
19
19
  this.stop = 0;
20
20
  this.keys = new KeyboardNavigationController(this, {
21
21
  items: () => this.toggles
22
- ? [...this.renderRoot.querySelectorAll('[part="toggle"]')].map((button) => ({
23
- contains: (node) => button.contains(node),
24
- disabled: false,
25
- focusItem: () => button.focus(),
26
- select: () => { },
27
- selected: false,
28
- words: button.textContent?.trim() ?? '',
29
- }))
22
+ ? [...this.renderRoot.querySelectorAll('[part="toggle"]')].map((button) => focusItemOf(button, { words: button.textContent?.trim() ?? '' }))
30
23
  : [],
31
24
  origin: 'focus',
32
25
  selects: () => false,
@@ -73,14 +66,8 @@ let HelixHeadlessLegend = class HelixHeadlessLegend extends HelixElement {
73
66
  super.disconnectedCallback();
74
67
  }
75
68
  toggle(name) {
76
- requestChange({
77
- apply: (value) => {
78
- this.hiddenSeries = value;
79
- this.dispatchEvent(new Event('change', { bubbles: true, composed: true }));
80
- },
81
- event: (value) => new HelixBeforeChangeEvent({ value }),
82
- host: this,
83
- next: toggledNames(this.hiddenSeries, name),
69
+ requestValue(this, toggledNames(this.hiddenSeries, name), (value) => {
70
+ this.hiddenSeries = value;
84
71
  });
85
72
  }
86
73
  names() {
@@ -4,13 +4,12 @@ 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 { commaList, customElement, HelixActionEvent, HelixBeforeChangeEvent, HelixElement, hostAria, inlineStep, KeyboardNavigationController, requestChange, rovingStop, selectsAll, typeaheadByWords, whenHydrated, } from '@fusion.dev/helix-core';
7
+ import { commaList, customElement, focusItemOf, HelixActionEvent, HelixElement, hostAria, inlineStep, KeyboardNavigationController, pressedOwnControl, requestValue, rovingStop, scrollRoom, selectsAll, typeaheadByWords, whenHydrated, } from '@fusion.dev/helix-core';
8
8
  import { html, nothing } from 'lit';
9
9
  import { property } from 'lit/decorators.js';
10
10
  import { HelixHeadlessListItem } from '../item/list-item.js';
11
11
  import { numbering } from '../numbering.js';
12
12
  import { choiceValue, pageReach, rowStop, } from '../selection.js';
13
- const PRESSABLE = 'a[href], button, input, label, select, textarea, [tabindex]';
14
13
  let HelixHeadlessList = class HelixHeadlessList extends HelixElement {
15
14
  constructor() {
16
15
  super(...arguments);
@@ -71,11 +70,8 @@ let HelixHeadlessList = class HelixHeadlessList extends HelixElement {
71
70
  if (!row) {
72
71
  return;
73
72
  }
74
- const path = event.composedPath();
75
73
  const cell = row.cell;
76
- const end = cell && path.includes(cell) ? path.indexOf(cell) : path.indexOf(row);
77
- const inner = path.slice(0, Math.max(0, end));
78
- if (inner.some((node) => node instanceof HTMLElement && node.matches(PRESSABLE))) {
74
+ if (pressedOwnControl(event, cell && event.composedPath().includes(cell) ? cell : row)) {
79
75
  return;
80
76
  }
81
77
  if (this.selectionMode === 'none') {
@@ -110,14 +106,11 @@ let HelixHeadlessList = class HelixHeadlessList extends HelixElement {
110
106
  return this.interactive ? this.rows.filter((row) => !row.disabled) : [];
111
107
  }
112
108
  navigable(row) {
113
- return {
114
- contains: (node) => row.contains(node),
109
+ return focusItemOf(row, {
115
110
  disabled: row.disabled,
116
- focusItem: () => row.focusItem(),
117
- select: () => { },
118
- selected: false,
111
+ focus: () => row.focusItem(),
119
112
  words: row.words,
120
- };
113
+ });
121
114
  }
122
115
  valueFor(row) {
123
116
  return row.value || row.words;
@@ -149,14 +142,8 @@ let HelixHeadlessList = class HelixHeadlessList extends HelixElement {
149
142
  if (next === null) {
150
143
  return;
151
144
  }
152
- requestChange({
153
- apply: (value) => {
154
- this.value = value;
155
- this.dispatchEvent(new Event('change', { bubbles: true, composed: true }));
156
- },
157
- event: (value) => new HelixBeforeChangeEvent({ value }),
158
- host: this,
159
- next,
145
+ requestValue(this, next, (value) => {
146
+ this.value = value;
160
147
  });
161
148
  }
162
149
  choice(row, extend, toggle, arrived) {
@@ -203,8 +190,7 @@ let HelixHeadlessList = class HelixHeadlessList extends HelixElement {
203
190
  const box = one.getBoundingClientRect();
204
191
  return { bottom: box.bottom, top: box.top };
205
192
  });
206
- const room = this.scrollHeight > this.clientHeight + 1 ? this.clientHeight : window.innerHeight;
207
- const target = rows[pageReach(edges, rows.indexOf(row), room, step)];
193
+ const target = rows[pageReach(edges, rows.indexOf(row), scrollRoom(this), step)];
208
194
  if (target && target !== row) {
209
195
  target.focusItem();
210
196
  }
@@ -1,4 +1,4 @@
1
- import { AriaForwardController, DisabledCascadeController, HelixFormElement } from '@fusion.dev/helix-core';
1
+ import { AriaForwardController, type DataOptionItem, DisabledCascadeController, HelixFormElement } from '@fusion.dev/helix-core';
2
2
  import { nothing, type PropertyValues, type TemplateResult } from 'lit';
3
3
  import { HelixHeadlessOption } from '../../option/root/option-root.js';
4
4
  declare const HelixHeadlessListbox_base: (new (...args: any[]) => import("@fusion.dev/helix-core").CollectionElement) & (new (...args: any[]) => import("@fusion.dev/helix-core").MixinControllerValueInterface) & (new (...args: any[]) => import("@fusion.dev/helix-core").MixinFieldInterface) & typeof HelixFormElement;
@@ -20,16 +20,31 @@ declare const HelixHeadlessListbox_base: (new (...args: any[]) => import("@fusio
20
20
  * active option is where the keyboard is: the arrow keys move it, and
21
21
  * `aria-activedescendant` points to it while focus stays on the list.
22
22
  *
23
- * The arrow keys, Home, End, PageUp and PageDown move the highlight, and typed
24
- * letters move it to the next option whose words start with them. In a
25
- * single-choice list the highlight is the choice unless `manual` is set; then
26
- * Enter, Space or a click chooses. With `multiple`, Space toggles the
27
- * highlighted option, Shift with an arrow adds the option it moves to, Shift
28
- * with Home or End adds every option from the highlight to that end, and
29
- * Control+A or Command+A chooses every option, or none where all are chosen.
30
- * In a filter field, Space, Home, End and letters edit the text, and with
31
- * `multiple`, Control with Shift and Home or End adds every option from the
32
- * highlight to that end.
23
+ * **Keyboard.** The list is one tab stop, or its filter field is where there
24
+ * is one. In a single-choice list the highlight is the choice unless `manual`
25
+ * is set; then Enter, Space or a click chooses.
26
+ *
27
+ * | Key | What it does |
28
+ * |---|---|
29
+ * | Down, Up | Moves the highlight to the next or the previous option, round from the last to the first. With `layout="grid"`, to the option below or above, stopping at the edge. |
30
+ * | Right, Left | With `layout="grid"`, moves to the next or the previous option, mirrored right to left. In a filter field, moves the caret. |
31
+ * | Home, End | Moves to the first or the last option. In a filter field, moves the caret. |
32
+ * | Page Down, Page Up | Moves by as many options as the list shows at once. |
33
+ * | A letter or a word | Moves to the next option whose words start with what you typed. In a filter field, types it. |
34
+ * | Enter | Chooses the highlighted option, or follows it where it is a link. |
35
+ * | Space | Chooses the highlighted option, or with `multiple` toggles it. In a filter field, types a space. |
36
+ * | Shift with Down or Up | With `multiple`, adds the option the highlight moves to. In a filter field, moves the highlight and leaves the value. |
37
+ * | Shift with Space | With `multiple`, adds every option from the one last chosen to the highlighted one. In a filter field, types a space. |
38
+ * | Shift with Home or End | With `multiple`, adds every option from the highlight to that end. In a filter field, hold Control as well. |
39
+ * | Control or Command with A | With `multiple`, chooses every option, or none where all are chosen. In a filter field, selects the text. |
40
+ * | Escape | In a filter field, clears the filter. |
41
+ *
42
+ * **ARIA.** The `items` part is the `listbox`, named by the label and
43
+ * described by the hint and the message, with `aria-multiselectable` under
44
+ * `multiple`, `aria-required`, `aria-invalid`, and `aria-busy` while loading.
45
+ * Each option is an `option` with `aria-selected`. The list, or its filter
46
+ * field, points `aria-activedescendant` at the highlighted option; the field
47
+ * is `aria-autocomplete="list"` and controls the list.
33
48
  *
34
49
  * An option with `href` is a link: Enter or a press follows it and selects
35
50
  * nothing, and moving onto it with the arrows does not follow it.
@@ -82,12 +97,16 @@ declare const HelixHeadlessListbox_base: (new (...args: any[]) => import("@fusio
82
97
  export declare class HelixHeadlessListbox extends HelixHeadlessListbox_base {
83
98
  protected readonly aria: AriaForwardController;
84
99
  /**
85
- * What the browser may autofill in the text field, as a platform token.
100
+ * What a browser's autofill may choose, as a platform token such as
101
+ * `country` or `cc-exp-month`, as a native `<select>` takes it.
102
+ *
103
+ * Set, the list draws a hidden native `<select>` with the same options for
104
+ * the browser to fill, as React Aria's `HiddenSelect` does, and a fill
105
+ * chooses the option. `off`, the default, draws none.
86
106
  *
87
- * **Defaults to `off`, which is not the platform's default and is the
88
- * point.** The field filters a list rather than collecting a value, so a
89
- * browser offering to fill it with a saved address is competing for the same
90
- * keystrokes as the listbox. A consumer who wants autofill can still ask.
107
+ * **The filter field is never filled.** It narrows the list rather than
108
+ * collecting a value, so a browser offering it a saved address competes
109
+ * with the reader for the same keystrokes: it is always `off`.
91
110
  */
92
111
  autocomplete: string;
93
112
  /**
@@ -138,14 +157,49 @@ export declare class HelixHeadlessListbox extends HelixHeadlessListbox_base {
138
157
  * Placeholder text for the filter field.
139
158
  */
140
159
  filterLabel: string;
160
+ /**
161
+ * The options as data, for a list too long to draw whole: each a value,
162
+ * which is also its words, or a record with a `value`, a `label` and
163
+ * `disabled`. Set, the list draws only the options in sight, and the ones
164
+ * you write as children are not read.
165
+ *
166
+ * **Every option is still reachable.** The keyboard, the typeahead, the
167
+ * filter and the value work over the whole set, and the option the keyboard
168
+ * is on is drawn wherever it is, so a screen reader is told about it. Each
169
+ * drawn option says its place in the set (`aria-posinset`, `aria-setsize`).
170
+ * React Aria virtualizes a `ListBox` with its `Virtualizer`; this is core's
171
+ * `VirtualizeController`.
172
+ *
173
+ * **The list needs a height to scroll in**: the styled tier's
174
+ * `--listbox-max-block-size`, or a `max-block-size` on `::part(items)` in the
175
+ * headless tier. Import the Option family as well, whose elements are drawn.
176
+ * A server sends the list empty, and the options are drawn once it hydrates.
177
+ */
178
+ items: readonly DataOptionItem[] | undefined;
179
+ /**
180
+ * How the options are laid out, which the arrow keys follow: `stack`, one
181
+ * under another, or `grid`, in rows and columns, as React Aria's `ListBox`
182
+ * lays out cards or photos. With `grid`, Up and Down move within a column,
183
+ * and Left and Right along the list, mirrored right to left.
184
+ *
185
+ * The columns are the stylesheet's: the styled tier draws them at
186
+ * `--listbox-column-min-inline-size` or wider, and a headless list lays out
187
+ * `::part(items)` as it likes, since the keys read where each option is
188
+ * drawn. A list of `items` stays a stack. Left out, the list is a stack,
189
+ * and the host carries no attribute for it.
190
+ */
191
+ layout?: 'grid' | 'stack';
192
+ /** Draws `items` a window at a time. See core's `OptionWindowController`. */
193
+ private readonly data;
141
194
  /**
142
195
  * What the list says when its options could not be loaded, such as after a
143
- * request to a server fails. Empty is no error.
196
+ * request to a server fails. Empty, null or no attribute is no error, so
197
+ * removing the attribute clears it.
144
198
  *
145
199
  * Set, it shows under any options there are, in place of `empty-text` and
146
200
  * `loading-text`, and a screen reader hears it. Clear it when you ask again.
147
201
  */
148
- loadError: string;
202
+ loadError: string | null;
149
203
  /**
150
204
  * Stops the arrow keys from choosing each option they move to. Enter, Space
151
205
  * or a click chooses the highlighted option.
@@ -180,6 +234,11 @@ export declare class HelixHeadlessListbox extends HelixHeadlessListbox_base {
180
234
  * writes the rest here.
181
235
  */
182
236
  resultsLabel: string;
237
+ /**
238
+ * What VoiceOver hears as the highlight reaches a chosen option from the
239
+ * filter field, on Apple devices. `{name}` is the option's words.
240
+ */
241
+ selectedLabel: string;
183
242
  /**
184
243
  * Which option the keyboard is on, which is not what is chosen.
185
244
  */
@@ -189,6 +248,8 @@ export declare class HelixHeadlessListbox extends HelixHeadlessListbox_base {
189
248
  * it back on the first match.
190
249
  */
191
250
  private parked;
251
+ /** The option last chosen, which Shift with Space extends from. */
252
+ private anchor;
192
253
  /** The letters typed at the list, which move the highlight to a match. */
193
254
  private readonly typeahead;
194
255
  /**
@@ -212,6 +273,9 @@ export declare class HelixHeadlessListbox extends HelixHeadlessListbox_base {
212
273
  * markup, so the hiding is done to them in `willUpdate` and the render reads
213
274
  * the answer it left here. Counted during render instead, a filter matching
214
275
  * nothing left an empty box with no message in it.
276
+ *
277
+ * Plain rather than reactive: `place` writes it inside an update, which
278
+ * draws it, and a slot change asks for that update.
215
279
  */
216
280
  private hasMatches;
217
281
  /**
@@ -221,7 +285,7 @@ export declare class HelixHeadlessListbox extends HelixHeadlessListbox_base {
221
285
  * count: without this the list shipped "Nothing to show" over markup that was
222
286
  * about to have options in it, which is the one thing an empty state must
223
287
  * never do. `place` does not run on the server, so this is false exactly
224
- * when the answer is unknown.
288
+ * when the answer is unknown. Plain, for the reason `hasMatches` is.
225
289
  */
226
290
  private counted;
227
291
  protected readonly cascade: DisabledCascadeController;
@@ -260,6 +324,17 @@ export declare class HelixHeadlessListbox extends HelixHeadlessListbox_base {
260
324
  * which the region says in place of this.
261
325
  */
262
326
  private tell;
327
+ /**
328
+ * Says the option the arrows reached from the filter field, on Apple devices.
329
+ *
330
+ * **VoiceOver does not read the option `aria-activedescendant` points to**
331
+ * while focus is in a text field, so a filterable list moved its highlight
332
+ * in silence there. React Aria's combobox says the option on Apple devices,
333
+ * with "selected" where it is chosen; the field here is the same pattern.
334
+ * Only while the field has focus, so a highlight placed as the list opens
335
+ * or seeded from the value says nothing until the reader moves it.
336
+ */
337
+ private tellActive;
263
338
  /**
264
339
  * @internal Moves the highlight to the option whose words start with the
265
340
  * letters typed, and returns its value, or nothing where none matches.
@@ -269,6 +344,13 @@ export declare class HelixHeadlessListbox extends HelixHeadlessListbox_base {
269
344
  * `<select>` does.
270
345
  */
271
346
  typeaheadTo(key: string): string | undefined;
347
+ /**
348
+ * @internal Called when the option already chosen is chosen again, which
349
+ * changes nothing here and answers the question for the control that opened
350
+ * the list. Select and Combobox close their panel on it, as a native
351
+ * `<select>` closes when its own answer is pressed.
352
+ */
353
+ chosenAgain: (() => void) | undefined;
272
354
  /** @internal Whether letters typed in the last moment are still one search. */
273
355
  get typing(): boolean;
274
356
  /**
@@ -298,8 +380,16 @@ export declare class HelixHeadlessListbox extends HelixHeadlessListbox_base {
298
380
  * component comes up empty.
299
381
  */
300
382
  private among;
301
- /** The groups, found the same way and for the same reason. */
383
+ /**
384
+ * The groups, found the same way and for the same reason, and by their
385
+ * name rather than their class, as the rules are: a list that holds no group
386
+ * does not carry the group's code, and either tier's tag ends the same way.
387
+ */
302
388
  private get groups();
389
+ /** Every option the list reads: the records of `items`, or the elements. */
390
+ private get entries();
391
+ /** The option elements on the page: the ones drawn for `items`, or the children. */
392
+ private get elements();
303
393
  /** The options a filter has left showing. */
304
394
  private get shown();
305
395
  /** The chosen values, as an array whether or not `multiple` is set. */
@@ -312,6 +402,11 @@ export declare class HelixHeadlessListbox extends HelixHeadlessListbox_base {
312
402
  */
313
403
  private choose;
314
404
  private readonly handleSelection;
405
+ /**
406
+ * Adds every option a reader can reach from the one last chosen to `to`,
407
+ * APG's Shift with Space. With none chosen yet, it adds `to` alone.
408
+ */
409
+ private extend;
315
410
  /**
316
411
  * Moves the keyboard, and chooses with it only where that is the pattern.
317
412
  *
@@ -380,10 +475,8 @@ export declare class HelixHeadlessListbox extends HelixHeadlessListbox_base {
380
475
  * read as a dial rather than scanned as a list, which is what Time Picker's
381
476
  * wheels do with three of these.
382
477
  *
383
- * A delta from the two boxes rather than `offsetTop`. An option is a slotted
384
- * light DOM child, so its `offsetParent` is whatever is positioned above it,
385
- * which is not this list and is not guaranteed to be anything: measuring both
386
- * rects and moving by the difference needs no such assumption.
478
+ * Measured by core's `centerInView`, or, for a list of `items`, by the
479
+ * arithmetic, since the chosen option may not be drawn.
387
480
  */
388
481
  reveal(): void;
389
482
  /** Hides what the filter excludes, and writes the rest onto the options. */
@@ -523,6 +616,8 @@ export declare class HelixHeadlessListbox extends HelixHeadlessListbox_base {
523
616
  * different thing to say from a list that has none.
524
617
  */
525
618
  private get noResults();
619
+ /** Whether `load-error` holds words, which a removed attribute does not. */
620
+ private get failed();
526
621
  /** The error, or what a filter that hid everything says, before the shared words. */
527
622
  protected renderLive(hasContent: boolean): TemplateResult;
528
623
  protected render(): TemplateResult;