@fusion.dev/helix-core 0.211.0 → 0.212.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 (36) hide show
  1. package/custom-elements.json +1 -1
  2. package/dist/controllers/virtualize-controller/heights.d.ts +9 -0
  3. package/dist/controllers/virtualize-controller/heights.js +10 -0
  4. package/dist/controllers/virtualize-controller/virtualize-controller.d.ts +25 -1
  5. package/dist/controllers/virtualize-controller/virtualize-controller.js +35 -3
  6. package/dist/events/details.d.ts +103 -0
  7. package/dist/events/device-button.d.ts +14 -0
  8. package/dist/events/device-button.js +11 -0
  9. package/dist/events/device-key.d.ts +16 -0
  10. package/dist/events/device-key.js +11 -0
  11. package/dist/events/device-screenshot.d.ts +13 -0
  12. package/dist/events/device-screenshot.js +10 -0
  13. package/dist/events/device-scroll.d.ts +14 -0
  14. package/dist/events/device-scroll.js +11 -0
  15. package/dist/events/device-swipe.d.ts +15 -0
  16. package/dist/events/device-swipe.js +11 -0
  17. package/dist/events/device-tap.d.ts +13 -0
  18. package/dist/events/device-tap.js +11 -0
  19. package/dist/events/device-text.d.ts +13 -0
  20. package/dist/events/device-text.js +11 -0
  21. package/dist/events/device-touch.d.ts +15 -0
  22. package/dist/events/device-touch.js +11 -0
  23. package/dist/events/events.d.ts +18 -2
  24. package/dist/events/events.js +17 -1
  25. package/dist/events/names.js +2 -1
  26. package/dist/helix-element/helix-element.d.ts +2 -2
  27. package/dist/helix-element/mark-rules.d.ts +14 -0
  28. package/dist/helix-element/mark-rules.js +1 -0
  29. package/dist/index.d.ts +3 -2
  30. package/dist/index.js +3 -2
  31. package/dist/mixins/mixin-viewport/mixin-viewport.js +1 -1
  32. package/dist/utils/stop-press/stop-press.d.ts +9 -0
  33. package/dist/utils/stop-press/stop-press.js +3 -0
  34. package/dist/version.d.ts +1 -1
  35. package/dist/version.js +1 -1
  36. package/package.json +4 -4
