@fusion.dev/helix 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
@@ -70,6 +70,15 @@ import type {
70
70
  HelixDatePicker,
71
71
  HelixDescriptionList,
72
72
  HelixDescriptionListItem,
73
+ HelixDeviceButtonEvent,
74
+ HelixDeviceKeyEvent,
75
+ HelixDeviceScreen,
76
+ HelixDeviceScreenshotEvent,
77
+ HelixDeviceScrollEvent,
78
+ HelixDeviceSwipeEvent,
79
+ HelixDeviceTapEvent,
80
+ HelixDeviceTextEvent,
81
+ HelixDeviceTouchEvent,
73
82
  HelixDialog,
74
83
  HelixDismissEvent,
75
84
  HelixDivider,
@@ -13995,6 +14004,386 @@ makes the list a named group. */
13995
14004
  textContent?: (string | number) | undefined;
13996
14005
  };
13997
14006
 
14007
+ /** `HelixDeviceScreen` component event */
14008
+ export type HelixDeviceScreenElementEvent<E = Event> = TypedEvent<
14009
+ HelixDeviceScreen,
14010
+ E
14011
+ >;
14012
+ /** `helix-device-button` event type */
14013
+ export type HelixDeviceScreenHelixDeviceButtonElementEvent =
14014
+ HelixDeviceScreenElementEvent<HelixDeviceButtonEvent>;
14015
+ /** `helix-device-key` event type */
14016
+ export type HelixDeviceScreenHelixDeviceKeyElementEvent =
14017
+ HelixDeviceScreenElementEvent<HelixDeviceKeyEvent>;
14018
+ /** `helix-device-screenshot` event type */
14019
+ export type HelixDeviceScreenHelixDeviceScreenshotElementEvent =
14020
+ HelixDeviceScreenElementEvent<HelixDeviceScreenshotEvent>;
14021
+ /** `helix-device-scroll` event type */
14022
+ export type HelixDeviceScreenHelixDeviceScrollElementEvent =
14023
+ HelixDeviceScreenElementEvent<HelixDeviceScrollEvent>;
14024
+ /** `helix-device-swipe` event type */
14025
+ export type HelixDeviceScreenHelixDeviceSwipeElementEvent =
14026
+ HelixDeviceScreenElementEvent<HelixDeviceSwipeEvent>;
14027
+ /** `helix-device-tap` event type */
14028
+ export type HelixDeviceScreenHelixDeviceTapElementEvent =
14029
+ HelixDeviceScreenElementEvent<HelixDeviceTapEvent>;
14030
+ /** `helix-device-text` event type */
14031
+ export type HelixDeviceScreenHelixDeviceTextElementEvent =
14032
+ HelixDeviceScreenElementEvent<HelixDeviceTextEvent>;
14033
+ /** `helix-device-touch` event type */
14034
+ export type HelixDeviceScreenHelixDeviceTouchElementEvent =
14035
+ HelixDeviceScreenElementEvent<HelixDeviceTouchEvent>;
14036
+
14037
+ export type HelixDeviceScreenProps = {
14038
+ /** How the device stands apart from the page. Absent draws its body around
14039
+ the screen; `plain` draws the screen alone, with its rounded corners. */
14040
+ separation?: (HelixDeviceScreen["separation"]) | undefined;
14041
+ /** The Back button's label. */
14042
+ "back-label"?: (HelixDeviceScreen["backLabel"]) | undefined;
14043
+ /** The Back button's label. */
14044
+ backLabel?: (HelixDeviceScreen["backLabel"]) | undefined;
14045
+ /** Which hardware buttons to draw, as a list: `back`, `home`, `recents`,
14046
+ `power`, `volume`, `rotate`, `screenshot`, and `fullscreen`, or `none`.
14047
+ They are drawn in that order whatever order the list is in. Absent is
14048
+ `home screenshot`. `volume` draws Volume up and Volume down, and `rotate`
14049
+ draws Rotate left and Rotate right. */
14050
+ controls?: (HelixDeviceScreen["controls"]) | undefined;
14051
+ /** The name of the toolbar of hardware buttons, read by screen readers. */
14052
+ "controls-label"?: (HelixDeviceScreen["controlsLabel"]) | undefined;
14053
+ /** The name of the toolbar of hardware buttons, read by screen readers. */
14054
+ controlsLabel?: (HelixDeviceScreen["controlsLabel"]) | undefined;
14055
+ /** Which side of the device the hardware buttons sit on. Absent and `top`
14056
+ are a row above it, `bottom` is a row below it, and `start` and `end` are
14057
+ a column beside it, as the Android Emulator draws its toolbar. The words
14058
+ are sides, as Carousel's are, and not the corners a map's controls take. */
14059
+ "controls-placement"?: (HelixDeviceScreen["controlsPlacement"]) | undefined;
14060
+ /** Which side of the device the hardware buttons sit on. Absent and `top`
14061
+ are a row above it, `bottom` is a row below it, and `start` and `end` are
14062
+ a column beside it, as the Android Emulator draws its toolbar. The words
14063
+ are sides, as Carousel's are, and not the corners a map's controls take. */
14064
+ controlsPlacement?: (HelixDeviceScreen["controlsPlacement"]) | undefined;
14065
+ /** The screen's name where `label` is empty and the host has no `aria-label`. */
14066
+ "fallback-label"?: (HelixDeviceScreen["fallbackLabel"]) | undefined;
14067
+ /** The screen's name where `label` is empty and the host has no `aria-label`. */
14068
+ fallbackLabel?: (HelixDeviceScreen["fallbackLabel"]) | undefined;
14069
+ /** Also sends key presses with Control, Command, or Alt held, which are left
14070
+ to the browser otherwise. For an app that owns its window. Command or
14071
+ Control with V pastes either way. */
14072
+ "forward-shortcuts"?: (HelixDeviceScreen["forwardShortcuts"]) | undefined;
14073
+ /** Also sends key presses with Control, Command, or Alt held, which are left
14074
+ to the browser otherwise. For an app that owns its window. Command or
14075
+ Control with V pastes either way. */
14076
+ forwardShortcuts?: (HelixDeviceScreen["forwardShortcuts"]) | undefined;
14077
+ /** The fullscreen button's label. */
14078
+ "fullscreen-label"?: (HelixDeviceScreen["fullscreenLabel"]) | undefined;
14079
+ /** The fullscreen button's label. */
14080
+ fullscreenLabel?: (HelixDeviceScreen["fullscreenLabel"]) | undefined;
14081
+ /** The Home button's label. */
14082
+ "home-label"?: (HelixDeviceScreen["homeLabel"]) | undefined;
14083
+ /** The Home button's label. */
14084
+ homeLabel?: (HelixDeviceScreen["homeLabel"]) | undefined;
14085
+ /** What a screen reader says about the keys when it reaches the screen,
14086
+ after its name. */
14087
+ "keys-hint-label"?: (HelixDeviceScreen["keysHintLabel"]) | undefined;
14088
+ /** What a screen reader says about the keys when it reaches the screen,
14089
+ after its name. */
14090
+ keysHintLabel?: (HelixDeviceScreen["keysHintLabel"]) | undefined;
14091
+ /** The device's name, read by screen readers as the screen's name, such as
14092
+ "iPhone 17 Pro". Name each device on a page with several. Required. */
14093
+ label?: (HelixDeviceScreen["label"]) | undefined;
14094
+ /** Shows the `loading` slot over the screen, for a stream that is starting
14095
+ or has stopped. Screen readers hear `loading-label`. */
14096
+ loading?: (HelixDeviceScreen["loading"]) | undefined;
14097
+ /** What the screen shows and screen readers hear while `loading` is set and nothing is in the `loading` slot. */
14098
+ "loading-label"?: (HelixDeviceScreen["loadingLabel"]) | undefined;
14099
+ /** What the screen shows and screen readers hear while `loading` is set and nothing is in the `loading` slot. */
14100
+ loadingLabel?: (HelixDeviceScreen["loadingLabel"]) | undefined;
14101
+ /** The Power button's label. */
14102
+ "power-label"?: (HelixDeviceScreen["powerLabel"]) | undefined;
14103
+ /** The Power button's label. */
14104
+ powerLabel?: (HelixDeviceScreen["powerLabel"]) | undefined;
14105
+ /** Shows the screen and sends nothing: no touches, scrolls, keys, or button
14106
+ presses. The screen is then a picture, out of the tab order, and the
14107
+ hardware buttons are off but for screenshot and fullscreen. Buttons of
14108
+ your own in the `controls` slot are yours to turn off. */
14109
+ readonly?: (HelixDeviceScreen["readonly"]) | undefined;
14110
+ /** The Recent apps button's label. */
14111
+ "recents-label"?: (HelixDeviceScreen["recentsLabel"]) | undefined;
14112
+ /** The Recent apps button's label. */
14113
+ recentsLabel?: (HelixDeviceScreen["recentsLabel"]) | undefined;
14114
+ /** What a screen reader calls the screen in place of its role, after its
14115
+ name: "iPhone 17 Pro, screen". Empty leaves the role. */
14116
+ "role-label"?: (HelixDeviceScreen["roleLabel"]) | undefined;
14117
+ /** What a screen reader calls the screen in place of its role, after its
14118
+ name: "iPhone 17 Pro, screen". Empty leaves the role. */
14119
+ roleLabel?: (HelixDeviceScreen["roleLabel"]) | undefined;
14120
+ /** The Rotate left button's label. */
14121
+ "rotate-left-label"?: (HelixDeviceScreen["rotateLeftLabel"]) | undefined;
14122
+ /** The Rotate left button's label. */
14123
+ rotateLeftLabel?: (HelixDeviceScreen["rotateLeftLabel"]) | undefined;
14124
+ /** The Rotate right button's label. */
14125
+ "rotate-right-label"?: (HelixDeviceScreen["rotateRightLabel"]) | undefined;
14126
+ /** The Rotate right button's label. */
14127
+ rotateRightLabel?: (HelixDeviceScreen["rotateRightLabel"]) | undefined;
14128
+ /** How far to turn the picture clockwise, in degrees: `90`, `180`, or `270`.
14129
+ For a source that sends frames in the device's natural orientation while
14130
+ the device is turned. Every point is turned back, so events stay in the
14131
+ device's own orientation. A source whose frames turn with the device
14132
+ needs none. */
14133
+ rotation?: (HelixDeviceScreen["rotation"]) | undefined;
14134
+ /** The screen's height in the units your device takes input in: points for
14135
+ the iOS Simulator, pixels for an Android device. Set with `screen-width`.
14136
+ Set alone, the width follows the stream's shape, and with neither, both
14137
+ are the stream's own size in pixels. */
14138
+ "screen-height"?: (HelixDeviceScreen["screenHeight"] | `${number}`) | undefined;
14139
+ /** The screen's height in the units your device takes input in: points for
14140
+ the iOS Simulator, pixels for an Android device. Set with `screen-width`.
14141
+ Set alone, the width follows the stream's shape, and with neither, both
14142
+ are the stream's own size in pixels. */
14143
+ screenHeight?: (HelixDeviceScreen["screenHeight"]) | undefined;
14144
+ /** The screenshot button's label. */
14145
+ "screenshot-label"?: (HelixDeviceScreen["screenshotLabel"]) | undefined;
14146
+ /** The screenshot button's label. */
14147
+ screenshotLabel?: (HelixDeviceScreen["screenshotLabel"]) | undefined;
14148
+ /** The screen's width in the units your device takes input in, as
14149
+ `screen-height` is. Set alone, the height follows the stream's shape. */
14150
+ "screen-width"?: (HelixDeviceScreen["screenWidth"] | `${number}`) | undefined;
14151
+ /** The screen's width in the units your device takes input in, as
14152
+ `screen-height` is. Set alone, the height follows the stream's shape. */
14153
+ screenWidth?: (HelixDeviceScreen["screenWidth"]) | undefined;
14154
+ /** The screen's outline. Absent is a rectangle with rounded corners;
14155
+ `square` has square corners, as on a phone with a Home button or a
14156
+ television, and `circle` is round, as on a round watch, and takes
14157
+ touches inside the circle only. */
14158
+ shape?: (HelixDeviceScreen["shape"]) | undefined;
14159
+ /** Draws a ring under each finger on the screen, as the iOS Simulator's
14160
+ Show single touches does. Rings from `showTap()` and `showSwipe()` are
14161
+ drawn either way. */
14162
+ "show-touches"?: (HelixDeviceScreen["showTouches"]) | undefined;
14163
+ /** Draws a ring under each finger on the screen, as the iOS Simulator's
14164
+ Show single touches does. Rings from `showTap()` and `showSwipe()` are
14165
+ drawn either way. */
14166
+ showTouches?: (HelixDeviceScreen["showTouches"]) | undefined;
14167
+ /** The Volume down button's label. */
14168
+ "volume-down-label"?: (HelixDeviceScreen["volumeDownLabel"]) | undefined;
14169
+ /** The Volume down button's label. */
14170
+ volumeDownLabel?: (HelixDeviceScreen["volumeDownLabel"]) | undefined;
14171
+ /** The Volume up button's label. */
14172
+ "volume-up-label"?: (HelixDeviceScreen["volumeUpLabel"]) | undefined;
14173
+ /** The Volume up button's label. */
14174
+ volumeUpLabel?: (HelixDeviceScreen["volumeUpLabel"]) | undefined;
14175
+
14176
+ /** A hardware button was pressed, with how long it was held. Press it on the device in response. */
14177
+ "onhelix-device-button"?: ((
14178
+ e: HelixDeviceScreenHelixDeviceButtonElementEvent,
14179
+ ) => void) | undefined;
14180
+ /** A key went down or came up while the screen had focus. Press or release it on the device in response. */
14181
+ "onhelix-device-key"?: ((
14182
+ e: HelixDeviceScreenHelixDeviceKeyElementEvent,
14183
+ ) => void) | undefined;
14184
+ /** A screenshot was asked for. Take one in response. */
14185
+ "onhelix-device-screenshot"?: ((
14186
+ e: HelixDeviceScreenHelixDeviceScreenshotElementEvent,
14187
+ ) => void) | undefined;
14188
+ /** A wheel or a trackpad scrolled over the screen. Scroll the device in response. */
14189
+ "onhelix-device-scroll"?: ((
14190
+ e: HelixDeviceScreenHelixDeviceScrollElementEvent,
14191
+ ) => void) | undefined;
14192
+ /** One finger moved across the screen and lifted. Swipe the device in response. */
14193
+ "onhelix-device-swipe"?: ((
14194
+ e: HelixDeviceScreenHelixDeviceSwipeElementEvent,
14195
+ ) => void) | undefined;
14196
+ /** One finger touched the screen and lifted near where it landed. Tap the device in response. */
14197
+ "onhelix-device-tap"?: ((
14198
+ e: HelixDeviceScreenHelixDeviceTapElementEvent,
14199
+ ) => void) | undefined;
14200
+ /** Text was pasted into the screen. Type it on the device in response. */
14201
+ "onhelix-device-text"?: ((
14202
+ e: HelixDeviceScreenHelixDeviceTextElementEvent,
14203
+ ) => void) | undefined;
14204
+ /** A finger landed, moved, lifted, or was taken away. Touch the device in response. */
14205
+ "onhelix-device-touch"?: ((
14206
+ e: HelixDeviceScreenHelixDeviceTouchElementEvent,
14207
+ ) => void) | undefined;
14208
+ };
14209
+
14210
+ export type HelixDeviceScreenSolidJsProps = {
14211
+ /** How the device stands apart from the page. Absent draws its body around
14212
+ the screen; `plain` draws the screen alone, with its rounded corners. */
14213
+ "prop:separation"?: (HelixDeviceScreen["separation"]) | undefined;
14214
+ /** The Back button's label. */
14215
+ "attr:back-label"?: (HelixDeviceScreen["backLabel"]) | undefined;
14216
+ /** The Back button's label. */
14217
+ "prop:backLabel"?: (HelixDeviceScreen["backLabel"]) | undefined;
14218
+ /** Which hardware buttons to draw, as a list: `back`, `home`, `recents`,
14219
+ `power`, `volume`, `rotate`, `screenshot`, and `fullscreen`, or `none`.
14220
+ They are drawn in that order whatever order the list is in. Absent is
14221
+ `home screenshot`. `volume` draws Volume up and Volume down, and `rotate`
14222
+ draws Rotate left and Rotate right. */
14223
+ "prop:controls"?: (HelixDeviceScreen["controls"]) | undefined;
14224
+ /** The name of the toolbar of hardware buttons, read by screen readers. */
14225
+ "attr:controls-label"?: (HelixDeviceScreen["controlsLabel"]) | undefined;
14226
+ /** The name of the toolbar of hardware buttons, read by screen readers. */
14227
+ "prop:controlsLabel"?: (HelixDeviceScreen["controlsLabel"]) | undefined;
14228
+ /** Which side of the device the hardware buttons sit on. Absent and `top`
14229
+ are a row above it, `bottom` is a row below it, and `start` and `end` are
14230
+ a column beside it, as the Android Emulator draws its toolbar. The words
14231
+ are sides, as Carousel's are, and not the corners a map's controls take. */
14232
+ "attr:controls-placement"?: (HelixDeviceScreen["controlsPlacement"]) | undefined;
14233
+ /** Which side of the device the hardware buttons sit on. Absent and `top`
14234
+ are a row above it, `bottom` is a row below it, and `start` and `end` are
14235
+ a column beside it, as the Android Emulator draws its toolbar. The words
14236
+ are sides, as Carousel's are, and not the corners a map's controls take. */
14237
+ "prop:controlsPlacement"?: (HelixDeviceScreen["controlsPlacement"]) | undefined;
14238
+ /** The screen's name where `label` is empty and the host has no `aria-label`. */
14239
+ "attr:fallback-label"?: (HelixDeviceScreen["fallbackLabel"]) | undefined;
14240
+ /** The screen's name where `label` is empty and the host has no `aria-label`. */
14241
+ "prop:fallbackLabel"?: (HelixDeviceScreen["fallbackLabel"]) | undefined;
14242
+ /** Also sends key presses with Control, Command, or Alt held, which are left
14243
+ to the browser otherwise. For an app that owns its window. Command or
14244
+ Control with V pastes either way. */
14245
+ "bool:forward-shortcuts"?: (HelixDeviceScreen["forwardShortcuts"]) | undefined;
14246
+ /** Also sends key presses with Control, Command, or Alt held, which are left
14247
+ to the browser otherwise. For an app that owns its window. Command or
14248
+ Control with V pastes either way. */
14249
+ "prop:forwardShortcuts"?: (HelixDeviceScreen["forwardShortcuts"]) | undefined;
14250
+ /** The fullscreen button's label. */
14251
+ "attr:fullscreen-label"?: (HelixDeviceScreen["fullscreenLabel"]) | undefined;
14252
+ /** The fullscreen button's label. */
14253
+ "prop:fullscreenLabel"?: (HelixDeviceScreen["fullscreenLabel"]) | undefined;
14254
+ /** The Home button's label. */
14255
+ "attr:home-label"?: (HelixDeviceScreen["homeLabel"]) | undefined;
14256
+ /** The Home button's label. */
14257
+ "prop:homeLabel"?: (HelixDeviceScreen["homeLabel"]) | undefined;
14258
+ /** What a screen reader says about the keys when it reaches the screen,
14259
+ after its name. */
14260
+ "attr:keys-hint-label"?: (HelixDeviceScreen["keysHintLabel"]) | undefined;
14261
+ /** What a screen reader says about the keys when it reaches the screen,
14262
+ after its name. */
14263
+ "prop:keysHintLabel"?: (HelixDeviceScreen["keysHintLabel"]) | undefined;
14264
+ /** The device's name, read by screen readers as the screen's name, such as
14265
+ "iPhone 17 Pro". Name each device on a page with several. Required. */
14266
+ "prop:label"?: (HelixDeviceScreen["label"]) | undefined;
14267
+ /** Shows the `loading` slot over the screen, for a stream that is starting
14268
+ or has stopped. Screen readers hear `loading-label`. */
14269
+ "prop:loading"?: (HelixDeviceScreen["loading"]) | undefined;
14270
+ /** What the screen shows and screen readers hear while `loading` is set and nothing is in the `loading` slot. */
14271
+ "attr:loading-label"?: (HelixDeviceScreen["loadingLabel"]) | undefined;
14272
+ /** What the screen shows and screen readers hear while `loading` is set and nothing is in the `loading` slot. */
14273
+ "prop:loadingLabel"?: (HelixDeviceScreen["loadingLabel"]) | undefined;
14274
+ /** The Power button's label. */
14275
+ "attr:power-label"?: (HelixDeviceScreen["powerLabel"]) | undefined;
14276
+ /** The Power button's label. */
14277
+ "prop:powerLabel"?: (HelixDeviceScreen["powerLabel"]) | undefined;
14278
+ /** Shows the screen and sends nothing: no touches, scrolls, keys, or button
14279
+ presses. The screen is then a picture, out of the tab order, and the
14280
+ hardware buttons are off but for screenshot and fullscreen. Buttons of
14281
+ your own in the `controls` slot are yours to turn off. */
14282
+ "prop:readonly"?: (HelixDeviceScreen["readonly"]) | undefined;
14283
+ /** The Recent apps button's label. */
14284
+ "attr:recents-label"?: (HelixDeviceScreen["recentsLabel"]) | undefined;
14285
+ /** The Recent apps button's label. */
14286
+ "prop:recentsLabel"?: (HelixDeviceScreen["recentsLabel"]) | undefined;
14287
+ /** What a screen reader calls the screen in place of its role, after its
14288
+ name: "iPhone 17 Pro, screen". Empty leaves the role. */
14289
+ "attr:role-label"?: (HelixDeviceScreen["roleLabel"]) | undefined;
14290
+ /** What a screen reader calls the screen in place of its role, after its
14291
+ name: "iPhone 17 Pro, screen". Empty leaves the role. */
14292
+ "prop:roleLabel"?: (HelixDeviceScreen["roleLabel"]) | undefined;
14293
+ /** The Rotate left button's label. */
14294
+ "attr:rotate-left-label"?: (HelixDeviceScreen["rotateLeftLabel"]) | undefined;
14295
+ /** The Rotate left button's label. */
14296
+ "prop:rotateLeftLabel"?: (HelixDeviceScreen["rotateLeftLabel"]) | undefined;
14297
+ /** The Rotate right button's label. */
14298
+ "attr:rotate-right-label"?: (HelixDeviceScreen["rotateRightLabel"]) | undefined;
14299
+ /** The Rotate right button's label. */
14300
+ "prop:rotateRightLabel"?: (HelixDeviceScreen["rotateRightLabel"]) | undefined;
14301
+ /** How far to turn the picture clockwise, in degrees: `90`, `180`, or `270`.
14302
+ For a source that sends frames in the device's natural orientation while
14303
+ the device is turned. Every point is turned back, so events stay in the
14304
+ device's own orientation. A source whose frames turn with the device
14305
+ needs none. */
14306
+ "prop:rotation"?: (HelixDeviceScreen["rotation"]) | undefined;
14307
+ /** The screen's height in the units your device takes input in: points for
14308
+ the iOS Simulator, pixels for an Android device. Set with `screen-width`.
14309
+ Set alone, the width follows the stream's shape, and with neither, both
14310
+ are the stream's own size in pixels. */
14311
+ "attr:screen-height"?: (HelixDeviceScreen["screenHeight"] | `${number}`) | undefined;
14312
+ /** The screen's height in the units your device takes input in: points for
14313
+ the iOS Simulator, pixels for an Android device. Set with `screen-width`.
14314
+ Set alone, the width follows the stream's shape, and with neither, both
14315
+ are the stream's own size in pixels. */
14316
+ "prop:screenHeight"?: (HelixDeviceScreen["screenHeight"]) | undefined;
14317
+ /** The screenshot button's label. */
14318
+ "attr:screenshot-label"?: (HelixDeviceScreen["screenshotLabel"]) | undefined;
14319
+ /** The screenshot button's label. */
14320
+ "prop:screenshotLabel"?: (HelixDeviceScreen["screenshotLabel"]) | undefined;
14321
+ /** The screen's width in the units your device takes input in, as
14322
+ `screen-height` is. Set alone, the height follows the stream's shape. */
14323
+ "attr:screen-width"?: (HelixDeviceScreen["screenWidth"] | `${number}`) | undefined;
14324
+ /** The screen's width in the units your device takes input in, as
14325
+ `screen-height` is. Set alone, the height follows the stream's shape. */
14326
+ "prop:screenWidth"?: (HelixDeviceScreen["screenWidth"]) | undefined;
14327
+ /** The screen's outline. Absent is a rectangle with rounded corners;
14328
+ `square` has square corners, as on a phone with a Home button or a
14329
+ television, and `circle` is round, as on a round watch, and takes
14330
+ touches inside the circle only. */
14331
+ "prop:shape"?: (HelixDeviceScreen["shape"]) | undefined;
14332
+ /** Draws a ring under each finger on the screen, as the iOS Simulator's
14333
+ Show single touches does. Rings from `showTap()` and `showSwipe()` are
14334
+ drawn either way. */
14335
+ "bool:show-touches"?: (HelixDeviceScreen["showTouches"]) | undefined;
14336
+ /** Draws a ring under each finger on the screen, as the iOS Simulator's
14337
+ Show single touches does. Rings from `showTap()` and `showSwipe()` are
14338
+ drawn either way. */
14339
+ "prop:showTouches"?: (HelixDeviceScreen["showTouches"]) | undefined;
14340
+ /** The Volume down button's label. */
14341
+ "attr:volume-down-label"?: (HelixDeviceScreen["volumeDownLabel"]) | undefined;
14342
+ /** The Volume down button's label. */
14343
+ "prop:volumeDownLabel"?: (HelixDeviceScreen["volumeDownLabel"]) | undefined;
14344
+ /** The Volume up button's label. */
14345
+ "attr:volume-up-label"?: (HelixDeviceScreen["volumeUpLabel"]) | undefined;
14346
+ /** The Volume up button's label. */
14347
+ "prop:volumeUpLabel"?: (HelixDeviceScreen["volumeUpLabel"]) | undefined;
14348
+ /** A hardware button was pressed, with how long it was held. Press it on the device in response. */
14349
+ "on:helix-device-button"?: ((
14350
+ e: HelixDeviceScreenHelixDeviceButtonElementEvent,
14351
+ ) => void) | undefined;
14352
+ /** A key went down or came up while the screen had focus. Press or release it on the device in response. */
14353
+ "on:helix-device-key"?: ((
14354
+ e: HelixDeviceScreenHelixDeviceKeyElementEvent,
14355
+ ) => void) | undefined;
14356
+ /** A screenshot was asked for. Take one in response. */
14357
+ "on:helix-device-screenshot"?: ((
14358
+ e: HelixDeviceScreenHelixDeviceScreenshotElementEvent,
14359
+ ) => void) | undefined;
14360
+ /** A wheel or a trackpad scrolled over the screen. Scroll the device in response. */
14361
+ "on:helix-device-scroll"?: ((
14362
+ e: HelixDeviceScreenHelixDeviceScrollElementEvent,
14363
+ ) => void) | undefined;
14364
+ /** One finger moved across the screen and lifted. Swipe the device in response. */
14365
+ "on:helix-device-swipe"?: ((
14366
+ e: HelixDeviceScreenHelixDeviceSwipeElementEvent,
14367
+ ) => void) | undefined;
14368
+ /** One finger touched the screen and lifted near where it landed. Tap the device in response. */
14369
+ "on:helix-device-tap"?: ((
14370
+ e: HelixDeviceScreenHelixDeviceTapElementEvent,
14371
+ ) => void) | undefined;
14372
+ /** Text was pasted into the screen. Type it on the device in response. */
14373
+ "on:helix-device-text"?: ((
14374
+ e: HelixDeviceScreenHelixDeviceTextElementEvent,
14375
+ ) => void) | undefined;
14376
+ /** A finger landed, moved, lifted, or was taken away. Touch the device in response. */
14377
+ "on:helix-device-touch"?: ((
14378
+ e: HelixDeviceScreenHelixDeviceTouchElementEvent,
14379
+ ) => void) | undefined;
14380
+
14381
+ /** Set the innerHTML of the element */
14382
+ innerHTML?: (string) | undefined;
14383
+ /** Set the textContent of the element */
14384
+ textContent?: (string | number) | undefined;
14385
+ };
14386
+
13998
14387
  /** `HelixDialog` component event */
