Skip to content

Commit bf116c2

Browse files
committed
fix: align web device chrome buttons
1 parent d8d3245 commit bf116c2

3 files changed

Lines changed: 50 additions & 27 deletions

File tree

client/src/app/AppShell.tsx

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -929,17 +929,14 @@ export function AppShell({
929929
selectedSimulator?.runtimeName,
930930
selectedSimulator?.udid,
931931
chromeGeometryStamp,
932-
chromeHasInteractiveButtons ? "buttons" : "no-buttons",
932+
chromeHasInteractiveButtons ? "baked-buttons" : "no-buttons",
933933
chromeHasCrown ? "crown" : "no-crown",
934934
]
935935
.filter(Boolean)
936936
.join(":");
937+
const chromeButtonsRenderedInChrome = chromeHasInteractiveButtons;
937938
const chromeUrl = selectedSimulator
938-
? buildChromeUrl(
939-
selectedSimulator.udid,
940-
chromeAssetStamp,
941-
!chromeHasInteractiveButtons,
942-
)
939+
? buildChromeUrl(selectedSimulator.udid, chromeAssetStamp, true)
943940
: "";
944941
const chromeButtonUrl = useCallback(
945942
(button: string, pressed = false) =>
@@ -968,10 +965,12 @@ export function AppShell({
968965
if (viewportChromeProfile.hasScreenMask) {
969966
urls.add(buildScreenMaskUrl(selectedSimulator.udid, chromeAssetStamp));
970967
}
971-
for (const button of viewportChromeProfile.buttons ?? []) {
972-
urls.add(chromeButtonUrl(button.name, false));
973-
if (button.imageDownName) {
974-
urls.add(chromeButtonUrl(button.name, true));
968+
if (!chromeButtonsRenderedInChrome) {
969+
for (const button of viewportChromeProfile.buttons ?? []) {
970+
urls.add(chromeButtonUrl(button.name, false));
971+
if (button.imageDownName) {
972+
urls.add(chromeButtonUrl(button.name, true));
973+
}
975974
}
976975
}
977976
return [...urls].filter(Boolean);
@@ -980,6 +979,7 @@ export function AppShell({
980979
chromeRequired,
981980
chromeUrl,
982981
chromeAssetStamp,
982+
chromeButtonsRenderedInChrome,
983983
selectedSimulator?.udid,
984984
viewportChromeProfile,
985985
]);
@@ -1693,10 +1693,18 @@ export function AppShell({
16931693
const chromeScreenStyle =
16941694
viewportChromeProfile && chromeScreenRect
16951695
? ({
1696-
left: `${(chromeScreenRect.x / viewportChromeProfile.totalWidth) * 100}%`,
1697-
top: `${(chromeScreenRect.y / viewportChromeProfile.totalHeight) * 100}%`,
1698-
width: `${(chromeScreenRect.width / viewportChromeProfile.totalWidth) * 100}%`,
1699-
height: `${(chromeScreenRect.height / viewportChromeProfile.totalHeight) * 100}%`,
1696+
left: viewportChromeProfile.hasScreenMask
1697+
? `calc(${(chromeScreenRect.x / viewportChromeProfile.totalWidth) * 100}% - 1px)`
1698+
: `${(chromeScreenRect.x / viewportChromeProfile.totalWidth) * 100}%`,
1699+
top: viewportChromeProfile.hasScreenMask
1700+
? `calc(${(chromeScreenRect.y / viewportChromeProfile.totalHeight) * 100}% - 1px)`
1701+
: `${(chromeScreenRect.y / viewportChromeProfile.totalHeight) * 100}%`,
1702+
width: viewportChromeProfile.hasScreenMask
1703+
? `calc(${(chromeScreenRect.width / viewportChromeProfile.totalWidth) * 100}% + 2px)`
1704+
: `${(chromeScreenRect.width / viewportChromeProfile.totalWidth) * 100}%`,
1705+
height: viewportChromeProfile.hasScreenMask
1706+
? `calc(${(chromeScreenRect.height / viewportChromeProfile.totalHeight) * 100}% + 2px)`
1707+
: `${(chromeScreenRect.height / viewportChromeProfile.totalHeight) * 100}%`,
17001708
borderRadius: viewportChromeProfile.hasScreenMask
17011709
? "0"
17021710
: (chromeScreenBorderRadius ?? "0"),
@@ -2729,6 +2737,7 @@ export function AppShell({
27292737
chromeLoaded={chromeLoaded}
27302738
chromeProfile={viewportChromeProfile}
27312739
chromeRequired={chromeRequired}
2740+
chromeButtonsRenderedInChrome={chromeButtonsRenderedInChrome}
27322741
chromeScreenStyle={viewportScreenStyle}
27332742
chromeUrl={chromeUrl}
27342743
chromeButtonUrl={chromeButtonUrl}

client/src/features/viewport/DeviceChrome.tsx

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ interface DeviceChromeProps {
1616
accessibilityRoots: AccessibilityNode[];
1717
accessibilitySelectedId: string;
1818
chromeProfile: ChromeProfile | null;
19+
chromeButtonsRenderedInChrome: boolean;
1920
chromeScreenStyle: CSSProperties | null;
2021
chromeUrl: string;
2122
chromeButtonUrl: (button: string, pressed?: boolean) => string;
@@ -61,6 +62,7 @@ export function DeviceChrome({
6162
accessibilityRoots,
6263
accessibilitySelectedId,
6364
chromeProfile,
65+
chromeButtonsRenderedInChrome,
6466
chromeScreenStyle,
6567
chromeUrl,
6668
chromeButtonUrl,
@@ -109,6 +111,7 @@ export function DeviceChrome({
109111
chromeProfile={chromeProfile}
110112
layer="under"
111113
onEvent={onChromeButtonEvent}
114+
renderImages={!chromeButtonsRenderedInChrome}
112115
/>
113116
<img
114117
alt=""
@@ -122,6 +125,7 @@ export function DeviceChrome({
122125
chromeProfile={chromeProfile}
123126
layer="over"
124127
onEvent={onChromeButtonEvent}
128+
renderImages={!chromeButtonsRenderedInChrome}
125129
/>
126130
<ScreenLayer
127131
accessibilityHoveredId={accessibilityHoveredId}
@@ -218,6 +222,7 @@ function ChromeButtonOverlay({
218222
chromeProfile,
219223
layer,
220224
onEvent,
225+
renderImages,
221226
}: {
222227
chromeButtonUrl: (button: string, pressed?: boolean) => string;
223228
chromeProfile: ChromeProfile | null;
@@ -228,6 +233,7 @@ function ChromeButtonOverlay({
228233
usagePage?: number,
229234
usage?: number,
230235
) => void;
236+
renderImages: boolean;
231237
}) {
232238
const buttons = chromeProfile?.buttons ?? [];
233239
if (!chromeProfile || buttons.length === 0) {
@@ -254,6 +260,7 @@ function ChromeButtonOverlay({
254260
chromeButtonUrl={chromeButtonUrl}
255261
key={`${button.name}-${button.x}-${button.y}`}
256262
onEvent={onEvent}
263+
renderImages={renderImages}
257264
totalHeight={chromeProfile.totalHeight}
258265
totalWidth={chromeProfile.totalWidth}
259266
wireName={wireName}
@@ -268,6 +275,7 @@ function ChromeButtonHitTarget({
268275
button,
269276
chromeButtonUrl,
270277
onEvent,
278+
renderImages,
271279
totalHeight,
272280
totalWidth,
273281
wireName,
@@ -280,6 +288,7 @@ function ChromeButtonHitTarget({
280288
usagePage?: number,
281289
usage?: number,
282290
) => void;
291+
renderImages: boolean;
283292
totalHeight: number;
284293
totalWidth: number;
285294
wireName: string;
@@ -372,7 +381,7 @@ function ChromeButtonHitTarget({
372381
title={label}
373382
type="button"
374383
>
375-
{downCompositeUnder ? (
384+
{renderImages && downCompositeUnder ? (
376385
<img
377386
alt=""
378387
aria-hidden="true"
@@ -381,18 +390,20 @@ function ChromeButtonHitTarget({
381390
src={pressedImageUrl}
382391
/>
383392
) : null}
384-
<img
385-
alt=""
386-
aria-hidden="true"
387-
className="device-chrome-button-image"
388-
draggable={false}
389-
src={
390-
pressed && pressedImageUrl && !downCompositeUnder
391-
? pressedImageUrl
392-
: imageUrl
393-
}
394-
/>
395-
{!pressed && pressedImageUrl ? (
393+
{renderImages ? (
394+
<img
395+
alt=""
396+
aria-hidden="true"
397+
className="device-chrome-button-image"
398+
draggable={false}
399+
src={
400+
pressed && pressedImageUrl && !downCompositeUnder
401+
? pressedImageUrl
402+
: imageUrl
403+
}
404+
/>
405+
) : null}
406+
{renderImages && !pressed && pressedImageUrl ? (
396407
<img
397408
alt=""
398409
aria-hidden="true"

client/src/features/viewport/SimulatorViewport.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ interface SimulatorViewportProps {
2020
chromeProfile: ChromeProfile | null;
2121
chromeLoaded: boolean;
2222
chromeRequired: boolean;
23+
chromeButtonsRenderedInChrome: boolean;
2324
chromeScreenStyle: CSSProperties | null;
2425
chromeUrl: string;
2526
deviceFrameStyle: CSSProperties;
@@ -90,6 +91,7 @@ export function SimulatorViewport({
9091
chromeProfile,
9192
chromeLoaded,
9293
chromeRequired,
94+
chromeButtonsRenderedInChrome,
9395
chromeScreenStyle,
9496
chromeUrl,
9597
deviceFrameStyle,
@@ -199,6 +201,7 @@ export function SimulatorViewport({
199201
accessibilityRoots={accessibilityRoots}
200202
accessibilitySelectedId={accessibilitySelectedId}
201203
chromeProfile={chromeProfile}
204+
chromeButtonsRenderedInChrome={chromeButtonsRenderedInChrome}
202205
chromeScreenStyle={chromeScreenStyle}
203206
chromeUrl={chromeUrl}
204207
chromeButtonUrl={chromeButtonUrl}

0 commit comments

Comments
 (0)