@@ -68,6 +68,15 @@ export declare class Heights {
68
68
  * one of them back at the estimate at the moment the reader is looking at them.
69
69
  */
70
70
  shift(by: number): void;
71
+ /**
72
+ * Adds `by` to every height that has been seen, for a gap that changed.
73
+ *
74
+ * Each item counts the gap after it as part of its own height, so a gap that
75
+ * grows by twelve pixels grows every measured item by twelve, the ones no
76
+ * longer drawn included. The unmeasured ones follow the estimate, which
77
+ * carries the gap already.
78
+ */
79
+ pad(by: number): void;
71
80
  /**
72
81
  * Drops everything, for a set that is no longer the same set.
73
82
  *
@@ -70,6 +70,16 @@ export class Heights {
70
70
  this.dirty = 0;
71
71
  this.changes += 1;
72
72
  }
73
+ pad(by) {
74
+ if (by === 0 || this.seen.size === 0) {
75
+ return;
76
+ }
77
+ for (const [index, size] of this.seen) {
78
+ this.seen.set(index, Math.max(1, Math.round((size + by) * 64) / 64));
79
+ }
80
+ this.dirty = 0;
81
+ this.changes += 1;
82
+ }
73
83
  forget() {
74
84
  this.seen.clear();
75
85
  this.dirty = 0;
@@ -172,12 +172,18 @@ export declare class VirtualizeController implements ReactiveController {
172
172
  /** Room `shift` added above the window, owed to the scroll offset once drawn. */
173
173
  private owed;
174
174
  /**
175
- * The drawn rows' height on the straight line, read once per estimate.
175
+ * The drawn rows' own height on the straight line, read once per estimate,
176
+ * and without the gap, which `line` adds as it is now.
176
177
  *
177
178
  * Undefined until a host that offers `rows` has drawn some on the uniform
178
179
  * path, and again after `forget`.
179
180
  */
180
181
  private sample;
182
+ /**
183
+ * The gap the heights and the line were last squared with, which `line`
184
+ * reads, so the gap the host has now is taken up in `respace` alone.
185
+ */
186
+ private spaced;
181
187
  /** The length of the set when `endInSight` last answered true. */
182
188
  private askedAt;
183
189
  /**
@@ -317,6 +323,24 @@ export declare class VirtualizeController implements ReactiveController {
317
323
  * Reading the drawn rows once corrects the slope, and it is still a line.
318
324
  */
319
325
  private line;
326
+ /** How tall one item's own row is on the straight line, without the gap. */
327
+ private row;
328
+ /**
329
+ * Moves everything to a gap that changed, and keeps the reader on the item
330
+ * they were on.
331
+ *
332
+ * **Each item counts the gap after it as part of its own height**, so a gap
333
+ * that changes changes every item. The straight line reads the gap as it is
334
+ * now, and every height measured with the old one moves by the difference,
335
+ * drawn or not. Left alone, both kept the old gap while the rows drawn
336
+ * between the spacers took the new one, so the set grew or shrank as the
337
+ * window did: in WebKit, End on 1,000 rows whose gap went from 0 to 12 left
338
+ * the last row 72 pixels below the box once the window lost six rows.
339
+ *
340
+ * The reader's place is owed to the scroll offset and written after the
341
+ * render, as `shift` does, because a gap that grows has no room for it yet.
342
+ */
343
+ private respace;
320
344
  /** The space the host draws between two items, which each item counts. */
321
345
  private gap;
322
346
  /**
@@ -154,6 +154,7 @@ export class VirtualizeController {
154
154
  this.watch();
155
155
  const box = this.options.container();
156
156
  const total = Math.max(0, this.options.count());
157
+ this.respace(box, total);
157
158
  const size = this.line();
158
159
  if (!box) {
159
160
  return;
@@ -196,8 +197,35 @@ export class VirtualizeController {
196
197
  return { after: Math.max(0, (total - last) * size), before: first * size, first, last };
197
198
  }
198
199
  line() {
200
+ return this.row() + (this.spaced ?? this.gap());
201
+ }
202
+ row() {
199
203
  const estimate = Math.max(1, this.options.estimate());
200
- return this.sample?.estimate === estimate ? this.sample.size : estimate + this.gap();
204
+ return this.sample?.estimate === estimate ? this.sample.size : estimate;
205
+ }
206
+ respace(box, total) {
207
+ const gap = this.gap();
208
+ const was = this.spaced;
209
+ if (was === undefined) {
210
+ this.spaced = gap;
211
+ return;
212
+ }
213
+ if (was === gap) {
214
+ return;
215
+ }
216
+ const top = box ? this.offset(box) : 0;
217
+ const anchor = this.measuring() ? (this.target ?? this.indexAt(top, total)) : 0;
218
+ const from = this.measuring() ? this.startOf(anchor, total) : this.line();
219
+ this.heights.pad(gap - was);
220
+ this.spaced = gap;
221
+ const moved = this.measuring()
222
+ ? this.startOf(anchor, total) - from
223
+ : (top / from) * this.line() - top;
224
+ this.settling = 0;
225
+ if (box && top > 0 && moved !== 0 && (this.options.anchor?.() ?? true)) {
226
+ this.owed += moved;
227
+ this.host.requestUpdate();
228
+ }
201
229
  }
202
230
  gap() {
203
231
  return Math.max(0, this.options.gap?.() ?? 0);
@@ -215,8 +243,11 @@ export class VirtualizeController {
215
243
  const uneven = Math.max(...seen) - Math.min(...seen) > 1;
216
244
  if (this.sample?.estimate !== estimate) {
217
245
  const was = this.line();
218
- const size = Math.max(1, seen.reduce((sum, height) => sum + height, 0) / seen.length) + this.gap();
219
- this.sample = { estimate, size };
246
+ this.sample = {
247
+ estimate,
248
+ size: Math.max(1, seen.reduce((sum, height) => sum + height, 0) / seen.length),
249
+ };
250
+ const size = this.line();
220
251
  if (Math.abs(size - was) >= 0.5) {
221
252
  const box = this.options.container();
222
253
  if (box && this.scrolled(box) > 0) {
@@ -337,6 +368,7 @@ export class VirtualizeController {
337
368
  this.settle();
338
369
  }
339
370
  settle() {
371
+ this.respace(this.options.container(), Math.max(0, this.options.count()));
340
372
  if (!this.measuring()) {
341
373
  this.sampleRows();
342
374
  return;
@@ -263,6 +263,109 @@ export interface SortDetail {
263
263
  */
264
264
  value: string;
265
265
  }
