@fusion.dev/helix-core 0.218.0 → 0.220.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.
@@ -19,6 +19,16 @@ export interface PopoverOptions {
19
19
  * itself instead, so a press on its trigger is inside rather than out.
20
20
  */
21
21
  boundary?: () => Element | readonly (Element | null | undefined)[] | null | undefined;
22
+ /**
23
+ * What the open surface does to a tooltip outside it.
24
+ *
25
+ * `hide`, the default, closes a tooltip showing outside the surface as it
26
+ * opens, and keeps tooltips outside it closed until it closes. A tooltip
27
+ * inside it still shows. `keep` leaves them alone, for a surface that is a
28
+ * tooltip itself or that stays up while the reader goes on using the page,
29
+ * such as a tour's stop.
30
+ */
31
+ hints?: 'hide' | 'keep';
22
32
  /** Space between the anchor and the surface, in pixels. */
23
33
  offset?: number | (() => number);
24
34
  /** Whether the surface may move to the other side to fit. On by default. See `FloatingController`. */
@@ -93,6 +103,19 @@ export interface PopoverOptions {
93
103
  /** The panel that floats. */
94
104
  surface: () => HTMLElement | null | undefined;
95
105
  }
106
+ /**
107
+ * Whether a tooltip at `element` may show: no surface is open, or the last one
108
+ * to open holds it. A tooltip outside an open menu or popover would sit over
109
+ * the panel the reader is using.
110
+ */
111
+ export declare function hintMayShow(element: Element): boolean;
112
+ /**
113
+ * Calls `watcher` with each surface that opens and hides the tooltips outside
114
+ * it. Returns the call that stops it.
115
+ */
116
+ export declare function onPanelOpen(watcher: (surface: HTMLElement) => void): () => void;
117
+ /** Whether `element` is drawn inside `surface`, following slots. */
118
+ export declare function hintInside(surface: HTMLElement, element: Element): boolean;
96
119
  /**
97
120
  * A surface that floats against something, in the top layer, until dismissed.
98
121
  *
@@ -128,6 +151,8 @@ export declare class PopoverController implements ReactiveController {
128
151
  private readonly dismisser;
129
152
  /** Whether the surface is currently shown, so the calls can be idempotent. */
130
153
  private shown;
154
+ /** The surface tooltips outside it yield to, while it is open. */
155
+ private held;
131
156
  private readonly host;
132
157
  constructor(host: ReactiveControllerHost & HTMLElement, options: PopoverOptions);
133
158
  /** Whether the surface is showing. */
@@ -144,6 +169,8 @@ export declare class PopoverController implements ReactiveController {
144
169
  * track of which one got there first.
145
170
  */
146
171
  show(): void;
172
+ /** Takes the surface off the list of open ones, so tooltips may show again. */
173
+ private freeHints;
147
174
  /** Hides the surface and stops everything watching it. */
148
175
  hide(): void;
149
176
  /** Whichever of the two the surface is not already doing. */
@@ -1,5 +1,46 @@
1
1
  import { DismissController } from '../dismiss-controller/dismiss-controller.js';
2
2
  import { FloatingController } from '../floating-controller/floating-controller.js';
3
+ const PANELS = Symbol.for('fusion.helix.open-panels');
4
+ const openPanels = () => {
5
+ const globals = globalThis;
6
+ globals[PANELS] ??= { open: new Set(), watchers: new Set() };
7
+ return globals[PANELS];
8
+ };
9
+ const slotOf = (node) => {
10
+ const element = node;
11
+ if (element.assignedSlot) {
12
+ return element.assignedSlot;
13
+ }
14
+ const root = node.parentNode?.shadowRoot;
15
+ if (!root || typeof element.getAttribute !== 'function') {
16
+ return null;
17
+ }
18
+ const name = element.getAttribute('slot');
19
+ return root.querySelector(name ? `slot[name="${name.replaceAll('"', '\\"')}"]` : 'slot:not([name])');
20
+ };
21
+ const drawnInside = (container, node) => {
22
+ let at = node;
23
+ while (at) {
24
+ if (at === container) {
25
+ return true;
26
+ }
27
+ at = slotOf(at) ?? at.parentNode ?? at.host ?? null;
28
+ }
29
+ return false;
30
+ };
31
+ export function hintMayShow(element) {
32
+ const open = [...openPanels().open];
33
+ const last = open.at(-1);
34
+ return last === undefined || drawnInside(last, element);
35
+ }
36
+ export function onPanelOpen(watcher) {
37
+ const { watchers } = openPanels();
38
+ watchers.add(watcher);
39
+ return () => watchers.delete(watcher);
40
+ }
41
+ export function hintInside(surface, element) {
42
+ return drawnInside(surface, element);
43
+ }
3
44
  export class PopoverController {
4
45
  constructor(host, options) {
5
46
  this.shown = false;
@@ -64,6 +105,20 @@ export class PopoverController {
64
105
  this.floating.release();
65
106
  }
66
107
  this.dismisser.activate();
108
+ if (this.options.hints !== 'keep') {
109
+ const panels = openPanels();
110
+ this.held = surface;
111
+ panels.open.add(surface);
112
+ for (const watcher of [...panels.watchers]) {
113
+ watcher(surface);
114
+ }
115
+ }
116
+ }
117
+ freeHints() {
118
+ if (this.held) {
119
+ openPanels().open.delete(this.held);
120
+ this.held = undefined;
121
+ }
67
122
  }
68
123
  hide() {
69
124
  const surface = this.options.surface();
@@ -71,6 +126,7 @@ export class PopoverController {
71
126
  return;
72
127
  }
73
128
  this.shown = false;
129
+ this.freeHints();
74
130
  this.dismisser.deactivate();
75
131
  this.floating.stop();
76
132
  surface?.hidePopover?.();
@@ -88,6 +144,7 @@ export class PopoverController {
88
144
  }
89
145
  hostDisconnected() {
90
146
  this.shown = false;
147
+ this.freeHints();
91
148
  }
92
149
  hostConnected() {
93
150
  if (this.options.open?.()) {
@@ -3,12 +3,14 @@ import { keyClaimed } from '../../utils/key-claimed/key-claimed.js';
3
3
  import { Typeahead, typesCharacter } from '../../utils/typeahead/typeahead.js';
4
4
  const KEYS = new Set(['ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Home', 'End']);
5
5
  const ownsTabStop = (node) => 'focusable' in node;
6
+ const disabledOut = (node) => node.hasAttribute('disabled') &&
7
+ node.focusableWhenDisabled !== true;
6
8
  const NATIVE = 'a[href], button, input, select, textarea, [tabindex], [contenteditable=""], [contenteditable="true"]';
7
9
  const TABBABLE = NATIVE.replace('[tabindex]', '[tabindex]:not([tabindex="-1"])');
8
10
  const innerStops = new WeakMap();
9
11
  const takesFocus = (node) => {
10
12
  if (!(node instanceof HTMLElement) ||
11
- node.hasAttribute('disabled') ||
13
+ disabledOut(node) ||
12
14
  node.getAttribute('aria-hidden') === 'true') {
13
15
  return false;
14
16
  }
@@ -138,7 +140,7 @@ export class ToolbarController {
138
140
  const controls = [];
139
141
  for (const child of this.members) {
140
142
  if (!(child instanceof HTMLElement) ||
141
- child.hasAttribute('disabled') ||
143
+ disabledOut(child) ||
142
144
  child.getAttribute('aria-hidden') === 'true') {
143
145
  continue;
144
146
  }
@@ -314,7 +316,7 @@ export class ToolbarController {
314
316
  const watched = this.options.watch?.() ?? this.host;
315
317
  this.watcher = new MutationObserver(() => this.restore());
316
318
  this.watcher.observe(watched, {
317
- attributeFilter: ['disabled', 'aria-hidden'],
319
+ attributeFilter: ['disabled', 'focusable-when-disabled', 'aria-hidden'],
318
320
  attributes: true,
319
321
  subtree: true,
320
322
  });
@@ -194,6 +194,13 @@ export interface FilterDetail {
194
194
  /** What the list is being narrowed to. */
195
195
  value: string;
196
196
  }
197
+ /** Detail carried by `helix-found`. */
198
+ export interface FoundDetail {
199
+ /** How many matches the search found. */
200
+ count: number;
201
+ /** Which match is current, counting from 0, or -1 for none. */
202
+ index: number;
203
+ }
197
204
  /**
198
205
  * Detail carried by `helix-facet`.
199
206
  *
@@ -77,6 +77,7 @@ import { HelixExpandEvent } from './expand.js';
77
77
  import { HelixFacetEvent } from './facet.js';
78
78
  import { HelixFilterEvent } from './filter.js';
79
79
  import { HelixFilteredEvent } from './filtered.js';
80
+ import { HelixFoundEvent } from './found.js';
80
81
  import { HelixGraphFilterEvent } from './graph-filter.js';
81
82
  import { HelixGraphLayoutEvent } from './graph-layout.js';
82
83
  import { HelixGraphPanEvent } from './graph-pan.js';
@@ -128,6 +129,7 @@ import { HelixShortcutEvent } from './shortcut.js';
128
129
  import { HelixSortEvent } from './sort.js';
129
130
  import { HelixSortedEvent } from './sorted.js';
130
131
  import { HelixSplitEvent } from './split.js';
132
+ import { HelixStopEvent } from './stop.js';
131
133
  import { HelixStrandsFallbackEvent } from './strands-fallback.js';
132
134
  import { HelixTerminalBellEvent } from './terminal-bell.js';
133
135
  import { HelixTerminalInputEvent } from './terminal-input.js';
@@ -139,9 +141,9 @@ import { HelixToggleEvent } from './toggle.js';
139
141
  import { HelixTourAskEvent } from './tour-ask.js';
140
142
  import { HelixTourStatusEvent } from './tour-status.js';
141
143
  import { HelixTypingEvent } from './typing.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';
144
+ export type { ActivateDetail, AuraFallbackDetail, BandDetail, CanvasView, CaretDetail, ChangeDetail, CompleteDetail, ConnectDetail, ConsoleDetail, CopyDetail, CreateDetail, DeviceButton, DeviceButtonDetail, DeviceKeyDetail, DeviceScrollDetail, DeviceSwipeDetail, DeviceTapDetail, DeviceTextDetail, DeviceTouchDetail, DismissDetail, FacetDetail, FilterDetail, FoundDetail, 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';
143
145
  export { helixEventNames } from './names.js';
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, };
146
+ 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, HelixFoundEvent, 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, HelixStopEvent, HelixStrandsFallbackEvent, HelixTerminalBellEvent, HelixTerminalInputEvent, HelixTerminalLinkEvent, HelixTerminalResizeEvent, HelixTerminalRestartEvent, HelixTerminalTitleEvent, HelixToggleEvent, HelixTourAskEvent, HelixTourStatusEvent, HelixTypingEvent, };
145
147
  /**
146
148
  * Every event class, and the one place a new one is registered: a class in a
147
149
  * module of its own, imported above, and named here and in `names.ts`.
@@ -204,6 +206,7 @@ declare const registry: {
204
206
  readonly HelixFacetEvent: typeof HelixFacetEvent;
205
207
  readonly HelixFilterEvent: typeof HelixFilterEvent;
206
208
  readonly HelixFilteredEvent: typeof HelixFilteredEvent;
209
+ readonly HelixFoundEvent: typeof HelixFoundEvent;
207
210
  readonly HelixGraphFilterEvent: typeof HelixGraphFilterEvent;
208
211
  readonly HelixGraphLayoutEvent: typeof HelixGraphLayoutEvent;
209
212
  readonly HelixGraphPanEvent: typeof HelixGraphPanEvent;
@@ -255,6 +258,7 @@ declare const registry: {
255
258
  readonly HelixSortEvent: typeof HelixSortEvent;
256
259
  readonly HelixSortedEvent: typeof HelixSortedEvent;
257
260
  readonly HelixSplitEvent: typeof HelixSplitEvent;
261
+ readonly HelixStopEvent: typeof HelixStopEvent;
258
262
  readonly HelixStrandsFallbackEvent: typeof HelixStrandsFallbackEvent;
259
263
  readonly HelixTerminalBellEvent: typeof HelixTerminalBellEvent;
260
264
  readonly HelixTerminalInputEvent: typeof HelixTerminalInputEvent;
@@ -47,6 +47,7 @@ import { HelixExpandEvent } from './expand.js';
47
47
  import { HelixFacetEvent } from './facet.js';
48
48
  import { HelixFilterEvent } from './filter.js';
49
49
  import { HelixFilteredEvent } from './filtered.js';
50
+ import { HelixFoundEvent } from './found.js';
50
51
  import { HelixGraphFilterEvent } from './graph-filter.js';
51
52
  import { HelixGraphLayoutEvent } from './graph-layout.js';
52
53
  import { HelixGraphPanEvent } from './graph-pan.js';
@@ -98,6 +99,7 @@ import { HelixShortcutEvent } from './shortcut.js';
98
99
  import { HelixSortEvent } from './sort.js';
99
100
  import { HelixSortedEvent } from './sorted.js';
100
101
  import { HelixSplitEvent } from './split.js';
102
+ import { HelixStopEvent } from './stop.js';
101
103
  import { HelixStrandsFallbackEvent } from './strands-fallback.js';
102
104
  import { HelixTerminalBellEvent } from './terminal-bell.js';
103
105
  import { HelixTerminalInputEvent } from './terminal-input.js';
@@ -110,7 +112,7 @@ import { HelixTourAskEvent } from './tour-ask.js';
110
112
  import { HelixTourStatusEvent } from './tour-status.js';
111
113
  import { HelixTypingEvent } from './typing.js';
112
114
  export { helixEventNames } from './names.js';
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, };
115
+ 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, HelixFoundEvent, 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, HelixStopEvent, HelixStrandsFallbackEvent, HelixTerminalBellEvent, HelixTerminalInputEvent, HelixTerminalLinkEvent, HelixTerminalResizeEvent, HelixTerminalRestartEvent, HelixTerminalTitleEvent, HelixToggleEvent, HelixTourAskEvent, HelixTourStatusEvent, HelixTypingEvent, };
114
116
  const registry = {
115
117
  HelixActionEvent,
116
118
  HelixActivateEvent,
@@ -161,6 +163,7 @@ const registry = {
161
163
  HelixFacetEvent,
162
164
  HelixFilterEvent,
163
165
  HelixFilteredEvent,
166
+ HelixFoundEvent,
164
167
  HelixGraphFilterEvent,
165
168
  HelixGraphLayoutEvent,
166
169
  HelixGraphPanEvent,
@@ -212,6 +215,7 @@ const registry = {
212
215
  HelixSortEvent,
213
216
  HelixSortedEvent,
214
217
  HelixSplitEvent,
218
+ HelixStopEvent,
215
219
  HelixStrandsFallbackEvent,
216
220
  HelixTerminalBellEvent,
217
221
  HelixTerminalInputEvent,
@@ -0,0 +1,14 @@
1
+ import type { FoundDetail } from './details.js';
2
+ /**
3
+ * A search found its matches, or moved among them, with how many there are
4
+ * and which is current.
5
+ *
6
+ * Sent by Find after each search and each move, and again when content that
7
+ * changed under an open search is searched again. Not cancelable: it reports
8
+ * matches already marked, as `helix-filtered` reports a list already
9
+ * narrowed.
10
+ */
11
+ export declare class HelixFoundEvent extends CustomEvent<FoundDetail> {
12
+ static readonly eventName = "helix-found";
13
+ constructor(detail: FoundDetail);
14
+ }
@@ -0,0 +1,11 @@
1
+ export class HelixFoundEvent extends CustomEvent {
2
+ static { this.eventName = 'helix-found'; }
3
+ constructor(detail) {
4
+ super(HelixFoundEvent.eventName, {
5
+ bubbles: true,
6
+ cancelable: false,
7
+ composed: true,
8
+ detail,
9
+ });
10
+ }
11
+ }
@@ -4,14 +4,14 @@ export const helixEventNames = new Set(('action activate aura-fallback band befo
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
- 'filtered graph-filter graph-layout graph-pan graph-part-change graph-ready ' +
7
+ 'filtered found graph-filter graph-layout graph-pan graph-part-change graph-ready ' +
8
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 ' +
12
12
  'relabel remove reorder ' +
13
13
  'reordered resize resized sample-end sample-start scrolled select selected send ' +
14
- 'shortcut sort sorted split strands-fallback terminal-bell terminal-input terminal-link ' +
14
+ 'shortcut sort sorted split stop strands-fallback terminal-bell terminal-input terminal-link ' +
15
15
  'terminal-resize terminal-restart terminal-title toggle tour-ask tour-status typing')
16
16
  .split(' ')
17
17
  .map((name) => `helix-${name}`));
@@ -0,0 +1,12 @@
1
+ /**
2
+ * A reader asked for what is under way to stop: the stop control a chat
3
+ * composer shows in place of its send button while a reply is on its way.
4
+ *
5
+ * Carries nothing, because what stops is the listener's to know. Not
6
+ * cancelable: the reader has asked, and the composer changes nothing by
7
+ * itself, so there is nothing for a listener to refuse.
8
+ */
9
+ export declare class HelixStopEvent extends Event {
10
+ static readonly eventName = "helix-stop";
11
+ constructor();
12
+ }
@@ -0,0 +1,6 @@
1
+ export class HelixStopEvent extends Event {
2
+ static { this.eventName = 'helix-stop'; }
3
+ constructor() {
4
+ super(HelixStopEvent.eventName, { bubbles: true, cancelable: false, composed: true });
5
+ }
6
+ }
@@ -298,6 +298,25 @@ export declare class HelixElement extends LitElement {
298
298
  * cost, and a property read where it did not: see `reportRender`.
299
299
  */
300
300
  protected performUpdate(): void;
301
+ /**
302
+ * Whether the first update found React's props, where it looked before the
303
+ * render. See `willUpdate`.
304
+ */
305
+ private reactApplied;
306
+ /**
307
+ * **The first look for React's props, and the one that costs nothing.** It
308
+ * succeeds whenever the definition landed after React hydrated, which is the
309
+ * ordering a deferred or lazily imported element has: the bag is already on
310
+ * the node, so the value is in the first render.
311
+ *
312
+ * **Before the render, because `firstUpdated` is too late.** A value
313
+ * assigned there schedules a second update as the first one finishes, which
314
+ * Lit's development build reports as `change-in-update`: Command's
315
+ * `filterMatch` did in the Hartley app until October 14, 2026. A hydrating
316
+ * render has to be the server's, so that element looks in `firstUpdated`,
317
+ * where `finishHydration` asks for the update after it anyway.
318
+ */
319
+ protected willUpdate(changed: PropertyValues): void;
301
320
  /**
302
321
  * Marks the component's first style resolution as done, so `SETTLED` stops
303
322
  * suppressing transitions.
@@ -107,10 +107,16 @@ export class HelixElement extends LitElement {
107
107
  reportRender(this, start, performance.now() - start);
108
108
  }
109
109
  }
110
+ willUpdate(changed) {
111
+ super.willUpdate(changed);
112
+ if (!this.hasUpdated && !this.hydrating) {
113
+ this.reactApplied = applyReactProperties(this);
114
+ }
115
+ }
110
116
  firstUpdated(changed) {
111
117
  super.firstUpdated(changed);
112
118
  reportUsage(this);
113
- const applied = applyReactProperties(this);
119
+ const applied = this.reactApplied ?? applyReactProperties(this);
114
120
  requestAnimationFrame(() => {
115
121
  this.toggleState('settled', true);
116
122
  this.resolveSettled();
package/dist/index.d.ts CHANGED
@@ -28,7 +28,7 @@ export { animationsFinished, animationsSettled, type OpenPhase, OpenPhaseControl
28
28
  export { OptionWindowController, type OptionWindowOptions, } from './controllers/option-window-controller/option-window-controller.js';
29
29
  export { MAX_FRAME_STEP, PaintGateController, type PaintGateOptions, } from './controllers/paint-gate-controller/paint-gate-controller.js';
30
30
  export { PlacementController } from './controllers/placement-controller/placement-controller.js';
31
- export { PopoverController, type PopoverOptions, } from './controllers/popover-controller/popover-controller.js';
31
+ export { hintInside, hintMayShow, onPanelOpen, PopoverController, type PopoverOptions, } from './controllers/popover-controller/popover-controller.js';
32
32
  export { RelativeClockController, type RelativeClockOptions, } from './controllers/relative-clock-controller/relative-clock-controller.js';
33
33
  export { RemotePlaybackController, type RemoteReport, } from './controllers/remote-playback-controller/remote-playback-controller.js';
34
34
  export { ReorderController, type ReorderMove, type ReorderOptions, type ReorderWords, requestReorder, } from './controllers/reorder-controller/reorder-controller.js';
@@ -41,7 +41,7 @@ export { UpgradeController, type UpgradeOptions, } from './controllers/upgrade-c
41
41
  export { type Rendered, VirtualizeController, type VirtualizeOptions, type Window as VirtualizeWindow, } from './controllers/virtualize-controller/virtualize-controller.js';
42
42
  export { Waterfall } from './controllers/virtualize-controller/waterfall.js';
43
43
  export { eventsForTag, registerElementEvents } from './events/element-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
+ 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 FoundDetail, 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, HelixFoundEvent, 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, HelixStopEvent, 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';
45
45
  export { HelixElement, whenHydrated } from './helix-element/helix-element.js';
46
46
  export { LAYERS_RULE, MIRROR_RULE, SCROLLER_RULE, SPOKEN_RULE, TOUCHES_RULE, VIRTUAL_RULE, } from './helix-element/mark-rules.js';
47
47
  export { HelixFormElement } from './helix-form-element/helix-form-element.js';
@@ -100,6 +100,7 @@ export { type ElementByIdOptions, elementById, searchableById, } from './utils/e
100
100
  export { exportParts } from './utils/export-parts/export-parts.js';
101
101
  export { fillTemplate, labelWith } from './utils/fill-template/fill-template.js';
102
102
  export { FILTER_MARK, filterKeeps, markMatches, rangeOf, } from './utils/filter-marks/filter-marks.js';
103
+ export { FIND_CURRENT, FIND_MATCH, type FindDirection, type Finder, type FindQuery, type FindResult, findPattern, findRanges, findTextRanges, type TextFinderOptions, textFinder, } from './utils/find-text/find-text.js';
103
104
  export { focusTarget } from './utils/focus-target/focus-target.js';
104
105
  export { deepActiveElement, deepContains, focusableElements, PRESSABLE, pressedOwnControl, } from './utils/focusable-elements/focusable-elements.js';
105
106
  export { afterLinkFollowed, followLink, type LinkModifiers, type LinkTarget, } from './utils/follow-link/follow-link.js';
package/dist/index.js CHANGED
@@ -28,7 +28,7 @@ export { animationsFinished, animationsSettled, OpenPhaseController, } from './c
28
28
  export { OptionWindowController, } from './controllers/option-window-controller/option-window-controller.js';
29
29
  export { MAX_FRAME_STEP, PaintGateController, } from './controllers/paint-gate-controller/paint-gate-controller.js';
30
30
  export { PlacementController } from './controllers/placement-controller/placement-controller.js';
31
- export { PopoverController, } from './controllers/popover-controller/popover-controller.js';
31
+ export { hintInside, hintMayShow, onPanelOpen, PopoverController, } from './controllers/popover-controller/popover-controller.js';
32
32
  export { RelativeClockController, } from './controllers/relative-clock-controller/relative-clock-controller.js';
33
33
  export { RemotePlaybackController, } from './controllers/remote-playback-controller/remote-playback-controller.js';
34
34
  export { ReorderController, requestReorder, } from './controllers/reorder-controller/reorder-controller.js';
@@ -41,7 +41,7 @@ export { UpgradeController, } from './controllers/upgrade-controller/upgrade-con
41
41
  export { VirtualizeController, } from './controllers/virtualize-controller/virtualize-controller.js';
42
42
  export { Waterfall } from './controllers/virtualize-controller/waterfall.js';
43
43
  export { eventsForTag, registerElementEvents } from './events/element-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
+ 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, HelixFoundEvent, 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, HelixStopEvent, HelixStrandsFallbackEvent, HelixTerminalBellEvent, HelixTerminalInputEvent, HelixTerminalLinkEvent, HelixTerminalResizeEvent, HelixTerminalRestartEvent, HelixTerminalTitleEvent, HelixToggleEvent, HelixTourAskEvent, HelixTourStatusEvent, HelixTypingEvent, } from './events/events.js';
45
45
  export { HelixElement, whenHydrated } from './helix-element/helix-element.js';
46
46
  export { LAYERS_RULE, MIRROR_RULE, SCROLLER_RULE, SPOKEN_RULE, TOUCHES_RULE, VIRTUAL_RULE, } from './helix-element/mark-rules.js';
47
47
  export { HelixFormElement } from './helix-form-element/helix-form-element.js';
@@ -100,6 +100,7 @@ export { elementById, searchableById, } from './utils/element-by-id/element-by-i
100
100
  export { exportParts } from './utils/export-parts/export-parts.js';
101
101
  export { fillTemplate, labelWith } from './utils/fill-template/fill-template.js';
102
102
  export { FILTER_MARK, filterKeeps, markMatches, rangeOf, } from './utils/filter-marks/filter-marks.js';
103
+ export { FIND_CURRENT, FIND_MATCH, findPattern, findRanges, findTextRanges, textFinder, } from './utils/find-text/find-text.js';
103
104
  export { focusTarget } from './utils/focus-target/focus-target.js';
104
105
  export { deepActiveElement, deepContains, focusableElements, PRESSABLE, pressedOwnControl, } from './utils/focusable-elements/focusable-elements.js';
105
106
  export { afterLinkFollowed, followLink, } from './utils/follow-link/follow-link.js';
@@ -292,12 +292,14 @@ export const MixinViewport = (Base) => {
292
292
  }
293
293
  const [up, start, end, down] = ['up', 'start', 'end', 'down'].map((way) => this.panGlyph(way));
294
294
  const button = this.controlTag;
295
+ const tip = this.tag('tooltip');
295
296
  const { material, raised } = this.controlAxes;
296
297
  const ground = material ?? nothing;
297
298
  return staticHtml `<div part="controls" role="toolbar" aria-label=${this.controlsLabel}>
298
299
  ${pan
299
300
  ? staticHtml `<${button}
300
301
  part="pan-up"
302
+ id="pan-up"
301
303
  exportparts="button: pan-up-button, live: pan-up-live, spinner: pan-up-spinner, text: pan-up-text"
302
304
  label=${this.panLabel('up')}
303
305
  material=${ground}
@@ -306,9 +308,10 @@ export const MixinViewport = (Base) => {
306
308
  @helix-press=${stopPress}
307
309
  >
308
310
  <slot name="pan-up-icon">${up}</slot>
309
- </${button}>
311
+ </${button}><${tip} for="pan-up" content=${this.panLabel('up')} exportparts="arrow: tooltip-arrow, arrow-bottom: tooltip-arrow-bottom, arrow-left: tooltip-arrow-left, arrow-right: tooltip-arrow-right, arrow-top: tooltip-arrow-top, surface: tooltip-surface, surface-bottom: tooltip-surface-bottom, surface-left: tooltip-surface-left, surface-right: tooltip-surface-right, surface-top: tooltip-surface-top"></${tip}>
310
312
  <${button}
311
313
  part="pan-start"
314
+ id="pan-start"
312
315
  exportparts="button: pan-start-button, live: pan-start-live, spinner: pan-start-spinner, text: pan-start-text"
313
316
  label=${this.panLabel('start')}
314
317
  material=${ground}
@@ -317,9 +320,10 @@ export const MixinViewport = (Base) => {
317
320
  @helix-press=${stopPress}
318
321
  >
319
322
  <slot name="pan-start-icon">${start}</slot>
320
- </${button}>
323
+ </${button}><${tip} for="pan-start" content=${this.panLabel('start')} exportparts="arrow: tooltip-arrow, arrow-bottom: tooltip-arrow-bottom, arrow-left: tooltip-arrow-left, arrow-right: tooltip-arrow-right, arrow-top: tooltip-arrow-top, surface: tooltip-surface, surface-bottom: tooltip-surface-bottom, surface-left: tooltip-surface-left, surface-right: tooltip-surface-right, surface-top: tooltip-surface-top"></${tip}>
321
324
  <${button}
322
325
  part="pan-end"
326
+ id="pan-end"
323
327
  exportparts="button: pan-end-button, live: pan-end-live, spinner: pan-end-spinner, text: pan-end-text"
324
328
  label=${this.panLabel('end')}
325
329
  material=${ground}
@@ -328,9 +332,10 @@ export const MixinViewport = (Base) => {
328
332
  @helix-press=${stopPress}
329
333
  >
330
334
  <slot name="pan-end-icon">${end}</slot>
331
- </${button}>
335
+ </${button}><${tip} for="pan-end" content=${this.panLabel('end')} exportparts="arrow: tooltip-arrow, arrow-bottom: tooltip-arrow-bottom, arrow-left: tooltip-arrow-left, arrow-right: tooltip-arrow-right, arrow-top: tooltip-arrow-top, surface: tooltip-surface, surface-bottom: tooltip-surface-bottom, surface-left: tooltip-surface-left, surface-right: tooltip-surface-right, surface-top: tooltip-surface-top"></${tip}>
332
336
  <${button}
333
337
  part="pan-down"
338
+ id="pan-down"
334
339
  exportparts="button: pan-down-button, live: pan-down-live, spinner: pan-down-spinner, text: pan-down-text"
335
340
  label=${this.panLabel('down')}
336
341
  material=${ground}
@@ -339,11 +344,12 @@ export const MixinViewport = (Base) => {
339
344
  @helix-press=${stopPress}
340
345
  >
341
346
  <slot name="pan-down-icon">${down}</slot>
342
- </${button}>`
347
+ </${button}><${tip} for="pan-down" content=${this.panLabel('down')} exportparts="arrow: tooltip-arrow, arrow-bottom: tooltip-arrow-bottom, arrow-left: tooltip-arrow-left, arrow-right: tooltip-arrow-right, arrow-top: tooltip-arrow-top, surface: tooltip-surface, surface-bottom: tooltip-surface-bottom, surface-left: tooltip-surface-left, surface-right: tooltip-surface-right, surface-top: tooltip-surface-top"></${tip}>`
343
348
  : nothing}
344
349
  ${zoom
345
350
  ? staticHtml `<${button}
346
351
  part="zoom-in"
352
+ id="zoom-in"
347
353
  exportparts="button: zoom-in-button, live: zoom-in-live, spinner: zoom-in-spinner, text: zoom-in-text"
348
354
  label=${this.zoomInLabel}
349
355
  material=${ground}
@@ -352,9 +358,10 @@ export const MixinViewport = (Base) => {
352
358
  @helix-press=${stopPress}
353
359
  >
354
360
  <slot name="zoom-in-icon">+</slot>
355
- </${button}>
361
+ </${button}><${tip} for="zoom-in" content=${this.zoomInLabel} exportparts="arrow: tooltip-arrow, arrow-bottom: tooltip-arrow-bottom, arrow-left: tooltip-arrow-left, arrow-right: tooltip-arrow-right, arrow-top: tooltip-arrow-top, surface: tooltip-surface, surface-bottom: tooltip-surface-bottom, surface-left: tooltip-surface-left, surface-right: tooltip-surface-right, surface-top: tooltip-surface-top"></${tip}>
356
362
  <${button}
357
363
  part="zoom-out"
364
+ id="zoom-out"
358
365
  exportparts="button: zoom-out-button, live: zoom-out-live, spinner: zoom-out-spinner, text: zoom-out-text"
359
366
  label=${this.zoomOutLabel}
360
367
  material=${ground}
@@ -363,12 +370,13 @@ export const MixinViewport = (Base) => {
363
370
  @helix-press=${stopPress}
364
371
  >
365
372
  <slot name="zoom-out-icon">−</slot>
366
- </${button}>`
373
+ </${button}><${tip} for="zoom-out" content=${this.zoomOutLabel} exportparts="arrow: tooltip-arrow, arrow-bottom: tooltip-arrow-bottom, arrow-left: tooltip-arrow-left, arrow-right: tooltip-arrow-right, arrow-top: tooltip-arrow-top, surface: tooltip-surface, surface-bottom: tooltip-surface-bottom, surface-left: tooltip-surface-left, surface-right: tooltip-surface-right, surface-top: tooltip-surface-top"></${tip}>`
367
374
  : nothing}
368
375
  ${more}
369
376
  ${fullscreen
370
377
  ? staticHtml `<${button}
371
378
  part="fullscreen"
379
+ id="fullscreen"
372
380
  exportparts="button: fullscreen-button, live: fullscreen-live, spinner: fullscreen-spinner, text: fullscreen-text"
373
381
  aria-pressed=${this.filled ? 'true' : 'false'}
374
382
  label=${this.fullscreenLabel}
@@ -378,7 +386,7 @@ export const MixinViewport = (Base) => {
378
386
  @helix-press=${stopPress}
379
387
  >
380
388
  <slot name="fullscreen-icon">⤢</slot>
381
- </${button}>`
389
+ </${button}><${tip} for="fullscreen" content=${this.fullscreenLabel} exportparts="arrow: tooltip-arrow, arrow-bottom: tooltip-arrow-bottom, arrow-left: tooltip-arrow-left, arrow-right: tooltip-arrow-right, arrow-top: tooltip-arrow-top, surface: tooltip-surface, surface-bottom: tooltip-surface-bottom, surface-left: tooltip-surface-left, surface-right: tooltip-surface-right, surface-top: tooltip-surface-top"></${tip}>`
382
390
  : nothing}
383
391
  </div>`;
384
392
  }
@@ -8,5 +8,7 @@ import type { auditChildren as audit, auditEntry as entry } from './audit-childr
8
8
  * builds. See `audit-children.ts`.
9
9
  */
10
10
  export declare const auditChildren: typeof audit;
11
+ /** A production build has no audit, so nothing waits. See `QUIET`. */
12
+ export declare const QUIET = 0;
11
13
  /** The missing-entry warning in a production build: nothing. See `auditEntry`. */
12
14
  export declare const auditEntry: typeof entry;
@@ -1,2 +1,3 @@
1
1
  export const auditChildren = () => { };
2
+ export const QUIET = 0;
2
3
  export const auditEntry = () => { };