@erkamyaman/capacitor-foldable 7.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/ErkamyamanCapacitorFoldable.podspec +17 -0
  2. package/LICENSE +21 -0
  3. package/Package.swift +28 -0
  4. package/README.md +457 -0
  5. package/android/build.gradle +71 -0
  6. package/android/src/main/AndroidManifest.xml +2 -0
  7. package/android/src/main/kotlin/io/github/erkamyaman/foldable/DisplayModes.kt +115 -0
  8. package/android/src/main/kotlin/io/github/erkamyaman/foldable/Foldable.kt +189 -0
  9. package/android/src/main/kotlin/io/github/erkamyaman/foldable/FoldablePlugin.kt +333 -0
  10. package/android/src/main/res/.gitkeep +0 -0
  11. package/dist/docs.json +584 -0
  12. package/dist/esm/css.d.ts +8 -0
  13. package/dist/esm/css.js +29 -0
  14. package/dist/esm/css.js.map +1 -0
  15. package/dist/esm/definitions.d.ts +267 -0
  16. package/dist/esm/definitions.js +2 -0
  17. package/dist/esm/definitions.js.map +1 -0
  18. package/dist/esm/index.d.ts +5 -0
  19. package/dist/esm/index.js +9 -0
  20. package/dist/esm/index.js.map +1 -0
  21. package/dist/esm/polyfill.d.ts +19 -0
  22. package/dist/esm/polyfill.js +76 -0
  23. package/dist/esm/polyfill.js.map +1 -0
  24. package/dist/esm/segments.d.ts +8 -0
  25. package/dist/esm/segments.js +26 -0
  26. package/dist/esm/segments.js.map +1 -0
  27. package/dist/esm/size-class.d.ts +2 -0
  28. package/dist/esm/size-class.js +33 -0
  29. package/dist/esm/size-class.js.map +1 -0
  30. package/dist/esm/web.d.ts +21 -0
  31. package/dist/esm/web.js +46 -0
  32. package/dist/esm/web.js.map +1 -0
  33. package/dist/plugin.cjs.js +222 -0
  34. package/dist/plugin.cjs.js.map +1 -0
  35. package/dist/plugin.js +225 -0
  36. package/dist/plugin.js.map +1 -0
  37. package/ios/Sources/FoldablePlugin/Foldable.swift +156 -0
  38. package/ios/Sources/FoldablePlugin/FoldablePlugin.swift +194 -0
  39. package/ios/Sources/FoldablePlugin/ReservedRegionFoldProvider.swift +69 -0
  40. package/ios/Sources/FoldablePlugin/UIKitFoldSource.swift +53 -0
  41. package/ios/Tests/FoldablePluginTests/FoldableTests.swift +104 -0
  42. package/ios/Tests/FoldablePluginTests/ReservedRegionFoldProviderTests.swift +143 -0
  43. package/package.json +96 -0