266
+ /** A hardware button Device Screen draws, named for what it does on the device. */
267
+ export type DeviceButton = 'back' | 'home' | 'power' | 'recents' | 'rotate-left' | 'rotate-right' | 'volume-down' | 'volume-up';
268
+ /** Detail carried by `helix-device-button`. */
269
+ export interface DeviceButtonDetail {
270
+ /** Which button was pressed. */
271
+ button: DeviceButton;
272
+ /**
273
+ * How long the button was held, in milliseconds. `0` for a press from a key
274
+ * or a script, which has no length.
275
+ */
276
+ duration: number;
277
+ }
278
+ /** Detail carried by `helix-device-key`. */
279
+ export interface DeviceKeyDetail {
280
+ /** Whether Alt, or Option on a Mac, was held. */
281
+ altKey: boolean;
282
+ /** The physical key, as `KeyboardEvent.code` names it: `KeyA`, `Enter`, `ArrowLeft`. */
283
+ code: string;
284
+ /** Whether Control was held. */
285
+ ctrlKey: boolean;
286
+ /** What the press produced, as `KeyboardEvent.key` names it: `a`, `A`, `Enter`. */
287
+ key: string;
288
+ /** Whether Command on a Mac, or the Windows key, was held. */
289
+ metaKey: boolean;
290
+ /** Whether the key went down or came up. */
291
+ phase: 'down' | 'up';
292
+ /** Whether the press is the key repeating while it is held. */
293
+ repeat: boolean;
294
+ /** Whether Shift was held. */
295
+ shiftKey: boolean;
296
+ }
297
+ /** Detail carried by `helix-device-scroll`. */
298
+ export interface DeviceScrollDetail {
299
+ /** How far across, in device units, in the wheel's sense: positive scrolls toward the right. */
300
+ deltaX: number;
301
+ /** How far down, in device units, in the wheel's sense: positive scrolls toward the bottom. */
302
+ deltaY: number;
303
+ /** The screen's height in the units the point is measured in. */
304
+ height: number;
305
+ /** The screen's width in the units the point is measured in. */
306
+ width: number;
307
+ /** Where the pointer is, across from the screen's left edge. */
308
+ x: number;
309
+ /** Where the pointer is, down from the screen's top edge. */
310
+ y: number;
311
+ }
312
+ /** Detail carried by `helix-device-swipe`. */
313
+ export interface DeviceSwipeDetail {
314
+ /** How long the finger was down, in milliseconds. */
315
+ duration: number;
316
+ /** Where the touch began, across from the screen's left edge. */
317
+ fromX: number;
318
+ /** Where the touch began, down from the screen's top edge. */
319
+ fromY: number;
320
+ /** The screen's height in the units the points are measured in. */
321
+ height: number;
322
+ /** Where the touch ended, across from the screen's left edge. */
323
+ toX: number;
324
+ /** Where the touch ended, down from the screen's top edge. */
325
+ toY: number;
326
+ /** The screen's width in the units the points are measured in. */
327
+ width: number;
328
+ }
329
+ /** Detail carried by `helix-device-tap`. */
330
+ export interface DeviceTapDetail {
331
+ /** How long the finger was down, in milliseconds. A long press is a long tap. */
332
+ duration: number;
333
+ /** The screen's height in the units the point is measured in. */
334
+ height: number;
335
+ /** The screen's width in the units the point is measured in. */
336
+ width: number;
337
+ /** Where the tap was, across from the screen's left edge. */
338
+ x: number;
339
+ /** Where the tap was, down from the screen's top edge. */
340
+ y: number;
341
+ }
342
+ /** Detail carried by `helix-device-text`. */
343
+ export interface DeviceTextDetail {
344
+ /** The text, as plain text. */
345
+ text: string;
346
+ }
347
+ /** Detail carried by `helix-device-touch`. */
348
+ export interface DeviceTouchDetail {
349
+ /** The screen's height in the units the point is measured in. */
350
+ height: number;
351
+ /**
352
+ * Which finger, counting from `0`. A finger keeps its number until it lifts,
353
+ * and the lowest free number goes to the next finger down.
354
+ */
355
+ id: number;
356
+ /**
357
+ * Where the touch is in its life: `down` as the finger lands, `move` as it
358
+ * moves, `up` as it lifts, and `cancel` when the browser takes the touch
359
+ * away, which ends it without a lift.
360
+ */
361
+ phase: 'cancel' | 'down' | 'move' | 'up';
362
+ /** The screen's width in the units the point is measured in. */
363
+ width: number;
364
+ /** Where the finger is, across from the screen's left edge. */
365
+ x: number;
366
+ /** Where the finger is, down from the screen's top edge. */
367
+ y: number;
368
+ }
266
369
  /** Detail carried by `helix-dismiss`. */
