@fusion.dev/helix-core 0.215.3 → 0.216.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 (37) hide show
  1. package/custom-elements.json +1 -1
  2. package/dist/controllers/listed-controller/listed-controller.d.ts +20 -0
  3. package/dist/controllers/listed-controller/listed-controller.js +19 -0
  4. package/dist/controllers/virtualize-controller/virtualize-controller.d.ts +9 -2
  5. package/dist/controllers/virtualize-controller/virtualize-controller.js +11 -3
  6. package/dist/controllers/virtualize-controller/waterfall.d.ts +5 -0
  7. package/dist/controllers/virtualize-controller/waterfall.js +3 -0
  8. package/dist/events/before-listen.d.ts +5 -0
  9. package/dist/events/before-listen.js +10 -0
  10. package/dist/events/details.d.ts +5 -0
  11. package/dist/events/events.d.ts +6 -2
  12. package/dist/events/events.js +5 -1
  13. package/dist/events/listen.d.ts +11 -0
  14. package/dist/events/listen.js +10 -0
  15. package/dist/events/names.js +2 -2
  16. package/dist/helix-element/helix-element.js +2 -0
  17. package/dist/helix-element/mark-rules.d.ts +25 -0
  18. package/dist/helix-element/mark-rules.js +7 -0
  19. package/dist/index.d.ts +8 -2
  20. package/dist/index.js +8 -2
  21. package/dist/mixins/mixin-chart-source/mixin-chart-source.d.ts +22 -0
  22. package/dist/mixins/mixin-chart-source/mixin-chart-source.js +143 -0
  23. package/dist/mixins/mixin-voice/mixin-voice.d.ts +40 -0
  24. package/dist/mixins/mixin-voice/mixin-voice.js +198 -0
  25. package/dist/utils/controls/controls.d.ts +64 -0
  26. package/dist/utils/controls/controls.js +136 -0
  27. package/dist/utils/report-runtime/report-runtime.d.ts +2 -0
  28. package/dist/utils/sonify/sonify.d.ts +62 -0
  29. package/dist/utils/sonify/sonify.js +130 -0
  30. package/dist/utils/speech/speech.d.ts +51 -0
  31. package/dist/utils/speech/speech.js +118 -0
  32. package/dist/utils/state/state.d.ts +79 -0
  33. package/dist/utils/state/state.js +165 -0
  34. package/dist/utils/ticker/ticker.d.ts +1 -6
  35. package/dist/version.d.ts +1 -1
  36. package/dist/version.js +1 -1
  37. package/package.json +4 -4
