@hanzogui/tauri 8.3.1 → 8.3.3

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 (85) hide show
  1. package/dist/cjs/TitleBar.js +31 -0
  2. package/dist/cjs/TitleBar.js.map +1 -0
  3. package/dist/cjs/index.js +26 -0
  4. package/dist/cjs/index.js.map +1 -0
  5. package/dist/cjs/isTauri.js +14 -0
  6. package/dist/cjs/isTauri.js.map +1 -0
  7. package/dist/cjs/package.json +1 -0
  8. package/dist/cjs/shortcuts.js +41 -0
  9. package/dist/cjs/shortcuts.js.map +1 -0
  10. package/dist/cjs/system.js +33 -0
  11. package/dist/cjs/system.js.map +1 -0
  12. package/dist/cjs/window.js +54 -0
  13. package/dist/cjs/window.js.map +1 -0
  14. package/dist/esm/TitleBar.js +28 -0
  15. package/dist/esm/TitleBar.js.map +1 -0
  16. package/dist/esm/index.js +13 -7
  17. package/dist/esm/index.js.map +1 -1
  18. package/dist/esm/isTauri.js +11 -0
  19. package/dist/esm/isTauri.js.map +1 -0
  20. package/dist/esm/shortcuts.js +35 -0
  21. package/dist/esm/shortcuts.js.map +1 -0
  22. package/dist/esm/system.js +27 -0
  23. package/dist/esm/system.js.map +1 -0
  24. package/dist/esm/window.js +49 -0
  25. package/dist/esm/window.js.map +1 -0
  26. package/package.json +28 -23
  27. package/src/TitleBar.tsx +1 -4
  28. package/src/index.ts +5 -5
  29. package/src/shortcuts.ts +1 -1
  30. package/src/system.ts +1 -1
  31. package/src/window.ts +1 -1
  32. package/types/TitleBar.d.ts +5 -0
  33. package/types/TitleBar.d.ts.map +1 -0
  34. package/types/index.d.ts +6 -0
  35. package/types/index.d.ts.map +1 -0
  36. package/types/isTauri.d.ts +8 -0
  37. package/types/isTauri.d.ts.map +1 -0
  38. package/types/shortcuts.d.ts +5 -0
  39. package/types/shortcuts.d.ts.map +1 -0
  40. package/types/system.d.ts +5 -0
  41. package/types/system.d.ts.map +1 -0
  42. package/types/window.d.ts +23 -0
  43. package/types/window.d.ts.map +1 -0
  44. package/dist/cjs/TitleBar.cjs +0 -97
  45. package/dist/cjs/TitleBar.native.js +0 -109
  46. package/dist/cjs/TitleBar.native.js.map +0 -1
  47. package/dist/cjs/index.cjs +0 -41
  48. package/dist/cjs/index.native.js +0 -44
  49. package/dist/cjs/index.native.js.map +0 -1
  50. package/dist/cjs/isTauri.cjs +0 -30
  51. package/dist/cjs/isTauri.native.js +0 -33
  52. package/dist/cjs/isTauri.native.js.map +0 -1
  53. package/dist/cjs/shortcuts.cjs +0 -70
  54. package/dist/cjs/shortcuts.native.js +0 -73
  55. package/dist/cjs/shortcuts.native.js.map +0 -1
  56. package/dist/cjs/system.cjs +0 -65
  57. package/dist/cjs/system.native.js +0 -68
  58. package/dist/cjs/system.native.js.map +0 -1
  59. package/dist/cjs/window.cjs +0 -81
  60. package/dist/cjs/window.native.js +0 -106
  61. package/dist/cjs/window.native.js.map +0 -1
  62. package/dist/esm/TitleBar.mjs +0 -72
  63. package/dist/esm/TitleBar.mjs.map +0 -1
  64. package/dist/esm/TitleBar.native.js +0 -81
  65. package/dist/esm/TitleBar.native.js.map +0 -1
  66. package/dist/esm/index.mjs +0 -7
  67. package/dist/esm/index.mjs.map +0 -1
  68. package/dist/esm/index.native.js +0 -7
  69. package/dist/esm/index.native.js.map +0 -1
  70. package/dist/esm/isTauri.mjs +0 -5
  71. package/dist/esm/isTauri.mjs.map +0 -1
  72. package/dist/esm/isTauri.native.js +0 -5
  73. package/dist/esm/isTauri.native.js.map +0 -1
  74. package/dist/esm/shortcuts.mjs +0 -32
  75. package/dist/esm/shortcuts.mjs.map +0 -1
  76. package/dist/esm/shortcuts.native.js +0 -32
  77. package/dist/esm/shortcuts.native.js.map +0 -1
  78. package/dist/esm/system.mjs +0 -27
  79. package/dist/esm/system.mjs.map +0 -1
  80. package/dist/esm/system.native.js +0 -27
  81. package/dist/esm/system.native.js.map +0 -1
  82. package/dist/esm/window.mjs +0 -44
  83. package/dist/esm/window.mjs.map +0 -1
  84. package/dist/esm/window.native.js +0 -66
  85. package/dist/esm/window.native.js.map +0 -1
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TitleBar = TitleBar;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const gui_1 = require("@hanzo/gui");
6
+ const window_ts_1 = require("./window.js");
7
+ // A frameless-window titlebar built entirely from hanzogui primitives + tokens
8
+ // (true-black `$background`, hairline `$borderColor`). It is the proof that a
9
+ // hanzogui component drives the real Tauri OS window through the bridge. The bar
10
+ // is draggable via Tauri's `data-tauri-drag-region`; the buttons call the
11
+ // window controls. Renders harmlessly on the web (controls no-op off-Tauri).
12
+ const Control = (0, gui_1.styled)(gui_1.XStack, {
13
+ width: 46,
14
+ height: 32,
15
+ alignItems: 'center',
16
+ justifyContent: 'center',
17
+ cursor: 'pointer',
18
+ hoverStyle: { backgroundColor: '$color4' },
19
+ pressStyle: { backgroundColor: '$color5' },
20
+ });
21
+ const Glyph = (0, gui_1.styled)(gui_1.Text, {
22
+ fontFamily: '$mono',
23
+ fontSize: 13,
24
+ lineHeight: 13,
25
+ color: '$color11',
26
+ });
27
+ function TitleBar({ title = '' }) {
28
+ const { minimize, toggleMaximize, close } = (0, window_ts_1.useWindowControls)();
29
+ return ((0, jsx_runtime_1.jsxs)(gui_1.XStack, { "data-tauri-drag-region": true, height: 40, alignItems: "center", backgroundColor: "$background", borderBottomWidth: 1, borderBottomColor: "$borderColor", userSelect: "none", children: [(0, jsx_runtime_1.jsx)(gui_1.Text, { flex: 1, paddingLeft: "$3", fontFamily: "$body", fontSize: 13, color: "$color11", "data-tauri-drag-region": true, children: title }), (0, jsx_runtime_1.jsxs)(gui_1.XStack, { children: [(0, jsx_runtime_1.jsx)(Control, { onPress: () => minimize(), children: (0, jsx_runtime_1.jsx)(Glyph, { children: "\u2014" }) }), (0, jsx_runtime_1.jsx)(Control, { onPress: () => toggleMaximize(), children: (0, jsx_runtime_1.jsx)(Glyph, { children: "\u25A2" }) }), (0, jsx_runtime_1.jsx)(Control, { onPress: () => close(), hoverStyle: { backgroundColor: '$red9' }, children: (0, jsx_runtime_1.jsx)(Glyph, { children: "\u2715" }) })] })] }));
30
+ }
31
+ //# sourceMappingURL=TitleBar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TitleBar.js","sourceRoot":"","sources":["../../src/TitleBar.tsx"],"names":[],"mappings":";;;;AAAA,oCAAiD;AACjD,2CAA+C;AAE/C,+EAA+E;AAC/E,8EAA8E;AAC9E,iFAAiF;AACjF,0EAA0E;AAC1E,6EAA6E;AAE7E,MAAM,OAAO,GAAG,IAAA,YAAM,EAAC,YAAM,EAAE;IAC7B,KAAK,EAAE,EAAE;IACT,MAAM,EAAE,EAAE;IACV,UAAU,EAAE,QAAQ;IACpB,cAAc,EAAE,QAAQ;IACxB,MAAM,EAAE,SAAS;IACjB,UAAU,EAAE,EAAE,eAAe,EAAE,SAAS,EAAE;IAC1C,UAAU,EAAE,EAAE,eAAe,EAAE,SAAS,EAAE;CAC3C,CAAC,CAAA;AAEF,MAAM,KAAK,GAAG,IAAA,YAAM,EAAC,UAAI,EAAE;IACzB,UAAU,EAAE,OAAO;IACnB,QAAQ,EAAE,EAAE;IACZ,UAAU,EAAE,EAAE;IACd,KAAK,EAAE,UAAU;CAClB,CAAC,CAAA;AAMF,kBAAyB,EAAE,KAAK,GAAG,EAAE,EAAiB;IACpD,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,KAAK,EAAE,GAAG,IAAA,6BAAiB,GAAE,CAAA;IAE/D,OAAO,CACL,wBAAC,YAAM,oCAEL,MAAM,EAAE,EAAE,EACV,UAAU,EAAC,QAAQ,EACnB,eAAe,EAAC,aAAa,EAC7B,iBAAiB,EAAE,CAAC,EACpB,iBAAiB,EAAC,cAAc,EAChC,UAAU,EAAC,MAAM,aAEjB,uBAAC,UAAI,IACH,IAAI,EAAE,CAAC,EACP,WAAW,EAAC,IAAI,EAChB,UAAU,EAAC,OAAO,EAClB,QAAQ,EAAE,EAAE,EACZ,KAAK,EAAC,UAAU,4CAGf,KAAK,GACD,EAEP,wBAAC,YAAM,eACL,uBAAC,OAAO,IAAC,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,EAAE,YAChC,uBAAC,KAAK,yBAAU,GACR,EACV,uBAAC,OAAO,IAAC,OAAO,EAAE,GAAG,EAAE,CAAC,cAAc,EAAE,YACtC,uBAAC,KAAK,yBAAU,GACR,EACV,uBAAC,OAAO,IAAC,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,EAAE,UAAU,EAAE,EAAE,eAAe,EAAE,OAAO,EAAE,YACvE,uBAAC,KAAK,yBAAU,GACR,IACH,IACF,CACV,CAAA;AACH,CAAC"}
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ // @hanzogui/tauri — the Tauri desktop weld for Hanzo GUI.
3
+ //
4
+ // hanzogui already targets web (Next/Vite) and native (Expo/RN). This adapter
5
+ // adds the third host: a Tauri webview with a native bridge. The same hanzogui
6
+ // component tree renders in the webview; this package gives it OS window
7
+ // controls, global shortcuts, and fs/shell access — all guarded by isTauri() so
8
+ // nothing breaks on the web.
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.TitleBar = exports.openExternal = exports.writeTextFile = exports.readTextFile = exports.useGlobalShortcut = exports.unregisterShortcut = exports.registerShortcut = exports.useWindowControls = exports.windowControls = exports.isTauri = void 0;
11
+ var isTauri_ts_1 = require("./isTauri.js");
12
+ Object.defineProperty(exports, "isTauri", { enumerable: true, get: function () { return isTauri_ts_1.isTauri; } });
13
+ var window_ts_1 = require("./window.js");
14
+ Object.defineProperty(exports, "windowControls", { enumerable: true, get: function () { return window_ts_1.windowControls; } });
15
+ Object.defineProperty(exports, "useWindowControls", { enumerable: true, get: function () { return window_ts_1.useWindowControls; } });
16
+ var shortcuts_ts_1 = require("./shortcuts.js");
17
+ Object.defineProperty(exports, "registerShortcut", { enumerable: true, get: function () { return shortcuts_ts_1.registerShortcut; } });
18
+ Object.defineProperty(exports, "unregisterShortcut", { enumerable: true, get: function () { return shortcuts_ts_1.unregisterShortcut; } });
19
+ Object.defineProperty(exports, "useGlobalShortcut", { enumerable: true, get: function () { return shortcuts_ts_1.useGlobalShortcut; } });
20
+ var system_ts_1 = require("./system.js");
21
+ Object.defineProperty(exports, "readTextFile", { enumerable: true, get: function () { return system_ts_1.readTextFile; } });
22
+ Object.defineProperty(exports, "writeTextFile", { enumerable: true, get: function () { return system_ts_1.writeTextFile; } });
23
+ Object.defineProperty(exports, "openExternal", { enumerable: true, get: function () { return system_ts_1.openExternal; } });
24
+ var TitleBar_tsx_1 = require("./TitleBar.js");
25
+ Object.defineProperty(exports, "TitleBar", { enumerable: true, get: function () { return TitleBar_tsx_1.TitleBar; } });
26
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA,0DAA0D;AAC1D,EAAE;AACF,8EAA8E;AAC9E,+EAA+E;AAC/E,yEAAyE;AACzE,gFAAgF;AAChF,6BAA6B;;;AAE7B,2CAAsC;AAA7B,qGAAA,OAAO,OAAA;AAChB,yCAA+D;AAAtD,2GAAA,cAAc,OAAA;AAAE,8GAAA,iBAAiB,OAAA;AAC1C,+CAAwF;AAA/E,gHAAA,gBAAgB,OAAA;AAAE,kHAAA,kBAAkB,OAAA;AAAE,iHAAA,iBAAiB,OAAA;AAChE,yCAAuE;AAA9D,yGAAA,YAAY,OAAA;AAAE,0GAAA,aAAa,OAAA;AAAE,yGAAA,YAAY,OAAA;AAClD,8CAA6D;AAApD,wGAAA,QAAQ,OAAA"}
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isTauri = isTauri;
4
+ /**
5
+ * True when running inside a Tauri webview. Tauri v2 injects
6
+ * `window.__TAURI_INTERNALS__` (and `window.isTauri`) into the page. Every
7
+ * bridge call guards on this so the same hanzogui component runs unchanged on
8
+ * the web — off-Tauri the native calls are no-ops.
9
+ */
10
+ function isTauri() {
11
+ return (typeof window !== 'undefined' &&
12
+ (!!window.__TAURI_INTERNALS__ || window.isTauri === true));
13
+ }
14
+ //# sourceMappingURL=isTauri.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isTauri.js","sourceRoot":"","sources":["../../src/isTauri.ts"],"names":[],"mappings":";;;AAAA;;;;;GAKG;AACH;IACE,OAAO,CACL,OAAO,MAAM,KAAK,WAAW;QAC7B,CAAC,CAAC,CAAE,MAAc,CAAC,mBAAmB,IAAK,MAAc,CAAC,OAAO,KAAK,IAAI,CAAC,CAC5E,CAAA;AACH,CAAC"}
@@ -0,0 +1 @@
1
+ { "type": "commonjs" }
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerShortcut = registerShortcut;
4
+ exports.unregisterShortcut = unregisterShortcut;
5
+ exports.useGlobalShortcut = useGlobalShortcut;
6
+ const tslib_1 = require("tslib");
7
+ const react_1 = require("react");
8
+ const isTauri_ts_1 = require("./isTauri.js");
9
+ // Global (OS-wide) shortcuts via @tauri-apps/plugin-global-shortcut. Off-Tauri
10
+ // these no-op, so a component can register e.g. ⌘K to summon a CommandPalette
11
+ // and the same code degrades to an in-page key handler on the web.
12
+ async function registerShortcut(accelerator, handler) {
13
+ if (!(0, isTauri_ts_1.isTauri)())
14
+ return;
15
+ const { register } = await Promise.resolve().then(() => tslib_1.__importStar(require('@tauri-apps/plugin-global-shortcut')));
16
+ await register(accelerator, (event) => {
17
+ if (event.state === 'Pressed')
18
+ handler();
19
+ });
20
+ }
21
+ async function unregisterShortcut(accelerator) {
22
+ if (!(0, isTauri_ts_1.isTauri)())
23
+ return;
24
+ const { unregister } = await Promise.resolve().then(() => tslib_1.__importStar(require('@tauri-apps/plugin-global-shortcut')));
25
+ await unregister(accelerator);
26
+ }
27
+ /** Register `accelerator` for the lifetime of the component. */
28
+ function useGlobalShortcut(accelerator, handler) {
29
+ (0, react_1.useEffect)(() => {
30
+ if (!(0, isTauri_ts_1.isTauri)())
31
+ return;
32
+ let cancelled = false;
33
+ registerShortcut(accelerator, handler).catch(() => { });
34
+ return () => {
35
+ cancelled = true;
36
+ void cancelled;
37
+ unregisterShortcut(accelerator).catch(() => { });
38
+ };
39
+ }, [accelerator, handler]);
40
+ }
41
+ //# sourceMappingURL=shortcuts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shortcuts.js","sourceRoot":"","sources":["../../src/shortcuts.ts"],"names":[],"mappings":";;;;;;AAAA,iCAAiC;AACjC,6CAAsC;AAEtC,+EAA+E;AAC/E,8EAA8E;AAC9E,mEAAmE;AAE5D,KAAK,2BACV,WAAmB,EACnB,OAAmB;IAEnB,IAAI,CAAC,IAAA,oBAAO,GAAE;QAAE,OAAM;IACtB,MAAM,EAAE,QAAQ,EAAE,GAAG,gEAAa,oCAAoC,GAAC,CAAA;IACvE,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,EAAE;QACpC,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS;YAAE,OAAO,EAAE,CAAA;IAC1C,CAAC,CAAC,CAAA;AACJ,CAAC;AAEM,KAAK,6BAA6B,WAAmB;IAC1D,IAAI,CAAC,IAAA,oBAAO,GAAE;QAAE,OAAM;IACtB,MAAM,EAAE,UAAU,EAAE,GAAG,gEAAa,oCAAoC,GAAC,CAAA;IACzE,MAAM,UAAU,CAAC,WAAW,CAAC,CAAA;AAC/B,CAAC;AAED,gEAAgE;AAChE,2BAAkC,WAAmB,EAAE,OAAmB;IACxE,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,IAAI,CAAC,IAAA,oBAAO,GAAE;YAAE,OAAM;QACtB,IAAI,SAAS,GAAG,KAAK,CAAA;QACrB,gBAAgB,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;QACtD,OAAO,GAAG,EAAE;YACV,SAAS,GAAG,IAAI,CAAA;YAChB,KAAK,SAAS,CAAA;YACd,kBAAkB,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;QACjD,CAAC,CAAA;IACH,CAAC,EAAE,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAA;AAC5B,CAAC"}
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.readTextFile = readTextFile;
4
+ exports.writeTextFile = writeTextFile;
5
+ exports.openExternal = openExternal;
6
+ const tslib_1 = require("tslib");
7
+ const isTauri_ts_1 = require("./isTauri.js");
8
+ // Thin fs + shell bridge. Each guards on isTauri() and dynamically imports the
9
+ // Tauri plugin, so the web build stays clean. Off-Tauri, reads/opens reject or
10
+ // fall back to the browser (openExternal uses window.open).
11
+ async function readTextFile(path) {
12
+ if (!(0, isTauri_ts_1.isTauri)())
13
+ throw new Error('readTextFile is only available under Tauri');
14
+ const { readTextFile } = await Promise.resolve().then(() => tslib_1.__importStar(require('@tauri-apps/plugin-fs')));
15
+ return readTextFile(path);
16
+ }
17
+ async function writeTextFile(path, contents) {
18
+ if (!(0, isTauri_ts_1.isTauri)())
19
+ throw new Error('writeTextFile is only available under Tauri');
20
+ const { writeTextFile } = await Promise.resolve().then(() => tslib_1.__importStar(require('@tauri-apps/plugin-fs')));
21
+ return writeTextFile(path, contents);
22
+ }
23
+ /** Open a URL in the user's default browser (Tauri) or a new tab (web). */
24
+ async function openExternal(url) {
25
+ if (!(0, isTauri_ts_1.isTauri)()) {
26
+ if (typeof window !== 'undefined')
27
+ window.open(url, '_blank', 'noopener');
28
+ return;
29
+ }
30
+ const { open } = await Promise.resolve().then(() => tslib_1.__importStar(require('@tauri-apps/plugin-shell')));
31
+ await open(url);
32
+ }
33
+ //# sourceMappingURL=system.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"system.js","sourceRoot":"","sources":["../../src/system.ts"],"names":[],"mappings":";;;;;;AAAA,6CAAsC;AAEtC,+EAA+E;AAC/E,+EAA+E;AAC/E,4DAA4D;AAErD,KAAK,uBAAuB,IAAY;IAC7C,IAAI,CAAC,IAAA,oBAAO,GAAE;QAAE,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAA;IAC7E,MAAM,EAAE,YAAY,EAAE,GAAG,gEAAa,uBAAuB,GAAC,CAAA;IAC9D,OAAO,YAAY,CAAC,IAAI,CAAC,CAAA;AAC3B,CAAC;AAEM,KAAK,wBAAwB,IAAY,EAAE,QAAgB;IAChE,IAAI,CAAC,IAAA,oBAAO,GAAE;QAAE,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAA;IAC9E,MAAM,EAAE,aAAa,EAAE,GAAG,gEAAa,uBAAuB,GAAC,CAAA;IAC/D,OAAO,aAAa,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;AACtC,CAAC;AAED,2EAA2E;AACpE,KAAK,uBAAuB,GAAW;IAC5C,IAAI,CAAC,IAAA,oBAAO,GAAE,EAAE,CAAC;QACf,IAAI,OAAO,MAAM,KAAK,WAAW;YAAE,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAA;QACzE,OAAM;IACR,CAAC;IACD,MAAM,EAAE,IAAI,EAAE,GAAG,gEAAa,0BAA0B,GAAC,CAAA;IACzD,MAAM,IAAI,CAAC,GAAG,CAAC,CAAA;AACjB,CAAC"}
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.windowControls = void 0;
4
+ exports.useWindowControls = useWindowControls;
5
+ const tslib_1 = require("tslib");
6
+ const react_1 = require("react");
7
+ const isTauri_ts_1 = require("./isTauri.js");
8
+ // Window controls for a frameless Tauri window (`decorations: false`). Each call
9
+ // dynamically imports the Tauri API so a web bundle never hard-links it, and
10
+ // no-ops off-Tauri. This is the native bridge that lets a hanzogui titlebar
11
+ // drive the real OS window.
12
+ async function currentWindow() {
13
+ if (!(0, isTauri_ts_1.isTauri)())
14
+ return null;
15
+ const { getCurrentWindow } = await Promise.resolve().then(() => tslib_1.__importStar(require('@tauri-apps/api/window')));
16
+ return getCurrentWindow();
17
+ }
18
+ exports.windowControls = {
19
+ minimize: async () => (await currentWindow())?.minimize(),
20
+ toggleMaximize: async () => (await currentWindow())?.toggleMaximize(),
21
+ close: async () => (await currentWindow())?.close(),
22
+ hide: async () => (await currentWindow())?.hide(),
23
+ startDragging: async () => (await currentWindow())?.startDragging(),
24
+ isMaximized: async () => (await currentWindow())?.isMaximized() ?? false,
25
+ setFullscreen: async (v) => (await currentWindow())?.setFullscreen(v),
26
+ };
27
+ /**
28
+ * React hook exposing the window controls plus live maximized state. Bind these
29
+ * to a hanzogui titlebar — see {@link TitleBar}.
30
+ */
31
+ function useWindowControls() {
32
+ const [isMaximized, setIsMaximized] = (0, react_1.useState)(false);
33
+ (0, react_1.useEffect)(() => {
34
+ if (!(0, isTauri_ts_1.isTauri)())
35
+ return;
36
+ let unlisten;
37
+ let active = true;
38
+ (async () => {
39
+ const win = await currentWindow();
40
+ if (!win || !active)
41
+ return;
42
+ setIsMaximized(await win.isMaximized());
43
+ unlisten = await win.onResized(async () => {
44
+ setIsMaximized(await win.isMaximized());
45
+ });
46
+ })();
47
+ return () => {
48
+ active = false;
49
+ unlisten?.();
50
+ };
51
+ }, []);
52
+ return { ...exports.windowControls, isMaximized };
53
+ }
54
+ //# sourceMappingURL=window.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"window.js","sourceRoot":"","sources":["../../src/window.ts"],"names":[],"mappings":";;;;;AAAA,iCAA2C;AAC3C,6CAAsC;AAEtC,iFAAiF;AACjF,6EAA6E;AAC7E,4EAA4E;AAC5E,4BAA4B;AAE5B,KAAK,UAAU,aAAa;IAC1B,IAAI,CAAC,IAAA,oBAAO,GAAE;QAAE,OAAO,IAAI,CAAA;IAC3B,MAAM,EAAE,gBAAgB,EAAE,GAAG,gEAAa,wBAAwB,GAAC,CAAA;IACnE,OAAO,gBAAgB,EAAE,CAAA;AAC3B,CAAC;AAEY,QAAA,cAAc,GAAG;IAC5B,QAAQ,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,aAAa,EAAE,CAAC,EAAE,QAAQ,EAAE;IACzD,cAAc,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,aAAa,EAAE,CAAC,EAAE,cAAc,EAAE;IACrE,KAAK,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,aAAa,EAAE,CAAC,EAAE,KAAK,EAAE;IACnD,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,aAAa,EAAE,CAAC,EAAE,IAAI,EAAE;IACjD,aAAa,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,aAAa,EAAE,CAAC,EAAE,aAAa,EAAE;IACnE,WAAW,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,aAAa,EAAE,CAAC,EAAE,WAAW,EAAE,IAAI,KAAK;IACxE,aAAa,EAAE,KAAK,EAAE,CAAU,EAAE,EAAE,CAAC,CAAC,MAAM,aAAa,EAAE,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC;CAC/E,CAAA;AAED;;;GAGG;AACH;IACE,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,IAAA,gBAAQ,EAAC,KAAK,CAAC,CAAA;IAErD,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,IAAI,CAAC,IAAA,oBAAO,GAAE;YAAE,OAAM;QACtB,IAAI,QAAkC,CAAA;QACtC,IAAI,MAAM,GAAG,IAAI,CAChB;QAAA,CAAC,KAAK,IAAI,EAAE;YACX,MAAM,GAAG,GAAG,MAAM,aAAa,EAAE,CAAA;YACjC,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM;gBAAE,OAAM;YAC3B,cAAc,CAAC,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC,CAAA;YACvC,QAAQ,GAAG,MAAM,GAAG,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE;gBACxC,cAAc,CAAC,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC,CAAA;YACzC,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,EAAE,CAAA;QACJ,OAAO,GAAG,EAAE;YACV,MAAM,GAAG,KAAK,CAAA;YACd,QAAQ,EAAE,EAAE,CAAA;QACd,CAAC,CAAA;IACH,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,OAAO,EAAE,GAAG,QAAA,cAAc,EAAE,WAAW,EAAE,CAAA;AAC3C,CAAC"}
@@ -0,0 +1,28 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Text, XStack, styled } from '@hanzo/gui';
3
+ import { useWindowControls } from './window.js';
4
+ // A frameless-window titlebar built entirely from hanzogui primitives + tokens
5
+ // (true-black `$background`, hairline `$borderColor`). It is the proof that a
6
+ // hanzogui component drives the real Tauri OS window through the bridge. The bar
7
+ // is draggable via Tauri's `data-tauri-drag-region`; the buttons call the
8
+ // window controls. Renders harmlessly on the web (controls no-op off-Tauri).
9
+ const Control = styled(XStack, {
10
+ width: 46,
11
+ height: 32,
12
+ alignItems: 'center',
13
+ justifyContent: 'center',
14
+ cursor: 'pointer',
15
+ hoverStyle: { backgroundColor: '$color4' },
16
+ pressStyle: { backgroundColor: '$color5' },
17
+ });
18
+ const Glyph = styled(Text, {
19
+ fontFamily: '$mono',
20
+ fontSize: 13,
21
+ lineHeight: 13,
22
+ color: '$color11',
23
+ });
24
+ export function TitleBar({ title = '' }) {
25
+ const { minimize, toggleMaximize, close } = useWindowControls();
26
+ return (_jsxs(XStack, { "data-tauri-drag-region": true, height: 40, alignItems: "center", backgroundColor: "$background", borderBottomWidth: 1, borderBottomColor: "$borderColor", userSelect: "none", children: [_jsx(Text, { flex: 1, paddingLeft: "$3", fontFamily: "$body", fontSize: 13, color: "$color11", "data-tauri-drag-region": true, children: title }), _jsxs(XStack, { children: [_jsx(Control, { onPress: () => minimize(), children: _jsx(Glyph, { children: "\u2014" }) }), _jsx(Control, { onPress: () => toggleMaximize(), children: _jsx(Glyph, { children: "\u25A2" }) }), _jsx(Control, { onPress: () => close(), hoverStyle: { backgroundColor: '$red9' }, children: _jsx(Glyph, { children: "\u2715" }) })] })] }));
27
+ }
28
+ //# sourceMappingURL=TitleBar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TitleBar.js","sourceRoot":"","sources":["../../src/TitleBar.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAE/C,+EAA+E;AAC/E,8EAA8E;AAC9E,iFAAiF;AACjF,0EAA0E;AAC1E,6EAA6E;AAE7E,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE;IAC7B,KAAK,EAAE,EAAE;IACT,MAAM,EAAE,EAAE;IACV,UAAU,EAAE,QAAQ;IACpB,cAAc,EAAE,QAAQ;IACxB,MAAM,EAAE,SAAS;IACjB,UAAU,EAAE,EAAE,eAAe,EAAE,SAAS,EAAE;IAC1C,UAAU,EAAE,EAAE,eAAe,EAAE,SAAS,EAAE;CAC3C,CAAC,CAAA;AAEF,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,EAAE;IACzB,UAAU,EAAE,OAAO;IACnB,QAAQ,EAAE,EAAE;IACZ,UAAU,EAAE,EAAE;IACd,KAAK,EAAE,UAAU;CAClB,CAAC,CAAA;AAMF,MAAM,UAAU,QAAQ,CAAC,EAAE,KAAK,GAAG,EAAE,EAAiB;IACpD,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,KAAK,EAAE,GAAG,iBAAiB,EAAE,CAAA;IAE/D,OAAO,CACL,MAAC,MAAM,oCAEL,MAAM,EAAE,EAAE,EACV,UAAU,EAAC,QAAQ,EACnB,eAAe,EAAC,aAAa,EAC7B,iBAAiB,EAAE,CAAC,EACpB,iBAAiB,EAAC,cAAc,EAChC,UAAU,EAAC,MAAM,aAEjB,KAAC,IAAI,IACH,IAAI,EAAE,CAAC,EACP,WAAW,EAAC,IAAI,EAChB,UAAU,EAAC,OAAO,EAClB,QAAQ,EAAE,EAAE,EACZ,KAAK,EAAC,UAAU,4CAGf,KAAK,GACD,EAEP,MAAC,MAAM,eACL,KAAC,OAAO,IAAC,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,EAAE,YAChC,KAAC,KAAK,yBAAU,GACR,EACV,KAAC,OAAO,IAAC,OAAO,EAAE,GAAG,EAAE,CAAC,cAAc,EAAE,YACtC,KAAC,KAAK,yBAAU,GACR,EACV,KAAC,OAAO,IAAC,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,EAAE,UAAU,EAAE,EAAE,eAAe,EAAE,OAAO,EAAE,YACvE,KAAC,KAAK,yBAAU,GACR,IACH,IACF,CACV,CAAA;AACH,CAAC"}
package/dist/esm/index.js CHANGED
@@ -1,7 +1,13 @@
1
- import { isTauri } from "./isTauri.mjs";
2
- import { windowControls, useWindowControls } from "./window.mjs";
3
- import { registerShortcut, unregisterShortcut, useGlobalShortcut } from "./shortcuts.mjs";
4
- import { readTextFile, writeTextFile, openExternal } from "./system.mjs";
5
- import { TitleBar } from "./TitleBar.mjs";
6
- export { TitleBar, isTauri, openExternal, readTextFile, registerShortcut, unregisterShortcut, useGlobalShortcut, useWindowControls, windowControls, writeTextFile };
7
- //# sourceMappingURL=index.js.map
1
+ // @hanzogui/tauri the Tauri desktop weld for Hanzo GUI.
2
+ //
3
+ // hanzogui already targets web (Next/Vite) and native (Expo/RN). This adapter
4
+ // adds the third host: a Tauri webview with a native bridge. The same hanzogui
5
+ // component tree renders in the webview; this package gives it OS window
6
+ // controls, global shortcuts, and fs/shell access all guarded by isTauri() so
7
+ // nothing breaks on the web.
8
+ export { isTauri } from './isTauri.js';
9
+ export { windowControls, useWindowControls } from './window.js';
10
+ export { registerShortcut, unregisterShortcut, useGlobalShortcut } from './shortcuts.js';
11
+ export { readTextFile, writeTextFile, openExternal } from './system.js';
12
+ export { TitleBar } from './TitleBar.js';
13
+ //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["isTauri","windowControls","useWindowControls","registerShortcut","unregisterShortcut","useGlobalShortcut","readTextFile","writeTextFile","openExternal","TitleBar"],"sources":["../../src/index.ts"],"sourcesContent":[null],"mappings":"AAQA,SAASA,OAAA,QAAe;AACxB,SAASC,cAAA,EAAgBC,iBAAA,QAAyB;AAClD,SAASC,gBAAA,EAAkBC,kBAAA,EAAoBC,iBAAA,QAAyB;AACxE,SAASC,YAAA,EAAcC,aAAA,EAAeC,YAAA,QAAoB;AAC1D,SAASC,QAAA,QAAoC","ignoreList":[]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,0DAA0D;AAC1D,EAAE;AACF,8EAA8E;AAC9E,+EAA+E;AAC/E,yEAAyE;AACzE,gFAAgF;AAChF,6BAA6B;AAE7B,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAC/D,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AACxF,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AACvE,OAAO,EAAE,QAAQ,EAAsB,MAAM,eAAgB,CAAA"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * True when running inside a Tauri webview. Tauri v2 injects
3
+ * `window.__TAURI_INTERNALS__` (and `window.isTauri`) into the page. Every
4
+ * bridge call guards on this so the same hanzogui component runs unchanged on
5
+ * the web — off-Tauri the native calls are no-ops.
6
+ */
7
+ export function isTauri() {
8
+ return (typeof window !== 'undefined' &&
9
+ (!!window.__TAURI_INTERNALS__ || window.isTauri === true));
10
+ }
11
+ //# sourceMappingURL=isTauri.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isTauri.js","sourceRoot":"","sources":["../../src/isTauri.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,UAAU,OAAO;IACrB,OAAO,CACL,OAAO,MAAM,KAAK,WAAW;QAC7B,CAAC,CAAC,CAAE,MAAc,CAAC,mBAAmB,IAAK,MAAc,CAAC,OAAO,KAAK,IAAI,CAAC,CAC5E,CAAA;AACH,CAAC"}
@@ -0,0 +1,35 @@
1
+ import { useEffect } from 'react';
2
+ import { isTauri } from './isTauri.js';
3
+ // Global (OS-wide) shortcuts via @tauri-apps/plugin-global-shortcut. Off-Tauri
4
+ // these no-op, so a component can register e.g. ⌘K to summon a CommandPalette
5
+ // and the same code degrades to an in-page key handler on the web.
6
+ export async function registerShortcut(accelerator, handler) {
7
+ if (!isTauri())
8
+ return;
9
+ const { register } = await import('@tauri-apps/plugin-global-shortcut');
10
+ await register(accelerator, (event) => {
11
+ if (event.state === 'Pressed')
12
+ handler();
13
+ });
14
+ }
15
+ export async function unregisterShortcut(accelerator) {
16
+ if (!isTauri())
17
+ return;
18
+ const { unregister } = await import('@tauri-apps/plugin-global-shortcut');
19
+ await unregister(accelerator);
20
+ }
21
+ /** Register `accelerator` for the lifetime of the component. */
22
+ export function useGlobalShortcut(accelerator, handler) {
23
+ useEffect(() => {
24
+ if (!isTauri())
25
+ return;
26
+ let cancelled = false;
27
+ registerShortcut(accelerator, handler).catch(() => { });
28
+ return () => {
29
+ cancelled = true;
30
+ void cancelled;
31
+ unregisterShortcut(accelerator).catch(() => { });
32
+ };
33
+ }, [accelerator, handler]);
34
+ }
35
+ //# sourceMappingURL=shortcuts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shortcuts.js","sourceRoot":"","sources":["../../src/shortcuts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAEtC,+EAA+E;AAC/E,8EAA8E;AAC9E,mEAAmE;AAEnE,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,WAAmB,EACnB,OAAmB;IAEnB,IAAI,CAAC,OAAO,EAAE;QAAE,OAAM;IACtB,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,oCAAoC,CAAC,CAAA;IACvE,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,EAAE;QACpC,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS;YAAE,OAAO,EAAE,CAAA;IAC1C,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,WAAmB;IAC1D,IAAI,CAAC,OAAO,EAAE;QAAE,OAAM;IACtB,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,oCAAoC,CAAC,CAAA;IACzE,MAAM,UAAU,CAAC,WAAW,CAAC,CAAA;AAC/B,CAAC;AAED,gEAAgE;AAChE,MAAM,UAAU,iBAAiB,CAAC,WAAmB,EAAE,OAAmB;IACxE,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,OAAO,EAAE;YAAE,OAAM;QACtB,IAAI,SAAS,GAAG,KAAK,CAAA;QACrB,gBAAgB,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;QACtD,OAAO,GAAG,EAAE;YACV,SAAS,GAAG,IAAI,CAAA;YAChB,KAAK,SAAS,CAAA;YACd,kBAAkB,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;QACjD,CAAC,CAAA;IACH,CAAC,EAAE,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAA;AAC5B,CAAC"}
@@ -0,0 +1,27 @@
1
+ import { isTauri } from './isTauri.js';
2
+ // Thin fs + shell bridge. Each guards on isTauri() and dynamically imports the
3
+ // Tauri plugin, so the web build stays clean. Off-Tauri, reads/opens reject or
4
+ // fall back to the browser (openExternal uses window.open).
5
+ export async function readTextFile(path) {
6
+ if (!isTauri())
7
+ throw new Error('readTextFile is only available under Tauri');
8
+ const { readTextFile } = await import('@tauri-apps/plugin-fs');
9
+ return readTextFile(path);
10
+ }
11
+ export async function writeTextFile(path, contents) {
12
+ if (!isTauri())
13
+ throw new Error('writeTextFile is only available under Tauri');
14
+ const { writeTextFile } = await import('@tauri-apps/plugin-fs');
15
+ return writeTextFile(path, contents);
16
+ }
17
+ /** Open a URL in the user's default browser (Tauri) or a new tab (web). */
18
+ export async function openExternal(url) {
19
+ if (!isTauri()) {
20
+ if (typeof window !== 'undefined')
21
+ window.open(url, '_blank', 'noopener');
22
+ return;
23
+ }
24
+ const { open } = await import('@tauri-apps/plugin-shell');
25
+ await open(url);
26
+ }
27
+ //# sourceMappingURL=system.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"system.js","sourceRoot":"","sources":["../../src/system.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAEtC,+EAA+E;AAC/E,+EAA+E;AAC/E,4DAA4D;AAE5D,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAY;IAC7C,IAAI,CAAC,OAAO,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAA;IAC7E,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAA;IAC9D,OAAO,YAAY,CAAC,IAAI,CAAC,CAAA;AAC3B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAY,EAAE,QAAgB;IAChE,IAAI,CAAC,OAAO,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAA;IAC9E,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAA;IAC/D,OAAO,aAAa,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;AACtC,CAAC;AAED,2EAA2E;AAC3E,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAW;IAC5C,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;QACf,IAAI,OAAO,MAAM,KAAK,WAAW;YAAE,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAA;QACzE,OAAM;IACR,CAAC;IACD,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,0BAA0B,CAAC,CAAA;IACzD,MAAM,IAAI,CAAC,GAAG,CAAC,CAAA;AACjB,CAAC"}
@@ -0,0 +1,49 @@
1
+ import { useEffect, useState } from 'react';
2
+ import { isTauri } from './isTauri.js';
3
+ // Window controls for a frameless Tauri window (`decorations: false`). Each call
4
+ // dynamically imports the Tauri API so a web bundle never hard-links it, and
5
+ // no-ops off-Tauri. This is the native bridge that lets a hanzogui titlebar
6
+ // drive the real OS window.
7
+ async function currentWindow() {
8
+ if (!isTauri())
9
+ return null;
10
+ const { getCurrentWindow } = await import('@tauri-apps/api/window');
11
+ return getCurrentWindow();
12
+ }
13
+ export const windowControls = {
14
+ minimize: async () => (await currentWindow())?.minimize(),
15
+ toggleMaximize: async () => (await currentWindow())?.toggleMaximize(),
16
+ close: async () => (await currentWindow())?.close(),
17
+ hide: async () => (await currentWindow())?.hide(),
18
+ startDragging: async () => (await currentWindow())?.startDragging(),
19
+ isMaximized: async () => (await currentWindow())?.isMaximized() ?? false,
20
+ setFullscreen: async (v) => (await currentWindow())?.setFullscreen(v),
21
+ };
22
+ /**
23
+ * React hook exposing the window controls plus live maximized state. Bind these
24
+ * to a hanzogui titlebar — see {@link TitleBar}.
25
+ */
26
+ export function useWindowControls() {
27
+ const [isMaximized, setIsMaximized] = useState(false);
28
+ useEffect(() => {
29
+ if (!isTauri())
30
+ return;
31
+ let unlisten;
32
+ let active = true;
33
+ (async () => {
34
+ const win = await currentWindow();
35
+ if (!win || !active)
36
+ return;
37
+ setIsMaximized(await win.isMaximized());
38
+ unlisten = await win.onResized(async () => {
39
+ setIsMaximized(await win.isMaximized());
40
+ });
41
+ })();
42
+ return () => {
43
+ active = false;
44
+ unlisten?.();
45
+ };
46
+ }, []);
47
+ return { ...windowControls, isMaximized };
48
+ }
49
+ //# sourceMappingURL=window.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"window.js","sourceRoot":"","sources":["../../src/window.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAEtC,iFAAiF;AACjF,6EAA6E;AAC7E,4EAA4E;AAC5E,4BAA4B;AAE5B,KAAK,UAAU,aAAa;IAC1B,IAAI,CAAC,OAAO,EAAE;QAAE,OAAO,IAAI,CAAA;IAC3B,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAA;IACnE,OAAO,gBAAgB,EAAE,CAAA;AAC3B,CAAC;AAED,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,QAAQ,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,aAAa,EAAE,CAAC,EAAE,QAAQ,EAAE;IACzD,cAAc,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,aAAa,EAAE,CAAC,EAAE,cAAc,EAAE;IACrE,KAAK,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,aAAa,EAAE,CAAC,EAAE,KAAK,EAAE;IACnD,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,aAAa,EAAE,CAAC,EAAE,IAAI,EAAE;IACjD,aAAa,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,aAAa,EAAE,CAAC,EAAE,aAAa,EAAE;IACnE,WAAW,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,aAAa,EAAE,CAAC,EAAE,WAAW,EAAE,IAAI,KAAK;IACxE,aAAa,EAAE,KAAK,EAAE,CAAU,EAAE,EAAE,CAAC,CAAC,MAAM,aAAa,EAAE,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC;CAC/E,CAAA;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB;IAC/B,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAErD,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,OAAO,EAAE;YAAE,OAAM;QACtB,IAAI,QAAkC,CAAA;QACtC,IAAI,MAAM,GAAG,IAAI,CAChB;QAAA,CAAC,KAAK,IAAI,EAAE;YACX,MAAM,GAAG,GAAG,MAAM,aAAa,EAAE,CAAA;YACjC,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM;gBAAE,OAAM;YAC3B,cAAc,CAAC,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC,CAAA;YACvC,QAAQ,GAAG,MAAM,GAAG,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE;gBACxC,cAAc,CAAC,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC,CAAA;YACzC,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,EAAE,CAAA;QACJ,OAAO,GAAG,EAAE;YACV,MAAM,GAAG,KAAK,CAAA;YACd,QAAQ,EAAE,EAAE,CAAA;QACd,CAAC,CAAA;IACH,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,OAAO,EAAE,GAAG,cAAc,EAAE,WAAW,EAAE,CAAA;AAC3C,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,9 @@
1
1
  {
2
2
  "name": "@hanzogui/tauri",
3
- "version": "8.3.1",
3
+ "version": "8.3.3",
4
4
  "description": "Tauri desktop adapter for Hanzo GUI — window controls, global shortcuts, fs/shell bridge so hanzogui components run in a Tauri webview.",
5
+ "license": "BSD-3-Clause",
6
+ "author": "Hanzo AI <dev@hanzo.ai>",
5
7
  "files": [
6
8
  "src",
7
9
  "types",
@@ -9,45 +11,48 @@
9
11
  ],
10
12
  "type": "module",
11
13
  "sideEffects": false,
12
- "main": "dist/cjs",
13
- "module": "dist/esm",
14
- "types": "./src",
14
+ "main": "./dist/cjs/index.js",
15
+ "module": "./dist/esm/index.js",
16
+ "types": "./types/index.d.ts",
15
17
  "exports": {
16
18
  "./package.json": "./package.json",
17
19
  ".": {
18
- "types": "./src/index.ts",
19
- "react-native": "./dist/esm/index.native.js",
20
- "browser": "./dist/esm/index.mjs",
21
- "module": "./dist/esm/index.mjs",
22
- "import": "./dist/esm/index.mjs",
23
- "require": "./dist/cjs/index.cjs",
24
- "default": "./dist/esm/index.mjs"
20
+ "types": "./types/index.d.ts",
21
+ "react-native": "./dist/esm/index.js",
22
+ "browser": "./dist/esm/index.js",
23
+ "module": "./dist/esm/index.js",
24
+ "import": "./dist/esm/index.js",
25
+ "require": "./dist/cjs/index.js",
26
+ "default": "./dist/esm/index.js"
25
27
  }
26
28
  },
27
29
  "publishConfig": {
28
30
  "access": "public"
29
31
  },
30
32
  "scripts": {
31
- "build": "hanzogui-build --skip-types",
33
+ "build": "hanzogui-build --skip-native",
32
34
  "watch": "hanzogui-build --skip-types --watch",
33
35
  "clean": "hanzogui-build clean",
34
36
  "clean:build": "hanzogui-build clean:build"
35
37
  },
36
38
  "dependencies": {
37
- "@tauri-apps/api": "^2.6.0",
38
- "@tauri-apps/plugin-fs": "^2.3.0",
39
- "@tauri-apps/plugin-global-shortcut": "^2.2.1",
40
- "@tauri-apps/plugin-shell": "^2.2.1"
39
+ "@tauri-apps/api": "^2.11.1",
40
+ "@tauri-apps/plugin-fs": "^2.5.1",
41
+ "@tauri-apps/plugin-global-shortcut": "^2.3.2",
42
+ "@tauri-apps/plugin-shell": "^2.3.5"
41
43
  },
42
44
  "devDependencies": {
43
- "@hanzogui/build": "8.3.1",
44
- "@hanzo/gui": "8.3.1",
45
- "react": ">=19"
45
+ "@hanzo/gui": "8.3.3",
46
+ "@hanzogui/build": "8.3.3",
47
+ "react": "19.2.8"
46
48
  },
47
49
  "peerDependencies": {
48
- "@hanzo/gui": ">=8.3.0",
49
- "react": ">=19"
50
+ "@hanzo/gui": ">=8.3.1",
51
+ "react": ">=19.2.8"
50
52
  },
51
- "license": "BSD-3-Clause",
52
- "author": "Hanzo AI <dev@hanzo.ai>"
53
+ "repository": {
54
+ "type": "git",
55
+ "url": "git+https://github.com/hanzoai/gui.git",
56
+ "directory": "pkgs/tauri"
57
+ }
53
58
  }