267
370
  export interface DismissDetail {
268
371
  /** Text content of the element asking to go, for identifying which it was. */
@@ -0,0 +1,14 @@
1
+ import type { DeviceButtonDetail } from './details.js';
2
+ /**
3
+ * A hardware button on the device was pressed, from Device Screen's controls
4
+ * or from `press()`. Press it on the device in response.
5
+ *
6
+ * **Sent once, as the button comes back up, with how long it was held.** A
7
+ * source that presses a button for a length of time, such as holding the side
8
+ * button for Siri, reads `duration`, and one that only presses reads nothing
9
+ * else. Not cancelable: nothing in Helix acts on the press.
10
+ */
11
+ export declare class HelixDeviceButtonEvent extends CustomEvent<DeviceButtonDetail> {
12
+ static readonly eventName = "helix-device-button";
13
+ constructor(detail: DeviceButtonDetail);
14
+ }
@@ -0,0 +1,11 @@
1
+ export class HelixDeviceButtonEvent extends CustomEvent {
2
+ static { this.eventName = 'helix-device-button'; }
3
+ constructor(detail) {
4
+ super(HelixDeviceButtonEvent.eventName, {
5
+ bubbles: true,
6
+ cancelable: false,
7
+ composed: true,
8
+ detail,
9
+ });
10
+ }
11
+ }
@@ -0,0 +1,16 @@
1
+ import type { DeviceKeyDetail } from './details.js';
2
+ /**
3
+ * A key went down or came up while Device Screen had focus. Press or release
4
+ * it on the device in response.
5
+ *
6
+ * **Every key is sent twice, down and up, as a hardware keyboard sends it.**
7
+ * The device's own input method turns the presses into text, so a language
8
+ * that composes characters composes them on the device. `code` names the
9
+ * physical key, for a source that injects key codes, and `key` names what the
10
+ * press produced, for a source that types text. Not cancelable: the frame has
11
+ * already kept the press from the page.
12
+ */
13
+ export declare class HelixDeviceKeyEvent extends CustomEvent<DeviceKeyDetail> {
14
+ static readonly eventName = "helix-device-key";
15
+ constructor(detail: DeviceKeyDetail);
16
+ }
@@ -0,0 +1,11 @@
1
+ export class HelixDeviceKeyEvent extends CustomEvent {
2
+ static { this.eventName = 'helix-device-key'; }
3
+ constructor(detail) {
4
+ super(HelixDeviceKeyEvent.eventName, {
5
+ bubbles: true,
6
+ cancelable: false,
7
+ composed: true,
8
+ detail,
9
+ });
10
+ }
11
+ }
@@ -0,0 +1,13 @@
1
+ /**
2
+ * A screenshot of the device was asked for, from Device Screen's screenshot
3
+ * button or from `screenshot()`. Take one in response.
4
+ *
5
+ * **A request with nothing attached.** The device's own screenshot is sharper
6
+ * than any frame of a stream, so the page takes it the way its source allows.
7
+ * `capture()` on the frame returns the picture on screen, for a page with no
8
+ * better way. Not cancelable: nothing in Helix takes the screenshot.
9
+ */
10
+ export declare class HelixDeviceScreenshotEvent extends Event {
11
+ static readonly eventName = "helix-device-screenshot";
12
+ constructor();
13
+ }
@@ -0,0 +1,10 @@
1
+ export class HelixDeviceScreenshotEvent extends Event {
2
+ static { this.eventName = 'helix-device-screenshot'; }
3
+ constructor() {
4
+ super(HelixDeviceScreenshotEvent.eventName, {
5
+ bubbles: true,
6
+ cancelable: false,
7
+ composed: true,
8
+ });
9
+ }
10
+ }
@@ -0,0 +1,14 @@
1
+ import type { DeviceScrollDetail } from './details.js';
2
+ /**
3
+ * A wheel or a trackpad scrolled over Device Screen. Scroll the device in
4
+ * response.
5
+ *
6
+ * The distance is in device units and keeps the wheel's sense, so a positive
7
+ * `deltaY` asks for what is further down. A source that scrolls by swiping
8
+ * moves a finger the other way. Not cancelable: the frame has already kept the
9
+ * scroll from the page.
10
+ */
11
+ export declare class HelixDeviceScrollEvent extends CustomEvent<DeviceScrollDetail> {
12
+ static readonly eventName = "helix-device-scroll";
13
+ constructor(detail: DeviceScrollDetail);
14
+ }
@@ -0,0 +1,11 @@
1
+ export class HelixDeviceScrollEvent extends CustomEvent {
2
+ static { this.eventName = 'helix-device-scroll'; }
3
+ constructor(detail) {
4
+ super(HelixDeviceScrollEvent.eventName, {
5
+ bubbles: true,
6
+ cancelable: false,
7
+ composed: true,
8
+ detail,
9
+ });
10
+ }
11
+ }
@@ -0,0 +1,15 @@
1
+ import type { DeviceSwipeDetail } from './details.js';
2
+ /**
3
+ * One finger moved across Device Screen and lifted. Swipe the device in
4
+ * response.
5
+ *
6
+ * **For a source that takes whole gestures**, such as a command that swipes
7
+ * from one point to another over a length of time. A source that takes each
8
+ * touch as it happens listens for `helix-device-touch` instead, and a page
9
+ * that listened for both would move the device twice. A touch with more than
10
+ * one finger sends no swipe. Not cancelable: nothing in Helix acts on it.
11
+ */
12
+ export declare class HelixDeviceSwipeEvent extends CustomEvent<DeviceSwipeDetail> {
13
+ static readonly eventName = "helix-device-swipe";
14
+ constructor(detail: DeviceSwipeDetail);
15
+ }
@@ -0,0 +1,11 @@
1
+ export class HelixDeviceSwipeEvent extends CustomEvent {
2
+ static { this.eventName = 'helix-device-swipe'; }
3
+ constructor(detail) {
4
+ super(HelixDeviceSwipeEvent.eventName, {
5
+ bubbles: true,
6
+ cancelable: false,
7
+ composed: true,
8
+ detail,
9
+ });
10
+ }
11
+ }
@@ -0,0 +1,13 @@
1
+ import type { DeviceTapDetail } from './details.js';
2
+ /**
3
+ * One finger touched Device Screen and lifted near where it landed. Tap the
4
+ * device in response.
5
+ *
6
+ * **For a source that takes whole gestures**, as `helix-device-swipe` is. A
7
+ * long press is a tap with a long `duration`, which a source holds for that
8
+ * long. Not cancelable: nothing in Helix acts on it.
9
+ */
10
+ export declare class HelixDeviceTapEvent extends CustomEvent<DeviceTapDetail> {
11
+ static readonly eventName = "helix-device-tap";
12
+ constructor(detail: DeviceTapDetail);
13
+ }
@@ -0,0 +1,11 @@
1
+ export class HelixDeviceTapEvent extends CustomEvent {
2
+ static { this.eventName = 'helix-device-tap'; }
3
+ constructor(detail) {
4
+ super(HelixDeviceTapEvent.eventName, {
5
+ bubbles: true,
6
+ cancelable: false,
7
+ composed: true,
8
+ detail,
9
+ });
10
+ }
11
+ }
@@ -0,0 +1,13 @@
1
+ import type { DeviceTextDetail } from './details.js';
2
+ /**
3
+ * Text was pasted into Device Screen. Type it on the device in response.
4
+ *
5
+ * **Pasted text has no key presses of its own**, so it arrives whole, in one
6
+ * event. Command or Control with V pastes in every mode, `forward-shortcuts`
7
+ * included. Not cancelable: the frame has
8
+ * already kept the paste from the page.
9
+ */
10
+ export declare class HelixDeviceTextEvent extends CustomEvent<DeviceTextDetail> {
11
+ static readonly eventName = "helix-device-text";
12
+ constructor(detail: DeviceTextDetail);
13
+ }
@@ -0,0 +1,11 @@
1
+ export class HelixDeviceTextEvent extends CustomEvent {
2
+ static { this.eventName = 'helix-device-text'; }
3
+ constructor(detail) {
4
+ super(HelixDeviceTextEvent.eventName, {
5
+ bubbles: true,
6
+ cancelable: false,
7
+ composed: true,
8
+ detail,
9
+ });
10
+ }
11
+ }
@@ -0,0 +1,15 @@
1
+ import type { DeviceTouchDetail } from './details.js';
2
+ /**
3
+ * A finger landed on Device Screen, moved, lifted, or was taken away. Touch
4
+ * the device in response.
5
+ *
6
+ * **For a source that takes each touch as it happens**, which is what a drag,
7
+ * a long press that turns into a drag, and a pinch need. One event per finger
8
+ * per step, so a pinch sends two at a time with different `id`s. A source that
9
+ * only taps and swipes listens for `helix-device-tap` and `helix-device-swipe`
10
+ * instead. Not cancelable: nothing in Helix acts on it.
11
+ */
12
+ export declare class HelixDeviceTouchEvent extends CustomEvent<DeviceTouchDetail> {
13
+ static readonly eventName = "helix-device-touch";
14
+ constructor(detail: DeviceTouchDetail);
15
+ }
@@ -0,0 +1,11 @@
1
+ export class HelixDeviceTouchEvent extends CustomEvent {
2
+ static { this.eventName = 'helix-device-touch'; }
3
+ constructor(detail) {
4
+ super(HelixDeviceTouchEvent.eventName, {
5
+ bubbles: true,
6
+ cancelable: false,
7
+ composed: true,
8
+ detail,
9
+ });
10
+ }
11
+ }
@@ -61,6 +61,14 @@ import { HelixConsoleEvent } from './console.js';
61
61
  import { HelixCopyEvent } from './copy.js';
62
62
  import { HelixCopyErrorEvent } from './copy-error.js';
63
63
  import { HelixCreateEvent } from './create.js';
64
+ import { HelixDeviceButtonEvent } from './device-button.js';
65
+ import { HelixDeviceKeyEvent } from './device-key.js';
66
+ import { HelixDeviceScreenshotEvent } from './device-screenshot.js';
67
+ import { HelixDeviceScrollEvent } from './device-scroll.js';
68
+ import { HelixDeviceSwipeEvent } from './device-swipe.js';
69
+ import { HelixDeviceTapEvent } from './device-tap.js';
70
+ import { HelixDeviceTextEvent } from './device-text.js';
71
+ import { HelixDeviceTouchEvent } from './device-touch.js';
64
72
  import { HelixDismissEvent } from './dismiss.js';
65
73
  import { HelixEditEvent } from './edit.js';
66
74
  import { HelixEndEvent } from './end.js';
@@ -129,9 +137,9 @@ import { HelixToggleEvent } from './toggle.js';
129
137
  import { HelixTourAskEvent } from './tour-ask.js';
130
138
  import { HelixTourStatusEvent } from './tour-status.js';
131
139
  import { HelixTypingEvent } from './typing.js';
132
- export type { ActivateDetail, AuraFallbackDetail, BandDetail, CanvasView, CaretDetail, ChangeDetail, CompleteDetail, ConnectDetail, ConsoleDetail, CopyDetail, CreateDetail, 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';
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';
133
141
  export { helixEventNames } from './names.js';
134
- 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, 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, };
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, };
135
143
  /**
136
144
  * Every event class, and the one place a new one is registered: a class in a
137
145
  * module of its own, imported above, and named here and in `names.ts`.
@@ -178,6 +186,14 @@ declare const registry: {
178
186
  readonly HelixCopyErrorEvent: typeof HelixCopyErrorEvent;
179
187
  readonly HelixCopyEvent: typeof HelixCopyEvent;
180
188
  readonly HelixCreateEvent: typeof HelixCreateEvent;
189
+ readonly HelixDeviceButtonEvent: typeof HelixDeviceButtonEvent;
190
+ readonly HelixDeviceKeyEvent: typeof HelixDeviceKeyEvent;
191
+ readonly HelixDeviceScreenshotEvent: typeof HelixDeviceScreenshotEvent;
192
+ readonly HelixDeviceScrollEvent: typeof HelixDeviceScrollEvent;
193
+ readonly HelixDeviceSwipeEvent: typeof HelixDeviceSwipeEvent;
194
+ readonly HelixDeviceTapEvent: typeof HelixDeviceTapEvent;
195
+ readonly HelixDeviceTextEvent: typeof HelixDeviceTextEvent;
196
+ readonly HelixDeviceTouchEvent: typeof HelixDeviceTouchEvent;
181
197
  readonly HelixDismissEvent: typeof HelixDismissEvent;
182
198
  readonly HelixEditEvent: typeof HelixEditEvent;
183
199
  readonly HelixEndEvent: typeof HelixEndEvent;
@@ -31,6 +31,14 @@ import { HelixConsoleEvent } from './console.js';
31
31
  import { HelixCopyEvent } from './copy.js';
32
32
  import { HelixCopyErrorEvent } from './copy-error.js';
33
33
  import { HelixCreateEvent } from './create.js';
34
+ import { HelixDeviceButtonEvent } from './device-button.js';
35
+ import { HelixDeviceKeyEvent } from './device-key.js';
36
+ import { HelixDeviceScreenshotEvent } from './device-screenshot.js';
37
+ import { HelixDeviceScrollEvent } from './device-scroll.js';
38
+ import { HelixDeviceSwipeEvent } from './device-swipe.js';
39
+ import { HelixDeviceTapEvent } from './device-tap.js';
40
+ import { HelixDeviceTextEvent } from './device-text.js';
41
+ import { HelixDeviceTouchEvent } from './device-touch.js';
34
42
  import { HelixDismissEvent } from './dismiss.js';
35
43
  import { HelixEditEvent } from './edit.js';
36
44
  import { HelixEndEvent } from './end.js';
@@ -100,7 +108,7 @@ import { HelixTourAskEvent } from './tour-ask.js';
100
108
  import { HelixTourStatusEvent } from './tour-status.js';
101
109
  import { HelixTypingEvent } from './typing.js';
102
110
  export { helixEventNames } from './names.js';
103
- 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, 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, };
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, };
104
112
  const registry = {
105
113
  HelixActionEvent,
106
114
  HelixActivateEvent,
@@ -135,6 +143,14 @@ const registry = {
135
143
  HelixCopyErrorEvent,
136
144
  HelixCopyEvent,
137
145
  HelixCreateEvent,
146
+ HelixDeviceButtonEvent,
147
+ HelixDeviceKeyEvent,
148
+ HelixDeviceScreenshotEvent,
149
+ HelixDeviceScrollEvent,
150
+ HelixDeviceSwipeEvent,
151
+ HelixDeviceTapEvent,
152
+ HelixDeviceTextEvent,
153
+ HelixDeviceTouchEvent,
138
154
  HelixDismissEvent,
139
155
  HelixEditEvent,
140
156
  HelixEndEvent,
@@ -2,7 +2,8 @@ export const helixEventNames = new Set(('action activate aura-fallback band befo
2
2
  'before-collapse before-edit 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
- 'connect console copy copy-error create dismiss edit end expand facet filter ' +
5
+ 'connect console copy copy-error create device-button device-key device-screenshot ' +
6
+ 'device-scroll device-swipe device-tap device-text device-touch dismiss edit end expand facet filter ' +
6
7
  'filtered graph-filter graph-layout graph-pan graph-part-change graph-ready ' +
7
8
  'graph-signal graph-zoom history load load-more map-cluster map-pan map-part-change ' +
8
9
  'map-ready map-rotate map-tilt map-zoom move navigate next panel-resize pasted pin plot-change ' +
@@ -280,8 +280,8 @@ export declare class HelixElement extends LitElement {
280
280
  protected relayNativeEvent(event: Event, init?: EventInit): void;
281
281
  /**
282
282
  * The rules from `mark-rules.ts` for the marks this element writes in its
283
- * own shadow root: `data-scroller`, `data-virtual`, `data-spoken` and
284
- * `data-mirror`.
283
+ * own shadow root: `data-scroller`, `data-virtual`, `data-spoken`,
284
+ * `data-mirror` and `data-touches`.
285
285
  *
286
286
  * A component that writes a mark names its rule here, and a subclass
287
287
  * inherits the list. One that writes none takes only the three rules every
@@ -117,3 +117,17 @@ export declare const SPOKEN_RULE = "[data-spoken]{position:absolute;inline-size:
117
117
  * whatever the script, and so is a picture of a key.
118
118
  */
