webtau 0.1.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/core.d.ts +55 -0
- package/dist/core.d.ts.map +1 -0
- package/dist/core.js +103 -0
- package/dist/core.js.map +1 -0
- package/dist/dpi.d.ts +35 -0
- package/dist/dpi.d.ts.map +1 -0
- package/dist/dpi.js +55 -0
- package/dist/dpi.js.map +1 -0
- package/dist/window.d.ts +46 -0
- package/dist/window.d.ts.map +1 -0
- package/dist/window.js +107 -0
- package/dist/window.js.map +1 -0
- package/package.json +45 -0
package/dist/core.d.ts
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* webtau — Tauri-to-web invoke router.
|
|
3
|
+
*
|
|
4
|
+
* Detects whether the app is running inside Tauri (desktop) or as a
|
|
5
|
+
* plain web app. In Tauri mode, delegates to `@tauri-apps/api/core`.
|
|
6
|
+
* In web mode, calls the corresponding function from a WASM module
|
|
7
|
+
* that was registered via `configure()`.
|
|
8
|
+
*/
|
|
9
|
+
type WasmModule = Record<string, (...args: any[]) => any>;
|
|
10
|
+
export interface WebtauConfig {
|
|
11
|
+
/**
|
|
12
|
+
* A function that returns the WASM module (or a promise for it).
|
|
13
|
+
* This is typically `() => import("./wasm")` pointing at the
|
|
14
|
+
* wasm-pack output.
|
|
15
|
+
*/
|
|
16
|
+
loadWasm: () => Promise<WasmModule>;
|
|
17
|
+
/**
|
|
18
|
+
* Called if the WASM module fails to load.
|
|
19
|
+
* Defaults to `console.error`.
|
|
20
|
+
*/
|
|
21
|
+
onLoadError?: (error: unknown) => void;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Configure webtau for web mode. Must be called before the first
|
|
25
|
+
* `invoke()` in a web build. In Tauri mode this is a no-op.
|
|
26
|
+
*
|
|
27
|
+
* ```ts
|
|
28
|
+
* import { configure } from "webtau";
|
|
29
|
+
*
|
|
30
|
+
* configure({
|
|
31
|
+
* loadWasm: () => import("./wasm"),
|
|
32
|
+
* });
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export declare function configure(config: WebtauConfig): void;
|
|
36
|
+
/**
|
|
37
|
+
* Returns `true` when running inside Tauri.
|
|
38
|
+
* Checks for `window.__TAURI_INTERNALS__` which Tauri injects.
|
|
39
|
+
*/
|
|
40
|
+
export declare function isTauri(): boolean;
|
|
41
|
+
/**
|
|
42
|
+
* Universal invoke — same API as `@tauri-apps/api/core`'s `invoke()`.
|
|
43
|
+
*
|
|
44
|
+
* In Tauri mode: delegates to Tauri IPC.
|
|
45
|
+
* In web mode: calls the matching WASM export, passing the args
|
|
46
|
+
* object as a single parameter.
|
|
47
|
+
*
|
|
48
|
+
* ```ts
|
|
49
|
+
* const view = await invoke<WorldView>("get_world_view");
|
|
50
|
+
* const result = await invoke<TickResult>("tick_world");
|
|
51
|
+
* ```
|
|
52
|
+
*/
|
|
53
|
+
export declare function invoke<T = unknown>(command: string, args?: Record<string, unknown>): Promise<T>;
|
|
54
|
+
export {};
|
|
55
|
+
//# sourceMappingURL=core.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,KAAK,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC,CAAC;AAM1D,MAAM,WAAW,YAAY;IAC3B;;;;OAIG;IACH,QAAQ,EAAE,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC;IAEpC;;;OAGG;IACH,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CACxC;AAMD;;;;;;;;;;;GAWG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAOpD;AAED;;;GAGG;AACH,wBAAgB,OAAO,IAAI,OAAO,CAKjC;AAyCD;;;;;;;;;;;GAWG;AACH,wBAAsB,MAAM,CAAC,CAAC,GAAG,OAAO,EACtC,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,OAAO,CAAC,CAAC,CAAC,CAuBZ"}
|
package/dist/core.js
ADDED
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* webtau — Tauri-to-web invoke router.
|
|
3
|
+
*
|
|
4
|
+
* Detects whether the app is running inside Tauri (desktop) or as a
|
|
5
|
+
* plain web app. In Tauri mode, delegates to `@tauri-apps/api/core`.
|
|
6
|
+
* In web mode, calls the corresponding function from a WASM module
|
|
7
|
+
* that was registered via `configure()`.
|
|
8
|
+
*/
|
|
9
|
+
let wasmModule = null;
|
|
10
|
+
let wasmLoader = null;
|
|
11
|
+
let wasmLoadPromise = null;
|
|
12
|
+
let onLoadError = (err) => {
|
|
13
|
+
console.error("[webtau] Failed to load WASM module:", err);
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Configure webtau for web mode. Must be called before the first
|
|
17
|
+
* `invoke()` in a web build. In Tauri mode this is a no-op.
|
|
18
|
+
*
|
|
19
|
+
* ```ts
|
|
20
|
+
* import { configure } from "webtau";
|
|
21
|
+
*
|
|
22
|
+
* configure({
|
|
23
|
+
* loadWasm: () => import("./wasm"),
|
|
24
|
+
* });
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
export function configure(config) {
|
|
28
|
+
wasmLoader = config.loadWasm;
|
|
29
|
+
wasmModule = null;
|
|
30
|
+
wasmLoadPromise = null;
|
|
31
|
+
if (config.onLoadError) {
|
|
32
|
+
onLoadError = config.onLoadError;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Returns `true` when running inside Tauri.
|
|
37
|
+
* Checks for `window.__TAURI_INTERNALS__` which Tauri injects.
|
|
38
|
+
*/
|
|
39
|
+
export function isTauri() {
|
|
40
|
+
return (typeof window !== "undefined" &&
|
|
41
|
+
"__TAURI_INTERNALS__" in window);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Lazily loads and caches the WASM module.
|
|
45
|
+
*
|
|
46
|
+
* Loading is deduplicated: concurrent `invoke()` calls while the module is
|
|
47
|
+
* still loading will share the same promise instead of triggering multiple
|
|
48
|
+
* loads. On failure the promise is cleared so the next `invoke()` retries
|
|
49
|
+
* the load (the user may have called `configure()` with a fixed loader).
|
|
50
|
+
*/
|
|
51
|
+
async function getWasmModule() {
|
|
52
|
+
// Fast path: module already loaded and cached.
|
|
53
|
+
if (wasmModule)
|
|
54
|
+
return wasmModule;
|
|
55
|
+
// Deduplicate: if a load is already in flight, piggyback on it.
|
|
56
|
+
if (wasmLoadPromise)
|
|
57
|
+
return wasmLoadPromise;
|
|
58
|
+
if (!wasmLoader) {
|
|
59
|
+
throw new Error("[webtau] No WASM module configured. " +
|
|
60
|
+
'Call configure({ loadWasm: () => import("./wasm") }) before invoke().');
|
|
61
|
+
}
|
|
62
|
+
wasmLoadPromise = wasmLoader().then((mod) => {
|
|
63
|
+
wasmModule = mod;
|
|
64
|
+
return mod;
|
|
65
|
+
}, (err) => {
|
|
66
|
+
// Clear promise so subsequent invoke() calls can retry after the
|
|
67
|
+
// user fixes the issue (e.g. reconfigures with a valid loader).
|
|
68
|
+
wasmLoadPromise = null;
|
|
69
|
+
onLoadError(err);
|
|
70
|
+
throw err;
|
|
71
|
+
});
|
|
72
|
+
return wasmLoadPromise;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Universal invoke — same API as `@tauri-apps/api/core`'s `invoke()`.
|
|
76
|
+
*
|
|
77
|
+
* In Tauri mode: delegates to Tauri IPC.
|
|
78
|
+
* In web mode: calls the matching WASM export, passing the args
|
|
79
|
+
* object as a single parameter.
|
|
80
|
+
*
|
|
81
|
+
* ```ts
|
|
82
|
+
* const view = await invoke<WorldView>("get_world_view");
|
|
83
|
+
* const result = await invoke<TickResult>("tick_world");
|
|
84
|
+
* ```
|
|
85
|
+
*/
|
|
86
|
+
export async function invoke(command, args) {
|
|
87
|
+
if (isTauri()) {
|
|
88
|
+
// Dynamic import — @tauri-apps/api is an optional peer dependency.
|
|
89
|
+
// Only loaded at runtime inside Tauri, never in web builds.
|
|
90
|
+
const mod = await import("@tauri-apps/api/core");
|
|
91
|
+
return mod.invoke(command, args);
|
|
92
|
+
}
|
|
93
|
+
const wasm = await getWasmModule();
|
|
94
|
+
const fn = wasm[command];
|
|
95
|
+
if (typeof fn !== "function") {
|
|
96
|
+
throw new Error(`[webtau] WASM module has no export named "${command}". ` +
|
|
97
|
+
`Available: ${Object.keys(wasm).filter((k) => typeof wasm[k] === "function").join(", ")}`);
|
|
98
|
+
}
|
|
99
|
+
const result = args ? fn(args) : fn();
|
|
100
|
+
// wasm_bindgen can return plain values or promises
|
|
101
|
+
return result instanceof Promise ? result : result;
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=core.js.map
|
package/dist/core.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core.js","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,IAAI,UAAU,GAAsB,IAAI,CAAC;AACzC,IAAI,UAAU,GAAuC,IAAI,CAAC;AAC1D,IAAI,eAAe,GAA+B,IAAI,CAAC;AAiBvD,IAAI,WAAW,GAA6B,CAAC,GAAG,EAAE,EAAE;IAClD,OAAO,CAAC,KAAK,CAAC,sCAAsC,EAAE,GAAG,CAAC,CAAC;AAC7D,CAAC,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,SAAS,CAAC,MAAoB;IAC5C,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC;IAC7B,UAAU,GAAG,IAAI,CAAC;IAClB,eAAe,GAAG,IAAI,CAAC;IACvB,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;QACvB,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;IACnC,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,OAAO;IACrB,OAAO,CACL,OAAO,MAAM,KAAK,WAAW;QAC7B,qBAAqB,IAAI,MAAM,CAChC,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,KAAK,UAAU,aAAa;IAC1B,+CAA+C;IAC/C,IAAI,UAAU;QAAE,OAAO,UAAU,CAAC;IAElC,gEAAgE;IAChE,IAAI,eAAe;QAAE,OAAO,eAAe,CAAC;IAE5C,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CACb,sCAAsC;YACpC,uEAAuE,CAC1E,CAAC;IACJ,CAAC;IAED,eAAe,GAAG,UAAU,EAAE,CAAC,IAAI,CACjC,CAAC,GAAG,EAAE,EAAE;QACN,UAAU,GAAG,GAAG,CAAC;QACjB,OAAO,GAAG,CAAC;IACb,CAAC,EACD,CAAC,GAAG,EAAE,EAAE;QACN,iEAAiE;QACjE,gEAAgE;QAChE,eAAe,GAAG,IAAI,CAAC;QACvB,WAAW,CAAC,GAAG,CAAC,CAAC;QACjB,MAAM,GAAG,CAAC;IACZ,CAAC,CACF,CAAC;IAEF,OAAO,eAAe,CAAC;AACzB,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,MAAM,CAC1B,OAAe,EACf,IAA8B;IAE9B,IAAI,OAAO,EAAE,EAAE,CAAC;QACd,mEAAmE;QACnE,4DAA4D;QAC5D,MAAM,GAAG,GACP,MAAM,MAAM,CAAC,sBAAgC,CAAC,CAAC;QACjD,OAAO,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACnC,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,aAAa,EAAE,CAAC;IACnC,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;IAEzB,IAAI,OAAO,EAAE,KAAK,UAAU,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CACb,6CAA6C,OAAO,KAAK;YACvD,cAAc,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC5F,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IAEtC,mDAAmD;IACnD,OAAO,MAAM,YAAY,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAE,MAAY,CAAC;AAC5D,CAAC"}
|
package/dist/dpi.d.ts
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* webtau/dpi — Web shim for @tauri-apps/api/dpi.
|
|
3
|
+
*
|
|
4
|
+
* Provides LogicalSize, PhysicalSize, and LogicalPosition classes
|
|
5
|
+
* that match Tauri's API surface, backed by browser primitives.
|
|
6
|
+
*/
|
|
7
|
+
export declare class LogicalSize {
|
|
8
|
+
width: number;
|
|
9
|
+
height: number;
|
|
10
|
+
readonly type = "Logical";
|
|
11
|
+
constructor(width: number, height: number);
|
|
12
|
+
toPhysical(scaleFactor: number): PhysicalSize;
|
|
13
|
+
}
|
|
14
|
+
export declare class PhysicalSize {
|
|
15
|
+
width: number;
|
|
16
|
+
height: number;
|
|
17
|
+
readonly type = "Physical";
|
|
18
|
+
constructor(width: number, height: number);
|
|
19
|
+
toLogical(scaleFactor: number): LogicalSize;
|
|
20
|
+
}
|
|
21
|
+
export declare class LogicalPosition {
|
|
22
|
+
x: number;
|
|
23
|
+
y: number;
|
|
24
|
+
readonly type = "Logical";
|
|
25
|
+
constructor(x: number, y: number);
|
|
26
|
+
toPhysical(scaleFactor: number): PhysicalPosition;
|
|
27
|
+
}
|
|
28
|
+
export declare class PhysicalPosition {
|
|
29
|
+
x: number;
|
|
30
|
+
y: number;
|
|
31
|
+
readonly type = "Physical";
|
|
32
|
+
constructor(x: number, y: number);
|
|
33
|
+
toLogical(scaleFactor: number): LogicalPosition;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=dpi.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dpi.d.ts","sourceRoot":"","sources":["../src/dpi.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,qBAAa,WAAW;IAGb,KAAK,EAAE,MAAM;IACb,MAAM,EAAE,MAAM;IAHvB,QAAQ,CAAC,IAAI,aAAa;gBAEjB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM;IAGvB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,YAAY;CAM9C;AAED,qBAAa,YAAY;IAGd,KAAK,EAAE,MAAM;IACb,MAAM,EAAE,MAAM;IAHvB,QAAQ,CAAC,IAAI,cAAc;gBAElB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM;IAGvB,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,WAAW;CAM5C;AAED,qBAAa,eAAe;IAGjB,CAAC,EAAE,MAAM;IACT,CAAC,EAAE,MAAM;IAHlB,QAAQ,CAAC,IAAI,aAAa;gBAEjB,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM;IAGlB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,gBAAgB;CAMlD;AAED,qBAAa,gBAAgB;IAGlB,CAAC,EAAE,MAAM;IACT,CAAC,EAAE,MAAM;IAHlB,QAAQ,CAAC,IAAI,cAAc;gBAElB,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM;IAGlB,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,eAAe;CAMhD"}
|
package/dist/dpi.js
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* webtau/dpi — Web shim for @tauri-apps/api/dpi.
|
|
3
|
+
*
|
|
4
|
+
* Provides LogicalSize, PhysicalSize, and LogicalPosition classes
|
|
5
|
+
* that match Tauri's API surface, backed by browser primitives.
|
|
6
|
+
*/
|
|
7
|
+
export class LogicalSize {
|
|
8
|
+
width;
|
|
9
|
+
height;
|
|
10
|
+
type = "Logical";
|
|
11
|
+
constructor(width, height) {
|
|
12
|
+
this.width = width;
|
|
13
|
+
this.height = height;
|
|
14
|
+
}
|
|
15
|
+
toPhysical(scaleFactor) {
|
|
16
|
+
return new PhysicalSize(Math.round(this.width * scaleFactor), Math.round(this.height * scaleFactor));
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
export class PhysicalSize {
|
|
20
|
+
width;
|
|
21
|
+
height;
|
|
22
|
+
type = "Physical";
|
|
23
|
+
constructor(width, height) {
|
|
24
|
+
this.width = width;
|
|
25
|
+
this.height = height;
|
|
26
|
+
}
|
|
27
|
+
toLogical(scaleFactor) {
|
|
28
|
+
return new LogicalSize(this.width / scaleFactor, this.height / scaleFactor);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
export class LogicalPosition {
|
|
32
|
+
x;
|
|
33
|
+
y;
|
|
34
|
+
type = "Logical";
|
|
35
|
+
constructor(x, y) {
|
|
36
|
+
this.x = x;
|
|
37
|
+
this.y = y;
|
|
38
|
+
}
|
|
39
|
+
toPhysical(scaleFactor) {
|
|
40
|
+
return new PhysicalPosition(Math.round(this.x * scaleFactor), Math.round(this.y * scaleFactor));
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
export class PhysicalPosition {
|
|
44
|
+
x;
|
|
45
|
+
y;
|
|
46
|
+
type = "Physical";
|
|
47
|
+
constructor(x, y) {
|
|
48
|
+
this.x = x;
|
|
49
|
+
this.y = y;
|
|
50
|
+
}
|
|
51
|
+
toLogical(scaleFactor) {
|
|
52
|
+
return new LogicalPosition(this.x / scaleFactor, this.y / scaleFactor);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=dpi.js.map
|
package/dist/dpi.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dpi.js","sourceRoot":"","sources":["../src/dpi.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,OAAO,WAAW;IAGb;IACA;IAHA,IAAI,GAAG,SAAS,CAAC;IAC1B,YACS,KAAa,EACb,MAAc;QADd,UAAK,GAAL,KAAK,CAAQ;QACb,WAAM,GAAN,MAAM,CAAQ;IACpB,CAAC;IAEJ,UAAU,CAAC,WAAmB;QAC5B,OAAO,IAAI,YAAY,CACrB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,EACpC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC,CACtC,CAAC;IACJ,CAAC;CACF;AAED,MAAM,OAAO,YAAY;IAGd;IACA;IAHA,IAAI,GAAG,UAAU,CAAC;IAC3B,YACS,KAAa,EACb,MAAc;QADd,UAAK,GAAL,KAAK,CAAQ;QACb,WAAM,GAAN,MAAM,CAAQ;IACpB,CAAC;IAEJ,SAAS,CAAC,WAAmB;QAC3B,OAAO,IAAI,WAAW,CACpB,IAAI,CAAC,KAAK,GAAG,WAAW,EACxB,IAAI,CAAC,MAAM,GAAG,WAAW,CAC1B,CAAC;IACJ,CAAC;CACF;AAED,MAAM,OAAO,eAAe;IAGjB;IACA;IAHA,IAAI,GAAG,SAAS,CAAC;IAC1B,YACS,CAAS,EACT,CAAS;QADT,MAAC,GAAD,CAAC,CAAQ;QACT,MAAC,GAAD,CAAC,CAAQ;IACf,CAAC;IAEJ,UAAU,CAAC,WAAmB;QAC5B,OAAO,IAAI,gBAAgB,CACzB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,WAAW,CAAC,EAChC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,WAAW,CAAC,CACjC,CAAC;IACJ,CAAC;CACF;AAED,MAAM,OAAO,gBAAgB;IAGlB;IACA;IAHA,IAAI,GAAG,UAAU,CAAC;IAC3B,YACS,CAAS,EACT,CAAS;QADT,MAAC,GAAD,CAAC,CAAQ;QACT,MAAC,GAAD,CAAC,CAAQ;IACf,CAAC;IAEJ,SAAS,CAAC,WAAmB;QAC3B,OAAO,IAAI,eAAe,CACxB,IAAI,CAAC,CAAC,GAAG,WAAW,EACpB,IAAI,CAAC,CAAC,GAAG,WAAW,CACrB,CAAC;IACJ,CAAC;CACF"}
|
package/dist/window.d.ts
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* webtau/window — Web shim for @tauri-apps/api/window.
|
|
3
|
+
*
|
|
4
|
+
* Provides getCurrentWindow() returning a WebWindow that implements
|
|
5
|
+
* the subset of Tauri's Window API that games typically use,
|
|
6
|
+
* backed by the Fullscreen API, document.title, and screen.*.
|
|
7
|
+
*/
|
|
8
|
+
import { LogicalSize, PhysicalSize, PhysicalPosition } from "./dpi";
|
|
9
|
+
interface Monitor {
|
|
10
|
+
name: string | null;
|
|
11
|
+
size: PhysicalSize;
|
|
12
|
+
position: PhysicalPosition;
|
|
13
|
+
scaleFactor: number;
|
|
14
|
+
}
|
|
15
|
+
declare class WebWindow {
|
|
16
|
+
isFullscreen(): Promise<boolean>;
|
|
17
|
+
setFullscreen(fullscreen: boolean): Promise<void>;
|
|
18
|
+
innerSize(): Promise<PhysicalSize>;
|
|
19
|
+
outerSize(): Promise<PhysicalSize>;
|
|
20
|
+
setSize(size: LogicalSize | PhysicalSize): Promise<void>;
|
|
21
|
+
maximize(): Promise<void>;
|
|
22
|
+
isMaximized(): Promise<boolean>;
|
|
23
|
+
title(): Promise<string>;
|
|
24
|
+
setTitle(title: string): Promise<void>;
|
|
25
|
+
/** Best-effort close — browsers may ignore this for non-script-opened windows. */
|
|
26
|
+
close(): Promise<void>;
|
|
27
|
+
/** No-op on web — browsers don't expose minimize. */
|
|
28
|
+
minimize(): Promise<void>;
|
|
29
|
+
/** No-op on web — browsers don't expose unminimize. */
|
|
30
|
+
unminimize(): Promise<void>;
|
|
31
|
+
/** No-op on web — window is always visible in a browser tab. */
|
|
32
|
+
show(): Promise<void>;
|
|
33
|
+
/** No-op on web — cannot hide a browser tab programmatically. */
|
|
34
|
+
hide(): Promise<void>;
|
|
35
|
+
setDecorations(_decorations: boolean): Promise<void>;
|
|
36
|
+
center(): Promise<void>;
|
|
37
|
+
currentMonitor(): Promise<Monitor | null>;
|
|
38
|
+
scaleFactor(): Promise<number>;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Returns a WebWindow instance that shims Tauri's Window API
|
|
42
|
+
* for web builds using browser-native APIs.
|
|
43
|
+
*/
|
|
44
|
+
export declare function getCurrentWindow(): WebWindow;
|
|
45
|
+
export {};
|
|
46
|
+
//# sourceMappingURL=window.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"window.d.ts","sourceRoot":"","sources":["../src/window.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,OAAO,CAAC;AAEpE,UAAU,OAAO;IACf,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,IAAI,EAAE,YAAY,CAAC;IACnB,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,cAAM,SAAS;IAGP,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC;IAIhC,aAAa,CAAC,UAAU,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAcjD,SAAS,IAAI,OAAO,CAAC,YAAY,CAAC;IAIlC,SAAS,IAAI,OAAO,CAAC,YAAY,CAAC;IAIlC,OAAO,CAAC,IAAI,EAAE,WAAW,GAAG,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAWxD,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAOzB,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAM/B,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;IAIxB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM5C,kFAAkF;IAC5E,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5B,qDAAqD;IAC/C,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAE/B,uDAAuD;IACjD,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAEjC,gEAAgE;IAC1D,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAE3B,iEAAiE;IAC3D,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAIrB,cAAc,CAAC,YAAY,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAOpD,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAQvB,cAAc,IAAI,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IASzC,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC;CAGrC;AAID;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,SAAS,CAK5C"}
|
package/dist/window.js
ADDED
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* webtau/window — Web shim for @tauri-apps/api/window.
|
|
3
|
+
*
|
|
4
|
+
* Provides getCurrentWindow() returning a WebWindow that implements
|
|
5
|
+
* the subset of Tauri's Window API that games typically use,
|
|
6
|
+
* backed by the Fullscreen API, document.title, and screen.*.
|
|
7
|
+
*/
|
|
8
|
+
import { PhysicalSize, PhysicalPosition } from "./dpi";
|
|
9
|
+
class WebWindow {
|
|
10
|
+
// ── Fullscreen ──
|
|
11
|
+
async isFullscreen() {
|
|
12
|
+
return !!document.fullscreenElement;
|
|
13
|
+
}
|
|
14
|
+
async setFullscreen(fullscreen) {
|
|
15
|
+
if (fullscreen) {
|
|
16
|
+
if (!document.fullscreenElement) {
|
|
17
|
+
await document.documentElement.requestFullscreen();
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
if (document.fullscreenElement) {
|
|
22
|
+
await document.exitFullscreen();
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
// ── Window size ──
|
|
27
|
+
async innerSize() {
|
|
28
|
+
return new PhysicalSize(window.innerWidth, window.innerHeight);
|
|
29
|
+
}
|
|
30
|
+
async outerSize() {
|
|
31
|
+
return new PhysicalSize(window.outerWidth, window.outerHeight);
|
|
32
|
+
}
|
|
33
|
+
async setSize(size) {
|
|
34
|
+
if (size.type === "Logical") {
|
|
35
|
+
window.resizeTo(size.width, size.height);
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
const scale = window.devicePixelRatio;
|
|
39
|
+
window.resizeTo(size.width / scale, size.height / scale);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
// ── Minimize / Maximize (limited on web) ──
|
|
43
|
+
async maximize() {
|
|
44
|
+
// Best approximation: go fullscreen
|
|
45
|
+
if (!document.fullscreenElement) {
|
|
46
|
+
await document.documentElement.requestFullscreen();
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
async isMaximized() {
|
|
50
|
+
return !!document.fullscreenElement;
|
|
51
|
+
}
|
|
52
|
+
// ── Title ──
|
|
53
|
+
async title() {
|
|
54
|
+
return document.title;
|
|
55
|
+
}
|
|
56
|
+
async setTitle(title) {
|
|
57
|
+
document.title = title;
|
|
58
|
+
}
|
|
59
|
+
// ── Close / Minimize / Show / Hide ──
|
|
60
|
+
/** Best-effort close — browsers may ignore this for non-script-opened windows. */
|
|
61
|
+
async close() {
|
|
62
|
+
window.close();
|
|
63
|
+
}
|
|
64
|
+
/** No-op on web — browsers don't expose minimize. */
|
|
65
|
+
async minimize() { }
|
|
66
|
+
/** No-op on web — browsers don't expose unminimize. */
|
|
67
|
+
async unminimize() { }
|
|
68
|
+
/** No-op on web — window is always visible in a browser tab. */
|
|
69
|
+
async show() { }
|
|
70
|
+
/** No-op on web — cannot hide a browser tab programmatically. */
|
|
71
|
+
async hide() { }
|
|
72
|
+
// ── Decorations (no-op on web) ──
|
|
73
|
+
async setDecorations(_decorations) {
|
|
74
|
+
// Browser chrome is not controllable from JS.
|
|
75
|
+
// No-op to maintain API compatibility.
|
|
76
|
+
}
|
|
77
|
+
// ── Position ──
|
|
78
|
+
async center() {
|
|
79
|
+
const left = (screen.width - window.outerWidth) / 2;
|
|
80
|
+
const top = (screen.height - window.outerHeight) / 2;
|
|
81
|
+
window.moveTo(left, top);
|
|
82
|
+
}
|
|
83
|
+
// ── Monitor ──
|
|
84
|
+
async currentMonitor() {
|
|
85
|
+
return {
|
|
86
|
+
name: null,
|
|
87
|
+
size: new PhysicalSize(screen.width, screen.height),
|
|
88
|
+
position: new PhysicalPosition(0, 0),
|
|
89
|
+
scaleFactor: window.devicePixelRatio,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
async scaleFactor() {
|
|
93
|
+
return window.devicePixelRatio;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
let instance = null;
|
|
97
|
+
/**
|
|
98
|
+
* Returns a WebWindow instance that shims Tauri's Window API
|
|
99
|
+
* for web builds using browser-native APIs.
|
|
100
|
+
*/
|
|
101
|
+
export function getCurrentWindow() {
|
|
102
|
+
if (!instance) {
|
|
103
|
+
instance = new WebWindow();
|
|
104
|
+
}
|
|
105
|
+
return instance;
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=window.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"window.js","sourceRoot":"","sources":["../src/window.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "webtau",
|
|
3
|
+
"version": "0.1.0-alpha.1",
|
|
4
|
+
"description": "Deploy Tauri games to web + desktop from one codebase",
|
|
5
|
+
"license": "Apache-2.0",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"types": "./dist/core.d.ts",
|
|
10
|
+
"import": "./dist/core.js"
|
|
11
|
+
},
|
|
12
|
+
"./core": {
|
|
13
|
+
"types": "./dist/core.d.ts",
|
|
14
|
+
"import": "./dist/core.js"
|
|
15
|
+
},
|
|
16
|
+
"./window": {
|
|
17
|
+
"types": "./dist/window.d.ts",
|
|
18
|
+
"import": "./dist/window.js"
|
|
19
|
+
},
|
|
20
|
+
"./dpi": {
|
|
21
|
+
"types": "./dist/dpi.d.ts",
|
|
22
|
+
"import": "./dist/dpi.js"
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
"files": [
|
|
26
|
+
"dist"
|
|
27
|
+
],
|
|
28
|
+
"scripts": {
|
|
29
|
+
"build": "tsc",
|
|
30
|
+
"test": "bun test",
|
|
31
|
+
"typecheck": "tsc --noEmit"
|
|
32
|
+
},
|
|
33
|
+
"devDependencies": {
|
|
34
|
+
"@types/bun": "^1.2.0",
|
|
35
|
+
"typescript": "^5.8.0"
|
|
36
|
+
},
|
|
37
|
+
"peerDependencies": {
|
|
38
|
+
"@tauri-apps/api": ">=2.0.0"
|
|
39
|
+
},
|
|
40
|
+
"peerDependenciesMeta": {
|
|
41
|
+
"@tauri-apps/api": {
|
|
42
|
+
"optional": true
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|