@@ -0,0 +1,20 @@
1
+ import type { ReactiveController, ReactiveControllerHost } from 'lit';
2
+ import { type ControlKind } from '../../utils/controls/controls.js';
3
+ /**
4
+ * Puts a control on the page's list of controls while it is connected, which
5
+ * is where a command palette finds it by its name and a shortcut overlay finds
6
+ * its keys.
7
+ *
8
+ * Joins in `hostConnected`, which a server never calls, so a server render
9
+ * lists nothing. `unlisted` on the control or around it leaves it off the list
10
+ * without taking it out of the registry, so the attribute can be set and
11
+ * cleared at any time.
12
+ */
13
+ export declare class ListedController implements ReactiveController {
14
+ private readonly host;
15
+ private readonly kind;
16
+ private readonly keys?;
17
+ constructor(host: ReactiveControllerHost & HTMLElement, kind: ControlKind | (() => ControlKind), keys?: (() => string | null | undefined) | undefined);
18
+ hostConnected(): void;
19
+ hostDisconnected(): void;
20
+ }
@@ -0,0 +1,19 @@
1
+ import { registerControl, unregisterControl, } from '../../utils/controls/controls.js';
2
+ export class ListedController {
3
+ constructor(host, kind, keys) {
4
+ this.host = host;
5
+ this.kind = kind;
6
+ this.keys = keys;
7
+ host.addController(this);
8
+ }
9
+ hostConnected() {
10
+ registerControl({
11
+ element: this.host,
12
+ keys: this.keys,
13
+ kind: typeof this.kind === 'function' ? this.kind() : this.kind,
14
+ });
15
+ }
16
+ hostDisconnected() {
17
+ unregisterControl(this.host);
18
+ }
19
+ }
@@ -264,6 +264,11 @@ export declare class VirtualizeController implements ReactiveController {
264
264
  * last move is out of date.
265
265
  */
266
266
  scrolling(): boolean;
267
+ /**
268
+ * Whether a slotted row must stay assigned: the box is moving under a
269
+ * touch. Adding or taking a slotted row ends the touch on iOS.
270
+ */
271
+ holdsSlot(): boolean;
267
272
  /**
268
273
  * Takes the offset as the box's own where the box moved it up only because
269
274
  * the set below it got shorter, which the browser does to keep the offset
@@ -324,8 +329,10 @@ export declare class VirtualizeController implements ReactiveController {
324
329
  * Whether the rows already drawn are kept for now: the screen is touched, the
325
330
  * box is moving, and the rows drawn cover all of it.
326
331
  *
327
- * Not in a waterfall, where an item measured moves the items under it and
328
- * the host draws them again.
332
+ * A waterfall uses the same hold. Coverage is how far the drawn items reach
333
+ * down the set, the furthest of their ends, because an item yet to be drawn
334
+ * can start in a short column above the bottom of a tall one. Adding or
335
+ * taking a slotted row is what ends the touch.
329
336
  */
330
337
  private holds;
331
338
  /** The window with the rows `first` to `last`, and the spacers that stand in for the rest. */
@@ -132,6 +132,9 @@ export class VirtualizeController {
132
132
  scrolling() {
133
133
  return this.touching || this.resting !== undefined || this.scrolledNow() !== this.lastTop;
134
134
  }
135
+ holdsSlot() {
136
+ return this.touched && this.scrolling();
137
+ }
135
138
  noteClamp(box) {
136
139
  const was = this.lastTop;
137
140
  if (!this.touching &&
@@ -208,19 +211,24 @@ export class VirtualizeController {
208
211
  this.host.requestUpdate();
209
212
  }
210
213
  holds(box, total) {
211
- if (!this.touched || !this.scrolling() || this.laned(total)) {
214
+ if (!this.touched || !this.scrolling()) {
212
215
  return false;
213
216
  }
214
217
  const { first, last, before } = this.window;
215
218
  if (last <= first || last > total) {
216
219
  return false;
217
220
  }
221
+ const top = this.scrolled(box);
222
+ const bottom = top + this.span(box);
223
+ const lanes = this.laned(total);
224
+ if (lanes) {
225
+ return top >= this.startOf(first, total) && bottom <= lanes.reachThrough(last - 1);
226
+ }
218
227
  const size = this.line();
219
228
  const drawn = this.measuring()
220
229
  ? this.startOf(last, total) - this.startOf(first, total)
221
230
  : (last - first) * size;
222
- const top = this.scrolled(box);
223
- return top >= before && top + this.span(box) <= before + drawn;
231
+ return top >= before && bottom <= before + drawn;
224
232
  }
225
233
  frame(first, last, total, size) {
226
234
  return this.measuring()
@@ -43,6 +43,11 @@ export declare class Waterfall {
43
43
  lane(index: number): number;
44
44
  /** How long the set is, where its longest column ends. */
45
45
  length(): number;
46
+ /**
47
+ * How far down the set the items from the start through `index` reach: the
48
+ * furthest of their ends, which is the bottom of the columns they occupy.
49
+ */
50
+ reachThrough(index: number): number;
46
51
  /** The first item that reaches past `offset`, or the count where none does. */
47
52
  from(offset: number): number;
48
53
  /** The first item that starts at or past `offset`, so every item before it starts above. */
@@ -49,6 +49,9 @@ export class Waterfall {
49
49
  length() {
50
50
  return this.extent;
51
51
  }
52
+ reachThrough(index) {
53
+ return index < 0 ? 0 : (this.reach[index] ?? this.extent);
54
+ }
52
55
  from(offset) {
53
56
  return this.search(this.reach, offset);
54
57
  }
@@ -0,0 +1,5 @@
1
+ /** A field is about to start listening for dictation, and can be refused. */
2
+ export declare class HelixBeforeListenEvent extends Event {
3
+ static readonly eventName = "helix-before-listen";
4
+ constructor();
5
+ }
@@ -0,0 +1,10 @@
1
+ export class HelixBeforeListenEvent extends Event {
2
+ static { this.eventName = 'helix-before-listen'; }
3
+ constructor() {
4
+ super(HelixBeforeListenEvent.eventName, {
5
+ bubbles: true,
6
+ cancelable: true,
7
+ composed: true,
8
+ });
9
+ }
10
+ }
@@ -666,6 +666,11 @@ export interface CompleteDetail {
666
666
  /** What the control now holds, in full. */
667
667
  value: string;
668
668
  }
669
+ /** Detail carried by `helix-listen`. */
670
+ export interface ListenDetail {
671
+ /** The phrase the field settled on, as it went into the value. */
672
+ text: string;
673
+ }
669
674
  /** What a shortcut reports when its chord is pressed. */
670
675
  export interface ShortcutDetail {
671
676
  /**
@@ -37,6 +37,7 @@ import { HelixBeforeChangeEvent } from './before-change.js';
37
37
  import { HelixBeforeCloseEvent } from './before-close.js';
38
38
  import { HelixBeforeCollapseEvent } from './before-collapse.js';
39
39
  import { HelixBeforeEditEvent } from './before-edit.js';
40
+ import { HelixBeforeListenEvent } from './before-listen.js';
40
41
  import { HelixBeforeMoveEvent } from './before-move.js';
41
42
  import { HelixBeforeOpenEvent } from './before-open.js';
42
43
  import { HelixBeforePanelResizeEvent } from './before-panel-resize.js';
@@ -84,6 +85,7 @@ import { HelixGraphReadyEvent } from './graph-ready.js';
84
85
  import { HelixGraphSignalEvent } from './graph-signal.js';
85
86
  import { HelixGraphZoomEvent } from './graph-zoom.js';
86
87
  import { HelixHistoryEvent } from './history.js';
88
+ import { HelixListenEvent } from './listen.js';
87
89
  import { HelixLoadEvent } from './load.js';
88
90
  import { HelixLoadMoreEvent } from './load-more.js';
89
91
  import { HelixMapClusterEvent } from './map-cluster.js';
@@ -137,9 +139,9 @@ import { HelixToggleEvent } from './toggle.js';
137
139
  import { HelixTourAskEvent } from './tour-ask.js';
138
140
  import { HelixTourStatusEvent } from './tour-status.js';
139
141
  import { HelixTypingEvent } from './typing.js';
140
- export type { ActivateDetail, AuraFallbackDetail, BandDetail, CanvasView, CaretDetail, ChangeDetail, CompleteDetail, ConnectDetail, ConsoleDetail, CopyDetail, CreateDetail, DeviceButton, DeviceButtonDetail, DeviceKeyDetail, DeviceScrollDetail, DeviceSwipeDetail, DeviceTapDetail, DeviceTextDetail, DeviceTouchDetail, DismissDetail, FacetDetail, FilterDetail, GraphFilterDetail, GraphLayoutDetail, GraphPartChangeDetail, GraphSignalDetail, MapClusterDetail, MapPanDetail, MapPartChangeDetail, MapRotateDetail, MapTiltDetail, MapZoomDetail, MoveDetail, NavigateDetail, OpenDetail, PasteDetail, PlotChangeDetail, PlotTurnDetail, PressDetail, PressPointerType, RangeDetail, ReadDetail, ReadingDetail, ReconnectDetail, Refusal, RefusedFile, RejectDetail, RelabelDetail, RemoveDetail, ReorderDetail, ResizeDetail, ScrolledDetail, SelectDetail, SendDetail, ShortcutDetail, SkipDetail, SortDetail, StrandsFallbackDetail, TerminalInputDetail, TerminalLinkDetail, TerminalResizeDetail, TerminalTitleDetail, ToggleDetail, TourAskDetail, TourStatusDetail, TypingDetail, ViewportPanDetail, ViewportZoomDetail, } from './details.js';
142
+ export type { ActivateDetail, AuraFallbackDetail, BandDetail, CanvasView, CaretDetail, ChangeDetail, CompleteDetail, ConnectDetail, ConsoleDetail, CopyDetail, CreateDetail, DeviceButton, DeviceButtonDetail, DeviceKeyDetail, DeviceScrollDetail, DeviceSwipeDetail, DeviceTapDetail, DeviceTextDetail, DeviceTouchDetail, DismissDetail, FacetDetail, FilterDetail, GraphFilterDetail, GraphLayoutDetail, GraphPartChangeDetail, GraphSignalDetail, ListenDetail, MapClusterDetail, MapPanDetail, MapPartChangeDetail, MapRotateDetail, MapTiltDetail, MapZoomDetail, MoveDetail, NavigateDetail, OpenDetail, PasteDetail, PlotChangeDetail, PlotTurnDetail, PressDetail, PressPointerType, RangeDetail, ReadDetail, ReadingDetail, ReconnectDetail, Refusal, RefusedFile, RejectDetail, RelabelDetail, RemoveDetail, ReorderDetail, ResizeDetail, ScrolledDetail, SelectDetail, SendDetail, ShortcutDetail, SkipDetail, SortDetail, StrandsFallbackDetail, TerminalInputDetail, TerminalLinkDetail, TerminalResizeDetail, TerminalTitleDetail, ToggleDetail, TourAskDetail, TourStatusDetail, TypingDetail, ViewportPanDetail, ViewportZoomDetail, } from './details.js';
141
143
  export { helixEventNames } from './names.js';
142
- export { HelixActionEvent, HelixActivateEvent, HelixAuraFallbackEvent, HelixBandEvent, HelixBeforeActivateEvent, HelixBeforeChangeEvent, HelixBeforeCloseEvent, HelixBeforeCollapseEvent, HelixBeforeEditEvent, HelixBeforeMoveEvent, HelixBeforeOpenEvent, HelixBeforePanelResizeEvent, HelixBeforePasteEvent, HelixBeforePinEvent, HelixBeforeReconnectEvent, HelixBeforeRelabelEvent, HelixBeforeReorderEvent, HelixBeforeResizeEvent, HelixBeforeSplitEvent, HelixBeforeToggleEvent, HelixCanvasEditEvent, HelixCanvasPanEvent, HelixCanvasViewEvent, HelixCanvasZoomEvent, HelixCaretEvent, HelixClearEvent, HelixCollapseEvent, HelixCompleteEvent, HelixConnectEvent, HelixConsoleEvent, HelixCopyErrorEvent, HelixCopyEvent, HelixCreateEvent, HelixDeviceButtonEvent, HelixDeviceKeyEvent, HelixDeviceScreenshotEvent, HelixDeviceScrollEvent, HelixDeviceSwipeEvent, HelixDeviceTapEvent, HelixDeviceTextEvent, HelixDeviceTouchEvent, HelixDismissEvent, HelixEditEvent, HelixEndEvent, HelixExpandEvent, HelixFacetEvent, HelixFilterEvent, HelixFilteredEvent, HelixGraphFilterEvent, HelixGraphLayoutEvent, HelixGraphPanEvent, HelixGraphPartChangeEvent, HelixGraphReadyEvent, HelixGraphSignalEvent, HelixGraphZoomEvent, HelixHistoryEvent, HelixLoadEvent, HelixLoadMoreEvent, HelixMapClusterEvent, HelixMapPanEvent, HelixMapPartChangeEvent, HelixMapReadyEvent, HelixMapRotateEvent, HelixMapTiltEvent, HelixMapZoomEvent, HelixMoveEvent, HelixNavigateEvent, HelixNextEvent, HelixPanelResizeEvent, HelixPastedEvent, HelixPinEvent, HelixPlotChangeEvent, HelixPlotTurnEvent, HelixPressEvent, HelixPreviewEvent, HelixPreviousEvent, HelixRangeChangeEvent, HelixReadEvent, HelixReadingChangeEvent, HelixReadingPressEvent, HelixReconnectEvent, HelixRejectEvent, HelixRelabelEvent, HelixRemoveEvent, HelixReorderEvent, HelixReorderedEvent, HelixResizedEvent, HelixResizeEvent, HelixSampleEndEvent, HelixSampleStartEvent, HelixScrolledEvent, HelixSelectEvent, HelixSelectedEvent, HelixSendEvent, HelixShortcutEvent, HelixSortEvent, HelixSortedEvent, HelixSplitEvent, HelixStrandsFallbackEvent, HelixTerminalBellEvent, HelixTerminalInputEvent, HelixTerminalLinkEvent, HelixTerminalResizeEvent, HelixTerminalRestartEvent, HelixTerminalTitleEvent, HelixToggleEvent, HelixTourAskEvent, HelixTourStatusEvent, HelixTypingEvent, };
144
+ export { HelixActionEvent, HelixActivateEvent, HelixAuraFallbackEvent, HelixBandEvent, HelixBeforeActivateEvent, HelixBeforeChangeEvent, HelixBeforeCloseEvent, HelixBeforeCollapseEvent, HelixBeforeEditEvent, HelixBeforeListenEvent, HelixBeforeMoveEvent, HelixBeforeOpenEvent, HelixBeforePanelResizeEvent, HelixBeforePasteEvent, HelixBeforePinEvent, HelixBeforeReconnectEvent, HelixBeforeRelabelEvent, HelixBeforeReorderEvent, HelixBeforeResizeEvent, HelixBeforeSplitEvent, HelixBeforeToggleEvent, HelixCanvasEditEvent, HelixCanvasPanEvent, HelixCanvasViewEvent, HelixCanvasZoomEvent, HelixCaretEvent, HelixClearEvent, HelixCollapseEvent, HelixCompleteEvent, HelixConnectEvent, HelixConsoleEvent, HelixCopyErrorEvent, HelixCopyEvent, HelixCreateEvent, HelixDeviceButtonEvent, HelixDeviceKeyEvent, HelixDeviceScreenshotEvent, HelixDeviceScrollEvent, HelixDeviceSwipeEvent, HelixDeviceTapEvent, HelixDeviceTextEvent, HelixDeviceTouchEvent, HelixDismissEvent, HelixEditEvent, HelixEndEvent, HelixExpandEvent, HelixFacetEvent, HelixFilterEvent, HelixFilteredEvent, HelixGraphFilterEvent, HelixGraphLayoutEvent, HelixGraphPanEvent, HelixGraphPartChangeEvent, HelixGraphReadyEvent, HelixGraphSignalEvent, HelixGraphZoomEvent, HelixHistoryEvent, HelixListenEvent, HelixLoadEvent, HelixLoadMoreEvent, HelixMapClusterEvent, HelixMapPanEvent, HelixMapPartChangeEvent, HelixMapReadyEvent, HelixMapRotateEvent, HelixMapTiltEvent, HelixMapZoomEvent, HelixMoveEvent, HelixNavigateEvent, HelixNextEvent, HelixPanelResizeEvent, HelixPastedEvent, HelixPinEvent, HelixPlotChangeEvent, HelixPlotTurnEvent, HelixPressEvent, HelixPreviewEvent, HelixPreviousEvent, HelixRangeChangeEvent, HelixReadEvent, HelixReadingChangeEvent, HelixReadingPressEvent, HelixReconnectEvent, HelixRejectEvent, HelixRelabelEvent, HelixRemoveEvent, HelixReorderEvent, HelixReorderedEvent, HelixResizedEvent, HelixResizeEvent, HelixSampleEndEvent, HelixSampleStartEvent, HelixScrolledEvent, HelixSelectEvent, HelixSelectedEvent, HelixSendEvent, HelixShortcutEvent, HelixSortEvent, HelixSortedEvent, HelixSplitEvent, HelixStrandsFallbackEvent, HelixTerminalBellEvent, HelixTerminalInputEvent, HelixTerminalLinkEvent, HelixTerminalResizeEvent, HelixTerminalRestartEvent, HelixTerminalTitleEvent, HelixToggleEvent, HelixTourAskEvent, HelixTourStatusEvent, HelixTypingEvent, };
143
145
  /**
144
146
  * Every event class, and the one place a new one is registered: a class in a
145
147
  * module of its own, imported above, and named here and in `names.ts`.
@@ -162,6 +164,7 @@ declare const registry: {
162
164
  readonly HelixBeforeCloseEvent: typeof HelixBeforeCloseEvent;
163
165
  readonly HelixBeforeCollapseEvent: typeof HelixBeforeCollapseEvent;
164
166
  readonly HelixBeforeEditEvent: typeof HelixBeforeEditEvent;
167
+ readonly HelixBeforeListenEvent: typeof HelixBeforeListenEvent;
165
168
  readonly HelixBeforeMoveEvent: typeof HelixBeforeMoveEvent;
166
169
  readonly HelixBeforeOpenEvent: typeof HelixBeforeOpenEvent;
167
170
  readonly HelixBeforePanelResizeEvent: typeof HelixBeforePanelResizeEvent;
@@ -209,6 +212,7 @@ declare const registry: {
209
212
  readonly HelixGraphSignalEvent: typeof HelixGraphSignalEvent;
210
213
  readonly HelixGraphZoomEvent: typeof HelixGraphZoomEvent;
211
214
  readonly HelixHistoryEvent: typeof HelixHistoryEvent;
215
+ readonly HelixListenEvent: typeof HelixListenEvent;
212
216
  readonly HelixLoadEvent: typeof HelixLoadEvent;
213
217
  readonly HelixLoadMoreEvent: typeof HelixLoadMoreEvent;
214
218
  readonly HelixMapClusterEvent: typeof HelixMapClusterEvent;
@@ -7,6 +7,7 @@ import { HelixBeforeChangeEvent } from './before-change.js';
7
7
  import { HelixBeforeCloseEvent } from './before-close.js';
8
8
  import { HelixBeforeCollapseEvent } from './before-collapse.js';
9
9
  import { HelixBeforeEditEvent } from './before-edit.js';
10
+ import { HelixBeforeListenEvent } from './before-listen.js';
10
11
  import { HelixBeforeMoveEvent } from './before-move.js';
11
12
  import { HelixBeforeOpenEvent } from './before-open.js';
12
13
  import { HelixBeforePanelResizeEvent } from './before-panel-resize.js';
@@ -54,6 +55,7 @@ import { HelixGraphReadyEvent } from './graph-ready.js';
54
55
  import { HelixGraphSignalEvent } from './graph-signal.js';
55
56
  import { HelixGraphZoomEvent } from './graph-zoom.js';
56
57
  import { HelixHistoryEvent } from './history.js';
58
+ import { HelixListenEvent } from './listen.js';
57
59
  import { HelixLoadEvent } from './load.js';
58
60
  import { HelixLoadMoreEvent } from './load-more.js';
59
61
  import { HelixMapClusterEvent } from './map-cluster.js';
@@ -108,7 +110,7 @@ import { HelixTourAskEvent } from './tour-ask.js';
108
110
  import { HelixTourStatusEvent } from './tour-status.js';
109
111
  import { HelixTypingEvent } from './typing.js';
110
112
  export { helixEventNames } from './names.js';
111
- export { HelixActionEvent, HelixActivateEvent, HelixAuraFallbackEvent, HelixBandEvent, HelixBeforeActivateEvent, HelixBeforeChangeEvent, HelixBeforeCloseEvent, HelixBeforeCollapseEvent, HelixBeforeEditEvent, HelixBeforeMoveEvent, HelixBeforeOpenEvent, HelixBeforePanelResizeEvent, HelixBeforePasteEvent, HelixBeforePinEvent, HelixBeforeReconnectEvent, HelixBeforeRelabelEvent, HelixBeforeReorderEvent, HelixBeforeResizeEvent, HelixBeforeSplitEvent, HelixBeforeToggleEvent, HelixCanvasEditEvent, HelixCanvasPanEvent, HelixCanvasViewEvent, HelixCanvasZoomEvent, HelixCaretEvent, HelixClearEvent, HelixCollapseEvent, HelixCompleteEvent, HelixConnectEvent, HelixConsoleEvent, HelixCopyErrorEvent, HelixCopyEvent, HelixCreateEvent, HelixDeviceButtonEvent, HelixDeviceKeyEvent, HelixDeviceScreenshotEvent, HelixDeviceScrollEvent, HelixDeviceSwipeEvent, HelixDeviceTapEvent, HelixDeviceTextEvent, HelixDeviceTouchEvent, HelixDismissEvent, HelixEditEvent, HelixEndEvent, HelixExpandEvent, HelixFacetEvent, HelixFilterEvent, HelixFilteredEvent, HelixGraphFilterEvent, HelixGraphLayoutEvent, HelixGraphPanEvent, HelixGraphPartChangeEvent, HelixGraphReadyEvent, HelixGraphSignalEvent, HelixGraphZoomEvent, HelixHistoryEvent, HelixLoadEvent, HelixLoadMoreEvent, HelixMapClusterEvent, HelixMapPanEvent, HelixMapPartChangeEvent, HelixMapReadyEvent, HelixMapRotateEvent, HelixMapTiltEvent, HelixMapZoomEvent, HelixMoveEvent, HelixNavigateEvent, HelixNextEvent, HelixPanelResizeEvent, HelixPastedEvent, HelixPinEvent, HelixPlotChangeEvent, HelixPlotTurnEvent, HelixPressEvent, HelixPreviewEvent, HelixPreviousEvent, HelixRangeChangeEvent, HelixReadEvent, HelixReadingChangeEvent, HelixReadingPressEvent, HelixReconnectEvent, HelixRejectEvent, HelixRelabelEvent, HelixRemoveEvent, HelixReorderEvent, HelixReorderedEvent, HelixResizedEvent, HelixResizeEvent, HelixSampleEndEvent, HelixSampleStartEvent, HelixScrolledEvent, HelixSelectEvent, HelixSelectedEvent, HelixSendEvent, HelixShortcutEvent, HelixSortEvent, HelixSortedEvent, HelixSplitEvent, HelixStrandsFallbackEvent, HelixTerminalBellEvent, HelixTerminalInputEvent, HelixTerminalLinkEvent, HelixTerminalResizeEvent, HelixTerminalRestartEvent, HelixTerminalTitleEvent, HelixToggleEvent, HelixTourAskEvent, HelixTourStatusEvent, HelixTypingEvent, };
113
+ export { HelixActionEvent, HelixActivateEvent, HelixAuraFallbackEvent, HelixBandEvent, HelixBeforeActivateEvent, HelixBeforeChangeEvent, HelixBeforeCloseEvent, HelixBeforeCollapseEvent, HelixBeforeEditEvent, HelixBeforeListenEvent, HelixBeforeMoveEvent, HelixBeforeOpenEvent, HelixBeforePanelResizeEvent, HelixBeforePasteEvent, HelixBeforePinEvent, HelixBeforeReconnectEvent, HelixBeforeRelabelEvent, HelixBeforeReorderEvent, HelixBeforeResizeEvent, HelixBeforeSplitEvent, HelixBeforeToggleEvent, HelixCanvasEditEvent, HelixCanvasPanEvent, HelixCanvasViewEvent, HelixCanvasZoomEvent, HelixCaretEvent, HelixClearEvent, HelixCollapseEvent, HelixCompleteEvent, HelixConnectEvent, HelixConsoleEvent, HelixCopyErrorEvent, HelixCopyEvent, HelixCreateEvent, HelixDeviceButtonEvent, HelixDeviceKeyEvent, HelixDeviceScreenshotEvent, HelixDeviceScrollEvent, HelixDeviceSwipeEvent, HelixDeviceTapEvent, HelixDeviceTextEvent, HelixDeviceTouchEvent, HelixDismissEvent, HelixEditEvent, HelixEndEvent, HelixExpandEvent, HelixFacetEvent, HelixFilterEvent, HelixFilteredEvent, HelixGraphFilterEvent, HelixGraphLayoutEvent, HelixGraphPanEvent, HelixGraphPartChangeEvent, HelixGraphReadyEvent, HelixGraphSignalEvent, HelixGraphZoomEvent, HelixHistoryEvent, HelixListenEvent, HelixLoadEvent, HelixLoadMoreEvent, HelixMapClusterEvent, HelixMapPanEvent, HelixMapPartChangeEvent, HelixMapReadyEvent, HelixMapRotateEvent, HelixMapTiltEvent, HelixMapZoomEvent, HelixMoveEvent, HelixNavigateEvent, HelixNextEvent, HelixPanelResizeEvent, HelixPastedEvent, HelixPinEvent, HelixPlotChangeEvent, HelixPlotTurnEvent, HelixPressEvent, HelixPreviewEvent, HelixPreviousEvent, HelixRangeChangeEvent, HelixReadEvent, HelixReadingChangeEvent, HelixReadingPressEvent, HelixReconnectEvent, HelixRejectEvent, HelixRelabelEvent, HelixRemoveEvent, HelixReorderEvent, HelixReorderedEvent, HelixResizedEvent, HelixResizeEvent, HelixSampleEndEvent, HelixSampleStartEvent, HelixScrolledEvent, HelixSelectEvent, HelixSelectedEvent, HelixSendEvent, HelixShortcutEvent, HelixSortEvent, HelixSortedEvent, HelixSplitEvent, HelixStrandsFallbackEvent, HelixTerminalBellEvent, HelixTerminalInputEvent, HelixTerminalLinkEvent, HelixTerminalResizeEvent, HelixTerminalRestartEvent, HelixTerminalTitleEvent, HelixToggleEvent, HelixTourAskEvent, HelixTourStatusEvent, HelixTypingEvent, };
112
114
  const registry = {
113
115
  HelixActionEvent,
114
116
  HelixActivateEvent,
@@ -119,6 +121,7 @@ const registry = {
119
121
  HelixBeforeCloseEvent,
120
122
  HelixBeforeCollapseEvent,
121
123
  HelixBeforeEditEvent,
124
+ HelixBeforeListenEvent,
122
125
  HelixBeforeMoveEvent,
123
126
  HelixBeforeOpenEvent,
124
127
  HelixBeforePanelResizeEvent,
@@ -166,6 +169,7 @@ const registry = {
166
169
  HelixGraphSignalEvent,
167
170
  HelixGraphZoomEvent,
168
171
  HelixHistoryEvent,
172
+ HelixListenEvent,
169
173
  HelixLoadEvent,
170
174
  HelixLoadMoreEvent,
171
175
  HelixMapClusterEvent,
@@ -0,0 +1,11 @@
1
+ import type { ListenDetail } from './details.js';
2
+ /**
3
+ * A field settled on a phrase it heard and put it in its value.
4
+ *
5
+ * Sent after the field's own `input`, for a page that keeps what was said
6
+ * apart from what was typed.
7
+ */
8
+ export declare class HelixListenEvent extends CustomEvent<ListenDetail> {
9
+ static readonly eventName = "helix-listen";
10
+ constructor(detail: ListenDetail);
11
+ }
@@ -0,0 +1,10 @@
1
+ export class HelixListenEvent extends CustomEvent {
2
+ static { this.eventName = 'helix-listen'; }
3
+ constructor(detail) {
4
+ super(HelixListenEvent.eventName, {
5
+ bubbles: true,
6
+ composed: true,
7
+ detail,
8
+ });
9
+ }
10
+ }
@@ -1,11 +1,11 @@
1
1
  export const helixEventNames = new Set(('action activate aura-fallback band before-activate before-change before-close ' +
2
- 'before-collapse before-edit before-move before-open before-panel-resize before-paste before-pin ' +
2
+ 'before-collapse before-edit before-listen before-move before-open before-panel-resize before-paste before-pin ' +
3
3
  'before-reconnect before-relabel before-reorder before-resize before-split before-toggle ' +
4
4
  'canvas-edit canvas-pan canvas-view canvas-zoom caret clear collapse complete ' +
5
5
  'connect console copy copy-error create device-button device-key device-screenshot ' +
6
6
  'device-scroll device-swipe device-tap device-text device-touch dismiss edit end expand facet filter ' +
7
7
  'filtered graph-filter graph-layout graph-pan graph-part-change graph-ready ' +
8
- 'graph-signal graph-zoom history load load-more map-cluster map-pan map-part-change ' +
8
+ 'graph-signal graph-zoom history listen load load-more map-cluster map-pan map-part-change ' +
9
9
  'map-ready map-rotate map-tilt map-zoom move navigate next panel-resize pasted pin plot-change ' +
10
10
  'plot-turn press ' +
11
11
  'preview previous range-change read reading-change reading-press reconnect reject ' +
@@ -1,6 +1,7 @@
1
1
  import { LitElement, unsafeCSS } from 'lit';
2
2
  import { measuring, reportRender } from '../utils/report-render/report-render.js';
3
3
  import { noteVersion, reportUsage } from '../utils/report-usage/report-usage.js';
4
+ import { exposeStateIfAsked } from '../utils/state/state.js';
4
5
  import { applyReactProperties, bindReactHandler, lookForReact } from './react-bridge.js';
5
6
  const BOX_SIZING = '*,::before,::after{box-sizing:border-box}';
6
7
  const HIDDEN = ":host([hidden]:not([hidden='until-found'])){display:none}";
@@ -127,3 +128,4 @@ export const whenHydrated = (element, write) => {
127
128
  }
128
129
  };
129
130
  noteVersion();
131
+ exposeStateIfAsked();
@@ -60,6 +60,31 @@ export declare const SCROLLER_RULE = "[data-scroller]{overflow:auto}";
60
60
  * where they belong, so anchoring has nothing left to do here but move them.
61
61
  */
62
62
  export declare const VIRTUAL_RULE = "[data-virtual]{overflow-anchor:none}";
63
+ /**
64
+ * Two layers drawn in one place, one exactly over the other, which a
65
+ * component marks `data-layers`: Code Input draws its highlighted text under a
66
+ * `<textarea>` whose own text is transparent, so the reader types in the
67
+ * platform's field and sees the colors.
68
+ *
69
+ * **Every layer takes the same box and the same text metrics**, or the caret
70
+ * drifts off the letters it sits between: one grid cell, no margin, border or
71
+ * padding of a layer's own, and the font, spacing and tab stops of the box
72
+ * around them. Lines keep their length, or wrap the way a soft-wrapped
73
+ * `<textarea>` does where the box is marked `data-wrap`. The box grows with
74
+ * the layer under the text, and the field fills it and never scrolls by
75
+ * itself: whatever holds the box scrolls both.
76
+ *
77
+ * **Named by the layer under the text, `aria-hidden`, and the `<textarea>`**,
78
+ * which outranks the `[part]` rule a field's sheet resets its control with:
79
+ * its `all: unset` took the textarea out of the cell and gave it the field's
80
+ * face, a row below the text and in another font.
81
+ *
82
+ * The placeholder keeps its own color, which a transparent fill would take.
83
+ * The caret takes the page's text color here, at no specificity, so a sheet
84
+ * names its own. Everything else is the mechanism, and a sheet that unsets
85
+ * the field's styles does not undo it.
86
+ */
87
+ export declare const LAYERS_RULE: string;
63
88
  /**
64
89
  * Words a screen reader reads where the eye reads something else, which a
65
90
  * component marks `data-spoken`: `⇧⌘P` in Kbd is read as `Shift Command P`.
@@ -1,5 +1,12 @@
1
1
  export const SCROLLER_RULE = '[data-scroller]{overflow:auto}';
2
2
  export const VIRTUAL_RULE = '[data-virtual]{overflow-anchor:none}';
3
+ export const LAYERS_RULE = '[data-layers]{display:grid}' +
4
+ '[data-layers]>[aria-hidden],[data-layers]>textarea{grid-area:1/1;box-sizing:border-box;margin:0;border:0;padding:0;min-inline-size:0;font:inherit;letter-spacing:inherit;line-height:inherit;tab-size:inherit;white-space:pre;overflow-wrap:normal}' +
5
+ '[data-layers][data-wrap]>[aria-hidden],[data-layers][data-wrap]>textarea{white-space:pre-wrap;overflow-wrap:break-word}' +
6
+ '[data-layers]>[aria-hidden]{pointer-events:none;user-select:none}' +
7
+ '[data-layers]>textarea{inline-size:100%;block-size:100%;overflow:hidden;resize:none;background:none;color:transparent;-webkit-text-fill-color:transparent}' +
8
+ '[data-layers]>textarea::placeholder{-webkit-text-fill-color:currentColor}' +
9
+ ':where([data-layers])>textarea{caret-color:CanvasText}';
3
10
  export const SPOKEN_RULE = '[data-spoken]{position:absolute;inline-size:1px;block-size:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}';
4
11
  export const MIRROR_RULE = ':host(:dir(rtl)) [data-mirror]{scale:-1 1}';
5
12
  export const TOUCHES_RULE = '[data-touches]{touch-action:none}';
package/dist/index.d.ts CHANGED
@@ -22,6 +22,7 @@ export { HostClickController } from './controllers/host-click-controller/host-cl
22
22
  export { IdleController } from './controllers/idle-controller/idle-controller.js';
23
23
  export { IndicatorController, type IndicatorOptions, } from './controllers/indicator-controller/indicator-controller.js';
24
24
  export { type FocusItemOptions, focusItemOf, KeyboardNavigationController, type KeyboardNavigationOptions, type KeyboardOrigin, type NavigableItem, } from './controllers/keyboard-navigation-controller/keyboard-navigation-controller.js';
25
+ export { ListedController } from './controllers/listed-controller/listed-controller.js';
25
26
  export { MediaSessionController, type SessionHandlers, SKIP_SECONDS, } from './controllers/media-session-controller/media-session-controller.js';
26
27
  export { animationsFinished, animationsSettled, type OpenPhase, OpenPhaseController, type OpenPhaseOptions, } from './controllers/open-phase-controller/open-phase-controller.js';
27
28
  export { OptionWindowController, type OptionWindowOptions, } from './controllers/option-window-controller/option-window-controller.js';
@@ -40,9 +41,9 @@ export { UpgradeController, type UpgradeOptions, } from './controllers/upgrade-c
40
41
  export { type Rendered, VirtualizeController, type VirtualizeOptions, type Window as VirtualizeWindow, } from './controllers/virtualize-controller/virtualize-controller.js';
41
42
  export { Waterfall } from './controllers/virtualize-controller/waterfall.js';
42
43
  export { eventsForTag, registerElementEvents } from './events/element-events.js';
43
- export { type ActivateDetail, type AuraFallbackDetail, type BandDetail, type CanvasView, type CaretDetail, type ChangeDetail, type CompleteDetail, type ConnectDetail, type ConsoleDetail, type CopyDetail, type CreateDetail, type DeviceButton, type DeviceButtonDetail, type DeviceKeyDetail, type DeviceScrollDetail, type DeviceSwipeDetail, type DeviceTapDetail, type DeviceTextDetail, type DeviceTouchDetail, type DismissDetail, type FacetDetail, type FilterDetail, type GraphFilterDetail, type GraphLayoutDetail, type GraphPartChangeDetail, type GraphSignalDetail, HelixActionEvent, HelixActivateEvent, HelixAuraFallbackEvent, HelixBandEvent, HelixBeforeActivateEvent, HelixBeforeChangeEvent, HelixBeforeCloseEvent, HelixBeforeCollapseEvent, HelixBeforeEditEvent, HelixBeforeMoveEvent, HelixBeforeOpenEvent, HelixBeforePanelResizeEvent, HelixBeforePasteEvent, HelixBeforePinEvent, HelixBeforeReconnectEvent, HelixBeforeRelabelEvent, HelixBeforeReorderEvent, HelixBeforeResizeEvent, HelixBeforeSplitEvent, HelixBeforeToggleEvent, HelixCanvasEditEvent, HelixCanvasPanEvent, HelixCanvasViewEvent, HelixCanvasZoomEvent, HelixCaretEvent, HelixClearEvent, HelixCollapseEvent, HelixCompleteEvent, HelixConnectEvent, HelixConsoleEvent, HelixCopyErrorEvent, HelixCopyEvent, HelixCreateEvent, HelixDeviceButtonEvent, HelixDeviceKeyEvent, HelixDeviceScreenshotEvent, HelixDeviceScrollEvent, HelixDeviceSwipeEvent, HelixDeviceTapEvent, HelixDeviceTextEvent, HelixDeviceTouchEvent, HelixDismissEvent, HelixEditEvent, HelixEndEvent, HelixExpandEvent, HelixFacetEvent, HelixFilterEvent, HelixFilteredEvent, HelixGraphFilterEvent, HelixGraphLayoutEvent, HelixGraphPanEvent, HelixGraphPartChangeEvent, HelixGraphReadyEvent, HelixGraphSignalEvent, HelixGraphZoomEvent, HelixHistoryEvent, HelixLoadEvent, HelixLoadMoreEvent, HelixMapClusterEvent, HelixMapPanEvent, HelixMapPartChangeEvent, HelixMapReadyEvent, HelixMapRotateEvent, HelixMapTiltEvent, HelixMapZoomEvent, HelixMoveEvent, HelixNavigateEvent, HelixNextEvent, HelixPanelResizeEvent, HelixPastedEvent, HelixPinEvent, HelixPlotChangeEvent, HelixPlotTurnEvent, HelixPressEvent, HelixPreviewEvent, HelixPreviousEvent, HelixRangeChangeEvent, HelixReadEvent, HelixReadingChangeEvent, HelixReadingPressEvent, HelixReconnectEvent, HelixRejectEvent, HelixRelabelEvent, HelixRemoveEvent, HelixReorderEvent, HelixReorderedEvent, HelixResizedEvent, HelixResizeEvent, HelixSampleEndEvent, HelixSampleStartEvent, HelixScrolledEvent, HelixSelectEvent, HelixSelectedEvent, HelixSendEvent, HelixShortcutEvent, HelixSortEvent, HelixSortedEvent, HelixSplitEvent, HelixStrandsFallbackEvent, HelixTerminalBellEvent, HelixTerminalInputEvent, HelixTerminalLinkEvent, HelixTerminalResizeEvent, HelixTerminalRestartEvent, HelixTerminalTitleEvent, HelixToggleEvent, HelixTourAskEvent, HelixTourStatusEvent, HelixTypingEvent, type MapClusterDetail, type MapPanDetail, type MapPartChangeDetail, type MapRotateDetail, type MapTiltDetail, type MapZoomDetail, type MoveDetail, type NavigateDetail, type OpenDetail, type PasteDetail, type PlotChangeDetail, type PlotTurnDetail, type PressDetail, type PressPointerType, type RangeDetail, type ReadDetail, type ReadingDetail, type ReconnectDetail, type Refusal, type RefusedFile, type RejectDetail, type RelabelDetail, type RemoveDetail, type ReorderDetail, type ResizeDetail, type ScrolledDetail, type SelectDetail, type SendDetail, type ShortcutDetail, type SkipDetail, type SortDetail, type StrandsFallbackDetail, type TerminalInputDetail, type TerminalLinkDetail, type TerminalResizeDetail, type TerminalTitleDetail, type ToggleDetail, type TourStatusDetail, type TypingDetail, type ViewportPanDetail, type ViewportZoomDetail, } from './events/events.js';
44
+ export { type ActivateDetail, type AuraFallbackDetail, type BandDetail, type CanvasView, type CaretDetail, type ChangeDetail, type CompleteDetail, type ConnectDetail, type ConsoleDetail, type CopyDetail, type CreateDetail, type DeviceButton, type DeviceButtonDetail, type DeviceKeyDetail, type DeviceScrollDetail, type DeviceSwipeDetail, type DeviceTapDetail, type DeviceTextDetail, type DeviceTouchDetail, type DismissDetail, type FacetDetail, type FilterDetail, type GraphFilterDetail, type GraphLayoutDetail, type GraphPartChangeDetail, type GraphSignalDetail, HelixActionEvent, HelixActivateEvent, HelixAuraFallbackEvent, HelixBandEvent, HelixBeforeActivateEvent, HelixBeforeChangeEvent, HelixBeforeCloseEvent, HelixBeforeCollapseEvent, HelixBeforeEditEvent, HelixBeforeListenEvent, HelixBeforeMoveEvent, HelixBeforeOpenEvent, HelixBeforePanelResizeEvent, HelixBeforePasteEvent, HelixBeforePinEvent, HelixBeforeReconnectEvent, HelixBeforeRelabelEvent, HelixBeforeReorderEvent, HelixBeforeResizeEvent, HelixBeforeSplitEvent, HelixBeforeToggleEvent, HelixCanvasEditEvent, HelixCanvasPanEvent, HelixCanvasViewEvent, HelixCanvasZoomEvent, HelixCaretEvent, HelixClearEvent, HelixCollapseEvent, HelixCompleteEvent, HelixConnectEvent, HelixConsoleEvent, HelixCopyErrorEvent, HelixCopyEvent, HelixCreateEvent, HelixDeviceButtonEvent, HelixDeviceKeyEvent, HelixDeviceScreenshotEvent, HelixDeviceScrollEvent, HelixDeviceSwipeEvent, HelixDeviceTapEvent, HelixDeviceTextEvent, HelixDeviceTouchEvent, HelixDismissEvent, HelixEditEvent, HelixEndEvent, HelixExpandEvent, HelixFacetEvent, HelixFilterEvent, HelixFilteredEvent, HelixGraphFilterEvent, HelixGraphLayoutEvent, HelixGraphPanEvent, HelixGraphPartChangeEvent, HelixGraphReadyEvent, HelixGraphSignalEvent, HelixGraphZoomEvent, HelixHistoryEvent, HelixListenEvent, HelixLoadEvent, HelixLoadMoreEvent, HelixMapClusterEvent, HelixMapPanEvent, HelixMapPartChangeEvent, HelixMapReadyEvent, HelixMapRotateEvent, HelixMapTiltEvent, HelixMapZoomEvent, HelixMoveEvent, HelixNavigateEvent, HelixNextEvent, HelixPanelResizeEvent, HelixPastedEvent, HelixPinEvent, HelixPlotChangeEvent, HelixPlotTurnEvent, HelixPressEvent, HelixPreviewEvent, HelixPreviousEvent, HelixRangeChangeEvent, HelixReadEvent, HelixReadingChangeEvent, HelixReadingPressEvent, HelixReconnectEvent, HelixRejectEvent, HelixRelabelEvent, HelixRemoveEvent, HelixReorderEvent, HelixReorderedEvent, HelixResizedEvent, HelixResizeEvent, HelixSampleEndEvent, HelixSampleStartEvent, HelixScrolledEvent, HelixSelectEvent, HelixSelectedEvent, HelixSendEvent, HelixShortcutEvent, HelixSortEvent, HelixSortedEvent, HelixSplitEvent, HelixStrandsFallbackEvent, HelixTerminalBellEvent, HelixTerminalInputEvent, HelixTerminalLinkEvent, HelixTerminalResizeEvent, HelixTerminalRestartEvent, HelixTerminalTitleEvent, HelixToggleEvent, HelixTourAskEvent, HelixTourStatusEvent, HelixTypingEvent, type ListenDetail, type MapClusterDetail, type MapPanDetail, type MapPartChangeDetail, type MapRotateDetail, type MapTiltDetail, type MapZoomDetail, type MoveDetail, type NavigateDetail, type OpenDetail, type PasteDetail, type PlotChangeDetail, type PlotTurnDetail, type PressDetail, type PressPointerType, type RangeDetail, type ReadDetail, type ReadingDetail, type ReconnectDetail, type Refusal, type RefusedFile, type RejectDetail, type RelabelDetail, type RemoveDetail, type ReorderDetail, type ResizeDetail, type ScrolledDetail, type SelectDetail, type SendDetail, type ShortcutDetail, type SkipDetail, type SortDetail, type StrandsFallbackDetail, type TerminalInputDetail, type TerminalLinkDetail, type TerminalResizeDetail, type TerminalTitleDetail, type ToggleDetail, type TourStatusDetail, type TypingDetail, type ViewportPanDetail, type ViewportZoomDetail, } from './events/events.js';
44
45
  export { HelixElement, whenHydrated } from './helix-element/helix-element.js';
45
- export { MIRROR_RULE, SCROLLER_RULE, SPOKEN_RULE, TOUCHES_RULE, VIRTUAL_RULE, } from './helix-element/mark-rules.js';
46
+ export { LAYERS_RULE, MIRROR_RULE, SCROLLER_RULE, SPOKEN_RULE, TOUCHES_RULE, VIRTUAL_RULE, } from './helix-element/mark-rules.js';
46
47
  export { HelixFormElement } from './helix-form-element/helix-form-element.js';
47
48
  export { HelixFormElementBase } from './helix-form-element/helix-form-element-base.js';
48
49
  export { MixinChartSource, type MixinChartSourceInterface, PALETTE, PLOT_HEIGHT, PLOT_WIDTH, POSITION_LABEL, READINGS_PAGE, seriesIndex, seriesNames, } from './mixins/mixin-chart-source/mixin-chart-source.js';
@@ -61,6 +62,7 @@ export { MixinSegmentedField, type MixinSegmentedFieldInterface, } from './mixin
61
62
  export { MixinSelectableItem, type MixinSelectableItemInterface, } from './mixins/mixin-selectable-item/mixin-selectable-item.js';
62
63
  export { MixinTokens, type MixinTokensInterface } from './mixins/mixin-tokens/mixin-tokens.js';
63
64
  export { MixinViewport, type ViewportControlAxes, type ViewportControlsPlacement, type ViewportElement, type ViewportGestureLabels, type ViewportGestureMode, type ViewportGestures, type ViewportWay, } from './mixins/mixin-viewport/mixin-viewport.js';
65
+ export { MixinVoice, type VoiceElement } from './mixins/mixin-voice/mixin-voice.js';
64
66
  export { anchorElement } from './utils/anchor-element/anchor-element.js';
65
67
  export { arrowReach, sideOf } from './utils/arrow/arrow.js';
66
68
  export { assignSlot, assignSlots } from './utils/assign-slots/assign-slots.js';
@@ -80,6 +82,7 @@ export { closestName } from './utils/closest-name/closest-name.js';
80
82
  export { type ColorWords, colorName, hueName } from './utils/color-name/color-name.js';
81
83
  export { columnStep } from './utils/column-step/column-step.js';
82
84
  export { contextBudget, type Holder, LIVE, pageBudget, } from './utils/context-budget/context-budget.js';
85
+ export { type ControlEntry, type ControlKind, chordOfAria, controlName, controlReachable, type ListedControl, listControls, listShortcuts, registerControl, registerShortcut, runControl, type ShortcutEntry, unregisterControl, } from './utils/controls/controls.js';
83
86
  export { countLabel } from './utils/count-label/count-label.js';
84
87
  export { createSheet } from './utils/create-sheet/create-sheet.js';
85
88
  export { type Color, type ColorFormat, formatColor, parseColor, toCss, toHsl, toOklch, toRgb, } from './utils/css-color/css-color.js';
@@ -154,7 +157,10 @@ export { lockScroll, scrollHolders, unlockScroll } from './utils/scroll-lock/scr
154
157
  export { slotFilled, slotNamed } from './utils/slot-filled/slot-filled.js';
155
158
  export { SlottedGlyph } from './utils/slotted-glyph/slotted-glyph.js';
156
159
  export { slottedWords } from './utils/slotted-words/slotted-words.js';
160
+ export { ChartSound, HIGH, LOW, panOf, pitchOf, type Sound, type SoundSeries, sweepPlan, TIMBRES, } from './utils/sonify/sonify.js';
161
+ export { browserSpeech, pageSpeechEngine, registerSpeechEngine, type SpeechEngine, type SpeechListener, type SpeechSession, } from './utils/speech/speech.js';
157
162
  export { splitValues } from './utils/split-values/split-values.js';
163
+ export { captureState, type ElementState, elementAt, exposeState, type PageState, pathOf, type RestoreReport, restoreOn, restoreState, STATE_SLOT, snapshotOf, } from './utils/state/state.js';
158
164
  export { stopPress } from './utils/stop-press/stop-press.js';
159
165
  export { edgeOffset, FLING, parseSnapPoints, type SwipeAxis, type SwipeEdge, type SwipeRelease, settleSwipe, snapTravel, swipeAxis, swipeEdge, swipeStep, towardEdge, } from './utils/swipe/swipe.js';
160
166
  export { tellDisclosure } from './utils/tell-disclosure/tell-disclosure.js';
package/dist/index.js CHANGED
@@ -22,6 +22,7 @@ export { HostClickController } from './controllers/host-click-controller/host-cl
22
22
  export { IdleController } from './controllers/idle-controller/idle-controller.js';
23
23
  export { IndicatorController, } from './controllers/indicator-controller/indicator-controller.js';
24
24
  export { focusItemOf, KeyboardNavigationController, } from './controllers/keyboard-navigation-controller/keyboard-navigation-controller.js';
25
+ export { ListedController } from './controllers/listed-controller/listed-controller.js';
25
26
  export { MediaSessionController, SKIP_SECONDS, } from './controllers/media-session-controller/media-session-controller.js';
26
27
  export { animationsFinished, animationsSettled, OpenPhaseController, } from './controllers/open-phase-controller/open-phase-controller.js';
27
28
  export { OptionWindowController, } from './controllers/option-window-controller/option-window-controller.js';
@@ -40,9 +41,9 @@ export { UpgradeController, } from './controllers/upgrade-controller/upgrade-con
40
41
  export { VirtualizeController, } from './controllers/virtualize-controller/virtualize-controller.js';
41
42
  export { Waterfall } from './controllers/virtualize-controller/waterfall.js';
42
43
  export { eventsForTag, registerElementEvents } from './events/element-events.js';
43
- export { HelixActionEvent, HelixActivateEvent, HelixAuraFallbackEvent, HelixBandEvent, HelixBeforeActivateEvent, HelixBeforeChangeEvent, HelixBeforeCloseEvent, HelixBeforeCollapseEvent, HelixBeforeEditEvent, HelixBeforeMoveEvent, HelixBeforeOpenEvent, HelixBeforePanelResizeEvent, HelixBeforePasteEvent, HelixBeforePinEvent, HelixBeforeReconnectEvent, HelixBeforeRelabelEvent, HelixBeforeReorderEvent, HelixBeforeResizeEvent, HelixBeforeSplitEvent, HelixBeforeToggleEvent, HelixCanvasEditEvent, HelixCanvasPanEvent, HelixCanvasViewEvent, HelixCanvasZoomEvent, HelixCaretEvent, HelixClearEvent, HelixCollapseEvent, HelixCompleteEvent, HelixConnectEvent, HelixConsoleEvent, HelixCopyErrorEvent, HelixCopyEvent, HelixCreateEvent, HelixDeviceButtonEvent, HelixDeviceKeyEvent, HelixDeviceScreenshotEvent, HelixDeviceScrollEvent, HelixDeviceSwipeEvent, HelixDeviceTapEvent, HelixDeviceTextEvent, HelixDeviceTouchEvent, HelixDismissEvent, HelixEditEvent, HelixEndEvent, HelixExpandEvent, HelixFacetEvent, HelixFilterEvent, HelixFilteredEvent, HelixGraphFilterEvent, HelixGraphLayoutEvent, HelixGraphPanEvent, HelixGraphPartChangeEvent, HelixGraphReadyEvent, HelixGraphSignalEvent, HelixGraphZoomEvent, HelixHistoryEvent, HelixLoadEvent, HelixLoadMoreEvent, HelixMapClusterEvent, HelixMapPanEvent, HelixMapPartChangeEvent, HelixMapReadyEvent, HelixMapRotateEvent, HelixMapTiltEvent, HelixMapZoomEvent, HelixMoveEvent, HelixNavigateEvent, HelixNextEvent, HelixPanelResizeEvent, HelixPastedEvent, HelixPinEvent, HelixPlotChangeEvent, HelixPlotTurnEvent, HelixPressEvent, HelixPreviewEvent, HelixPreviousEvent, HelixRangeChangeEvent, HelixReadEvent, HelixReadingChangeEvent, HelixReadingPressEvent, HelixReconnectEvent, HelixRejectEvent, HelixRelabelEvent, HelixRemoveEvent, HelixReorderEvent, HelixReorderedEvent, HelixResizedEvent, HelixResizeEvent, HelixSampleEndEvent, HelixSampleStartEvent, HelixScrolledEvent, HelixSelectEvent, HelixSelectedEvent, HelixSendEvent, HelixShortcutEvent, HelixSortEvent, HelixSortedEvent, HelixSplitEvent, HelixStrandsFallbackEvent, HelixTerminalBellEvent, HelixTerminalInputEvent, HelixTerminalLinkEvent, HelixTerminalResizeEvent, HelixTerminalRestartEvent, HelixTerminalTitleEvent, HelixToggleEvent, HelixTourAskEvent, HelixTourStatusEvent, HelixTypingEvent, } from './events/events.js';
44
+ export { HelixActionEvent, HelixActivateEvent, HelixAuraFallbackEvent, HelixBandEvent, HelixBeforeActivateEvent, HelixBeforeChangeEvent, HelixBeforeCloseEvent, HelixBeforeCollapseEvent, HelixBeforeEditEvent, HelixBeforeListenEvent, HelixBeforeMoveEvent, HelixBeforeOpenEvent, HelixBeforePanelResizeEvent, HelixBeforePasteEvent, HelixBeforePinEvent, HelixBeforeReconnectEvent, HelixBeforeRelabelEvent, HelixBeforeReorderEvent, HelixBeforeResizeEvent, HelixBeforeSplitEvent, HelixBeforeToggleEvent, HelixCanvasEditEvent, HelixCanvasPanEvent, HelixCanvasViewEvent, HelixCanvasZoomEvent, HelixCaretEvent, HelixClearEvent, HelixCollapseEvent, HelixCompleteEvent, HelixConnectEvent, HelixConsoleEvent, HelixCopyErrorEvent, HelixCopyEvent, HelixCreateEvent, HelixDeviceButtonEvent, HelixDeviceKeyEvent, HelixDeviceScreenshotEvent, HelixDeviceScrollEvent, HelixDeviceSwipeEvent, HelixDeviceTapEvent, HelixDeviceTextEvent, HelixDeviceTouchEvent, HelixDismissEvent, HelixEditEvent, HelixEndEvent, HelixExpandEvent, HelixFacetEvent, HelixFilterEvent, HelixFilteredEvent, HelixGraphFilterEvent, HelixGraphLayoutEvent, HelixGraphPanEvent, HelixGraphPartChangeEvent, HelixGraphReadyEvent, HelixGraphSignalEvent, HelixGraphZoomEvent, HelixHistoryEvent, HelixListenEvent, HelixLoadEvent, HelixLoadMoreEvent, HelixMapClusterEvent, HelixMapPanEvent, HelixMapPartChangeEvent, HelixMapReadyEvent, HelixMapRotateEvent, HelixMapTiltEvent, HelixMapZoomEvent, HelixMoveEvent, HelixNavigateEvent, HelixNextEvent, HelixPanelResizeEvent, HelixPastedEvent, HelixPinEvent, HelixPlotChangeEvent, HelixPlotTurnEvent, HelixPressEvent, HelixPreviewEvent, HelixPreviousEvent, HelixRangeChangeEvent, HelixReadEvent, HelixReadingChangeEvent, HelixReadingPressEvent, HelixReconnectEvent, HelixRejectEvent, HelixRelabelEvent, HelixRemoveEvent, HelixReorderEvent, HelixReorderedEvent, HelixResizedEvent, HelixResizeEvent, HelixSampleEndEvent, HelixSampleStartEvent, HelixScrolledEvent, HelixSelectEvent, HelixSelectedEvent, HelixSendEvent, HelixShortcutEvent, HelixSortEvent, HelixSortedEvent, HelixSplitEvent, HelixStrandsFallbackEvent, HelixTerminalBellEvent, HelixTerminalInputEvent, HelixTerminalLinkEvent, HelixTerminalResizeEvent, HelixTerminalRestartEvent, HelixTerminalTitleEvent, HelixToggleEvent, HelixTourAskEvent, HelixTourStatusEvent, HelixTypingEvent, } from './events/events.js';
44
45
  export { HelixElement, whenHydrated } from './helix-element/helix-element.js';
45
- export { MIRROR_RULE, SCROLLER_RULE, SPOKEN_RULE, TOUCHES_RULE, VIRTUAL_RULE, } from './helix-element/mark-rules.js';
46
+ export { LAYERS_RULE, MIRROR_RULE, SCROLLER_RULE, SPOKEN_RULE, TOUCHES_RULE, VIRTUAL_RULE, } from './helix-element/mark-rules.js';
46
47
  export { HelixFormElement } from './helix-form-element/helix-form-element.js';
47
48
  export { HelixFormElementBase } from './helix-form-element/helix-form-element-base.js';
48
49
  export { MixinChartSource, PALETTE, PLOT_HEIGHT, PLOT_WIDTH, POSITION_LABEL, READINGS_PAGE, seriesIndex, seriesNames, } from './mixins/mixin-chart-source/mixin-chart-source.js';
@@ -61,6 +62,7 @@ export { MixinSegmentedField, } from './mixins/mixin-segmented-field/mixin-segme
61
62
  export { MixinSelectableItem, } from './mixins/mixin-selectable-item/mixin-selectable-item.js';
62
63
  export { MixinTokens } from './mixins/mixin-tokens/mixin-tokens.js';
63
64
  export { MixinViewport, } from './mixins/mixin-viewport/mixin-viewport.js';
65
+ export { MixinVoice } from './mixins/mixin-voice/mixin-voice.js';
64
66
  export { anchorElement } from './utils/anchor-element/anchor-element.js';
65
67
  export { arrowReach, sideOf } from './utils/arrow/arrow.js';
66
68
  export { assignSlot, assignSlots } from './utils/assign-slots/assign-slots.js';
@@ -80,6 +82,7 @@ export { closestName } from './utils/closest-name/closest-name.js';
80
82
  export { colorName, hueName } from './utils/color-name/color-name.js';
81
83
  export { columnStep } from './utils/column-step/column-step.js';
82
84
  export { contextBudget, LIVE, pageBudget, } from './utils/context-budget/context-budget.js';
85
+ export { chordOfAria, controlName, controlReachable, listControls, listShortcuts, registerControl, registerShortcut, runControl, unregisterControl, } from './utils/controls/controls.js';
83
86
  export { countLabel } from './utils/count-label/count-label.js';
84
87
  export { createSheet } from './utils/create-sheet/create-sheet.js';
85
88
  export { formatColor, parseColor, toCss, toHsl, toOklch, toRgb, } from './utils/css-color/css-color.js';
@@ -154,7 +157,10 @@ export { lockScroll, scrollHolders, unlockScroll } from './utils/scroll-lock/scr
154
157
  export { slotFilled, slotNamed } from './utils/slot-filled/slot-filled.js';
155
158
  export { SlottedGlyph } from './utils/slotted-glyph/slotted-glyph.js';
156
159
  export { slottedWords } from './utils/slotted-words/slotted-words.js';
160
+ export { ChartSound, HIGH, LOW, panOf, pitchOf, sweepPlan, TIMBRES, } from './utils/sonify/sonify.js';
161
+ export { browserSpeech, pageSpeechEngine, registerSpeechEngine, } from './utils/speech/speech.js';
157
162
  export { splitValues } from './utils/split-values/split-values.js';
163
+ export { captureState, elementAt, exposeState, pathOf, restoreOn, restoreState, STATE_SLOT, snapshotOf, } from './utils/state/state.js';
158
164
  export { stopPress } from './utils/stop-press/stop-press.js';
159
165
  export { edgeOffset, FLING, parseSnapPoints, settleSwipe, snapTravel, swipeAxis, swipeEdge, swipeStep, towardEdge, } from './utils/swipe/swipe.js';
160
166
  export { tellDisclosure } from './utils/tell-disclosure/tell-disclosure.js';
@@ -224,6 +224,28 @@ export declare class MixinChartSourceInterface {
224
224
  * `data`: there is then no table on the page to read. Nothing otherwise.
225
225
  */
226
226
  protected renderTable(): TemplateResult | typeof nothing;
227
+ /**
228
+ * Draws a Listen button that plays the chart as sound, and plays each
229
+ * reading's tone as the arrow keys step to it. L plays it too while the
230
+ * chart has focus, and Escape stops it.
231
+ */
232
+ sonify: boolean;
233
+ /** How long each series takes to play, in milliseconds or as `3s`. */
234
+ sonifyDuration: number;
235
+ /** The Listen button's words. */
236
+ sonifyLabel: string;
237
+ /** The Listen button's words while the chart plays. */
238
+ sonifyStopLabel: string;
239
+ /** Whether the chart is playing as sound now. */
240
+ get sounding(): boolean;
241
+ /** `visible` draws the chart's text summary under it, as one line, and `hidden`, as absent does, gives it to a screen reader alone. */
242
+ summary?: 'hidden' | 'visible';
243
+ /** Plays every shown series as sound, one after another, and resolves when it ends or is stopped. */
244
+ playReadings(): Promise<void>;
245
+ /** Stops the sound. */
246
+ stopReadings(): void;
247
+ /** The Listen button, under `sonify`, behind a seam a chart places. */
248
+ protected renderSonify(): TemplateResult | typeof nothing;
227
249
  }
228
250
  /**
229
251
  * How many readings the table drawn from `data` holds at once.