@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.
@@ -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 };