13999
14388
  export type HelixDialogElementEvent<E = Event> = TypedEvent<HelixDialog, E>;
14000
14389
  /** `toggle` event type */
@@ -54206,6 +54595,266 @@ export type CustomElements<F extends Framework = "other"> = {
54206
54595
  HelixDescriptionListProps & BaseProps<HelixDescriptionList, F> & BaseEvents<HelixDescriptionList>
54207
54596
  >;
54208
54597
 
54598
+ /**
54599
+ * The styled device: a dark body around a screen with rounded corners, fitted
54600
+ * to the space it is given, with its hardware buttons raised in a row above
54601
+ * it. Give it a height with `block-size` or `--device-screen-block-size`, such
54602
+ * as `100%` to fill a pane, and the device keeps its shape inside it.
54603
+ *
54604
+ * The body is drawn in proportion to the screen, so it keeps its look at any
54605
+ * size. `--device-screen-bezel` sets how thick it is at the sides and
54606
+ * `--device-screen-bezel-block` at the top and bottom, each as a fraction of
54607
+ * the screen's width: `0.25` at the top and bottom draws the forehead and chin
54608
+ * of a phone with a Home button. `--device-screen-radius` sets the screen's
54609
+ * corners the same way. Set `separation="plain"` to draw the screen alone.
54610
+ *
54611
+ * For a picture of a real device, put an image of it with a clear screen in
54612
+ * the `bezel` slot, set `--device-screen-bezel-color` to `transparent`, and
54613
+ * set the two bezel properties to the picture's own margins around its screen,
54614
+ * each divided by the width of its screen.
54615
+ *
54616
+ * ## Attributes & Properties
54617
+ *
54618
+ * Component attributes and properties that can be applied to the element or by using JavaScript.
54619
+ *
54620
+ * - `separation`: How the device stands apart from the page. Absent draws its body around
54621
+ * the screen; `plain` draws the screen alone, with its rounded corners.
54622
+ * - `back-label`/`backLabel`: The Back button's label.
54623
+ * - `controls`: Which hardware buttons to draw, as a list: `back`, `home`, `recents`,
54624
+ * `power`, `volume`, `rotate`, `screenshot`, and `fullscreen`, or `none`.
54625
+ * They are drawn in that order whatever order the list is in. Absent is
54626
+ * `home screenshot`. `volume` draws Volume up and Volume down, and `rotate`
54627
+ * draws Rotate left and Rotate right.
54628
+ * - `controls-label`/`controlsLabel`: The name of the toolbar of hardware buttons, read by screen readers.
54629
+ * - `controls-placement`/`controlsPlacement`: Which side of the device the hardware buttons sit on. Absent and `top`
54630
+ * are a row above it, `bottom` is a row below it, and `start` and `end` are
54631
+ * a column beside it, as the Android Emulator draws its toolbar. The words
54632
+ * are sides, as Carousel's are, and not the corners a map's controls take.
54633
+ * - `fallback-label`/`fallbackLabel`: The screen's name where `label` is empty and the host has no `aria-label`.
54634
+ * - `forward-shortcuts`/`forwardShortcuts`: Also sends key presses with Control, Command, or Alt held, which are left
54635
+ * to the browser otherwise. For an app that owns its window. Command or
54636
+ * Control with V pastes either way.
54637
+ * - `fullscreen-label`/`fullscreenLabel`: The fullscreen button's label.
54638
+ * - `home-label`/`homeLabel`: The Home button's label.
54639
+ * - `keys-hint-label`/`keysHintLabel`: What a screen reader says about the keys when it reaches the screen,
54640
+ * after its name.
54641
+ * - `label`: The device's name, read by screen readers as the screen's name, such as
54642
+ * "iPhone 17 Pro". Name each device on a page with several. Required.
54643
+ * - `loading`: Shows the `loading` slot over the screen, for a stream that is starting
54644
+ * or has stopped. Screen readers hear `loading-label`.
54645
+ * - `loading-label`/`loadingLabel`: What the screen shows and screen readers hear while `loading` is set and nothing is in the `loading` slot.
54646
+ * - `power-label`/`powerLabel`: The Power button's label.
54647
+ * - `readonly`: Shows the screen and sends nothing: no touches, scrolls, keys, or button
54648
+ * presses. The screen is then a picture, out of the tab order, and the
54649
+ * hardware buttons are off but for screenshot and fullscreen. Buttons of
54650
+ * your own in the `controls` slot are yours to turn off.
54651
+ * - `recents-label`/`recentsLabel`: The Recent apps button's label.
54652
+ * - `role-label`/`roleLabel`: What a screen reader calls the screen in place of its role, after its
54653
+ * name: "iPhone 17 Pro, screen". Empty leaves the role.
54654
+ * - `rotate-left-label`/`rotateLeftLabel`: The Rotate left button's label.
54655
+ * - `rotate-right-label`/`rotateRightLabel`: The Rotate right button's label.
54656
+ * - `rotation`: How far to turn the picture clockwise, in degrees: `90`, `180`, or `270`.
54657
+ * For a source that sends frames in the device's natural orientation while
54658
+ * the device is turned. Every point is turned back, so events stay in the
54659
+ * device's own orientation. A source whose frames turn with the device
54660
+ * needs none.
54661
+ * - `screen-height`/`screenHeight`: The screen's height in the units your device takes input in: points for
54662
+ * the iOS Simulator, pixels for an Android device. Set with `screen-width`.
54663
+ * Set alone, the width follows the stream's shape, and with neither, both
54664
+ * are the stream's own size in pixels.
54665
+ * - `screenshot-label`/`screenshotLabel`: The screenshot button's label.
54666
+ * - `screen-width`/`screenWidth`: The screen's width in the units your device takes input in, as
54667
+ * `screen-height` is. Set alone, the height follows the stream's shape.
54668
+ * - `shape`: The screen's outline. Absent is a rectangle with rounded corners;
54669
+ * `square` has square corners, as on a phone with a Home button or a
54670
+ * television, and `circle` is round, as on a round watch, and takes
54671
+ * touches inside the circle only.
54672
+ * - `show-touches`/`showTouches`: Draws a ring under each finger on the screen, as the iOS Simulator's
54673
+ * Show single touches does. Rings from `showTap()` and `showSwipe()` are
54674
+ * drawn either way.
54675
+ * - `volume-down-label`/`volumeDownLabel`: The Volume down button's label.
54676
+ * - `volume-up-label`/`volumeUpLabel`: The Volume up button's label.
54677
+ * - `whenSettled`: Resolves a frame after the first update, when transitions are switched on.
54678
+ *
54679
+ * **Named `whenSettled` because `settled` is taken four times over**, by
54680
+ * Image, Splitter and both color controls, none of them about transitions. A
54681
+ * base class takes the name every subclass then cannot use.
54682
+ *
54683
+ * **The state it reports cannot be watched, which is why this exists.** A
54684
+ * custom state is deliberately not in the DOM, so there is no
54685
+ * `MutationObserver` equivalent for `ElementInternals.states`. Await this
54686
+ * instead.
54687
+ *
54688
+ * Separate from `updateComplete`, which resolves in the microtask checkpoint
54689
+ * the suppression is still active in. That is the distinction `readyToMove`
54690
+ * in `@fusion.dev/helix-testing` is written around.
54691
+ *
54692
+ * It never resolves where `requestAnimationFrame` never fires, which is a
54693
+ * server, a hidden tab, and happy-dom. Callers that must not hang there race
54694
+ * it against a timeout, as the happy-dom harness's `readyToMove` does. The
54695
+ * browser harness's awaits it alone: a browser always runs the frame, and a
54696
+ * timer beside it was a bet on how long one takes, which a busy run lost. (property only) (readonly)
54697
+ *
54698
+ * ## Events
54699
+ *
54700
+ * Events that will be emitted by the component.
54701
+ *
54702
+ * - `helix-device-button`: A hardware button was pressed, with how long it was held. Press it on the device in response.
54703
+ * - `helix-device-key`: A key went down or came up while the screen had focus. Press or release it on the device in response.
54704
+ * - `helix-device-screenshot`: A screenshot was asked for. Take one in response.
54705
+ * - `helix-device-scroll`: A wheel or a trackpad scrolled over the screen. Scroll the device in response.
54706
+ * - `helix-device-swipe`: One finger moved across the screen and lifted. Swipe the device in response.
54707
+ * - `helix-device-tap`: One finger touched the screen and lifted near where it landed. Tap the device in response.
54708
+ * - `helix-device-text`: Text was pasted into the screen. Type it on the device in response.
54709
+ * - `helix-device-touch`: A finger landed, moved, lifted, or was taken away. Touch the device in response.
54710
+ *
54711
+ * ## Slots
54712
+ *
54713
+ * Areas where markup can be added to the component.
54714
+ *
54715
+ * - `(default)`: The element that draws the stream: a `<video>`, an `<img>`, or a `<canvas>`.
54716
+ * - `back-icon`: Replaces the glyph inside the Back button.
54717
+ * - `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.
54718
+ * - `controls`: Buttons of your own, such as Shake or Record, in the row after the hardware buttons and before the fullscreen button.
54719
+ * - `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.
54720
+ * - `footer`: Content below the device.
54721
+ * - `fullscreen-icon`: Replaces the glyph inside the fullscreen button.
54722
+ * - `header`: Content above the device, such as its name and state.
54723
+ * - `home-icon`: Replaces the glyph inside the Home button.
54724
+ * - `loading`: Content shown over the screen while `loading` is set, such as a spinner. `loading-label` by default, which screen readers hear either way.
54725
+ * - `power-icon`: Replaces the glyph inside the Power button.
54726
+ * - `recents-icon`: Replaces the glyph inside the Recent apps button.
54727
+ * - `rotate-left-icon`: Replaces the glyph inside the Rotate left button.
54728
+ * - `rotate-right-icon`: Replaces the glyph inside the Rotate right button.
54729
+ * - `screenshot-icon`: Replaces the glyph inside the screenshot button.
54730
+ * - `volume-down-icon`: Replaces the glyph inside the Volume down button.
54731
+ * - `volume-up-icon`: Replaces the glyph inside the Volume up button.
54732
+ *
54733
+ * ## Methods
54734
+ *
54735
+ * Methods that can be called to access component functionality.
54736
+ *
54737
+ * - `press(button: DeviceButton, duration = 0) => void`: Presses a hardware button, as its control does: sends
54738
+ * `helix-device-button`. `duration` is how long it is held, in
54739
+ * milliseconds.
54740
+ * - `screenshot() => void`: Asks for a screenshot, as the screenshot button does: sends `helix-device-screenshot`.
54741
+ * - `capture(type = 'image/png', quality?: number) => Promise<Blob>`: The picture on the screen now, as an image, at the stream's own size and
54742
+ * turned by `rotation`. For a page with no sharper screenshot from its
54743
+ * source.
54744
+ *
54745
+ * Fails where there is no stream, where it has not drawn a frame, and where
54746
+ * the browser will not let a page read it, such as an image from another
54747
+ * origin served without CORS.
54748
+ * - `showTap(x: number, y: number) => void`: Draws a ring at a point on the screen for a moment, in the device's
54749
+ * units, for a touch made elsewhere, such as by an agent. Drawn whether or
54750
+ * not `show-touches` is set, and nothing is sent.
54751
+ * - `showSwipe(fromX: number, fromY: number, toX: number, toY: number, duration = 300) => void`: Draws a ring that travels from one point to another over `duration`
54752
+ * milliseconds, in the device's units, for a swipe made elsewhere, as
54753
+ * `showTap()` does for a tap.
54754
+ *
54755
+ * ## CSS Custom Properties
54756
+ *
54757
+ * CSS variables available for styling the component.
54758
+ *
54759
+ * - `--device-screen-bezel`: How thick the body is at the sides, as a fraction of the screen's width. `0.045` by default.
54760
+ * - `--device-screen-bezel-block`: How thick the body is at the top and bottom, as a fraction of the screen's width. The same as `--device-screen-bezel` by default.
54761
+ * - `--device-screen-bezel-color`: The color of the body around the screen.
54762
+ * - `--device-screen-bezel-radius`: The body's corners, as a fraction of the screen's width. Round with the screen's corners by default.
54763
+ * - `--device-screen-block-size`: The element's height, which holds the device, its buttons, the header, and the footer. `36rem` by default.
54764
+ * - `--device-screen-radius`: The screen's corners, as a fraction of the screen's width. `0.13` by default, which is near a recent iPhone's.
54765
+ * - `--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.
54766
+ * - `--device-screen-rotation`: How far the picture is turned, as an angle. The frame writes it from `rotation`.
54767
+ * - `--device-screen-touch-duration`: How long a swipe's ring takes to travel, as a time. Written on each ring from `showSwipe()`.
54768
+ * - `--device-screen-touch-to-x`: Where a swipe's ring travels to, across the screen, as a percentage. Written on each ring from `showSwipe()`.
54769
+ * - `--device-screen-touch-to-y`: Where a swipe's ring travels to, down the screen, as a percentage. Written on each ring from `showSwipe()`.
54770
+ * - `--device-screen-touch-x`: Where a ring is, across the screen, as a percentage. Written on each ring.
54771
+ * - `--device-screen-touch-y`: Where a ring is, down the screen, as a percentage. Written on each ring.
54772
+ *
54773
+ * ## CSS Parts
54774
+ *
54775
+ * Custom selectors for styling elements within the component.
54776
+ *
54777
+ * - `back`: The Back button.
54778
+ * - `back-button`: The Back button's inner button.
54779
+ * - `back-live`: The Back button's live region, which speaks while the button is pending.
54780
+ * - `back-spinner`: The ring the Back button turns while it is pending.
54781
+ * - `back-text`: The box the Back button's icon sits in.
54782
+ * - `bezel`: The body of the device around the screen.
54783
+ * - `controls`: The row of buttons: the hardware buttons and any of yours in the `controls` slot.
54784
+ * - `device`: The box the device is fitted into, which keeps its shape inside it.
54785
+ * - `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.
54786
+ * - `footer`: The strip below the device.
54787
+ * - `fullscreen`: The button that makes the device fill the screen.
54788
+ * - `fullscreen-button`: The fullscreen button's inner button.
54789
+ * - `fullscreen-live`: The fullscreen button's live region, which speaks while the button is pending.
54790
+ * - `fullscreen-spinner`: The ring the fullscreen button turns while it is pending.
54791
+ * - `fullscreen-text`: The box the fullscreen button's icon sits in.
54792
+ * - `header`: The strip above the device.
54793
+ * - `home`: The Home button.
54794
+ * - `home-button`: The Home button's inner button.
54795
+ * - `home-live`: The Home button's live region, which speaks while the button is pending.
54796
+ * - `home-spinner`: The ring the Home button turns while it is pending.
54797
+ * - `home-text`: The box the Home button's icon sits in.
54798
+ * - `keys-hint`: What a screen reader says about the keys when it reaches the screen, as its description. Read by screen readers only.
54799
+ * - `live`: What screen readers hear while `loading` is set: `loading-label`. Read by screen readers only.
54800
+ * - `loading`: The box over the screen that holds the `loading` slot while `loading` is set. Screen readers hear `live` in its place.
54801
+ * - `picture`: The box the stream is drawn in, turned by `rotation`.
54802
+ * - `power`: The Power button.
54803
+ * - `power-button`: The Power button's inner button.
54804
+ * - `power-live`: The Power button's live region, which speaks while the button is pending.
54805
+ * - `power-spinner`: The ring the Power button turns while it is pending.
54806
+ * - `power-text`: The box the Power button's icon sits in.
54807
+ * - `recents`: The Recent apps button.
54808
+ * - `recents-button`: The Recent apps button's inner button.
54809
+ * - `recents-live`: The Recent apps button's live region, which speaks while the button is pending.
54810
+ * - `recents-spinner`: The ring the Recent apps button turns while it is pending.
54811
+ * - `recents-text`: The box the Recent apps button's icon sits in.
54812
+ * - `region`: The box that holds the device, its buttons, the header, and the footer.
54813
+ * - `rotate-left`: The Rotate left button.
54814
+ * - `rotate-left-button`: The Rotate left button's inner button.
54815
+ * - `rotate-left-live`: The Rotate left button's live region, which speaks while the button is pending.
54816
+ * - `rotate-left-spinner`: The ring the Rotate left button turns while it is pending.
54817
+ * - `rotate-left-text`: The box the Rotate left button's icon sits in.
54818
+ * - `rotate-right`: The Rotate right button.
54819
+ * - `rotate-right-button`: The Rotate right button's inner button.
54820
+ * - `rotate-right-live`: The Rotate right button's live region, which speaks while the button is pending.
54821
+ * - `rotate-right-spinner`: The ring the Rotate right button turns while it is pending.
54822
+ * - `rotate-right-text`: The box the Rotate right button's icon sits in.
54823
+ * - `screen`: The device's screen, which takes the touches and the keys.
54824
+ * - `screenshot`: The button that asks for a screenshot.
54825
+ * - `screenshot-button`: The screenshot button's inner button.
54826
+ * - `screenshot-live`: The screenshot button's live region, which speaks while the button is pending.
54827
+ * - `screenshot-spinner`: The ring the screenshot button turns while it is pending.
54828
+ * - `screenshot-text`: The box the screenshot button's icon sits in.
54829
+ * - `touch`: A ring where a touch is or was.
54830
+ * - `touch-held`: A ring under a finger that is down, beside `touch`, with `show-touches`.
54831
+ * - `volume-down`: The Volume down button.
54832
+ * - `volume-down-button`: The Volume down button's inner button.
54833
+ * - `volume-down-live`: The Volume down button's live region, which speaks while the button is pending.
54834
+ * - `volume-down-spinner`: The ring the Volume down button turns while it is pending.
54835
+ * - `volume-down-text`: The box the Volume down button's icon sits in.
54836
+ * - `volume-up`: The Volume up button.
54837
+ * - `volume-up-button`: The Volume up button's inner button.
54838
+ * - `volume-up-live`: The Volume up button's live region, which speaks while the button is pending.
54839
+ * - `volume-up-spinner`: The ring the Volume up button turns while it is pending.
54840
+ * - `volume-up-text`: The box the Volume up button's icon sits in.
54841
+ *
54842
+ * ## CSS States
54843
+ *
54844
+ * These can be used to apply styling when a component is in a given state.
54845
+ *
54846
+ * - `empty`: No element that draws the stream is inside, which the frame knows once it runs in the browser.
54847
+ * - `fullscreen`: The device fills the screen.
54848
+ * - `loading`: `loading` is set.
54849
+ * - `readonly`: `readonly` is set, and the screen sends nothing.
54850
+ * - `sideways`: `rotation` turns the picture a quarter, so the drawn screen is the device's height wide.
54851
+ * - `touching`: A finger is on the screen.
54852
+ * - `settled`: Set one frame after the first render. Transitions wait for it, so an element does not animate its own arrival.
54853
+ */
54854
+ "helix-device-screen": Partial<
54855
+ HelixDeviceScreenProps & BaseProps<HelixDeviceScreen, F> & BaseEvents<HelixDeviceScreen>
54856
+ >;
54857
+
54209
54858
  /**
54210
54859
  * The panel uses `surface-overlay` with a shadow, because it sits over the
54211
54860
  * page. The scrim is drawn on `::backdrop`, the platform's element for it,
@@ -86856,6 +87505,269 @@ export type CustomElementsSolidJs = {
86856
87505
  BaseEvents<HelixDescriptionList>
86857
87506
  >;
86858
87507
 
87508
+ /**
87509
+ * The styled device: a dark body around a screen with rounded corners, fitted
87510
+ * to the space it is given, with its hardware buttons raised in a row above
87511
+ * it. Give it a height with `block-size` or `--device-screen-block-size`, such
87512
+ * as `100%` to fill a pane, and the device keeps its shape inside it.
87513
+ *
87514
+ * The body is drawn in proportion to the screen, so it keeps its look at any
87515
+ * size. `--device-screen-bezel` sets how thick it is at the sides and
87516
+ * `--device-screen-bezel-block` at the top and bottom, each as a fraction of
87517
+ * the screen's width: `0.25` at the top and bottom draws the forehead and chin
87518
+ * of a phone with a Home button. `--device-screen-radius` sets the screen's
87519
+ * corners the same way. Set `separation="plain"` to draw the screen alone.
87520
+ *
87521
+ * For a picture of a real device, put an image of it with a clear screen in
87522
+ * the `bezel` slot, set `--device-screen-bezel-color` to `transparent`, and
87523
+ * set the two bezel properties to the picture's own margins around its screen,
87524
+ * each divided by the width of its screen.
87525
+ *
87526
+ * ## Attributes & Properties
87527
+ *
87528
+ * Component attributes and properties that can be applied to the element or by using JavaScript.
87529
+ *
87530
+ * - `separation`: How the device stands apart from the page. Absent draws its body around
87531
+ * the screen; `plain` draws the screen alone, with its rounded corners.
87532
+ * - `back-label`/`backLabel`: The Back button's label.
87533
+ * - `controls`: Which hardware buttons to draw, as a list: `back`, `home`, `recents`,
87534
+ * `power`, `volume`, `rotate`, `screenshot`, and `fullscreen`, or `none`.
87535
+ * They are drawn in that order whatever order the list is in. Absent is
87536
+ * `home screenshot`. `volume` draws Volume up and Volume down, and `rotate`
87537
+ * draws Rotate left and Rotate right.
87538
+ * - `controls-label`/`controlsLabel`: The name of the toolbar of hardware buttons, read by screen readers.
87539
+ * - `controls-placement`/`controlsPlacement`: Which side of the device the hardware buttons sit on. Absent and `top`
87540
+ * are a row above it, `bottom` is a row below it, and `start` and `end` are
87541
+ * a column beside it, as the Android Emulator draws its toolbar. The words
87542
+ * are sides, as Carousel's are, and not the corners a map's controls take.
87543
+ * - `fallback-label`/`fallbackLabel`: The screen's name where `label` is empty and the host has no `aria-label`.
87544
+ * - `forward-shortcuts`/`forwardShortcuts`: Also sends key presses with Control, Command, or Alt held, which are left
87545
+ * to the browser otherwise. For an app that owns its window. Command or
87546
+ * Control with V pastes either way.
87547
+ * - `fullscreen-label`/`fullscreenLabel`: The fullscreen button's label.
87548
+ * - `home-label`/`homeLabel`: The Home button's label.
87549
+ * - `keys-hint-label`/`keysHintLabel`: What a screen reader says about the keys when it reaches the screen,
87550
+ * after its name.
87551
+ * - `label`: The device's name, read by screen readers as the screen's name, such as
87552
+ * "iPhone 17 Pro". Name each device on a page with several. Required.
87553
+ * - `loading`: Shows the `loading` slot over the screen, for a stream that is starting
87554
+ * or has stopped. Screen readers hear `loading-label`.
87555
+ * - `loading-label`/`loadingLabel`: What the screen shows and screen readers hear while `loading` is set and nothing is in the `loading` slot.
87556
+ * - `power-label`/`powerLabel`: The Power button's label.
87557
+ * - `readonly`: Shows the screen and sends nothing: no touches, scrolls, keys, or button
87558
+ * presses. The screen is then a picture, out of the tab order, and the
87559
+ * hardware buttons are off but for screenshot and fullscreen. Buttons of
87560
+ * your own in the `controls` slot are yours to turn off.
87561
+ * - `recents-label`/`recentsLabel`: The Recent apps button's label.
87562
+ * - `role-label`/`roleLabel`: What a screen reader calls the screen in place of its role, after its
87563
+ * name: "iPhone 17 Pro, screen". Empty leaves the role.
87564
+ * - `rotate-left-label`/`rotateLeftLabel`: The Rotate left button's label.
87565
+ * - `rotate-right-label`/`rotateRightLabel`: The Rotate right button's label.
87566
+ * - `rotation`: How far to turn the picture clockwise, in degrees: `90`, `180`, or `270`.
87567
+ * For a source that sends frames in the device's natural orientation while
87568
+ * the device is turned. Every point is turned back, so events stay in the
87569
+ * device's own orientation. A source whose frames turn with the device
87570
+ * needs none.
87571
+ * - `screen-height`/`screenHeight`: The screen's height in the units your device takes input in: points for
87572
+ * the iOS Simulator, pixels for an Android device. Set with `screen-width`.
87573
+ * Set alone, the width follows the stream's shape, and with neither, both
87574
+ * are the stream's own size in pixels.
87575
+ * - `screenshot-label`/`screenshotLabel`: The screenshot button's label.
87576
+ * - `screen-width`/`screenWidth`: The screen's width in the units your device takes input in, as
87577
+ * `screen-height` is. Set alone, the height follows the stream's shape.
87578
+ * - `shape`: The screen's outline. Absent is a rectangle with rounded corners;
87579
+ * `square` has square corners, as on a phone with a Home button or a
87580
+ * television, and `circle` is round, as on a round watch, and takes
87581
+ * touches inside the circle only.
87582
+ * - `show-touches`/`showTouches`: Draws a ring under each finger on the screen, as the iOS Simulator's
87583
+ * Show single touches does. Rings from `showTap()` and `showSwipe()` are
87584
+ * drawn either way.
87585
+ * - `volume-down-label`/`volumeDownLabel`: The Volume down button's label.
87586
+ * - `volume-up-label`/`volumeUpLabel`: The Volume up button's label.
87587
+ * - `whenSettled`: Resolves a frame after the first update, when transitions are switched on.
87588
+ *
87589
+ * **Named `whenSettled` because `settled` is taken four times over**, by
87590
+ * Image, Splitter and both color controls, none of them about transitions. A
87591
+ * base class takes the name every subclass then cannot use.
87592
+ *
87593
+ * **The state it reports cannot be watched, which is why this exists.** A
87594
+ * custom state is deliberately not in the DOM, so there is no
87595
+ * `MutationObserver` equivalent for `ElementInternals.states`. Await this
87596
+ * instead.
87597
+ *
87598
+ * Separate from `updateComplete`, which resolves in the microtask checkpoint
87599
+ * the suppression is still active in. That is the distinction `readyToMove`
87600
+ * in `@fusion.dev/helix-testing` is written around.
87601
+ *
87602
+ * It never resolves where `requestAnimationFrame` never fires, which is a
87603
+ * server, a hidden tab, and happy-dom. Callers that must not hang there race
87604
+ * it against a timeout, as the happy-dom harness's `readyToMove` does. The
87605
+ * browser harness's awaits it alone: a browser always runs the frame, and a
87606
+ * timer beside it was a bet on how long one takes, which a busy run lost. (property only) (readonly)
87607
+ *
87608
+ * ## Events
87609
+ *
87610
+ * Events that will be emitted by the component.
87611
+ *
87612
+ * - `helix-device-button`: A hardware button was pressed, with how long it was held. Press it on the device in response.
87613
+ * - `helix-device-key`: A key went down or came up while the screen had focus. Press or release it on the device in response.
87614
+ * - `helix-device-screenshot`: A screenshot was asked for. Take one in response.
87615
+ * - `helix-device-scroll`: A wheel or a trackpad scrolled over the screen. Scroll the device in response.
87616
+ * - `helix-device-swipe`: One finger moved across the screen and lifted. Swipe the device in response.
87617
+ * - `helix-device-tap`: One finger touched the screen and lifted near where it landed. Tap the device in response.
87618
+ * - `helix-device-text`: Text was pasted into the screen. Type it on the device in response.
87619
+ * - `helix-device-touch`: A finger landed, moved, lifted, or was taken away. Touch the device in response.
87620
+ *
87621
+ * ## Slots
87622
+ *
87623
+ * Areas where markup can be added to the component.
87624
+ *
87625
+ * - `(default)`: The element that draws the stream: a `<video>`, an `<img>`, or a `<canvas>`.
87626
+ * - `back-icon`: Replaces the glyph inside the Back button.
87627
+ * - `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.
87628
+ * - `controls`: Buttons of your own, such as Shake or Record, in the row after the hardware buttons and before the fullscreen button.
87629
+ * - `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.
87630
+ * - `footer`: Content below the device.
87631
+ * - `fullscreen-icon`: Replaces the glyph inside the fullscreen button.
87632
+ * - `header`: Content above the device, such as its name and state.
87633
+ * - `home-icon`: Replaces the glyph inside the Home button.
87634
+ * - `loading`: Content shown over the screen while `loading` is set, such as a spinner. `loading-label` by default, which screen readers hear either way.
87635
+ * - `power-icon`: Replaces the glyph inside the Power button.
87636
+ * - `recents-icon`: Replaces the glyph inside the Recent apps button.
87637
+ * - `rotate-left-icon`: Replaces the glyph inside the Rotate left button.
87638
+ * - `rotate-right-icon`: Replaces the glyph inside the Rotate right button.
87639
+ * - `screenshot-icon`: Replaces the glyph inside the screenshot button.
87640
+ * - `volume-down-icon`: Replaces the glyph inside the Volume down button.
87641
+ * - `volume-up-icon`: Replaces the glyph inside the Volume up button.
87642
+ *
87643
+ * ## Methods
87644
+ *
87645
+ * Methods that can be called to access component functionality.
87646
+ *
87647
+ * - `press(button: DeviceButton, duration = 0) => void`: Presses a hardware button, as its control does: sends
87648
+ * `helix-device-button`. `duration` is how long it is held, in
87649
+ * milliseconds.
87650
+ * - `screenshot() => void`: Asks for a screenshot, as the screenshot button does: sends `helix-device-screenshot`.
87651
+ * - `capture(type = 'image/png', quality?: number) => Promise<Blob>`: The picture on the screen now, as an image, at the stream's own size and
87652
+ * turned by `rotation`. For a page with no sharper screenshot from its
87653
+ * source.
87654
+ *
87655
+ * Fails where there is no stream, where it has not drawn a frame, and where
87656
+ * the browser will not let a page read it, such as an image from another
87657
+ * origin served without CORS.
87658
+ * - `showTap(x: number, y: number) => void`: Draws a ring at a point on the screen for a moment, in the device's
87659
+ * units, for a touch made elsewhere, such as by an agent. Drawn whether or
87660
+ * not `show-touches` is set, and nothing is sent.
87661
+ * - `showSwipe(fromX: number, fromY: number, toX: number, toY: number, duration = 300) => void`: Draws a ring that travels from one point to another over `duration`
87662
+ * milliseconds, in the device's units, for a swipe made elsewhere, as
87663
+ * `showTap()` does for a tap.
87664
+ *
87665
+ * ## CSS Custom Properties
87666
+ *
87667
+ * CSS variables available for styling the component.
87668
+ *
87669
+ * - `--device-screen-bezel`: How thick the body is at the sides, as a fraction of the screen's width. `0.045` by default.
87670
+ * - `--device-screen-bezel-block`: How thick the body is at the top and bottom, as a fraction of the screen's width. The same as `--device-screen-bezel` by default.
87671
+ * - `--device-screen-bezel-color`: The color of the body around the screen.
87672
+ * - `--device-screen-bezel-radius`: The body's corners, as a fraction of the screen's width. Round with the screen's corners by default.
87673
+ * - `--device-screen-block-size`: The element's height, which holds the device, its buttons, the header, and the footer. `36rem` by default.
87674
+ * - `--device-screen-radius`: The screen's corners, as a fraction of the screen's width. `0.13` by default, which is near a recent iPhone's.
87675
+ * - `--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.
87676
+ * - `--device-screen-rotation`: How far the picture is turned, as an angle. The frame writes it from `rotation`.
87677
+ * - `--device-screen-touch-duration`: How long a swipe's ring takes to travel, as a time. Written on each ring from `showSwipe()`.
87678
+ * - `--device-screen-touch-to-x`: Where a swipe's ring travels to, across the screen, as a percentage. Written on each ring from `showSwipe()`.
87679
+ * - `--device-screen-touch-to-y`: Where a swipe's ring travels to, down the screen, as a percentage. Written on each ring from `showSwipe()`.
87680
+ * - `--device-screen-touch-x`: Where a ring is, across the screen, as a percentage. Written on each ring.
87681
+ * - `--device-screen-touch-y`: Where a ring is, down the screen, as a percentage. Written on each ring.
87682
+ *
87683
+ * ## CSS Parts
87684
+ *
87685
+ * Custom selectors for styling elements within the component.
87686
+ *
87687
+ * - `back`: The Back button.
87688
+ * - `back-button`: The Back button's inner button.
87689
+ * - `back-live`: The Back button's live region, which speaks while the button is pending.
87690
+ * - `back-spinner`: The ring the Back button turns while it is pending.
87691
+ * - `back-text`: The box the Back button's icon sits in.
87692
+ * - `bezel`: The body of the device around the screen.
87693
+ * - `controls`: The row of buttons: the hardware buttons and any of yours in the `controls` slot.
87694
+ * - `device`: The box the device is fitted into, which keeps its shape inside it.
87695
+ * - `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.
87696
+ * - `footer`: The strip below the device.
87697
+ * - `fullscreen`: The button that makes the device fill the screen.
87698
+ * - `fullscreen-button`: The fullscreen button's inner button.
87699
+ * - `fullscreen-live`: The fullscreen button's live region, which speaks while the button is pending.
87700
+ * - `fullscreen-spinner`: The ring the fullscreen button turns while it is pending.
87701
+ * - `fullscreen-text`: The box the fullscreen button's icon sits in.
87702
+ * - `header`: The strip above the device.
87703
+ * - `home`: The Home button.
87704
+ * - `home-button`: The Home button's inner button.
87705
+ * - `home-live`: The Home button's live region, which speaks while the button is pending.
87706
+ * - `home-spinner`: The ring the Home button turns while it is pending.
87707
+ * - `home-text`: The box the Home button's icon sits in.
87708
+ * - `keys-hint`: What a screen reader says about the keys when it reaches the screen, as its description. Read by screen readers only.
87709
+ * - `live`: What screen readers hear while `loading` is set: `loading-label`. Read by screen readers only.
87710
+ * - `loading`: The box over the screen that holds the `loading` slot while `loading` is set. Screen readers hear `live` in its place.
87711
+ * - `picture`: The box the stream is drawn in, turned by `rotation`.
87712
+ * - `power`: The Power button.
87713
+ * - `power-button`: The Power button's inner button.
87714
+ * - `power-live`: The Power button's live region, which speaks while the button is pending.
87715
+ * - `power-spinner`: The ring the Power button turns while it is pending.
87716
+ * - `power-text`: The box the Power button's icon sits in.
87717
+ * - `recents`: The Recent apps button.
87718
+ * - `recents-button`: The Recent apps button's inner button.
87719
+ * - `recents-live`: The Recent apps button's live region, which speaks while the button is pending.
87720
+ * - `recents-spinner`: The ring the Recent apps button turns while it is pending.
87721
+ * - `recents-text`: The box the Recent apps button's icon sits in.
87722
+ * - `region`: The box that holds the device, its buttons, the header, and the footer.
87723
+ * - `rotate-left`: The Rotate left button.
87724
+ * - `rotate-left-button`: The Rotate left button's inner button.
87725
+ * - `rotate-left-live`: The Rotate left button's live region, which speaks while the button is pending.
87726
+ * - `rotate-left-spinner`: The ring the Rotate left button turns while it is pending.
87727
+ * - `rotate-left-text`: The box the Rotate left button's icon sits in.
87728
+ * - `rotate-right`: The Rotate right button.
87729
+ * - `rotate-right-button`: The Rotate right button's inner button.
87730
+ * - `rotate-right-live`: The Rotate right button's live region, which speaks while the button is pending.
87731
+ * - `rotate-right-spinner`: The ring the Rotate right button turns while it is pending.
87732
+ * - `rotate-right-text`: The box the Rotate right button's icon sits in.
87733
+ * - `screen`: The device's screen, which takes the touches and the keys.
87734
+ * - `screenshot`: The button that asks for a screenshot.
87735
+ * - `screenshot-button`: The screenshot button's inner button.
87736
+ * - `screenshot-live`: The screenshot button's live region, which speaks while the button is pending.
87737
+ * - `screenshot-spinner`: The ring the screenshot button turns while it is pending.
87738
+ * - `screenshot-text`: The box the screenshot button's icon sits in.
87739
+ * - `touch`: A ring where a touch is or was.
87740
+ * - `touch-held`: A ring under a finger that is down, beside `touch`, with `show-touches`.
87741
+ * - `volume-down`: The Volume down button.
87742
+ * - `volume-down-button`: The Volume down button's inner button.
87743
+ * - `volume-down-live`: The Volume down button's live region, which speaks while the button is pending.
87744
+ * - `volume-down-spinner`: The ring the Volume down button turns while it is pending.
87745
+ * - `volume-down-text`: The box the Volume down button's icon sits in.
87746
+ * - `volume-up`: The Volume up button.
87747
+ * - `volume-up-button`: The Volume up button's inner button.
87748
+ * - `volume-up-live`: The Volume up button's live region, which speaks while the button is pending.
87749
+ * - `volume-up-spinner`: The ring the Volume up button turns while it is pending.
87750
+ * - `volume-up-text`: The box the Volume up button's icon sits in.
87751
+ *
87752
+ * ## CSS States
87753
+ *
87754
+ * These can be used to apply styling when a component is in a given state.
87755
+ *
87756
+ * - `empty`: No element that draws the stream is inside, which the frame knows once it runs in the browser.
87757
+ * - `fullscreen`: The device fills the screen.
87758
+ * - `loading`: `loading` is set.
87759
+ * - `readonly`: `readonly` is set, and the screen sends nothing.
87760
+ * - `sideways`: `rotation` turns the picture a quarter, so the drawn screen is the device's height wide.
87761
+ * - `touching`: A finger is on the screen.
87762
+ * - `settled`: Set one frame after the first render. Transitions wait for it, so an element does not animate its own arrival.
87763
+ */
87764
+ "helix-device-screen": Partial<
87765
+ HelixDeviceScreenProps &
87766
+ HelixDeviceScreenSolidJsProps &
87767
+ BaseProps<HelixDeviceScreen, "solid"> &
87768
+ BaseEvents<HelixDeviceScreen>
87769
+ >;
87770
+
86859
87771
  /**
86860
87772
  * The panel uses `surface-overlay` with a shadow, because it sits over the
86861
87773
  * page. The scrim is drawn on `::backdrop`, the platform's element for it,
@@ -111900,6 +112812,32 @@ export type CustomCssProperties = {
111900
112812
  "--description-list-gap"?: (string) | undefined;
111901
112813
  /** The width of the column of labels, with `direction="row"`. Defaults to the width of the longest label; set a length such as `10rem` to line up several lists. */
111902
112814
  "--description-list-label-width"?: (string) | undefined;
112815
+ /** How thick the body is at the sides, as a fraction of the screen's width. `0.045` by default. */
112816
+ "--device-screen-bezel"?: (string) | undefined;
112817
+ /** How thick the body is at the top and bottom, as a fraction of the screen's width. The same as `--device-screen-bezel` by default. */
112818
+ "--device-screen-bezel-block"?: (string) | undefined;
112819
+ /** The color of the body around the screen. */
112820
+ "--device-screen-bezel-color"?: (string) | undefined;
112821
+ /** The body's corners, as a fraction of the screen's width. Round with the screen's corners by default. */
112822
+ "--device-screen-bezel-radius"?: (string) | undefined;
112823
+ /** The element's height, which holds the device, its buttons, the header, and the footer. `36rem` by default. */
112824
+ "--device-screen-block-size"?: (string) | undefined;
112825
+ /** The screen's corners, as a fraction of the screen's width. `0.13` by default, which is near a recent iPhone's. */
112826
+ "--device-screen-radius"?: (string) | undefined;
112827
+ /** 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. */
112828
+ "--device-screen-ratio"?: (string) | undefined;
112829
+ /** How far the picture is turned, as an angle. The frame writes it from `rotation`. */
112830
+ "--device-screen-rotation"?: (string) | undefined;
112831
+ /** How long a swipe's ring takes to travel, as a time. Written on each ring from `showSwipe()`. */
112832
+ "--device-screen-touch-duration"?: (string) | undefined;
112833
+ /** Where a swipe's ring travels to, across the screen, as a percentage. Written on each ring from `showSwipe()`. */
112834
+ "--device-screen-touch-to-x"?: (string) | undefined;
112835
+ /** Where a swipe's ring travels to, down the screen, as a percentage. Written on each ring from `showSwipe()`. */
112836
+ "--device-screen-touch-to-y"?: (string) | undefined;
112837
+ /** Where a ring is, across the screen, as a percentage. Written on each ring. */
112838
+ "--device-screen-touch-x"?: (string) | undefined;
112839
+ /** Where a ring is, down the screen, as a percentage. Written on each ring. */
112840
+ "--device-screen-touch-y"?: (string) | undefined;
111903
112841
  /** The panel's fill. Follows `--helix-color-surface-overlay`. */
111904
112842
  "--dialog-background-color"?: (string) | undefined;
111905
112843
  /** Color of the panel's edge. */