@fusion.dev/helix-headless 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.
package/types/jsx.d.ts CHANGED
@@ -26,6 +26,14 @@ import type {
26
26
  HelixCopyErrorEvent,
27
27
  HelixCopyEvent,
28
28
  HelixCreateEvent,
29
+ HelixDeviceButtonEvent,
30
+ HelixDeviceKeyEvent,
31
+ HelixDeviceScreenshotEvent,
32
+ HelixDeviceScrollEvent,
33
+ HelixDeviceSwipeEvent,
34
+ HelixDeviceTapEvent,
35
+ HelixDeviceTextEvent,
36
+ HelixDeviceTouchEvent,
29
37
  HelixDismissEvent,
30
38
  HelixEndEvent,
31
39
  HelixExpandEvent,
@@ -76,6 +84,7 @@ import type {
76
84
  HelixHeadlessDatePicker,
77
85
  HelixHeadlessDescriptionList,
78
86
  HelixHeadlessDescriptionListItem,
87
+ HelixHeadlessDeviceScreen,
79
88
  HelixHeadlessDialog,
80
89
  HelixHeadlessDivider,
81
90
  HelixHeadlessDonutChart,
@@ -12276,6 +12285,380 @@ makes the list a named group. */
12276
12285
  textContent?: (string | number) | undefined;
12277
12286
  };
12278
12287
 
12288
+ /** `HelixHeadlessDeviceScreen` component event */
12289
+ export type HelixHeadlessDeviceScreenElementEvent<E = Event> = TypedEvent<
12290
+ HelixHeadlessDeviceScreen,
12291
+ E
12292
+ >;
12293
+ /** `helix-device-button` event type */
12294
+ export type HelixHeadlessDeviceScreenHelixDeviceButtonElementEvent =
12295
+ HelixHeadlessDeviceScreenElementEvent<HelixDeviceButtonEvent>;
12296
+ /** `helix-device-key` event type */
12297
+ export type HelixHeadlessDeviceScreenHelixDeviceKeyElementEvent =
12298
+ HelixHeadlessDeviceScreenElementEvent<HelixDeviceKeyEvent>;
12299
+ /** `helix-device-screenshot` event type */
12300
+ export type HelixHeadlessDeviceScreenHelixDeviceScreenshotElementEvent =
12301
+ HelixHeadlessDeviceScreenElementEvent<HelixDeviceScreenshotEvent>;
12302
+ /** `helix-device-scroll` event type */
12303
+ export type HelixHeadlessDeviceScreenHelixDeviceScrollElementEvent =
12304
+ HelixHeadlessDeviceScreenElementEvent<HelixDeviceScrollEvent>;
12305
+ /** `helix-device-swipe` event type */
12306
+ export type HelixHeadlessDeviceScreenHelixDeviceSwipeElementEvent =
12307
+ HelixHeadlessDeviceScreenElementEvent<HelixDeviceSwipeEvent>;
12308
+ /** `helix-device-tap` event type */
12309
+ export type HelixHeadlessDeviceScreenHelixDeviceTapElementEvent =
12310
+ HelixHeadlessDeviceScreenElementEvent<HelixDeviceTapEvent>;
12311
+ /** `helix-device-text` event type */
12312
+ export type HelixHeadlessDeviceScreenHelixDeviceTextElementEvent =
12313
+ HelixHeadlessDeviceScreenElementEvent<HelixDeviceTextEvent>;
12314
+ /** `helix-device-touch` event type */
12315
+ export type HelixHeadlessDeviceScreenHelixDeviceTouchElementEvent =
12316
+ HelixHeadlessDeviceScreenElementEvent<HelixDeviceTouchEvent>;
12317
+
12318
+ export type HelixHeadlessDeviceScreenProps = {
12319
+ /** The Back button's label. */
12320
+ "back-label"?: (HelixHeadlessDeviceScreen["backLabel"]) | undefined;
12321
+ /** The Back button's label. */
12322
+ backLabel?: (HelixHeadlessDeviceScreen["backLabel"]) | undefined;
12323
+ /** Which hardware buttons to draw, as a list: `back`, `home`, `recents`,
12324
+ `power`, `volume`, `rotate`, `screenshot`, and `fullscreen`, or `none`.
12325
+ They are drawn in that order whatever order the list is in. Absent is
12326
+ `home screenshot`. `volume` draws Volume up and Volume down, and `rotate`
12327
+ draws Rotate left and Rotate right. */
12328
+ controls?: (HelixHeadlessDeviceScreen["controls"]) | undefined;
12329
+ /** The name of the toolbar of hardware buttons, read by screen readers. */
12330
+ "controls-label"?: (HelixHeadlessDeviceScreen["controlsLabel"]) | undefined;
12331
+ /** The name of the toolbar of hardware buttons, read by screen readers. */
12332
+ controlsLabel?: (HelixHeadlessDeviceScreen["controlsLabel"]) | undefined;
12333
+ /** Which side of the device the hardware buttons sit on. Absent and `top`
12334
+ are a row above it, `bottom` is a row below it, and `start` and `end` are
12335
+ a column beside it, as the Android Emulator draws its toolbar. The words
12336
+ are sides, as Carousel's are, and not the corners a map's controls take. */
12337
+ "controls-placement"?: (HelixHeadlessDeviceScreen["controlsPlacement"]) | undefined;
12338
+ /** Which side of the device the hardware buttons sit on. Absent and `top`
12339
+ are a row above it, `bottom` is a row below it, and `start` and `end` are
12340
+ a column beside it, as the Android Emulator draws its toolbar. The words
12341
+ are sides, as Carousel's are, and not the corners a map's controls take. */
12342
+ controlsPlacement?: (HelixHeadlessDeviceScreen["controlsPlacement"]) | undefined;
12343
+ /** The screen's name where `label` is empty and the host has no `aria-label`. */
12344
+ "fallback-label"?: (HelixHeadlessDeviceScreen["fallbackLabel"]) | undefined;
12345
+ /** The screen's name where `label` is empty and the host has no `aria-label`. */
12346
+ fallbackLabel?: (HelixHeadlessDeviceScreen["fallbackLabel"]) | undefined;
12347
+ /** Also sends key presses with Control, Command, or Alt held, which are left
12348
+ to the browser otherwise. For an app that owns its window. Command or
12349
+ Control with V pastes either way. */
12350
+ "forward-shortcuts"?: (HelixHeadlessDeviceScreen["forwardShortcuts"]) | undefined;
12351
+ /** Also sends key presses with Control, Command, or Alt held, which are left
12352
+ to the browser otherwise. For an app that owns its window. Command or
12353
+ Control with V pastes either way. */
12354
+ forwardShortcuts?: (HelixHeadlessDeviceScreen["forwardShortcuts"]) | undefined;
12355
+ /** The fullscreen button's label. */
12356
+ "fullscreen-label"?: (HelixHeadlessDeviceScreen["fullscreenLabel"]) | undefined;
12357
+ /** The fullscreen button's label. */
12358
+ fullscreenLabel?: (HelixHeadlessDeviceScreen["fullscreenLabel"]) | undefined;
12359
+ /** The Home button's label. */
12360
+ "home-label"?: (HelixHeadlessDeviceScreen["homeLabel"]) | undefined;
12361
+ /** The Home button's label. */
12362
+ homeLabel?: (HelixHeadlessDeviceScreen["homeLabel"]) | undefined;
12363
+ /** What a screen reader says about the keys when it reaches the screen,
12364
+ after its name. */
12365
+ "keys-hint-label"?: (HelixHeadlessDeviceScreen["keysHintLabel"]) | undefined;
12366
+ /** What a screen reader says about the keys when it reaches the screen,
12367
+ after its name. */
12368
+ keysHintLabel?: (HelixHeadlessDeviceScreen["keysHintLabel"]) | undefined;
12369
+ /** The device's name, read by screen readers as the screen's name, such as
12370
+ "iPhone 17 Pro". Name each device on a page with several. Required. */
12371
+ label?: (HelixHeadlessDeviceScreen["label"]) | undefined;
12372
+ /** Shows the `loading` slot over the screen, for a stream that is starting
12373
+ or has stopped. Screen readers hear `loading-label`. */
12374
+ loading?: (HelixHeadlessDeviceScreen["loading"]) | undefined;
12375
+ /** What the screen shows and screen readers hear while `loading` is set and nothing is in the `loading` slot. */
12376
+ "loading-label"?: (HelixHeadlessDeviceScreen["loadingLabel"]) | undefined;
12377
+ /** What the screen shows and screen readers hear while `loading` is set and nothing is in the `loading` slot. */
12378
+ loadingLabel?: (HelixHeadlessDeviceScreen["loadingLabel"]) | undefined;
12379
+ /** The Power button's label. */
12380
+ "power-label"?: (HelixHeadlessDeviceScreen["powerLabel"]) | undefined;
12381
+ /** The Power button's label. */
12382
+ powerLabel?: (HelixHeadlessDeviceScreen["powerLabel"]) | undefined;
12383
+ /** Shows the screen and sends nothing: no touches, scrolls, keys, or button
12384
+ presses. The screen is then a picture, out of the tab order, and the
12385
+ hardware buttons are off but for screenshot and fullscreen. Buttons of
12386
+ your own in the `controls` slot are yours to turn off. */
12387
+ readonly?: (HelixHeadlessDeviceScreen["readonly"]) | undefined;
12388
+ /** The Recent apps button's label. */
12389
+ "recents-label"?: (HelixHeadlessDeviceScreen["recentsLabel"]) | undefined;
12390
+ /** The Recent apps button's label. */
12391
+ recentsLabel?: (HelixHeadlessDeviceScreen["recentsLabel"]) | undefined;
12392
+ /** What a screen reader calls the screen in place of its role, after its
12393
+ name: "iPhone 17 Pro, screen". Empty leaves the role. */
12394
+ "role-label"?: (HelixHeadlessDeviceScreen["roleLabel"]) | undefined;
12395
+ /** What a screen reader calls the screen in place of its role, after its
12396
+ name: "iPhone 17 Pro, screen". Empty leaves the role. */
12397
+ roleLabel?: (HelixHeadlessDeviceScreen["roleLabel"]) | undefined;
12398
+ /** The Rotate left button's label. */
12399
+ "rotate-left-label"?: (HelixHeadlessDeviceScreen["rotateLeftLabel"]) | undefined;
12400
+ /** The Rotate left button's label. */
12401
+ rotateLeftLabel?: (HelixHeadlessDeviceScreen["rotateLeftLabel"]) | undefined;
12402
+ /** The Rotate right button's label. */
12403
+ "rotate-right-label"?: (HelixHeadlessDeviceScreen["rotateRightLabel"]) | undefined;
12404
+ /** The Rotate right button's label. */
12405
+ rotateRightLabel?: (HelixHeadlessDeviceScreen["rotateRightLabel"]) | undefined;
12406
+ /** How far to turn the picture clockwise, in degrees: `90`, `180`, or `270`.
12407
+ For a source that sends frames in the device's natural orientation while
12408
+ the device is turned. Every point is turned back, so events stay in the
12409
+ device's own orientation. A source whose frames turn with the device
12410
+ needs none. */
12411
+ rotation?: (HelixHeadlessDeviceScreen["rotation"]) | undefined;
12412
+ /** The screen's height in the units your device takes input in: points for
12413
+ the iOS Simulator, pixels for an Android device. Set with `screen-width`.
12414
+ Set alone, the width follows the stream's shape, and with neither, both
12415
+ are the stream's own size in pixels. */
12416
+ "screen-height"?: (HelixHeadlessDeviceScreen["screenHeight"] | `${number}`) | undefined;
12417
+ /** The screen's height in the units your device takes input in: points for
12418
+ the iOS Simulator, pixels for an Android device. Set with `screen-width`.
12419
+ Set alone, the width follows the stream's shape, and with neither, both
12420
+ are the stream's own size in pixels. */
12421
+ screenHeight?: (HelixHeadlessDeviceScreen["screenHeight"]) | undefined;
12422
+ /** The screenshot button's label. */
12423
+ "screenshot-label"?: (HelixHeadlessDeviceScreen["screenshotLabel"]) | undefined;
12424
+ /** The screenshot button's label. */
12425
+ screenshotLabel?: (HelixHeadlessDeviceScreen["screenshotLabel"]) | undefined;
12426
+ /** The screen's width in the units your device takes input in, as
12427
+ `screen-height` is. Set alone, the height follows the stream's shape. */
12428
+ "screen-width"?: (HelixHeadlessDeviceScreen["screenWidth"] | `${number}`) | undefined;
12429
+ /** The screen's width in the units your device takes input in, as
12430
+ `screen-height` is. Set alone, the height follows the stream's shape. */
12431
+ screenWidth?: (HelixHeadlessDeviceScreen["screenWidth"]) | undefined;
12432
+ /** The screen's outline. Absent is a rectangle with rounded corners;
12433
+ `square` has square corners, as on a phone with a Home button or a
12434
+ television, and `circle` is round, as on a round watch, and takes
12435
+ touches inside the circle only. */
12436
+ shape?: (HelixHeadlessDeviceScreen["shape"]) | undefined;
12437
+ /** Draws a ring under each finger on the screen, as the iOS Simulator's
12438
+ Show single touches does. Rings from `showTap()` and `showSwipe()` are
12439
+ drawn either way. */
12440
+ "show-touches"?: (HelixHeadlessDeviceScreen["showTouches"]) | undefined;
12441
+ /** Draws a ring under each finger on the screen, as the iOS Simulator's
12442
+ Show single touches does. Rings from `showTap()` and `showSwipe()` are
12443
+ drawn either way. */
12444
+ showTouches?: (HelixHeadlessDeviceScreen["showTouches"]) | undefined;
12445
+ /** The Volume down button's label. */
12446
+ "volume-down-label"?: (HelixHeadlessDeviceScreen["volumeDownLabel"]) | undefined;
12447
+ /** The Volume down button's label. */
12448
+ volumeDownLabel?: (HelixHeadlessDeviceScreen["volumeDownLabel"]) | undefined;
12449
+ /** The Volume up button's label. */
12450
+ "volume-up-label"?: (HelixHeadlessDeviceScreen["volumeUpLabel"]) | undefined;
12451
+ /** The Volume up button's label. */
12452
+ volumeUpLabel?: (HelixHeadlessDeviceScreen["volumeUpLabel"]) | undefined;
12453
+
12454
+ /** A hardware button was pressed, with how long it was held. Press it on the device in response. */
12455
+ "onhelix-device-button"?: ((
12456
+ e: HelixHeadlessDeviceScreenHelixDeviceButtonElementEvent,
12457
+ ) => void) | undefined;
12458
+ /** A key went down or came up while the screen had focus. Press or release it on the device in response. */
12459
+ "onhelix-device-key"?: ((
12460
+ e: HelixHeadlessDeviceScreenHelixDeviceKeyElementEvent,
12461
+ ) => void) | undefined;
12462
+ /** A screenshot was asked for. Take one in response. */
12463
+ "onhelix-device-screenshot"?: ((
12464
+ e: HelixHeadlessDeviceScreenHelixDeviceScreenshotElementEvent,
12465
+ ) => void) | undefined;
12466
+ /** A wheel or a trackpad scrolled over the screen. Scroll the device in response. */
12467
+ "onhelix-device-scroll"?: ((
12468
+ e: HelixHeadlessDeviceScreenHelixDeviceScrollElementEvent,
12469
+ ) => void) | undefined;
12470
+ /** One finger moved across the screen and lifted. Swipe the device in response. */
12471
+ "onhelix-device-swipe"?: ((
12472
+ e: HelixHeadlessDeviceScreenHelixDeviceSwipeElementEvent,
12473
+ ) => void) | undefined;
12474
+ /** One finger touched the screen and lifted near where it landed. Tap the device in response. */
12475
+ "onhelix-device-tap"?: ((
12476
+ e: HelixHeadlessDeviceScreenHelixDeviceTapElementEvent,
12477
+ ) => void) | undefined;
12478
+ /** Text was pasted into the screen. Type it on the device in response. */
12479
+ "onhelix-device-text"?: ((
12480
+ e: HelixHeadlessDeviceScreenHelixDeviceTextElementEvent,
12481
+ ) => void) | undefined;
12482
+ /** A finger landed, moved, lifted, or was taken away. Touch the device in response. */
12483
+ "onhelix-device-touch"?: ((
12484
+ e: HelixHeadlessDeviceScreenHelixDeviceTouchElementEvent,
12485
+ ) => void) | undefined;
12486
+ };
12487
+
12488
+ export type HelixHeadlessDeviceScreenSolidJsProps = {
12489
+ /** The Back button's label. */
12490
+ "attr:back-label"?: (HelixHeadlessDeviceScreen["backLabel"]) | undefined;
12491
+ /** The Back button's label. */
12492
+ "prop:backLabel"?: (HelixHeadlessDeviceScreen["backLabel"]) | undefined;
12493
+ /** Which hardware buttons to draw, as a list: `back`, `home`, `recents`,
12494
+ `power`, `volume`, `rotate`, `screenshot`, and `fullscreen`, or `none`.
12495
+ They are drawn in that order whatever order the list is in. Absent is
12496
+ `home screenshot`. `volume` draws Volume up and Volume down, and `rotate`
12497
+ draws Rotate left and Rotate right. */
12498
+ "prop:controls"?: (HelixHeadlessDeviceScreen["controls"]) | undefined;
12499
+ /** The name of the toolbar of hardware buttons, read by screen readers. */
12500
+ "attr:controls-label"?: (HelixHeadlessDeviceScreen["controlsLabel"]) | undefined;
12501
+ /** The name of the toolbar of hardware buttons, read by screen readers. */
12502
+ "prop:controlsLabel"?: (HelixHeadlessDeviceScreen["controlsLabel"]) | undefined;
12503
+ /** Which side of the device the hardware buttons sit on. Absent and `top`
12504
+ are a row above it, `bottom` is a row below it, and `start` and `end` are
12505
+ a column beside it, as the Android Emulator draws its toolbar. The words
12506
+ are sides, as Carousel's are, and not the corners a map's controls take. */
12507
+ "attr:controls-placement"?: (HelixHeadlessDeviceScreen["controlsPlacement"]) | undefined;
12508
+ /** Which side of the device the hardware buttons sit on. Absent and `top`
12509
+ are a row above it, `bottom` is a row below it, and `start` and `end` are
12510
+ a column beside it, as the Android Emulator draws its toolbar. The words
12511
+ are sides, as Carousel's are, and not the corners a map's controls take. */
12512
+ "prop:controlsPlacement"?: (HelixHeadlessDeviceScreen["controlsPlacement"]) | undefined;
12513
+ /** The screen's name where `label` is empty and the host has no `aria-label`. */
12514
+ "attr:fallback-label"?: (HelixHeadlessDeviceScreen["fallbackLabel"]) | undefined;
12515
+ /** The screen's name where `label` is empty and the host has no `aria-label`. */
12516
+ "prop:fallbackLabel"?: (HelixHeadlessDeviceScreen["fallbackLabel"]) | undefined;
12517
+ /** Also sends key presses with Control, Command, or Alt held, which are left
12518
+ to the browser otherwise. For an app that owns its window. Command or
12519
+ Control with V pastes either way. */
12520
+ "bool:forward-shortcuts"?: (HelixHeadlessDeviceScreen["forwardShortcuts"]) | undefined;
12521
+ /** Also sends key presses with Control, Command, or Alt held, which are left
12522
+ to the browser otherwise. For an app that owns its window. Command or
12523
+ Control with V pastes either way. */
12524
+ "prop:forwardShortcuts"?: (HelixHeadlessDeviceScreen["forwardShortcuts"]) | undefined;
12525
+ /** The fullscreen button's label. */
12526
+ "attr:fullscreen-label"?: (HelixHeadlessDeviceScreen["fullscreenLabel"]) | undefined;
12527
+ /** The fullscreen button's label. */
12528
+ "prop:fullscreenLabel"?: (HelixHeadlessDeviceScreen["fullscreenLabel"]) | undefined;
12529
+ /** The Home button's label. */
12530
+ "attr:home-label"?: (HelixHeadlessDeviceScreen["homeLabel"]) | undefined;
12531
+ /** The Home button's label. */
12532
+ "prop:homeLabel"?: (HelixHeadlessDeviceScreen["homeLabel"]) | undefined;
12533
+ /** What a screen reader says about the keys when it reaches the screen,
12534
+ after its name. */
12535
+ "attr:keys-hint-label"?: (HelixHeadlessDeviceScreen["keysHintLabel"]) | undefined;
12536
+ /** What a screen reader says about the keys when it reaches the screen,
12537
+ after its name. */
12538
+ "prop:keysHintLabel"?: (HelixHeadlessDeviceScreen["keysHintLabel"]) | undefined;
12539
+ /** The device's name, read by screen readers as the screen's name, such as
12540
+ "iPhone 17 Pro". Name each device on a page with several. Required. */
12541
+ "prop:label"?: (HelixHeadlessDeviceScreen["label"]) | undefined;
12542
+ /** Shows the `loading` slot over the screen, for a stream that is starting
12543
+ or has stopped. Screen readers hear `loading-label`. */
12544
+ "prop:loading"?: (HelixHeadlessDeviceScreen["loading"]) | undefined;
12545
+ /** What the screen shows and screen readers hear while `loading` is set and nothing is in the `loading` slot. */
12546
+ "attr:loading-label"?: (HelixHeadlessDeviceScreen["loadingLabel"]) | undefined;
12547
+ /** What the screen shows and screen readers hear while `loading` is set and nothing is in the `loading` slot. */
12548
+ "prop:loadingLabel"?: (HelixHeadlessDeviceScreen["loadingLabel"]) | undefined;
12549
+ /** The Power button's label. */
12550
+ "attr:power-label"?: (HelixHeadlessDeviceScreen["powerLabel"]) | undefined;
12551
+ /** The Power button's label. */
12552
+ "prop:powerLabel"?: (HelixHeadlessDeviceScreen["powerLabel"]) | undefined;
12553
+ /** Shows the screen and sends nothing: no touches, scrolls, keys, or button
12554
+ presses. The screen is then a picture, out of the tab order, and the
12555
+ hardware buttons are off but for screenshot and fullscreen. Buttons of
12556
+ your own in the `controls` slot are yours to turn off. */
12557
+ "prop:readonly"?: (HelixHeadlessDeviceScreen["readonly"]) | undefined;
12558
+ /** The Recent apps button's label. */
12559
+ "attr:recents-label"?: (HelixHeadlessDeviceScreen["recentsLabel"]) | undefined;
12560
+ /** The Recent apps button's label. */
12561
+ "prop:recentsLabel"?: (HelixHeadlessDeviceScreen["recentsLabel"]) | undefined;
12562
+ /** What a screen reader calls the screen in place of its role, after its
12563
+ name: "iPhone 17 Pro, screen". Empty leaves the role. */
12564
+ "attr:role-label"?: (HelixHeadlessDeviceScreen["roleLabel"]) | undefined;
12565
+ /** What a screen reader calls the screen in place of its role, after its
12566
+ name: "iPhone 17 Pro, screen". Empty leaves the role. */
12567
+ "prop:roleLabel"?: (HelixHeadlessDeviceScreen["roleLabel"]) | undefined;
12568
+ /** The Rotate left button's label. */
12569
+ "attr:rotate-left-label"?: (HelixHeadlessDeviceScreen["rotateLeftLabel"]) | undefined;
12570
+ /** The Rotate left button's label. */
12571
+ "prop:rotateLeftLabel"?: (HelixHeadlessDeviceScreen["rotateLeftLabel"]) | undefined;
12572
+ /** The Rotate right button's label. */
12573
+ "attr:rotate-right-label"?: (HelixHeadlessDeviceScreen["rotateRightLabel"]) | undefined;
12574
+ /** The Rotate right button's label. */
12575
+ "prop:rotateRightLabel"?: (HelixHeadlessDeviceScreen["rotateRightLabel"]) | undefined;
12576
+ /** How far to turn the picture clockwise, in degrees: `90`, `180`, or `270`.
12577
+ For a source that sends frames in the device's natural orientation while
12578
+ the device is turned. Every point is turned back, so events stay in the
12579
+ device's own orientation. A source whose frames turn with the device
12580
+ needs none. */
12581
+ "prop:rotation"?: (HelixHeadlessDeviceScreen["rotation"]) | undefined;
12582
+ /** The screen's height in the units your device takes input in: points for
12583
+ the iOS Simulator, pixels for an Android device. Set with `screen-width`.
12584
+ Set alone, the width follows the stream's shape, and with neither, both
12585
+ are the stream's own size in pixels. */
12586
+ "attr:screen-height"?: (HelixHeadlessDeviceScreen["screenHeight"] | `${number}`) | undefined;
12587
+ /** The screen's height in the units your device takes input in: points for
12588
+ the iOS Simulator, pixels for an Android device. Set with `screen-width`.
12589
+ Set alone, the width follows the stream's shape, and with neither, both
12590
+ are the stream's own size in pixels. */
12591
+ "prop:screenHeight"?: (HelixHeadlessDeviceScreen["screenHeight"]) | undefined;
12592
+ /** The screenshot button's label. */
12593
+ "attr:screenshot-label"?: (HelixHeadlessDeviceScreen["screenshotLabel"]) | undefined;
12594
+ /** The screenshot button's label. */
12595
+ "prop:screenshotLabel"?: (HelixHeadlessDeviceScreen["screenshotLabel"]) | undefined;
12596
+ /** The screen's width in the units your device takes input in, as
12597
+ `screen-height` is. Set alone, the height follows the stream's shape. */
12598
+ "attr:screen-width"?: (HelixHeadlessDeviceScreen["screenWidth"] | `${number}`) | undefined;
12599
+ /** The screen's width in the units your device takes input in, as
12600
+ `screen-height` is. Set alone, the height follows the stream's shape. */
12601
+ "prop:screenWidth"?: (HelixHeadlessDeviceScreen["screenWidth"]) | undefined;
12602
+ /** The screen's outline. Absent is a rectangle with rounded corners;
12603
+ `square` has square corners, as on a phone with a Home button or a
12604
+ television, and `circle` is round, as on a round watch, and takes
12605
+ touches inside the circle only. */
12606
+ "prop:shape"?: (HelixHeadlessDeviceScreen["shape"]) | undefined;
12607
+ /** Draws a ring under each finger on the screen, as the iOS Simulator's
12608
+ Show single touches does. Rings from `showTap()` and `showSwipe()` are
12609
+ drawn either way. */
12610
+ "bool:show-touches"?: (HelixHeadlessDeviceScreen["showTouches"]) | undefined;
12611
+ /** Draws a ring under each finger on the screen, as the iOS Simulator's
12612
+ Show single touches does. Rings from `showTap()` and `showSwipe()` are
12613
+ drawn either way. */
12614
+ "prop:showTouches"?: (HelixHeadlessDeviceScreen["showTouches"]) | undefined;
12615
+ /** The Volume down button's label. */
12616
+ "attr:volume-down-label"?: (HelixHeadlessDeviceScreen["volumeDownLabel"]) | undefined;
12617
+ /** The Volume down button's label. */
12618
+ "prop:volumeDownLabel"?: (HelixHeadlessDeviceScreen["volumeDownLabel"]) | undefined;
12619
+ /** The Volume up button's label. */
12620
+ "attr:volume-up-label"?: (HelixHeadlessDeviceScreen["volumeUpLabel"]) | undefined;
12621
+ /** The Volume up button's label. */
12622
+ "prop:volumeUpLabel"?: (HelixHeadlessDeviceScreen["volumeUpLabel"]) | undefined;
12623
+ /** A hardware button was pressed, with how long it was held. Press it on the device in response. */
12624
+ "on:helix-device-button"?: ((
12625
+ e: HelixHeadlessDeviceScreenHelixDeviceButtonElementEvent,
12626
+ ) => void) | undefined;
12627
+ /** A key went down or came up while the screen had focus. Press or release it on the device in response. */
12628
+ "on:helix-device-key"?: ((
12629
+ e: HelixHeadlessDeviceScreenHelixDeviceKeyElementEvent,
12630
+ ) => void) | undefined;
12631
+ /** A screenshot was asked for. Take one in response. */
12632
+ "on:helix-device-screenshot"?: ((
12633
+ e: HelixHeadlessDeviceScreenHelixDeviceScreenshotElementEvent,
12634
+ ) => void) | undefined;
12635
+ /** A wheel or a trackpad scrolled over the screen. Scroll the device in response. */
12636
+ "on:helix-device-scroll"?: ((
12637
+ e: HelixHeadlessDeviceScreenHelixDeviceScrollElementEvent,
12638
+ ) => void) | undefined;
12639
+ /** One finger moved across the screen and lifted. Swipe the device in response. */
12640
+ "on:helix-device-swipe"?: ((
12641
+ e: HelixHeadlessDeviceScreenHelixDeviceSwipeElementEvent,
12642
+ ) => void) | undefined;
12643
+ /** One finger touched the screen and lifted near where it landed. Tap the device in response. */
12644
+ "on:helix-device-tap"?: ((
12645
+ e: HelixHeadlessDeviceScreenHelixDeviceTapElementEvent,
12646
+ ) => void) | undefined;
12647
+ /** Text was pasted into the screen. Type it on the device in response. */
12648
+ "on:helix-device-text"?: ((
12649
+ e: HelixHeadlessDeviceScreenHelixDeviceTextElementEvent,
12650
+ ) => void) | undefined;
12651
+ /** A finger landed, moved, lifted, or was taken away. Touch the device in response. */
12652
+ "on:helix-device-touch"?: ((
12653
+ e: HelixHeadlessDeviceScreenHelixDeviceTouchElementEvent,
12654
+ ) => void) | undefined;
12655
+
12656
+ /** Set the innerHTML of the element */
12657
+ innerHTML?: (string) | undefined;
12658
+ /** Set the textContent of the element */
12659
+ textContent?: (string | number) | undefined;
12660
+ };
12661
+
12279
12662
  /** `HelixHeadlessDialog` component event */
12280
12663
  export type HelixHeadlessDialogElementEvent<E = Event> = TypedEvent<
12281
12664
  HelixHeadlessDialog,
@@ -48888,6 +49271,296 @@ export type CustomElements<F extends Framework = "other"> = {
48888
49271
  BaseEvents<HelixHeadlessDescriptionList>
48889
49272
  >;
48890
49273
 
49274
+ /**
49275
+ * Shows the screen of a phone, a tablet, or a watch, such as the iOS Simulator
49276
+ * or the Android Emulator, and turns what you do on it into events. Helix does
49277
+ * not connect to the device. Put the element that draws the stream inside: a
49278
+ * `<video>` fed by WebRTC or Media Source, an `<img>` showing an MJPEG stream,
49279
+ * or a `<canvas>` you draw decoded frames on. The frame gives the screen the
49280
+ * device's shape and stretches the element to fill it.
49281
+ *
49282
+ * Set `screen-width` and `screen-height` to the screen's size in the units
49283
+ * your device takes input in: points for the iOS Simulator, and pixels for an
49284
+ * Android device. Every point an event carries is in those units, beside the
49285
+ * `width` and `height` it is measured against. Without them, the frame reads
49286
+ * the stream's own size in pixels.
49287
+ *
49288
+ * **Touches.** Listen in one of two ways, and not both, or the device moves
49289
+ * twice:
49290
+ * - `helix-device-touch` for each finger as it lands, moves, and lifts, for a
49291
+ * source that takes live touches. A drag and a pinch need it.
49292
+ * - `helix-device-tap` and `helix-device-swipe` once the finger lifts, for a
49293
+ * source that takes whole gestures. A long press is a tap with a long
49294
+ * `duration`.
49295
+ *
49296
+ * Alt, or Option on a Mac, with a drag sends two touches mirrored about the
49297
+ * middle of the screen, for a pinch or a turn, as the iOS Simulator does. A
49298
+ * wheel or a trackpad over the screen sends `helix-device-scroll`.
49299
+ *
49300
+ * **Keyboard.** Press Tab to reach the screen, or press the screen. While it
49301
+ * has focus:
49302
+ *
49303
+ * | Key | What it does |
49304
+ * |---|---|
49305
+ * | Any key | Sends `helix-device-key` as it goes down, and again as it comes up. |
49306
+ * | Tab, Shift with Tab | Moves focus on from the screen. Never sent. |
49307
+ * | Control, Command, or Alt with a key | Left to the browser, unless `forward-shortcuts` is set. |
49308
+ * | Command or Control with V | Sends the clipboard's text as `helix-device-text`. |
49309
+ *
49310
+ * A key still held when focus leaves is sent as released. The screen has the
49311
+ * `application` role, so a screen reader passes every key to it, and its
49312
+ * description says how to leave.
49313
+ *
49314
+ * **Buttons.** `controls` names the hardware buttons to draw: `back`, `home`,
49315
+ * `recents`, `power`, `volume`, `rotate`, `screenshot`, and `fullscreen`,
49316
+ * `home screenshot` by default. Each sends `helix-device-button` with how long
49317
+ * it was held, and the screenshot button sends `helix-device-screenshot`.
49318
+ * `press()` and `screenshot()` do the same from a script. Put buttons of your
49319
+ * own in the `controls` slot, and they join the row. The row is one tab stop,
49320
+ * and the arrow keys move along it, or Up and Down in a column.
49321
+ *
49322
+ * Set `rotation` where your source sends frames in the device's natural
49323
+ * orientation while the device is turned: the frame turns the picture, and
49324
+ * turns every point back. Set `readonly` to show the screen and send nothing,
49325
+ * such as while an agent drives the device. The screen is then a picture, and
49326
+ * `showTap()` and `showSwipe()` mark where the agent touched it.
49327
+ *
49328
+ * ## Attributes & Properties
49329
+ *
49330
+ * Component attributes and properties that can be applied to the element or by using JavaScript.
49331
+ *
49332
+ * - `back-label`/`backLabel`: The Back button's label.
49333
+ * - `controls`: Which hardware buttons to draw, as a list: `back`, `home`, `recents`,
49334
+ * `power`, `volume`, `rotate`, `screenshot`, and `fullscreen`, or `none`.
49335
+ * They are drawn in that order whatever order the list is in. Absent is
49336
+ * `home screenshot`. `volume` draws Volume up and Volume down, and `rotate`
49337
+ * draws Rotate left and Rotate right.
49338
+ * - `controls-label`/`controlsLabel`: The name of the toolbar of hardware buttons, read by screen readers.
49339
+ * - `controls-placement`/`controlsPlacement`: Which side of the device the hardware buttons sit on. Absent and `top`
49340
+ * are a row above it, `bottom` is a row below it, and `start` and `end` are
49341
+ * a column beside it, as the Android Emulator draws its toolbar. The words
49342
+ * are sides, as Carousel's are, and not the corners a map's controls take.
49343
+ * - `fallback-label`/`fallbackLabel`: The screen's name where `label` is empty and the host has no `aria-label`.
49344
+ * - `forward-shortcuts`/`forwardShortcuts`: Also sends key presses with Control, Command, or Alt held, which are left
49345
+ * to the browser otherwise. For an app that owns its window. Command or
49346
+ * Control with V pastes either way.
49347
+ * - `fullscreen-label`/`fullscreenLabel`: The fullscreen button's label.
49348
+ * - `home-label`/`homeLabel`: The Home button's label.
49349
+ * - `keys-hint-label`/`keysHintLabel`: What a screen reader says about the keys when it reaches the screen,
49350
+ * after its name.
49351
+ * - `label`: The device's name, read by screen readers as the screen's name, such as
49352
+ * "iPhone 17 Pro". Name each device on a page with several. Required.
49353
+ * - `loading`: Shows the `loading` slot over the screen, for a stream that is starting
49354
+ * or has stopped. Screen readers hear `loading-label`.
49355
+ * - `loading-label`/`loadingLabel`: What the screen shows and screen readers hear while `loading` is set and nothing is in the `loading` slot.
49356
+ * - `power-label`/`powerLabel`: The Power button's label.
49357
+ * - `readonly`: Shows the screen and sends nothing: no touches, scrolls, keys, or button
49358
+ * presses. The screen is then a picture, out of the tab order, and the
49359
+ * hardware buttons are off but for screenshot and fullscreen. Buttons of
49360
+ * your own in the `controls` slot are yours to turn off.
49361
+ * - `recents-label`/`recentsLabel`: The Recent apps button's label.
49362
+ * - `role-label`/`roleLabel`: What a screen reader calls the screen in place of its role, after its
49363
+ * name: "iPhone 17 Pro, screen". Empty leaves the role.
49364
+ * - `rotate-left-label`/`rotateLeftLabel`: The Rotate left button's label.
49365
+ * - `rotate-right-label`/`rotateRightLabel`: The Rotate right button's label.
49366
+ * - `rotation`: How far to turn the picture clockwise, in degrees: `90`, `180`, or `270`.
49367
+ * For a source that sends frames in the device's natural orientation while
49368
+ * the device is turned. Every point is turned back, so events stay in the
49369
+ * device's own orientation. A source whose frames turn with the device
49370
+ * needs none.
49371
+ * - `screen-height`/`screenHeight`: The screen's height in the units your device takes input in: points for
49372
+ * the iOS Simulator, pixels for an Android device. Set with `screen-width`.
49373
+ * Set alone, the width follows the stream's shape, and with neither, both
49374
+ * are the stream's own size in pixels.
49375
+ * - `screenshot-label`/`screenshotLabel`: The screenshot button's label.
49376
+ * - `screen-width`/`screenWidth`: The screen's width in the units your device takes input in, as
49377
+ * `screen-height` is. Set alone, the height follows the stream's shape.
49378
+ * - `shape`: The screen's outline. Absent is a rectangle with rounded corners;
49379
+ * `square` has square corners, as on a phone with a Home button or a
49380
+ * television, and `circle` is round, as on a round watch, and takes
49381
+ * touches inside the circle only.
49382
+ * - `show-touches`/`showTouches`: Draws a ring under each finger on the screen, as the iOS Simulator's
49383
+ * Show single touches does. Rings from `showTap()` and `showSwipe()` are
49384
+ * drawn either way.
49385
+ * - `volume-down-label`/`volumeDownLabel`: The Volume down button's label.
49386
+ * - `volume-up-label`/`volumeUpLabel`: The Volume up button's label.
49387
+ * - `whenSettled`: Resolves a frame after the first update, when transitions are switched on.
49388
+ *
49389
+ * **Named `whenSettled` because `settled` is taken four times over**, by
49390
+ * Image, Splitter and both color controls, none of them about transitions. A
49391
+ * base class takes the name every subclass then cannot use.
49392
+ *
49393
+ * **The state it reports cannot be watched, which is why this exists.** A
49394
+ * custom state is deliberately not in the DOM, so there is no
49395
+ * `MutationObserver` equivalent for `ElementInternals.states`. Await this
49396
+ * instead.
49397
+ *
49398
+ * Separate from `updateComplete`, which resolves in the microtask checkpoint
49399
+ * the suppression is still active in. That is the distinction `readyToMove`
49400
+ * in `@fusion.dev/helix-testing` is written around.
49401
+ *
49402
+ * It never resolves where `requestAnimationFrame` never fires, which is a
49403
+ * server, a hidden tab, and happy-dom. Callers that must not hang there race
49404
+ * it against a timeout, as the happy-dom harness's `readyToMove` does. The
49405
+ * browser harness's awaits it alone: a browser always runs the frame, and a
49406
+ * timer beside it was a bet on how long one takes, which a busy run lost. (property only) (readonly)
49407
+ *
49408
+ * ## Events
49409
+ *
49410
+ * Events that will be emitted by the component.
49411
+ *
49412
+ * - `helix-device-button`: A hardware button was pressed, with how long it was held. Press it on the device in response.
49413
+ * - `helix-device-key`: A key went down or came up while the screen had focus. Press or release it on the device in response.
49414
+ * - `helix-device-screenshot`: A screenshot was asked for. Take one in response.
49415
+ * - `helix-device-scroll`: A wheel or a trackpad scrolled over the screen. Scroll the device in response.
49416
+ * - `helix-device-swipe`: One finger moved across the screen and lifted. Swipe the device in response.
49417
+ * - `helix-device-tap`: One finger touched the screen and lifted near where it landed. Tap the device in response.
49418
+ * - `helix-device-text`: Text was pasted into the screen. Type it on the device in response.
49419
+ * - `helix-device-touch`: A finger landed, moved, lifted, or was taken away. Touch the device in response.
49420
+ *
49421
+ * ## Slots
49422
+ *
49423
+ * Areas where markup can be added to the component.
49424
+ *
49425
+ * - `(default)`: The element that draws the stream: a `<video>`, an `<img>`, or a `<canvas>`.
49426
+ * - `back-icon`: Replaces the glyph inside the Back button.
49427
+ * - `bezel`: A picture of the device drawn over the screen, such as a photograph of a phone with a clear screen. It takes no touches.
49428
+ * - `controls`: Buttons of your own, such as Shake or Record, in the row after the hardware buttons and before the fullscreen button.
49429
+ * - `empty`: Content shown over the screen while no element that draws the stream is inside and `loading` is not set, such as "No simulator is running" and a button to start one.
49430
+ * - `footer`: Content below the device.
49431
+ * - `fullscreen-icon`: Replaces the glyph inside the fullscreen button.
49432
+ * - `header`: Content above the device, such as its name and state.
49433
+ * - `home-icon`: Replaces the glyph inside the Home button.
49434
+ * - `loading`: Content shown over the screen while `loading` is set, such as a spinner. `loading-label` by default, which screen readers hear either way.
49435
+ * - `power-icon`: Replaces the glyph inside the Power button.
49436
+ * - `recents-icon`: Replaces the glyph inside the Recent apps button.
49437
+ * - `rotate-left-icon`: Replaces the glyph inside the Rotate left button.
49438
+ * - `rotate-right-icon`: Replaces the glyph inside the Rotate right button.
49439
+ * - `screenshot-icon`: Replaces the glyph inside the screenshot button.
49440
+ * - `volume-down-icon`: Replaces the glyph inside the Volume down button.
49441
+ * - `volume-up-icon`: Replaces the glyph inside the Volume up button.
49442
+ *
49443
+ * ## Methods
49444
+ *
49445
+ * Methods that can be called to access component functionality.
49446
+ *
49447
+ * - `press(button: DeviceButton, duration = 0) => void`: Presses a hardware button, as its control does: sends
49448
+ * `helix-device-button`. `duration` is how long it is held, in
49449
+ * milliseconds.
49450
+ * - `screenshot() => void`: Asks for a screenshot, as the screenshot button does: sends `helix-device-screenshot`.
49451
+ * - `capture(type = 'image/png', quality?: number) => Promise<Blob>`: The picture on the screen now, as an image, at the stream's own size and
49452
+ * turned by `rotation`. For a page with no sharper screenshot from its
49453
+ * source.
49454
+ *
49455
+ * Fails where there is no stream, where it has not drawn a frame, and where
49456
+ * the browser will not let a page read it, such as an image from another
49457
+ * origin served without CORS.
49458
+ * - `showTap(x: number, y: number) => void`: Draws a ring at a point on the screen for a moment, in the device's
49459
+ * units, for a touch made elsewhere, such as by an agent. Drawn whether or
49460
+ * not `show-touches` is set, and nothing is sent.
49461
+ * - `showSwipe(fromX: number, fromY: number, toX: number, toY: number, duration = 300) => void`: Draws a ring that travels from one point to another over `duration`
49462
+ * milliseconds, in the device's units, for a swipe made elsewhere, as
49463
+ * `showTap()` does for a tap.
49464
+ *
49465
+ * ## CSS Custom Properties
49466
+ *
49467
+ * CSS variables available for styling the component.
49468
+ *
49469
+ * - `--device-screen-ratio`: The drawn screen's width divided by its height, turned by `rotation`, as a number. Written by the frame once the screen's size is known.
49470
+ * - `--device-screen-rotation`: How far the picture is turned, as an angle. The frame writes it from `rotation`.
49471
+ * - `--device-screen-touch-duration`: How long a swipe's ring takes to travel, as a time. Written on each ring from `showSwipe()`.
49472
+ * - `--device-screen-touch-to-x`: Where a swipe's ring travels to, across the screen, as a percentage. Written on each ring from `showSwipe()`.
49473
+ * - `--device-screen-touch-to-y`: Where a swipe's ring travels to, down the screen, as a percentage. Written on each ring from `showSwipe()`.
49474
+ * - `--device-screen-touch-x`: Where a ring is, across the screen, as a percentage. Written on each ring.
49475
+ * - `--device-screen-touch-y`: Where a ring is, down the screen, as a percentage. Written on each ring.
49476
+ *
49477
+ * ## CSS Parts
49478
+ *
49479
+ * Custom selectors for styling elements within the component.
49480
+ *
49481
+ * - `back`: The Back button.
49482
+ * - `back-button`: The Back button's inner button.
49483
+ * - `back-live`: The Back button's live region, which speaks while the button is pending.
49484
+ * - `back-spinner`: The ring the Back button turns while it is pending.
49485
+ * - `back-text`: The box the Back button's icon sits in.
49486
+ * - `bezel`: The body of the device around the screen.
49487
+ * - `controls`: The row of buttons: the hardware buttons and any of yours in the `controls` slot.
49488
+ * - `device`: The box the device is fitted into, which keeps its shape inside it.
49489
+ * - `empty`: The box over the screen that holds the `empty` slot while no stream is inside and `loading` is not set. It stands beside the screen, so what you put in it takes presses and keys of its own, and a read-only screen does not hide it from screen readers.
49490
+ * - `footer`: The strip below the device.
49491
+ * - `fullscreen`: The button that makes the device fill the screen.
49492
+ * - `fullscreen-button`: The fullscreen button's inner button.
49493
+ * - `fullscreen-live`: The fullscreen button's live region, which speaks while the button is pending.
49494
+ * - `fullscreen-spinner`: The ring the fullscreen button turns while it is pending.
49495
+ * - `fullscreen-text`: The box the fullscreen button's icon sits in.
49496
+ * - `header`: The strip above the device.
49497
+ * - `home`: The Home button.
49498
+ * - `home-button`: The Home button's inner button.
49499
+ * - `home-live`: The Home button's live region, which speaks while the button is pending.
49500
+ * - `home-spinner`: The ring the Home button turns while it is pending.
49501
+ * - `home-text`: The box the Home button's icon sits in.
49502
+ * - `keys-hint`: What a screen reader says about the keys when it reaches the screen, as its description. Read by screen readers only.
49503
+ * - `live`: What screen readers hear while `loading` is set: `loading-label`. Read by screen readers only.
49504
+ * - `loading`: The box over the screen that holds the `loading` slot while `loading` is set. Screen readers hear `live` in its place.
49505
+ * - `picture`: The box the stream is drawn in, turned by `rotation`.
49506
+ * - `power`: The Power button.
49507
+ * - `power-button`: The Power button's inner button.
49508
+ * - `power-live`: The Power button's live region, which speaks while the button is pending.
49509
+ * - `power-spinner`: The ring the Power button turns while it is pending.
49510
+ * - `power-text`: The box the Power button's icon sits in.
49511
+ * - `recents`: The Recent apps button.
49512
+ * - `recents-button`: The Recent apps button's inner button.
49513
+ * - `recents-live`: The Recent apps button's live region, which speaks while the button is pending.
49514
+ * - `recents-spinner`: The ring the Recent apps button turns while it is pending.
49515
+ * - `recents-text`: The box the Recent apps button's icon sits in.
49516
+ * - `region`: The box that holds the device, its buttons, the header, and the footer.
49517
+ * - `rotate-left`: The Rotate left button.
49518
+ * - `rotate-left-button`: The Rotate left button's inner button.
49519
+ * - `rotate-left-live`: The Rotate left button's live region, which speaks while the button is pending.
49520
+ * - `rotate-left-spinner`: The ring the Rotate left button turns while it is pending.
49521
+ * - `rotate-left-text`: The box the Rotate left button's icon sits in.
49522
+ * - `rotate-right`: The Rotate right button.
49523
+ * - `rotate-right-button`: The Rotate right button's inner button.
49524
+ * - `rotate-right-live`: The Rotate right button's live region, which speaks while the button is pending.
49525
+ * - `rotate-right-spinner`: The ring the Rotate right button turns while it is pending.
49526
+ * - `rotate-right-text`: The box the Rotate right button's icon sits in.
49527
+ * - `screen`: The device's screen, which takes the touches and the keys.
49528
+ * - `screenshot`: The button that asks for a screenshot.
49529
+ * - `screenshot-button`: The screenshot button's inner button.
49530
+ * - `screenshot-live`: The screenshot button's live region, which speaks while the button is pending.
49531
+ * - `screenshot-spinner`: The ring the screenshot button turns while it is pending.
49532
+ * - `screenshot-text`: The box the screenshot button's icon sits in.
49533
+ * - `touch`: A ring where a touch is or was.
49534
+ * - `touch-held`: A ring under a finger that is down, beside `touch`, with `show-touches`.
49535
+ * - `volume-down`: The Volume down button.
49536
+ * - `volume-down-button`: The Volume down button's inner button.
49537
+ * - `volume-down-live`: The Volume down button's live region, which speaks while the button is pending.
49538
+ * - `volume-down-spinner`: The ring the Volume down button turns while it is pending.
49539
+ * - `volume-down-text`: The box the Volume down button's icon sits in.
49540
+ * - `volume-up`: The Volume up button.
49541
+ * - `volume-up-button`: The Volume up button's inner button.
49542
+ * - `volume-up-live`: The Volume up button's live region, which speaks while the button is pending.
49543
+ * - `volume-up-spinner`: The ring the Volume up button turns while it is pending.
49544
+ * - `volume-up-text`: The box the Volume up button's icon sits in.
49545
+ *
49546
+ * ## CSS States
49547
+ *
49548
+ * These can be used to apply styling when a component is in a given state.
49549
+ *
49550
+ * - `empty`: No element that draws the stream is inside, which the frame knows once it runs in the browser.
49551
+ * - `fullscreen`: The device fills the screen.
49552
+ * - `loading`: `loading` is set.
49553
+ * - `readonly`: `readonly` is set, and the screen sends nothing.
49554
+ * - `sideways`: `rotation` turns the picture a quarter, so the drawn screen is the device's height wide.
49555
+ * - `touching`: A finger is on the screen.
49556
+ * - `settled`: Set one frame after the first render. Transitions wait for it, so an element does not animate its own arrival.
49557
+ */
49558
+ "helix-headless-device-screen": Partial<
49559
+ HelixHeadlessDeviceScreenProps &
49560
+ BaseProps<HelixHeadlessDeviceScreen, F> &
49561
+ BaseEvents<HelixHeadlessDeviceScreen>
49562
+ >;
49563
+
48891
49564
  /**
48892
49565
  * Renders a native `<dialog>` opened with `showModal()`. The platform provides:
48893
49566
  *
@@ -81740,6 +82413,297 @@ export type CustomElementsSolidJs = {
81740
82413
  BaseEvents<HelixHeadlessDescriptionList>
81741
82414
  >;
81742
82415
 
82416
+ /**
82417
+ * Shows the screen of a phone, a tablet, or a watch, such as the iOS Simulator
82418
+ * or the Android Emulator, and turns what you do on it into events. Helix does
82419
+ * not connect to the device. Put the element that draws the stream inside: a
82420
+ * `<video>` fed by WebRTC or Media Source, an `<img>` showing an MJPEG stream,
82421
+ * or a `<canvas>` you draw decoded frames on. The frame gives the screen the
82422
+ * device's shape and stretches the element to fill it.
82423
+ *
82424
+ * Set `screen-width` and `screen-height` to the screen's size in the units
82425
+ * your device takes input in: points for the iOS Simulator, and pixels for an
82426
+ * Android device. Every point an event carries is in those units, beside the
82427
+ * `width` and `height` it is measured against. Without them, the frame reads
82428
+ * the stream's own size in pixels.
82429
+ *
82430
+ * **Touches.** Listen in one of two ways, and not both, or the device moves
82431
+ * twice:
82432
+ * - `helix-device-touch` for each finger as it lands, moves, and lifts, for a
82433
+ * source that takes live touches. A drag and a pinch need it.
82434
+ * - `helix-device-tap` and `helix-device-swipe` once the finger lifts, for a
82435
+ * source that takes whole gestures. A long press is a tap with a long
82436
+ * `duration`.
82437
+ *
82438
+ * Alt, or Option on a Mac, with a drag sends two touches mirrored about the
82439
+ * middle of the screen, for a pinch or a turn, as the iOS Simulator does. A
82440
+ * wheel or a trackpad over the screen sends `helix-device-scroll`.
82441
+ *
82442
+ * **Keyboard.** Press Tab to reach the screen, or press the screen. While it
82443
+ * has focus:
82444
+ *
82445
+ * | Key | What it does |
82446
+ * |---|---|
82447
+ * | Any key | Sends `helix-device-key` as it goes down, and again as it comes up. |
82448
+ * | Tab, Shift with Tab | Moves focus on from the screen. Never sent. |
82449
+ * | Control, Command, or Alt with a key | Left to the browser, unless `forward-shortcuts` is set. |
82450
+ * | Command or Control with V | Sends the clipboard's text as `helix-device-text`. |
82451
+ *
82452
+ * A key still held when focus leaves is sent as released. The screen has the
82453
+ * `application` role, so a screen reader passes every key to it, and its
82454
+ * description says how to leave.
82455
+ *
82456
+ * **Buttons.** `controls` names the hardware buttons to draw: `back`, `home`,
82457
+ * `recents`, `power`, `volume`, `rotate`, `screenshot`, and `fullscreen`,
82458
+ * `home screenshot` by default. Each sends `helix-device-button` with how long
82459
+ * it was held, and the screenshot button sends `helix-device-screenshot`.
82460
+ * `press()` and `screenshot()` do the same from a script. Put buttons of your
82461
+ * own in the `controls` slot, and they join the row. The row is one tab stop,
82462
+ * and the arrow keys move along it, or Up and Down in a column.
82463
+ *
82464
+ * Set `rotation` where your source sends frames in the device's natural
82465
+ * orientation while the device is turned: the frame turns the picture, and
82466
+ * turns every point back. Set `readonly` to show the screen and send nothing,
82467
+ * such as while an agent drives the device. The screen is then a picture, and
82468
+ * `showTap()` and `showSwipe()` mark where the agent touched it.
82469
+ *
82470
+ * ## Attributes & Properties
82471
+ *
82472
+ * Component attributes and properties that can be applied to the element or by using JavaScript.
82473
+ *
82474
+ * - `back-label`/`backLabel`: The Back button's label.
82475
+ * - `controls`: Which hardware buttons to draw, as a list: `back`, `home`, `recents`,
82476
+ * `power`, `volume`, `rotate`, `screenshot`, and `fullscreen`, or `none`.
82477
+ * They are drawn in that order whatever order the list is in. Absent is
82478
+ * `home screenshot`. `volume` draws Volume up and Volume down, and `rotate`
82479
+ * draws Rotate left and Rotate right.
82480
+ * - `controls-label`/`controlsLabel`: The name of the toolbar of hardware buttons, read by screen readers.
82481
+ * - `controls-placement`/`controlsPlacement`: Which side of the device the hardware buttons sit on. Absent and `top`
82482
+ * are a row above it, `bottom` is a row below it, and `start` and `end` are
82483
+ * a column beside it, as the Android Emulator draws its toolbar. The words
82484
+ * are sides, as Carousel's are, and not the corners a map's controls take.
82485
+ * - `fallback-label`/`fallbackLabel`: The screen's name where `label` is empty and the host has no `aria-label`.
82486
+ * - `forward-shortcuts`/`forwardShortcuts`: Also sends key presses with Control, Command, or Alt held, which are left
82487
+ * to the browser otherwise. For an app that owns its window. Command or
82488
+ * Control with V pastes either way.
82489
+ * - `fullscreen-label`/`fullscreenLabel`: The fullscreen button's label.
82490
+ * - `home-label`/`homeLabel`: The Home button's label.
82491
+ * - `keys-hint-label`/`keysHintLabel`: What a screen reader says about the keys when it reaches the screen,
82492
+ * after its name.
82493
+ * - `label`: The device's name, read by screen readers as the screen's name, such as
82494
+ * "iPhone 17 Pro". Name each device on a page with several. Required.
82495
+ * - `loading`: Shows the `loading` slot over the screen, for a stream that is starting
82496
+ * or has stopped. Screen readers hear `loading-label`.
82497
+ * - `loading-label`/`loadingLabel`: What the screen shows and screen readers hear while `loading` is set and nothing is in the `loading` slot.
82498
+ * - `power-label`/`powerLabel`: The Power button's label.
82499
+ * - `readonly`: Shows the screen and sends nothing: no touches, scrolls, keys, or button
82500
+ * presses. The screen is then a picture, out of the tab order, and the
82501
+ * hardware buttons are off but for screenshot and fullscreen. Buttons of
82502
+ * your own in the `controls` slot are yours to turn off.
82503
+ * - `recents-label`/`recentsLabel`: The Recent apps button's label.
82504
+ * - `role-label`/`roleLabel`: What a screen reader calls the screen in place of its role, after its
82505
+ * name: "iPhone 17 Pro, screen". Empty leaves the role.
82506
+ * - `rotate-left-label`/`rotateLeftLabel`: The Rotate left button's label.
82507
+ * - `rotate-right-label`/`rotateRightLabel`: The Rotate right button's label.
82508
+ * - `rotation`: How far to turn the picture clockwise, in degrees: `90`, `180`, or `270`.
82509
+ * For a source that sends frames in the device's natural orientation while
82510
+ * the device is turned. Every point is turned back, so events stay in the
82511
+ * device's own orientation. A source whose frames turn with the device
82512
+ * needs none.
82513
+ * - `screen-height`/`screenHeight`: The screen's height in the units your device takes input in: points for
82514
+ * the iOS Simulator, pixels for an Android device. Set with `screen-width`.
82515
+ * Set alone, the width follows the stream's shape, and with neither, both
82516
+ * are the stream's own size in pixels.
82517
+ * - `screenshot-label`/`screenshotLabel`: The screenshot button's label.
82518
+ * - `screen-width`/`screenWidth`: The screen's width in the units your device takes input in, as
82519
+ * `screen-height` is. Set alone, the height follows the stream's shape.
82520
+ * - `shape`: The screen's outline. Absent is a rectangle with rounded corners;
82521
+ * `square` has square corners, as on a phone with a Home button or a
82522
+ * television, and `circle` is round, as on a round watch, and takes
82523
+ * touches inside the circle only.
82524
+ * - `show-touches`/`showTouches`: Draws a ring under each finger on the screen, as the iOS Simulator's
82525
+ * Show single touches does. Rings from `showTap()` and `showSwipe()` are
82526
+ * drawn either way.
82527
+ * - `volume-down-label`/`volumeDownLabel`: The Volume down button's label.
82528
+ * - `volume-up-label`/`volumeUpLabel`: The Volume up button's label.
82529
+ * - `whenSettled`: Resolves a frame after the first update, when transitions are switched on.
82530
+ *
82531
+ * **Named `whenSettled` because `settled` is taken four times over**, by
82532
+ * Image, Splitter and both color controls, none of them about transitions. A
82533
+ * base class takes the name every subclass then cannot use.
82534
+ *
82535
+ * **The state it reports cannot be watched, which is why this exists.** A
82536
+ * custom state is deliberately not in the DOM, so there is no
82537
+ * `MutationObserver` equivalent for `ElementInternals.states`. Await this
82538
+ * instead.
82539
+ *
82540
+ * Separate from `updateComplete`, which resolves in the microtask checkpoint
82541
+ * the suppression is still active in. That is the distinction `readyToMove`
82542
+ * in `@fusion.dev/helix-testing` is written around.
82543
+ *
82544
+ * It never resolves where `requestAnimationFrame` never fires, which is a
82545
+ * server, a hidden tab, and happy-dom. Callers that must not hang there race
82546
+ * it against a timeout, as the happy-dom harness's `readyToMove` does. The
82547
+ * browser harness's awaits it alone: a browser always runs the frame, and a
82548
+ * timer beside it was a bet on how long one takes, which a busy run lost. (property only) (readonly)
82549
+ *
82550
+ * ## Events
82551
+ *
82552
+ * Events that will be emitted by the component.
82553
+ *
82554
+ * - `helix-device-button`: A hardware button was pressed, with how long it was held. Press it on the device in response.
82555
+ * - `helix-device-key`: A key went down or came up while the screen had focus. Press or release it on the device in response.
82556
+ * - `helix-device-screenshot`: A screenshot was asked for. Take one in response.
82557
+ * - `helix-device-scroll`: A wheel or a trackpad scrolled over the screen. Scroll the device in response.
82558
+ * - `helix-device-swipe`: One finger moved across the screen and lifted. Swipe the device in response.
82559
+ * - `helix-device-tap`: One finger touched the screen and lifted near where it landed. Tap the device in response.
82560
+ * - `helix-device-text`: Text was pasted into the screen. Type it on the device in response.
82561
+ * - `helix-device-touch`: A finger landed, moved, lifted, or was taken away. Touch the device in response.
82562
+ *
82563
+ * ## Slots
82564
+ *
82565
+ * Areas where markup can be added to the component.
82566
+ *
82567
+ * - `(default)`: The element that draws the stream: a `<video>`, an `<img>`, or a `<canvas>`.
82568
+ * - `back-icon`: Replaces the glyph inside the Back button.
82569
+ * - `bezel`: A picture of the device drawn over the screen, such as a photograph of a phone with a clear screen. It takes no touches.
82570
+ * - `controls`: Buttons of your own, such as Shake or Record, in the row after the hardware buttons and before the fullscreen button.
82571
+ * - `empty`: Content shown over the screen while no element that draws the stream is inside and `loading` is not set, such as "No simulator is running" and a button to start one.
82572
+ * - `footer`: Content below the device.
82573
+ * - `fullscreen-icon`: Replaces the glyph inside the fullscreen button.
82574
+ * - `header`: Content above the device, such as its name and state.
82575
+ * - `home-icon`: Replaces the glyph inside the Home button.
82576
+ * - `loading`: Content shown over the screen while `loading` is set, such as a spinner. `loading-label` by default, which screen readers hear either way.
82577
+ * - `power-icon`: Replaces the glyph inside the Power button.
82578
+ * - `recents-icon`: Replaces the glyph inside the Recent apps button.
82579
+ * - `rotate-left-icon`: Replaces the glyph inside the Rotate left button.
82580
+ * - `rotate-right-icon`: Replaces the glyph inside the Rotate right button.
82581
+ * - `screenshot-icon`: Replaces the glyph inside the screenshot button.
82582
+ * - `volume-down-icon`: Replaces the glyph inside the Volume down button.
82583
+ * - `volume-up-icon`: Replaces the glyph inside the Volume up button.
82584
+ *
82585
+ * ## Methods
82586
+ *
82587
+ * Methods that can be called to access component functionality.
82588
+ *
82589
+ * - `press(button: DeviceButton, duration = 0) => void`: Presses a hardware button, as its control does: sends
82590
+ * `helix-device-button`. `duration` is how long it is held, in
82591
+ * milliseconds.
82592
+ * - `screenshot() => void`: Asks for a screenshot, as the screenshot button does: sends `helix-device-screenshot`.
82593
+ * - `capture(type = 'image/png', quality?: number) => Promise<Blob>`: The picture on the screen now, as an image, at the stream's own size and
82594
+ * turned by `rotation`. For a page with no sharper screenshot from its
82595
+ * source.
82596
+ *
82597
+ * Fails where there is no stream, where it has not drawn a frame, and where
82598
+ * the browser will not let a page read it, such as an image from another
82599
+ * origin served without CORS.
82600
+ * - `showTap(x: number, y: number) => void`: Draws a ring at a point on the screen for a moment, in the device's
82601
+ * units, for a touch made elsewhere, such as by an agent. Drawn whether or
82602
+ * not `show-touches` is set, and nothing is sent.
82603
+ * - `showSwipe(fromX: number, fromY: number, toX: number, toY: number, duration = 300) => void`: Draws a ring that travels from one point to another over `duration`
82604
+ * milliseconds, in the device's units, for a swipe made elsewhere, as
82605
+ * `showTap()` does for a tap.
82606
+ *
82607
+ * ## CSS Custom Properties
82608
+ *
82609
+ * CSS variables available for styling the component.
82610
+ *
82611
+ * - `--device-screen-ratio`: The drawn screen's width divided by its height, turned by `rotation`, as a number. Written by the frame once the screen's size is known.
82612
+ * - `--device-screen-rotation`: How far the picture is turned, as an angle. The frame writes it from `rotation`.
82613
+ * - `--device-screen-touch-duration`: How long a swipe's ring takes to travel, as a time. Written on each ring from `showSwipe()`.
82614
+ * - `--device-screen-touch-to-x`: Where a swipe's ring travels to, across the screen, as a percentage. Written on each ring from `showSwipe()`.
82615
+ * - `--device-screen-touch-to-y`: Where a swipe's ring travels to, down the screen, as a percentage. Written on each ring from `showSwipe()`.
82616
+ * - `--device-screen-touch-x`: Where a ring is, across the screen, as a percentage. Written on each ring.
82617
+ * - `--device-screen-touch-y`: Where a ring is, down the screen, as a percentage. Written on each ring.
82618
+ *
82619
+ * ## CSS Parts
82620
+ *
82621
+ * Custom selectors for styling elements within the component.
82622
+ *
82623
+ * - `back`: The Back button.
82624
+ * - `back-button`: The Back button's inner button.
82625
+ * - `back-live`: The Back button's live region, which speaks while the button is pending.
82626
+ * - `back-spinner`: The ring the Back button turns while it is pending.
82627
+ * - `back-text`: The box the Back button's icon sits in.
82628
+ * - `bezel`: The body of the device around the screen.
82629
+ * - `controls`: The row of buttons: the hardware buttons and any of yours in the `controls` slot.
82630
+ * - `device`: The box the device is fitted into, which keeps its shape inside it.
82631
+ * - `empty`: The box over the screen that holds the `empty` slot while no stream is inside and `loading` is not set. It stands beside the screen, so what you put in it takes presses and keys of its own, and a read-only screen does not hide it from screen readers.
82632
+ * - `footer`: The strip below the device.
82633
+ * - `fullscreen`: The button that makes the device fill the screen.
82634
+ * - `fullscreen-button`: The fullscreen button's inner button.
82635
+ * - `fullscreen-live`: The fullscreen button's live region, which speaks while the button is pending.
82636
+ * - `fullscreen-spinner`: The ring the fullscreen button turns while it is pending.
82637
+ * - `fullscreen-text`: The box the fullscreen button's icon sits in.
82638
+ * - `header`: The strip above the device.
82639
+ * - `home`: The Home button.
82640
+ * - `home-button`: The Home button's inner button.
82641
+ * - `home-live`: The Home button's live region, which speaks while the button is pending.
82642
+ * - `home-spinner`: The ring the Home button turns while it is pending.
82643
+ * - `home-text`: The box the Home button's icon sits in.
82644
+ * - `keys-hint`: What a screen reader says about the keys when it reaches the screen, as its description. Read by screen readers only.
82645
+ * - `live`: What screen readers hear while `loading` is set: `loading-label`. Read by screen readers only.
82646
+ * - `loading`: The box over the screen that holds the `loading` slot while `loading` is set. Screen readers hear `live` in its place.
82647
+ * - `picture`: The box the stream is drawn in, turned by `rotation`.
82648
+ * - `power`: The Power button.
82649
+ * - `power-button`: The Power button's inner button.
82650
+ * - `power-live`: The Power button's live region, which speaks while the button is pending.
82651
+ * - `power-spinner`: The ring the Power button turns while it is pending.
82652
+ * - `power-text`: The box the Power button's icon sits in.
82653
+ * - `recents`: The Recent apps button.
82654
+ * - `recents-button`: The Recent apps button's inner button.
82655
+ * - `recents-live`: The Recent apps button's live region, which speaks while the button is pending.
82656
+ * - `recents-spinner`: The ring the Recent apps button turns while it is pending.
82657
+ * - `recents-text`: The box the Recent apps button's icon sits in.
82658
+ * - `region`: The box that holds the device, its buttons, the header, and the footer.
82659
+ * - `rotate-left`: The Rotate left button.
82660
+ * - `rotate-left-button`: The Rotate left button's inner button.
82661
+ * - `rotate-left-live`: The Rotate left button's live region, which speaks while the button is pending.
82662
+ * - `rotate-left-spinner`: The ring the Rotate left button turns while it is pending.
82663
+ * - `rotate-left-text`: The box the Rotate left button's icon sits in.
82664
+ * - `rotate-right`: The Rotate right button.
82665
+ * - `rotate-right-button`: The Rotate right button's inner button.
82666
+ * - `rotate-right-live`: The Rotate right button's live region, which speaks while the button is pending.
82667
+ * - `rotate-right-spinner`: The ring the Rotate right button turns while it is pending.
82668
+ * - `rotate-right-text`: The box the Rotate right button's icon sits in.
82669
+ * - `screen`: The device's screen, which takes the touches and the keys.
82670
+ * - `screenshot`: The button that asks for a screenshot.
82671
+ * - `screenshot-button`: The screenshot button's inner button.
82672
+ * - `screenshot-live`: The screenshot button's live region, which speaks while the button is pending.
82673
+ * - `screenshot-spinner`: The ring the screenshot button turns while it is pending.
82674
+ * - `screenshot-text`: The box the screenshot button's icon sits in.
82675
+ * - `touch`: A ring where a touch is or was.
82676
+ * - `touch-held`: A ring under a finger that is down, beside `touch`, with `show-touches`.
82677
+ * - `volume-down`: The Volume down button.
82678
+ * - `volume-down-button`: The Volume down button's inner button.
82679
+ * - `volume-down-live`: The Volume down button's live region, which speaks while the button is pending.
82680
+ * - `volume-down-spinner`: The ring the Volume down button turns while it is pending.
82681
+ * - `volume-down-text`: The box the Volume down button's icon sits in.
82682
+ * - `volume-up`: The Volume up button.
82683
+ * - `volume-up-button`: The Volume up button's inner button.
82684
+ * - `volume-up-live`: The Volume up button's live region, which speaks while the button is pending.
82685
+ * - `volume-up-spinner`: The ring the Volume up button turns while it is pending.
82686
+ * - `volume-up-text`: The box the Volume up button's icon sits in.
82687
+ *
82688
+ * ## CSS States
82689
+ *
82690
+ * These can be used to apply styling when a component is in a given state.
82691
+ *
82692
+ * - `empty`: No element that draws the stream is inside, which the frame knows once it runs in the browser.
82693
+ * - `fullscreen`: The device fills the screen.
82694
+ * - `loading`: `loading` is set.
82695
+ * - `readonly`: `readonly` is set, and the screen sends nothing.
82696
+ * - `sideways`: `rotation` turns the picture a quarter, so the drawn screen is the device's height wide.
82697
+ * - `touching`: A finger is on the screen.
82698
+ * - `settled`: Set one frame after the first render. Transitions wait for it, so an element does not animate its own arrival.
82699
+ */
82700
+ "helix-headless-device-screen": Partial<
82701
+ HelixHeadlessDeviceScreenProps &
82702
+ HelixHeadlessDeviceScreenSolidJsProps &
82703
+ BaseProps<HelixHeadlessDeviceScreen, "solid"> &
82704
+ BaseEvents<HelixHeadlessDeviceScreen>
82705
+ >;
82706
+
81743
82707
  /**
81744
82708
  * Renders a native `<dialog>` opened with `showModal()`. The platform provides:
81745
82709
  *
@@ -106208,6 +107172,20 @@ export type CustomCssProperties = {
106208
107172
  "--data-table-template"?: (string) | undefined;
106209
107173
  /** How many month columns are drawn, capped at two. `--date-picker-columns` overrides it. */
106210
107174
  "--date-picker-column-count"?: (string) | undefined;
107175
+ /** The drawn screen's width divided by its height, turned by `rotation`, as a number. Written by the frame once the screen's size is known. */
107176
+ "--device-screen-ratio"?: (string) | undefined;
107177
+ /** How far the picture is turned, as an angle. The frame writes it from `rotation`. */
107178
+ "--device-screen-rotation"?: (string) | undefined;
107179
+ /** How long a swipe's ring takes to travel, as a time. Written on each ring from `showSwipe()`. */
107180
+ "--device-screen-touch-duration"?: (string) | undefined;
107181
+ /** Where a swipe's ring travels to, across the screen, as a percentage. Written on each ring from `showSwipe()`. */
107182
+ "--device-screen-touch-to-x"?: (string) | undefined;
107183
+ /** Where a swipe's ring travels to, down the screen, as a percentage. Written on each ring from `showSwipe()`. */
107184
+ "--device-screen-touch-to-y"?: (string) | undefined;
107185
+ /** Where a ring is, across the screen, as a percentage. Written on each ring. */
107186
+ "--device-screen-touch-x"?: (string) | undefined;
107187
+ /** Where a ring is, down the screen, as a percentage. Written on each ring. */
107188
+ "--device-screen-touch-y"?: (string) | undefined;
106211
107189
  /** How thick the ring is drawn, derived from `hole`. */
106212
107190
  "--donut-chart-stroke"?: (string) | undefined;
106213
107191
  /** How far a swipe, or a snap point, has moved the panel across, in pixels, toward the right. */