@mmtitanl/tablets 0.1.1
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/dist/android/index.cjs +129 -0
- package/dist/android/index.cjs.map +1 -0
- package/dist/android/index.d.cts +30 -0
- package/dist/android/index.d.ts +30 -0
- package/dist/android/index.js +98 -0
- package/dist/android/index.js.map +1 -0
- package/dist/contract-types-Ch_kM--q.d.cts +167 -0
- package/dist/contract-types-Ch_kM--q.d.ts +167 -0
- package/dist/index.cjs +7883 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +383 -0
- package/dist/index.d.ts +383 -0
- package/dist/index.js +7732 -0
- package/dist/index.js.map +1 -0
- package/dist/ios/index.cjs +129 -0
- package/dist/ios/index.cjs.map +1 -0
- package/dist/ios/index.d.cts +32 -0
- package/dist/ios/index.d.ts +32 -0
- package/dist/ios/index.js +98 -0
- package/dist/ios/index.js.map +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/android/index.ts
|
|
21
|
+
var android_exports = {};
|
|
22
|
+
__export(android_exports, {
|
|
23
|
+
GALAXY_TAB_S10_FRAME: () => GALAXY_TAB_S10_FRAME,
|
|
24
|
+
GALAXY_TAB_S10_LAYOUT: () => GALAXY_TAB_S10_LAYOUT,
|
|
25
|
+
GALAXY_TAB_S10_META: () => GALAXY_TAB_S10_META,
|
|
26
|
+
GALAXY_TAB_S10_SCREEN_RECT: () => GALAXY_TAB_S10_SCREEN_RECT,
|
|
27
|
+
GalaxyTabS10SVG: () => GalaxyTabS10SVG
|
|
28
|
+
});
|
|
29
|
+
module.exports = __toCommonJS(android_exports);
|
|
30
|
+
|
|
31
|
+
// src/android/galaxy-tab-s10.tsx
|
|
32
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
33
|
+
var GALAXY_TAB_S10_META = {
|
|
34
|
+
id: "galaxy-tab-s10",
|
|
35
|
+
name: "Galaxy Tab S10+",
|
|
36
|
+
platform: "android",
|
|
37
|
+
year: 2024,
|
|
38
|
+
formFactor: "tablet",
|
|
39
|
+
screen: {
|
|
40
|
+
width: 822,
|
|
41
|
+
height: 1316,
|
|
42
|
+
physicalWidth: 1752,
|
|
43
|
+
physicalHeight: 2800,
|
|
44
|
+
dpr: 2.13,
|
|
45
|
+
aspectRatio: "16:10",
|
|
46
|
+
cornerRadius: 12,
|
|
47
|
+
ppi: 266
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
var GALAXY_TAB_S10_LAYOUT = {
|
|
51
|
+
meta: GALAXY_TAB_S10_META,
|
|
52
|
+
safeArea: {
|
|
53
|
+
portrait: { top: 24, bottom: 16, left: 0, right: 0 },
|
|
54
|
+
landscape: { top: 24, bottom: 16, left: 0, right: 0 }
|
|
55
|
+
},
|
|
56
|
+
hardwareOverlays: {
|
|
57
|
+
type: "none",
|
|
58
|
+
portrait: { x: 0, y: 0, width: 0, height: 0, shape: "rectangle" }
|
|
59
|
+
},
|
|
60
|
+
statusBar: {
|
|
61
|
+
height: 24,
|
|
62
|
+
style: "fullwidth",
|
|
63
|
+
hasTime: true,
|
|
64
|
+
hasBattery: true,
|
|
65
|
+
hasSignal: true
|
|
66
|
+
},
|
|
67
|
+
homeIndicator: {
|
|
68
|
+
type: "gestureline",
|
|
69
|
+
height: 4,
|
|
70
|
+
width: 240,
|
|
71
|
+
visible: true
|
|
72
|
+
},
|
|
73
|
+
hardwareButtons: {
|
|
74
|
+
volumeUp: { side: "right", yPosition: 110 },
|
|
75
|
+
volumeDown: { side: "right", yPosition: 170 },
|
|
76
|
+
power: { side: "right", yPosition: 50 }
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
function GalaxyTabS10SVG({ colorScheme = "light", style }) {
|
|
80
|
+
const bodyFill = colorScheme === "dark" ? "#0e0e0f" : "#d8d8db";
|
|
81
|
+
const stroke = colorScheme === "dark" ? "#2c2c2e" : "#b8b8be";
|
|
82
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
83
|
+
"svg",
|
|
84
|
+
{
|
|
85
|
+
width: "100%",
|
|
86
|
+
height: "100%",
|
|
87
|
+
viewBox: "0 0 870 1364",
|
|
88
|
+
preserveAspectRatio: "xMidYMid meet",
|
|
89
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
90
|
+
style,
|
|
91
|
+
children: [
|
|
92
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("defs", { children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("mask", { id: "galaxy-tab-s10-bezel-mask", children: [
|
|
93
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("rect", { x: "0", y: "0", width: "870", height: "1364", rx: "28", fill: "white" }),
|
|
94
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("rect", { x: "24", y: "24", width: "822", height: "1316", rx: "12", fill: "black" })
|
|
95
|
+
] }) }),
|
|
96
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("rect", { x: "0", y: "0", width: "870", height: "1364", rx: "28", fill: bodyFill, mask: "url(#galaxy-tab-s10-bezel-mask)" }),
|
|
97
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("rect", { x: "4", y: "4", width: "862", height: "1356", rx: "24", fill: "none", stroke, strokeWidth: "2" }),
|
|
98
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { cx: "435", cy: "14", r: "3", fill: "#1c1c1e" })
|
|
99
|
+
]
|
|
100
|
+
}
|
|
101
|
+
);
|
|
102
|
+
}
|
|
103
|
+
var GALAXY_TAB_S10_FRAME = {
|
|
104
|
+
bezelTop: 24,
|
|
105
|
+
bezelBottom: 24,
|
|
106
|
+
bezelLeft: 24,
|
|
107
|
+
bezelRight: 24,
|
|
108
|
+
totalWidth: 870,
|
|
109
|
+
totalHeight: 1364,
|
|
110
|
+
screenWidth: 822,
|
|
111
|
+
screenHeight: 1316,
|
|
112
|
+
screenRadius: 12
|
|
113
|
+
};
|
|
114
|
+
var GALAXY_TAB_S10_SCREEN_RECT = {
|
|
115
|
+
x: 24,
|
|
116
|
+
y: 24,
|
|
117
|
+
width: 822,
|
|
118
|
+
height: 1316,
|
|
119
|
+
rx: 12
|
|
120
|
+
};
|
|
121
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
122
|
+
0 && (module.exports = {
|
|
123
|
+
GALAXY_TAB_S10_FRAME,
|
|
124
|
+
GALAXY_TAB_S10_LAYOUT,
|
|
125
|
+
GALAXY_TAB_S10_META,
|
|
126
|
+
GALAXY_TAB_S10_SCREEN_RECT,
|
|
127
|
+
GalaxyTabS10SVG
|
|
128
|
+
});
|
|
129
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/android/index.ts","../../src/android/galaxy-tab-s10.tsx"],"sourcesContent":["export {\n GALAXY_TAB_S10_META,\n GALAXY_TAB_S10_LAYOUT,\n GALAXY_TAB_S10_FRAME,\n GALAXY_TAB_S10_SCREEN_RECT,\n GalaxyTabS10SVG,\n} from \"./galaxy-tab-s10.js\";\n","import type { CSSProperties } from \"react\";\nimport type { DeviceLayoutData, DeviceMeta, DeviceFrameInfo, SVGScreenRect } from \"../contract-types.js\";\n\n/**\n * Galaxy Tab S10+ — dimensions\n *\n * Screen: 1316 × 822 dp @ 2.13x (physical 2800 × 1752)\n * Display: 12.4\" Dynamic AMOLED 2X, ~266 PPI\n * Hardware: Front camera in landscape top bezel (no punch-hole)\n * Frame: Aluminum\n *\n * Note: stored portrait-up so width < height. Logical: 822 × 1316.\n */\nexport const GALAXY_TAB_S10_META: DeviceMeta = {\n id: \"galaxy-tab-s10\",\n name: \"Galaxy Tab S10+\",\n platform: \"android\",\n year: 2024,\n formFactor: \"tablet\",\n screen: {\n width: 822,\n height: 1316,\n physicalWidth: 1752,\n physicalHeight: 2800,\n dpr: 2.13,\n aspectRatio: \"16:10\",\n cornerRadius: 12,\n ppi: 266,\n },\n};\n\nexport const GALAXY_TAB_S10_LAYOUT: DeviceLayoutData = {\n meta: GALAXY_TAB_S10_META,\n safeArea: {\n portrait: { top: 24, bottom: 16, left: 0, right: 0 },\n landscape: { top: 24, bottom: 16, left: 0, right: 0 },\n },\n hardwareOverlays: {\n type: \"none\",\n portrait: { x: 0, y: 0, width: 0, height: 0, shape: \"rectangle\" },\n },\n statusBar: {\n height: 24,\n style: \"fullwidth\",\n hasTime: true,\n hasBattery: true,\n hasSignal: true,\n },\n homeIndicator: {\n type: \"gestureline\",\n height: 4,\n width: 240,\n visible: true,\n },\n hardwareButtons: {\n volumeUp: { side: \"right\", yPosition: 110 },\n volumeDown: { side: \"right\", yPosition: 170 },\n power: { side: \"right\", yPosition: 50 },\n },\n};\n\ninterface DeviceSVGProps {\n colorScheme?: \"light\" | \"dark\";\n style?: CSSProperties;\n}\n\n/**\n * Placeholder SVG frame for Galaxy Tab S10+.\n * Replace with the production SVG. The viewBox must match\n * the device's logical point dimensions (822 × 1316) for alignment.\n */\nexport function GalaxyTabS10SVG({ colorScheme = \"light\", style }: DeviceSVGProps) {\n const bodyFill = colorScheme === \"dark\" ? \"#0e0e0f\" : \"#d8d8db\";\n const stroke = colorScheme === \"dark\" ? \"#2c2c2e\" : \"#b8b8be\";\n return (\n <svg\n width=\"100%\"\n height=\"100%\"\n viewBox=\"0 0 870 1364\"\n preserveAspectRatio=\"xMidYMid meet\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style={style}\n >\n <defs>\n <mask id=\"galaxy-tab-s10-bezel-mask\">\n <rect x=\"0\" y=\"0\" width=\"870\" height=\"1364\" rx=\"28\" fill=\"white\" />\n <rect x=\"24\" y=\"24\" width=\"822\" height=\"1316\" rx=\"12\" fill=\"black\" />\n </mask>\n </defs>\n <rect x=\"0\" y=\"0\" width=\"870\" height=\"1364\" rx=\"28\" fill={bodyFill} mask=\"url(#galaxy-tab-s10-bezel-mask)\" />\n <rect x=\"4\" y=\"4\" width=\"862\" height=\"1356\" rx=\"24\" fill=\"none\" stroke={stroke} strokeWidth=\"2\" />\n <circle cx=\"435\" cy=\"14\" r=\"3\" fill=\"#1c1c1e\" />\n </svg>\n );\n}\n\nexport const GALAXY_TAB_S10_FRAME: DeviceFrameInfo = {\n bezelTop: 24,\n bezelBottom: 24,\n bezelLeft: 24,\n bezelRight: 24,\n totalWidth: 870,\n totalHeight: 1364,\n screenWidth: 822,\n screenHeight: 1316,\n screenRadius: 12,\n};\n\nexport const GALAXY_TAB_S10_SCREEN_RECT: SVGScreenRect = {\n x: 24,\n y: 24,\n width: 822,\n height: 1316,\n rx: 12,\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACoFQ;AAvED,IAAM,sBAAkC;AAAA,EAC7C,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,UAAU;AAAA,EACV,MAAM;AAAA,EACN,YAAY;AAAA,EACZ,QAAQ;AAAA,IACN,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,KAAK;AAAA,IACL,aAAa;AAAA,IACb,cAAc;AAAA,IACd,KAAK;AAAA,EACP;AACF;AAEO,IAAM,wBAA0C;AAAA,EACrD,MAAM;AAAA,EACN,UAAU;AAAA,IACR,UAAU,EAAE,KAAK,IAAI,QAAQ,IAAI,MAAM,GAAG,OAAO,EAAE;AAAA,IACnD,WAAW,EAAE,KAAK,IAAI,QAAQ,IAAI,MAAM,GAAG,OAAO,EAAE;AAAA,EACtD;AAAA,EACA,kBAAkB;AAAA,IAChB,MAAM;AAAA,IACN,UAAU,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,YAAY;AAAA,EAClE;AAAA,EACA,WAAW;AAAA,IACT,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,WAAW;AAAA,EACb;AAAA,EACA,eAAe;AAAA,IACb,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,SAAS;AAAA,EACX;AAAA,EACA,iBAAiB;AAAA,IACf,UAAU,EAAE,MAAM,SAAS,WAAW,IAAI;AAAA,IAC1C,YAAY,EAAE,MAAM,SAAS,WAAW,IAAI;AAAA,IAC5C,OAAO,EAAE,MAAM,SAAS,WAAW,GAAG;AAAA,EACxC;AACF;AAYO,SAAS,gBAAgB,EAAE,cAAc,SAAS,MAAM,GAAmB;AAChF,QAAM,WAAW,gBAAgB,SAAS,YAAY;AACtD,QAAM,SAAS,gBAAgB,SAAS,YAAY;AACpD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAM;AAAA,MACN,QAAO;AAAA,MACP,SAAQ;AAAA,MACR,qBAAoB;AAAA,MACpB,OAAM;AAAA,MACN;AAAA,MAEA;AAAA,oDAAC,UACC,uDAAC,UAAK,IAAG,6BACP;AAAA,sDAAC,UAAK,GAAE,KAAI,GAAE,KAAI,OAAM,OAAM,QAAO,QAAO,IAAG,MAAK,MAAK,SAAQ;AAAA,UACjE,4CAAC,UAAK,GAAE,MAAK,GAAE,MAAK,OAAM,OAAM,QAAO,QAAO,IAAG,MAAK,MAAK,SAAQ;AAAA,WACrE,GACF;AAAA,QACA,4CAAC,UAAK,GAAE,KAAI,GAAE,KAAI,OAAM,OAAM,QAAO,QAAO,IAAG,MAAK,MAAM,UAAU,MAAK,mCAAkC;AAAA,QAC3G,4CAAC,UAAK,GAAE,KAAI,GAAE,KAAI,OAAM,OAAM,QAAO,QAAO,IAAG,MAAK,MAAK,QAAO,QAAgB,aAAY,KAAI;AAAA,QAChG,4CAAC,YAAO,IAAG,OAAM,IAAG,MAAK,GAAE,KAAI,MAAK,WAAU;AAAA;AAAA;AAAA,EAChD;AAEJ;AAEO,IAAM,uBAAwC;AAAA,EACnD,UAAU;AAAA,EACV,aAAa;AAAA,EACb,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,aAAa;AAAA,EACb,cAAc;AAAA,EACd,cAAc;AAChB;AAEO,IAAM,6BAA4C;AAAA,EACvD,GAAG;AAAA,EACH,GAAG;AAAA,EACH,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,IAAI;AACN;","names":[]}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import * as react from 'react';
|
|
2
|
+
import { CSSProperties } from 'react';
|
|
3
|
+
import { d as DeviceFrameInfo, a as DeviceLayoutData, D as DeviceMeta, e as SVGScreenRect } from '../contract-types-Ch_kM--q.cjs';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Galaxy Tab S10+ — dimensions
|
|
7
|
+
*
|
|
8
|
+
* Screen: 1316 × 822 dp @ 2.13x (physical 2800 × 1752)
|
|
9
|
+
* Display: 12.4" Dynamic AMOLED 2X, ~266 PPI
|
|
10
|
+
* Hardware: Front camera in landscape top bezel (no punch-hole)
|
|
11
|
+
* Frame: Aluminum
|
|
12
|
+
*
|
|
13
|
+
* Note: stored portrait-up so width < height. Logical: 822 × 1316.
|
|
14
|
+
*/
|
|
15
|
+
declare const GALAXY_TAB_S10_META: DeviceMeta;
|
|
16
|
+
declare const GALAXY_TAB_S10_LAYOUT: DeviceLayoutData;
|
|
17
|
+
interface DeviceSVGProps {
|
|
18
|
+
colorScheme?: "light" | "dark";
|
|
19
|
+
style?: CSSProperties;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Placeholder SVG frame for Galaxy Tab S10+.
|
|
23
|
+
* Replace with the production SVG. The viewBox must match
|
|
24
|
+
* the device's logical point dimensions (822 × 1316) for alignment.
|
|
25
|
+
*/
|
|
26
|
+
declare function GalaxyTabS10SVG({ colorScheme, style }: DeviceSVGProps): react.JSX.Element;
|
|
27
|
+
declare const GALAXY_TAB_S10_FRAME: DeviceFrameInfo;
|
|
28
|
+
declare const GALAXY_TAB_S10_SCREEN_RECT: SVGScreenRect;
|
|
29
|
+
|
|
30
|
+
export { GALAXY_TAB_S10_FRAME, GALAXY_TAB_S10_LAYOUT, GALAXY_TAB_S10_META, GALAXY_TAB_S10_SCREEN_RECT, GalaxyTabS10SVG };
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import * as react from 'react';
|
|
2
|
+
import { CSSProperties } from 'react';
|
|
3
|
+
import { d as DeviceFrameInfo, a as DeviceLayoutData, D as DeviceMeta, e as SVGScreenRect } from '../contract-types-Ch_kM--q.js';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Galaxy Tab S10+ — dimensions
|
|
7
|
+
*
|
|
8
|
+
* Screen: 1316 × 822 dp @ 2.13x (physical 2800 × 1752)
|
|
9
|
+
* Display: 12.4" Dynamic AMOLED 2X, ~266 PPI
|
|
10
|
+
* Hardware: Front camera in landscape top bezel (no punch-hole)
|
|
11
|
+
* Frame: Aluminum
|
|
12
|
+
*
|
|
13
|
+
* Note: stored portrait-up so width < height. Logical: 822 × 1316.
|
|
14
|
+
*/
|
|
15
|
+
declare const GALAXY_TAB_S10_META: DeviceMeta;
|
|
16
|
+
declare const GALAXY_TAB_S10_LAYOUT: DeviceLayoutData;
|
|
17
|
+
interface DeviceSVGProps {
|
|
18
|
+
colorScheme?: "light" | "dark";
|
|
19
|
+
style?: CSSProperties;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Placeholder SVG frame for Galaxy Tab S10+.
|
|
23
|
+
* Replace with the production SVG. The viewBox must match
|
|
24
|
+
* the device's logical point dimensions (822 × 1316) for alignment.
|
|
25
|
+
*/
|
|
26
|
+
declare function GalaxyTabS10SVG({ colorScheme, style }: DeviceSVGProps): react.JSX.Element;
|
|
27
|
+
declare const GALAXY_TAB_S10_FRAME: DeviceFrameInfo;
|
|
28
|
+
declare const GALAXY_TAB_S10_SCREEN_RECT: SVGScreenRect;
|
|
29
|
+
|
|
30
|
+
export { GALAXY_TAB_S10_FRAME, GALAXY_TAB_S10_LAYOUT, GALAXY_TAB_S10_META, GALAXY_TAB_S10_SCREEN_RECT, GalaxyTabS10SVG };
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
// src/android/galaxy-tab-s10.tsx
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
var GALAXY_TAB_S10_META = {
|
|
4
|
+
id: "galaxy-tab-s10",
|
|
5
|
+
name: "Galaxy Tab S10+",
|
|
6
|
+
platform: "android",
|
|
7
|
+
year: 2024,
|
|
8
|
+
formFactor: "tablet",
|
|
9
|
+
screen: {
|
|
10
|
+
width: 822,
|
|
11
|
+
height: 1316,
|
|
12
|
+
physicalWidth: 1752,
|
|
13
|
+
physicalHeight: 2800,
|
|
14
|
+
dpr: 2.13,
|
|
15
|
+
aspectRatio: "16:10",
|
|
16
|
+
cornerRadius: 12,
|
|
17
|
+
ppi: 266
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
var GALAXY_TAB_S10_LAYOUT = {
|
|
21
|
+
meta: GALAXY_TAB_S10_META,
|
|
22
|
+
safeArea: {
|
|
23
|
+
portrait: { top: 24, bottom: 16, left: 0, right: 0 },
|
|
24
|
+
landscape: { top: 24, bottom: 16, left: 0, right: 0 }
|
|
25
|
+
},
|
|
26
|
+
hardwareOverlays: {
|
|
27
|
+
type: "none",
|
|
28
|
+
portrait: { x: 0, y: 0, width: 0, height: 0, shape: "rectangle" }
|
|
29
|
+
},
|
|
30
|
+
statusBar: {
|
|
31
|
+
height: 24,
|
|
32
|
+
style: "fullwidth",
|
|
33
|
+
hasTime: true,
|
|
34
|
+
hasBattery: true,
|
|
35
|
+
hasSignal: true
|
|
36
|
+
},
|
|
37
|
+
homeIndicator: {
|
|
38
|
+
type: "gestureline",
|
|
39
|
+
height: 4,
|
|
40
|
+
width: 240,
|
|
41
|
+
visible: true
|
|
42
|
+
},
|
|
43
|
+
hardwareButtons: {
|
|
44
|
+
volumeUp: { side: "right", yPosition: 110 },
|
|
45
|
+
volumeDown: { side: "right", yPosition: 170 },
|
|
46
|
+
power: { side: "right", yPosition: 50 }
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
function GalaxyTabS10SVG({ colorScheme = "light", style }) {
|
|
50
|
+
const bodyFill = colorScheme === "dark" ? "#0e0e0f" : "#d8d8db";
|
|
51
|
+
const stroke = colorScheme === "dark" ? "#2c2c2e" : "#b8b8be";
|
|
52
|
+
return /* @__PURE__ */ jsxs(
|
|
53
|
+
"svg",
|
|
54
|
+
{
|
|
55
|
+
width: "100%",
|
|
56
|
+
height: "100%",
|
|
57
|
+
viewBox: "0 0 870 1364",
|
|
58
|
+
preserveAspectRatio: "xMidYMid meet",
|
|
59
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
60
|
+
style,
|
|
61
|
+
children: [
|
|
62
|
+
/* @__PURE__ */ jsx("defs", { children: /* @__PURE__ */ jsxs("mask", { id: "galaxy-tab-s10-bezel-mask", children: [
|
|
63
|
+
/* @__PURE__ */ jsx("rect", { x: "0", y: "0", width: "870", height: "1364", rx: "28", fill: "white" }),
|
|
64
|
+
/* @__PURE__ */ jsx("rect", { x: "24", y: "24", width: "822", height: "1316", rx: "12", fill: "black" })
|
|
65
|
+
] }) }),
|
|
66
|
+
/* @__PURE__ */ jsx("rect", { x: "0", y: "0", width: "870", height: "1364", rx: "28", fill: bodyFill, mask: "url(#galaxy-tab-s10-bezel-mask)" }),
|
|
67
|
+
/* @__PURE__ */ jsx("rect", { x: "4", y: "4", width: "862", height: "1356", rx: "24", fill: "none", stroke, strokeWidth: "2" }),
|
|
68
|
+
/* @__PURE__ */ jsx("circle", { cx: "435", cy: "14", r: "3", fill: "#1c1c1e" })
|
|
69
|
+
]
|
|
70
|
+
}
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
|
+
var GALAXY_TAB_S10_FRAME = {
|
|
74
|
+
bezelTop: 24,
|
|
75
|
+
bezelBottom: 24,
|
|
76
|
+
bezelLeft: 24,
|
|
77
|
+
bezelRight: 24,
|
|
78
|
+
totalWidth: 870,
|
|
79
|
+
totalHeight: 1364,
|
|
80
|
+
screenWidth: 822,
|
|
81
|
+
screenHeight: 1316,
|
|
82
|
+
screenRadius: 12
|
|
83
|
+
};
|
|
84
|
+
var GALAXY_TAB_S10_SCREEN_RECT = {
|
|
85
|
+
x: 24,
|
|
86
|
+
y: 24,
|
|
87
|
+
width: 822,
|
|
88
|
+
height: 1316,
|
|
89
|
+
rx: 12
|
|
90
|
+
};
|
|
91
|
+
export {
|
|
92
|
+
GALAXY_TAB_S10_FRAME,
|
|
93
|
+
GALAXY_TAB_S10_LAYOUT,
|
|
94
|
+
GALAXY_TAB_S10_META,
|
|
95
|
+
GALAXY_TAB_S10_SCREEN_RECT,
|
|
96
|
+
GalaxyTabS10SVG
|
|
97
|
+
};
|
|
98
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/android/galaxy-tab-s10.tsx"],"sourcesContent":["import type { CSSProperties } from \"react\";\nimport type { DeviceLayoutData, DeviceMeta, DeviceFrameInfo, SVGScreenRect } from \"../contract-types.js\";\n\n/**\n * Galaxy Tab S10+ — dimensions\n *\n * Screen: 1316 × 822 dp @ 2.13x (physical 2800 × 1752)\n * Display: 12.4\" Dynamic AMOLED 2X, ~266 PPI\n * Hardware: Front camera in landscape top bezel (no punch-hole)\n * Frame: Aluminum\n *\n * Note: stored portrait-up so width < height. Logical: 822 × 1316.\n */\nexport const GALAXY_TAB_S10_META: DeviceMeta = {\n id: \"galaxy-tab-s10\",\n name: \"Galaxy Tab S10+\",\n platform: \"android\",\n year: 2024,\n formFactor: \"tablet\",\n screen: {\n width: 822,\n height: 1316,\n physicalWidth: 1752,\n physicalHeight: 2800,\n dpr: 2.13,\n aspectRatio: \"16:10\",\n cornerRadius: 12,\n ppi: 266,\n },\n};\n\nexport const GALAXY_TAB_S10_LAYOUT: DeviceLayoutData = {\n meta: GALAXY_TAB_S10_META,\n safeArea: {\n portrait: { top: 24, bottom: 16, left: 0, right: 0 },\n landscape: { top: 24, bottom: 16, left: 0, right: 0 },\n },\n hardwareOverlays: {\n type: \"none\",\n portrait: { x: 0, y: 0, width: 0, height: 0, shape: \"rectangle\" },\n },\n statusBar: {\n height: 24,\n style: \"fullwidth\",\n hasTime: true,\n hasBattery: true,\n hasSignal: true,\n },\n homeIndicator: {\n type: \"gestureline\",\n height: 4,\n width: 240,\n visible: true,\n },\n hardwareButtons: {\n volumeUp: { side: \"right\", yPosition: 110 },\n volumeDown: { side: \"right\", yPosition: 170 },\n power: { side: \"right\", yPosition: 50 },\n },\n};\n\ninterface DeviceSVGProps {\n colorScheme?: \"light\" | \"dark\";\n style?: CSSProperties;\n}\n\n/**\n * Placeholder SVG frame for Galaxy Tab S10+.\n * Replace with the production SVG. The viewBox must match\n * the device's logical point dimensions (822 × 1316) for alignment.\n */\nexport function GalaxyTabS10SVG({ colorScheme = \"light\", style }: DeviceSVGProps) {\n const bodyFill = colorScheme === \"dark\" ? \"#0e0e0f\" : \"#d8d8db\";\n const stroke = colorScheme === \"dark\" ? \"#2c2c2e\" : \"#b8b8be\";\n return (\n <svg\n width=\"100%\"\n height=\"100%\"\n viewBox=\"0 0 870 1364\"\n preserveAspectRatio=\"xMidYMid meet\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style={style}\n >\n <defs>\n <mask id=\"galaxy-tab-s10-bezel-mask\">\n <rect x=\"0\" y=\"0\" width=\"870\" height=\"1364\" rx=\"28\" fill=\"white\" />\n <rect x=\"24\" y=\"24\" width=\"822\" height=\"1316\" rx=\"12\" fill=\"black\" />\n </mask>\n </defs>\n <rect x=\"0\" y=\"0\" width=\"870\" height=\"1364\" rx=\"28\" fill={bodyFill} mask=\"url(#galaxy-tab-s10-bezel-mask)\" />\n <rect x=\"4\" y=\"4\" width=\"862\" height=\"1356\" rx=\"24\" fill=\"none\" stroke={stroke} strokeWidth=\"2\" />\n <circle cx=\"435\" cy=\"14\" r=\"3\" fill=\"#1c1c1e\" />\n </svg>\n );\n}\n\nexport const GALAXY_TAB_S10_FRAME: DeviceFrameInfo = {\n bezelTop: 24,\n bezelBottom: 24,\n bezelLeft: 24,\n bezelRight: 24,\n totalWidth: 870,\n totalHeight: 1364,\n screenWidth: 822,\n screenHeight: 1316,\n screenRadius: 12,\n};\n\nexport const GALAXY_TAB_S10_SCREEN_RECT: SVGScreenRect = {\n x: 24,\n y: 24,\n width: 822,\n height: 1316,\n rx: 12,\n};\n"],"mappings":";AAoFQ,SACE,KADF;AAvED,IAAM,sBAAkC;AAAA,EAC7C,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,UAAU;AAAA,EACV,MAAM;AAAA,EACN,YAAY;AAAA,EACZ,QAAQ;AAAA,IACN,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,KAAK;AAAA,IACL,aAAa;AAAA,IACb,cAAc;AAAA,IACd,KAAK;AAAA,EACP;AACF;AAEO,IAAM,wBAA0C;AAAA,EACrD,MAAM;AAAA,EACN,UAAU;AAAA,IACR,UAAU,EAAE,KAAK,IAAI,QAAQ,IAAI,MAAM,GAAG,OAAO,EAAE;AAAA,IACnD,WAAW,EAAE,KAAK,IAAI,QAAQ,IAAI,MAAM,GAAG,OAAO,EAAE;AAAA,EACtD;AAAA,EACA,kBAAkB;AAAA,IAChB,MAAM;AAAA,IACN,UAAU,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,YAAY;AAAA,EAClE;AAAA,EACA,WAAW;AAAA,IACT,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,WAAW;AAAA,EACb;AAAA,EACA,eAAe;AAAA,IACb,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,SAAS;AAAA,EACX;AAAA,EACA,iBAAiB;AAAA,IACf,UAAU,EAAE,MAAM,SAAS,WAAW,IAAI;AAAA,IAC1C,YAAY,EAAE,MAAM,SAAS,WAAW,IAAI;AAAA,IAC5C,OAAO,EAAE,MAAM,SAAS,WAAW,GAAG;AAAA,EACxC;AACF;AAYO,SAAS,gBAAgB,EAAE,cAAc,SAAS,MAAM,GAAmB;AAChF,QAAM,WAAW,gBAAgB,SAAS,YAAY;AACtD,QAAM,SAAS,gBAAgB,SAAS,YAAY;AACpD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAM;AAAA,MACN,QAAO;AAAA,MACP,SAAQ;AAAA,MACR,qBAAoB;AAAA,MACpB,OAAM;AAAA,MACN;AAAA,MAEA;AAAA,4BAAC,UACC,+BAAC,UAAK,IAAG,6BACP;AAAA,8BAAC,UAAK,GAAE,KAAI,GAAE,KAAI,OAAM,OAAM,QAAO,QAAO,IAAG,MAAK,MAAK,SAAQ;AAAA,UACjE,oBAAC,UAAK,GAAE,MAAK,GAAE,MAAK,OAAM,OAAM,QAAO,QAAO,IAAG,MAAK,MAAK,SAAQ;AAAA,WACrE,GACF;AAAA,QACA,oBAAC,UAAK,GAAE,KAAI,GAAE,KAAI,OAAM,OAAM,QAAO,QAAO,IAAG,MAAK,MAAM,UAAU,MAAK,mCAAkC;AAAA,QAC3G,oBAAC,UAAK,GAAE,KAAI,GAAE,KAAI,OAAM,OAAM,QAAO,QAAO,IAAG,MAAK,MAAK,QAAO,QAAgB,aAAY,KAAI;AAAA,QAChG,oBAAC,YAAO,IAAG,OAAM,IAAG,MAAK,GAAE,KAAI,MAAK,WAAU;AAAA;AAAA;AAAA,EAChD;AAEJ;AAEO,IAAM,uBAAwC;AAAA,EACnD,UAAU;AAAA,EACV,aAAa;AAAA,EACb,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,aAAa;AAAA,EACb,cAAc;AAAA,EACd,cAAc;AAChB;AAEO,IAAM,6BAA4C;AAAA,EACvD,GAAG;AAAA,EACH,GAAG;AAAA,EACH,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,IAAI;AACN;","names":[]}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
interface SafeAreaInsets {
|
|
2
|
+
top: number;
|
|
3
|
+
bottom: number;
|
|
4
|
+
left: number;
|
|
5
|
+
right: number;
|
|
6
|
+
}
|
|
7
|
+
type HardwareOverlayType = "dynamic-island" | "notch" | "punch-hole" | "pill-cutout" | "none";
|
|
8
|
+
interface OverlayRect {
|
|
9
|
+
x: number;
|
|
10
|
+
y: number;
|
|
11
|
+
width: number;
|
|
12
|
+
height: number;
|
|
13
|
+
shape: "pill" | "circle" | "teardrop" | "rectangle";
|
|
14
|
+
cornerRadius?: number;
|
|
15
|
+
}
|
|
16
|
+
interface ContentRect {
|
|
17
|
+
x: number;
|
|
18
|
+
y: number;
|
|
19
|
+
width: number;
|
|
20
|
+
height: number;
|
|
21
|
+
}
|
|
22
|
+
interface DeviceCSSVariables {
|
|
23
|
+
"--device-width": string;
|
|
24
|
+
"--device-height": string;
|
|
25
|
+
"--safe-top": string;
|
|
26
|
+
"--safe-bottom": string;
|
|
27
|
+
"--safe-left": string;
|
|
28
|
+
"--safe-right": string;
|
|
29
|
+
"--status-bar-height": string;
|
|
30
|
+
"--home-indicator-height": string;
|
|
31
|
+
"--corner-radius": string;
|
|
32
|
+
"--island-width"?: string;
|
|
33
|
+
"--island-height"?: string;
|
|
34
|
+
}
|
|
35
|
+
interface DeviceMeta {
|
|
36
|
+
id: string;
|
|
37
|
+
name: string;
|
|
38
|
+
platform: "ios" | "android";
|
|
39
|
+
year: number;
|
|
40
|
+
/** Device form factor — drives gallery grouping and layout heuristics */
|
|
41
|
+
formFactor?: "tablet" | "phone" | "foldable";
|
|
42
|
+
screen: {
|
|
43
|
+
width: number;
|
|
44
|
+
height: number;
|
|
45
|
+
physicalWidth: number;
|
|
46
|
+
physicalHeight: number;
|
|
47
|
+
dpr: number;
|
|
48
|
+
aspectRatio: string;
|
|
49
|
+
cornerRadius: number;
|
|
50
|
+
ppi: number;
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
interface DeviceFrameInfo {
|
|
54
|
+
bezelTop: number;
|
|
55
|
+
bezelBottom: number;
|
|
56
|
+
bezelLeft: number;
|
|
57
|
+
bezelRight: number;
|
|
58
|
+
totalWidth: number;
|
|
59
|
+
totalHeight: number;
|
|
60
|
+
screenWidth: number;
|
|
61
|
+
screenHeight: number;
|
|
62
|
+
screenRadius: number;
|
|
63
|
+
/** Optional per-edge overrides. Fall back to screenRadius when unset. */
|
|
64
|
+
screenRadiusTop?: number;
|
|
65
|
+
screenRadiusBottom?: number;
|
|
66
|
+
}
|
|
67
|
+
interface SVGCropRect {
|
|
68
|
+
x: number;
|
|
69
|
+
y: number;
|
|
70
|
+
width: number;
|
|
71
|
+
height: number;
|
|
72
|
+
}
|
|
73
|
+
interface SVGScreenRect {
|
|
74
|
+
x: number;
|
|
75
|
+
y: number;
|
|
76
|
+
width: number;
|
|
77
|
+
height: number;
|
|
78
|
+
rx?: number;
|
|
79
|
+
/** Optional per-edge overrides. Fall back to `rx` when unset. */
|
|
80
|
+
rxTop?: number;
|
|
81
|
+
rxBottom?: number;
|
|
82
|
+
}
|
|
83
|
+
interface DeviceLayoutContract {
|
|
84
|
+
device: {
|
|
85
|
+
id: string;
|
|
86
|
+
name: string;
|
|
87
|
+
platform: "ios" | "android";
|
|
88
|
+
year: number;
|
|
89
|
+
};
|
|
90
|
+
screen: DeviceMeta["screen"];
|
|
91
|
+
safeArea: {
|
|
92
|
+
portrait: SafeAreaInsets;
|
|
93
|
+
landscape: SafeAreaInsets;
|
|
94
|
+
};
|
|
95
|
+
hardwareOverlays: {
|
|
96
|
+
type: HardwareOverlayType;
|
|
97
|
+
portrait: OverlayRect;
|
|
98
|
+
landscape?: OverlayRect;
|
|
99
|
+
};
|
|
100
|
+
statusBar: {
|
|
101
|
+
height: number;
|
|
102
|
+
style: "dynamic-island" | "notch" | "fullwidth";
|
|
103
|
+
hasTime: boolean;
|
|
104
|
+
hasBattery: boolean;
|
|
105
|
+
hasSignal: boolean;
|
|
106
|
+
};
|
|
107
|
+
homeIndicator: {
|
|
108
|
+
type: "swipe-bar" | "button" | "gestureline" | "none";
|
|
109
|
+
height: number;
|
|
110
|
+
width?: number;
|
|
111
|
+
visible: boolean;
|
|
112
|
+
};
|
|
113
|
+
hardwareButtons?: {
|
|
114
|
+
volumeUp?: {
|
|
115
|
+
side: "left" | "right";
|
|
116
|
+
yPosition: number;
|
|
117
|
+
height?: number;
|
|
118
|
+
};
|
|
119
|
+
volumeDown?: {
|
|
120
|
+
side: "left" | "right";
|
|
121
|
+
yPosition: number;
|
|
122
|
+
height?: number;
|
|
123
|
+
};
|
|
124
|
+
power?: {
|
|
125
|
+
side: "left" | "right";
|
|
126
|
+
yPosition: number;
|
|
127
|
+
height?: number;
|
|
128
|
+
};
|
|
129
|
+
actionButton?: {
|
|
130
|
+
side: "left" | "right";
|
|
131
|
+
yPosition: number;
|
|
132
|
+
};
|
|
133
|
+
cameraControl?: {
|
|
134
|
+
side: "left" | "right";
|
|
135
|
+
yPosition: number;
|
|
136
|
+
};
|
|
137
|
+
};
|
|
138
|
+
contentZone: {
|
|
139
|
+
portrait: ContentRect;
|
|
140
|
+
landscape: ContentRect;
|
|
141
|
+
};
|
|
142
|
+
cssVariables: DeviceCSSVariables;
|
|
143
|
+
aiPromptConstraints: string;
|
|
144
|
+
}
|
|
145
|
+
interface DeviceLayoutData {
|
|
146
|
+
meta: DeviceMeta;
|
|
147
|
+
safeArea: {
|
|
148
|
+
portrait: SafeAreaInsets;
|
|
149
|
+
landscape: SafeAreaInsets;
|
|
150
|
+
};
|
|
151
|
+
hardwareOverlays: DeviceLayoutContract["hardwareOverlays"];
|
|
152
|
+
statusBar: DeviceLayoutContract["statusBar"];
|
|
153
|
+
homeIndicator: DeviceLayoutContract["homeIndicator"];
|
|
154
|
+
hardwareButtons?: DeviceLayoutContract["hardwareButtons"];
|
|
155
|
+
}
|
|
156
|
+
interface RegisteredDevice {
|
|
157
|
+
meta: DeviceMeta;
|
|
158
|
+
normalizedSVG: string;
|
|
159
|
+
contract: DeviceLayoutContract;
|
|
160
|
+
registeredAt: string;
|
|
161
|
+
source: "builtin" | "custom";
|
|
162
|
+
frameInfo?: DeviceFrameInfo;
|
|
163
|
+
svgCrop?: SVGCropRect;
|
|
164
|
+
screenRect?: SVGScreenRect;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
export type { ContentRect as C, DeviceMeta as D, HardwareOverlayType as H, OverlayRect as O, RegisteredDevice as R, SafeAreaInsets as S, DeviceLayoutData as a, DeviceLayoutContract as b, DeviceCSSVariables as c, DeviceFrameInfo as d, SVGScreenRect as e, SVGCropRect as f };
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
interface SafeAreaInsets {
|
|
2
|
+
top: number;
|
|
3
|
+
bottom: number;
|
|
4
|
+
left: number;
|
|
5
|
+
right: number;
|
|
6
|
+
}
|
|
7
|
+
type HardwareOverlayType = "dynamic-island" | "notch" | "punch-hole" | "pill-cutout" | "none";
|
|
8
|
+
interface OverlayRect {
|
|
9
|
+
x: number;
|
|
10
|
+
y: number;
|
|
11
|
+
width: number;
|
|
12
|
+
height: number;
|
|
13
|
+
shape: "pill" | "circle" | "teardrop" | "rectangle";
|
|
14
|
+
cornerRadius?: number;
|
|
15
|
+
}
|
|
16
|
+
interface ContentRect {
|
|
17
|
+
x: number;
|
|
18
|
+
y: number;
|
|
19
|
+
width: number;
|
|
20
|
+
height: number;
|
|
21
|
+
}
|
|
22
|
+
interface DeviceCSSVariables {
|
|
23
|
+
"--device-width": string;
|
|
24
|
+
"--device-height": string;
|
|
25
|
+
"--safe-top": string;
|
|
26
|
+
"--safe-bottom": string;
|
|
27
|
+
"--safe-left": string;
|
|
28
|
+
"--safe-right": string;
|
|
29
|
+
"--status-bar-height": string;
|
|
30
|
+
"--home-indicator-height": string;
|
|
31
|
+
"--corner-radius": string;
|
|
32
|
+
"--island-width"?: string;
|
|
33
|
+
"--island-height"?: string;
|
|
34
|
+
}
|
|
35
|
+
interface DeviceMeta {
|
|
36
|
+
id: string;
|
|
37
|
+
name: string;
|
|
38
|
+
platform: "ios" | "android";
|
|
39
|
+
year: number;
|
|
40
|
+
/** Device form factor — drives gallery grouping and layout heuristics */
|
|
41
|
+
formFactor?: "tablet" | "phone" | "foldable";
|
|
42
|
+
screen: {
|
|
43
|
+
width: number;
|
|
44
|
+
height: number;
|
|
45
|
+
physicalWidth: number;
|
|
46
|
+
physicalHeight: number;
|
|
47
|
+
dpr: number;
|
|
48
|
+
aspectRatio: string;
|
|
49
|
+
cornerRadius: number;
|
|
50
|
+
ppi: number;
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
interface DeviceFrameInfo {
|
|
54
|
+
bezelTop: number;
|
|
55
|
+
bezelBottom: number;
|
|
56
|
+
bezelLeft: number;
|
|
57
|
+
bezelRight: number;
|
|
58
|
+
totalWidth: number;
|
|
59
|
+
totalHeight: number;
|
|
60
|
+
screenWidth: number;
|
|
61
|
+
screenHeight: number;
|
|
62
|
+
screenRadius: number;
|
|
63
|
+
/** Optional per-edge overrides. Fall back to screenRadius when unset. */
|
|
64
|
+
screenRadiusTop?: number;
|
|
65
|
+
screenRadiusBottom?: number;
|
|
66
|
+
}
|
|
67
|
+
interface SVGCropRect {
|
|
68
|
+
x: number;
|
|
69
|
+
y: number;
|
|
70
|
+
width: number;
|
|
71
|
+
height: number;
|
|
72
|
+
}
|
|
73
|
+
interface SVGScreenRect {
|
|
74
|
+
x: number;
|
|
75
|
+
y: number;
|
|
76
|
+
width: number;
|
|
77
|
+
height: number;
|
|
78
|
+
rx?: number;
|
|
79
|
+
/** Optional per-edge overrides. Fall back to `rx` when unset. */
|
|
80
|
+
rxTop?: number;
|
|
81
|
+
rxBottom?: number;
|
|
82
|
+
}
|
|
83
|
+
interface DeviceLayoutContract {
|
|
84
|
+
device: {
|
|
85
|
+
id: string;
|
|
86
|
+
name: string;
|
|
87
|
+
platform: "ios" | "android";
|
|
88
|
+
year: number;
|
|
89
|
+
};
|
|
90
|
+
screen: DeviceMeta["screen"];
|
|
91
|
+
safeArea: {
|
|
92
|
+
portrait: SafeAreaInsets;
|
|
93
|
+
landscape: SafeAreaInsets;
|
|
94
|
+
};
|
|
95
|
+
hardwareOverlays: {
|
|
96
|
+
type: HardwareOverlayType;
|
|
97
|
+
portrait: OverlayRect;
|
|
98
|
+
landscape?: OverlayRect;
|
|
99
|
+
};
|
|
100
|
+
statusBar: {
|
|
101
|
+
height: number;
|
|
102
|
+
style: "dynamic-island" | "notch" | "fullwidth";
|
|
103
|
+
hasTime: boolean;
|
|
104
|
+
hasBattery: boolean;
|
|
105
|
+
hasSignal: boolean;
|
|
106
|
+
};
|
|
107
|
+
homeIndicator: {
|
|
108
|
+
type: "swipe-bar" | "button" | "gestureline" | "none";
|
|
109
|
+
height: number;
|
|
110
|
+
width?: number;
|
|
111
|
+
visible: boolean;
|
|
112
|
+
};
|
|
113
|
+
hardwareButtons?: {
|
|
114
|
+
volumeUp?: {
|
|
115
|
+
side: "left" | "right";
|
|
116
|
+
yPosition: number;
|
|
117
|
+
height?: number;
|
|
118
|
+
};
|
|
119
|
+
volumeDown?: {
|
|
120
|
+
side: "left" | "right";
|
|
121
|
+
yPosition: number;
|
|
122
|
+
height?: number;
|
|
123
|
+
};
|
|
124
|
+
power?: {
|
|
125
|
+
side: "left" | "right";
|
|
126
|
+
yPosition: number;
|
|
127
|
+
height?: number;
|
|
128
|
+
};
|
|
129
|
+
actionButton?: {
|
|
130
|
+
side: "left" | "right";
|
|
131
|
+
yPosition: number;
|
|
132
|
+
};
|
|
133
|
+
cameraControl?: {
|
|
134
|
+
side: "left" | "right";
|
|
135
|
+
yPosition: number;
|
|
136
|
+
};
|
|
137
|
+
};
|
|
138
|
+
contentZone: {
|
|
139
|
+
portrait: ContentRect;
|
|
140
|
+
landscape: ContentRect;
|
|
141
|
+
};
|
|
142
|
+
cssVariables: DeviceCSSVariables;
|
|
143
|
+
aiPromptConstraints: string;
|
|
144
|
+
}
|
|
145
|
+
interface DeviceLayoutData {
|
|
146
|
+
meta: DeviceMeta;
|
|
147
|
+
safeArea: {
|
|
148
|
+
portrait: SafeAreaInsets;
|
|
149
|
+
landscape: SafeAreaInsets;
|
|
150
|
+
};
|
|
151
|
+
hardwareOverlays: DeviceLayoutContract["hardwareOverlays"];
|
|
152
|
+
statusBar: DeviceLayoutContract["statusBar"];
|
|
153
|
+
homeIndicator: DeviceLayoutContract["homeIndicator"];
|
|
154
|
+
hardwareButtons?: DeviceLayoutContract["hardwareButtons"];
|
|
155
|
+
}
|
|
156
|
+
interface RegisteredDevice {
|
|
157
|
+
meta: DeviceMeta;
|
|
158
|
+
normalizedSVG: string;
|
|
159
|
+
contract: DeviceLayoutContract;
|
|
160
|
+
registeredAt: string;
|
|
161
|
+
source: "builtin" | "custom";
|
|
162
|
+
frameInfo?: DeviceFrameInfo;
|
|
163
|
+
svgCrop?: SVGCropRect;
|
|
164
|
+
screenRect?: SVGScreenRect;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
export type { ContentRect as C, DeviceMeta as D, HardwareOverlayType as H, OverlayRect as O, RegisteredDevice as R, SafeAreaInsets as S, DeviceLayoutData as a, DeviceLayoutContract as b, DeviceCSSVariables as c, DeviceFrameInfo as d, SVGScreenRect as e, SVGCropRect as f };
|