@@ -0,0 +1,222 @@
1
+ 'use strict';
2
+
3
+ var core = require('@capacitor/core');
4
+
5
+ const CSS_CLASSES = [
6
+ 'horizontal-viewport-segments-2',
7
+ 'vertical-viewport-segments-2',
8
+ 'device-posture-continuous',
9
+ 'device-posture-folded',
10
+ ];
11
+ const BAR_CLASSES = ['vertical-bars-leading', 'vertical-bars-trailing'];
12
+ function barClassFor(edge) {
13
+ return edge ? `vertical-bars-${edge}` : null;
14
+ }
15
+ function cssFor(segments, posture) {
16
+ const stacked = segments.length > 1 && segments[1].y > segments[0].y;
17
+ const variables = {};
18
+ segments.forEach((segment, index) => {
19
+ const suffix = stacked ? `0-${index}` : `${index}-0`;
20
+ variables[`--viewport-segment-top-${suffix}`] = `${segment.y}px`;
21
+ variables[`--viewport-segment-left-${suffix}`] = `${segment.x}px`;
22
+ variables[`--viewport-segment-bottom-${suffix}`] = `${segment.y + segment.height}px`;
23
+ variables[`--viewport-segment-right-${suffix}`] = `${segment.x + segment.width}px`;
24
+ variables[`--viewport-segment-width-${suffix}`] = `${segment.width}px`;
25
+ variables[`--viewport-segment-height-${suffix}`] = `${segment.height}px`;
26
+ });
27
+ const classes = [`device-posture-${posture}`];
28
+ if (segments.length > 1) {
29
+ classes.push(stacked ? 'vertical-viewport-segments-2' : 'horizontal-viewport-segments-2');
30
+ }
31
+ return { variables, classes };
32
+ }
33
+
34
+ const EDGE_TOLERANCE = 1;
35
+ function splitViewport(fold, width, height) {
36
+ const whole = [{ x: 0, y: 0, width, height }];
37
+ const hinge = fold === null || fold === void 0 ? void 0 : fold.hingeBounds;
38
+ if (!(fold === null || fold === void 0 ? void 0 : fold.isSeparating) || !hinge)
39
+ return whole;
40
+ if (fold.hingeOrientation === 'vertical') {
41
+ const right = hinge.x + hinge.width;
42
+ const spansHeight = hinge.y <= EDGE_TOLERANCE && hinge.y + hinge.height >= height - EDGE_TOLERANCE;
43
+ if (!spansHeight || hinge.x <= 0 || right >= width)
44
+ return whole;
45
+ return [
46
+ { x: 0, y: 0, width: hinge.x, height },
47
+ { x: right, y: 0, width: width - right, height },
48
+ ];
49
+ }
50
+ const bottom = hinge.y + hinge.height;
51
+ const spansWidth = hinge.x <= EDGE_TOLERANCE && hinge.x + hinge.width >= width - EDGE_TOLERANCE;
52
+ if (!spansWidth || hinge.y <= 0 || bottom >= height)
53
+ return whole;
54
+ return [
55
+ { x: 0, y: 0, width, height: hinge.y },
56
+ { x: 0, y: bottom, width, height: height - bottom },
57
+ ];
58
+ }
59
+
60
+ class DevicePosturePolyfill extends EventTarget {
61
+ constructor() {
62
+ super(...arguments);
63
+ this.onchange = null;
64
+ this.current = 'continuous';
65
+ }
66
+ get type() {
67
+ return this.current;
68
+ }
69
+ update(type) {
70
+ var _a;
71
+ if (type === this.current)
72
+ return;
73
+ this.current = type;
74
+ const event = new Event('change');
75
+ (_a = this.onchange) === null || _a === void 0 ? void 0 : _a.call(this, event);
76
+ this.dispatchEvent(event);
77
+ }
78
+ }
79
+ const postureOf = (fold) => (fold === null || fold === void 0 ? void 0 : fold.state) === 'half-opened' ? 'folded' : 'continuous';
80
+ let installation = null;
81
+ function install(plugin) {
82
+ if (!core.Capacitor.isNativePlatform())
83
+ return Promise.resolve();
84
+ installation !== null && installation !== void 0 ? installation : (installation = run(plugin));
85
+ return installation;
86
+ }
87
+ async function run(plugin) {
88
+ let fold = null;
89
+ const currentSegments = () => splitViewport(fold, window.innerWidth, window.innerHeight);
90
+ if (!('Viewport' in window)) {
91
+ Object.defineProperty(window, 'viewport', {
92
+ configurable: true,
93
+ value: {
94
+ get segments() {
95
+ return Object.freeze(currentSegments().map((rect) => new DOMRect(rect.x, rect.y, rect.width, rect.height)));
96
+ },
97
+ },
98
+ });
99
+ }
100
+ const posture = 'DevicePosture' in window ? null : new DevicePosturePolyfill();
101
+ if (posture) {
102
+ Object.defineProperty(navigator, 'devicePosture', { configurable: true, value: posture });
103
+ }
104
+ const root = document.documentElement;
105
+ let variables = [];
106
+ const applyCss = () => {
107
+ const css = cssFor(currentSegments(), postureOf(fold));
108
+ for (const name of variables)
109
+ root.style.removeProperty(name);
110
+ variables = Object.keys(css.variables);
111
+ for (const name of variables)
112
+ root.style.setProperty(name, css.variables[name]);
113
+ for (const name of CSS_CLASSES)
114
+ root.classList.toggle(name, css.classes.includes(name));
115
+ };
116
+ const apply = (next) => {
117
+ fold = next;
118
+ posture === null || posture === void 0 ? void 0 : posture.update(postureOf(next));
119
+ applyCss();
120
+ };
121
+ const applyBars = ({ verticalBarEdge }) => {
122
+ const active = barClassFor(verticalBarEdge);
123
+ for (const name of BAR_CLASSES)
124
+ root.classList.toggle(name, name === active);
125
+ };
126
+ window.addEventListener('resize', applyCss);
127
+ await plugin.addListener('foldStateChange', apply);
128
+ await plugin.addListener('barPlacementChange', applyBars);
129
+ apply(await plugin.getFoldState());
130
+ applyBars(await plugin.getBarPlacement());
131
+ }
132
+
133
+ const Foldable = core.registerPlugin('Foldable', {
134
+ web: () => Promise.resolve().then(function () { return web; }).then((m) => new m.FoldableWeb()),
135
+ });
136
+ const installFoldablePolyfill = () => install(Foldable);
137
+
138
+ const MEDIUM_WIDTH = 600;
139
+ const EXPANDED_WIDTH = 840;
140
+ const LARGE_WIDTH = 1200;
141
+ const EXTRA_LARGE_WIDTH = 1600;
142
+ const MEDIUM_HEIGHT = 480;
143
+ const EXPANDED_HEIGHT = 900;
144
+ function widthClassOf(width) {
145
+ if (width >= EXTRA_LARGE_WIDTH)
146
+ return 'extraLarge';
147
+ if (width >= LARGE_WIDTH)
148
+ return 'large';
149
+ if (width >= EXPANDED_WIDTH)
150
+ return 'expanded';
151
+ if (width >= MEDIUM_WIDTH)
152
+ return 'medium';
153
+ return 'compact';
154
+ }
155
+ function heightClassOf(height) {
156
+ if (height >= EXPANDED_HEIGHT)
157
+ return 'expanded';
158
+ if (height >= MEDIUM_HEIGHT)
159
+ return 'medium';
160
+ return 'compact';
161
+ }
162
+ function sizeClassOf(width, height) {
163
+ return {
164
+ horizontal: width >= MEDIUM_WIDTH ? 'regular' : 'compact',
165
+ vertical: height >= MEDIUM_HEIGHT ? 'regular' : 'compact',
166
+ widthClass: widthClassOf(width),
167
+ heightClass: heightClassOf(height),
168
+ };
169
+ }
170
+
171
+ class FoldableWeb extends core.WebPlugin {
172
+ constructor() {
173
+ super();
174
+ this.sizeClass = sizeClassOf(window.innerWidth, window.innerHeight);
175
+ window.addEventListener('resize', () => {
176
+ const next = sizeClassOf(window.innerWidth, window.innerHeight);
177
+ if (JSON.stringify(next) === JSON.stringify(this.sizeClass))
178
+ return;
179
+ this.sizeClass = next;
180
+ this.notifyListeners('sizeClassChange', next);
181
+ });
182
+ }
183
+ async isDeviceFoldable() {
184
+ return { foldable: false, supportsTabletop: false };
185
+ }
186
+ async getFoldState() {
187
+ return { state: 'flat', isSeparating: false, posture: 'flat' };
188
+ }
189
+ async getHingeAngle() {
190
+ return { angle: null };
191
+ }
192
+ async getSizeClass() {
193
+ return sizeClassOf(window.innerWidth, window.innerHeight);
194
+ }
195
+ async getDisplayModes() {
196
+ return { rearDisplay: 'unsupported', dualScreen: 'unsupported' };
197
+ }
198
+ async getBarPlacement() {
199
+ return { verticalBarEdge: null };
200
+ }
201
+ async startRearDisplay() {
202
+ throw this.unavailable('Rear display mode is only available on Android.');
203
+ }
204
+ stopRearDisplay() {
205
+ return Promise.resolve();
206
+ }
207
+ async startDualScreen() {
208
+ throw this.unavailable('Dual-screen mode is only available on Android.');
209
+ }
210
+ stopDualScreen() {
211
+ return Promise.resolve();
212
+ }
213
+ }
214
+
215
+ var web = /*#__PURE__*/Object.freeze({
216
+ __proto__: null,
217
+ FoldableWeb: FoldableWeb
218
+ });
219
+
220
+ exports.Foldable = Foldable;
221
+ exports.installFoldablePolyfill = installFoldablePolyfill;
222
+ //# sourceMappingURL=plugin.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.cjs.js","sources":["esm/css.js","esm/segments.js","esm/polyfill.js","esm/index.js","esm/size-class.js","esm/web.js"],"sourcesContent":["export const CSS_CLASSES = [\n 'horizontal-viewport-segments-2',\n 'vertical-viewport-segments-2',\n 'device-posture-continuous',\n 'device-posture-folded',\n];\nexport const BAR_CLASSES = ['vertical-bars-leading', 'vertical-bars-trailing'];\nexport function barClassFor(edge) {\n return edge ? `vertical-bars-${edge}` : null;\n}\nexport function cssFor(segments, posture) {\n const stacked = segments.length > 1 && segments[1].y > segments[0].y;\n const variables = {};\n segments.forEach((segment, index) => {\n const suffix = stacked ? `0-${index}` : `${index}-0`;\n variables[`--viewport-segment-top-${suffix}`] = `${segment.y}px`;\n variables[`--viewport-segment-left-${suffix}`] = `${segment.x}px`;\n variables[`--viewport-segment-bottom-${suffix}`] = `${segment.y + segment.height}px`;\n variables[`--viewport-segment-right-${suffix}`] = `${segment.x + segment.width}px`;\n variables[`--viewport-segment-width-${suffix}`] = `${segment.width}px`;\n variables[`--viewport-segment-height-${suffix}`] = `${segment.height}px`;\n });\n const classes = [`device-posture-${posture}`];\n if (segments.length > 1) {\n classes.push(stacked ? 'vertical-viewport-segments-2' : 'horizontal-viewport-segments-2');\n }\n return { variables, classes };\n}\n//# sourceMappingURL=css.js.map","const EDGE_TOLERANCE = 1;\nexport function splitViewport(fold, width, height) {\n const whole = [{ x: 0, y: 0, width, height }];\n const hinge = fold === null || fold === void 0 ? void 0 : fold.hingeBounds;\n if (!(fold === null || fold === void 0 ? void 0 : fold.isSeparating) || !hinge)\n return whole;\n if (fold.hingeOrientation === 'vertical') {\n const right = hinge.x + hinge.width;\n const spansHeight = hinge.y <= EDGE_TOLERANCE && hinge.y + hinge.height >= height - EDGE_TOLERANCE;\n if (!spansHeight || hinge.x <= 0 || right >= width)\n return whole;\n return [\n { x: 0, y: 0, width: hinge.x, height },\n { x: right, y: 0, width: width - right, height },\n ];\n }\n const bottom = hinge.y + hinge.height;\n const spansWidth = hinge.x <= EDGE_TOLERANCE && hinge.x + hinge.width >= width - EDGE_TOLERANCE;\n if (!spansWidth || hinge.y <= 0 || bottom >= height)\n return whole;\n return [\n { x: 0, y: 0, width, height: hinge.y },\n { x: 0, y: bottom, width, height: height - bottom },\n ];\n}\n//# sourceMappingURL=segments.js.map","import { Capacitor } from '@capacitor/core';\nimport { BAR_CLASSES, barClassFor, CSS_CLASSES, cssFor } from './css';\nimport { splitViewport } from './segments';\nclass DevicePosturePolyfill extends EventTarget {\n constructor() {\n super(...arguments);\n this.onchange = null;\n this.current = 'continuous';\n }\n get type() {\n return this.current;\n }\n update(type) {\n var _a;\n if (type === this.current)\n return;\n this.current = type;\n const event = new Event('change');\n (_a = this.onchange) === null || _a === void 0 ? void 0 : _a.call(this, event);\n this.dispatchEvent(event);\n }\n}\nconst postureOf = (fold) => (fold === null || fold === void 0 ? void 0 : fold.state) === 'half-opened' ? 'folded' : 'continuous';\nlet installation = null;\nexport function install(plugin) {\n if (!Capacitor.isNativePlatform())\n return Promise.resolve();\n installation !== null && installation !== void 0 ? installation : (installation = run(plugin));\n return installation;\n}\nasync function run(plugin) {\n let fold = null;\n const currentSegments = () => splitViewport(fold, window.innerWidth, window.innerHeight);\n if (!('Viewport' in window)) {\n Object.defineProperty(window, 'viewport', {\n configurable: true,\n value: {\n get segments() {\n return Object.freeze(currentSegments().map((rect) => new DOMRect(rect.x, rect.y, rect.width, rect.height)));\n },\n },\n });\n }\n const posture = 'DevicePosture' in window ? null : new DevicePosturePolyfill();\n if (posture) {\n Object.defineProperty(navigator, 'devicePosture', { configurable: true, value: posture });\n }\n const root = document.documentElement;\n let variables = [];\n const applyCss = () => {\n const css = cssFor(currentSegments(), postureOf(fold));\n for (const name of variables)\n root.style.removeProperty(name);\n variables = Object.keys(css.variables);\n for (const name of variables)\n root.style.setProperty(name, css.variables[name]);\n for (const name of CSS_CLASSES)\n root.classList.toggle(name, css.classes.includes(name));\n };\n const apply = (next) => {\n fold = next;\n posture === null || posture === void 0 ? void 0 : posture.update(postureOf(next));\n applyCss();\n };\n const applyBars = ({ verticalBarEdge }) => {\n const active = barClassFor(verticalBarEdge);\n for (const name of BAR_CLASSES)\n root.classList.toggle(name, name === active);\n };\n window.addEventListener('resize', applyCss);\n await plugin.addListener('foldStateChange', apply);\n await plugin.addListener('barPlacementChange', applyBars);\n apply(await plugin.getFoldState());\n applyBars(await plugin.getBarPlacement());\n}\n//# sourceMappingURL=polyfill.js.map","import { registerPlugin } from '@capacitor/core';\nimport { install } from './polyfill';\nconst Foldable = registerPlugin('Foldable', {\n web: () => import('./web').then((m) => new m.FoldableWeb()),\n});\nconst installFoldablePolyfill = () => install(Foldable);\nexport * from './definitions';\nexport { Foldable, installFoldablePolyfill };\n//# sourceMappingURL=index.js.map","const MEDIUM_WIDTH = 600;\nconst EXPANDED_WIDTH = 840;\nconst LARGE_WIDTH = 1200;\nconst EXTRA_LARGE_WIDTH = 1600;\nconst MEDIUM_HEIGHT = 480;\nconst EXPANDED_HEIGHT = 900;\nfunction widthClassOf(width) {\n if (width >= EXTRA_LARGE_WIDTH)\n return 'extraLarge';\n if (width >= LARGE_WIDTH)\n return 'large';\n if (width >= EXPANDED_WIDTH)\n return 'expanded';\n if (width >= MEDIUM_WIDTH)\n return 'medium';\n return 'compact';\n}\nfunction heightClassOf(height) {\n if (height >= EXPANDED_HEIGHT)\n return 'expanded';\n if (height >= MEDIUM_HEIGHT)\n return 'medium';\n return 'compact';\n}\nexport function sizeClassOf(width, height) {\n return {\n horizontal: width >= MEDIUM_WIDTH ? 'regular' : 'compact',\n vertical: height >= MEDIUM_HEIGHT ? 'regular' : 'compact',\n widthClass: widthClassOf(width),\n heightClass: heightClassOf(height),\n };\n}\n//# sourceMappingURL=size-class.js.map","import { WebPlugin } from '@capacitor/core';\nimport { sizeClassOf } from './size-class';\nexport class FoldableWeb extends WebPlugin {\n constructor() {\n super();\n this.sizeClass = sizeClassOf(window.innerWidth, window.innerHeight);\n window.addEventListener('resize', () => {\n const next = sizeClassOf(window.innerWidth, window.innerHeight);\n if (JSON.stringify(next) === JSON.stringify(this.sizeClass))\n return;\n this.sizeClass = next;\n this.notifyListeners('sizeClassChange', next);\n });\n }\n async isDeviceFoldable() {\n return { foldable: false, supportsTabletop: false };\n }\n async getFoldState() {\n return { state: 'flat', isSeparating: false, posture: 'flat' };\n }\n async getHingeAngle() {\n return { angle: null };\n }\n async getSizeClass() {\n return sizeClassOf(window.innerWidth, window.innerHeight);\n }\n async getDisplayModes() {\n return { rearDisplay: 'unsupported', dualScreen: 'unsupported' };\n }\n async getBarPlacement() {\n return { verticalBarEdge: null };\n }\n async startRearDisplay() {\n throw this.unavailable('Rear display mode is only available on Android.');\n }\n stopRearDisplay() {\n return Promise.resolve();\n }\n async startDualScreen() {\n throw this.unavailable('Dual-screen mode is only available on Android.');\n }\n stopDualScreen() {\n return Promise.resolve();\n }\n}\n//# sourceMappingURL=web.js.map"],"names":["Capacitor","registerPlugin","WebPlugin"],"mappings":";;;;AAAO,MAAM,WAAW,GAAG;AAC3B,IAAI,gCAAgC;AACpC,IAAI,8BAA8B;AAClC,IAAI,2BAA2B;AAC/B,IAAI,uBAAuB;AAC3B,CAAC;AACM,MAAM,WAAW,GAAG,CAAC,uBAAuB,EAAE,wBAAwB,CAAC;AACvE,SAAS,WAAW,CAAC,IAAI,EAAE;AAClC,IAAI,OAAO,IAAI,GAAG,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI;AAChD;AACO,SAAS,MAAM,CAAC,QAAQ,EAAE,OAAO,EAAE;AAC1C,IAAI,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;AACxE,IAAI,MAAM,SAAS,GAAG,EAAE;AACxB,IAAI,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,KAAK,KAAK;AACzC,QAAQ,MAAM,MAAM,GAAG,OAAO,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC;AAC5D,QAAQ,SAAS,CAAC,CAAC,uBAAuB,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;AACxE,QAAQ,SAAS,CAAC,CAAC,wBAAwB,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;AACzE,QAAQ,SAAS,CAAC,CAAC,0BAA0B,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;AAC5F,QAAQ,SAAS,CAAC,CAAC,yBAAyB,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;AAC1F,QAAQ,SAAS,CAAC,CAAC,yBAAyB,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;AAC9E,QAAQ,SAAS,CAAC,CAAC,0BAA0B,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;AAChF,IAAI,CAAC,CAAC;AACN,IAAI,MAAM,OAAO,GAAG,CAAC,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC;AACjD,IAAI,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;AAC7B,QAAQ,OAAO,CAAC,IAAI,CAAC,OAAO,GAAG,8BAA8B,GAAG,gCAAgC,CAAC;AACjG,IAAI;AACJ,IAAI,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE;AACjC;;AC3BA,MAAM,cAAc,GAAG,CAAC;AACjB,SAAS,aAAa,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE;AACnD,IAAI,MAAM,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AACjD,IAAI,MAAM,KAAK,GAAG,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC,WAAW;AAC9E,IAAI,IAAI,EAAE,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK;AAClF,QAAQ,OAAO,KAAK;AACpB,IAAI,IAAI,IAAI,CAAC,gBAAgB,KAAK,UAAU,EAAE;AAC9C,QAAQ,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK;AAC3C,QAAQ,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,IAAI,cAAc,IAAI,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,MAAM,GAAG,cAAc;AAC1G,QAAQ,IAAI,CAAC,WAAW,IAAI,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,KAAK;AAC1D,YAAY,OAAO,KAAK;AACxB,QAAQ,OAAO;AACf,YAAY,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE;AAClD,YAAY,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,GAAG,KAAK,EAAE,MAAM,EAAE;AAC5D,SAAS;AACT,IAAI;AACJ,IAAI,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM;AACzC,IAAI,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,IAAI,cAAc,IAAI,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,IAAI,KAAK,GAAG,cAAc;AACnG,IAAI,IAAI,CAAC,UAAU,IAAI,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,MAAM,IAAI,MAAM;AACvD,QAAQ,OAAO,KAAK;AACpB,IAAI,OAAO;AACX,QAAQ,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,EAAE;AAC9C,QAAQ,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE;AAC3D,KAAK;AACL;;ACrBA,MAAM,qBAAqB,SAAS,WAAW,CAAC;AAChD,IAAI,WAAW,GAAG;AAClB,QAAQ,KAAK,CAAC,GAAG,SAAS,CAAC;AAC3B,QAAQ,IAAI,CAAC,QAAQ,GAAG,IAAI;AAC5B,QAAQ,IAAI,CAAC,OAAO,GAAG,YAAY;AACnC,IAAI;AACJ,IAAI,IAAI,IAAI,GAAG;AACf,QAAQ,OAAO,IAAI,CAAC,OAAO;AAC3B,IAAI;AACJ,IAAI,MAAM,CAAC,IAAI,EAAE;AACjB,QAAQ,IAAI,EAAE;AACd,QAAQ,IAAI,IAAI,KAAK,IAAI,CAAC,OAAO;AACjC,YAAY;AACZ,QAAQ,IAAI,CAAC,OAAO,GAAG,IAAI;AAC3B,QAAQ,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,QAAQ,CAAC;AACzC,QAAQ,CAAC,EAAE,GAAG,IAAI,CAAC,QAAQ,MAAM,IAAI,IAAI,EAAE,KAAK,MAAM,GAAG,MAAM,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC;AACtF,QAAQ,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;AACjC,IAAI;AACJ;AACA,MAAM,SAAS,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC,KAAK,MAAM,aAAa,GAAG,QAAQ,GAAG,YAAY;AAChI,IAAI,YAAY,GAAG,IAAI;AAChB,SAAS,OAAO,CAAC,MAAM,EAAE;AAChC,IAAI,IAAI,CAACA,cAAS,CAAC,gBAAgB,EAAE;AACrC,QAAQ,OAAO,OAAO,CAAC,OAAO,EAAE;AAChC,IAAI,YAAY,KAAK,IAAI,IAAI,YAAY,KAAK,MAAM,GAAG,YAAY,IAAI,YAAY,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC;AAClG,IAAI,OAAO,YAAY;AACvB;AACA,eAAe,GAAG,CAAC,MAAM,EAAE;AAC3B,IAAI,IAAI,IAAI,GAAG,IAAI;AACnB,IAAI,MAAM,eAAe,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,WAAW,CAAC;AAC5F,IAAI,IAAI,EAAE,UAAU,IAAI,MAAM,CAAC,EAAE;AACjC,QAAQ,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,UAAU,EAAE;AAClD,YAAY,YAAY,EAAE,IAAI;AAC9B,YAAY,KAAK,EAAE;AACnB,gBAAgB,IAAI,QAAQ,GAAG;AAC/B,oBAAoB,OAAO,MAAM,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;AAC/H,gBAAgB,CAAC;AACjB,aAAa;AACb,SAAS,CAAC;AACV,IAAI;AACJ,IAAI,MAAM,OAAO,GAAG,eAAe,IAAI,MAAM,GAAG,IAAI,GAAG,IAAI,qBAAqB,EAAE;AAClF,IAAI,IAAI,OAAO,EAAE;AACjB,QAAQ,MAAM,CAAC,cAAc,CAAC,SAAS,EAAE,eAAe,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;AACjG,IAAI;AACJ,IAAI,MAAM,IAAI,GAAG,QAAQ,CAAC,eAAe;AACzC,IAAI,IAAI,SAAS,GAAG,EAAE;AACtB,IAAI,MAAM,QAAQ,GAAG,MAAM;AAC3B,QAAQ,MAAM,GAAG,GAAG,MAAM,CAAC,eAAe,EAAE,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;AAC9D,QAAQ,KAAK,MAAM,IAAI,IAAI,SAAS;AACpC,YAAY,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC;AAC3C,QAAQ,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC;AAC9C,QAAQ,KAAK,MAAM,IAAI,IAAI,SAAS;AACpC,YAAY,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;AAC7D,QAAQ,KAAK,MAAM,IAAI,IAAI,WAAW;AACtC,YAAY,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AACnE,IAAI,CAAC;AACL,IAAI,MAAM,KAAK,GAAG,CAAC,IAAI,KAAK;AAC5B,QAAQ,IAAI,GAAG,IAAI;AACnB,QAAQ,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;AACzF,QAAQ,QAAQ,EAAE;AAClB,IAAI,CAAC;AACL,IAAI,MAAM,SAAS,GAAG,CAAC,EAAE,eAAe,EAAE,KAAK;AAC/C,QAAQ,MAAM,MAAM,GAAG,WAAW,CAAC,eAAe,CAAC;AACnD,QAAQ,KAAK,MAAM,IAAI,IAAI,WAAW;AACtC,YAAY,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC;AACxD,IAAI,CAAC;AACL,IAAI,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,CAAC;AAC/C,IAAI,MAAM,MAAM,CAAC,WAAW,CAAC,iBAAiB,EAAE,KAAK,CAAC;AACtD,IAAI,MAAM,MAAM,CAAC,WAAW,CAAC,oBAAoB,EAAE,SAAS,CAAC;AAC7D,IAAI,KAAK,CAAC,MAAM,MAAM,CAAC,YAAY,EAAE,CAAC;AACtC,IAAI,SAAS,CAAC,MAAM,MAAM,CAAC,eAAe,EAAE,CAAC;AAC7C;;ACxEK,MAAC,QAAQ,GAAGC,mBAAc,CAAC,UAAU,EAAE;AAC5C,IAAI,GAAG,EAAE,MAAM,mDAAe,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;AAC/D,CAAC;AACI,MAAC,uBAAuB,GAAG,MAAM,OAAO,CAAC,QAAQ;;ACLtD,MAAM,YAAY,GAAG,GAAG;AACxB,MAAM,cAAc,GAAG,GAAG;AAC1B,MAAM,WAAW,GAAG,IAAI;AACxB,MAAM,iBAAiB,GAAG,IAAI;AAC9B,MAAM,aAAa,GAAG,GAAG;AACzB,MAAM,eAAe,GAAG,GAAG;AAC3B,SAAS,YAAY,CAAC,KAAK,EAAE;AAC7B,IAAI,IAAI,KAAK,IAAI,iBAAiB;AAClC,QAAQ,OAAO,YAAY;AAC3B,IAAI,IAAI,KAAK,IAAI,WAAW;AAC5B,QAAQ,OAAO,OAAO;AACtB,IAAI,IAAI,KAAK,IAAI,cAAc;AAC/B,QAAQ,OAAO,UAAU;AACzB,IAAI,IAAI,KAAK,IAAI,YAAY;AAC7B,QAAQ,OAAO,QAAQ;AACvB,IAAI,OAAO,SAAS;AACpB;AACA,SAAS,aAAa,CAAC,MAAM,EAAE;AAC/B,IAAI,IAAI,MAAM,IAAI,eAAe;AACjC,QAAQ,OAAO,UAAU;AACzB,IAAI,IAAI,MAAM,IAAI,aAAa;AAC/B,QAAQ,OAAO,QAAQ;AACvB,IAAI,OAAO,SAAS;AACpB;AACO,SAAS,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE;AAC3C,IAAI,OAAO;AACX,QAAQ,UAAU,EAAE,KAAK,IAAI,YAAY,GAAG,SAAS,GAAG,SAAS;AACjE,QAAQ,QAAQ,EAAE,MAAM,IAAI,aAAa,GAAG,SAAS,GAAG,SAAS;AACjE,QAAQ,UAAU,EAAE,YAAY,CAAC,KAAK,CAAC;AACvC,QAAQ,WAAW,EAAE,aAAa,CAAC,MAAM,CAAC;AAC1C,KAAK;AACL;;AC7BO,MAAM,WAAW,SAASC,cAAS,CAAC;AAC3C,IAAI,WAAW,GAAG;AAClB,QAAQ,KAAK,EAAE;AACf,QAAQ,IAAI,CAAC,SAAS,GAAG,WAAW,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,WAAW,CAAC;AAC3E,QAAQ,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,MAAM;AAChD,YAAY,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,WAAW,CAAC;AAC3E,YAAY,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC;AACvE,gBAAgB;AAChB,YAAY,IAAI,CAAC,SAAS,GAAG,IAAI;AACjC,YAAY,IAAI,CAAC,eAAe,CAAC,iBAAiB,EAAE,IAAI,CAAC;AACzD,QAAQ,CAAC,CAAC;AACV,IAAI;AACJ,IAAI,MAAM,gBAAgB,GAAG;AAC7B,QAAQ,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE;AAC3D,IAAI;AACJ,IAAI,MAAM,YAAY,GAAG;AACzB,QAAQ,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE;AACtE,IAAI;AACJ,IAAI,MAAM,aAAa,GAAG;AAC1B,QAAQ,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE;AAC9B,IAAI;AACJ,IAAI,MAAM,YAAY,GAAG;AACzB,QAAQ,OAAO,WAAW,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,WAAW,CAAC;AACjE,IAAI;AACJ,IAAI,MAAM,eAAe,GAAG;AAC5B,QAAQ,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,UAAU,EAAE,aAAa,EAAE;AACxE,IAAI;AACJ,IAAI,MAAM,eAAe,GAAG;AAC5B,QAAQ,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE;AACxC,IAAI;AACJ,IAAI,MAAM,gBAAgB,GAAG;AAC7B,QAAQ,MAAM,IAAI,CAAC,WAAW,CAAC,iDAAiD,CAAC;AACjF,IAAI;AACJ,IAAI,eAAe,GAAG;AACtB,QAAQ,OAAO,OAAO,CAAC,OAAO,EAAE;AAChC,IAAI;AACJ,IAAI,MAAM,eAAe,GAAG;AAC5B,QAAQ,MAAM,IAAI,CAAC,WAAW,CAAC,gDAAgD,CAAC;AAChF,IAAI;AACJ,IAAI,cAAc,GAAG;AACrB,QAAQ,OAAO,OAAO,CAAC,OAAO,EAAE;AAChC,IAAI;AACJ;;;;;;;;"}
package/dist/plugin.js ADDED
@@ -0,0 +1,225 @@
1
+ var capacitorFoldable = (function (exports, core) {
2
+ 'use strict';
3
+
4
+ const CSS_CLASSES = [
5
+ 'horizontal-viewport-segments-2',
6
+ 'vertical-viewport-segments-2',
7
+ 'device-posture-continuous',
8
+ 'device-posture-folded',
9
+ ];
10
+ const BAR_CLASSES = ['vertical-bars-leading', 'vertical-bars-trailing'];
11
+ function barClassFor(edge) {
12
+ return edge ? `vertical-bars-${edge}` : null;
13
+ }
14
+ function cssFor(segments, posture) {
15
+ const stacked = segments.length > 1 && segments[1].y > segments[0].y;
16
+ const variables = {};
17
+ segments.forEach((segment, index) => {
18
+ const suffix = stacked ? `0-${index}` : `${index}-0`;
19
+ variables[`--viewport-segment-top-${suffix}`] = `${segment.y}px`;
20
+ variables[`--viewport-segment-left-${suffix}`] = `${segment.x}px`;
21
+ variables[`--viewport-segment-bottom-${suffix}`] = `${segment.y + segment.height}px`;
22
+ variables[`--viewport-segment-right-${suffix}`] = `${segment.x + segment.width}px`;
23
+ variables[`--viewport-segment-width-${suffix}`] = `${segment.width}px`;
24
+ variables[`--viewport-segment-height-${suffix}`] = `${segment.height}px`;
25
+ });
26
+ const classes = [`device-posture-${posture}`];
27
+ if (segments.length > 1) {
28
+ classes.push(stacked ? 'vertical-viewport-segments-2' : 'horizontal-viewport-segments-2');
29
+ }
30
+ return { variables, classes };
31
+ }
32
+
33
+ const EDGE_TOLERANCE = 1;
34
+ function splitViewport(fold, width, height) {
35
+ const whole = [{ x: 0, y: 0, width, height }];
36
+ const hinge = fold === null || fold === void 0 ? void 0 : fold.hingeBounds;
37
+ if (!(fold === null || fold === void 0 ? void 0 : fold.isSeparating) || !hinge)
38
+ return whole;
39
+ if (fold.hingeOrientation === 'vertical') {
40
+ const right = hinge.x + hinge.width;
41
+ const spansHeight = hinge.y <= EDGE_TOLERANCE && hinge.y + hinge.height >= height - EDGE_TOLERANCE;
42
+ if (!spansHeight || hinge.x <= 0 || right >= width)
43
+ return whole;
44
+ return [
45
+ { x: 0, y: 0, width: hinge.x, height },
46
+ { x: right, y: 0, width: width - right, height },
47
+ ];
48
+ }
49
+ const bottom = hinge.y + hinge.height;
50
+ const spansWidth = hinge.x <= EDGE_TOLERANCE && hinge.x + hinge.width >= width - EDGE_TOLERANCE;
51
+ if (!spansWidth || hinge.y <= 0 || bottom >= height)
52
+ return whole;
53
+ return [
54
+ { x: 0, y: 0, width, height: hinge.y },
55
+ { x: 0, y: bottom, width, height: height - bottom },
56
+ ];
57
+ }
58
+
59
+ class DevicePosturePolyfill extends EventTarget {
60
+ constructor() {
61
+ super(...arguments);
62
+ this.onchange = null;
63
+ this.current = 'continuous';
64
+ }
65
+ get type() {
66
+ return this.current;
67
+ }
68
+ update(type) {
69
+ var _a;
70
+ if (type === this.current)
71
+ return;
72
+ this.current = type;
73
+ const event = new Event('change');
74
+ (_a = this.onchange) === null || _a === void 0 ? void 0 : _a.call(this, event);
75
+ this.dispatchEvent(event);
76
+ }
77
+ }
78
+ const postureOf = (fold) => (fold === null || fold === void 0 ? void 0 : fold.state) === 'half-opened' ? 'folded' : 'continuous';
79
+ let installation = null;
80
+ function install(plugin) {
81
+ if (!core.Capacitor.isNativePlatform())
82
+ return Promise.resolve();
83
+ installation !== null && installation !== void 0 ? installation : (installation = run(plugin));
84
+ return installation;
85
+ }
86
+ async function run(plugin) {
87
+ let fold = null;
88
+ const currentSegments = () => splitViewport(fold, window.innerWidth, window.innerHeight);
89
+ if (!('Viewport' in window)) {
90
+ Object.defineProperty(window, 'viewport', {
91
+ configurable: true,
92
+ value: {
93
+ get segments() {
94
+ return Object.freeze(currentSegments().map((rect) => new DOMRect(rect.x, rect.y, rect.width, rect.height)));
95
+ },
96
+ },
97
+ });
98
+ }
99
+ const posture = 'DevicePosture' in window ? null : new DevicePosturePolyfill();
100
+ if (posture) {
101
+ Object.defineProperty(navigator, 'devicePosture', { configurable: true, value: posture });
102
+ }
103
+ const root = document.documentElement;
104
+ let variables = [];
105
+ const applyCss = () => {
106
+ const css = cssFor(currentSegments(), postureOf(fold));
107
+ for (const name of variables)
108
+ root.style.removeProperty(name);
109
+ variables = Object.keys(css.variables);
110
+ for (const name of variables)
111
+ root.style.setProperty(name, css.variables[name]);
112
+ for (const name of CSS_CLASSES)
113
+ root.classList.toggle(name, css.classes.includes(name));
114
+ };
115
+ const apply = (next) => {
116
+ fold = next;
117
+ posture === null || posture === void 0 ? void 0 : posture.update(postureOf(next));
118
+ applyCss();
119
+ };
120
+ const applyBars = ({ verticalBarEdge }) => {
121
+ const active = barClassFor(verticalBarEdge);
122
+ for (const name of BAR_CLASSES)
123
+ root.classList.toggle(name, name === active);
124
+ };
125
+ window.addEventListener('resize', applyCss);
126
+ await plugin.addListener('foldStateChange', apply);
127
+ await plugin.addListener('barPlacementChange', applyBars);
128
+ apply(await plugin.getFoldState());
129
+ applyBars(await plugin.getBarPlacement());
130
+ }
131
+
132
+ const Foldable = core.registerPlugin('Foldable', {
133
+ web: () => Promise.resolve().then(function () { return web; }).then((m) => new m.FoldableWeb()),
134
+ });
135
+ const installFoldablePolyfill = () => install(Foldable);
136
+
137
+ const MEDIUM_WIDTH = 600;
138
+ const EXPANDED_WIDTH = 840;
139
+ const LARGE_WIDTH = 1200;
140
+ const EXTRA_LARGE_WIDTH = 1600;
141
+ const MEDIUM_HEIGHT = 480;
142
+ const EXPANDED_HEIGHT = 900;
143
+ function widthClassOf(width) {
144
+ if (width >= EXTRA_LARGE_WIDTH)
145
+ return 'extraLarge';
146
+ if (width >= LARGE_WIDTH)
147
+ return 'large';
148
+ if (width >= EXPANDED_WIDTH)
149
+ return 'expanded';
150
+ if (width >= MEDIUM_WIDTH)
151
+ return 'medium';
152
+ return 'compact';
153
+ }
154
+ function heightClassOf(height) {
155
+ if (height >= EXPANDED_HEIGHT)
156
+ return 'expanded';
157
+ if (height >= MEDIUM_HEIGHT)
158
+ return 'medium';
159
+ return 'compact';
160
+ }
161
+ function sizeClassOf(width, height) {
162
+ return {
163
+ horizontal: width >= MEDIUM_WIDTH ? 'regular' : 'compact',
164
+ vertical: height >= MEDIUM_HEIGHT ? 'regular' : 'compact',
165
+ widthClass: widthClassOf(width),
166
+ heightClass: heightClassOf(height),
167
+ };
168
+ }
169
+
170
+ class FoldableWeb extends core.WebPlugin {
171
+ constructor() {
172
+ super();
173
+ this.sizeClass = sizeClassOf(window.innerWidth, window.innerHeight);
174
+ window.addEventListener('resize', () => {
175
+ const next = sizeClassOf(window.innerWidth, window.innerHeight);
176
+ if (JSON.stringify(next) === JSON.stringify(this.sizeClass))
177
+ return;
178
+ this.sizeClass = next;
179
+ this.notifyListeners('sizeClassChange', next);
180
+ });
181
+ }
182
+ async isDeviceFoldable() {
183
+ return { foldable: false, supportsTabletop: false };
184
+ }
185
+ async getFoldState() {
186
+ return { state: 'flat', isSeparating: false, posture: 'flat' };
187
+ }
188
+ async getHingeAngle() {
189
+ return { angle: null };
190
+ }
191
+ async getSizeClass() {
192
+ return sizeClassOf(window.innerWidth, window.innerHeight);
193
+ }
194
+ async getDisplayModes() {
195
+ return { rearDisplay: 'unsupported', dualScreen: 'unsupported' };
196
+ }
197
+ async getBarPlacement() {
198
+ return { verticalBarEdge: null };
199
+ }
200
+ async startRearDisplay() {
201
+ throw this.unavailable('Rear display mode is only available on Android.');
202
+ }
203
+ stopRearDisplay() {
204
+ return Promise.resolve();
205
+ }
206
+ async startDualScreen() {
207
+ throw this.unavailable('Dual-screen mode is only available on Android.');
208
+ }
209
+ stopDualScreen() {
210
+ return Promise.resolve();
211
+ }
212
+ }
213
+
214
+ var web = /*#__PURE__*/Object.freeze({
215
+ __proto__: null,
216
+ FoldableWeb: FoldableWeb
217
+ });
218
+
219
+ exports.Foldable = Foldable;
220
+ exports.installFoldablePolyfill = installFoldablePolyfill;
221
+
222
+ return exports;
223
+
224
+ })({}, capacitorExports);
225
+ //# sourceMappingURL=plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.js","sources":["esm/css.js","esm/segments.js","esm/polyfill.js","esm/index.js","esm/size-class.js","esm/web.js"],"sourcesContent":["export const CSS_CLASSES = [\n 'horizontal-viewport-segments-2',\n 'vertical-viewport-segments-2',\n 'device-posture-continuous',\n 'device-posture-folded',\n];\nexport const BAR_CLASSES = ['vertical-bars-leading', 'vertical-bars-trailing'];\nexport function barClassFor(edge) {\n return edge ? `vertical-bars-${edge}` : null;\n}\nexport function cssFor(segments, posture) {\n const stacked = segments.length > 1 && segments[1].y > segments[0].y;\n const variables = {};\n segments.forEach((segment, index) => {\n const suffix = stacked ? `0-${index}` : `${index}-0`;\n variables[`--viewport-segment-top-${suffix}`] = `${segment.y}px`;\n variables[`--viewport-segment-left-${suffix}`] = `${segment.x}px`;\n variables[`--viewport-segment-bottom-${suffix}`] = `${segment.y + segment.height}px`;\n variables[`--viewport-segment-right-${suffix}`] = `${segment.x + segment.width}px`;\n variables[`--viewport-segment-width-${suffix}`] = `${segment.width}px`;\n variables[`--viewport-segment-height-${suffix}`] = `${segment.height}px`;\n });\n const classes = [`device-posture-${posture}`];\n if (segments.length > 1) {\n classes.push(stacked ? 'vertical-viewport-segments-2' : 'horizontal-viewport-segments-2');\n }\n return { variables, classes };\n}\n//# sourceMappingURL=css.js.map","const EDGE_TOLERANCE = 1;\nexport function splitViewport(fold, width, height) {\n const whole = [{ x: 0, y: 0, width, height }];\n const hinge = fold === null || fold === void 0 ? void 0 : fold.hingeBounds;\n if (!(fold === null || fold === void 0 ? void 0 : fold.isSeparating) || !hinge)\n return whole;\n if (fold.hingeOrientation === 'vertical') {\n const right = hinge.x + hinge.width;\n const spansHeight = hinge.y <= EDGE_TOLERANCE && hinge.y + hinge.height >= height - EDGE_TOLERANCE;\n if (!spansHeight || hinge.x <= 0 || right >= width)\n return whole;\n return [\n { x: 0, y: 0, width: hinge.x, height },\n { x: right, y: 0, width: width - right, height },\n ];\n }\n const bottom = hinge.y + hinge.height;\n const spansWidth = hinge.x <= EDGE_TOLERANCE && hinge.x + hinge.width >= width - EDGE_TOLERANCE;\n if (!spansWidth || hinge.y <= 0 || bottom >= height)\n return whole;\n return [\n { x: 0, y: 0, width, height: hinge.y },\n { x: 0, y: bottom, width, height: height - bottom },\n ];\n}\n//# sourceMappingURL=segments.js.map","import { Capacitor } from '@capacitor/core';\nimport { BAR_CLASSES, barClassFor, CSS_CLASSES, cssFor } from './css';\nimport { splitViewport } from './segments';\nclass DevicePosturePolyfill extends EventTarget {\n constructor() {\n super(...arguments);\n this.onchange = null;\n this.current = 'continuous';\n }\n get type() {\n return this.current;\n }\n update(type) {\n var _a;\n if (type === this.current)\n return;\n this.current = type;\n const event = new Event('change');\n (_a = this.onchange) === null || _a === void 0 ? void 0 : _a.call(this, event);\n this.dispatchEvent(event);\n }\n}\nconst postureOf = (fold) => (fold === null || fold === void 0 ? void 0 : fold.state) === 'half-opened' ? 'folded' : 'continuous';\nlet installation = null;\nexport function install(plugin) {\n if (!Capacitor.isNativePlatform())\n return Promise.resolve();\n installation !== null && installation !== void 0 ? installation : (installation = run(plugin));\n return installation;\n}\nasync function run(plugin) {\n let fold = null;\n const currentSegments = () => splitViewport(fold, window.innerWidth, window.innerHeight);\n if (!('Viewport' in window)) {\n Object.defineProperty(window, 'viewport', {\n configurable: true,\n value: {\n get segments() {\n return Object.freeze(currentSegments().map((rect) => new DOMRect(rect.x, rect.y, rect.width, rect.height)));\n },\n },\n });\n }\n const posture = 'DevicePosture' in window ? null : new DevicePosturePolyfill();\n if (posture) {\n Object.defineProperty(navigator, 'devicePosture', { configurable: true, value: posture });\n }\n const root = document.documentElement;\n let variables = [];\n const applyCss = () => {\n const css = cssFor(currentSegments(), postureOf(fold));\n for (const name of variables)\n root.style.removeProperty(name);\n variables = Object.keys(css.variables);\n for (const name of variables)\n root.style.setProperty(name, css.variables[name]);\n for (const name of CSS_CLASSES)\n root.classList.toggle(name, css.classes.includes(name));\n };\n const apply = (next) => {\n fold = next;\n posture === null || posture === void 0 ? void 0 : posture.update(postureOf(next));\n applyCss();\n };\n const applyBars = ({ verticalBarEdge }) => {\n const active = barClassFor(verticalBarEdge);\n for (const name of BAR_CLASSES)\n root.classList.toggle(name, name === active);\n };\n window.addEventListener('resize', applyCss);\n await plugin.addListener('foldStateChange', apply);\n await plugin.addListener('barPlacementChange', applyBars);\n apply(await plugin.getFoldState());\n applyBars(await plugin.getBarPlacement());\n}\n//# sourceMappingURL=polyfill.js.map","import { registerPlugin } from '@capacitor/core';\nimport { install } from './polyfill';\nconst Foldable = registerPlugin('Foldable', {\n web: () => import('./web').then((m) => new m.FoldableWeb()),\n});\nconst installFoldablePolyfill = () => install(Foldable);\nexport * from './definitions';\nexport { Foldable, installFoldablePolyfill };\n//# sourceMappingURL=index.js.map","const MEDIUM_WIDTH = 600;\nconst EXPANDED_WIDTH = 840;\nconst LARGE_WIDTH = 1200;\nconst EXTRA_LARGE_WIDTH = 1600;\nconst MEDIUM_HEIGHT = 480;\nconst EXPANDED_HEIGHT = 900;\nfunction widthClassOf(width) {\n if (width >= EXTRA_LARGE_WIDTH)\n return 'extraLarge';\n if (width >= LARGE_WIDTH)\n return 'large';\n if (width >= EXPANDED_WIDTH)\n return 'expanded';\n if (width >= MEDIUM_WIDTH)\n return 'medium';\n return 'compact';\n}\nfunction heightClassOf(height) {\n if (height >= EXPANDED_HEIGHT)\n return 'expanded';\n if (height >= MEDIUM_HEIGHT)\n return 'medium';\n return 'compact';\n}\nexport function sizeClassOf(width, height) {\n return {\n horizontal: width >= MEDIUM_WIDTH ? 'regular' : 'compact',\n vertical: height >= MEDIUM_HEIGHT ? 'regular' : 'compact',\n widthClass: widthClassOf(width),\n heightClass: heightClassOf(height),\n };\n}\n//# sourceMappingURL=size-class.js.map","import { WebPlugin } from '@capacitor/core';\nimport { sizeClassOf } from './size-class';\nexport class FoldableWeb extends WebPlugin {\n constructor() {\n super();\n this.sizeClass = sizeClassOf(window.innerWidth, window.innerHeight);\n window.addEventListener('resize', () => {\n const next = sizeClassOf(window.innerWidth, window.innerHeight);\n if (JSON.stringify(next) === JSON.stringify(this.sizeClass))\n return;\n this.sizeClass = next;\n this.notifyListeners('sizeClassChange', next);\n });\n }\n async isDeviceFoldable() {\n return { foldable: false, supportsTabletop: false };\n }\n async getFoldState() {\n return { state: 'flat', isSeparating: false, posture: 'flat' };\n }\n async getHingeAngle() {\n return { angle: null };\n }\n async getSizeClass() {\n return sizeClassOf(window.innerWidth, window.innerHeight);\n }\n async getDisplayModes() {\n return { rearDisplay: 'unsupported', dualScreen: 'unsupported' };\n }\n async getBarPlacement() {\n return { verticalBarEdge: null };\n }\n async startRearDisplay() {\n throw this.unavailable('Rear display mode is only available on Android.');\n }\n stopRearDisplay() {\n return Promise.resolve();\n }\n async startDualScreen() {\n throw this.unavailable('Dual-screen mode is only available on Android.');\n }\n stopDualScreen() {\n return Promise.resolve();\n }\n}\n//# sourceMappingURL=web.js.map"],"names":["Capacitor","registerPlugin","WebPlugin"],"mappings":"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"}