119
119
  export declare const MIRROR_RULE = ":host(:dir(rtl)) [data-mirror]{scale:-1 1}";
120
+ /**
121
+ * Hands every touch on an element to the component, which reads each one as
122
+ * input of its own.
123
+ *
124
+ * **Without it a one-finger drag is the page's.** The browser scrolls or zooms
125
+ * and sends the component `pointercancel`, so it never sees the finger move or
126
+ * lift. Device Screen turns touches into touches on a device and has that
127
+ * behavior only while `touch-action` is `none`, which makes the rule a
128
+ * mechanism, as the scroller's `overflow` is.
129
+ *
130
+ * Marked only while the component takes touches, so a read-only Device Screen
131
+ * leaves the page its scroll.
132
+ */
133
+ export declare const TOUCHES_RULE = "[data-touches]{touch-action:none}";
@@ -2,3 +2,4 @@ export const SCROLLER_RULE = '[data-scroller]{overflow:auto}';
2
2
  export const VIRTUAL_RULE = '[data-virtual]{overflow-anchor:none}';
3
3
  export const SPOKEN_RULE = '[data-spoken]{position:absolute;inline-size:1px;block-size:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}';
4
4
  export const MIRROR_RULE = ':host(:dir(rtl)) [data-mirror]{scale:-1 1}';
5
+ export const TOUCHES_RULE = '[data-touches]{touch-action:none}';