sootsim 0.1.270 → 0.1.272
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/detox/expectations.ts +56 -48
- package/dist-cli/bin.js +4 -4
- package/dist-cli/chunks/{agent-4YXUPSJ2.js → agent-P6GZSLRM.js} +2 -2
- package/dist-cli/chunks/{agent-wrapper-BMJPWHWK.js → agent-wrapper-2V6QR7JT.js} +2 -2
- package/dist-cli/chunks/{app-fonts-EDRH6ETC.js → app-fonts-KNRMKJXD.js} +2 -2
- package/dist-cli/chunks/{assert-CRDV324D.js → assert-VWMXT55P.js} +2 -2
- package/dist-cli/chunks/{auth-WYRQIJEN.js → auth-GIM3YHL4.js} +2 -2
- package/dist-cli/chunks/beta-C322CH35.js +2 -0
- package/dist-cli/chunks/{camera-5TO6IVBP.js → camera-LV3B3ERY.js} +2 -2
- package/dist-cli/chunks/{chunk-MYBY7OHL.js → chunk-2MSJ4TOR.js} +1 -1
- package/dist-cli/chunks/{chunk-GQDQO3KU.js → chunk-3D3WUHI2.js} +2 -2
- package/dist-cli/chunks/{chunk-OUKH6UGN.js → chunk-3GZ4ZGUW.js} +1 -1
- package/dist-cli/chunks/{chunk-TLNGREAA.js → chunk-3P3LAIKZ.js} +2 -2
- package/dist-cli/chunks/{chunk-ZTKDHPA6.js → chunk-4BQDKWUP.js} +2 -2
- package/dist-cli/chunks/{chunk-6CI73D3X.js → chunk-4RTPPDCM.js} +2 -2
- package/dist-cli/chunks/{chunk-NTO6SKS5.js → chunk-52IU2APA.js} +1 -1
- package/dist-cli/chunks/{chunk-TMWNOQAA.js → chunk-5IBEBKBU.js} +1 -1
- package/dist-cli/chunks/{chunk-LHMVSKKD.js → chunk-647M3ME6.js} +2 -2
- package/dist-cli/chunks/{chunk-FCMEOOQE.js → chunk-6LJQM2PV.js} +2 -2
- package/dist-cli/chunks/{chunk-44ISBOEK.js → chunk-6UXGVE7B.js} +3 -3
- package/dist-cli/chunks/{chunk-MD24VVKT.js → chunk-77AHG7XC.js} +2 -2
- package/dist-cli/chunks/{chunk-SLR3HWMB.js → chunk-7FREST5Z.js} +2 -2
- package/dist-cli/chunks/{chunk-2J3E5TPS.js → chunk-AMOUIEAP.js} +1 -1
- package/dist-cli/chunks/{chunk-FNBFRG64.js → chunk-BIWYNMXB.js} +1 -1
- package/dist-cli/chunks/{chunk-6JLIPPNB.js → chunk-E6FZKMNQ.js} +1 -1
- package/dist-cli/chunks/{chunk-3ZOF2BTJ.js → chunk-EOIPXAUF.js} +1 -1
- package/dist-cli/chunks/{chunk-SW5HZ5LK.js → chunk-HS527F2B.js} +1 -1
- package/dist-cli/chunks/chunk-JOSBLCUP.js +2 -0
- package/dist-cli/chunks/{chunk-M32JVXHU.js → chunk-K4USS5KY.js} +1 -1
- package/dist-cli/chunks/{chunk-B5IBLYEO.js → chunk-LSMPXU4D.js} +3 -3
- package/dist-cli/chunks/{chunk-DCJXHSIA.js → chunk-NMPW3IKE.js} +2 -2
- package/dist-cli/chunks/{chunk-3VIMSXQZ.js → chunk-NVY52AQE.js} +2 -2
- package/dist-cli/chunks/chunk-PHCPWYXA.js +1 -0
- package/dist-cli/chunks/{chunk-IIXRM6BB.js → chunk-Q2RS3DKR.js} +2 -2
- package/dist-cli/chunks/{chunk-AMA3YGJ5.js → chunk-QCZHL3KI.js} +2 -2
- package/dist-cli/chunks/{chunk-HWGKGIWE.js → chunk-QPADKGOP.js} +2 -2
- package/dist-cli/chunks/{chunk-ABSUFSOH.js → chunk-QUZDHDE3.js} +2 -2
- package/dist-cli/chunks/{chunk-557IYHPC.js → chunk-SWF6GSP2.js} +1 -1
- package/dist-cli/chunks/{chunk-AMVYE3F4.js → chunk-TRKOQX32.js} +2 -2
- package/dist-cli/chunks/{chunk-YKK2QUGO.js → chunk-U7UBIV75.js} +1 -1
- package/dist-cli/chunks/{chunk-TIONGRTA.js → chunk-UE2XRBIP.js} +18 -18
- package/dist-cli/chunks/chunk-UZH4THUY.js +1 -0
- package/dist-cli/chunks/{chunk-UPRCATUH.js → chunk-V77BGSWB.js} +2 -2
- package/dist-cli/chunks/{chunk-5IHDZOMR.js → chunk-VE2JT5D4.js} +1 -1
- package/dist-cli/chunks/{chunk-4HPWZVBS.js → chunk-W5DZNFI3.js} +1 -1
- package/dist-cli/chunks/{chunk-ERXCR7NU.js → chunk-WO7QKCZR.js} +2 -2
- package/dist-cli/chunks/{chunk-FHPXOPMC.js → chunk-WUKCADRK.js} +2 -2
- package/dist-cli/chunks/{chunk-TZH4VH32.js → chunk-WZT2JQZ7.js} +3 -3
- package/dist-cli/chunks/{chunk-GAYG7AO4.js → chunk-YASTVFWI.js} +1 -1
- package/dist-cli/chunks/{chunk-SDKIUJUO.js → chunk-YMPQ6USJ.js} +2 -2
- package/dist-cli/chunks/{chunk-AG563BSO.js → chunk-YQ54F276.js} +2 -2
- package/dist-cli/chunks/{chunk-74HIBIJQ.js → chunk-YUU2LHZS.js} +1 -1
- package/dist-cli/chunks/{chunk-M5VURHXD.js → chunk-ZJYKKMU7.js} +1 -1
- package/dist-cli/chunks/cli-version-EJ6Y575J.js +2 -0
- package/dist-cli/chunks/{compat-IZEDAAUW.js → compat-5WRD3HPR.js} +3 -3
- package/dist-cli/chunks/{config-I4CXZ6M7.js → config-2WYBXEGB.js} +2 -2
- package/dist-cli/chunks/{control-DVF7UL5D.js → control-LQT2NTEJ.js} +2 -2
- package/dist-cli/chunks/daemon-Y7L22R6N.js +2 -0
- package/dist-cli/chunks/{debug-5X2F2WRP.js → debug-AYCCUWM2.js} +3 -3
- package/dist-cli/chunks/{desktop-JHEYQZGF.js → desktop-ZZQMD6Q7.js} +3 -3
- package/dist-cli/chunks/{detox-W64UENQG.js → detox-7LRIEKC6.js} +2 -2
- package/dist-cli/chunks/{device-ZBSW2EHS.js → device-GDCBAZPE.js} +2 -2
- package/dist-cli/chunks/{diagnose-WER4X3P5.js → diagnose-6VSIE264.js} +2 -2
- package/dist-cli/chunks/drivers-Q6FTTPFM.js +2 -0
- package/dist-cli/chunks/{film-TIXNUTR6.js → film-7M3ZY5OZ.js} +3 -3
- package/dist-cli/chunks/flow-NFGZ4HEU.js +2 -0
- package/dist-cli/chunks/help-UXGBACTX.js +2 -0
- package/dist-cli/chunks/{hidden-runtime-alias-R3JH3INM.js → hidden-runtime-alias-ADZDP6BO.js} +2 -2
- package/dist-cli/chunks/{home-paths-CNNARPCT.js → home-paths-H3OAW2FB.js} +2 -2
- package/dist-cli/chunks/inspect-T7L3UWXF.js +2 -0
- package/dist-cli/chunks/install-desktop-PRSRY6WV.js +2 -0
- package/dist-cli/chunks/{login-6NCCZ3CZ.js → login-EJ2AKM3R.js} +4 -4
- package/dist-cli/chunks/{logout-C4VKXUH4.js → logout-QI5YXZJQ.js} +2 -2
- package/dist-cli/chunks/{maestro-ZRGFQ3MV.js → maestro-DPMZM74Q.js} +3 -3
- package/dist-cli/chunks/{maestro-generate-A5XZS5GC.js → maestro-generate-CPUUFDJ3.js} +3 -3
- package/dist-cli/chunks/{mode-IFFZ55HM.js → mode-FSTSZ3MW.js} +2 -2
- package/dist-cli/chunks/optional-demo-registry-5MYUTZN2.js +2 -0
- package/dist-cli/chunks/{perf-44KZNTIV.js → perf-VD26YPVC.js} +2 -2
- package/dist-cli/chunks/{record-GZLZNXYZ.js → record-M76CRKNG.js} +3 -3
- package/dist-cli/chunks/runtime-G35ZTARE.js +2 -0
- package/dist-cli/chunks/{screenshot-command-GL3STSWK.js → screenshot-command-CQNZOJCP.js} +3 -3
- package/dist-cli/chunks/{screenshots-capture-QSSBWHN6.js → screenshots-capture-MUU37VUC.js} +2 -2
- package/dist-cli/chunks/{serve-AFK6X2Q3.js → serve-RTBFO3EP.js} +2 -2
- package/dist-cli/chunks/{setup-DYSDNEUE.js → setup-DZQ4OLOY.js} +3 -3
- package/dist-cli/chunks/{skills-YXWQ43PZ.js → skills-RESDEF2Z.js} +2 -2
- package/dist-cli/chunks/{storage-C7IS5GTM.js → storage-SCHHLLFY.js} +2 -2
- package/dist-cli/chunks/store-RPDRE7TV.js +2 -0
- package/dist-cli/chunks/telemetry-TAT36E3X.js +2 -0
- package/dist-cli/chunks/{timeline-FDTIHQ5V.js → timeline-K4N53W24.js} +2 -2
- package/dist-cli/chunks/{upgrade-VRQCFJEI.js → upgrade-LKS7JREU.js} +2 -2
- package/dist-cli/chunks/upload-4CZLH275.js +2 -0
- package/dist-cli/chunks/{version-MP6NKJ27.js → version-RKRNYRKP.js} +2 -2
- package/dist-cli/chunks/{web-XYPFJHKW.js → web-M2C2TSTH.js} +2 -2
- package/dist-cli/chunks/{what-happened-IM6UH24Q.js → what-happened-2ULBMYTD.js} +2 -2
- package/dist-lib/agent-daemon-client.cjs +1 -1
- package/dist-lib/agent-events.cjs +1 -1
- package/dist-lib/agent-identity.cjs +1 -1
- package/dist-lib/agent-sessions.cjs +1 -1
- package/dist-lib/attached-projects.cjs +1 -1
- package/dist-lib/auth/shared-session.cjs +1 -1
- package/dist-lib/backend-origin.cjs +1 -1
- package/dist-lib/beta.cjs +1 -1
- package/dist-lib/beta.mjs +1 -1
- package/dist-lib/bridge-constants.cjs +1 -1
- package/dist-lib/cli-constants.cjs +1 -1
- package/dist-lib/config.cjs +1 -1
- package/dist-lib/detox/index.cjs +41 -43
- package/dist-lib/dev-bundle-resolution.cjs +1 -1
- package/dist-lib/home-paths.cjs +1 -1
- package/dist-lib/host/bridge-host.cjs +1 -1
- package/dist-lib/host/fetch-proxy-handler.cjs +1 -1
- package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
- package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
- package/dist-lib/host/websocket-proxy.cjs +1 -1
- package/dist-lib/index.cjs +3 -2
- package/dist-lib/jump-to-source-babel.cjs +1 -1
- package/dist-lib/menu.cjs +1 -1
- package/dist-lib/menu.mjs +1 -1
- package/dist-lib/metro.cjs +3 -2
- package/dist-lib/profiles.cjs +1 -1
- package/dist-lib/render-mode.cjs +1 -1
- package/dist-lib/scripts/dev-server-scanner.cjs +1 -1
- package/dist-lib/sdk.cjs +1 -1
- package/dist-lib/sdk.mjs +1 -1
- package/dist-lib/skills.cjs +12 -12
- package/dist-lib/vite.cjs +3 -2
- package/package.json +1 -1
- package/src/runtime-assets.ts +1 -0
- package/src/screenshots/frame-compose.ts +14 -12
- package/dist-cli/chunks/beta-NBANSL2S.js +0 -2
- package/dist-cli/chunks/chunk-PDFKRVDC.js +0 -2
- package/dist-cli/chunks/chunk-XTTXSDDA.js +0 -1
- package/dist-cli/chunks/chunk-ZZH2AFPJ.js +0 -1
- package/dist-cli/chunks/cli-version-BLKUTVJ2.js +0 -2
- package/dist-cli/chunks/daemon-FPKQPSSY.js +0 -2
- package/dist-cli/chunks/drivers-6P53DLMM.js +0 -2
- package/dist-cli/chunks/flow-53XFDYLL.js +0 -2
- package/dist-cli/chunks/help-MPYJLD7I.js +0 -2
- package/dist-cli/chunks/inspect-JBDDYUA5.js +0 -2
- package/dist-cli/chunks/install-desktop-BBP7AMK4.js +0 -2
- package/dist-cli/chunks/optional-demo-registry-TQZA65K3.js +0 -2
- package/dist-cli/chunks/runtime-F4FCEPPB.js +0 -2
- package/dist-cli/chunks/store-LVF2C2XZ.js +0 -2
- package/dist-cli/chunks/telemetry-5V3OXY6C.js +0 -2
- package/dist-cli/chunks/upload-CRCPDN6G.js +0 -2
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
2
|
-
import{C as N,D as F,F as y,Q as T,R as b,S}from"./chunk-
|
|
1
|
+
/*! sootsim v0.1.272 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
|
+
import{C as N,D as F,F as y,Q as T,R as b,S}from"./chunk-ZJYKKMU7.js";import{g as A,i as _}from"./chunk-WO7QKCZR.js";import"./chunk-E6FZKMNQ.js";import{c as k}from"./chunk-YUU2LHZS.js";import"./chunk-SWF6GSP2.js";import"./chunk-VE2JT5D4.js";function O(n){let t=[];for(let e=0;e<n.length;e++)if(n[e]==="--since"&&e+1<n.length){t.push(e,e+1);let s=n[e+1].trim(),l=/^(\d+(?:\.\d+)?)(ms|s|m)?$/.exec(s);if(l){let r=Number(l[1]),u=l[2]??"ms",v=u==="s"?r*1e3:u==="m"?r*6e4:r;return{since:Date.now()-v,consumed:t}}let i=Number(s);if(Number.isFinite(i)&&i>1e12)return{since:i,consumed:t}}return{consumed:t}}function B(n){let t=[];for(let e=0;e<n.length;e++)if(n[e]==="--kinds"&&e+1<n.length)return t.push(e,e+1),{kinds:n[e+1].split(",").map(s=>s.trim()).filter(Boolean),consumed:t};return{consumed:t}}function D(n){let t=[];for(let e=0;e<n.length;e++)if(n[e]==="--limit"&&e+1<n.length){t.push(e,e+1);let s=Number(n[e+1]);if(Number.isFinite(s)&&s>0)return{limit:s,consumed:t}}return{consumed:t}}function x(n){let t=[],e={label:"initial state",events:[],startedAt:n[0]?.t??null};t.push(e);for(let s of n)if(e.events.push(s),s.kind==="screen"||s.kind==="route"){let l=s.data,i=l?.phase;if(!i||i==="enter"||i==="appear"||i==="active"){let r=l?.name||l?.activeName||l?.path||l?.pathname||s.kind;t.length===1&&e.events.length===1?e.label=`${s.kind}: ${r}`:(e={label:`${s.kind}: ${r}`,events:[],startedAt:s.t},t.push(e))}}return t}async function J(n,t){let e=A(n,{port:t.port,stripBooleanFlags:["--summary","--all","--json","--no-advance","--help","-h","--flow","--noisy"],stripValueFlags:["--since","--kinds","--limit"]});(n.includes("--help")||n.includes("-h"))&&(console.log(`
|
|
3
3
|
sootsim what-happened \u2014 show recent events from the semantic timeline
|
|
4
4
|
|
|
5
5
|
usage:
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.272 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __create = Object.create;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.272 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.272 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.272 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __create = Object.create;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.272 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __create = Object.create;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.272 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __create = Object.create;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.272 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
package/dist-lib/beta.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.272 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
package/dist-lib/beta.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.272 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.272 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
package/dist-lib/config.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.272 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
package/dist-lib/detox/index.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.272 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __create = Object.create;
|
|
@@ -711,36 +711,25 @@ async function scrollMatcherElement(page, findNode, matcher, pixels, direction)
|
|
|
711
711
|
if (!node) {
|
|
712
712
|
throw new Error(`scroll container not found: ${JSON.stringify(matcher)}`);
|
|
713
713
|
}
|
|
714
|
+
const before = scrollOffsetOf(node);
|
|
714
715
|
await dragScrollNode(page, node, pixels, direction);
|
|
716
|
+
const after = scrollOffsetOf(await findNode(matcher));
|
|
717
|
+
return Math.abs(after.x - before.x) + Math.abs(after.y - before.y);
|
|
715
718
|
}
|
|
716
|
-
function
|
|
717
|
-
|
|
718
|
-
return false;
|
|
719
|
-
}
|
|
720
|
-
const frame = node.visibleFrame ?? {
|
|
721
|
-
x: node.absolutePosition?.x ?? node.layout?.x ?? 0,
|
|
722
|
-
y: node.absolutePosition?.y ?? node.layout?.y ?? 0,
|
|
723
|
-
width: node.layout.width,
|
|
724
|
-
height: node.layout.height
|
|
725
|
-
};
|
|
726
|
-
const right = frame.x + frame.width;
|
|
727
|
-
const bottom = frame.y + frame.height;
|
|
728
|
-
const visibleWidth = Math.max(0, Math.min(right, viewport.width) - Math.max(frame.x, 0));
|
|
729
|
-
const visibleHeight = Math.max(
|
|
730
|
-
0,
|
|
731
|
-
Math.min(bottom, viewport.height) - Math.max(frame.y, 0)
|
|
732
|
-
);
|
|
733
|
-
const visibleArea = visibleWidth * visibleHeight;
|
|
734
|
-
const totalArea = node.layout.width * node.layout.height;
|
|
735
|
-
return totalArea > 0 && visibleArea / totalArea >= DEFAULT_VISIBILITY_THRESHOLD;
|
|
719
|
+
function scrollOffsetOf(node) {
|
|
720
|
+
return { x: node?.scrollOffsetX ?? 0, y: node?.scrollOffsetY ?? 0 };
|
|
736
721
|
}
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
722
|
+
function visibleFraction(node) {
|
|
723
|
+
const totalArea = (node?.layout?.width ?? 0) * (node?.layout?.height ?? 0);
|
|
724
|
+
const frame = node?.visibleFrame;
|
|
725
|
+
if (totalArea <= 0 || !frame) return 0;
|
|
726
|
+
const visibleArea = Math.max(0, frame.width) * Math.max(0, frame.height);
|
|
727
|
+
return visibleArea / totalArea;
|
|
728
|
+
}
|
|
729
|
+
function isNodeVisible(node) {
|
|
730
|
+
return visibleFraction(node) >= DEFAULT_VISIBILITY_THRESHOLD;
|
|
742
731
|
}
|
|
743
|
-
function describeNodeVisibility(node
|
|
732
|
+
function describeNodeVisibility(node) {
|
|
744
733
|
if (!node) return "not found";
|
|
745
734
|
const absX = node.absolutePosition?.x ?? node.layout?.x ?? 0;
|
|
746
735
|
const absY = node.absolutePosition?.y ?? node.layout?.y ?? 0;
|
|
@@ -754,7 +743,8 @@ function describeNodeVisibility(node, viewport) {
|
|
|
754
743
|
bottom: absY + (node.layout?.height ?? 0)
|
|
755
744
|
},
|
|
756
745
|
visibleFrame: node.visibleFrame ?? null,
|
|
757
|
-
|
|
746
|
+
visibleFraction: visibleFraction(node),
|
|
747
|
+
threshold: DEFAULT_VISIBILITY_THRESHOLD,
|
|
758
748
|
style: node.style ?? null
|
|
759
749
|
});
|
|
760
750
|
}
|
|
@@ -801,9 +791,7 @@ var SootSimExpectation = class _SootSimExpectation {
|
|
|
801
791
|
}
|
|
802
792
|
async toBeVisible() {
|
|
803
793
|
const node = await this.findNode(this.matcher);
|
|
804
|
-
const
|
|
805
|
-
const viewport = node ? await readSootsimInteractiveViewport(page) : void 0;
|
|
806
|
-
const visible = viewport ? isNodeVisibleInViewport(node, viewport) : false;
|
|
794
|
+
const visible = isNodeVisible(node);
|
|
807
795
|
if (this.negated) {
|
|
808
796
|
if (visible) {
|
|
809
797
|
throw new Error(
|
|
@@ -813,14 +801,14 @@ var SootSimExpectation = class _SootSimExpectation {
|
|
|
813
801
|
} else {
|
|
814
802
|
if (!visible) {
|
|
815
803
|
throw new Error(
|
|
816
|
-
`expected element to be visible but it is ${describeNodeVisibility(node
|
|
804
|
+
`expected element to be visible but it is ${describeNodeVisibility(node)}: ${JSON.stringify(this.matcher)}`
|
|
817
805
|
);
|
|
818
806
|
}
|
|
819
807
|
}
|
|
820
808
|
}
|
|
821
809
|
async toBeNotVisible() {
|
|
822
810
|
const node = await this.findNode(this.matcher);
|
|
823
|
-
const visible =
|
|
811
|
+
const visible = isNodeVisible(node);
|
|
824
812
|
if (visible) {
|
|
825
813
|
throw new Error(
|
|
826
814
|
`expected element NOT to be visible: ${JSON.stringify(this.matcher)}`
|
|
@@ -977,12 +965,10 @@ var SootSimWaitForChain = class {
|
|
|
977
965
|
toBeVisible() {
|
|
978
966
|
this.assertionFn = async () => {
|
|
979
967
|
const node = await this.findNode(this.matcher);
|
|
980
|
-
const
|
|
981
|
-
const viewport = node ? await readSootsimInteractiveViewport(page) : void 0;
|
|
982
|
-
const visible = viewport ? isNodeVisibleInViewport(node, viewport) : false;
|
|
968
|
+
const visible = isNodeVisible(node);
|
|
983
969
|
if (this._negated ? visible : !visible) {
|
|
984
970
|
throw new Error(
|
|
985
|
-
`waitFor toBeVisible failed (${describeNodeVisibility(node
|
|
971
|
+
`waitFor toBeVisible failed (${describeNodeVisibility(node)}): ${JSON.stringify(this.matcher)}`
|
|
986
972
|
);
|
|
987
973
|
}
|
|
988
974
|
};
|
|
@@ -991,7 +977,7 @@ var SootSimWaitForChain = class {
|
|
|
991
977
|
toBeNotVisible() {
|
|
992
978
|
this.assertionFn = async () => {
|
|
993
979
|
const node = await this.findNode(this.matcher);
|
|
994
|
-
const visible =
|
|
980
|
+
const visible = isNodeVisible(node);
|
|
995
981
|
if (visible) {
|
|
996
982
|
throw new Error(`waitFor toBeNotVisible failed: ${JSON.stringify(this.matcher)}`);
|
|
997
983
|
}
|
|
@@ -1080,22 +1066,34 @@ var SootSimWaitForScrollAction = class {
|
|
|
1080
1066
|
this.getPage = getPage2;
|
|
1081
1067
|
this.matcher = matcher;
|
|
1082
1068
|
}
|
|
1069
|
+
// detox scrolls the container until the expectation passes or the container
|
|
1070
|
+
// can no longer move. bounding this by wall clock instead made the result
|
|
1071
|
+
// depend on how fast the host dispatches pointer events: the same fixture and
|
|
1072
|
+
// the same assertion pass on an idle machine and fail on a loaded one,
|
|
1073
|
+
// because each 200px drag is a real pointer stream and fewer of them fit in
|
|
1074
|
+
// the budget. end on scroll exhaustion, which is a property of the content.
|
|
1083
1075
|
async scroll(pixels, direction, _startPositionX, _startPositionY) {
|
|
1084
1076
|
const page = this.getPage();
|
|
1085
|
-
const start = Date.now();
|
|
1086
|
-
const timeoutMs = 5e3;
|
|
1087
1077
|
let lastError = null;
|
|
1088
|
-
|
|
1078
|
+
let stalledSteps = 0;
|
|
1079
|
+
while (stalledSteps < 2) {
|
|
1089
1080
|
try {
|
|
1090
1081
|
await this.assertionFn();
|
|
1091
1082
|
return;
|
|
1092
1083
|
} catch (error) {
|
|
1093
1084
|
lastError = error;
|
|
1094
1085
|
}
|
|
1095
|
-
await scrollMatcherElement(
|
|
1086
|
+
const travelled = await scrollMatcherElement(
|
|
1087
|
+
page,
|
|
1088
|
+
this.findNode,
|
|
1089
|
+
this.matcher,
|
|
1090
|
+
pixels,
|
|
1091
|
+
direction
|
|
1092
|
+
);
|
|
1093
|
+
stalledSteps = travelled < 0.5 ? stalledSteps + 1 : 0;
|
|
1096
1094
|
}
|
|
1097
1095
|
throw lastError || new Error(
|
|
1098
|
-
`waitFor whileElement(...).scroll()
|
|
1096
|
+
`waitFor whileElement(...).scroll() reached the end of ${JSON.stringify(this.matcher)}`
|
|
1099
1097
|
);
|
|
1100
1098
|
}
|
|
1101
1099
|
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.272 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
package/dist-lib/home-paths.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.272 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __create = Object.create;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.272 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __create = Object.create;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.272 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __create = Object.create;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.272 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.272 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
|
|
3
3
|
// src/host/fetch-proxy-overrides.ts
|
|
4
4
|
var FETCH_PROXY_BROWSER_USER_AGENT = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.272 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
package/dist-lib/index.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.272 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __create = Object.create;
|
|
@@ -172,7 +172,8 @@ var ROOT_RUNTIME_PATHS = [
|
|
|
172
172
|
"/sounds/",
|
|
173
173
|
"/spike/",
|
|
174
174
|
"/test-wallpaper.jpg",
|
|
175
|
-
"/preview-sw.js"
|
|
175
|
+
"/preview-sw.js",
|
|
176
|
+
"/sootsim.svg"
|
|
176
177
|
];
|
|
177
178
|
function resolveActiveRuntimeRoot() {
|
|
178
179
|
const devRoot = resolveDevCheckoutRuntimeRoot();
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.272 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
package/dist-lib/menu.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.272 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
package/dist-lib/menu.mjs
CHANGED
package/dist-lib/metro.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.272 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __create = Object.create;
|
|
@@ -132,7 +132,8 @@ var ROOT_RUNTIME_PATHS = [
|
|
|
132
132
|
"/sounds/",
|
|
133
133
|
"/spike/",
|
|
134
134
|
"/test-wallpaper.jpg",
|
|
135
|
-
"/preview-sw.js"
|
|
135
|
+
"/preview-sw.js",
|
|
136
|
+
"/sootsim.svg"
|
|
136
137
|
];
|
|
137
138
|
function resolveActiveRuntimeRoot() {
|
|
138
139
|
const devRoot = resolveDevCheckoutRuntimeRoot();
|
package/dist-lib/profiles.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.272 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __create = Object.create;
|
package/dist-lib/render-mode.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.272 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.272 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __create = Object.create;
|
package/dist-lib/sdk.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.272 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
package/dist-lib/sdk.mjs
CHANGED
package/dist-lib/skills.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.272 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __create = Object.create;
|
|
@@ -16305,37 +16305,37 @@ function getFramedScreenshotLayout(model) {
|
|
|
16305
16305
|
const isLegacyHardware = spec.statusBarHeight > 0 && !spec.dynamicIsland && spec.homeIndicatorHeight === 0 && spec.cornerRadius === 0;
|
|
16306
16306
|
const logicalScreenWidth = spec.width;
|
|
16307
16307
|
const logicalScreenHeight = spec.height;
|
|
16308
|
-
const
|
|
16309
|
-
const
|
|
16308
|
+
const modernGeometry = (0, import_settings.resolveDeviceFrameGeometry)(spec);
|
|
16309
|
+
const logicalFrameWidth = isLegacyHardware ? spec.width + import_chrome_metrics.LEGACY_SIDE_BEZEL * 2 : modernGeometry.frameWidth;
|
|
16310
|
+
const logicalFrameHeight = isLegacyHardware ? spec.height + import_chrome_metrics.LEGACY_TOP_BEZEL + import_chrome_metrics.LEGACY_BOTTOM_BEZEL : modernGeometry.frameHeight;
|
|
16310
16311
|
const logicalFrameLeft = import_chrome_metrics.SIDE_BUTTON_RESERVE;
|
|
16311
16312
|
const logicalFrameTop = FRAME_OUTLINE_BLEED;
|
|
16312
16313
|
const logicalOuterWidth = logicalFrameWidth + logicalFrameLeft * 2;
|
|
16313
16314
|
const logicalOuterHeight = logicalFrameHeight + FRAME_OUTLINE_BLEED * 2;
|
|
16314
|
-
const logicalScreenLeft = logicalFrameLeft + (isLegacyHardware ? import_chrome_metrics.LEGACY_SIDE_BEZEL :
|
|
16315
|
-
const logicalScreenTop = isLegacyHardware ? import_chrome_metrics.LEGACY_TOP_BEZEL :
|
|
16316
|
-
const
|
|
16317
|
-
const logicalFrameRadius = isLegacyHardware ? import_chrome_metrics.LEGACY_FRAME_RADIUS : corners.frameRadius;
|
|
16315
|
+
const logicalScreenLeft = logicalFrameLeft + (isLegacyHardware ? import_chrome_metrics.LEGACY_SIDE_BEZEL : modernGeometry.screenLeft);
|
|
16316
|
+
const logicalScreenTop = isLegacyHardware ? import_chrome_metrics.LEGACY_TOP_BEZEL : modernGeometry.screenTop;
|
|
16317
|
+
const logicalFrameRadius = isLegacyHardware ? import_chrome_metrics.LEGACY_FRAME_RADIUS : modernGeometry.frameRadius;
|
|
16318
16318
|
const buttons = [
|
|
16319
16319
|
{
|
|
16320
|
-
side:
|
|
16320
|
+
side: spec.hardwareButtons.lock.side,
|
|
16321
16321
|
top: spec.hardwareButtons.lock.top,
|
|
16322
16322
|
height: spec.hardwareButtons.lock.height,
|
|
16323
16323
|
width: spec.hardwareButtons.width
|
|
16324
16324
|
},
|
|
16325
16325
|
{
|
|
16326
|
-
side:
|
|
16326
|
+
side: spec.hardwareButtons.ringToggle.side,
|
|
16327
16327
|
top: spec.hardwareButtons.ringToggle.top,
|
|
16328
16328
|
height: spec.hardwareButtons.ringToggle.height,
|
|
16329
16329
|
width: spec.hardwareButtons.width
|
|
16330
16330
|
},
|
|
16331
16331
|
{
|
|
16332
|
-
side:
|
|
16332
|
+
side: spec.hardwareButtons.volumeUp.side,
|
|
16333
16333
|
top: spec.hardwareButtons.volumeUp.top,
|
|
16334
16334
|
height: spec.hardwareButtons.volumeUp.height,
|
|
16335
16335
|
width: spec.hardwareButtons.width
|
|
16336
16336
|
},
|
|
16337
16337
|
{
|
|
16338
|
-
side:
|
|
16338
|
+
side: spec.hardwareButtons.volumeDown.side,
|
|
16339
16339
|
top: spec.hardwareButtons.volumeDown.top,
|
|
16340
16340
|
height: spec.hardwareButtons.volumeDown.height,
|
|
16341
16341
|
width: spec.hardwareButtons.width
|
|
@@ -16356,7 +16356,7 @@ function getFramedScreenshotLayout(model) {
|
|
|
16356
16356
|
logicalScreenHeight,
|
|
16357
16357
|
logicalScreenLeft,
|
|
16358
16358
|
logicalScreenTop,
|
|
16359
|
-
logicalScreenRadius: isLegacyHardware ? 0 :
|
|
16359
|
+
logicalScreenRadius: isLegacyHardware ? 0 : modernGeometry.screenRadius,
|
|
16360
16360
|
logicalFrameRadius,
|
|
16361
16361
|
frameBackground: isLegacyHardware ? "linear-gradient(180deg, #1b1c20 0%, #0f1012 42%, #050608 100%)" : "#000000",
|
|
16362
16362
|
frameOutline: isLegacyHardware ? "0 0 0 1px #1f2125" : "0 0 0 1px #333",
|
package/dist-lib/vite.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.272 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __create = Object.create;
|
|
@@ -167,7 +167,8 @@ var ROOT_RUNTIME_PATHS = [
|
|
|
167
167
|
"/sounds/",
|
|
168
168
|
"/spike/",
|
|
169
169
|
"/test-wallpaper.jpg",
|
|
170
|
-
"/preview-sw.js"
|
|
170
|
+
"/preview-sw.js",
|
|
171
|
+
"/sootsim.svg"
|
|
171
172
|
];
|
|
172
173
|
function resolveActiveRuntimeRoot() {
|
|
173
174
|
const devRoot = resolveDevCheckoutRuntimeRoot();
|
package/package.json
CHANGED
package/src/runtime-assets.ts
CHANGED
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
} from 'sootsim-engine/ios/chrome-metrics'
|
|
10
10
|
import {
|
|
11
11
|
getDevice,
|
|
12
|
-
|
|
12
|
+
resolveDeviceFrameGeometry,
|
|
13
13
|
type DeviceModel,
|
|
14
14
|
} from 'sootsim-engine/settings'
|
|
15
15
|
import { launchReapedChrome } from '../../../../scripts/lib/reap-browser'
|
|
@@ -76,42 +76,44 @@ export function getFramedScreenshotLayout(model: DeviceModel): FramedScreenshotL
|
|
|
76
76
|
spec.cornerRadius === 0
|
|
77
77
|
const logicalScreenWidth = spec.width
|
|
78
78
|
const logicalScreenHeight = spec.height
|
|
79
|
+
const modernGeometry = resolveDeviceFrameGeometry(spec)
|
|
79
80
|
const logicalFrameWidth = isLegacyHardware
|
|
80
81
|
? spec.width + LEGACY_SIDE_BEZEL * 2
|
|
81
|
-
:
|
|
82
|
+
: modernGeometry.frameWidth
|
|
82
83
|
const logicalFrameHeight = isLegacyHardware
|
|
83
84
|
? spec.height + LEGACY_TOP_BEZEL + LEGACY_BOTTOM_BEZEL
|
|
84
|
-
:
|
|
85
|
+
: modernGeometry.frameHeight
|
|
85
86
|
const logicalFrameLeft = SIDE_BUTTON_RESERVE
|
|
86
87
|
const logicalFrameTop = FRAME_OUTLINE_BLEED
|
|
87
88
|
const logicalOuterWidth = logicalFrameWidth + logicalFrameLeft * 2
|
|
88
89
|
const logicalOuterHeight = logicalFrameHeight + FRAME_OUTLINE_BLEED * 2
|
|
89
90
|
const logicalScreenLeft =
|
|
90
|
-
logicalFrameLeft + (isLegacyHardware ? LEGACY_SIDE_BEZEL :
|
|
91
|
-
const logicalScreenTop = isLegacyHardware ? LEGACY_TOP_BEZEL :
|
|
92
|
-
const
|
|
93
|
-
|
|
91
|
+
logicalFrameLeft + (isLegacyHardware ? LEGACY_SIDE_BEZEL : modernGeometry.screenLeft)
|
|
92
|
+
const logicalScreenTop = isLegacyHardware ? LEGACY_TOP_BEZEL : modernGeometry.screenTop
|
|
93
|
+
const logicalFrameRadius = isLegacyHardware
|
|
94
|
+
? LEGACY_FRAME_RADIUS
|
|
95
|
+
: modernGeometry.frameRadius
|
|
94
96
|
const buttons: FrameButtonLayout[] = [
|
|
95
97
|
{
|
|
96
|
-
side:
|
|
98
|
+
side: spec.hardwareButtons.lock.side,
|
|
97
99
|
top: spec.hardwareButtons.lock.top,
|
|
98
100
|
height: spec.hardwareButtons.lock.height,
|
|
99
101
|
width: spec.hardwareButtons.width,
|
|
100
102
|
},
|
|
101
103
|
{
|
|
102
|
-
side:
|
|
104
|
+
side: spec.hardwareButtons.ringToggle.side,
|
|
103
105
|
top: spec.hardwareButtons.ringToggle.top,
|
|
104
106
|
height: spec.hardwareButtons.ringToggle.height,
|
|
105
107
|
width: spec.hardwareButtons.width,
|
|
106
108
|
},
|
|
107
109
|
{
|
|
108
|
-
side:
|
|
110
|
+
side: spec.hardwareButtons.volumeUp.side,
|
|
109
111
|
top: spec.hardwareButtons.volumeUp.top,
|
|
110
112
|
height: spec.hardwareButtons.volumeUp.height,
|
|
111
113
|
width: spec.hardwareButtons.width,
|
|
112
114
|
},
|
|
113
115
|
{
|
|
114
|
-
side:
|
|
116
|
+
side: spec.hardwareButtons.volumeDown.side,
|
|
115
117
|
top: spec.hardwareButtons.volumeDown.top,
|
|
116
118
|
height: spec.hardwareButtons.volumeDown.height,
|
|
117
119
|
width: spec.hardwareButtons.width,
|
|
@@ -133,7 +135,7 @@ export function getFramedScreenshotLayout(model: DeviceModel): FramedScreenshotL
|
|
|
133
135
|
logicalScreenHeight,
|
|
134
136
|
logicalScreenLeft,
|
|
135
137
|
logicalScreenTop,
|
|
136
|
-
logicalScreenRadius: isLegacyHardware ? 0 :
|
|
138
|
+
logicalScreenRadius: isLegacyHardware ? 0 : modernGeometry.screenRadius,
|
|
137
139
|
logicalFrameRadius,
|
|
138
140
|
frameBackground: isLegacyHardware
|
|
139
141
|
? 'linear-gradient(180deg, #1b1c20 0%, #0f1012 42%, #050608 100%)'
|