@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
@@ -0,0 +1,202 @@
1
+ [data-wm-desktop] {
2
+ --wm-radius: 12px;
3
+ --wm-bg: rgba(255, 255, 255, 0.78);
4
+ --wm-bg-focused: rgba(255, 255, 255, 0.94);
5
+ --wm-border: rgba(15, 23, 42, 0.1);
6
+ --wm-border-focused: rgba(15, 23, 42, 0.22);
7
+ --wm-shadow: 0 6px 22px rgba(15, 23, 42, 0.12);
8
+ --wm-shadow-focused: 0 16px 44px rgba(15, 23, 42, 0.2);
9
+ --wm-titlebar-bg: rgba(15, 23, 42, 0.03);
10
+ --wm-text: rgba(15, 23, 42, 0.92);
11
+ --wm-text-dim: rgba(15, 23, 42, 0.55);
12
+ --wm-accent: #4f46e5;
13
+ --wm-blur: 18px;
14
+ --wm-transition: 240ms cubic-bezier(0.32, 0.72, 0, 1);
15
+ position: relative;
16
+ overflow: hidden;
17
+ }
18
+
19
+ [data-wm-window] {
20
+ display: flex;
21
+ flex-direction: column;
22
+ box-sizing: border-box;
23
+ color: var(--wm-text);
24
+ background: var(--wm-bg);
25
+ -webkit-backdrop-filter: blur(var(--wm-blur)) saturate(1.2);
26
+ backdrop-filter: blur(var(--wm-blur)) saturate(1.2);
27
+ border: 1px solid var(--wm-border);
28
+ border-radius: var(--wm-radius);
29
+ box-shadow: var(--wm-shadow);
30
+ outline: none;
31
+ contain: layout style;
32
+ transition:
33
+ transform var(--wm-transition),
34
+ width var(--wm-transition),
35
+ height var(--wm-transition),
36
+ box-shadow 180ms ease,
37
+ border-color 180ms ease,
38
+ opacity 180ms ease;
39
+ animation: wm-window-in 220ms cubic-bezier(0.32, 0.72, 0, 1);
40
+ }
41
+
42
+ [data-wm-window][hidden] {
43
+ display: none;
44
+ }
45
+
46
+ [data-wm-window][data-wm-focused] {
47
+ background: var(--wm-bg-focused);
48
+ border-color: var(--wm-border-focused);
49
+ box-shadow: var(--wm-shadow-focused);
50
+ }
51
+
52
+ [data-wm-window][data-wm-dragging],
53
+ [data-wm-window][data-wm-resizing] {
54
+ transition:
55
+ box-shadow 180ms ease,
56
+ border-color 180ms ease;
57
+ user-select: none;
58
+ -webkit-user-select: none;
59
+ }
60
+
61
+ [data-wm-window][data-wm-stage="maximized"],
62
+ [data-wm-window][data-wm-stage="snapped"] {
63
+ border-radius: 0;
64
+ }
65
+
66
+ [data-wm-window][data-wm-flash] {
67
+ animation: wm-flash 320ms ease;
68
+ }
69
+
70
+ [data-wm-window] [data-wm-drag] {
71
+ display: flex;
72
+ align-items: center;
73
+ gap: 8px;
74
+ padding: 10px 14px;
75
+ background: var(--wm-titlebar-bg);
76
+ border-bottom: 1px solid var(--wm-border);
77
+ border-radius: var(--wm-radius) var(--wm-radius) 0 0;
78
+ cursor: default;
79
+ user-select: none;
80
+ -webkit-user-select: none;
81
+ flex-shrink: 0;
82
+ }
83
+
84
+ [data-wm-window][data-wm-stage="maximized"] [data-wm-drag],
85
+ [data-wm-window][data-wm-stage="snapped"] [data-wm-drag] {
86
+ border-radius: 0;
87
+ }
88
+
89
+ [data-wm-window] [data-wm-title] {
90
+ flex: 1;
91
+ font-size: 13px;
92
+ font-weight: 600;
93
+ letter-spacing: 0.01em;
94
+ color: var(--wm-text);
95
+ white-space: nowrap;
96
+ overflow: hidden;
97
+ text-overflow: ellipsis;
98
+ }
99
+
100
+ [data-wm-window] [data-wm-controls] {
101
+ display: flex;
102
+ gap: 8px;
103
+ align-items: center;
104
+ }
105
+
106
+ [data-wm-window] [data-wm-close],
107
+ [data-wm-window] [data-wm-minimize],
108
+ [data-wm-window] [data-wm-maximize] {
109
+ width: 13px;
110
+ height: 13px;
111
+ border-radius: 50%;
112
+ border: none;
113
+ padding: 0;
114
+ cursor: pointer;
115
+ transition:
116
+ filter 120ms ease,
117
+ transform 120ms ease;
118
+ }
119
+
120
+ [data-wm-window] [data-wm-close]:hover,
121
+ [data-wm-window] [data-wm-minimize]:hover,
122
+ [data-wm-window] [data-wm-maximize]:hover {
123
+ filter: brightness(1.1);
124
+ transform: scale(1.12);
125
+ }
126
+
127
+ [data-wm-window] [data-wm-close]:focus-visible,
128
+ [data-wm-window] [data-wm-minimize]:focus-visible,
129
+ [data-wm-window] [data-wm-maximize]:focus-visible {
130
+ outline: 2px solid var(--wm-accent);
131
+ outline-offset: 2px;
132
+ }
133
+
134
+ [data-wm-window] [data-wm-close] {
135
+ background: #ff5f57;
136
+ }
137
+
138
+ [data-wm-window] [data-wm-minimize] {
139
+ background: #febc2e;
140
+ }
141
+
142
+ [data-wm-window] [data-wm-maximize] {
143
+ background: #28c840;
144
+ }
145
+
146
+ [data-wm-window] [data-wm-content] {
147
+ flex: 1;
148
+ overflow: auto;
149
+ padding: 14px;
150
+ font-size: 14px;
151
+ line-height: 1.55;
152
+ }
153
+
154
+ [data-wm-snap-preview] {
155
+ background: color-mix(in srgb, var(--wm-accent) 12%, transparent);
156
+ border: 1.5px solid color-mix(in srgb, var(--wm-accent) 45%, transparent);
157
+ border-radius: var(--wm-radius);
158
+ -webkit-backdrop-filter: blur(4px);
159
+ backdrop-filter: blur(4px);
160
+ transition:
161
+ transform 140ms cubic-bezier(0.32, 0.72, 0, 1),
162
+ width 140ms ease,
163
+ height 140ms ease;
164
+ }
165
+
166
+ @keyframes wm-window-in {
167
+ from {
168
+ opacity: 0;
169
+ scale: 0.96;
170
+ }
171
+ to {
172
+ opacity: 1;
173
+ scale: 1;
174
+ }
175
+ }
176
+
177
+ @keyframes wm-flash {
178
+ 0%,
179
+ 100% {
180
+ translate: 0 0;
181
+ }
182
+ 20% {
183
+ translate: -6px 0;
184
+ }
185
+ 45% {
186
+ translate: 5px 0;
187
+ }
188
+ 70% {
189
+ translate: -3px 0;
190
+ }
191
+ 90% {
192
+ translate: 2px 0;
193
+ }
194
+ }
195
+
196
+ @media (prefers-reduced-motion: reduce) {
197
+ [data-wm-window],
198
+ [data-wm-snap-preview] {
199
+ transition: none;
200
+ animation: none;
201
+ }
202
+ }
@@ -0,0 +1,154 @@
1
+ [data-wm-desktop] {
2
+ --wm-face: #c0c0c0;
3
+ --wm-face-light: #ffffff;
4
+ --wm-face-dark: #808080;
5
+ --wm-face-darker: #404040;
6
+ --wm-title-active-a: #000080;
7
+ --wm-title-active-b: #1084d0;
8
+ --wm-title-inactive: #808080;
9
+ --wm-text: #000000;
10
+ --wm-text-dim: #404040;
11
+ --wm-accent: #000080;
12
+ --wm-title-text: #ffffff;
13
+ position: relative;
14
+ overflow: hidden;
15
+ background: #008080;
16
+ }
17
+
18
+ [data-wm-window] {
19
+ display: flex;
20
+ flex-direction: column;
21
+ box-sizing: border-box;
22
+ color: var(--wm-text);
23
+ background: var(--wm-face);
24
+ border: 2px solid;
25
+ border-color: var(--wm-face-light) var(--wm-face-darker) var(--wm-face-darker)
26
+ var(--wm-face-light);
27
+ box-shadow: 1px 1px 0 var(--wm-face-dark);
28
+ outline: none;
29
+ contain: layout style;
30
+ font-family: "Pixelated MS Sans Serif", "MS Sans Serif", Tahoma, sans-serif;
31
+ }
32
+
33
+ [data-wm-window][hidden] {
34
+ display: none;
35
+ }
36
+
37
+ [data-wm-window][data-wm-flash] {
38
+ animation: wm-flash 320ms ease;
39
+ }
40
+
41
+ [data-wm-window] [data-wm-drag] {
42
+ display: flex;
43
+ align-items: center;
44
+ gap: 6px;
45
+ padding: 3px 4px;
46
+ margin: 2px;
47
+ background: linear-gradient(90deg, var(--wm-title-inactive), #b5b5b5);
48
+ cursor: default;
49
+ user-select: none;
50
+ -webkit-user-select: none;
51
+ flex-shrink: 0;
52
+ }
53
+
54
+ [data-wm-window][data-wm-focused] [data-wm-drag] {
55
+ background: linear-gradient(90deg, var(--wm-title-active-a), var(--wm-title-active-b));
56
+ }
57
+
58
+ [data-wm-window] [data-wm-title] {
59
+ flex: 1;
60
+ font-size: 12px;
61
+ font-weight: 700;
62
+ color: var(--wm-title-text);
63
+ white-space: nowrap;
64
+ overflow: hidden;
65
+ text-overflow: ellipsis;
66
+ letter-spacing: 0;
67
+ }
68
+
69
+ [data-wm-window] [data-wm-controls] {
70
+ display: flex;
71
+ gap: 2px;
72
+ align-items: center;
73
+ }
74
+
75
+ [data-wm-window] [data-wm-close],
76
+ [data-wm-window] [data-wm-minimize],
77
+ [data-wm-window] [data-wm-maximize] {
78
+ width: 16px;
79
+ height: 14px;
80
+ border: 1px solid;
81
+ border-color: var(--wm-face-light) var(--wm-face-darker) var(--wm-face-darker)
82
+ var(--wm-face-light);
83
+ background: var(--wm-face);
84
+ padding: 0;
85
+ cursor: pointer;
86
+ font-size: 9px;
87
+ line-height: 1;
88
+ color: var(--wm-text);
89
+ }
90
+
91
+ [data-wm-window] [data-wm-close]:active,
92
+ [data-wm-window] [data-wm-minimize]:active,
93
+ [data-wm-window] [data-wm-maximize]:active {
94
+ border-color: var(--wm-face-darker) var(--wm-face-light) var(--wm-face-light)
95
+ var(--wm-face-darker);
96
+ }
97
+
98
+ [data-wm-window] [data-wm-close]:focus-visible,
99
+ [data-wm-window] [data-wm-minimize]:focus-visible,
100
+ [data-wm-window] [data-wm-maximize]:focus-visible {
101
+ outline: 1px dotted var(--wm-text);
102
+ outline-offset: -3px;
103
+ }
104
+
105
+ [data-wm-window] [data-wm-minimize]::after {
106
+ content: "_";
107
+ font-weight: 700;
108
+ }
109
+
110
+ [data-wm-window] [data-wm-maximize]::after {
111
+ content: "□";
112
+ font-weight: 700;
113
+ }
114
+
115
+ [data-wm-window] [data-wm-close]::after {
116
+ content: "✕";
117
+ font-weight: 700;
118
+ }
119
+
120
+ [data-wm-window] [data-wm-content] {
121
+ flex: 1;
122
+ overflow: auto;
123
+ padding: 8px;
124
+ margin: 0 2px 2px;
125
+ font-size: 12px;
126
+ line-height: 1.4;
127
+ background: var(--wm-face);
128
+ border: 1px solid;
129
+ border-color: var(--wm-face-dark) var(--wm-face-light) var(--wm-face-light) var(--wm-face-dark);
130
+ }
131
+
132
+ [data-wm-snap-preview] {
133
+ background: transparent;
134
+ border: 2px dashed var(--wm-face-darker);
135
+ }
136
+
137
+ @keyframes wm-flash {
138
+ 0%,
139
+ 100% {
140
+ translate: 0 0;
141
+ }
142
+ 20% {
143
+ translate: -6px 0;
144
+ }
145
+ 45% {
146
+ translate: 5px 0;
147
+ }
148
+ 70% {
149
+ translate: -3px 0;
150
+ }
151
+ 90% {
152
+ translate: 2px 0;
153
+ }
154
+ }
@@ -10,7 +10,8 @@ interface Bounds {
10
10
  }
11
11
  type WindowStage = 'normal' | 'minimized' | 'maximized' | 'snapped';
12
12
  type WindowLayer = 'normal' | 'floating' | 'modal';
13
- type SnapZone = 'left' | 'right' | 'top' | 'bottom' | 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';
13
+ type ArrangeMode = 'cascade' | 'tile';
14
+ type SnapZone = 'left' | 'right' | 'top' | 'bottom' | 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right' | 'left-third' | 'center-third' | 'right-third';
14
15
  interface WindowFlags {
15
16
  draggable: boolean;
16
17
  resizable: boolean;
@@ -28,8 +29,10 @@ interface WindowState extends WindowFlags {
28
29
  stage: WindowStage;
29
30
  snapZone: SnapZone | null;
30
31
  layer: WindowLayer;
32
+ workspace: number;
31
33
  minSize: Size;
32
34
  maxSize: Size | null;
35
+ aspectRatio: number | null;
33
36
  openedSeq: number;
34
37
  meta: Record<string, unknown>;
35
38
  }
@@ -44,8 +47,10 @@ interface WindowInit extends Partial<WindowFlags> {
44
47
  minHeight?: number;
45
48
  maxWidth?: number;
46
49
  maxHeight?: number;
50
+ aspectRatio?: number;
47
51
  stage?: WindowStage;
48
52
  layer?: WindowLayer;
53
+ workspace?: number;
49
54
  meta?: Record<string, unknown>;
50
55
  }
51
56
  interface ManagerState {
@@ -53,6 +58,7 @@ interface ManagerState {
53
58
  order: readonly string[];
54
59
  focusedId: string | null;
55
60
  viewport: Size;
61
+ workspace: number;
56
62
  }
57
63
  interface SerializedMaxSize {
58
64
  width: number | null;
@@ -66,6 +72,7 @@ interface SerializedState {
66
72
  windows: SerializedWindowState[];
67
73
  order: string[];
68
74
  focusedId: string | null;
75
+ workspace: number;
69
76
  }
70
77
  interface ManagerEvents {
71
78
  open: {
@@ -94,6 +101,10 @@ interface ManagerEvents {
94
101
  order: {
95
102
  order: readonly string[];
96
103
  };
104
+ workspace: {
105
+ workspace: number;
106
+ previous: number;
107
+ };
97
108
  modalblocked: {
98
109
  window: WindowState;
99
110
  };
@@ -112,12 +123,15 @@ interface ManagerOptions {
112
123
  y: number;
113
124
  };
114
125
  idPrefix?: string;
126
+ historyLimit?: number;
127
+ workspace?: number;
115
128
  }
116
129
  interface WindowUpdate {
117
130
  title?: string;
118
131
  layer?: WindowLayer;
119
132
  minSize?: Size;
120
133
  maxSize?: Size | null;
134
+ aspectRatio?: number | null;
121
135
  meta?: Record<string, unknown>;
122
136
  draggable?: boolean;
123
137
  resizable?: boolean;
@@ -141,18 +155,40 @@ interface WindowManager {
141
155
  snap(id: string, zone: SnapZone): boolean;
142
156
  move(id: string, x: number, y: number): boolean;
143
157
  moveBy(id: string, dx: number, dy: number): boolean;
158
+ center(id: string): boolean;
159
+ sendToBack(id: string): boolean;
144
160
  resize(id: string, patch: Partial<Bounds>): boolean;
145
161
  update(id: string, patch: WindowUpdate): boolean;
146
162
  get(id: string): WindowState | undefined;
147
163
  getState(): ManagerState;
148
164
  minimized(): readonly WindowState[];
149
165
  setViewport(viewport: Size): void;
166
+ workspace(): number;
167
+ setWorkspace(workspace: number): boolean;
168
+ moveToWorkspace(id: string, workspace: number): boolean;
150
169
  batch(run: () => void): void;
151
170
  serialize(): SerializedState;
152
171
  hydrate(data: SerializedState): boolean;
172
+ undo(): boolean;
173
+ redo(): boolean;
174
+ canUndo(): boolean;
175
+ canRedo(): boolean;
176
+ beginInteraction(): void;
177
+ endInteraction(): void;
178
+ abortInteraction(): void;
179
+ clearHistory(): void;
180
+ saveLayout(name: string): SerializedState;
181
+ loadLayout(name: string): boolean;
182
+ getLayout(name: string): SerializedState | undefined;
183
+ setLayout(name: string, data: SerializedState): boolean;
184
+ deleteLayout(name: string): boolean;
185
+ layoutNames(): string[];
186
+ arrange(mode: ArrangeMode): void;
187
+ minimizeAll(): void;
188
+ restoreAll(): void;
153
189
  subscribe(listener: (state: ManagerState) => void): () => void;
154
190
  on<K extends keyof ManagerEvents>(event: K, listener: (payload: ManagerEvents[K]) => void): () => void;
155
191
  destroy(): void;
156
192
  }
157
193
 
158
- export type { Bounds as B, ManagerOptions as M, SerializedMaxSize as S, WindowManager as W, ManagerState as a, WindowState as b, ManagerEvents as c, SerializedState as d, SerializedWindowState as e, Size as f, SnapZone as g, WindowFlags as h, WindowInit as i, WindowLayer as j, WindowStage as k, WindowUpdate as l };
194
+ export type { ArrangeMode as A, Bounds as B, ManagerOptions as M, SerializedMaxSize as S, WindowManager as W, ManagerState as a, WindowState as b, ManagerEvents as c, SerializedState as d, SerializedWindowState as e, Size as f, SnapZone as g, WindowFlags as h, WindowInit as i, WindowLayer as j, WindowStage as k, WindowUpdate as l };
@@ -10,7 +10,8 @@ interface Bounds {
10
10
  }
11
11
  type WindowStage = 'normal' | 'minimized' | 'maximized' | 'snapped';
12
12
  type WindowLayer = 'normal' | 'floating' | 'modal';
13
- type SnapZone = 'left' | 'right' | 'top' | 'bottom' | 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';
13
+ type ArrangeMode = 'cascade' | 'tile';
14
+ type SnapZone = 'left' | 'right' | 'top' | 'bottom' | 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right' | 'left-third' | 'center-third' | 'right-third';
14
15
  interface WindowFlags {
15
16
  draggable: boolean;
16
17
  resizable: boolean;
@@ -28,8 +29,10 @@ interface WindowState extends WindowFlags {
28
29
  stage: WindowStage;
29
30
  snapZone: SnapZone | null;
30
31
  layer: WindowLayer;
32
+ workspace: number;
31
33
  minSize: Size;
32
34
  maxSize: Size | null;
35
+ aspectRatio: number | null;
33
36
  openedSeq: number;
34
37
  meta: Record<string, unknown>;
35
38
  }
@@ -44,8 +47,10 @@ interface WindowInit extends Partial<WindowFlags> {
44
47
  minHeight?: number;
45
48
  maxWidth?: number;
46
49
  maxHeight?: number;
50
+ aspectRatio?: number;
47
51
  stage?: WindowStage;
48
52
  layer?: WindowLayer;
53
+ workspace?: number;
49
54
  meta?: Record<string, unknown>;
50
55
  }
51
56
  interface ManagerState {
@@ -53,6 +58,7 @@ interface ManagerState {
53
58
  order: readonly string[];
54
59
  focusedId: string | null;
55
60
  viewport: Size;
61
+ workspace: number;
56
62
  }
57
63
  interface SerializedMaxSize {
58
64
  width: number | null;
@@ -66,6 +72,7 @@ interface SerializedState {
66
72
  windows: SerializedWindowState[];
67
73
  order: string[];
68
74
  focusedId: string | null;
75
+ workspace: number;
69
76
  }
70
77
  interface ManagerEvents {
71
78
  open: {
@@ -94,6 +101,10 @@ interface ManagerEvents {
94
101
  order: {
95
102
  order: readonly string[];
96
103
  };
104
+ workspace: {
105
+ workspace: number;
106
+ previous: number;
107
+ };
97
108
  modalblocked: {
98
109
  window: WindowState;
99
110
  };
@@ -112,12 +123,15 @@ interface ManagerOptions {
112
123
  y: number;
113
124
  };
114
125
  idPrefix?: string;
126
+ historyLimit?: number;
127
+ workspace?: number;
115
128
  }
116
129
  interface WindowUpdate {
117
130
  title?: string;
118
131
  layer?: WindowLayer;
119
132
  minSize?: Size;
120
133
  maxSize?: Size | null;
134
+ aspectRatio?: number | null;
121
135
  meta?: Record<string, unknown>;
122
136
  draggable?: boolean;
123
137
  resizable?: boolean;
@@ -141,18 +155,40 @@ interface WindowManager {
141
155
  snap(id: string, zone: SnapZone): boolean;
142
156
  move(id: string, x: number, y: number): boolean;
143
157
  moveBy(id: string, dx: number, dy: number): boolean;
158
+ center(id: string): boolean;
159
+ sendToBack(id: string): boolean;
144
160
  resize(id: string, patch: Partial<Bounds>): boolean;
145
161
  update(id: string, patch: WindowUpdate): boolean;
146
162
  get(id: string): WindowState | undefined;
147
163
  getState(): ManagerState;
148
164
  minimized(): readonly WindowState[];
149
165
  setViewport(viewport: Size): void;
166
+ workspace(): number;
167
+ setWorkspace(workspace: number): boolean;
168
+ moveToWorkspace(id: string, workspace: number): boolean;
150
169
  batch(run: () => void): void;
151
170
  serialize(): SerializedState;
152
171
  hydrate(data: SerializedState): boolean;
172
+ undo(): boolean;
173
+ redo(): boolean;
174
+ canUndo(): boolean;
175
+ canRedo(): boolean;
176
+ beginInteraction(): void;
177
+ endInteraction(): void;
178
+ abortInteraction(): void;
179
+ clearHistory(): void;
180
+ saveLayout(name: string): SerializedState;
181
+ loadLayout(name: string): boolean;
182
+ getLayout(name: string): SerializedState | undefined;
183
+ setLayout(name: string, data: SerializedState): boolean;
184
+ deleteLayout(name: string): boolean;
185
+ layoutNames(): string[];
186
+ arrange(mode: ArrangeMode): void;
187
+ minimizeAll(): void;
188
+ restoreAll(): void;
153
189
  subscribe(listener: (state: ManagerState) => void): () => void;
154
190
  on<K extends keyof ManagerEvents>(event: K, listener: (payload: ManagerEvents[K]) => void): () => void;
155
191
  destroy(): void;
156
192
  }
157
193
 
158
- export type { Bounds as B, ManagerOptions as M, SerializedMaxSize as S, WindowManager as W, ManagerState as a, WindowState as b, ManagerEvents as c, SerializedState as d, SerializedWindowState as e, Size as f, SnapZone as g, WindowFlags as h, WindowInit as i, WindowLayer as j, WindowStage as k, WindowUpdate as l };
194
+ export type { ArrangeMode as A, Bounds as B, ManagerOptions as M, SerializedMaxSize as S, WindowManager as W, ManagerState as a, WindowState as b, ManagerEvents as c, SerializedState as d, SerializedWindowState as e, Size as f, SnapZone as g, WindowFlags as h, WindowInit as i, WindowLayer as j, WindowStage as k, WindowUpdate as l };
package/dist/vue.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 vue = require('vue');
5
5
 
6
6
  function disposeWithScope(dispose) {
7
7
  if (vue.getCurrentScope()) vue.onScopeDispose(dispose);
8
8
  }
9
9
  function useWindowManager(options) {
10
- const wm = chunkKQCVZ2W7_cjs.createWindowManager(options);
10
+ const wm = chunk3KZZOLHW_cjs.createWindowManager(options);
11
11
  disposeWithScope(() => wm.destroy());
12
12
  return wm;
13
13
  }
@@ -25,7 +25,8 @@ function useWmWindow(wm, id) {
25
25
  return vue.computed(() => state.value.windows[vue.toValue(id)]);
26
26
  }
27
27
  function useDesktop(wm, target, options) {
28
- const binder = chunkKQCVZ2W7_cjs.createDesktopBinder(wm, options);
28
+ const binder = chunk3KZZOLHW_cjs.createDesktopBinder(wm, options);
29
+ disposeWithScope(() => binder.destroy());
29
30
  vue.watch(
30
31
  target,
31
32
  (element, _previous, onCleanup) => {
package/dist/vue.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/adapters/vue.ts"],"names":["getCurrentScope","onScopeDispose","createWindowManager","shallowRef","computed","toValue","createDesktopBinder","watch"],"mappings":";;;;;AAiBA,SAAS,iBAAiB,OAAA,EAA2B;AACnD,EAAA,IAAIA,mBAAA,EAAgB,EAAGC,kBAAA,CAAe,OAAO,CAAA;AAC/C;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,EAA6C;AACtE,EAAA,MAAM,KAAA,GAAQC,cAAA,CAAW,EAAA,CAAG,QAAA,EAAU,CAAA;AACtC,EAAA,gBAAA;AAAA,IACE,EAAA,CAAG,SAAA,CAAU,CAAC,IAAA,KAAS;AACrB,MAAA,KAAA,CAAM,KAAA,GAAQ,IAAA;AAAA,IAChB,CAAC;AAAA,GACH;AACA,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,WAAA,CACd,IACA,EAAA,EACsC;AACtC,EAAA,MAAM,KAAA,GAAQ,WAAW,EAAE,CAAA;AAC3B,EAAA,OAAOC,YAAA,CAAS,MAAM,KAAA,CAAM,KAAA,CAAM,QAAQC,WAAA,CAAQ,EAAE,CAAC,CAAC,CAAA;AACxD;AAEO,SAAS,UAAA,CACd,EAAA,EACA,MAAA,EACA,OAAA,EACe;AACf,EAAA,MAAM,MAAA,GAASC,qCAAA,CAAoB,EAAA,EAAI,OAAO,CAAA;AAC9C,EAAAC,SAAA;AAAA,IACE,MAAA;AAAA,IACA,CAAC,OAAA,EAAS,SAAA,EAAW,SAAA,KAAc;AACjC,MAAA,IAAI,OAAA,EAAS,SAAA,CAAU,MAAA,CAAO,WAAA,CAAY,OAAO,CAAC,CAAA;AAAA,IACpD,CAAA;AAAA,IACA,EAAE,SAAA,EAAW,IAAA,EAAM,KAAA,EAAO,MAAA;AAAO,GACnC;AACA,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,aAAA,CACd,MAAA,EACA,EAAA,EACA,MAAA,EACA,OAAA,EACM;AACN,EAAAA,SAAA;AAAA,IACE,CAAC,MAAA,EAAQ,MAAMF,WAAA,CAAQ,EAAE,CAAC,CAAA;AAAA,IAC1B,CAAC,CAAC,OAAA,EAAS,QAAQ,CAAA,EAAG,WAAW,SAAA,KAAc;AAC7C,MAAA,IAAI,OAAA,IAAW,UAAU,SAAA,CAAU,MAAA,CAAO,WAAW,QAAA,EAAU,OAAA,EAAS,OAAO,CAAC,CAAA;AAAA,IAClF,CAAA;AAAA,IACA,EAAE,SAAA,EAAW,IAAA,EAAM,KAAA,EAAO,MAAA;AAAO,GACnC;AACF","file":"vue.cjs","sourcesContent":["import {\n type ComputedRef,\n computed,\n getCurrentScope,\n type MaybeRefOrGetter,\n onScopeDispose,\n type Ref,\n type ShallowRef,\n shallowRef,\n toValue,\n watch,\n} from 'vue'\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 disposeWithScope(dispose: () => void): void {\n if (getCurrentScope()) onScopeDispose(dispose)\n}\n\nexport function useWindowManager(options?: ManagerOptions): WindowManager {\n const wm = createWindowManager(options)\n disposeWithScope(() => wm.destroy())\n return wm\n}\n\nexport function useWmState(wm: WindowManager): ShallowRef<ManagerState> {\n const state = shallowRef(wm.getState())\n disposeWithScope(\n wm.subscribe((next) => {\n state.value = next\n }),\n )\n return state\n}\n\nexport function useWmWindow(\n wm: WindowManager,\n id: MaybeRefOrGetter<string>,\n): ComputedRef<WindowState | undefined> {\n const state = useWmState(wm)\n return computed(() => state.value.windows[toValue(id)])\n}\n\nexport function useDesktop(\n wm: WindowManager,\n target: Ref<HTMLElement | null | undefined>,\n options?: DesktopOptions,\n): DesktopBinder {\n const binder = createDesktopBinder(wm, options)\n watch(\n target,\n (element, _previous, onCleanup) => {\n if (element) onCleanup(binder.bindDesktop(element))\n },\n { immediate: true, flush: 'post' },\n )\n return binder\n}\n\nexport function useWmWindowEl(\n binder: DesktopBinder,\n id: MaybeRefOrGetter<string>,\n target: Ref<HTMLElement | null | undefined>,\n options?: WindowAttachOptions,\n): void {\n watch(\n [target, () => toValue(id)],\n ([element, windowId], _previous, onCleanup) => {\n if (element && windowId) onCleanup(binder.bindWindow(windowId, element, options))\n },\n { immediate: true, flush: 'post' },\n )\n}\n"]}
1
+ {"version":3,"sources":["../src/adapters/vue.ts"],"names":["getCurrentScope","onScopeDispose","createWindowManager","shallowRef","computed","toValue","createDesktopBinder","watch"],"mappings":";;;;;AAiBA,SAAS,iBAAiB,OAAA,EAA2B;AACnD,EAAA,IAAIA,mBAAA,EAAgB,EAAGC,kBAAA,CAAe,OAAO,CAAA;AAC/C;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,EAA6C;AACtE,EAAA,MAAM,KAAA,GAAQC,cAAA,CAAW,EAAA,CAAG,QAAA,EAAU,CAAA;AACtC,EAAA,gBAAA;AAAA,IACE,EAAA,CAAG,SAAA,CAAU,CAAC,IAAA,KAAS;AACrB,MAAA,KAAA,CAAM,KAAA,GAAQ,IAAA;AAAA,IAChB,CAAC;AAAA,GACH;AACA,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,WAAA,CACd,IACA,EAAA,EACsC;AACtC,EAAA,MAAM,KAAA,GAAQ,WAAW,EAAE,CAAA;AAC3B,EAAA,OAAOC,YAAA,CAAS,MAAM,KAAA,CAAM,KAAA,CAAM,QAAQC,WAAA,CAAQ,EAAE,CAAC,CAAC,CAAA;AACxD;AAEO,SAAS,UAAA,CACd,EAAA,EACA,MAAA,EACA,OAAA,EACe;AACf,EAAA,MAAM,MAAA,GAASC,qCAAA,CAAoB,EAAA,EAAI,OAAO,CAAA;AAC9C,EAAA,gBAAA,CAAiB,MAAM,MAAA,CAAO,OAAA,EAAS,CAAA;AACvC,EAAAC,SAAA;AAAA,IACE,MAAA;AAAA,IACA,CAAC,OAAA,EAAS,SAAA,EAAW,SAAA,KAAc;AACjC,MAAA,IAAI,OAAA,EAAS,SAAA,CAAU,MAAA,CAAO,WAAA,CAAY,OAAO,CAAC,CAAA;AAAA,IACpD,CAAA;AAAA,IACA,EAAE,SAAA,EAAW,IAAA,EAAM,KAAA,EAAO,MAAA;AAAO,GACnC;AACA,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,aAAA,CACd,MAAA,EACA,EAAA,EACA,MAAA,EACA,OAAA,EACM;AACN,EAAAA,SAAA;AAAA,IACE,CAAC,MAAA,EAAQ,MAAMF,WAAA,CAAQ,EAAE,CAAC,CAAA;AAAA,IAC1B,CAAC,CAAC,OAAA,EAAS,QAAQ,CAAA,EAAG,WAAW,SAAA,KAAc;AAC7C,MAAA,IAAI,OAAA,IAAW,UAAU,SAAA,CAAU,MAAA,CAAO,WAAW,QAAA,EAAU,OAAA,EAAS,OAAO,CAAC,CAAA;AAAA,IAClF,CAAA;AAAA,IACA,EAAE,SAAA,EAAW,IAAA,EAAM,KAAA,EAAO,MAAA;AAAO,GACnC;AACF","file":"vue.cjs","sourcesContent":["import {\n type ComputedRef,\n computed,\n getCurrentScope,\n type MaybeRefOrGetter,\n onScopeDispose,\n type Ref,\n type ShallowRef,\n shallowRef,\n toValue,\n watch,\n} from 'vue'\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 disposeWithScope(dispose: () => void): void {\n if (getCurrentScope()) onScopeDispose(dispose)\n}\n\nexport function useWindowManager(options?: ManagerOptions): WindowManager {\n const wm = createWindowManager(options)\n disposeWithScope(() => wm.destroy())\n return wm\n}\n\nexport function useWmState(wm: WindowManager): ShallowRef<ManagerState> {\n const state = shallowRef(wm.getState())\n disposeWithScope(\n wm.subscribe((next) => {\n state.value = next\n }),\n )\n return state\n}\n\nexport function useWmWindow(\n wm: WindowManager,\n id: MaybeRefOrGetter<string>,\n): ComputedRef<WindowState | undefined> {\n const state = useWmState(wm)\n return computed(() => state.value.windows[toValue(id)])\n}\n\nexport function useDesktop(\n wm: WindowManager,\n target: Ref<HTMLElement | null | undefined>,\n options?: DesktopOptions,\n): DesktopBinder {\n const binder = createDesktopBinder(wm, options)\n disposeWithScope(() => binder.destroy())\n watch(\n target,\n (element, _previous, onCleanup) => {\n if (element) onCleanup(binder.bindDesktop(element))\n },\n { immediate: true, flush: 'post' },\n )\n return binder\n}\n\nexport function useWmWindowEl(\n binder: DesktopBinder,\n id: MaybeRefOrGetter<string>,\n target: Ref<HTMLElement | null | undefined>,\n options?: WindowAttachOptions,\n): void {\n watch(\n [target, () => toValue(id)],\n ([element, windowId], _previous, onCleanup) => {\n if (element && windowId) onCleanup(binder.bindWindow(windowId, element, options))\n },\n { immediate: true, flush: 'post' },\n )\n}\n"]}
package/dist/vue.d.cts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { Ref, ShallowRef, MaybeRefOrGetter, ComputedRef } from 'vue';
2
- import { W as WindowManager, M as ManagerOptions, a as ManagerState, b as WindowState } from './types-Bkrq2djr.cjs';
3
- import { b as DesktopOptions, D as DesktopBinder, W as WindowAttachOptions } 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 { a as DesktopOptions, D as DesktopBinder, W as WindowAttachOptions } from './binder-Dl07SXIM.cjs';
4
4
 
5
5
  declare function useWindowManager(options?: ManagerOptions): WindowManager;
6
6
  declare function useWmState(wm: WindowManager): ShallowRef<ManagerState>;
package/dist/vue.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { Ref, ShallowRef, MaybeRefOrGetter, ComputedRef } from 'vue';
2
- import { W as WindowManager, M as ManagerOptions, a as ManagerState, b as WindowState } from './types-Bkrq2djr.js';
3
- import { b as DesktopOptions, D as DesktopBinder, W as WindowAttachOptions } from './binder-D9UEE1SM.js';
2
+ import { W as WindowManager, M as ManagerOptions, a as ManagerState, b as WindowState } from './types-t6pyVYKN.js';
3
+ import { a as DesktopOptions, D as DesktopBinder, W as WindowAttachOptions } from './binder-B2A2IZGh.js';
4
4
 
5
5
  declare function useWindowManager(options?: ManagerOptions): WindowManager;
6
6
  declare function useWmState(wm: WindowManager): ShallowRef<ManagerState>;
package/dist/vue.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 { shallowRef, computed, toValue, watch, getCurrentScope, onScopeDispose } from 'vue';
3
3
 
4
4
  function disposeWithScope(dispose) {
@@ -24,6 +24,7 @@ function useWmWindow(wm, id) {
24
24
  }
25
25
  function useDesktop(wm, target, options) {
26
26
  const binder = createDesktopBinder(wm, options);
27
+ disposeWithScope(() => binder.destroy());
27
28
  watch(
28
29
  target,
29
30
  (element, _previous, onCleanup) => {
package/dist/vue.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/adapters/vue.ts"],"names":[],"mappings":";;;AAiBA,SAAS,iBAAiB,OAAA,EAA2B;AACnD,EAAA,IAAI,eAAA,EAAgB,EAAG,cAAA,CAAe,OAAO,CAAA;AAC/C;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,EAA6C;AACtE,EAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,EAAA,CAAG,QAAA,EAAU,CAAA;AACtC,EAAA,gBAAA;AAAA,IACE,EAAA,CAAG,SAAA,CAAU,CAAC,IAAA,KAAS;AACrB,MAAA,KAAA,CAAM,KAAA,GAAQ,IAAA;AAAA,IAChB,CAAC;AAAA,GACH;AACA,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,WAAA,CACd,IACA,EAAA,EACsC;AACtC,EAAA,MAAM,KAAA,GAAQ,WAAW,EAAE,CAAA;AAC3B,EAAA,OAAO,QAAA,CAAS,MAAM,KAAA,CAAM,KAAA,CAAM,QAAQ,OAAA,CAAQ,EAAE,CAAC,CAAC,CAAA;AACxD;AAEO,SAAS,UAAA,CACd,EAAA,EACA,MAAA,EACA,OAAA,EACe;AACf,EAAA,MAAM,MAAA,GAAS,mBAAA,CAAoB,EAAA,EAAI,OAAO,CAAA;AAC9C,EAAA,KAAA;AAAA,IACE,MAAA;AAAA,IACA,CAAC,OAAA,EAAS,SAAA,EAAW,SAAA,KAAc;AACjC,MAAA,IAAI,OAAA,EAAS,SAAA,CAAU,MAAA,CAAO,WAAA,CAAY,OAAO,CAAC,CAAA;AAAA,IACpD,CAAA;AAAA,IACA,EAAE,SAAA,EAAW,IAAA,EAAM,KAAA,EAAO,MAAA;AAAO,GACnC;AACA,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,aAAA,CACd,MAAA,EACA,EAAA,EACA,MAAA,EACA,OAAA,EACM;AACN,EAAA,KAAA;AAAA,IACE,CAAC,MAAA,EAAQ,MAAM,OAAA,CAAQ,EAAE,CAAC,CAAA;AAAA,IAC1B,CAAC,CAAC,OAAA,EAAS,QAAQ,CAAA,EAAG,WAAW,SAAA,KAAc;AAC7C,MAAA,IAAI,OAAA,IAAW,UAAU,SAAA,CAAU,MAAA,CAAO,WAAW,QAAA,EAAU,OAAA,EAAS,OAAO,CAAC,CAAA;AAAA,IAClF,CAAA;AAAA,IACA,EAAE,SAAA,EAAW,IAAA,EAAM,KAAA,EAAO,MAAA;AAAO,GACnC;AACF","file":"vue.js","sourcesContent":["import {\n type ComputedRef,\n computed,\n getCurrentScope,\n type MaybeRefOrGetter,\n onScopeDispose,\n type Ref,\n type ShallowRef,\n shallowRef,\n toValue,\n watch,\n} from 'vue'\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 disposeWithScope(dispose: () => void): void {\n if (getCurrentScope()) onScopeDispose(dispose)\n}\n\nexport function useWindowManager(options?: ManagerOptions): WindowManager {\n const wm = createWindowManager(options)\n disposeWithScope(() => wm.destroy())\n return wm\n}\n\nexport function useWmState(wm: WindowManager): ShallowRef<ManagerState> {\n const state = shallowRef(wm.getState())\n disposeWithScope(\n wm.subscribe((next) => {\n state.value = next\n }),\n )\n return state\n}\n\nexport function useWmWindow(\n wm: WindowManager,\n id: MaybeRefOrGetter<string>,\n): ComputedRef<WindowState | undefined> {\n const state = useWmState(wm)\n return computed(() => state.value.windows[toValue(id)])\n}\n\nexport function useDesktop(\n wm: WindowManager,\n target: Ref<HTMLElement | null | undefined>,\n options?: DesktopOptions,\n): DesktopBinder {\n const binder = createDesktopBinder(wm, options)\n watch(\n target,\n (element, _previous, onCleanup) => {\n if (element) onCleanup(binder.bindDesktop(element))\n },\n { immediate: true, flush: 'post' },\n )\n return binder\n}\n\nexport function useWmWindowEl(\n binder: DesktopBinder,\n id: MaybeRefOrGetter<string>,\n target: Ref<HTMLElement | null | undefined>,\n options?: WindowAttachOptions,\n): void {\n watch(\n [target, () => toValue(id)],\n ([element, windowId], _previous, onCleanup) => {\n if (element && windowId) onCleanup(binder.bindWindow(windowId, element, options))\n },\n { immediate: true, flush: 'post' },\n )\n}\n"]}
1
+ {"version":3,"sources":["../src/adapters/vue.ts"],"names":[],"mappings":";;;AAiBA,SAAS,iBAAiB,OAAA,EAA2B;AACnD,EAAA,IAAI,eAAA,EAAgB,EAAG,cAAA,CAAe,OAAO,CAAA;AAC/C;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,EAA6C;AACtE,EAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,EAAA,CAAG,QAAA,EAAU,CAAA;AACtC,EAAA,gBAAA;AAAA,IACE,EAAA,CAAG,SAAA,CAAU,CAAC,IAAA,KAAS;AACrB,MAAA,KAAA,CAAM,KAAA,GAAQ,IAAA;AAAA,IAChB,CAAC;AAAA,GACH;AACA,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,WAAA,CACd,IACA,EAAA,EACsC;AACtC,EAAA,MAAM,KAAA,GAAQ,WAAW,EAAE,CAAA;AAC3B,EAAA,OAAO,QAAA,CAAS,MAAM,KAAA,CAAM,KAAA,CAAM,QAAQ,OAAA,CAAQ,EAAE,CAAC,CAAC,CAAA;AACxD;AAEO,SAAS,UAAA,CACd,EAAA,EACA,MAAA,EACA,OAAA,EACe;AACf,EAAA,MAAM,MAAA,GAAS,mBAAA,CAAoB,EAAA,EAAI,OAAO,CAAA;AAC9C,EAAA,gBAAA,CAAiB,MAAM,MAAA,CAAO,OAAA,EAAS,CAAA;AACvC,EAAA,KAAA;AAAA,IACE,MAAA;AAAA,IACA,CAAC,OAAA,EAAS,SAAA,EAAW,SAAA,KAAc;AACjC,MAAA,IAAI,OAAA,EAAS,SAAA,CAAU,MAAA,CAAO,WAAA,CAAY,OAAO,CAAC,CAAA;AAAA,IACpD,CAAA;AAAA,IACA,EAAE,SAAA,EAAW,IAAA,EAAM,KAAA,EAAO,MAAA;AAAO,GACnC;AACA,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,aAAA,CACd,MAAA,EACA,EAAA,EACA,MAAA,EACA,OAAA,EACM;AACN,EAAA,KAAA;AAAA,IACE,CAAC,MAAA,EAAQ,MAAM,OAAA,CAAQ,EAAE,CAAC,CAAA;AAAA,IAC1B,CAAC,CAAC,OAAA,EAAS,QAAQ,CAAA,EAAG,WAAW,SAAA,KAAc;AAC7C,MAAA,IAAI,OAAA,IAAW,UAAU,SAAA,CAAU,MAAA,CAAO,WAAW,QAAA,EAAU,OAAA,EAAS,OAAO,CAAC,CAAA;AAAA,IAClF,CAAA;AAAA,IACA,EAAE,SAAA,EAAW,IAAA,EAAM,KAAA,EAAO,MAAA;AAAO,GACnC;AACF","file":"vue.js","sourcesContent":["import {\n type ComputedRef,\n computed,\n getCurrentScope,\n type MaybeRefOrGetter,\n onScopeDispose,\n type Ref,\n type ShallowRef,\n shallowRef,\n toValue,\n watch,\n} from 'vue'\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 disposeWithScope(dispose: () => void): void {\n if (getCurrentScope()) onScopeDispose(dispose)\n}\n\nexport function useWindowManager(options?: ManagerOptions): WindowManager {\n const wm = createWindowManager(options)\n disposeWithScope(() => wm.destroy())\n return wm\n}\n\nexport function useWmState(wm: WindowManager): ShallowRef<ManagerState> {\n const state = shallowRef(wm.getState())\n disposeWithScope(\n wm.subscribe((next) => {\n state.value = next\n }),\n )\n return state\n}\n\nexport function useWmWindow(\n wm: WindowManager,\n id: MaybeRefOrGetter<string>,\n): ComputedRef<WindowState | undefined> {\n const state = useWmState(wm)\n return computed(() => state.value.windows[toValue(id)])\n}\n\nexport function useDesktop(\n wm: WindowManager,\n target: Ref<HTMLElement | null | undefined>,\n options?: DesktopOptions,\n): DesktopBinder {\n const binder = createDesktopBinder(wm, options)\n disposeWithScope(() => binder.destroy())\n watch(\n target,\n (element, _previous, onCleanup) => {\n if (element) onCleanup(binder.bindDesktop(element))\n },\n { immediate: true, flush: 'post' },\n )\n return binder\n}\n\nexport function useWmWindowEl(\n binder: DesktopBinder,\n id: MaybeRefOrGetter<string>,\n target: Ref<HTMLElement | null | undefined>,\n options?: WindowAttachOptions,\n): void {\n watch(\n [target, () => toValue(id)],\n ([element, windowId], _previous, onCleanup) => {\n if (element && windowId) onCleanup(binder.bindWindow(windowId, element, options))\n },\n { immediate: true, flush: 'post' },\n )\n}\n"]}