@base44-preview/vite-plugin 1.0.23-pr.92.8c371fd → 1.0.24-pr.93.2320a2c

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.
@@ -1 +1 @@
1
- {"version":3,"file":"html-injections-plugin.d.ts","sourceRoot":"","sources":["../src/html-injections-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAqB,MAAM,MAAM,CAAC;AAyEtD,wBAAgB,oBAAoB,CAAC,EACnC,WAAW,EACX,kBAAkB,EAClB,eAAe,EACf,gBAAgB,GACjB,EAAE;IACD,WAAW,EAAE,OAAO,CAAC;IACrB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,eAAe,EAAE,OAAO,CAAC;IACzB,gBAAgB,EAAE,OAAO,CAAC;CAC3B,GAmFM,MAAM,CACZ"}
1
+ {"version":3,"file":"html-injections-plugin.d.ts","sourceRoot":"","sources":["../src/html-injections-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAqB,MAAM,MAAM,CAAC;AA8EtD,wBAAgB,oBAAoB,CAAC,EACnC,WAAW,EACX,kBAAkB,EAClB,eAAe,EACf,gBAAgB,GACjB,EAAE;IACD,WAAW,EAAE,OAAO,CAAC;IACrB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,eAAe,EAAE,OAAO,CAAC;IACzB,gBAAgB,EAAE,OAAO,CAAC;CAC3B,GAoFM,MAAM,CACZ"}
@@ -52,6 +52,11 @@ const INJECTIONS = {
52
52
  injectTo: "head",
53
53
  mode: "dev",
54
54
  },
55
+ keyboardViewport: {
56
+ src: "/node_modules/@base44/vite-plugin/dist/injections/keyboard-viewport-bridge.js",
57
+ injectTo: "head",
58
+ mode: "dev",
59
+ },
55
60
  analyticsTracker: {
56
61
  injectTo: "head",
57
62
  mode: "production",
@@ -64,6 +69,7 @@ export function htmlInjectionsPlugin({ hmrNotifier, navigationNotifier, visualEd
64
69
  sandboxMount: true,
65
70
  hmrNotifier,
66
71
  navigationNotifier,
72
+ keyboardViewport: true,
67
73
  analyticsTracker,
68
74
  };
69
75
  let resolvedEnv = {};
@@ -1 +1 @@
1
- {"version":3,"file":"html-injections-plugin.js","sourceRoot":"","sources":["../src/html-injections-plugin.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"html-injections-plugin.js","sourceRoot":"","sources":["../src/html-injections-plugin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=keyboard-viewport-bridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyboard-viewport-bridge.d.ts","sourceRoot":"","sources":["../../src/injections/keyboard-viewport-bridge.ts"],"names":[],"mappings":""}
@@ -0,0 +1,75 @@
1
+ /// <reference types="vite/client" />
2
+ // keyboard-viewport-bridge — applies the parent-measured, keyboard-adjusted
3
+ // visible height inside the preview iframe.
4
+ //
5
+ // The on-screen keyboard shrinks the builder's (top-level) visual viewport but
6
+ // NOT the preview iframe's, so the app rendered inside the iframe can't tell it
7
+ // has less room and leaves a blank gap above the keyboard (bottom-anchored
8
+ // inputs end up behind it). The published app doesn't hit this — it's the
9
+ // top-level document, so the browser reflows it for the keyboard.
10
+ //
11
+ // The builder is the only side that sees the keyboard, so it measures the
12
+ // visible height and posts { type: "keyboard-viewport", height }. Here we cap
13
+ // the app's full-height roots to that height while the keyboard is open, so a
14
+ // flex column reflows its content (and its bottom input) above the keyboard.
15
+ //
16
+ // Inert until the parent posts; only runs inside the preview iframe.
17
+ if (window.self !== window.top) {
18
+ const MESSAGE_TYPE = "keyboard-viewport";
19
+ const HEIGHT_VAR = "--base44-keyboard-viewport-height";
20
+ const STYLE_ID = "base44-keyboard-viewport-style";
21
+ // Treat the keyboard as open only when the reported height is meaningfully
22
+ // below the layout height — filters out no-op / rounding resizes.
23
+ const KEYBOARD_OPEN_MIN_DELTA_PX = 100;
24
+ const ensureStyle = () => {
25
+ if (document.getElementById(STYLE_ID))
26
+ return;
27
+ const style = document.createElement("style");
28
+ style.id = STYLE_ID;
29
+ // Active only while HEIGHT_VAR is set on <html> (keyboard open). Cap the
30
+ // document, the mount node, and the app's full-height wrappers to the
31
+ // visible height. `code_generator` guarantees the app root uses
32
+ // `min-h-screen`/`h-screen`, so constraining those (plus 100vh/100dvh
33
+ // inline styles) makes the layout fit above the keyboard.
34
+ style.textContent = [
35
+ `html[style*="${HEIGHT_VAR}"], html[style*="${HEIGHT_VAR}"] body {`,
36
+ ` height: var(${HEIGHT_VAR}) !important;`,
37
+ ` min-height: var(${HEIGHT_VAR}) !important;`,
38
+ `}`,
39
+ `html[style*="${HEIGHT_VAR}"] #root {`,
40
+ ` height: var(${HEIGHT_VAR}) !important;`,
41
+ ` min-height: var(${HEIGHT_VAR}) !important;`,
42
+ ` overflow: hidden;`,
43
+ `}`,
44
+ `html[style*="${HEIGHT_VAR}"] :is(.h-screen, .min-h-screen),`,
45
+ `html[style*="${HEIGHT_VAR}"] [style*="100vh"],`,
46
+ `html[style*="${HEIGHT_VAR}"] [style*="100dvh"] {`,
47
+ ` height: var(${HEIGHT_VAR}) !important;`,
48
+ ` min-height: var(${HEIGHT_VAR}) !important;`,
49
+ `}`,
50
+ ].join("\n");
51
+ document.head.appendChild(style);
52
+ };
53
+ const apply = (height) => {
54
+ const root = document.documentElement;
55
+ const keyboardOpen = Number.isFinite(height) &&
56
+ height > 0 &&
57
+ window.innerHeight - height > KEYBOARD_OPEN_MIN_DELTA_PX;
58
+ if (!keyboardOpen) {
59
+ // Keyboard closed (or negligible delta) — release the cap so the app
60
+ // returns to its natural full-height layout.
61
+ root.style.removeProperty(HEIGHT_VAR);
62
+ return;
63
+ }
64
+ ensureStyle();
65
+ root.style.setProperty(HEIGHT_VAR, `${Math.round(height)}px`);
66
+ };
67
+ window.addEventListener("message", (event) => {
68
+ const data = event.data;
69
+ if (!data || data.type !== MESSAGE_TYPE || typeof data.height !== "number")
70
+ return;
71
+ apply(data.height);
72
+ });
73
+ }
74
+ export {};
75
+ //# sourceMappingURL=keyboard-viewport-bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyboard-viewport-bridge.js","sourceRoot":"","sources":["../../src/injections/keyboard-viewport-bridge.ts"],"names":[],"mappings":"AAAA,qCAAqC;AACrC,4EAA4E;AAC5E,4CAA4C;AAC5C,EAAE;AACF,+EAA+E;AAC/E,gFAAgF;AAChF,2EAA2E;AAC3E,0EAA0E;AAC1E,kEAAkE;AAClE,EAAE;AACF,0EAA0E;AAC1E,8EAA8E;AAC9E,8EAA8E;AAC9E,6EAA6E;AAC7E,EAAE;AACF,qEAAqE;AAErE,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,GAAG,EAAE,CAAC;IAC/B,MAAM,YAAY,GAAG,mBAAmB,CAAC;IACzC,MAAM,UAAU,GAAG,mCAAmC,CAAC;IACvD,MAAM,QAAQ,GAAG,gCAAgC,CAAC;IAClD,2EAA2E;IAC3E,kEAAkE;IAClE,MAAM,0BAA0B,GAAG,GAAG,CAAC;IAEvC,MAAM,WAAW,GAAG,GAAS,EAAE;QAC7B,IAAI,QAAQ,CAAC,cAAc,CAAC,QAAQ,CAAC;YAAE,OAAO;QAC9C,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAC9C,KAAK,CAAC,EAAE,GAAG,QAAQ,CAAC;QACpB,yEAAyE;QACzE,sEAAsE;QACtE,gEAAgE;QAChE,sEAAsE;QACtE,0DAA0D;QAC1D,KAAK,CAAC,WAAW,GAAG;YAClB,gBAAgB,UAAU,oBAAoB,UAAU,WAAW;YACnE,iBAAiB,UAAU,eAAe;YAC1C,qBAAqB,UAAU,eAAe;YAC9C,GAAG;YACH,gBAAgB,UAAU,YAAY;YACtC,iBAAiB,UAAU,eAAe;YAC1C,qBAAqB,UAAU,eAAe;YAC9C,qBAAqB;YACrB,GAAG;YACH,gBAAgB,UAAU,mCAAmC;YAC7D,gBAAgB,UAAU,sBAAsB;YAChD,gBAAgB,UAAU,wBAAwB;YAClD,iBAAiB,UAAU,eAAe;YAC1C,qBAAqB,UAAU,eAAe;YAC9C,GAAG;SACJ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACb,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC,CAAC;IAEF,MAAM,KAAK,GAAG,CAAC,MAAc,EAAQ,EAAE;QACrC,MAAM,IAAI,GAAG,QAAQ,CAAC,eAAe,CAAC;QACtC,MAAM,YAAY,GAChB,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;YACvB,MAAM,GAAG,CAAC;YACV,MAAM,CAAC,WAAW,GAAG,MAAM,GAAG,0BAA0B,CAAC;QAC3D,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,qEAAqE;YACrE,6CAA6C;YAC7C,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;YACtC,OAAO;QACT,CAAC;QACD,WAAW,EAAE,CAAC;QACd,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAChE,CAAC,CAAC;IAEF,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,KAAmB,EAAE,EAAE;QACzD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAiD,CAAC;QACrE,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ;YAAE,OAAO;QACnF,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACrB,CAAC,CAAC,CAAC;AACL,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@base44-preview/vite-plugin",
3
- "version": "1.0.23-pr.92.8c371fd",
3
+ "version": "1.0.24-pr.93.2320a2c",
4
4
  "description": "The Vite plugin for base44 based applications",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -64,6 +64,11 @@ const INJECTIONS: Record<string, Injection> = {
64
64
  injectTo: "head",
65
65
  mode: "dev",
66
66
  },
67
+ keyboardViewport: {
68
+ src: "/node_modules/@base44/vite-plugin/dist/injections/keyboard-viewport-bridge.js",
69
+ injectTo: "head",
70
+ mode: "dev",
71
+ },
67
72
  analyticsTracker: {
68
73
  injectTo: "head",
69
74
  mode: "production",
@@ -87,6 +92,7 @@ export function htmlInjectionsPlugin({
87
92
  sandboxMount: true,
88
93
  hmrNotifier,
89
94
  navigationNotifier,
95
+ keyboardViewport: true,
90
96
  analyticsTracker,
91
97
  };
92
98
 
@@ -0,0 +1,76 @@
1
+ /// <reference types="vite/client" />
2
+ // keyboard-viewport-bridge — applies the parent-measured, keyboard-adjusted
3
+ // visible height inside the preview iframe.
4
+ //
5
+ // The on-screen keyboard shrinks the builder's (top-level) visual viewport but
6
+ // NOT the preview iframe's, so the app rendered inside the iframe can't tell it
7
+ // has less room and leaves a blank gap above the keyboard (bottom-anchored
8
+ // inputs end up behind it). The published app doesn't hit this — it's the
9
+ // top-level document, so the browser reflows it for the keyboard.
10
+ //
11
+ // The builder is the only side that sees the keyboard, so it measures the
12
+ // visible height and posts { type: "keyboard-viewport", height }. Here we cap
13
+ // the app's full-height roots to that height while the keyboard is open, so a
14
+ // flex column reflows its content (and its bottom input) above the keyboard.
15
+ //
16
+ // Inert until the parent posts; only runs inside the preview iframe.
17
+
18
+ if (window.self !== window.top) {
19
+ const MESSAGE_TYPE = "keyboard-viewport";
20
+ const HEIGHT_VAR = "--base44-keyboard-viewport-height";
21
+ const STYLE_ID = "base44-keyboard-viewport-style";
22
+ // Treat the keyboard as open only when the reported height is meaningfully
23
+ // below the layout height — filters out no-op / rounding resizes.
24
+ const KEYBOARD_OPEN_MIN_DELTA_PX = 100;
25
+
26
+ const ensureStyle = (): void => {
27
+ if (document.getElementById(STYLE_ID)) return;
28
+ const style = document.createElement("style");
29
+ style.id = STYLE_ID;
30
+ // Active only while HEIGHT_VAR is set on <html> (keyboard open). Cap the
31
+ // document, the mount node, and the app's full-height wrappers to the
32
+ // visible height. `code_generator` guarantees the app root uses
33
+ // `min-h-screen`/`h-screen`, so constraining those (plus 100vh/100dvh
34
+ // inline styles) makes the layout fit above the keyboard.
35
+ style.textContent = [
36
+ `html[style*="${HEIGHT_VAR}"], html[style*="${HEIGHT_VAR}"] body {`,
37
+ ` height: var(${HEIGHT_VAR}) !important;`,
38
+ ` min-height: var(${HEIGHT_VAR}) !important;`,
39
+ `}`,
40
+ `html[style*="${HEIGHT_VAR}"] #root {`,
41
+ ` height: var(${HEIGHT_VAR}) !important;`,
42
+ ` min-height: var(${HEIGHT_VAR}) !important;`,
43
+ ` overflow: hidden;`,
44
+ `}`,
45
+ `html[style*="${HEIGHT_VAR}"] :is(.h-screen, .min-h-screen),`,
46
+ `html[style*="${HEIGHT_VAR}"] [style*="100vh"],`,
47
+ `html[style*="${HEIGHT_VAR}"] [style*="100dvh"] {`,
48
+ ` height: var(${HEIGHT_VAR}) !important;`,
49
+ ` min-height: var(${HEIGHT_VAR}) !important;`,
50
+ `}`,
51
+ ].join("\n");
52
+ document.head.appendChild(style);
53
+ };
54
+
55
+ const apply = (height: number): void => {
56
+ const root = document.documentElement;
57
+ const keyboardOpen =
58
+ Number.isFinite(height) &&
59
+ height > 0 &&
60
+ window.innerHeight - height > KEYBOARD_OPEN_MIN_DELTA_PX;
61
+ if (!keyboardOpen) {
62
+ // Keyboard closed (or negligible delta) — release the cap so the app
63
+ // returns to its natural full-height layout.
64
+ root.style.removeProperty(HEIGHT_VAR);
65
+ return;
66
+ }
67
+ ensureStyle();
68
+ root.style.setProperty(HEIGHT_VAR, `${Math.round(height)}px`);
69
+ };
70
+
71
+ window.addEventListener("message", (event: MessageEvent) => {
72
+ const data = event.data as { type?: string; height?: number } | null;
73
+ if (!data || data.type !== MESSAGE_TYPE || typeof data.height !== "number") return;
74
+ apply(data.height);
75
+ });
76
+ }