package/src/TitleBar.tsx CHANGED
@@ -1,5 +1,5 @@
1
1
  import { Text, XStack, styled } from '@hanzo/gui'
2
- import { useWindowControls } from './window'
2
+ import { useWindowControls } from './window.ts'
3
3
 
4
4
  // A frameless-window titlebar built entirely from hanzogui primitives + tokens
5
5
  // (true-black `$background`, hairline `$borderColor`). It is the proof that a
@@ -15,7 +15,6 @@ const Control = styled(XStack, {
15
15
  cursor: 'pointer',
16
16
  hoverStyle: { backgroundColor: '$color4' },
17
17
  pressStyle: { backgroundColor: '$color5' },
18
- animation: 'quick',
19
18
  })
20
19
 
21
20
  const Glyph = styled(Text, {
@@ -34,7 +33,6 @@ export function TitleBar({ title = '' }: TitleBarProps) {
34
33
 
35
34
  return (
36
35
  <XStack
37
- // @ts-expect-error — Tauri drag region is a raw DOM attribute (web/webview)
38
36
  data-tauri-drag-region
39
37
  height={40}
40
38
  alignItems="center"
@@ -49,7 +47,6 @@ export function TitleBar({ title = '' }: TitleBarProps) {
49
47
  fontFamily="$body"
50
48
  fontSize={13}
51
49
  color="$color11"
52
- // @ts-expect-error — raw DOM attribute so clicks on the title still drag
53
50
  data-tauri-drag-region
54
51
  >
55
52
  {title}
package/src/index.ts CHANGED
@@ -6,8 +6,8 @@
6
6
  // controls, global shortcuts, and fs/shell access — all guarded by isTauri() so
7
7
  // nothing breaks on the web.
8
8
 
9
- export { isTauri } from './isTauri'
10
- export { windowControls, useWindowControls } from './window'
11
- export { registerShortcut, unregisterShortcut, useGlobalShortcut } from './shortcuts'
12
- export { readTextFile, writeTextFile, openExternal } from './system'
13
- export { TitleBar, type TitleBarProps } from './TitleBar'
9
+ export { isTauri } from './isTauri.ts'
10
+ export { windowControls, useWindowControls } from './window.ts'
11
+ export { registerShortcut, unregisterShortcut, useGlobalShortcut } from './shortcuts.ts'
12
+ export { readTextFile, writeTextFile, openExternal } from './system.ts'
13
+ export { TitleBar, type TitleBarProps } from './TitleBar.tsx'
package/src/shortcuts.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { useEffect } from 'react'
2
- import { isTauri } from './isTauri'
2
+ import { isTauri } from './isTauri.ts'
3
3
 
4
4
  // Global (OS-wide) shortcuts via @tauri-apps/plugin-global-shortcut. Off-Tauri
5
5
  // these no-op, so a component can register e.g. ⌘K to summon a CommandPalette
package/src/system.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { isTauri } from './isTauri'
1
+ import { isTauri } from './isTauri.ts'
2
2
 
3
3
  // Thin fs + shell bridge. Each guards on isTauri() and dynamically imports the
4
4
  // Tauri plugin, so the web build stays clean. Off-Tauri, reads/opens reject or
package/src/window.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { useEffect, useState } from 'react'
2
- import { isTauri } from './isTauri'
2
+ import { isTauri } from './isTauri.ts'
3
3
 
4
4
  // Window controls for a frameless Tauri window (`decorations: false`). Each call
5
5
  // dynamically imports the Tauri API so a web bundle never hard-links it, and
@@ -0,0 +1,5 @@
1
+ export type TitleBarProps = {
2
+ title?: string;
3
+ };
4
+ export declare function TitleBar({ title }: TitleBarProps): import("react").JSX.Element;
5
+ //# sourceMappingURL=TitleBar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TitleBar.d.ts","sourceRoot":"","sources":["../src/TitleBar.tsx"],"names":[],"mappings":"AA0BA,MAAM,MAAM,aAAa,GAAG;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,CAAA;AAED,wBAAgB,QAAQ,CAAC,EAAE,KAAU,EAAE,EAAE,aAAa,+BAqCrD"}
@@ -0,0 +1,6 @@
1
+ export { isTauri } from './isTauri.ts';
2
+ export { windowControls, useWindowControls } from './window.ts';
3
+ export { registerShortcut, unregisterShortcut, useGlobalShortcut } from './shortcuts.ts';
4
+ export { readTextFile, writeTextFile, openExternal } from './system.ts';
5
+ export { TitleBar, type TitleBarProps } from './TitleBar.tsx';
6
+ //# sourceMappingURL=index.d.ts.map