@surdeddd/wmkit 0.2.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/README.md +80 -16
  2. package/README.ru.md +33 -9
  3. package/dist/angular.cjs +53 -0
  4. package/dist/angular.cjs.map +1 -0
  5. package/dist/angular.d.cts +15 -0
  6. package/dist/angular.d.ts +15 -0
  7. package/dist/angular.js +48 -0
  8. package/dist/angular.js.map +1 -0
  9. package/dist/{binder-BY-saDUB.d.cts → binder-B2A2IZGh.d.ts} +19 -2
  10. package/dist/{binder-D9UEE1SM.d.ts → binder-Dl07SXIM.d.cts} +19 -2
  11. package/dist/{chunk-KQCVZ2W7.cjs → chunk-3KZZOLHW.cjs} +691 -156
  12. package/dist/chunk-3KZZOLHW.cjs.map +1 -0
  13. package/dist/{chunk-2TVOEDRG.js → chunk-FPZDAKNP.js} +689 -157
  14. package/dist/chunk-FPZDAKNP.js.map +1 -0
  15. package/dist/index.cjs +27 -15
  16. package/dist/index.d.cts +6 -5
  17. package/dist/index.d.ts +6 -5
  18. package/dist/index.js +1 -1
  19. package/dist/persist.cjs +22 -3
  20. package/dist/persist.cjs.map +1 -1
  21. package/dist/persist.d.cts +3 -1
  22. package/dist/persist.d.ts +3 -1
  23. package/dist/persist.js +22 -3
  24. package/dist/persist.js.map +1 -1
  25. package/dist/popout.cjs +3 -4
  26. package/dist/popout.cjs.map +1 -1
  27. package/dist/popout.d.cts +1 -1
  28. package/dist/popout.d.ts +1 -1
  29. package/dist/popout.js +3 -4
  30. package/dist/popout.js.map +1 -1
  31. package/dist/react.cjs +4 -3
  32. package/dist/react.cjs.map +1 -1
  33. package/dist/react.d.cts +2 -2
  34. package/dist/react.d.ts +2 -2
  35. package/dist/react.js +2 -1
  36. package/dist/react.js.map +1 -1
  37. package/dist/solid.cjs +4 -3
  38. package/dist/solid.cjs.map +1 -1
  39. package/dist/solid.d.cts +2 -2
  40. package/dist/solid.d.ts +2 -2
  41. package/dist/solid.js +2 -1
  42. package/dist/solid.js.map +1 -1
  43. package/dist/svelte.cjs +8 -5
  44. package/dist/svelte.cjs.map +1 -1
  45. package/dist/svelte.d.cts +2 -2
  46. package/dist/svelte.d.ts +2 -2
  47. package/dist/svelte.js +6 -3
  48. package/dist/svelte.js.map +1 -1
  49. package/dist/themes/light.css +202 -0
  50. package/dist/themes/retro.css +154 -0
  51. package/dist/{types-Bkrq2djr.d.cts → types-t6pyVYKN.d.cts} +38 -2
  52. package/dist/{types-Bkrq2djr.d.ts → types-t6pyVYKN.d.ts} +38 -2
  53. package/dist/vue.cjs +4 -3
  54. package/dist/vue.cjs.map +1 -1
  55. package/dist/vue.d.cts +2 -2
  56. package/dist/vue.d.ts +2 -2
  57. package/dist/vue.js +2 -1
  58. package/dist/vue.js.map +1 -1
  59. package/package.json +34 -7
  60. package/dist/chunk-2TVOEDRG.js.map +0 -1
  61. package/dist/chunk-KQCVZ2W7.cjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/plugins/persist.ts"],"names":[],"mappings":";;;AAsBA,SAAS,cAAA,GAAwC;AAC/C,EAAA,IAAI;AACF,IAAA,MAAM,UAAU,UAAA,CAAW,YAAA;AAC3B,IAAA,MAAM,KAAA,GAAQ,iBAAA;AACd,IAAA,OAAA,CAAQ,OAAA,CAAQ,OAAO,GAAG,CAAA;AAC1B,IAAA,OAAA,CAAQ,WAAW,KAAK,CAAA;AACxB,IAAA,OAAO,OAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEO,SAAS,OAAA,CAAQ,EAAA,EAAmB,OAAA,GAA0B,EAAC,EAAsB;AAC1F,EAAA,MAAM,GAAA,GAAM,QAAQ,GAAA,IAAO,OAAA;AAC3B,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,IAAW,cAAA,EAAe;AAClD,EAAA,MAAM,QAAA,GAAW,QAAQ,QAAA,IAAY,GAAA;AACrC,EAAA,IAAI,KAAA;AACJ,EAAA,IAAI,SAAA,GAAY,KAAA;AAEhB,EAAA,SAAS,IAAA,GAAa;AACpB,IAAA,IAAI,CAAC,OAAA,EAAS;AACd,IAAA,IAAI;AACF,MAAA,OAAA,CAAQ,QAAQ,GAAA,EAAK,IAAA,CAAK,UAAU,EAAA,CAAG,SAAA,EAAW,CAAC,CAAA;AAAA,IACrD,CAAA,CAAA,MAAQ;AAAA,IAAC;AAAA,EACX;AAEA,EAAA,SAAS,OAAA,GAAmB;AAC1B,IAAA,IAAI,CAAC,SAAS,OAAO,KAAA;AACrB,IAAA,IAAI,GAAA,GAAqB,IAAA;AACzB,IAAA,IAAI;AACF,MAAA,GAAA,GAAM,OAAA,CAAQ,QAAQ,GAAG,CAAA;AAAA,IAC3B,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,IAAI,CAAC,KAAK,OAAO,KAAA;AACjB,IAAA,IAAI,IAAA;AACJ,IAAA,IAAI;AACF,MAAA,IAAA,GAAO,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,IACvB,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,SAAA,GAAY,IAAA;AACZ,IAAA,MAAM,QAAA,GAAW,EAAA,CAAG,OAAA,CAAQ,IAAI,CAAA;AAChC,IAAA,SAAA,GAAY,KAAA;AACZ,IAAA,OAAO,QAAA;AAAA,EACT;AAEA,EAAA,SAAS,KAAA,GAAc;AACrB,IAAA,IAAI,CAAC,OAAA,EAAS;AACd,IAAA,IAAI;AACF,MAAA,OAAA,CAAQ,WAAW,GAAG,CAAA;AAAA,IACxB,CAAA,CAAA,MAAQ;AAAA,IAAC;AAAA,EACX;AAEA,EAAA,MAAM,WAAA,GAAc,EAAA,CAAG,SAAA,CAAU,MAAM;AACrC,IAAA,IAAI,SAAA,IAAa,CAAC,OAAA,EAAS;AAC3B,IAAA,IAAI,KAAA,KAAU,MAAA,EAAW,YAAA,CAAa,KAAK,CAAA;AAC3C,IAAA,KAAA,GAAQ,UAAA,CAAW,MAAM,QAAQ,CAAA;AAAA,EACnC,CAAC,CAAA;AAED,EAAA,IAAI,OAAA,CAAQ,WAAA,KAAgB,KAAA,EAAO,OAAA,EAAQ;AAE3C,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,IAAA;AAAA,IACA,KAAA;AAAA,IACA,OAAA,GAAU;AACR,MAAA,WAAA,EAAY;AACZ,MAAA,IAAI,KAAA,KAAU,MAAA,EAAW,YAAA,CAAa,KAAK,CAAA;AAAA,IAC7C;AAAA,GACF;AACF","file":"persist.cjs","sourcesContent":["import type { SerializedState, WindowManager } from '../core/types'\n\nexport interface PersistStorage {\n getItem(key: string): string | null\n setItem(key: string, value: string): void\n removeItem(key: string): void\n}\n\nexport interface PersistOptions {\n key?: string\n storage?: PersistStorage\n debounce?: number\n autoRestore?: boolean\n}\n\nexport interface PersistController {\n restore(): boolean\n save(): void\n clear(): void\n destroy(): void\n}\n\nfunction defaultStorage(): PersistStorage | null {\n try {\n const storage = globalThis.localStorage\n const probe = '__wmkit_probe__'\n storage.setItem(probe, '1')\n storage.removeItem(probe)\n return storage\n } catch {\n return null\n }\n}\n\nexport function persist(wm: WindowManager, options: PersistOptions = {}): PersistController {\n const key = options.key ?? 'wmkit'\n const storage = options.storage ?? defaultStorage()\n const debounce = options.debounce ?? 150\n let timer: ReturnType<typeof setTimeout> | undefined\n let suspended = false\n\n function save(): void {\n if (!storage) return\n try {\n storage.setItem(key, JSON.stringify(wm.serialize()))\n } catch {}\n }\n\n function restore(): boolean {\n if (!storage) return false\n let raw: string | null = null\n try {\n raw = storage.getItem(key)\n } catch {\n return false\n }\n if (!raw) return false\n let data: SerializedState\n try {\n data = JSON.parse(raw) as SerializedState\n } catch {\n return false\n }\n suspended = true\n const restored = wm.hydrate(data)\n suspended = false\n return restored\n }\n\n function clear(): void {\n if (!storage) return\n try {\n storage.removeItem(key)\n } catch {}\n }\n\n const unsubscribe = wm.subscribe(() => {\n if (suspended || !storage) return\n if (timer !== undefined) clearTimeout(timer)\n timer = setTimeout(save, debounce)\n })\n\n if (options.autoRestore !== false) restore()\n\n return {\n restore,\n save,\n clear,\n destroy() {\n unsubscribe()\n if (timer !== undefined) clearTimeout(timer)\n },\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/plugins/persist.ts"],"names":[],"mappings":"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","file":"persist.cjs","sourcesContent":["import type { SerializedState, WindowManager } from '../core/types'\n\nexport interface PersistStorage {\n getItem(key: string): string | null\n setItem(key: string, value: string): void\n removeItem(key: string): void\n}\n\nexport interface PersistOptions {\n key?: string\n storage?: PersistStorage\n debounce?: number\n autoRestore?: boolean\n version?: number\n migrate?: (state: unknown, from: number) => SerializedState | null\n}\n\ninterface PersistEnvelope {\n version: number\n state: SerializedState\n}\n\nfunction unwrap(raw: unknown): PersistEnvelope | null {\n if (typeof raw !== 'object' || raw === null) return null\n const candidate = raw as Record<string, unknown>\n if (typeof candidate.version === 'number' && typeof candidate.state === 'object') {\n return { version: candidate.version, state: candidate.state as SerializedState }\n }\n if (Array.isArray(candidate.windows)) return { version: 0, state: raw as SerializedState }\n return null\n}\n\nexport interface PersistController {\n restore(): boolean\n save(): void\n clear(): void\n destroy(): void\n}\n\nfunction defaultStorage(): PersistStorage | null {\n try {\n const storage = globalThis.localStorage\n const probe = '__wmkit_probe__'\n storage.setItem(probe, '1')\n storage.removeItem(probe)\n return storage\n } catch {\n return null\n }\n}\n\nexport function persist(wm: WindowManager, options: PersistOptions = {}): PersistController {\n const key = options.key ?? 'wmkit'\n const storage = options.storage ?? defaultStorage()\n const debounce = options.debounce ?? 150\n const version = options.version ?? 0\n let timer: ReturnType<typeof setTimeout> | undefined\n let suspended = false\n\n function save(): void {\n if (!storage) return\n try {\n storage.setItem(key, JSON.stringify({ version, state: wm.serialize() }))\n } catch {}\n }\n\n function restore(): boolean {\n if (!storage) return false\n let raw: string | null = null\n try {\n raw = storage.getItem(key)\n } catch {\n return false\n }\n if (!raw) return false\n let parsed: unknown\n try {\n parsed = JSON.parse(raw)\n } catch {\n return false\n }\n const envelope = unwrap(parsed)\n if (!envelope) return false\n let data: SerializedState | null = envelope.state\n const stale = envelope.version !== version\n if (stale) {\n data = options.migrate ? options.migrate(envelope.state, envelope.version) : null\n }\n if (!data) return false\n suspended = true\n const restored = wm.hydrate(data)\n suspended = false\n if (restored && stale) save()\n return restored\n }\n\n function clear(): void {\n if (!storage) return\n try {\n storage.removeItem(key)\n } catch {}\n }\n\n const unsubscribe = wm.subscribe(() => {\n if (suspended || !storage) return\n if (timer !== undefined) clearTimeout(timer)\n timer = setTimeout(save, debounce)\n })\n\n if (options.autoRestore !== false) restore()\n\n return {\n restore,\n save,\n clear,\n destroy() {\n unsubscribe()\n if (timer !== undefined) clearTimeout(timer)\n },\n }\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { W as WindowManager } from './types-Bkrq2djr.cjs';
1
+ import { d as SerializedState, W as WindowManager } from './types-t6pyVYKN.cjs';
2
2
 
3
3
  interface PersistStorage {
4
4
  getItem(key: string): string | null;
@@ -10,6 +10,8 @@ interface PersistOptions {
10
10
  storage?: PersistStorage;
11
11
  debounce?: number;
12
12
  autoRestore?: boolean;
13
+ version?: number;
14
+ migrate?: (state: unknown, from: number) => SerializedState | null;
13
15
  }
14
16
  interface PersistController {
15
17
  restore(): boolean;
package/dist/persist.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { W as WindowManager } from './types-Bkrq2djr.js';
1
+ import { d as SerializedState, W as WindowManager } from './types-t6pyVYKN.js';
2
2
 
3
3
  interface PersistStorage {
4
4
  getItem(key: string): string | null;
@@ -10,6 +10,8 @@ interface PersistOptions {
10
10
  storage?: PersistStorage;
11
11
  debounce?: number;
12
12
  autoRestore?: boolean;
13
+ version?: number;
14
+ migrate?: (state: unknown, from: number) => SerializedState | null;
13
15
  }
14
16
  interface PersistController {
15
17
  restore(): boolean;
package/dist/persist.js CHANGED
@@ -1,4 +1,13 @@
1
1
  // src/plugins/persist.ts
2
+ function unwrap(raw) {
3
+ if (typeof raw !== "object" || raw === null) return null;
4
+ const candidate = raw;
5
+ if (typeof candidate.version === "number" && typeof candidate.state === "object") {
6
+ return { version: candidate.version, state: candidate.state };
7
+ }
8
+ if (Array.isArray(candidate.windows)) return { version: 0, state: raw };
9
+ return null;
10
+ }
2
11
  function defaultStorage() {
3
12
  try {
4
13
  const storage = globalThis.localStorage;
@@ -14,12 +23,13 @@ function persist(wm, options = {}) {
14
23
  const key = options.key ?? "wmkit";
15
24
  const storage = options.storage ?? defaultStorage();
16
25
  const debounce = options.debounce ?? 150;
26
+ const version = options.version ?? 0;
17
27
  let timer;
18
28
  let suspended = false;
19
29
  function save() {
20
30
  if (!storage) return;
21
31
  try {
22
- storage.setItem(key, JSON.stringify(wm.serialize()));
32
+ storage.setItem(key, JSON.stringify({ version, state: wm.serialize() }));
23
33
  } catch {
24
34
  }
25
35
  }
@@ -32,15 +42,24 @@ function persist(wm, options = {}) {
32
42
  return false;
33
43
  }
34
44
  if (!raw) return false;
35
- let data;
45
+ let parsed;
36
46
  try {
37
- data = JSON.parse(raw);
47
+ parsed = JSON.parse(raw);
38
48
  } catch {
39
49
  return false;
40
50
  }
51
+ const envelope = unwrap(parsed);
52
+ if (!envelope) return false;
53
+ let data = envelope.state;
54
+ const stale = envelope.version !== version;
55
+ if (stale) {
56
+ data = options.migrate ? options.migrate(envelope.state, envelope.version) : null;
57
+ }
58
+ if (!data) return false;
41
59
  suspended = true;
42
60
  const restored = wm.hydrate(data);
43
61
  suspended = false;
62
+ if (restored && stale) save();
44
63
  return restored;
45
64
  }
46
65
  function clear() {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/plugins/persist.ts"],"names":[],"mappings":";AAsBA,SAAS,cAAA,GAAwC;AAC/C,EAAA,IAAI;AACF,IAAA,MAAM,UAAU,UAAA,CAAW,YAAA;AAC3B,IAAA,MAAM,KAAA,GAAQ,iBAAA;AACd,IAAA,OAAA,CAAQ,OAAA,CAAQ,OAAO,GAAG,CAAA;AAC1B,IAAA,OAAA,CAAQ,WAAW,KAAK,CAAA;AACxB,IAAA,OAAO,OAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEO,SAAS,OAAA,CAAQ,EAAA,EAAmB,OAAA,GAA0B,EAAC,EAAsB;AAC1F,EAAA,MAAM,GAAA,GAAM,QAAQ,GAAA,IAAO,OAAA;AAC3B,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,IAAW,cAAA,EAAe;AAClD,EAAA,MAAM,QAAA,GAAW,QAAQ,QAAA,IAAY,GAAA;AACrC,EAAA,IAAI,KAAA;AACJ,EAAA,IAAI,SAAA,GAAY,KAAA;AAEhB,EAAA,SAAS,IAAA,GAAa;AACpB,IAAA,IAAI,CAAC,OAAA,EAAS;AACd,IAAA,IAAI;AACF,MAAA,OAAA,CAAQ,QAAQ,GAAA,EAAK,IAAA,CAAK,UAAU,EAAA,CAAG,SAAA,EAAW,CAAC,CAAA;AAAA,IACrD,CAAA,CAAA,MAAQ;AAAA,IAAC;AAAA,EACX;AAEA,EAAA,SAAS,OAAA,GAAmB;AAC1B,IAAA,IAAI,CAAC,SAAS,OAAO,KAAA;AACrB,IAAA,IAAI,GAAA,GAAqB,IAAA;AACzB,IAAA,IAAI;AACF,MAAA,GAAA,GAAM,OAAA,CAAQ,QAAQ,GAAG,CAAA;AAAA,IAC3B,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,IAAI,CAAC,KAAK,OAAO,KAAA;AACjB,IAAA,IAAI,IAAA;AACJ,IAAA,IAAI;AACF,MAAA,IAAA,GAAO,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,IACvB,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,SAAA,GAAY,IAAA;AACZ,IAAA,MAAM,QAAA,GAAW,EAAA,CAAG,OAAA,CAAQ,IAAI,CAAA;AAChC,IAAA,SAAA,GAAY,KAAA;AACZ,IAAA,OAAO,QAAA;AAAA,EACT;AAEA,EAAA,SAAS,KAAA,GAAc;AACrB,IAAA,IAAI,CAAC,OAAA,EAAS;AACd,IAAA,IAAI;AACF,MAAA,OAAA,CAAQ,WAAW,GAAG,CAAA;AAAA,IACxB,CAAA,CAAA,MAAQ;AAAA,IAAC;AAAA,EACX;AAEA,EAAA,MAAM,WAAA,GAAc,EAAA,CAAG,SAAA,CAAU,MAAM;AACrC,IAAA,IAAI,SAAA,IAAa,CAAC,OAAA,EAAS;AAC3B,IAAA,IAAI,KAAA,KAAU,MAAA,EAAW,YAAA,CAAa,KAAK,CAAA;AAC3C,IAAA,KAAA,GAAQ,UAAA,CAAW,MAAM,QAAQ,CAAA;AAAA,EACnC,CAAC,CAAA;AAED,EAAA,IAAI,OAAA,CAAQ,WAAA,KAAgB,KAAA,EAAO,OAAA,EAAQ;AAE3C,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,IAAA;AAAA,IACA,KAAA;AAAA,IACA,OAAA,GAAU;AACR,MAAA,WAAA,EAAY;AACZ,MAAA,IAAI,KAAA,KAAU,MAAA,EAAW,YAAA,CAAa,KAAK,CAAA;AAAA,IAC7C;AAAA,GACF;AACF","file":"persist.js","sourcesContent":["import type { SerializedState, WindowManager } from '../core/types'\n\nexport interface PersistStorage {\n getItem(key: string): string | null\n setItem(key: string, value: string): void\n removeItem(key: string): void\n}\n\nexport interface PersistOptions {\n key?: string\n storage?: PersistStorage\n debounce?: number\n autoRestore?: boolean\n}\n\nexport interface PersistController {\n restore(): boolean\n save(): void\n clear(): void\n destroy(): void\n}\n\nfunction defaultStorage(): PersistStorage | null {\n try {\n const storage = globalThis.localStorage\n const probe = '__wmkit_probe__'\n storage.setItem(probe, '1')\n storage.removeItem(probe)\n return storage\n } catch {\n return null\n }\n}\n\nexport function persist(wm: WindowManager, options: PersistOptions = {}): PersistController {\n const key = options.key ?? 'wmkit'\n const storage = options.storage ?? defaultStorage()\n const debounce = options.debounce ?? 150\n let timer: ReturnType<typeof setTimeout> | undefined\n let suspended = false\n\n function save(): void {\n if (!storage) return\n try {\n storage.setItem(key, JSON.stringify(wm.serialize()))\n } catch {}\n }\n\n function restore(): boolean {\n if (!storage) return false\n let raw: string | null = null\n try {\n raw = storage.getItem(key)\n } catch {\n return false\n }\n if (!raw) return false\n let data: SerializedState\n try {\n data = JSON.parse(raw) as SerializedState\n } catch {\n return false\n }\n suspended = true\n const restored = wm.hydrate(data)\n suspended = false\n return restored\n }\n\n function clear(): void {\n if (!storage) return\n try {\n storage.removeItem(key)\n } catch {}\n }\n\n const unsubscribe = wm.subscribe(() => {\n if (suspended || !storage) return\n if (timer !== undefined) clearTimeout(timer)\n timer = setTimeout(save, debounce)\n })\n\n if (options.autoRestore !== false) restore()\n\n return {\n restore,\n save,\n clear,\n destroy() {\n unsubscribe()\n if (timer !== undefined) clearTimeout(timer)\n },\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/plugins/persist.ts"],"names":[],"mappings":"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","file":"persist.js","sourcesContent":["import type { SerializedState, WindowManager } from '../core/types'\n\nexport interface PersistStorage {\n getItem(key: string): string | null\n setItem(key: string, value: string): void\n removeItem(key: string): void\n}\n\nexport interface PersistOptions {\n key?: string\n storage?: PersistStorage\n debounce?: number\n autoRestore?: boolean\n version?: number\n migrate?: (state: unknown, from: number) => SerializedState | null\n}\n\ninterface PersistEnvelope {\n version: number\n state: SerializedState\n}\n\nfunction unwrap(raw: unknown): PersistEnvelope | null {\n if (typeof raw !== 'object' || raw === null) return null\n const candidate = raw as Record<string, unknown>\n if (typeof candidate.version === 'number' && typeof candidate.state === 'object') {\n return { version: candidate.version, state: candidate.state as SerializedState }\n }\n if (Array.isArray(candidate.windows)) return { version: 0, state: raw as SerializedState }\n return null\n}\n\nexport interface PersistController {\n restore(): boolean\n save(): void\n clear(): void\n destroy(): void\n}\n\nfunction defaultStorage(): PersistStorage | null {\n try {\n const storage = globalThis.localStorage\n const probe = '__wmkit_probe__'\n storage.setItem(probe, '1')\n storage.removeItem(probe)\n return storage\n } catch {\n return null\n }\n}\n\nexport function persist(wm: WindowManager, options: PersistOptions = {}): PersistController {\n const key = options.key ?? 'wmkit'\n const storage = options.storage ?? defaultStorage()\n const debounce = options.debounce ?? 150\n const version = options.version ?? 0\n let timer: ReturnType<typeof setTimeout> | undefined\n let suspended = false\n\n function save(): void {\n if (!storage) return\n try {\n storage.setItem(key, JSON.stringify({ version, state: wm.serialize() }))\n } catch {}\n }\n\n function restore(): boolean {\n if (!storage) return false\n let raw: string | null = null\n try {\n raw = storage.getItem(key)\n } catch {\n return false\n }\n if (!raw) return false\n let parsed: unknown\n try {\n parsed = JSON.parse(raw)\n } catch {\n return false\n }\n const envelope = unwrap(parsed)\n if (!envelope) return false\n let data: SerializedState | null = envelope.state\n const stale = envelope.version !== version\n if (stale) {\n data = options.migrate ? options.migrate(envelope.state, envelope.version) : null\n }\n if (!data) return false\n suspended = true\n const restored = wm.hydrate(data)\n suspended = false\n if (restored && stale) save()\n return restored\n }\n\n function clear(): void {\n if (!storage) return\n try {\n storage.removeItem(key)\n } catch {}\n }\n\n const unsubscribe = wm.subscribe(() => {\n if (suspended || !storage) return\n if (timer !== undefined) clearTimeout(timer)\n timer = setTimeout(save, debounce)\n })\n\n if (options.autoRestore !== false) restore()\n\n return {\n restore,\n save,\n clear,\n destroy() {\n unsubscribe()\n if (timer !== undefined) clearTimeout(timer)\n },\n }\n}\n"]}
package/dist/popout.cjs CHANGED
@@ -5,15 +5,14 @@ function isPopoutSupported() {
5
5
  return typeof window !== "undefined" && window.documentPictureInPicture !== void 0;
6
6
  }
7
7
  function copyStylesInto(pipWindow, source) {
8
- for (const sheet of Array.from(source.styleSheets)) {
9
- const owner = sheet.ownerNode;
10
- if (!owner) continue;
8
+ for (const sheet of [...source.styleSheets, ...source.adoptedStyleSheets ?? []]) {
11
9
  try {
12
10
  const rules = Array.from(sheet.cssRules).map((rule) => rule.cssText).join("\n");
13
11
  const style = pipWindow.document.createElement("style");
14
12
  style.textContent = rules;
15
13
  pipWindow.document.head.append(style);
16
14
  } catch {
15
+ const owner = sheet.ownerNode;
17
16
  if (owner instanceof HTMLLinkElement && owner.href) {
18
17
  const link = pipWindow.document.createElement("link");
19
18
  link.rel = "stylesheet";
@@ -38,7 +37,7 @@ async function popout(wm, id, content, options = {}) {
38
37
  parent?.insertBefore(marker, content);
39
38
  pipWindow.document.body.append(content);
40
39
  pipWindow.document.title = win.title;
41
- const minimizeWhilePopped = options.minimizeWhilePopped !== false;
40
+ const minimizeWhilePopped = options.minimizeWhilePopped !== false && wm.get(id)?.stage !== "minimized";
42
41
  if (minimizeWhilePopped) wm.minimize(id);
43
42
  let closed = false;
44
43
  function handleReturn() {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/plugins/popout.ts"],"names":[],"mappings":"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","file":"popout.cjs","sourcesContent":["import type { WindowManager } from '../core/types'\n\ninterface DocumentPictureInPictureApi {\n requestWindow(options?: {\n width?: number\n height?: number\n disallowReturnToOpener?: boolean\n }): Promise<Window>\n}\n\ndeclare global {\n interface Window {\n documentPictureInPicture?: DocumentPictureInPictureApi\n }\n}\n\nexport interface PopoutOptions {\n width?: number\n height?: number\n copyStyles?: boolean\n minimizeWhilePopped?: boolean\n}\n\nexport interface PopoutHandle {\n pipWindow: Window\n close(): void\n}\n\nexport function isPopoutSupported(): boolean {\n return typeof window !== 'undefined' && window.documentPictureInPicture !== undefined\n}\n\nfunction copyStylesInto(pipWindow: Window, source: Document): void {\n for (const sheet of Array.from(source.styleSheets)) {\n const owner = sheet.ownerNode\n if (!owner) continue\n try {\n const rules = Array.from(sheet.cssRules)\n .map((rule) => rule.cssText)\n .join('\\n')\n const style = pipWindow.document.createElement('style')\n style.textContent = rules\n pipWindow.document.head.append(style)\n } catch {\n if (owner instanceof HTMLLinkElement && owner.href) {\n const link = pipWindow.document.createElement('link')\n link.rel = 'stylesheet'\n link.href = owner.href\n pipWindow.document.head.append(link)\n }\n }\n }\n}\n\nexport async function popout(\n wm: WindowManager,\n id: string,\n content: HTMLElement,\n options: PopoutOptions = {},\n): Promise<PopoutHandle> {\n const win = wm.get(id)\n if (!win) throw new Error(`wmkit: cannot pop out unknown window \"${id}\"`)\n const api = typeof window !== 'undefined' ? window.documentPictureInPicture : undefined\n if (!api) throw new Error('wmkit: Document Picture-in-Picture is not supported in this browser')\n\n const pipWindow = await api.requestWindow({\n width: options.width ?? Math.round(win.bounds.width),\n height: options.height ?? Math.round(win.bounds.height),\n })\n\n if (options.copyStyles !== false) copyStylesInto(pipWindow, content.ownerDocument)\n\n const parent = content.parentNode\n const marker = content.ownerDocument.createComment('wmkit-popout')\n parent?.insertBefore(marker, content)\n pipWindow.document.body.append(content)\n pipWindow.document.title = win.title\n\n const minimizeWhilePopped = options.minimizeWhilePopped !== false\n if (minimizeWhilePopped) wm.minimize(id)\n\n let closed = false\n function handleReturn(): void {\n if (closed) return\n closed = true\n if (marker.parentNode) {\n marker.parentNode.insertBefore(content, marker)\n marker.remove()\n }\n if (minimizeWhilePopped && wm.get(id)) wm.restore(id)\n }\n\n pipWindow.addEventListener('pagehide', handleReturn)\n\n return {\n pipWindow,\n close() {\n pipWindow.close()\n handleReturn()\n },\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/plugins/popout.ts"],"names":[],"mappings":"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","file":"popout.cjs","sourcesContent":["import type { WindowManager } from '../core/types'\n\ninterface DocumentPictureInPictureApi {\n requestWindow(options?: {\n width?: number\n height?: number\n disallowReturnToOpener?: boolean\n }): Promise<Window>\n}\n\ndeclare global {\n interface Window {\n documentPictureInPicture?: DocumentPictureInPictureApi\n }\n}\n\nexport interface PopoutOptions {\n width?: number\n height?: number\n copyStyles?: boolean\n minimizeWhilePopped?: boolean\n}\n\nexport interface PopoutHandle {\n pipWindow: Window\n close(): void\n}\n\nexport function isPopoutSupported(): boolean {\n return typeof window !== 'undefined' && window.documentPictureInPicture !== undefined\n}\n\nfunction copyStylesInto(pipWindow: Window, source: Document): void {\n for (const sheet of [...source.styleSheets, ...(source.adoptedStyleSheets ?? [])]) {\n try {\n const rules = Array.from(sheet.cssRules)\n .map((rule) => rule.cssText)\n .join('\\n')\n const style = pipWindow.document.createElement('style')\n style.textContent = rules\n pipWindow.document.head.append(style)\n } catch {\n const owner = sheet.ownerNode\n if (owner instanceof HTMLLinkElement && owner.href) {\n const link = pipWindow.document.createElement('link')\n link.rel = 'stylesheet'\n link.href = owner.href\n pipWindow.document.head.append(link)\n }\n }\n }\n}\n\nexport async function popout(\n wm: WindowManager,\n id: string,\n content: HTMLElement,\n options: PopoutOptions = {},\n): Promise<PopoutHandle> {\n const win = wm.get(id)\n if (!win) throw new Error(`wmkit: cannot pop out unknown window \"${id}\"`)\n const api = typeof window !== 'undefined' ? window.documentPictureInPicture : undefined\n if (!api) throw new Error('wmkit: Document Picture-in-Picture is not supported in this browser')\n\n const pipWindow = await api.requestWindow({\n width: options.width ?? Math.round(win.bounds.width),\n height: options.height ?? Math.round(win.bounds.height),\n })\n\n if (options.copyStyles !== false) copyStylesInto(pipWindow, content.ownerDocument)\n\n const parent = content.parentNode\n const marker = content.ownerDocument.createComment('wmkit-popout')\n parent?.insertBefore(marker, content)\n pipWindow.document.body.append(content)\n pipWindow.document.title = win.title\n\n const minimizeWhilePopped =\n options.minimizeWhilePopped !== false && wm.get(id)?.stage !== 'minimized'\n if (minimizeWhilePopped) wm.minimize(id)\n\n let closed = false\n function handleReturn(): void {\n if (closed) return\n closed = true\n if (marker.parentNode) {\n marker.parentNode.insertBefore(content, marker)\n marker.remove()\n }\n if (minimizeWhilePopped && wm.get(id)) wm.restore(id)\n }\n\n pipWindow.addEventListener('pagehide', handleReturn)\n\n return {\n pipWindow,\n close() {\n pipWindow.close()\n handleReturn()\n },\n }\n}\n"]}
package/dist/popout.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- import { W as WindowManager } from './types-Bkrq2djr.cjs';
1
+ import { W as WindowManager } from './types-t6pyVYKN.cjs';
2
2
 
3
3
  interface DocumentPictureInPictureApi {
4
4
  requestWindow(options?: {
package/dist/popout.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { W as WindowManager } from './types-Bkrq2djr.js';
1
+ import { W as WindowManager } from './types-t6pyVYKN.js';
2
2
 
3
3
  interface DocumentPictureInPictureApi {
4
4
  requestWindow(options?: {
package/dist/popout.js CHANGED
@@ -3,15 +3,14 @@ function isPopoutSupported() {
3
3
  return typeof window !== "undefined" && window.documentPictureInPicture !== void 0;
4
4
  }
5
5
  function copyStylesInto(pipWindow, source) {
6
- for (const sheet of Array.from(source.styleSheets)) {
7
- const owner = sheet.ownerNode;
8
- if (!owner) continue;
6
+ for (const sheet of [...source.styleSheets, ...source.adoptedStyleSheets ?? []]) {
9
7
  try {
10
8
  const rules = Array.from(sheet.cssRules).map((rule) => rule.cssText).join("\n");
11
9
  const style = pipWindow.document.createElement("style");
12
10
  style.textContent = rules;
13
11
  pipWindow.document.head.append(style);
14
12
  } catch {
13
+ const owner = sheet.ownerNode;
15
14
  if (owner instanceof HTMLLinkElement && owner.href) {
16
15
  const link = pipWindow.document.createElement("link");
17
16
  link.rel = "stylesheet";
@@ -36,7 +35,7 @@ async function popout(wm, id, content, options = {}) {
36
35
  parent?.insertBefore(marker, content);
37
36
  pipWindow.document.body.append(content);
38
37
  pipWindow.document.title = win.title;
39
- const minimizeWhilePopped = options.minimizeWhilePopped !== false;
38
+ const minimizeWhilePopped = options.minimizeWhilePopped !== false && wm.get(id)?.stage !== "minimized";
40
39
  if (minimizeWhilePopped) wm.minimize(id);
41
40
  let closed = false;
42
41
  function handleReturn() {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/plugins/popout.ts"],"names":[],"mappings":"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","file":"popout.js","sourcesContent":["import type { WindowManager } from '../core/types'\n\ninterface DocumentPictureInPictureApi {\n requestWindow(options?: {\n width?: number\n height?: number\n disallowReturnToOpener?: boolean\n }): Promise<Window>\n}\n\ndeclare global {\n interface Window {\n documentPictureInPicture?: DocumentPictureInPictureApi\n }\n}\n\nexport interface PopoutOptions {\n width?: number\n height?: number\n copyStyles?: boolean\n minimizeWhilePopped?: boolean\n}\n\nexport interface PopoutHandle {\n pipWindow: Window\n close(): void\n}\n\nexport function isPopoutSupported(): boolean {\n return typeof window !== 'undefined' && window.documentPictureInPicture !== undefined\n}\n\nfunction copyStylesInto(pipWindow: Window, source: Document): void {\n for (const sheet of Array.from(source.styleSheets)) {\n const owner = sheet.ownerNode\n if (!owner) continue\n try {\n const rules = Array.from(sheet.cssRules)\n .map((rule) => rule.cssText)\n .join('\\n')\n const style = pipWindow.document.createElement('style')\n style.textContent = rules\n pipWindow.document.head.append(style)\n } catch {\n if (owner instanceof HTMLLinkElement && owner.href) {\n const link = pipWindow.document.createElement('link')\n link.rel = 'stylesheet'\n link.href = owner.href\n pipWindow.document.head.append(link)\n }\n }\n }\n}\n\nexport async function popout(\n wm: WindowManager,\n id: string,\n content: HTMLElement,\n options: PopoutOptions = {},\n): Promise<PopoutHandle> {\n const win = wm.get(id)\n if (!win) throw new Error(`wmkit: cannot pop out unknown window \"${id}\"`)\n const api = typeof window !== 'undefined' ? window.documentPictureInPicture : undefined\n if (!api) throw new Error('wmkit: Document Picture-in-Picture is not supported in this browser')\n\n const pipWindow = await api.requestWindow({\n width: options.width ?? Math.round(win.bounds.width),\n height: options.height ?? Math.round(win.bounds.height),\n })\n\n if (options.copyStyles !== false) copyStylesInto(pipWindow, content.ownerDocument)\n\n const parent = content.parentNode\n const marker = content.ownerDocument.createComment('wmkit-popout')\n parent?.insertBefore(marker, content)\n pipWindow.document.body.append(content)\n pipWindow.document.title = win.title\n\n const minimizeWhilePopped = options.minimizeWhilePopped !== false\n if (minimizeWhilePopped) wm.minimize(id)\n\n let closed = false\n function handleReturn(): void {\n if (closed) return\n closed = true\n if (marker.parentNode) {\n marker.parentNode.insertBefore(content, marker)\n marker.remove()\n }\n if (minimizeWhilePopped && wm.get(id)) wm.restore(id)\n }\n\n pipWindow.addEventListener('pagehide', handleReturn)\n\n return {\n pipWindow,\n close() {\n pipWindow.close()\n handleReturn()\n },\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/plugins/popout.ts"],"names":[],"mappings":"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","file":"popout.js","sourcesContent":["import type { WindowManager } from '../core/types'\n\ninterface DocumentPictureInPictureApi {\n requestWindow(options?: {\n width?: number\n height?: number\n disallowReturnToOpener?: boolean\n }): Promise<Window>\n}\n\ndeclare global {\n interface Window {\n documentPictureInPicture?: DocumentPictureInPictureApi\n }\n}\n\nexport interface PopoutOptions {\n width?: number\n height?: number\n copyStyles?: boolean\n minimizeWhilePopped?: boolean\n}\n\nexport interface PopoutHandle {\n pipWindow: Window\n close(): void\n}\n\nexport function isPopoutSupported(): boolean {\n return typeof window !== 'undefined' && window.documentPictureInPicture !== undefined\n}\n\nfunction copyStylesInto(pipWindow: Window, source: Document): void {\n for (const sheet of [...source.styleSheets, ...(source.adoptedStyleSheets ?? [])]) {\n try {\n const rules = Array.from(sheet.cssRules)\n .map((rule) => rule.cssText)\n .join('\\n')\n const style = pipWindow.document.createElement('style')\n style.textContent = rules\n pipWindow.document.head.append(style)\n } catch {\n const owner = sheet.ownerNode\n if (owner instanceof HTMLLinkElement && owner.href) {\n const link = pipWindow.document.createElement('link')\n link.rel = 'stylesheet'\n link.href = owner.href\n pipWindow.document.head.append(link)\n }\n }\n }\n}\n\nexport async function popout(\n wm: WindowManager,\n id: string,\n content: HTMLElement,\n options: PopoutOptions = {},\n): Promise<PopoutHandle> {\n const win = wm.get(id)\n if (!win) throw new Error(`wmkit: cannot pop out unknown window \"${id}\"`)\n const api = typeof window !== 'undefined' ? window.documentPictureInPicture : undefined\n if (!api) throw new Error('wmkit: Document Picture-in-Picture is not supported in this browser')\n\n const pipWindow = await api.requestWindow({\n width: options.width ?? Math.round(win.bounds.width),\n height: options.height ?? Math.round(win.bounds.height),\n })\n\n if (options.copyStyles !== false) copyStylesInto(pipWindow, content.ownerDocument)\n\n const parent = content.parentNode\n const marker = content.ownerDocument.createComment('wmkit-popout')\n parent?.insertBefore(marker, content)\n pipWindow.document.body.append(content)\n pipWindow.document.title = win.title\n\n const minimizeWhilePopped =\n options.minimizeWhilePopped !== false && wm.get(id)?.stage !== 'minimized'\n if (minimizeWhilePopped) wm.minimize(id)\n\n let closed = false\n function handleReturn(): void {\n if (closed) return\n closed = true\n if (marker.parentNode) {\n marker.parentNode.insertBefore(content, marker)\n marker.remove()\n }\n if (minimizeWhilePopped && wm.get(id)) wm.restore(id)\n }\n\n pipWindow.addEventListener('pagehide', handleReturn)\n\n return {\n pipWindow,\n close() {\n pipWindow.close()\n handleReturn()\n },\n }\n}\n"]}
package/dist/react.cjs CHANGED
@@ -1,10 +1,10 @@
1
1
  'use strict';
2
2
 
3
- var chunkKQCVZ2W7_cjs = require('./chunk-KQCVZ2W7.cjs');
3
+ var chunk3KZZOLHW_cjs = require('./chunk-3KZZOLHW.cjs');
4
4
  var react = require('react');
5
5
 
6
6
  function useWindowManager(options) {
7
- const [wm] = react.useState(() => chunkKQCVZ2W7_cjs.createWindowManager(options));
7
+ const [wm] = react.useState(() => chunk3KZZOLHW_cjs.createWindowManager(options));
8
8
  react.useEffect(() => () => wm.destroy(), [wm]);
9
9
  return wm;
10
10
  }
@@ -17,7 +17,8 @@ function useWmWindow(wm, id) {
17
17
  }
18
18
  function useDesktop(wm, options) {
19
19
  const optionsRef = react.useRef(options);
20
- const binder = react.useMemo(() => chunkKQCVZ2W7_cjs.createDesktopBinder(wm, optionsRef.current), [wm]);
20
+ const binder = react.useMemo(() => chunk3KZZOLHW_cjs.createDesktopBinder(wm, optionsRef.current), [wm]);
21
+ react.useEffect(() => () => binder.destroy(), [binder]);
21
22
  const cleanupRef = react.useRef(null);
22
23
  const ref = react.useCallback(
23
24
  (node) => {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/adapters/react.ts"],"names":["useState","createWindowManager","useEffect","useSyncExternalStore","useCallback","useRef","useMemo","createDesktopBinder"],"mappings":";;;;;AAQO,SAAS,iBAAiB,OAAA,EAAyC;AACxE,EAAA,MAAM,CAAC,EAAE,CAAA,GAAIA,eAAS,MAAMC,qCAAA,CAAoB,OAAO,CAAC,CAAA;AACxD,EAAAC,eAAA,CAAU,MAAM,MAAM,EAAA,CAAG,SAAQ,EAAG,CAAC,EAAE,CAAC,CAAA;AACxC,EAAA,OAAO,EAAA;AACT;AAEO,SAAS,WAAW,EAAA,EAAiC;AAC1D,EAAA,OAAOC,2BAAqB,EAAA,CAAG,SAAA,EAAW,EAAA,CAAG,QAAA,EAAU,GAAG,QAAQ,CAAA;AACpE;AAEO,SAAS,WAAA,CAAY,IAAmB,EAAA,EAAqC;AAClF,EAAA,MAAM,WAAA,GAAcC,iBAAA,CAAY,MAAM,EAAA,CAAG,GAAA,CAAI,EAAE,CAAA,EAAG,CAAC,EAAA,EAAI,EAAE,CAAC,CAAA;AAC1D,EAAA,OAAOD,0BAAA,CAAqB,EAAA,CAAG,SAAA,EAAW,WAAA,EAAa,WAAW,CAAA;AACpE;AAQO,SAAS,UAAA,CAAW,IAAmB,OAAA,EAA4C;AACxF,EAAA,MAAM,UAAA,GAAaE,aAAO,OAAO,CAAA;AACjC,EAAA,MAAM,MAAA,GAASC,aAAA,CAAQ,MAAMC,qCAAA,CAAoB,EAAA,EAAI,WAAW,OAAO,CAAA,EAAG,CAAC,EAAE,CAAC,CAAA;AAC9E,EAAA,MAAM,UAAA,GAAaF,aAA4B,IAAI,CAAA;AACnD,EAAA,MAAM,GAAA,GAAMD,iBAAA;AAAA,IACV,CAAC,IAAA,KAAS;AACR,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,UAAA,CAAW,OAAA,GAAU,MAAA,CAAO,WAAA,CAAY,IAAI,CAAA;AAAA,MAC9C,CAAA,MAAO;AACL,QAAA,UAAA,CAAW,OAAA,IAAU;AACrB,QAAA,UAAA,CAAW,OAAA,GAAU,IAAA;AAAA,MACvB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,MAAM;AAAA,GACT;AACA,EAAA,OAAO,EAAE,GAAA,EAAK,MAAA,EAAQ,UAAA,EAAY,OAAO,UAAA,EAAW;AACtD;AAEO,SAAS,cAAA,CACd,MAAA,EACA,EAAA,EACA,OAAA,EACY;AACZ,EAAA,MAAM,UAAA,GAAaC,aAAO,OAAO,CAAA;AACjC,EAAA,MAAM,UAAA,GAAaA,aAA4B,IAAI,CAAA;AACnD,EAAA,OAAOD,iBAAA;AAAA,IACL,CAAC,IAAA,KAAS;AACR,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,UAAA,CAAW,UAAU,MAAA,CAAO,UAAA,CAAW,EAAA,EAAI,IAAA,EAAM,WAAW,OAAO,CAAA;AAAA,MACrE,CAAA,MAAO;AACL,QAAA,UAAA,CAAW,OAAA,IAAU;AACrB,QAAA,UAAA,CAAW,OAAA,GAAU,IAAA;AAAA,MACvB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,QAAQ,EAAE;AAAA,GACb;AACF","file":"react.cjs","sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState, useSyncExternalStore } from 'react'\nimport { createWindowManager } from '../core/manager'\nimport type { ManagerOptions, ManagerState, WindowManager, WindowState } from '../core/types'\nimport { createDesktopBinder, type DesktopBinder } from '../dom/binder'\nimport type { DesktopController, DesktopOptions, WindowAttachOptions } from '../dom/shared'\n\nexport type ElementRef = (node: HTMLElement | null) => void\n\nexport function useWindowManager(options?: ManagerOptions): WindowManager {\n const [wm] = useState(() => createWindowManager(options))\n useEffect(() => () => wm.destroy(), [wm])\n return wm\n}\n\nexport function useWmState(wm: WindowManager): ManagerState {\n return useSyncExternalStore(wm.subscribe, wm.getState, wm.getState)\n}\n\nexport function useWmWindow(wm: WindowManager, id: string): WindowState | undefined {\n const getSnapshot = useCallback(() => wm.get(id), [wm, id])\n return useSyncExternalStore(wm.subscribe, getSnapshot, getSnapshot)\n}\n\nexport interface UseDesktopResult {\n ref: ElementRef\n binder: DesktopBinder\n controller(): DesktopController | null\n}\n\nexport function useDesktop(wm: WindowManager, options?: DesktopOptions): UseDesktopResult {\n const optionsRef = useRef(options)\n const binder = useMemo(() => createDesktopBinder(wm, optionsRef.current), [wm])\n const cleanupRef = useRef<(() => void) | null>(null)\n const ref = useCallback<ElementRef>(\n (node) => {\n if (node) {\n cleanupRef.current = binder.bindDesktop(node)\n } else {\n cleanupRef.current?.()\n cleanupRef.current = null\n }\n },\n [binder],\n )\n return { ref, binder, controller: binder.controller }\n}\n\nexport function useWmWindowRef(\n binder: DesktopBinder,\n id: string,\n options?: WindowAttachOptions,\n): ElementRef {\n const optionsRef = useRef(options)\n const cleanupRef = useRef<(() => void) | null>(null)\n return useCallback<ElementRef>(\n (node) => {\n if (node) {\n cleanupRef.current = binder.bindWindow(id, node, optionsRef.current)\n } else {\n cleanupRef.current?.()\n cleanupRef.current = null\n }\n },\n [binder, id],\n )\n}\n"]}
1
+ {"version":3,"sources":["../src/adapters/react.ts"],"names":["useState","createWindowManager","useEffect","useSyncExternalStore","useCallback","useRef","useMemo","createDesktopBinder"],"mappings":";;;;;AAQO,SAAS,iBAAiB,OAAA,EAAyC;AACxE,EAAA,MAAM,CAAC,EAAE,CAAA,GAAIA,eAAS,MAAMC,qCAAA,CAAoB,OAAO,CAAC,CAAA;AACxD,EAAAC,eAAA,CAAU,MAAM,MAAM,EAAA,CAAG,SAAQ,EAAG,CAAC,EAAE,CAAC,CAAA;AACxC,EAAA,OAAO,EAAA;AACT;AAEO,SAAS,WAAW,EAAA,EAAiC;AAC1D,EAAA,OAAOC,2BAAqB,EAAA,CAAG,SAAA,EAAW,EAAA,CAAG,QAAA,EAAU,GAAG,QAAQ,CAAA;AACpE;AAEO,SAAS,WAAA,CAAY,IAAmB,EAAA,EAAqC;AAClF,EAAA,MAAM,WAAA,GAAcC,iBAAA,CAAY,MAAM,EAAA,CAAG,GAAA,CAAI,EAAE,CAAA,EAAG,CAAC,EAAA,EAAI,EAAE,CAAC,CAAA;AAC1D,EAAA,OAAOD,0BAAA,CAAqB,EAAA,CAAG,SAAA,EAAW,WAAA,EAAa,WAAW,CAAA;AACpE;AAQO,SAAS,UAAA,CAAW,IAAmB,OAAA,EAA4C;AACxF,EAAA,MAAM,UAAA,GAAaE,aAAO,OAAO,CAAA;AACjC,EAAA,MAAM,MAAA,GAASC,aAAA,CAAQ,MAAMC,qCAAA,CAAoB,EAAA,EAAI,WAAW,OAAO,CAAA,EAAG,CAAC,EAAE,CAAC,CAAA;AAC9E,EAAAL,eAAA,CAAU,MAAM,MAAM,MAAA,CAAO,SAAQ,EAAG,CAAC,MAAM,CAAC,CAAA;AAChD,EAAA,MAAM,UAAA,GAAaG,aAA4B,IAAI,CAAA;AACnD,EAAA,MAAM,GAAA,GAAMD,iBAAA;AAAA,IACV,CAAC,IAAA,KAAS;AACR,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,UAAA,CAAW,OAAA,GAAU,MAAA,CAAO,WAAA,CAAY,IAAI,CAAA;AAAA,MAC9C,CAAA,MAAO;AACL,QAAA,UAAA,CAAW,OAAA,IAAU;AACrB,QAAA,UAAA,CAAW,OAAA,GAAU,IAAA;AAAA,MACvB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,MAAM;AAAA,GACT;AACA,EAAA,OAAO,EAAE,GAAA,EAAK,MAAA,EAAQ,UAAA,EAAY,OAAO,UAAA,EAAW;AACtD;AAEO,SAAS,cAAA,CACd,MAAA,EACA,EAAA,EACA,OAAA,EACY;AACZ,EAAA,MAAM,UAAA,GAAaC,aAAO,OAAO,CAAA;AACjC,EAAA,MAAM,UAAA,GAAaA,aAA4B,IAAI,CAAA;AACnD,EAAA,OAAOD,iBAAA;AAAA,IACL,CAAC,IAAA,KAAS;AACR,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,UAAA,CAAW,UAAU,MAAA,CAAO,UAAA,CAAW,EAAA,EAAI,IAAA,EAAM,WAAW,OAAO,CAAA;AAAA,MACrE,CAAA,MAAO;AACL,QAAA,UAAA,CAAW,OAAA,IAAU;AACrB,QAAA,UAAA,CAAW,OAAA,GAAU,IAAA;AAAA,MACvB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,QAAQ,EAAE;AAAA,GACb;AACF","file":"react.cjs","sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState, useSyncExternalStore } from 'react'\nimport { createWindowManager } from '../core/manager'\nimport type { ManagerOptions, ManagerState, WindowManager, WindowState } from '../core/types'\nimport { createDesktopBinder, type DesktopBinder } from '../dom/binder'\nimport type { DesktopController, DesktopOptions, WindowAttachOptions } from '../dom/shared'\n\nexport type ElementRef = (node: HTMLElement | null) => void\n\nexport function useWindowManager(options?: ManagerOptions): WindowManager {\n const [wm] = useState(() => createWindowManager(options))\n useEffect(() => () => wm.destroy(), [wm])\n return wm\n}\n\nexport function useWmState(wm: WindowManager): ManagerState {\n return useSyncExternalStore(wm.subscribe, wm.getState, wm.getState)\n}\n\nexport function useWmWindow(wm: WindowManager, id: string): WindowState | undefined {\n const getSnapshot = useCallback(() => wm.get(id), [wm, id])\n return useSyncExternalStore(wm.subscribe, getSnapshot, getSnapshot)\n}\n\nexport interface UseDesktopResult {\n ref: ElementRef\n binder: DesktopBinder\n controller(): DesktopController | null\n}\n\nexport function useDesktop(wm: WindowManager, options?: DesktopOptions): UseDesktopResult {\n const optionsRef = useRef(options)\n const binder = useMemo(() => createDesktopBinder(wm, optionsRef.current), [wm])\n useEffect(() => () => binder.destroy(), [binder])\n const cleanupRef = useRef<(() => void) | null>(null)\n const ref = useCallback<ElementRef>(\n (node) => {\n if (node) {\n cleanupRef.current = binder.bindDesktop(node)\n } else {\n cleanupRef.current?.()\n cleanupRef.current = null\n }\n },\n [binder],\n )\n return { ref, binder, controller: binder.controller }\n}\n\nexport function useWmWindowRef(\n binder: DesktopBinder,\n id: string,\n options?: WindowAttachOptions,\n): ElementRef {\n const optionsRef = useRef(options)\n const cleanupRef = useRef<(() => void) | null>(null)\n return useCallback<ElementRef>(\n (node) => {\n if (node) {\n cleanupRef.current = binder.bindWindow(id, node, optionsRef.current)\n } else {\n cleanupRef.current?.()\n cleanupRef.current = null\n }\n },\n [binder, id],\n )\n}\n"]}
package/dist/react.d.cts CHANGED
@@ -1,5 +1,5 @@
1
- import { W as WindowManager, M as ManagerOptions, a as ManagerState, b as WindowState } from './types-Bkrq2djr.cjs';
2
- import { D as DesktopBinder, a as DesktopController, b as DesktopOptions, W as WindowAttachOptions } from './binder-BY-saDUB.cjs';
1
+ import { W as WindowManager, M as ManagerOptions, a as ManagerState, b as WindowState } from './types-t6pyVYKN.cjs';
2
+ import { D as DesktopBinder, b as DesktopController, a as DesktopOptions, W as WindowAttachOptions } from './binder-Dl07SXIM.cjs';
3
3
 
4
4
  type ElementRef = (node: HTMLElement | null) => void;
5
5
  declare function useWindowManager(options?: ManagerOptions): WindowManager;
package/dist/react.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { W as WindowManager, M as ManagerOptions, a as ManagerState, b as WindowState } from './types-Bkrq2djr.js';
2
- import { D as DesktopBinder, a as DesktopController, b as DesktopOptions, W as WindowAttachOptions } from './binder-D9UEE1SM.js';
1
+ import { W as WindowManager, M as ManagerOptions, a as ManagerState, b as WindowState } from './types-t6pyVYKN.js';
2
+ import { D as DesktopBinder, b as DesktopController, a as DesktopOptions, W as WindowAttachOptions } from './binder-B2A2IZGh.js';
3
3
 
4
4
  type ElementRef = (node: HTMLElement | null) => void;
5
5
  declare function useWindowManager(options?: ManagerOptions): WindowManager;
package/dist/react.js CHANGED
@@ -1,4 +1,4 @@
1
- import { createWindowManager, createDesktopBinder } from './chunk-2TVOEDRG.js';
1
+ import { createWindowManager, createDesktopBinder } from './chunk-FPZDAKNP.js';
2
2
  import { useState, useEffect, useSyncExternalStore, useCallback, useRef, useMemo } from 'react';
3
3
 
4
4
  function useWindowManager(options) {
@@ -16,6 +16,7 @@ function useWmWindow(wm, id) {
16
16
  function useDesktop(wm, options) {
17
17
  const optionsRef = useRef(options);
18
18
  const binder = useMemo(() => createDesktopBinder(wm, optionsRef.current), [wm]);
19
+ useEffect(() => () => binder.destroy(), [binder]);
19
20
  const cleanupRef = useRef(null);
20
21
  const ref = useCallback(
21
22
  (node) => {
package/dist/react.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/adapters/react.ts"],"names":[],"mappings":";;;AAQO,SAAS,iBAAiB,OAAA,EAAyC;AACxE,EAAA,MAAM,CAAC,EAAE,CAAA,GAAI,SAAS,MAAM,mBAAA,CAAoB,OAAO,CAAC,CAAA;AACxD,EAAA,SAAA,CAAU,MAAM,MAAM,EAAA,CAAG,SAAQ,EAAG,CAAC,EAAE,CAAC,CAAA;AACxC,EAAA,OAAO,EAAA;AACT;AAEO,SAAS,WAAW,EAAA,EAAiC;AAC1D,EAAA,OAAO,qBAAqB,EAAA,CAAG,SAAA,EAAW,EAAA,CAAG,QAAA,EAAU,GAAG,QAAQ,CAAA;AACpE;AAEO,SAAS,WAAA,CAAY,IAAmB,EAAA,EAAqC;AAClF,EAAA,MAAM,WAAA,GAAc,WAAA,CAAY,MAAM,EAAA,CAAG,GAAA,CAAI,EAAE,CAAA,EAAG,CAAC,EAAA,EAAI,EAAE,CAAC,CAAA;AAC1D,EAAA,OAAO,oBAAA,CAAqB,EAAA,CAAG,SAAA,EAAW,WAAA,EAAa,WAAW,CAAA;AACpE;AAQO,SAAS,UAAA,CAAW,IAAmB,OAAA,EAA4C;AACxF,EAAA,MAAM,UAAA,GAAa,OAAO,OAAO,CAAA;AACjC,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,MAAM,mBAAA,CAAoB,EAAA,EAAI,WAAW,OAAO,CAAA,EAAG,CAAC,EAAE,CAAC,CAAA;AAC9E,EAAA,MAAM,UAAA,GAAa,OAA4B,IAAI,CAAA;AACnD,EAAA,MAAM,GAAA,GAAM,WAAA;AAAA,IACV,CAAC,IAAA,KAAS;AACR,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,UAAA,CAAW,OAAA,GAAU,MAAA,CAAO,WAAA,CAAY,IAAI,CAAA;AAAA,MAC9C,CAAA,MAAO;AACL,QAAA,UAAA,CAAW,OAAA,IAAU;AACrB,QAAA,UAAA,CAAW,OAAA,GAAU,IAAA;AAAA,MACvB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,MAAM;AAAA,GACT;AACA,EAAA,OAAO,EAAE,GAAA,EAAK,MAAA,EAAQ,UAAA,EAAY,OAAO,UAAA,EAAW;AACtD;AAEO,SAAS,cAAA,CACd,MAAA,EACA,EAAA,EACA,OAAA,EACY;AACZ,EAAA,MAAM,UAAA,GAAa,OAAO,OAAO,CAAA;AACjC,EAAA,MAAM,UAAA,GAAa,OAA4B,IAAI,CAAA;AACnD,EAAA,OAAO,WAAA;AAAA,IACL,CAAC,IAAA,KAAS;AACR,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,UAAA,CAAW,UAAU,MAAA,CAAO,UAAA,CAAW,EAAA,EAAI,IAAA,EAAM,WAAW,OAAO,CAAA;AAAA,MACrE,CAAA,MAAO;AACL,QAAA,UAAA,CAAW,OAAA,IAAU;AACrB,QAAA,UAAA,CAAW,OAAA,GAAU,IAAA;AAAA,MACvB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,QAAQ,EAAE;AAAA,GACb;AACF","file":"react.js","sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState, useSyncExternalStore } from 'react'\nimport { createWindowManager } from '../core/manager'\nimport type { ManagerOptions, ManagerState, WindowManager, WindowState } from '../core/types'\nimport { createDesktopBinder, type DesktopBinder } from '../dom/binder'\nimport type { DesktopController, DesktopOptions, WindowAttachOptions } from '../dom/shared'\n\nexport type ElementRef = (node: HTMLElement | null) => void\n\nexport function useWindowManager(options?: ManagerOptions): WindowManager {\n const [wm] = useState(() => createWindowManager(options))\n useEffect(() => () => wm.destroy(), [wm])\n return wm\n}\n\nexport function useWmState(wm: WindowManager): ManagerState {\n return useSyncExternalStore(wm.subscribe, wm.getState, wm.getState)\n}\n\nexport function useWmWindow(wm: WindowManager, id: string): WindowState | undefined {\n const getSnapshot = useCallback(() => wm.get(id), [wm, id])\n return useSyncExternalStore(wm.subscribe, getSnapshot, getSnapshot)\n}\n\nexport interface UseDesktopResult {\n ref: ElementRef\n binder: DesktopBinder\n controller(): DesktopController | null\n}\n\nexport function useDesktop(wm: WindowManager, options?: DesktopOptions): UseDesktopResult {\n const optionsRef = useRef(options)\n const binder = useMemo(() => createDesktopBinder(wm, optionsRef.current), [wm])\n const cleanupRef = useRef<(() => void) | null>(null)\n const ref = useCallback<ElementRef>(\n (node) => {\n if (node) {\n cleanupRef.current = binder.bindDesktop(node)\n } else {\n cleanupRef.current?.()\n cleanupRef.current = null\n }\n },\n [binder],\n )\n return { ref, binder, controller: binder.controller }\n}\n\nexport function useWmWindowRef(\n binder: DesktopBinder,\n id: string,\n options?: WindowAttachOptions,\n): ElementRef {\n const optionsRef = useRef(options)\n const cleanupRef = useRef<(() => void) | null>(null)\n return useCallback<ElementRef>(\n (node) => {\n if (node) {\n cleanupRef.current = binder.bindWindow(id, node, optionsRef.current)\n } else {\n cleanupRef.current?.()\n cleanupRef.current = null\n }\n },\n [binder, id],\n )\n}\n"]}
1
+ {"version":3,"sources":["../src/adapters/react.ts"],"names":[],"mappings":";;;AAQO,SAAS,iBAAiB,OAAA,EAAyC;AACxE,EAAA,MAAM,CAAC,EAAE,CAAA,GAAI,SAAS,MAAM,mBAAA,CAAoB,OAAO,CAAC,CAAA;AACxD,EAAA,SAAA,CAAU,MAAM,MAAM,EAAA,CAAG,SAAQ,EAAG,CAAC,EAAE,CAAC,CAAA;AACxC,EAAA,OAAO,EAAA;AACT;AAEO,SAAS,WAAW,EAAA,EAAiC;AAC1D,EAAA,OAAO,qBAAqB,EAAA,CAAG,SAAA,EAAW,EAAA,CAAG,QAAA,EAAU,GAAG,QAAQ,CAAA;AACpE;AAEO,SAAS,WAAA,CAAY,IAAmB,EAAA,EAAqC;AAClF,EAAA,MAAM,WAAA,GAAc,WAAA,CAAY,MAAM,EAAA,CAAG,GAAA,CAAI,EAAE,CAAA,EAAG,CAAC,EAAA,EAAI,EAAE,CAAC,CAAA;AAC1D,EAAA,OAAO,oBAAA,CAAqB,EAAA,CAAG,SAAA,EAAW,WAAA,EAAa,WAAW,CAAA;AACpE;AAQO,SAAS,UAAA,CAAW,IAAmB,OAAA,EAA4C;AACxF,EAAA,MAAM,UAAA,GAAa,OAAO,OAAO,CAAA;AACjC,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,MAAM,mBAAA,CAAoB,EAAA,EAAI,WAAW,OAAO,CAAA,EAAG,CAAC,EAAE,CAAC,CAAA;AAC9E,EAAA,SAAA,CAAU,MAAM,MAAM,MAAA,CAAO,SAAQ,EAAG,CAAC,MAAM,CAAC,CAAA;AAChD,EAAA,MAAM,UAAA,GAAa,OAA4B,IAAI,CAAA;AACnD,EAAA,MAAM,GAAA,GAAM,WAAA;AAAA,IACV,CAAC,IAAA,KAAS;AACR,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,UAAA,CAAW,OAAA,GAAU,MAAA,CAAO,WAAA,CAAY,IAAI,CAAA;AAAA,MAC9C,CAAA,MAAO;AACL,QAAA,UAAA,CAAW,OAAA,IAAU;AACrB,QAAA,UAAA,CAAW,OAAA,GAAU,IAAA;AAAA,MACvB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,MAAM;AAAA,GACT;AACA,EAAA,OAAO,EAAE,GAAA,EAAK,MAAA,EAAQ,UAAA,EAAY,OAAO,UAAA,EAAW;AACtD;AAEO,SAAS,cAAA,CACd,MAAA,EACA,EAAA,EACA,OAAA,EACY;AACZ,EAAA,MAAM,UAAA,GAAa,OAAO,OAAO,CAAA;AACjC,EAAA,MAAM,UAAA,GAAa,OAA4B,IAAI,CAAA;AACnD,EAAA,OAAO,WAAA;AAAA,IACL,CAAC,IAAA,KAAS;AACR,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,UAAA,CAAW,UAAU,MAAA,CAAO,UAAA,CAAW,EAAA,EAAI,IAAA,EAAM,WAAW,OAAO,CAAA;AAAA,MACrE,CAAA,MAAO;AACL,QAAA,UAAA,CAAW,OAAA,IAAU;AACrB,QAAA,UAAA,CAAW,OAAA,GAAU,IAAA;AAAA,MACvB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,QAAQ,EAAE;AAAA,GACb;AACF","file":"react.js","sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState, useSyncExternalStore } from 'react'\nimport { createWindowManager } from '../core/manager'\nimport type { ManagerOptions, ManagerState, WindowManager, WindowState } from '../core/types'\nimport { createDesktopBinder, type DesktopBinder } from '../dom/binder'\nimport type { DesktopController, DesktopOptions, WindowAttachOptions } from '../dom/shared'\n\nexport type ElementRef = (node: HTMLElement | null) => void\n\nexport function useWindowManager(options?: ManagerOptions): WindowManager {\n const [wm] = useState(() => createWindowManager(options))\n useEffect(() => () => wm.destroy(), [wm])\n return wm\n}\n\nexport function useWmState(wm: WindowManager): ManagerState {\n return useSyncExternalStore(wm.subscribe, wm.getState, wm.getState)\n}\n\nexport function useWmWindow(wm: WindowManager, id: string): WindowState | undefined {\n const getSnapshot = useCallback(() => wm.get(id), [wm, id])\n return useSyncExternalStore(wm.subscribe, getSnapshot, getSnapshot)\n}\n\nexport interface UseDesktopResult {\n ref: ElementRef\n binder: DesktopBinder\n controller(): DesktopController | null\n}\n\nexport function useDesktop(wm: WindowManager, options?: DesktopOptions): UseDesktopResult {\n const optionsRef = useRef(options)\n const binder = useMemo(() => createDesktopBinder(wm, optionsRef.current), [wm])\n useEffect(() => () => binder.destroy(), [binder])\n const cleanupRef = useRef<(() => void) | null>(null)\n const ref = useCallback<ElementRef>(\n (node) => {\n if (node) {\n cleanupRef.current = binder.bindDesktop(node)\n } else {\n cleanupRef.current?.()\n cleanupRef.current = null\n }\n },\n [binder],\n )\n return { ref, binder, controller: binder.controller }\n}\n\nexport function useWmWindowRef(\n binder: DesktopBinder,\n id: string,\n options?: WindowAttachOptions,\n): ElementRef {\n const optionsRef = useRef(options)\n const cleanupRef = useRef<(() => void) | null>(null)\n return useCallback<ElementRef>(\n (node) => {\n if (node) {\n cleanupRef.current = binder.bindWindow(id, node, optionsRef.current)\n } else {\n cleanupRef.current?.()\n cleanupRef.current = null\n }\n },\n [binder, id],\n )\n}\n"]}
package/dist/solid.cjs CHANGED
@@ -1,13 +1,13 @@
1
1
  'use strict';
2
2
 
3
- var chunkKQCVZ2W7_cjs = require('./chunk-KQCVZ2W7.cjs');
3
+ var chunk3KZZOLHW_cjs = require('./chunk-3KZZOLHW.cjs');
4
4
  var solidJs = require('solid-js');
5
5
 
6
6
  function disposeWithOwner(dispose) {
7
7
  if (solidJs.getOwner()) solidJs.onCleanup(dispose);
8
8
  }
9
9
  function useWindowManager(options) {
10
- const wm = chunkKQCVZ2W7_cjs.createWindowManager(options);
10
+ const wm = chunk3KZZOLHW_cjs.createWindowManager(options);
11
11
  disposeWithOwner(() => wm.destroy());
12
12
  return wm;
13
13
  }
@@ -21,7 +21,8 @@ function useWmWindow(wm, id) {
21
21
  return () => state().windows[typeof id === "function" ? id() : id];
22
22
  }
23
23
  function createDesktop(wm, options) {
24
- const binder = chunkKQCVZ2W7_cjs.createDesktopBinder(wm, options);
24
+ const binder = chunk3KZZOLHW_cjs.createDesktopBinder(wm, options);
25
+ disposeWithOwner(() => binder.destroy());
25
26
  return {
26
27
  binder,
27
28
  desktop(element) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/adapters/solid.ts"],"names":["getOwner","onCleanup","createWindowManager","createSignal","createDesktopBinder","options"],"mappings":";;;;;AAMA,SAAS,iBAAiB,OAAA,EAA2B;AACnD,EAAA,IAAIA,gBAAA,EAAS,EAAGC,iBAAA,CAAU,OAAO,CAAA;AACnC;AAEO,SAAS,iBAAiB,OAAA,EAAyC;AACxE,EAAA,MAAM,EAAA,GAAKC,sCAAoB,OAAO,CAAA;AACtC,EAAA,gBAAA,CAAiB,MAAM,EAAA,CAAG,OAAA,EAAS,CAAA;AACnC,EAAA,OAAO,EAAA;AACT;AAEO,SAAS,WAAW,EAAA,EAA2C;AACpE,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,IAAIC,oBAAA,CAAa,EAAA,CAAG,UAAU,CAAA;AACpD,EAAA,gBAAA,CAAiB,GAAG,SAAA,CAAU,CAAC,SAAS,QAAA,CAAS,IAAI,CAAC,CAAC,CAAA;AACvD,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,WAAA,CACd,IACA,EAAA,EACmC;AACnC,EAAA,MAAM,KAAA,GAAQ,WAAW,EAAE,CAAA;AAC3B,EAAA,OAAO,MAAM,OAAM,CAAE,OAAA,CAAQ,OAAO,EAAA,KAAO,UAAA,GAAa,EAAA,EAAG,GAAI,EAAE,CAAA;AACnE;AAQO,SAAS,aAAA,CAAc,IAAmB,OAAA,EAAwC;AACvF,EAAA,MAAM,MAAA,GAASC,qCAAA,CAAoB,EAAA,EAAI,OAAO,CAAA;AAC9C,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,QAAQ,OAAA,EAAS;AACf,MAAA,MAAM,MAAA,GAAS,MAAA,CAAO,WAAA,CAAY,OAAO,CAAA;AACzC,MAAA,gBAAA,CAAiB,MAAM,CAAA;AAAA,IACzB,CAAA;AAAA,IACA,MAAA,CAAO,IAAIC,QAAAA,EAAS;AAClB,MAAA,OAAO,CAAC,OAAA,KAAY;AAClB,QAAA,MAAM,MAAA,GAAS,MAAA,CAAO,UAAA,CAAW,EAAA,EAAI,SAASA,QAAO,CAAA;AACrD,QAAA,gBAAA,CAAiB,MAAM,CAAA;AAAA,MACzB,CAAA;AAAA,IACF;AAAA,GACF;AACF","file":"solid.cjs","sourcesContent":["import { type Accessor, createSignal, getOwner, onCleanup } from 'solid-js'\nimport { createWindowManager } from '../core/manager'\nimport type { ManagerOptions, ManagerState, WindowManager, WindowState } from '../core/types'\nimport { createDesktopBinder, type DesktopBinder } from '../dom/binder'\nimport type { DesktopOptions, WindowAttachOptions } from '../dom/shared'\n\nfunction disposeWithOwner(dispose: () => void): void {\n if (getOwner()) onCleanup(dispose)\n}\n\nexport function useWindowManager(options?: ManagerOptions): WindowManager {\n const wm = createWindowManager(options)\n disposeWithOwner(() => wm.destroy())\n return wm\n}\n\nexport function useWmState(wm: WindowManager): Accessor<ManagerState> {\n const [state, setState] = createSignal(wm.getState())\n disposeWithOwner(wm.subscribe((next) => setState(next)))\n return state\n}\n\nexport function useWmWindow(\n wm: WindowManager,\n id: string | Accessor<string>,\n): Accessor<WindowState | undefined> {\n const state = useWmState(wm)\n return () => state().windows[typeof id === 'function' ? id() : id]\n}\n\nexport interface SolidDesktop {\n binder: DesktopBinder\n desktop(element: HTMLElement): void\n window(id: string, options?: WindowAttachOptions): (element: HTMLElement) => void\n}\n\nexport function createDesktop(wm: WindowManager, options?: DesktopOptions): SolidDesktop {\n const binder = createDesktopBinder(wm, options)\n return {\n binder,\n desktop(element) {\n const unbind = binder.bindDesktop(element)\n disposeWithOwner(unbind)\n },\n window(id, options) {\n return (element) => {\n const unbind = binder.bindWindow(id, element, options)\n disposeWithOwner(unbind)\n }\n },\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/adapters/solid.ts"],"names":["getOwner","onCleanup","createWindowManager","createSignal","createDesktopBinder","options"],"mappings":";;;;;AAMA,SAAS,iBAAiB,OAAA,EAA2B;AACnD,EAAA,IAAIA,gBAAA,EAAS,EAAGC,iBAAA,CAAU,OAAO,CAAA;AACnC;AAEO,SAAS,iBAAiB,OAAA,EAAyC;AACxE,EAAA,MAAM,EAAA,GAAKC,sCAAoB,OAAO,CAAA;AACtC,EAAA,gBAAA,CAAiB,MAAM,EAAA,CAAG,OAAA,EAAS,CAAA;AACnC,EAAA,OAAO,EAAA;AACT;AAEO,SAAS,WAAW,EAAA,EAA2C;AACpE,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,IAAIC,oBAAA,CAAa,EAAA,CAAG,UAAU,CAAA;AACpD,EAAA,gBAAA,CAAiB,GAAG,SAAA,CAAU,CAAC,SAAS,QAAA,CAAS,IAAI,CAAC,CAAC,CAAA;AACvD,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,WAAA,CACd,IACA,EAAA,EACmC;AACnC,EAAA,MAAM,KAAA,GAAQ,WAAW,EAAE,CAAA;AAC3B,EAAA,OAAO,MAAM,OAAM,CAAE,OAAA,CAAQ,OAAO,EAAA,KAAO,UAAA,GAAa,EAAA,EAAG,GAAI,EAAE,CAAA;AACnE;AAQO,SAAS,aAAA,CAAc,IAAmB,OAAA,EAAwC;AACvF,EAAA,MAAM,MAAA,GAASC,qCAAA,CAAoB,EAAA,EAAI,OAAO,CAAA;AAC9C,EAAA,gBAAA,CAAiB,MAAM,MAAA,CAAO,OAAA,EAAS,CAAA;AACvC,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,QAAQ,OAAA,EAAS;AACf,MAAA,MAAM,MAAA,GAAS,MAAA,CAAO,WAAA,CAAY,OAAO,CAAA;AACzC,MAAA,gBAAA,CAAiB,MAAM,CAAA;AAAA,IACzB,CAAA;AAAA,IACA,MAAA,CAAO,IAAIC,QAAAA,EAAS;AAClB,MAAA,OAAO,CAAC,OAAA,KAAY;AAClB,QAAA,MAAM,MAAA,GAAS,MAAA,CAAO,UAAA,CAAW,EAAA,EAAI,SAASA,QAAO,CAAA;AACrD,QAAA,gBAAA,CAAiB,MAAM,CAAA;AAAA,MACzB,CAAA;AAAA,IACF;AAAA,GACF;AACF","file":"solid.cjs","sourcesContent":["import { type Accessor, createSignal, getOwner, onCleanup } from 'solid-js'\nimport { createWindowManager } from '../core/manager'\nimport type { ManagerOptions, ManagerState, WindowManager, WindowState } from '../core/types'\nimport { createDesktopBinder, type DesktopBinder } from '../dom/binder'\nimport type { DesktopOptions, WindowAttachOptions } from '../dom/shared'\n\nfunction disposeWithOwner(dispose: () => void): void {\n if (getOwner()) onCleanup(dispose)\n}\n\nexport function useWindowManager(options?: ManagerOptions): WindowManager {\n const wm = createWindowManager(options)\n disposeWithOwner(() => wm.destroy())\n return wm\n}\n\nexport function useWmState(wm: WindowManager): Accessor<ManagerState> {\n const [state, setState] = createSignal(wm.getState())\n disposeWithOwner(wm.subscribe((next) => setState(next)))\n return state\n}\n\nexport function useWmWindow(\n wm: WindowManager,\n id: string | Accessor<string>,\n): Accessor<WindowState | undefined> {\n const state = useWmState(wm)\n return () => state().windows[typeof id === 'function' ? id() : id]\n}\n\nexport interface SolidDesktop {\n binder: DesktopBinder\n desktop(element: HTMLElement): void\n window(id: string, options?: WindowAttachOptions): (element: HTMLElement) => void\n}\n\nexport function createDesktop(wm: WindowManager, options?: DesktopOptions): SolidDesktop {\n const binder = createDesktopBinder(wm, options)\n disposeWithOwner(() => binder.destroy())\n return {\n binder,\n desktop(element) {\n const unbind = binder.bindDesktop(element)\n disposeWithOwner(unbind)\n },\n window(id, options) {\n return (element) => {\n const unbind = binder.bindWindow(id, element, options)\n disposeWithOwner(unbind)\n }\n },\n }\n}\n"]}
package/dist/solid.d.cts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { Accessor } from 'solid-js';
2
- import { W as WindowManager, M as ManagerOptions, a as ManagerState, b as WindowState } from './types-Bkrq2djr.cjs';
3
- import { D as DesktopBinder, W as WindowAttachOptions, b as DesktopOptions } from './binder-BY-saDUB.cjs';
2
+ import { W as WindowManager, M as ManagerOptions, a as ManagerState, b as WindowState } from './types-t6pyVYKN.cjs';
3
+ import { D as DesktopBinder, W as WindowAttachOptions, a as DesktopOptions } from './binder-Dl07SXIM.cjs';
4
4
 
5
5
  declare function useWindowManager(options?: ManagerOptions): WindowManager;
6
6
  declare function useWmState(wm: WindowManager): Accessor<ManagerState>;
package/dist/solid.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { Accessor } from 'solid-js';
2
- import { W as WindowManager, M as ManagerOptions, a as ManagerState, b as WindowState } from './types-Bkrq2djr.js';
3
- import { D as DesktopBinder, W as WindowAttachOptions, b as DesktopOptions } from './binder-D9UEE1SM.js';
2
+ import { W as WindowManager, M as ManagerOptions, a as ManagerState, b as WindowState } from './types-t6pyVYKN.js';
3
+ import { D as DesktopBinder, W as WindowAttachOptions, a as DesktopOptions } from './binder-B2A2IZGh.js';
4
4
 
5
5
  declare function useWindowManager(options?: ManagerOptions): WindowManager;
6
6
  declare function useWmState(wm: WindowManager): Accessor<ManagerState>;
package/dist/solid.js CHANGED
@@ -1,4 +1,4 @@
1
- import { createWindowManager, createDesktopBinder } from './chunk-2TVOEDRG.js';
1
+ import { createWindowManager, createDesktopBinder } from './chunk-FPZDAKNP.js';
2
2
  import { createSignal, getOwner, onCleanup } from 'solid-js';
3
3
 
4
4
  function disposeWithOwner(dispose) {
@@ -20,6 +20,7 @@ function useWmWindow(wm, id) {
20
20
  }
21
21
  function createDesktop(wm, options) {
22
22
  const binder = createDesktopBinder(wm, options);
23
+ disposeWithOwner(() => binder.destroy());
23
24
  return {
24
25
  binder,
25
26
  desktop(element) {
package/dist/solid.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/adapters/solid.ts"],"names":["options"],"mappings":";;;AAMA,SAAS,iBAAiB,OAAA,EAA2B;AACnD,EAAA,IAAI,QAAA,EAAS,EAAG,SAAA,CAAU,OAAO,CAAA;AACnC;AAEO,SAAS,iBAAiB,OAAA,EAAyC;AACxE,EAAA,MAAM,EAAA,GAAK,oBAAoB,OAAO,CAAA;AACtC,EAAA,gBAAA,CAAiB,MAAM,EAAA,CAAG,OAAA,EAAS,CAAA;AACnC,EAAA,OAAO,EAAA;AACT;AAEO,SAAS,WAAW,EAAA,EAA2C;AACpE,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,IAAI,YAAA,CAAa,EAAA,CAAG,UAAU,CAAA;AACpD,EAAA,gBAAA,CAAiB,GAAG,SAAA,CAAU,CAAC,SAAS,QAAA,CAAS,IAAI,CAAC,CAAC,CAAA;AACvD,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,WAAA,CACd,IACA,EAAA,EACmC;AACnC,EAAA,MAAM,KAAA,GAAQ,WAAW,EAAE,CAAA;AAC3B,EAAA,OAAO,MAAM,OAAM,CAAE,OAAA,CAAQ,OAAO,EAAA,KAAO,UAAA,GAAa,EAAA,EAAG,GAAI,EAAE,CAAA;AACnE;AAQO,SAAS,aAAA,CAAc,IAAmB,OAAA,EAAwC;AACvF,EAAA,MAAM,MAAA,GAAS,mBAAA,CAAoB,EAAA,EAAI,OAAO,CAAA;AAC9C,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,QAAQ,OAAA,EAAS;AACf,MAAA,MAAM,MAAA,GAAS,MAAA,CAAO,WAAA,CAAY,OAAO,CAAA;AACzC,MAAA,gBAAA,CAAiB,MAAM,CAAA;AAAA,IACzB,CAAA;AAAA,IACA,MAAA,CAAO,IAAIA,QAAAA,EAAS;AAClB,MAAA,OAAO,CAAC,OAAA,KAAY;AAClB,QAAA,MAAM,MAAA,GAAS,MAAA,CAAO,UAAA,CAAW,EAAA,EAAI,SAASA,QAAO,CAAA;AACrD,QAAA,gBAAA,CAAiB,MAAM,CAAA;AAAA,MACzB,CAAA;AAAA,IACF;AAAA,GACF;AACF","file":"solid.js","sourcesContent":["import { type Accessor, createSignal, getOwner, onCleanup } from 'solid-js'\nimport { createWindowManager } from '../core/manager'\nimport type { ManagerOptions, ManagerState, WindowManager, WindowState } from '../core/types'\nimport { createDesktopBinder, type DesktopBinder } from '../dom/binder'\nimport type { DesktopOptions, WindowAttachOptions } from '../dom/shared'\n\nfunction disposeWithOwner(dispose: () => void): void {\n if (getOwner()) onCleanup(dispose)\n}\n\nexport function useWindowManager(options?: ManagerOptions): WindowManager {\n const wm = createWindowManager(options)\n disposeWithOwner(() => wm.destroy())\n return wm\n}\n\nexport function useWmState(wm: WindowManager): Accessor<ManagerState> {\n const [state, setState] = createSignal(wm.getState())\n disposeWithOwner(wm.subscribe((next) => setState(next)))\n return state\n}\n\nexport function useWmWindow(\n wm: WindowManager,\n id: string | Accessor<string>,\n): Accessor<WindowState | undefined> {\n const state = useWmState(wm)\n return () => state().windows[typeof id === 'function' ? id() : id]\n}\n\nexport interface SolidDesktop {\n binder: DesktopBinder\n desktop(element: HTMLElement): void\n window(id: string, options?: WindowAttachOptions): (element: HTMLElement) => void\n}\n\nexport function createDesktop(wm: WindowManager, options?: DesktopOptions): SolidDesktop {\n const binder = createDesktopBinder(wm, options)\n return {\n binder,\n desktop(element) {\n const unbind = binder.bindDesktop(element)\n disposeWithOwner(unbind)\n },\n window(id, options) {\n return (element) => {\n const unbind = binder.bindWindow(id, element, options)\n disposeWithOwner(unbind)\n }\n },\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/adapters/solid.ts"],"names":["options"],"mappings":";;;AAMA,SAAS,iBAAiB,OAAA,EAA2B;AACnD,EAAA,IAAI,QAAA,EAAS,EAAG,SAAA,CAAU,OAAO,CAAA;AACnC;AAEO,SAAS,iBAAiB,OAAA,EAAyC;AACxE,EAAA,MAAM,EAAA,GAAK,oBAAoB,OAAO,CAAA;AACtC,EAAA,gBAAA,CAAiB,MAAM,EAAA,CAAG,OAAA,EAAS,CAAA;AACnC,EAAA,OAAO,EAAA;AACT;AAEO,SAAS,WAAW,EAAA,EAA2C;AACpE,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,IAAI,YAAA,CAAa,EAAA,CAAG,UAAU,CAAA;AACpD,EAAA,gBAAA,CAAiB,GAAG,SAAA,CAAU,CAAC,SAAS,QAAA,CAAS,IAAI,CAAC,CAAC,CAAA;AACvD,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,WAAA,CACd,IACA,EAAA,EACmC;AACnC,EAAA,MAAM,KAAA,GAAQ,WAAW,EAAE,CAAA;AAC3B,EAAA,OAAO,MAAM,OAAM,CAAE,OAAA,CAAQ,OAAO,EAAA,KAAO,UAAA,GAAa,EAAA,EAAG,GAAI,EAAE,CAAA;AACnE;AAQO,SAAS,aAAA,CAAc,IAAmB,OAAA,EAAwC;AACvF,EAAA,MAAM,MAAA,GAAS,mBAAA,CAAoB,EAAA,EAAI,OAAO,CAAA;AAC9C,EAAA,gBAAA,CAAiB,MAAM,MAAA,CAAO,OAAA,EAAS,CAAA;AACvC,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,QAAQ,OAAA,EAAS;AACf,MAAA,MAAM,MAAA,GAAS,MAAA,CAAO,WAAA,CAAY,OAAO,CAAA;AACzC,MAAA,gBAAA,CAAiB,MAAM,CAAA;AAAA,IACzB,CAAA;AAAA,IACA,MAAA,CAAO,IAAIA,QAAAA,EAAS;AAClB,MAAA,OAAO,CAAC,OAAA,KAAY;AAClB,QAAA,MAAM,MAAA,GAAS,MAAA,CAAO,UAAA,CAAW,EAAA,EAAI,SAASA,QAAO,CAAA;AACrD,QAAA,gBAAA,CAAiB,MAAM,CAAA;AAAA,MACzB,CAAA;AAAA,IACF;AAAA,GACF;AACF","file":"solid.js","sourcesContent":["import { type Accessor, createSignal, getOwner, onCleanup } from 'solid-js'\nimport { createWindowManager } from '../core/manager'\nimport type { ManagerOptions, ManagerState, WindowManager, WindowState } from '../core/types'\nimport { createDesktopBinder, type DesktopBinder } from '../dom/binder'\nimport type { DesktopOptions, WindowAttachOptions } from '../dom/shared'\n\nfunction disposeWithOwner(dispose: () => void): void {\n if (getOwner()) onCleanup(dispose)\n}\n\nexport function useWindowManager(options?: ManagerOptions): WindowManager {\n const wm = createWindowManager(options)\n disposeWithOwner(() => wm.destroy())\n return wm\n}\n\nexport function useWmState(wm: WindowManager): Accessor<ManagerState> {\n const [state, setState] = createSignal(wm.getState())\n disposeWithOwner(wm.subscribe((next) => setState(next)))\n return state\n}\n\nexport function useWmWindow(\n wm: WindowManager,\n id: string | Accessor<string>,\n): Accessor<WindowState | undefined> {\n const state = useWmState(wm)\n return () => state().windows[typeof id === 'function' ? id() : id]\n}\n\nexport interface SolidDesktop {\n binder: DesktopBinder\n desktop(element: HTMLElement): void\n window(id: string, options?: WindowAttachOptions): (element: HTMLElement) => void\n}\n\nexport function createDesktop(wm: WindowManager, options?: DesktopOptions): SolidDesktop {\n const binder = createDesktopBinder(wm, options)\n disposeWithOwner(() => binder.destroy())\n return {\n binder,\n desktop(element) {\n const unbind = binder.bindDesktop(element)\n disposeWithOwner(unbind)\n },\n window(id, options) {\n return (element) => {\n const unbind = binder.bindWindow(id, element, options)\n disposeWithOwner(unbind)\n }\n },\n }\n}\n"]}
package/dist/svelte.cjs CHANGED
@@ -1,10 +1,10 @@
1
1
  'use strict';
2
2
 
3
- var chunkKQCVZ2W7_cjs = require('./chunk-KQCVZ2W7.cjs');
3
+ var chunk3KZZOLHW_cjs = require('./chunk-3KZZOLHW.cjs');
4
4
 
5
5
  // src/adapters/svelte.ts
6
6
  function createManager(options) {
7
- return chunkKQCVZ2W7_cjs.createWindowManager(options);
7
+ return chunk3KZZOLHW_cjs.createWindowManager(options);
8
8
  }
9
9
  function wmStore(wm) {
10
10
  return {
@@ -30,18 +30,21 @@ function wmWindowStore(wm, id) {
30
30
  };
31
31
  }
32
32
  function createDesktop(wm, options) {
33
- const binder = chunkKQCVZ2W7_cjs.createDesktopBinder(wm, options);
33
+ const binder = chunk3KZZOLHW_cjs.createDesktopBinder(wm, options);
34
34
  return {
35
35
  binder,
36
36
  desktop(node) {
37
- const unbind = binder.bindDesktop(node);
38
- return { destroy: unbind };
37
+ binder.bindDesktop(node);
38
+ return { destroy: () => binder.destroy() };
39
39
  },
40
40
  window(node, params) {
41
+ let bound = params.id;
41
42
  let unbind = binder.bindWindow(params.id, node, params);
42
43
  return {
43
44
  update(next) {
45
+ if (next.id === bound) return;
44
46
  unbind();
47
+ bound = next.id;
45
48
  unbind = binder.bindWindow(next.id, node, next);
46
49
  },
47
50
  destroy() {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/adapters/svelte.ts"],"names":["createWindowManager","createDesktopBinder"],"mappings":";;;;;AAkBO,SAAS,cAAc,OAAA,EAAyC;AACrE,EAAA,OAAOA,sCAAoB,OAAO,CAAA;AACpC;AAEO,SAAS,QAAQ,EAAA,EAAgD;AACtE,EAAA,OAAO;AAAA,IACL,UAAU,GAAA,EAAK;AACb,MAAA,GAAA,CAAI,EAAA,CAAG,UAAU,CAAA;AACjB,MAAA,OAAO,EAAA,CAAG,UAAU,GAAG,CAAA;AAAA,IACzB;AAAA,GACF;AACF;AAEO,SAAS,aAAA,CACd,IACA,EAAA,EACwC;AACxC,EAAA,OAAO;AAAA,IACL,UAAU,GAAA,EAAK;AACb,MAAA,GAAA,CAAI,EAAA,CAAG,GAAA,CAAI,EAAE,CAAC,CAAA;AACd,MAAA,IAAI,IAAA,GAAO,EAAA,CAAG,GAAA,CAAI,EAAE,CAAA;AACpB,MAAA,OAAO,EAAA,CAAG,UAAU,MAAM;AACxB,QAAA,MAAM,IAAA,GAAO,EAAA,CAAG,GAAA,CAAI,EAAE,CAAA;AACtB,QAAA,IAAI,SAAS,IAAA,EAAM;AACjB,UAAA,IAAA,GAAO,IAAA;AACP,UAAA,GAAA,CAAI,IAAI,CAAA;AAAA,QACV;AAAA,MACF,CAAC,CAAA;AAAA,IACH;AAAA,GACF;AACF;AAQO,SAAS,aAAA,CAAc,IAAmB,OAAA,EAAyC;AACxF,EAAA,MAAM,MAAA,GAASC,qCAAA,CAAoB,EAAA,EAAI,OAAO,CAAA;AAC9C,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,QAAQ,IAAA,EAAM;AACZ,MAAA,MAAM,MAAA,GAAS,MAAA,CAAO,WAAA,CAAY,IAAI,CAAA;AACtC,MAAA,OAAO,EAAE,SAAS,MAAA,EAAO;AAAA,IAC3B,CAAA;AAAA,IACA,MAAA,CAAO,MAAM,MAAA,EAAQ;AACnB,MAAA,IAAI,SAAS,MAAA,CAAO,UAAA,CAAW,MAAA,CAAO,EAAA,EAAI,MAAM,MAAM,CAAA;AACtD,MAAA,OAAO;AAAA,QACL,OAAO,IAAA,EAAM;AACX,UAAA,MAAA,EAAO;AACP,UAAA,MAAA,GAAS,MAAA,CAAO,UAAA,CAAW,IAAA,CAAK,EAAA,EAAI,MAAM,IAAI,CAAA;AAAA,QAChD,CAAA;AAAA,QACA,OAAA,GAAU;AACR,UAAA,MAAA,EAAO;AAAA,QACT;AAAA,OACF;AAAA,IACF;AAAA,GACF;AACF","file":"svelte.cjs","sourcesContent":["import { createWindowManager } from '../core/manager'\nimport type { ManagerOptions, ManagerState, WindowManager, WindowState } from '../core/types'\nimport { createDesktopBinder, type DesktopBinder } from '../dom/binder'\nimport type { DesktopOptions, WindowAttachOptions } from '../dom/shared'\n\nexport interface ReadableStore<T> {\n subscribe(run: (value: T) => void): () => void\n}\n\nexport interface ActionResult {\n update?(params: WindowActionParams): void\n destroy(): void\n}\n\nexport interface WindowActionParams extends WindowAttachOptions {\n id: string\n}\n\nexport function createManager(options?: ManagerOptions): WindowManager {\n return createWindowManager(options)\n}\n\nexport function wmStore(wm: WindowManager): ReadableStore<ManagerState> {\n return {\n subscribe(run) {\n run(wm.getState())\n return wm.subscribe(run)\n },\n }\n}\n\nexport function wmWindowStore(\n wm: WindowManager,\n id: string,\n): ReadableStore<WindowState | undefined> {\n return {\n subscribe(run) {\n run(wm.get(id))\n let last = wm.get(id)\n return wm.subscribe(() => {\n const next = wm.get(id)\n if (next !== last) {\n last = next\n run(next)\n }\n })\n },\n }\n}\n\nexport interface SvelteDesktop {\n binder: DesktopBinder\n desktop(node: HTMLElement): ActionResult\n window(node: HTMLElement, params: WindowActionParams): ActionResult\n}\n\nexport function createDesktop(wm: WindowManager, options?: DesktopOptions): SvelteDesktop {\n const binder = createDesktopBinder(wm, options)\n return {\n binder,\n desktop(node) {\n const unbind = binder.bindDesktop(node)\n return { destroy: unbind }\n },\n window(node, params) {\n let unbind = binder.bindWindow(params.id, node, params)\n return {\n update(next) {\n unbind()\n unbind = binder.bindWindow(next.id, node, next)\n },\n destroy() {\n unbind()\n },\n }\n },\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/adapters/svelte.ts"],"names":["createWindowManager","createDesktopBinder"],"mappings":";;;;;AAkBO,SAAS,cAAc,OAAA,EAAyC;AACrE,EAAA,OAAOA,sCAAoB,OAAO,CAAA;AACpC;AAEO,SAAS,QAAQ,EAAA,EAAgD;AACtE,EAAA,OAAO;AAAA,IACL,UAAU,GAAA,EAAK;AACb,MAAA,GAAA,CAAI,EAAA,CAAG,UAAU,CAAA;AACjB,MAAA,OAAO,EAAA,CAAG,UAAU,GAAG,CAAA;AAAA,IACzB;AAAA,GACF;AACF;AAEO,SAAS,aAAA,CACd,IACA,EAAA,EACwC;AACxC,EAAA,OAAO;AAAA,IACL,UAAU,GAAA,EAAK;AACb,MAAA,GAAA,CAAI,EAAA,CAAG,GAAA,CAAI,EAAE,CAAC,CAAA;AACd,MAAA,IAAI,IAAA,GAAO,EAAA,CAAG,GAAA,CAAI,EAAE,CAAA;AACpB,MAAA,OAAO,EAAA,CAAG,UAAU,MAAM;AACxB,QAAA,MAAM,IAAA,GAAO,EAAA,CAAG,GAAA,CAAI,EAAE,CAAA;AACtB,QAAA,IAAI,SAAS,IAAA,EAAM;AACjB,UAAA,IAAA,GAAO,IAAA;AACP,UAAA,GAAA,CAAI,IAAI,CAAA;AAAA,QACV;AAAA,MACF,CAAC,CAAA;AAAA,IACH;AAAA,GACF;AACF;AAQO,SAAS,aAAA,CAAc,IAAmB,OAAA,EAAyC;AACxF,EAAA,MAAM,MAAA,GAASC,qCAAA,CAAoB,EAAA,EAAI,OAAO,CAAA;AAC9C,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,QAAQ,IAAA,EAAM;AACZ,MAAA,MAAA,CAAO,YAAY,IAAI,CAAA;AACvB,MAAA,OAAO,EAAE,OAAA,EAAS,MAAM,MAAA,CAAO,SAAQ,EAAE;AAAA,IAC3C,CAAA;AAAA,IACA,MAAA,CAAO,MAAM,MAAA,EAAQ;AACnB,MAAA,IAAI,QAAQ,MAAA,CAAO,EAAA;AACnB,MAAA,IAAI,SAAS,MAAA,CAAO,UAAA,CAAW,MAAA,CAAO,EAAA,EAAI,MAAM,MAAM,CAAA;AACtD,MAAA,OAAO;AAAA,QACL,OAAO,IAAA,EAAM;AACX,UAAA,IAAI,IAAA,CAAK,OAAO,KAAA,EAAO;AACvB,UAAA,MAAA,EAAO;AACP,UAAA,KAAA,GAAQ,IAAA,CAAK,EAAA;AACb,UAAA,MAAA,GAAS,MAAA,CAAO,UAAA,CAAW,IAAA,CAAK,EAAA,EAAI,MAAM,IAAI,CAAA;AAAA,QAChD,CAAA;AAAA,QACA,OAAA,GAAU;AACR,UAAA,MAAA,EAAO;AAAA,QACT;AAAA,OACF;AAAA,IACF;AAAA,GACF;AACF","file":"svelte.cjs","sourcesContent":["import { createWindowManager } from '../core/manager'\nimport type { ManagerOptions, ManagerState, WindowManager, WindowState } from '../core/types'\nimport { createDesktopBinder, type DesktopBinder } from '../dom/binder'\nimport type { DesktopOptions, WindowAttachOptions } from '../dom/shared'\n\nexport interface ReadableStore<T> {\n subscribe(run: (value: T) => void): () => void\n}\n\nexport interface ActionResult {\n update?(params: WindowActionParams): void\n destroy(): void\n}\n\nexport interface WindowActionParams extends WindowAttachOptions {\n id: string\n}\n\nexport function createManager(options?: ManagerOptions): WindowManager {\n return createWindowManager(options)\n}\n\nexport function wmStore(wm: WindowManager): ReadableStore<ManagerState> {\n return {\n subscribe(run) {\n run(wm.getState())\n return wm.subscribe(run)\n },\n }\n}\n\nexport function wmWindowStore(\n wm: WindowManager,\n id: string,\n): ReadableStore<WindowState | undefined> {\n return {\n subscribe(run) {\n run(wm.get(id))\n let last = wm.get(id)\n return wm.subscribe(() => {\n const next = wm.get(id)\n if (next !== last) {\n last = next\n run(next)\n }\n })\n },\n }\n}\n\nexport interface SvelteDesktop {\n binder: DesktopBinder\n desktop(node: HTMLElement): ActionResult\n window(node: HTMLElement, params: WindowActionParams): ActionResult\n}\n\nexport function createDesktop(wm: WindowManager, options?: DesktopOptions): SvelteDesktop {\n const binder = createDesktopBinder(wm, options)\n return {\n binder,\n desktop(node) {\n binder.bindDesktop(node)\n return { destroy: () => binder.destroy() }\n },\n window(node, params) {\n let bound = params.id\n let unbind = binder.bindWindow(params.id, node, params)\n return {\n update(next) {\n if (next.id === bound) return\n unbind()\n bound = next.id\n unbind = binder.bindWindow(next.id, node, next)\n },\n destroy() {\n unbind()\n },\n }\n },\n }\n}\n"]}
package/dist/svelte.d.cts CHANGED
@@ -1,5 +1,5 @@
1
- import { W as WindowManager, M as ManagerOptions, a as ManagerState, b as WindowState } from './types-Bkrq2djr.cjs';
2
- import { W as WindowAttachOptions, D as DesktopBinder, b as DesktopOptions } from './binder-BY-saDUB.cjs';
1
+ import { W as WindowManager, M as ManagerOptions, a as ManagerState, b as WindowState } from './types-t6pyVYKN.cjs';
2
+ import { W as WindowAttachOptions, D as DesktopBinder, a as DesktopOptions } from './binder-Dl07SXIM.cjs';
3
3
 
4
4
  interface ReadableStore<T> {
5
5
  subscribe(run: (value: T) => void): () => void;
package/dist/svelte.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { W as WindowManager, M as ManagerOptions, a as ManagerState, b as WindowState } from './types-Bkrq2djr.js';
2
- import { W as WindowAttachOptions, D as DesktopBinder, b as DesktopOptions } from './binder-D9UEE1SM.js';
1
+ import { W as WindowManager, M as ManagerOptions, a as ManagerState, b as WindowState } from './types-t6pyVYKN.js';
2
+ import { W as WindowAttachOptions, D as DesktopBinder, a as DesktopOptions } from './binder-B2A2IZGh.js';
3
3
 
4
4
  interface ReadableStore<T> {
5
5
  subscribe(run: (value: T) => void): () => void;
package/dist/svelte.js CHANGED
@@ -1,4 +1,4 @@
1
- import { createWindowManager, createDesktopBinder } from './chunk-2TVOEDRG.js';
1
+ import { createWindowManager, createDesktopBinder } from './chunk-FPZDAKNP.js';
2
2
 
3
3
  // src/adapters/svelte.ts
4
4
  function createManager(options) {
@@ -32,14 +32,17 @@ function createDesktop(wm, options) {
32
32
  return {
33
33
  binder,
34
34
  desktop(node) {
35
- const unbind = binder.bindDesktop(node);
36
- return { destroy: unbind };
35
+ binder.bindDesktop(node);
36
+ return { destroy: () => binder.destroy() };
37
37
  },
38
38
  window(node, params) {
39
+ let bound = params.id;
39
40
  let unbind = binder.bindWindow(params.id, node, params);
40
41
  return {
41
42
  update(next) {
43
+ if (next.id === bound) return;
42
44
  unbind();
45
+ bound = next.id;
43
46
  unbind = binder.bindWindow(next.id, node, next);
44
47
  },
45
48
  destroy() {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/adapters/svelte.ts"],"names":[],"mappings":";;;AAkBO,SAAS,cAAc,OAAA,EAAyC;AACrE,EAAA,OAAO,oBAAoB,OAAO,CAAA;AACpC;AAEO,SAAS,QAAQ,EAAA,EAAgD;AACtE,EAAA,OAAO;AAAA,IACL,UAAU,GAAA,EAAK;AACb,MAAA,GAAA,CAAI,EAAA,CAAG,UAAU,CAAA;AACjB,MAAA,OAAO,EAAA,CAAG,UAAU,GAAG,CAAA;AAAA,IACzB;AAAA,GACF;AACF;AAEO,SAAS,aAAA,CACd,IACA,EAAA,EACwC;AACxC,EAAA,OAAO;AAAA,IACL,UAAU,GAAA,EAAK;AACb,MAAA,GAAA,CAAI,EAAA,CAAG,GAAA,CAAI,EAAE,CAAC,CAAA;AACd,MAAA,IAAI,IAAA,GAAO,EAAA,CAAG,GAAA,CAAI,EAAE,CAAA;AACpB,MAAA,OAAO,EAAA,CAAG,UAAU,MAAM;AACxB,QAAA,MAAM,IAAA,GAAO,EAAA,CAAG,GAAA,CAAI,EAAE,CAAA;AACtB,QAAA,IAAI,SAAS,IAAA,EAAM;AACjB,UAAA,IAAA,GAAO,IAAA;AACP,UAAA,GAAA,CAAI,IAAI,CAAA;AAAA,QACV;AAAA,MACF,CAAC,CAAA;AAAA,IACH;AAAA,GACF;AACF;AAQO,SAAS,aAAA,CAAc,IAAmB,OAAA,EAAyC;AACxF,EAAA,MAAM,MAAA,GAAS,mBAAA,CAAoB,EAAA,EAAI,OAAO,CAAA;AAC9C,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,QAAQ,IAAA,EAAM;AACZ,MAAA,MAAM,MAAA,GAAS,MAAA,CAAO,WAAA,CAAY,IAAI,CAAA;AACtC,MAAA,OAAO,EAAE,SAAS,MAAA,EAAO;AAAA,IAC3B,CAAA;AAAA,IACA,MAAA,CAAO,MAAM,MAAA,EAAQ;AACnB,MAAA,IAAI,SAAS,MAAA,CAAO,UAAA,CAAW,MAAA,CAAO,EAAA,EAAI,MAAM,MAAM,CAAA;AACtD,MAAA,OAAO;AAAA,QACL,OAAO,IAAA,EAAM;AACX,UAAA,MAAA,EAAO;AACP,UAAA,MAAA,GAAS,MAAA,CAAO,UAAA,CAAW,IAAA,CAAK,EAAA,EAAI,MAAM,IAAI,CAAA;AAAA,QAChD,CAAA;AAAA,QACA,OAAA,GAAU;AACR,UAAA,MAAA,EAAO;AAAA,QACT;AAAA,OACF;AAAA,IACF;AAAA,GACF;AACF","file":"svelte.js","sourcesContent":["import { createWindowManager } from '../core/manager'\nimport type { ManagerOptions, ManagerState, WindowManager, WindowState } from '../core/types'\nimport { createDesktopBinder, type DesktopBinder } from '../dom/binder'\nimport type { DesktopOptions, WindowAttachOptions } from '../dom/shared'\n\nexport interface ReadableStore<T> {\n subscribe(run: (value: T) => void): () => void\n}\n\nexport interface ActionResult {\n update?(params: WindowActionParams): void\n destroy(): void\n}\n\nexport interface WindowActionParams extends WindowAttachOptions {\n id: string\n}\n\nexport function createManager(options?: ManagerOptions): WindowManager {\n return createWindowManager(options)\n}\n\nexport function wmStore(wm: WindowManager): ReadableStore<ManagerState> {\n return {\n subscribe(run) {\n run(wm.getState())\n return wm.subscribe(run)\n },\n }\n}\n\nexport function wmWindowStore(\n wm: WindowManager,\n id: string,\n): ReadableStore<WindowState | undefined> {\n return {\n subscribe(run) {\n run(wm.get(id))\n let last = wm.get(id)\n return wm.subscribe(() => {\n const next = wm.get(id)\n if (next !== last) {\n last = next\n run(next)\n }\n })\n },\n }\n}\n\nexport interface SvelteDesktop {\n binder: DesktopBinder\n desktop(node: HTMLElement): ActionResult\n window(node: HTMLElement, params: WindowActionParams): ActionResult\n}\n\nexport function createDesktop(wm: WindowManager, options?: DesktopOptions): SvelteDesktop {\n const binder = createDesktopBinder(wm, options)\n return {\n binder,\n desktop(node) {\n const unbind = binder.bindDesktop(node)\n return { destroy: unbind }\n },\n window(node, params) {\n let unbind = binder.bindWindow(params.id, node, params)\n return {\n update(next) {\n unbind()\n unbind = binder.bindWindow(next.id, node, next)\n },\n destroy() {\n unbind()\n },\n }\n },\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/adapters/svelte.ts"],"names":[],"mappings":";;;AAkBO,SAAS,cAAc,OAAA,EAAyC;AACrE,EAAA,OAAO,oBAAoB,OAAO,CAAA;AACpC;AAEO,SAAS,QAAQ,EAAA,EAAgD;AACtE,EAAA,OAAO;AAAA,IACL,UAAU,GAAA,EAAK;AACb,MAAA,GAAA,CAAI,EAAA,CAAG,UAAU,CAAA;AACjB,MAAA,OAAO,EAAA,CAAG,UAAU,GAAG,CAAA;AAAA,IACzB;AAAA,GACF;AACF;AAEO,SAAS,aAAA,CACd,IACA,EAAA,EACwC;AACxC,EAAA,OAAO;AAAA,IACL,UAAU,GAAA,EAAK;AACb,MAAA,GAAA,CAAI,EAAA,CAAG,GAAA,CAAI,EAAE,CAAC,CAAA;AACd,MAAA,IAAI,IAAA,GAAO,EAAA,CAAG,GAAA,CAAI,EAAE,CAAA;AACpB,MAAA,OAAO,EAAA,CAAG,UAAU,MAAM;AACxB,QAAA,MAAM,IAAA,GAAO,EAAA,CAAG,GAAA,CAAI,EAAE,CAAA;AACtB,QAAA,IAAI,SAAS,IAAA,EAAM;AACjB,UAAA,IAAA,GAAO,IAAA;AACP,UAAA,GAAA,CAAI,IAAI,CAAA;AAAA,QACV;AAAA,MACF,CAAC,CAAA;AAAA,IACH;AAAA,GACF;AACF;AAQO,SAAS,aAAA,CAAc,IAAmB,OAAA,EAAyC;AACxF,EAAA,MAAM,MAAA,GAAS,mBAAA,CAAoB,EAAA,EAAI,OAAO,CAAA;AAC9C,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,QAAQ,IAAA,EAAM;AACZ,MAAA,MAAA,CAAO,YAAY,IAAI,CAAA;AACvB,MAAA,OAAO,EAAE,OAAA,EAAS,MAAM,MAAA,CAAO,SAAQ,EAAE;AAAA,IAC3C,CAAA;AAAA,IACA,MAAA,CAAO,MAAM,MAAA,EAAQ;AACnB,MAAA,IAAI,QAAQ,MAAA,CAAO,EAAA;AACnB,MAAA,IAAI,SAAS,MAAA,CAAO,UAAA,CAAW,MAAA,CAAO,EAAA,EAAI,MAAM,MAAM,CAAA;AACtD,MAAA,OAAO;AAAA,QACL,OAAO,IAAA,EAAM;AACX,UAAA,IAAI,IAAA,CAAK,OAAO,KAAA,EAAO;AACvB,UAAA,MAAA,EAAO;AACP,UAAA,KAAA,GAAQ,IAAA,CAAK,EAAA;AACb,UAAA,MAAA,GAAS,MAAA,CAAO,UAAA,CAAW,IAAA,CAAK,EAAA,EAAI,MAAM,IAAI,CAAA;AAAA,QAChD,CAAA;AAAA,QACA,OAAA,GAAU;AACR,UAAA,MAAA,EAAO;AAAA,QACT;AAAA,OACF;AAAA,IACF;AAAA,GACF;AACF","file":"svelte.js","sourcesContent":["import { createWindowManager } from '../core/manager'\nimport type { ManagerOptions, ManagerState, WindowManager, WindowState } from '../core/types'\nimport { createDesktopBinder, type DesktopBinder } from '../dom/binder'\nimport type { DesktopOptions, WindowAttachOptions } from '../dom/shared'\n\nexport interface ReadableStore<T> {\n subscribe(run: (value: T) => void): () => void\n}\n\nexport interface ActionResult {\n update?(params: WindowActionParams): void\n destroy(): void\n}\n\nexport interface WindowActionParams extends WindowAttachOptions {\n id: string\n}\n\nexport function createManager(options?: ManagerOptions): WindowManager {\n return createWindowManager(options)\n}\n\nexport function wmStore(wm: WindowManager): ReadableStore<ManagerState> {\n return {\n subscribe(run) {\n run(wm.getState())\n return wm.subscribe(run)\n },\n }\n}\n\nexport function wmWindowStore(\n wm: WindowManager,\n id: string,\n): ReadableStore<WindowState | undefined> {\n return {\n subscribe(run) {\n run(wm.get(id))\n let last = wm.get(id)\n return wm.subscribe(() => {\n const next = wm.get(id)\n if (next !== last) {\n last = next\n run(next)\n }\n })\n },\n }\n}\n\nexport interface SvelteDesktop {\n binder: DesktopBinder\n desktop(node: HTMLElement): ActionResult\n window(node: HTMLElement, params: WindowActionParams): ActionResult\n}\n\nexport function createDesktop(wm: WindowManager, options?: DesktopOptions): SvelteDesktop {\n const binder = createDesktopBinder(wm, options)\n return {\n binder,\n desktop(node) {\n binder.bindDesktop(node)\n return { destroy: () => binder.destroy() }\n },\n window(node, params) {\n let bound = params.id\n let unbind = binder.bindWindow(params.id, node, params)\n return {\n update(next) {\n if (next.id === bound) return\n unbind()\n bound = next.id\n unbind = binder.bindWindow(next.id, node, next)\n },\n destroy() {\n unbind()\n },\n }\n },\n }\n}\n"]}