@craft-native/svelte 0.0.92 → 0.0.95
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/README.md +4 -0
- package/dist/actions/haptic.d.ts +4 -0
- package/dist/actions/haptic.d.ts.map +1 -0
- package/dist/actions/toast.d.ts +2 -0
- package/dist/actions/toast.d.ts.map +1 -0
- package/dist/api/database.d.ts +5 -0
- package/dist/api/database.d.ts.map +1 -0
- package/dist/api/filesystem.d.ts +9 -0
- package/dist/api/filesystem.d.ts.map +1 -0
- package/dist/api/http.d.ts +13 -0
- package/dist/api/http.d.ts.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +258 -0
- package/dist/index.mjs +217 -0
- package/dist/stores/craft.d.ts +31 -0
- package/dist/stores/craft.d.ts.map +1 -0
- package/dist/stores/platform.d.ts +10 -0
- package/dist/stores/platform.d.ts.map +1 -0
- package/dist/stores/tray.d.ts +7 -0
- package/dist/stores/tray.d.ts.map +1 -0
- package/dist/stores/window.d.ts +12 -0
- package/dist/stores/window.d.ts.map +1 -0
- package/package.json +5 -4
- package/src/actions/haptic.ts +25 -0
- package/src/actions/toast.ts +8 -0
- package/src/api/database.ts +18 -0
- package/src/api/filesystem.ts +40 -0
- package/src/api/http.ts +29 -0
- package/src/index.ts +9 -0
- package/src/stores/craft.ts +45 -0
- package/src/stores/platform.ts +18 -0
- package/src/stores/tray.ts +26 -0
- package/src/stores/window.ts +47 -0
- package/LICENSE.md +0 -21
package/README.md
CHANGED
|
@@ -8,6 +8,10 @@ Svelte bindings for the Craft framework using stores and actions.
|
|
|
8
8
|
npm install @craft-native/svelte
|
|
9
9
|
```
|
|
10
10
|
|
|
11
|
+
The package includes its TypeScript source for bundlers that select the `svelte`
|
|
12
|
+
export condition. Other consumers use the compiled ESM or CommonJS entry in
|
|
13
|
+
`dist`. Both entries expose the same stores and actions.
|
|
14
|
+
|
|
11
15
|
## Usage
|
|
12
16
|
|
|
13
17
|
### Stores
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"haptic.d.ts","sourceRoot":"","sources":["../../src/actions/haptic.ts"],"names":[],"mappings":"AAGA,wBAAgB,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,GAAE,MAAoB;IAiBhE,OAAO;EAIV"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toast.d.ts","sourceRoot":"","sources":["../../src/actions/toast.ts"],"names":[],"mappings":"AAGA,wBAAsB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,GAAE,OAAO,GAAG,MAAgB,iBAIpF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/api/database.ts"],"names":[],"mappings":"AAGA,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM;IAEnC,OAAO,MAAM,MAAM,WAAU,GAAG,EAAE;IAMlC,KAAK,CAAC,CAAC,GAAG,GAAG,OAAO,MAAM,WAAU,GAAG,EAAE,GAAQ,OAAO,CAAC,CAAC,EAAE,CAAC;EAMtE"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare const filesystem: {
|
|
2
|
+
readFile(path: string, encoding?: 'utf8' | 'binary'): Promise<any>;
|
|
3
|
+
writeFile(path: string, data: string | Uint8Array, encoding?: 'utf8' | 'binary'): Promise<void>;
|
|
4
|
+
readDir(path: string): Promise<any>;
|
|
5
|
+
mkdir(path: string, recursive?: boolean): Promise<void>;
|
|
6
|
+
remove(path: string, recursive?: boolean): Promise<void>;
|
|
7
|
+
exists(path: string): Promise<any>;
|
|
8
|
+
};
|
|
9
|
+
//# sourceMappingURL=filesystem.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filesystem.d.ts","sourceRoot":"","sources":["../../src/api/filesystem.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,UAAU;IACf,QAAQ,OAAO,MAAM,aAAY,MAAM,GAAG,QAAQ;IAMlD,SAAS,OAAO,MAAM,QAAQ,MAAM,GAAG,UAAU,aAAY,MAAM,GAAG,QAAQ;IAM9E,OAAO,OAAO,MAAM;IAMpB,KAAK,OAAO,MAAM;IAMlB,MAAM,OAAO,MAAM;IAMnB,MAAM,OAAO,MAAM;CAK1B,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
interface HttpOptions {
|
|
2
|
+
method?: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';
|
|
3
|
+
headers?: Record<string, string>;
|
|
4
|
+
body?: any;
|
|
5
|
+
timeout?: number;
|
|
6
|
+
}
|
|
7
|
+
export declare const http: {
|
|
8
|
+
fetch<T = any>(url: string, options?: HttpOptions): Promise<T>;
|
|
9
|
+
download(url: string, path: string): Promise<void>;
|
|
10
|
+
upload(url: string, filePath: string, options?: HttpOptions): Promise<any>;
|
|
11
|
+
};
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=http.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/api/http.ts"],"names":[],"mappings":"AAGA,UAAU,WAAW;IACnB,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,OAAO,CAAC;IACrD,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,eAAO,MAAM,IAAI;IACT,KAAK,CAAC,CAAC,GAAG,GAAG,OAAO,MAAM,YAAW,WAAW,GAAQ,OAAO,CAAC,CAAC,CAAC;IAMlE,QAAQ,MAAM,MAAM,QAAQ,MAAM;IAMlC,MAAM,MAAM,MAAM,YAAY,MAAM,YAAW,WAAW;CAKjE,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export * from './stores/craft';
|
|
2
|
+
export * from './stores/platform';
|
|
3
|
+
export * from './stores/window';
|
|
4
|
+
export * from './stores/tray';
|
|
5
|
+
export * from './actions/haptic';
|
|
6
|
+
export * from './actions/toast';
|
|
7
|
+
export * from './api/filesystem';
|
|
8
|
+
export * from './api/database';
|
|
9
|
+
export * from './api/http';
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/index.ts
|
|
21
|
+
var index_exports = {};
|
|
22
|
+
__export(index_exports, {
|
|
23
|
+
craft: () => craft,
|
|
24
|
+
createDatabase: () => createDatabase,
|
|
25
|
+
createPlatformStore: () => createPlatformStore,
|
|
26
|
+
filesystem: () => filesystem,
|
|
27
|
+
haptic: () => haptic,
|
|
28
|
+
http: () => http,
|
|
29
|
+
isFullscreen: () => isFullscreen,
|
|
30
|
+
isMaximized: () => isMaximized,
|
|
31
|
+
isMinimized: () => isMinimized,
|
|
32
|
+
isReady: () => isReady,
|
|
33
|
+
platform: () => platform,
|
|
34
|
+
showToast: () => showToast,
|
|
35
|
+
trayActions: () => trayActions,
|
|
36
|
+
trayVisible: () => trayVisible,
|
|
37
|
+
windowActions: () => windowActions
|
|
38
|
+
});
|
|
39
|
+
module.exports = __toCommonJS(index_exports);
|
|
40
|
+
|
|
41
|
+
// src/stores/craft.ts
|
|
42
|
+
var import_store = require("svelte/store");
|
|
43
|
+
function createCraftStore() {
|
|
44
|
+
const { subscribe, set } = (0, import_store.writable)(null);
|
|
45
|
+
if (typeof window !== "undefined") {
|
|
46
|
+
if (window.craft) {
|
|
47
|
+
set(window.craft);
|
|
48
|
+
} else {
|
|
49
|
+
const checkCraft = setInterval(() => {
|
|
50
|
+
if (window.craft) {
|
|
51
|
+
set(window.craft);
|
|
52
|
+
clearInterval(checkCraft);
|
|
53
|
+
}
|
|
54
|
+
}, 100);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return {
|
|
58
|
+
subscribe
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
var craft = createCraftStore();
|
|
62
|
+
var isReady = (0, import_store.derived)(craft, (_$craft) => _$craft !== null);
|
|
63
|
+
|
|
64
|
+
// src/stores/platform.ts
|
|
65
|
+
var import_store2 = require("svelte/store");
|
|
66
|
+
function createPlatformStore() {
|
|
67
|
+
const { subscribe, set } = (0, import_store2.writable)(null);
|
|
68
|
+
craft.subscribe(async (_$craft) => {
|
|
69
|
+
if (_$craft) {
|
|
70
|
+
const info = await _$craft.getPlatform();
|
|
71
|
+
set(info);
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
return { subscribe };
|
|
75
|
+
}
|
|
76
|
+
var platform = createPlatformStore();
|
|
77
|
+
|
|
78
|
+
// src/stores/window.ts
|
|
79
|
+
var import_store3 = require("svelte/store");
|
|
80
|
+
var isFullscreen = (0, import_store3.writable)(false);
|
|
81
|
+
var isMaximized = (0, import_store3.writable)(false);
|
|
82
|
+
var isMinimized = (0, import_store3.writable)(false);
|
|
83
|
+
var windowActions = {
|
|
84
|
+
async setTitle(title) {
|
|
85
|
+
const _$craft = (0, import_store3.get)(craft);
|
|
86
|
+
if (!_$craft) return;
|
|
87
|
+
await _$craft.invoke("window.setTitle", { title });
|
|
88
|
+
},
|
|
89
|
+
async setSize(width, height) {
|
|
90
|
+
const _$craft = (0, import_store3.get)(craft);
|
|
91
|
+
if (!_$craft) return;
|
|
92
|
+
await _$craft.invoke("window.setSize", { width, height });
|
|
93
|
+
},
|
|
94
|
+
async maximize() {
|
|
95
|
+
const _$craft = (0, import_store3.get)(craft);
|
|
96
|
+
if (!_$craft) return;
|
|
97
|
+
await _$craft.invoke("window.maximize");
|
|
98
|
+
isMaximized.set(true);
|
|
99
|
+
},
|
|
100
|
+
async minimize() {
|
|
101
|
+
const _$craft = (0, import_store3.get)(craft);
|
|
102
|
+
if (!_$craft) return;
|
|
103
|
+
await _$craft.invoke("window.minimize");
|
|
104
|
+
isMinimized.set(true);
|
|
105
|
+
},
|
|
106
|
+
async toggleFullscreen() {
|
|
107
|
+
const _$craft = (0, import_store3.get)(craft);
|
|
108
|
+
if (!_$craft) return;
|
|
109
|
+
await _$craft.invoke("window.toggleFullscreen");
|
|
110
|
+
isFullscreen.update((v) => !v);
|
|
111
|
+
},
|
|
112
|
+
async close() {
|
|
113
|
+
const _$craft = (0, import_store3.get)(craft);
|
|
114
|
+
if (!_$craft) return;
|
|
115
|
+
await _$craft.invoke("window.close");
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
// src/stores/tray.ts
|
|
120
|
+
var import_store4 = require("svelte/store");
|
|
121
|
+
var trayVisible = (0, import_store4.writable)(false);
|
|
122
|
+
var trayActions = {
|
|
123
|
+
async create(icon, tooltip) {
|
|
124
|
+
const _$craft = (0, import_store4.get)(craft);
|
|
125
|
+
if (!_$craft) return;
|
|
126
|
+
await _$craft.invoke("tray.create", { icon, tooltip });
|
|
127
|
+
trayVisible.set(true);
|
|
128
|
+
},
|
|
129
|
+
async destroy() {
|
|
130
|
+
const _$craft = (0, import_store4.get)(craft);
|
|
131
|
+
if (!_$craft) return;
|
|
132
|
+
await _$craft.invoke("tray.destroy");
|
|
133
|
+
trayVisible.set(false);
|
|
134
|
+
},
|
|
135
|
+
async setIcon(icon) {
|
|
136
|
+
const _$craft = (0, import_store4.get)(craft);
|
|
137
|
+
if (!_$craft) return;
|
|
138
|
+
await _$craft.invoke("tray.setIcon", { icon });
|
|
139
|
+
}
|
|
140
|
+
};
|
|
141
|
+
|
|
142
|
+
// src/actions/haptic.ts
|
|
143
|
+
var import_store5 = require("svelte/store");
|
|
144
|
+
function haptic(node, type = "selection") {
|
|
145
|
+
const handleClick = async () => {
|
|
146
|
+
const _$craft = (0, import_store5.get)(craft);
|
|
147
|
+
if (!_$craft) return;
|
|
148
|
+
try {
|
|
149
|
+
await _$craft.haptic(type);
|
|
150
|
+
} catch (error) {
|
|
151
|
+
if (error?.code !== "CAPABILITY_DISABLED") throw error;
|
|
152
|
+
}
|
|
153
|
+
};
|
|
154
|
+
node.addEventListener("click", handleClick);
|
|
155
|
+
return {
|
|
156
|
+
destroy() {
|
|
157
|
+
node.removeEventListener("click", handleClick);
|
|
158
|
+
}
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// src/actions/toast.ts
|
|
163
|
+
var import_store6 = require("svelte/store");
|
|
164
|
+
async function showToast(message, duration = "short") {
|
|
165
|
+
const _$craft = (0, import_store6.get)(craft);
|
|
166
|
+
if (!_$craft) return;
|
|
167
|
+
await _$craft.showToast(message, duration);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// src/api/filesystem.ts
|
|
171
|
+
var import_store7 = require("svelte/store");
|
|
172
|
+
var filesystem = {
|
|
173
|
+
async readFile(path, encoding = "utf8") {
|
|
174
|
+
const _$craft = (0, import_store7.get)(craft);
|
|
175
|
+
if (!_$craft) throw new Error("Craft not ready");
|
|
176
|
+
return await _$craft.invoke("fs.readFile", { path, encoding });
|
|
177
|
+
},
|
|
178
|
+
async writeFile(path, data, encoding = "utf8") {
|
|
179
|
+
const _$craft = (0, import_store7.get)(craft);
|
|
180
|
+
if (!_$craft) throw new Error("Craft not ready");
|
|
181
|
+
await _$craft.invoke("fs.writeFile", { path, data, encoding });
|
|
182
|
+
},
|
|
183
|
+
async readDir(path) {
|
|
184
|
+
const _$craft = (0, import_store7.get)(craft);
|
|
185
|
+
if (!_$craft) throw new Error("Craft not ready");
|
|
186
|
+
return await _$craft.invoke("fs.readDir", { path });
|
|
187
|
+
},
|
|
188
|
+
async mkdir(path, recursive = false) {
|
|
189
|
+
const _$craft = (0, import_store7.get)(craft);
|
|
190
|
+
if (!_$craft) throw new Error("Craft not ready");
|
|
191
|
+
await _$craft.invoke("fs.mkdir", { path, recursive });
|
|
192
|
+
},
|
|
193
|
+
async remove(path, recursive = false) {
|
|
194
|
+
const _$craft = (0, import_store7.get)(craft);
|
|
195
|
+
if (!_$craft) throw new Error("Craft not ready");
|
|
196
|
+
await _$craft.invoke("fs.remove", { path, recursive });
|
|
197
|
+
},
|
|
198
|
+
async exists(path) {
|
|
199
|
+
const _$craft = (0, import_store7.get)(craft);
|
|
200
|
+
if (!_$craft) throw new Error("Craft not ready");
|
|
201
|
+
return await _$craft.invoke("fs.exists", { path });
|
|
202
|
+
}
|
|
203
|
+
};
|
|
204
|
+
|
|
205
|
+
// src/api/database.ts
|
|
206
|
+
var import_store8 = require("svelte/store");
|
|
207
|
+
function createDatabase(dbPath) {
|
|
208
|
+
return {
|
|
209
|
+
async execute(sql, params = []) {
|
|
210
|
+
const _$craft = (0, import_store8.get)(craft);
|
|
211
|
+
if (!_$craft) throw new Error("Craft not ready");
|
|
212
|
+
return await _$craft.invoke("db.execute", { path: dbPath, sql, params });
|
|
213
|
+
},
|
|
214
|
+
async query(sql, params = []) {
|
|
215
|
+
const _$craft = (0, import_store8.get)(craft);
|
|
216
|
+
if (!_$craft) throw new Error("Craft not ready");
|
|
217
|
+
return await _$craft.invoke("db.query", { path: dbPath, sql, params });
|
|
218
|
+
}
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
// src/api/http.ts
|
|
223
|
+
var import_store9 = require("svelte/store");
|
|
224
|
+
var http = {
|
|
225
|
+
async fetch(url, options = {}) {
|
|
226
|
+
const _$craft = (0, import_store9.get)(craft);
|
|
227
|
+
if (!_$craft) throw new Error("Craft not ready");
|
|
228
|
+
return await _$craft.invoke("http.fetch", { url, ...options });
|
|
229
|
+
},
|
|
230
|
+
async download(url, path) {
|
|
231
|
+
const _$craft = (0, import_store9.get)(craft);
|
|
232
|
+
if (!_$craft) throw new Error("Craft not ready");
|
|
233
|
+
await _$craft.invoke("http.download", { url, path });
|
|
234
|
+
},
|
|
235
|
+
async upload(url, filePath, options = {}) {
|
|
236
|
+
const _$craft = (0, import_store9.get)(craft);
|
|
237
|
+
if (!_$craft) throw new Error("Craft not ready");
|
|
238
|
+
return await _$craft.invoke("http.upload", { url, filePath, ...options });
|
|
239
|
+
}
|
|
240
|
+
};
|
|
241
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
242
|
+
0 && (module.exports = {
|
|
243
|
+
craft,
|
|
244
|
+
createDatabase,
|
|
245
|
+
createPlatformStore,
|
|
246
|
+
filesystem,
|
|
247
|
+
haptic,
|
|
248
|
+
http,
|
|
249
|
+
isFullscreen,
|
|
250
|
+
isMaximized,
|
|
251
|
+
isMinimized,
|
|
252
|
+
isReady,
|
|
253
|
+
platform,
|
|
254
|
+
showToast,
|
|
255
|
+
trayActions,
|
|
256
|
+
trayVisible,
|
|
257
|
+
windowActions
|
|
258
|
+
});
|
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
// src/stores/craft.ts
|
|
2
|
+
import { writable, derived } from "svelte/store";
|
|
3
|
+
function createCraftStore() {
|
|
4
|
+
const { subscribe, set } = writable(null);
|
|
5
|
+
if (typeof window !== "undefined") {
|
|
6
|
+
if (window.craft) {
|
|
7
|
+
set(window.craft);
|
|
8
|
+
} else {
|
|
9
|
+
const checkCraft = setInterval(() => {
|
|
10
|
+
if (window.craft) {
|
|
11
|
+
set(window.craft);
|
|
12
|
+
clearInterval(checkCraft);
|
|
13
|
+
}
|
|
14
|
+
}, 100);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
return {
|
|
18
|
+
subscribe
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
var craft = createCraftStore();
|
|
22
|
+
var isReady = derived(craft, (_$craft) => _$craft !== null);
|
|
23
|
+
|
|
24
|
+
// src/stores/platform.ts
|
|
25
|
+
import { writable as writable2 } from "svelte/store";
|
|
26
|
+
function createPlatformStore() {
|
|
27
|
+
const { subscribe, set } = writable2(null);
|
|
28
|
+
craft.subscribe(async (_$craft) => {
|
|
29
|
+
if (_$craft) {
|
|
30
|
+
const info = await _$craft.getPlatform();
|
|
31
|
+
set(info);
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
return { subscribe };
|
|
35
|
+
}
|
|
36
|
+
var platform = createPlatformStore();
|
|
37
|
+
|
|
38
|
+
// src/stores/window.ts
|
|
39
|
+
import { writable as writable3, get } from "svelte/store";
|
|
40
|
+
var isFullscreen = writable3(false);
|
|
41
|
+
var isMaximized = writable3(false);
|
|
42
|
+
var isMinimized = writable3(false);
|
|
43
|
+
var windowActions = {
|
|
44
|
+
async setTitle(title) {
|
|
45
|
+
const _$craft = get(craft);
|
|
46
|
+
if (!_$craft) return;
|
|
47
|
+
await _$craft.invoke("window.setTitle", { title });
|
|
48
|
+
},
|
|
49
|
+
async setSize(width, height) {
|
|
50
|
+
const _$craft = get(craft);
|
|
51
|
+
if (!_$craft) return;
|
|
52
|
+
await _$craft.invoke("window.setSize", { width, height });
|
|
53
|
+
},
|
|
54
|
+
async maximize() {
|
|
55
|
+
const _$craft = get(craft);
|
|
56
|
+
if (!_$craft) return;
|
|
57
|
+
await _$craft.invoke("window.maximize");
|
|
58
|
+
isMaximized.set(true);
|
|
59
|
+
},
|
|
60
|
+
async minimize() {
|
|
61
|
+
const _$craft = get(craft);
|
|
62
|
+
if (!_$craft) return;
|
|
63
|
+
await _$craft.invoke("window.minimize");
|
|
64
|
+
isMinimized.set(true);
|
|
65
|
+
},
|
|
66
|
+
async toggleFullscreen() {
|
|
67
|
+
const _$craft = get(craft);
|
|
68
|
+
if (!_$craft) return;
|
|
69
|
+
await _$craft.invoke("window.toggleFullscreen");
|
|
70
|
+
isFullscreen.update((v) => !v);
|
|
71
|
+
},
|
|
72
|
+
async close() {
|
|
73
|
+
const _$craft = get(craft);
|
|
74
|
+
if (!_$craft) return;
|
|
75
|
+
await _$craft.invoke("window.close");
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
// src/stores/tray.ts
|
|
80
|
+
import { writable as writable4, get as get2 } from "svelte/store";
|
|
81
|
+
var trayVisible = writable4(false);
|
|
82
|
+
var trayActions = {
|
|
83
|
+
async create(icon, tooltip) {
|
|
84
|
+
const _$craft = get2(craft);
|
|
85
|
+
if (!_$craft) return;
|
|
86
|
+
await _$craft.invoke("tray.create", { icon, tooltip });
|
|
87
|
+
trayVisible.set(true);
|
|
88
|
+
},
|
|
89
|
+
async destroy() {
|
|
90
|
+
const _$craft = get2(craft);
|
|
91
|
+
if (!_$craft) return;
|
|
92
|
+
await _$craft.invoke("tray.destroy");
|
|
93
|
+
trayVisible.set(false);
|
|
94
|
+
},
|
|
95
|
+
async setIcon(icon) {
|
|
96
|
+
const _$craft = get2(craft);
|
|
97
|
+
if (!_$craft) return;
|
|
98
|
+
await _$craft.invoke("tray.setIcon", { icon });
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
// src/actions/haptic.ts
|
|
103
|
+
import { get as get3 } from "svelte/store";
|
|
104
|
+
function haptic(node, type = "selection") {
|
|
105
|
+
const handleClick = async () => {
|
|
106
|
+
const _$craft = get3(craft);
|
|
107
|
+
if (!_$craft) return;
|
|
108
|
+
try {
|
|
109
|
+
await _$craft.haptic(type);
|
|
110
|
+
} catch (error) {
|
|
111
|
+
if (error?.code !== "CAPABILITY_DISABLED") throw error;
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
node.addEventListener("click", handleClick);
|
|
115
|
+
return {
|
|
116
|
+
destroy() {
|
|
117
|
+
node.removeEventListener("click", handleClick);
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// src/actions/toast.ts
|
|
123
|
+
import { get as get4 } from "svelte/store";
|
|
124
|
+
async function showToast(message, duration = "short") {
|
|
125
|
+
const _$craft = get4(craft);
|
|
126
|
+
if (!_$craft) return;
|
|
127
|
+
await _$craft.showToast(message, duration);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// src/api/filesystem.ts
|
|
131
|
+
import { get as get5 } from "svelte/store";
|
|
132
|
+
var filesystem = {
|
|
133
|
+
async readFile(path, encoding = "utf8") {
|
|
134
|
+
const _$craft = get5(craft);
|
|
135
|
+
if (!_$craft) throw new Error("Craft not ready");
|
|
136
|
+
return await _$craft.invoke("fs.readFile", { path, encoding });
|
|
137
|
+
},
|
|
138
|
+
async writeFile(path, data, encoding = "utf8") {
|
|
139
|
+
const _$craft = get5(craft);
|
|
140
|
+
if (!_$craft) throw new Error("Craft not ready");
|
|
141
|
+
await _$craft.invoke("fs.writeFile", { path, data, encoding });
|
|
142
|
+
},
|
|
143
|
+
async readDir(path) {
|
|
144
|
+
const _$craft = get5(craft);
|
|
145
|
+
if (!_$craft) throw new Error("Craft not ready");
|
|
146
|
+
return await _$craft.invoke("fs.readDir", { path });
|
|
147
|
+
},
|
|
148
|
+
async mkdir(path, recursive = false) {
|
|
149
|
+
const _$craft = get5(craft);
|
|
150
|
+
if (!_$craft) throw new Error("Craft not ready");
|
|
151
|
+
await _$craft.invoke("fs.mkdir", { path, recursive });
|
|
152
|
+
},
|
|
153
|
+
async remove(path, recursive = false) {
|
|
154
|
+
const _$craft = get5(craft);
|
|
155
|
+
if (!_$craft) throw new Error("Craft not ready");
|
|
156
|
+
await _$craft.invoke("fs.remove", { path, recursive });
|
|
157
|
+
},
|
|
158
|
+
async exists(path) {
|
|
159
|
+
const _$craft = get5(craft);
|
|
160
|
+
if (!_$craft) throw new Error("Craft not ready");
|
|
161
|
+
return await _$craft.invoke("fs.exists", { path });
|
|
162
|
+
}
|
|
163
|
+
};
|
|
164
|
+
|
|
165
|
+
// src/api/database.ts
|
|
166
|
+
import { get as get6 } from "svelte/store";
|
|
167
|
+
function createDatabase(dbPath) {
|
|
168
|
+
return {
|
|
169
|
+
async execute(sql, params = []) {
|
|
170
|
+
const _$craft = get6(craft);
|
|
171
|
+
if (!_$craft) throw new Error("Craft not ready");
|
|
172
|
+
return await _$craft.invoke("db.execute", { path: dbPath, sql, params });
|
|
173
|
+
},
|
|
174
|
+
async query(sql, params = []) {
|
|
175
|
+
const _$craft = get6(craft);
|
|
176
|
+
if (!_$craft) throw new Error("Craft not ready");
|
|
177
|
+
return await _$craft.invoke("db.query", { path: dbPath, sql, params });
|
|
178
|
+
}
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// src/api/http.ts
|
|
183
|
+
import { get as get7 } from "svelte/store";
|
|
184
|
+
var http = {
|
|
185
|
+
async fetch(url, options = {}) {
|
|
186
|
+
const _$craft = get7(craft);
|
|
187
|
+
if (!_$craft) throw new Error("Craft not ready");
|
|
188
|
+
return await _$craft.invoke("http.fetch", { url, ...options });
|
|
189
|
+
},
|
|
190
|
+
async download(url, path) {
|
|
191
|
+
const _$craft = get7(craft);
|
|
192
|
+
if (!_$craft) throw new Error("Craft not ready");
|
|
193
|
+
await _$craft.invoke("http.download", { url, path });
|
|
194
|
+
},
|
|
195
|
+
async upload(url, filePath, options = {}) {
|
|
196
|
+
const _$craft = get7(craft);
|
|
197
|
+
if (!_$craft) throw new Error("Craft not ready");
|
|
198
|
+
return await _$craft.invoke("http.upload", { url, filePath, ...options });
|
|
199
|
+
}
|
|
200
|
+
};
|
|
201
|
+
export {
|
|
202
|
+
craft,
|
|
203
|
+
createDatabase,
|
|
204
|
+
createPlatformStore,
|
|
205
|
+
filesystem,
|
|
206
|
+
haptic,
|
|
207
|
+
http,
|
|
208
|
+
isFullscreen,
|
|
209
|
+
isMaximized,
|
|
210
|
+
isMinimized,
|
|
211
|
+
isReady,
|
|
212
|
+
platform,
|
|
213
|
+
showToast,
|
|
214
|
+
trayActions,
|
|
215
|
+
trayVisible,
|
|
216
|
+
windowActions
|
|
217
|
+
};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { Readable } from 'svelte/store';
|
|
2
|
+
interface CraftAPI {
|
|
3
|
+
getPlatform(): Promise<{
|
|
4
|
+
platform: string;
|
|
5
|
+
version: string;
|
|
6
|
+
}>;
|
|
7
|
+
getDeviceInfo(): Promise<{
|
|
8
|
+
platform: string;
|
|
9
|
+
model: string;
|
|
10
|
+
os_version: string;
|
|
11
|
+
}>;
|
|
12
|
+
showToast(message: string, duration: 'short' | 'long'): Promise<void>;
|
|
13
|
+
haptic(type: string): Promise<void>;
|
|
14
|
+
requestPermission(permission: string): Promise<{
|
|
15
|
+
granted: boolean;
|
|
16
|
+
message: string;
|
|
17
|
+
}>;
|
|
18
|
+
on(event: string, callback: (...args: any[]) => void): void;
|
|
19
|
+
off(event: string, callback: (...args: any[]) => void): void;
|
|
20
|
+
emit(event: string, data?: any): void;
|
|
21
|
+
invoke(method: string, params?: any): Promise<any>;
|
|
22
|
+
}
|
|
23
|
+
declare global {
|
|
24
|
+
interface Window {
|
|
25
|
+
craft?: CraftAPI;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
export declare const craft: Readable<CraftAPI | null>;
|
|
29
|
+
export declare const isReady: Readable<boolean>;
|
|
30
|
+
export {};
|
|
31
|
+
//# sourceMappingURL=craft.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"craft.d.ts","sourceRoot":"","sources":["../../src/stores/craft.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAE7C,UAAU,QAAQ;IAChB,WAAW,IAAI,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC9D,aAAa,IAAI,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAClF,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtE,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACtF,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,GAAG,IAAI,CAAC;IAC5D,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,GAAG,IAAI,CAAC;IAC7D,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC;IACtC,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;CACpD;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,KAAK,CAAC,EAAE,QAAQ,CAAC;KAClB;CACF;AAwBD,eAAO,MAAM,KAAK,2BAAqB,CAAC;AACxC,eAAO,MAAM,OAAO,mBAAgD,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Readable } from 'svelte/store';
|
|
2
|
+
export declare function createPlatformStore(): Readable<{
|
|
3
|
+
platform: string;
|
|
4
|
+
version: string;
|
|
5
|
+
} | null>;
|
|
6
|
+
export declare const platform: Readable<{
|
|
7
|
+
platform: string;
|
|
8
|
+
version: string;
|
|
9
|
+
} | null>;
|
|
10
|
+
//# sourceMappingURL=platform.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../../src/stores/platform.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAG7C,wBAAgB,mBAAmB,IAAI,QAAQ,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CAW5F;AAED,eAAO,MAAM,QAAQ;cAbuC,MAAM;aAAW,MAAM;SAatC,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare const trayVisible: import("svelte/store").Writable<boolean>;
|
|
2
|
+
export declare const trayActions: {
|
|
3
|
+
create(icon?: string, tooltip?: string): Promise<void>;
|
|
4
|
+
destroy(): Promise<void>;
|
|
5
|
+
setIcon(icon: string): Promise<void>;
|
|
6
|
+
};
|
|
7
|
+
//# sourceMappingURL=tray.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tray.d.ts","sourceRoot":"","sources":["../../src/stores/tray.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,WAAW,0CAAkB,CAAC;AAE3C,eAAO,MAAM,WAAW;IAChB,MAAM,QAAQ,MAAM,YAAY,MAAM;IAOtC,OAAO;IAOP,OAAO,OAAO,MAAM;CAK3B,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare const isFullscreen: import("svelte/store").Writable<boolean>;
|
|
2
|
+
export declare const isMaximized: import("svelte/store").Writable<boolean>;
|
|
3
|
+
export declare const isMinimized: import("svelte/store").Writable<boolean>;
|
|
4
|
+
export declare const windowActions: {
|
|
5
|
+
setTitle(title: string): Promise<void>;
|
|
6
|
+
setSize(width: number, height: number): Promise<void>;
|
|
7
|
+
maximize(): Promise<void>;
|
|
8
|
+
minimize(): Promise<void>;
|
|
9
|
+
toggleFullscreen(): Promise<void>;
|
|
10
|
+
close(): Promise<void>;
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=window.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"window.d.ts","sourceRoot":"","sources":["../../src/stores/window.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,YAAY,0CAAkB,CAAC;AAC5C,eAAO,MAAM,WAAW,0CAAkB,CAAC;AAC3C,eAAO,MAAM,WAAW,0CAAkB,CAAC;AAE3C,eAAO,MAAM,aAAa;IAClB,QAAQ,QAAQ,MAAM;IAMtB,OAAO,QAAQ,MAAM,UAAU,MAAM;IAMrC,QAAQ;IAOR,QAAQ;IAOR,gBAAgB;IAOhB,KAAK;CAKZ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@craft-native/svelte",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.95",
|
|
4
4
|
"homepage": "https://github.com/craft-native/craft/tree/main/packages/svelte#readme",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -11,7 +11,8 @@
|
|
|
11
11
|
"url": "https://github.com/craft-native/craft/issues"
|
|
12
12
|
},
|
|
13
13
|
"files": [
|
|
14
|
-
"dist"
|
|
14
|
+
"dist",
|
|
15
|
+
"src"
|
|
15
16
|
],
|
|
16
17
|
"description": "Svelte bindings for Craft framework",
|
|
17
18
|
"svelte": "src/index.ts",
|
|
@@ -20,10 +21,10 @@
|
|
|
20
21
|
"types": "dist/index.d.ts",
|
|
21
22
|
"exports": {
|
|
22
23
|
".": {
|
|
24
|
+
"types": "./dist/index.d.ts",
|
|
23
25
|
"svelte": "./src/index.ts",
|
|
24
26
|
"import": "./dist/index.mjs",
|
|
25
|
-
"require": "./dist/index.js"
|
|
26
|
-
"types": "./dist/index.d.ts"
|
|
27
|
+
"require": "./dist/index.js"
|
|
27
28
|
}
|
|
28
29
|
},
|
|
29
30
|
"scripts": {
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { get } from 'svelte/store';
|
|
2
|
+
import { craft } from '../stores/craft';
|
|
3
|
+
|
|
4
|
+
export function haptic(node: HTMLElement, type: string = 'selection') {
|
|
5
|
+
const handleClick = async () => {
|
|
6
|
+
const _$craft = get(craft);
|
|
7
|
+
if (!_$craft) return;
|
|
8
|
+
try {
|
|
9
|
+
await _$craft.haptic(type);
|
|
10
|
+
}
|
|
11
|
+
catch (error) {
|
|
12
|
+
// Feedback: an app built with haptics off plays nothing on click, rather
|
|
13
|
+
// than an unhandled rejection. Any other failure still surfaces.
|
|
14
|
+
if ((error as { code?: string } | null)?.code !== 'CAPABILITY_DISABLED') throw error;
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
node.addEventListener('click', handleClick);
|
|
19
|
+
|
|
20
|
+
return {
|
|
21
|
+
destroy() {
|
|
22
|
+
node.removeEventListener('click', handleClick);
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { get } from 'svelte/store';
|
|
2
|
+
import { craft } from '../stores/craft';
|
|
3
|
+
|
|
4
|
+
export async function showToast(message: string, duration: 'short' | 'long' = 'short') {
|
|
5
|
+
const _$craft = get(craft);
|
|
6
|
+
if (!_$craft) return;
|
|
7
|
+
await _$craft.showToast(message, duration);
|
|
8
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { get } from 'svelte/store';
|
|
2
|
+
import { craft } from '../stores/craft';
|
|
3
|
+
|
|
4
|
+
export function createDatabase(dbPath: string) {
|
|
5
|
+
return {
|
|
6
|
+
async execute(sql: string, params: any[] = []) {
|
|
7
|
+
const _$craft = get(craft);
|
|
8
|
+
if (!_$craft) throw new Error('Craft not ready');
|
|
9
|
+
return await _$craft.invoke('db.execute', { path: dbPath, sql, params });
|
|
10
|
+
},
|
|
11
|
+
|
|
12
|
+
async query<T = any>(sql: string, params: any[] = []): Promise<T[]> {
|
|
13
|
+
const _$craft = get(craft);
|
|
14
|
+
if (!_$craft) throw new Error('Craft not ready');
|
|
15
|
+
return await _$craft.invoke('db.query', { path: dbPath, sql, params });
|
|
16
|
+
},
|
|
17
|
+
};
|
|
18
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { get } from 'svelte/store';
|
|
2
|
+
import { craft } from '../stores/craft';
|
|
3
|
+
|
|
4
|
+
export const filesystem = {
|
|
5
|
+
async readFile(path: string, encoding: 'utf8' | 'binary' = 'utf8') {
|
|
6
|
+
const _$craft = get(craft);
|
|
7
|
+
if (!_$craft) throw new Error('Craft not ready');
|
|
8
|
+
return await _$craft.invoke('fs.readFile', { path, encoding });
|
|
9
|
+
},
|
|
10
|
+
|
|
11
|
+
async writeFile(path: string, data: string | Uint8Array, encoding: 'utf8' | 'binary' = 'utf8') {
|
|
12
|
+
const _$craft = get(craft);
|
|
13
|
+
if (!_$craft) throw new Error('Craft not ready');
|
|
14
|
+
await _$craft.invoke('fs.writeFile', { path, data, encoding });
|
|
15
|
+
},
|
|
16
|
+
|
|
17
|
+
async readDir(path: string) {
|
|
18
|
+
const _$craft = get(craft);
|
|
19
|
+
if (!_$craft) throw new Error('Craft not ready');
|
|
20
|
+
return await _$craft.invoke('fs.readDir', { path });
|
|
21
|
+
},
|
|
22
|
+
|
|
23
|
+
async mkdir(path: string, recursive = false) {
|
|
24
|
+
const _$craft = get(craft);
|
|
25
|
+
if (!_$craft) throw new Error('Craft not ready');
|
|
26
|
+
await _$craft.invoke('fs.mkdir', { path, recursive });
|
|
27
|
+
},
|
|
28
|
+
|
|
29
|
+
async remove(path: string, recursive = false) {
|
|
30
|
+
const _$craft = get(craft);
|
|
31
|
+
if (!_$craft) throw new Error('Craft not ready');
|
|
32
|
+
await _$craft.invoke('fs.remove', { path, recursive });
|
|
33
|
+
},
|
|
34
|
+
|
|
35
|
+
async exists(path: string) {
|
|
36
|
+
const _$craft = get(craft);
|
|
37
|
+
if (!_$craft) throw new Error('Craft not ready');
|
|
38
|
+
return await _$craft.invoke('fs.exists', { path });
|
|
39
|
+
},
|
|
40
|
+
};
|
package/src/api/http.ts
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { get } from 'svelte/store';
|
|
2
|
+
import { craft } from '../stores/craft';
|
|
3
|
+
|
|
4
|
+
interface HttpOptions {
|
|
5
|
+
method?: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';
|
|
6
|
+
headers?: Record<string, string>;
|
|
7
|
+
body?: any;
|
|
8
|
+
timeout?: number;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export const http = {
|
|
12
|
+
async fetch<T = any>(url: string, options: HttpOptions = {}): Promise<T> {
|
|
13
|
+
const _$craft = get(craft);
|
|
14
|
+
if (!_$craft) throw new Error('Craft not ready');
|
|
15
|
+
return await _$craft.invoke('http.fetch', { url, ...options });
|
|
16
|
+
},
|
|
17
|
+
|
|
18
|
+
async download(url: string, path: string) {
|
|
19
|
+
const _$craft = get(craft);
|
|
20
|
+
if (!_$craft) throw new Error('Craft not ready');
|
|
21
|
+
await _$craft.invoke('http.download', { url, path });
|
|
22
|
+
},
|
|
23
|
+
|
|
24
|
+
async upload(url: string, filePath: string, options: HttpOptions = {}) {
|
|
25
|
+
const _$craft = get(craft);
|
|
26
|
+
if (!_$craft) throw new Error('Craft not ready');
|
|
27
|
+
return await _$craft.invoke('http.upload', { url, filePath, ...options });
|
|
28
|
+
},
|
|
29
|
+
};
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export * from './stores/craft';
|
|
2
|
+
export * from './stores/platform';
|
|
3
|
+
export * from './stores/window';
|
|
4
|
+
export * from './stores/tray';
|
|
5
|
+
export * from './actions/haptic';
|
|
6
|
+
export * from './actions/toast';
|
|
7
|
+
export * from './api/filesystem';
|
|
8
|
+
export * from './api/database';
|
|
9
|
+
export * from './api/http';
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { writable, derived } from 'svelte/store';
|
|
2
|
+
import type { Readable } from 'svelte/store';
|
|
3
|
+
|
|
4
|
+
interface CraftAPI {
|
|
5
|
+
getPlatform(): Promise<{ platform: string; version: string }>;
|
|
6
|
+
getDeviceInfo(): Promise<{ platform: string; model: string; os_version: string }>;
|
|
7
|
+
showToast(message: string, duration: 'short' | 'long'): Promise<void>;
|
|
8
|
+
haptic(type: string): Promise<void>;
|
|
9
|
+
requestPermission(permission: string): Promise<{ granted: boolean; message: string }>;
|
|
10
|
+
on(event: string, callback: (...args: any[]) => void): void;
|
|
11
|
+
off(event: string, callback: (...args: any[]) => void): void;
|
|
12
|
+
emit(event: string, data?: any): void;
|
|
13
|
+
invoke(method: string, params?: any): Promise<any>;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
declare global {
|
|
17
|
+
interface Window {
|
|
18
|
+
craft?: CraftAPI;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function createCraftStore(): Readable<CraftAPI | null> {
|
|
23
|
+
const { subscribe, set } = writable<CraftAPI | null>(null);
|
|
24
|
+
|
|
25
|
+
if (typeof window !== 'undefined') {
|
|
26
|
+
if (window.craft) {
|
|
27
|
+
set(window.craft);
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
const checkCraft = setInterval(() => {
|
|
31
|
+
if (window.craft) {
|
|
32
|
+
set(window.craft);
|
|
33
|
+
clearInterval(checkCraft);
|
|
34
|
+
}
|
|
35
|
+
}, 100);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
return {
|
|
40
|
+
subscribe,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export const craft = createCraftStore();
|
|
45
|
+
export const isReady = derived(craft, (_$craft) => _$craft !== null);
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { writable } from 'svelte/store';
|
|
2
|
+
import type { Readable } from 'svelte/store';
|
|
3
|
+
import { craft } from './craft';
|
|
4
|
+
|
|
5
|
+
export function createPlatformStore(): Readable<{ platform: string; version: string } | null> {
|
|
6
|
+
const { subscribe, set } = writable<{ platform: string; version: string } | null>(null);
|
|
7
|
+
|
|
8
|
+
craft.subscribe(async (_$craft) => {
|
|
9
|
+
if (_$craft) {
|
|
10
|
+
const info = await _$craft.getPlatform();
|
|
11
|
+
set(info);
|
|
12
|
+
}
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
return { subscribe };
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export const platform = createPlatformStore();
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { writable, get } from 'svelte/store';
|
|
2
|
+
import { craft } from './craft';
|
|
3
|
+
|
|
4
|
+
export const trayVisible = writable(false);
|
|
5
|
+
|
|
6
|
+
export const trayActions = {
|
|
7
|
+
async create(icon?: string, tooltip?: string) {
|
|
8
|
+
const _$craft = get(craft);
|
|
9
|
+
if (!_$craft) return;
|
|
10
|
+
await _$craft.invoke('tray.create', { icon, tooltip });
|
|
11
|
+
trayVisible.set(true);
|
|
12
|
+
},
|
|
13
|
+
|
|
14
|
+
async destroy() {
|
|
15
|
+
const _$craft = get(craft);
|
|
16
|
+
if (!_$craft) return;
|
|
17
|
+
await _$craft.invoke('tray.destroy');
|
|
18
|
+
trayVisible.set(false);
|
|
19
|
+
},
|
|
20
|
+
|
|
21
|
+
async setIcon(icon: string) {
|
|
22
|
+
const _$craft = get(craft);
|
|
23
|
+
if (!_$craft) return;
|
|
24
|
+
await _$craft.invoke('tray.setIcon', { icon });
|
|
25
|
+
},
|
|
26
|
+
};
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { writable, get } from 'svelte/store';
|
|
2
|
+
import { craft } from './craft';
|
|
3
|
+
|
|
4
|
+
export const isFullscreen = writable(false);
|
|
5
|
+
export const isMaximized = writable(false);
|
|
6
|
+
export const isMinimized = writable(false);
|
|
7
|
+
|
|
8
|
+
export const windowActions = {
|
|
9
|
+
async setTitle(title: string) {
|
|
10
|
+
const _$craft = get(craft);
|
|
11
|
+
if (!_$craft) return;
|
|
12
|
+
await _$craft.invoke('window.setTitle', { title });
|
|
13
|
+
},
|
|
14
|
+
|
|
15
|
+
async setSize(width: number, height: number) {
|
|
16
|
+
const _$craft = get(craft);
|
|
17
|
+
if (!_$craft) return;
|
|
18
|
+
await _$craft.invoke('window.setSize', { width, height });
|
|
19
|
+
},
|
|
20
|
+
|
|
21
|
+
async maximize() {
|
|
22
|
+
const _$craft = get(craft);
|
|
23
|
+
if (!_$craft) return;
|
|
24
|
+
await _$craft.invoke('window.maximize');
|
|
25
|
+
isMaximized.set(true);
|
|
26
|
+
},
|
|
27
|
+
|
|
28
|
+
async minimize() {
|
|
29
|
+
const _$craft = get(craft);
|
|
30
|
+
if (!_$craft) return;
|
|
31
|
+
await _$craft.invoke('window.minimize');
|
|
32
|
+
isMinimized.set(true);
|
|
33
|
+
},
|
|
34
|
+
|
|
35
|
+
async toggleFullscreen() {
|
|
36
|
+
const _$craft = get(craft);
|
|
37
|
+
if (!_$craft) return;
|
|
38
|
+
await _$craft.invoke('window.toggleFullscreen');
|
|
39
|
+
isFullscreen.update((v) => !v);
|
|
40
|
+
},
|
|
41
|
+
|
|
42
|
+
async close() {
|
|
43
|
+
const _$craft = get(craft);
|
|
44
|
+
if (!_$craft) return;
|
|
45
|
+
await _$craft.invoke('window.close');
|
|
46
|
+
},
|
|
47
|
+
};
|
package/LICENSE.md
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
# MIT License
|
|
2
|
-
|
|
3
|
-
Copyright (c) 2025 Stacks.js
|
|
4
|
-
|
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
-
in the Software without restriction, including without limitation the rights
|
|
8
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
-
furnished to do so, subject to the following conditions:
|
|
11
|
-
|
|
12
|
-
The above copyright notice and this permission notice shall be included in all
|
|
13
|
-
copies or substantial portions of the Software.
|
|
14
|
-
|
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
-
SOFTWARE.
|