@owdproject/nuxt 0.0.0-stage → 4.0.0-alpha.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (169) hide show
  1. package/LICENSE +20 -0
  2. package/README.md +77 -2
  3. package/dist/kit/authoring.d.ts +96 -0
  4. package/dist/kit/authoring.js +260 -0
  5. package/dist/kit/defineDesktopApp.d.ts +1 -0
  6. package/dist/kit/defineDesktopApp.js +1 -0
  7. package/dist/kit/defineDesktopPlugin.d.ts +1 -0
  8. package/dist/kit/defineDesktopPlugin.js +1 -0
  9. package/dist/module.d.mts +239 -0
  10. package/dist/module.json +12 -0
  11. package/dist/module.mjs +681 -0
  12. package/dist/runtime/components/Application/DesktopCoreApplicationRender.d.vue.ts +6 -0
  13. package/dist/runtime/components/Application/DesktopCoreApplicationRender.vue +18 -0
  14. package/dist/runtime/components/Application/DesktopCoreApplicationRender.vue.d.ts +6 -0
  15. package/dist/runtime/components/Application/DesktopCoreApplicationWindowsRender.d.vue.ts +9 -0
  16. package/dist/runtime/components/Application/DesktopCoreApplicationWindowsRender.vue +31 -0
  17. package/dist/runtime/components/Application/DesktopCoreApplicationWindowsRender.vue.d.ts +9 -0
  18. package/dist/runtime/components/DesktopCore.d.vue.ts +19 -0
  19. package/dist/runtime/components/DesktopCore.vue +37 -0
  20. package/dist/runtime/components/DesktopCore.vue.d.ts +19 -0
  21. package/dist/runtime/components/background/DesktopCoreBackground.d.vue.ts +13 -0
  22. package/dist/runtime/components/background/DesktopCoreBackground.vue +16 -0
  23. package/dist/runtime/components/background/DesktopCoreBackground.vue.d.ts +13 -0
  24. package/dist/runtime/components/time/DesktopCoreTime.d.vue.ts +3 -0
  25. package/dist/runtime/components/time/DesktopCoreTime.vue +44 -0
  26. package/dist/runtime/components/time/DesktopCoreTime.vue.d.ts +3 -0
  27. package/dist/runtime/components/window/DesktopCoreWindow.d.vue.ts +49 -0
  28. package/dist/runtime/components/window/DesktopCoreWindow.vue +403 -0
  29. package/dist/runtime/components/window/DesktopCoreWindow.vue.d.ts +49 -0
  30. package/dist/runtime/components/window/DesktopCoreWindowContent.d.vue.ts +13 -0
  31. package/dist/runtime/components/window/DesktopCoreWindowContent.vue +34 -0
  32. package/dist/runtime/components/window/DesktopCoreWindowContent.vue.d.ts +13 -0
  33. package/dist/runtime/components/window/DesktopCoreWindowNav.d.vue.ts +13 -0
  34. package/dist/runtime/components/window/DesktopCoreWindowNav.vue +54 -0
  35. package/dist/runtime/components/window/DesktopCoreWindowNav.vue.d.ts +13 -0
  36. package/dist/runtime/components/window/DesktopCoreWindowSnapHintsBase.d.vue.ts +19 -0
  37. package/dist/runtime/components/window/DesktopCoreWindowSnapHintsBase.vue +46 -0
  38. package/dist/runtime/components/window/DesktopCoreWindowSnapHintsBase.vue.d.ts +19 -0
  39. package/dist/runtime/components/workspace/DesktopCoreWorkspaceEdgeHintsBase.d.vue.ts +24 -0
  40. package/dist/runtime/components/workspace/DesktopCoreWorkspaceEdgeHintsBase.vue +50 -0
  41. package/dist/runtime/components/workspace/DesktopCoreWorkspaceEdgeHintsBase.vue.d.ts +24 -0
  42. package/dist/runtime/composables/application/state.d.ts +1 -0
  43. package/dist/runtime/composables/application/state.js +2 -0
  44. package/dist/runtime/composables/application/useDesktopApplicationDefine.d.ts +4 -0
  45. package/dist/runtime/composables/application/useDesktopApplicationDefine.js +36 -0
  46. package/dist/runtime/composables/application/useDesktopApplicationExec.d.ts +3 -0
  47. package/dist/runtime/composables/application/useDesktopApplicationExec.js +26 -0
  48. package/dist/runtime/composables/application/useDesktopApplicationProcess.d.ts +24 -0
  49. package/dist/runtime/composables/application/useDesktopApplicationProcess.js +140 -0
  50. package/dist/runtime/composables/application/useDesktopApplicationRegistry.d.ts +11 -0
  51. package/dist/runtime/composables/application/useDesktopApplicationRegistry.js +60 -0
  52. package/dist/runtime/composables/useApplicationEntries.d.ts +5 -0
  53. package/dist/runtime/composables/useApplicationEntries.js +10 -0
  54. package/dist/runtime/composables/useApplicationManager.d.ts +16 -0
  55. package/dist/runtime/composables/useApplicationManager.js +30 -0
  56. package/dist/runtime/composables/useBlockNonInputContextMenu.d.ts +5 -0
  57. package/dist/runtime/composables/useBlockNonInputContextMenu.js +19 -0
  58. package/dist/runtime/composables/useDesktop.d.ts +210 -0
  59. package/dist/runtime/composables/useDesktop.js +52 -0
  60. package/dist/runtime/composables/useDesktopApplication.d.ts +34 -0
  61. package/dist/runtime/composables/useDesktopApplication.js +17 -0
  62. package/dist/runtime/composables/useDesktopCommands.d.ts +12 -0
  63. package/dist/runtime/composables/useDesktopCommands.js +348 -0
  64. package/dist/runtime/composables/useDesktopConfig.d.ts +3 -0
  65. package/dist/runtime/composables/useDesktopConfig.js +10 -0
  66. package/dist/runtime/composables/useDesktopDefaultApps.d.ts +15 -0
  67. package/dist/runtime/composables/useDesktopDefaultApps.js +21 -0
  68. package/dist/runtime/composables/useDesktopDialogs.d.ts +5 -0
  69. package/dist/runtime/composables/useDesktopDialogs.js +8 -0
  70. package/dist/runtime/composables/useDesktopDrag.d.ts +1 -0
  71. package/dist/runtime/composables/useDesktopDrag.js +1 -0
  72. package/dist/runtime/composables/useDesktopHooks.d.ts +15 -0
  73. package/dist/runtime/composables/useDesktopHooks.js +12 -0
  74. package/dist/runtime/composables/useDesktopIPC.d.ts +35 -0
  75. package/dist/runtime/composables/useDesktopIPC.js +72 -0
  76. package/dist/runtime/composables/useDesktopIdentity.d.ts +22 -0
  77. package/dist/runtime/composables/useDesktopIdentity.js +65 -0
  78. package/dist/runtime/composables/useDesktopManifest.d.ts +6 -0
  79. package/dist/runtime/composables/useDesktopManifest.js +17 -0
  80. package/dist/runtime/composables/useDesktopNotification.d.ts +13 -0
  81. package/dist/runtime/composables/useDesktopNotification.js +13 -0
  82. package/dist/runtime/composables/useDesktopResize.d.ts +1 -0
  83. package/dist/runtime/composables/useDesktopResize.js +1 -0
  84. package/dist/runtime/composables/useDesktopSession.d.ts +4 -0
  85. package/dist/runtime/composables/useDesktopSession.js +17 -0
  86. package/dist/runtime/composables/useDesktopShellIdentity.d.ts +1 -0
  87. package/dist/runtime/composables/useDesktopShellIdentity.js +3 -0
  88. package/dist/runtime/composables/useDesktopShellOptions.d.ts +5 -0
  89. package/dist/runtime/composables/useDesktopShellOptions.js +18 -0
  90. package/dist/runtime/composables/useDesktopTray.d.ts +5 -0
  91. package/dist/runtime/composables/useDesktopTray.js +10 -0
  92. package/dist/runtime/composables/useDesktopVolume.d.ts +4 -0
  93. package/dist/runtime/composables/useDesktopVolume.js +9 -0
  94. package/dist/runtime/composables/useDesktopWorkArea.d.ts +1 -0
  95. package/dist/runtime/composables/useDesktopWorkArea.js +3 -0
  96. package/dist/runtime/composables/useDesktopWorkarea.d.ts +12 -0
  97. package/dist/runtime/composables/useDesktopWorkarea.js +72 -0
  98. package/dist/runtime/composables/useTerminalManager.d.ts +15 -0
  99. package/dist/runtime/composables/useTerminalManager.js +9 -0
  100. package/dist/runtime/composables/useToggleWindowMaximize.d.ts +1 -0
  101. package/dist/runtime/composables/useToggleWindowMaximize.js +12 -0
  102. package/dist/runtime/composables/useWindowDragHandlers.d.ts +7 -0
  103. package/dist/runtime/composables/useWindowDragHandlers.js +7 -0
  104. package/dist/runtime/composables/window/useDesktopWindow.d.ts +14 -0
  105. package/dist/runtime/composables/window/useDesktopWindow.js +192 -0
  106. package/dist/runtime/composables/window/useDesktopWindowSnapDrop.d.ts +13 -0
  107. package/dist/runtime/composables/window/useDesktopWindowSnapDrop.js +78 -0
  108. package/dist/runtime/composables/workspace/useDesktopWorkspaceEdgeDrop.d.ts +25 -0
  109. package/dist/runtime/composables/workspace/useDesktopWorkspaceEdgeDrop.js +119 -0
  110. package/dist/runtime/composables/workspace/useDesktopWorkspaceManager.d.ts +8 -0
  111. package/dist/runtime/composables/workspace/useDesktopWorkspaceManager.js +46 -0
  112. package/dist/runtime/composables/workspace/useDesktopWorkspaceOverviewCapture.d.ts +20 -0
  113. package/dist/runtime/composables/workspace/useDesktopWorkspaceOverviewCapture.js +60 -0
  114. package/dist/runtime/composables/workspace/useDesktopWorkspaceOverviewLiveScale.d.ts +31 -0
  115. package/dist/runtime/composables/workspace/useDesktopWorkspaceOverviewLiveScale.js +92 -0
  116. package/dist/runtime/constants/desktopShellKeys.d.ts +5 -0
  117. package/dist/runtime/constants/desktopShellKeys.js +2 -0
  118. package/dist/runtime/constants/shellLayout.d.ts +4 -0
  119. package/dist/runtime/constants/shellLayout.js +2 -0
  120. package/dist/runtime/dialogs/desktopDialogProvider.d.ts +6 -0
  121. package/dist/runtime/dialogs/desktopDialogProvider.js +12 -0
  122. package/dist/runtime/internal/controllers/ApplicationController.d.ts +37 -0
  123. package/dist/runtime/internal/controllers/ApplicationController.js +434 -0
  124. package/dist/runtime/internal/controllers/WindowController.d.ts +83 -0
  125. package/dist/runtime/internal/controllers/WindowController.js +435 -0
  126. package/dist/runtime/plugins/01.desktop-shell-init.client.d.ts +2 -0
  127. package/dist/runtime/plugins/01.desktop-shell-init.client.js +18 -0
  128. package/dist/runtime/plugins/02.desktop-register-desktop-apps.client.d.ts +2 -0
  129. package/dist/runtime/plugins/02.desktop-register-desktop-apps.client.js +7 -0
  130. package/dist/runtime/stores/storeApplicationMeta.d.ts +2 -0
  131. package/dist/runtime/stores/storeApplicationMeta.js +20 -0
  132. package/dist/runtime/stores/storeApplicationWindows.d.ts +2 -0
  133. package/dist/runtime/stores/storeApplicationWindows.js +33 -0
  134. package/dist/runtime/stores/storeDesktop.d.ts +17 -0
  135. package/dist/runtime/stores/storeDesktop.js +16 -0
  136. package/dist/runtime/stores/storeDesktopDefaultApps.d.ts +8 -0
  137. package/dist/runtime/stores/storeDesktopDefaultApps.js +21 -0
  138. package/dist/runtime/stores/storeDesktopTray.d.ts +6 -0
  139. package/dist/runtime/stores/storeDesktopTray.js +21 -0
  140. package/dist/runtime/stores/storeDesktopVolume.d.ts +4 -0
  141. package/dist/runtime/stores/storeDesktopVolume.js +12 -0
  142. package/dist/runtime/stores/storeDesktopWorkspace.d.ts +26 -0
  143. package/dist/runtime/stores/storeDesktopWorkspace.js +91 -0
  144. package/dist/runtime/stores/storeNotification.d.ts +27 -0
  145. package/dist/runtime/stores/storeNotification.js +55 -0
  146. package/dist/runtime/types/index.d.ts +1 -0
  147. package/dist/runtime/types/index.js +1 -0
  148. package/dist/runtime/utils/defineDesktopApp.d.ts +2 -0
  149. package/dist/runtime/utils/defineDesktopApp.js +5 -0
  150. package/dist/runtime/utils/defineDesktopPlugin.d.ts +19 -0
  151. package/dist/runtime/utils/defineDesktopPlugin.js +29 -0
  152. package/dist/runtime/utils/utilApp.d.ts +2 -0
  153. package/dist/runtime/utils/utilApp.js +9 -0
  154. package/dist/runtime/utils/utilCaptureElementToCanvas.d.ts +1 -0
  155. package/dist/runtime/utils/utilCaptureElementToCanvas.js +21 -0
  156. package/dist/runtime/utils/utilDebug.d.ts +4 -0
  157. package/dist/runtime/utils/utilDebug.js +24 -0
  158. package/dist/runtime/utils/utilDetectSnapZone.d.ts +1 -0
  159. package/dist/runtime/utils/utilDetectSnapZone.js +5 -0
  160. package/dist/runtime/utils/utilWindowControllerAdapter.d.ts +2 -0
  161. package/dist/runtime/utils/utilWindowControllerAdapter.js +151 -0
  162. package/dist/runtime/utils/utilWindowLayout.d.ts +4 -0
  163. package/dist/runtime/utils/utilWindowLayout.js +34 -0
  164. package/dist/runtime/utils/utilWorkspaceWindows.d.ts +2 -0
  165. package/dist/runtime/utils/utilWorkspaceWindows.js +12 -0
  166. package/dist/types/index.d.ts +156 -0
  167. package/dist/types/index.js +1 -0
  168. package/dist/types.d.mts +2 -0
  169. package/package.json +145 -4
@@ -0,0 +1,403 @@
1
+ <script setup>
2
+ import { ref, provide, onMounted, computed, watch } from "vue";
3
+ import { useAppConfig } from "#imports";
4
+ import { useDraggable, useEventListener } from "@vueuse/core";
5
+ import { handleWindowControllerProps } from "../../utils/utilWindowControllerAdapter";
6
+ import { useDesktopWorkspaceStore } from "../../stores/storeDesktopWorkspace";
7
+ import { useDesktopWorkspaceEdgeDrop } from "../../composables/workspace/useDesktopWorkspaceEdgeDrop";
8
+ import { useDesktopWindowSnapDrop } from "../../composables/window/useDesktopWindowSnapDrop";
9
+ import { useDesktopWindow } from "../../composables/window/useDesktopWindow";
10
+ const props = defineProps({
11
+ window: { type: null, required: false },
12
+ content: { type: null, required: false }
13
+ });
14
+ const desktopWorkspaceStore = useDesktopWorkspaceStore();
15
+ const { topMaximizedWindow } = useDesktopWindow();
16
+ const { beginWindowDrag, endWindowDrag } = useDesktopWorkspaceEdgeDrop();
17
+ const { beginWindowSnapDrag, endWindowSnapDrag } = useDesktopWindowSnapDrop();
18
+ const emit = defineEmits([
19
+ "resize:start",
20
+ "resize:move",
21
+ "resize:end",
22
+ "drag:start",
23
+ "drag:move",
24
+ "drag:end",
25
+ "close",
26
+ "open",
27
+ "blur",
28
+ "focus",
29
+ "minimize",
30
+ "restore",
31
+ "maximize",
32
+ "unmaximize",
33
+ "toggle-maximize"
34
+ ]);
35
+ const appConfig = useAppConfig();
36
+ const windowController = handleWindowControllerProps(
37
+ props.window
38
+ );
39
+ const isHovered = ref(false);
40
+ const isDragging = computed(() => !!windowController?.state?.dragging);
41
+ const isResizing = computed(() => !!windowController?.state?.resizing);
42
+ const isHibernated = computed(() => {
43
+ if (!windowController?.state) return false;
44
+ if (windowController.state.active === false) return true;
45
+ if (!desktopWorkspaceStore.overview) {
46
+ const winWorkspace = windowController.state.workspace;
47
+ if (winWorkspace && winWorkspace !== desktopWorkspaceStore.active) {
48
+ return true;
49
+ }
50
+ const topMax = topMaximizedWindow.value;
51
+ if (topMax && topMax.state.id !== windowController.state.id && (topMax.position?.z ?? 0) > (windowController.position?.z ?? 0)) {
52
+ return true;
53
+ }
54
+ }
55
+ return false;
56
+ });
57
+ const showResizeHandles = computed(
58
+ () => Boolean(
59
+ windowController?.isResizable && !desktopWorkspaceStore.overview && !windowController?.state?.maximized && !isHibernated.value && (windowController?.state?.focused || isHovered.value || isResizing.value)
60
+ )
61
+ );
62
+ provide("windowController", windowController);
63
+ provide("windowContent", props.content ?? {});
64
+ provide("windowHibernated", isHibernated);
65
+ const windowRef = ref(null);
66
+ const dragHandleRef = ref(null);
67
+ onMounted(() => {
68
+ if (windowController?.state?.focused) {
69
+ windowController.actions.bringToFront();
70
+ }
71
+ if (windowRef.value) {
72
+ dragHandleRef.value = windowRef.value.querySelector(".desktop-window-nav__draggable");
73
+ }
74
+ });
75
+ const { x, y } = useDraggable(windowRef, {
76
+ handle: dragHandleRef,
77
+ initialValue: {
78
+ x: windowController?.position?.x ?? 0,
79
+ y: windowController?.position?.y ?? 0
80
+ },
81
+ onStart(event) {
82
+ if (!windowController?.isDraggable || desktopWorkspaceStore.overview || windowController?.state?.maximized) {
83
+ return false;
84
+ }
85
+ onWindowPointerDown();
86
+ windowController?.startDrag();
87
+ beginWindowDrag(windowController.state.id);
88
+ beginWindowSnapDrag(
89
+ windowController.state.id,
90
+ desktopWorkspaceStore.workarea,
91
+ windowController.isMaximizable
92
+ );
93
+ emit("drag:start", event);
94
+ },
95
+ onMove(position, event) {
96
+ emit("drag:move", { left: position.x, top: position.y });
97
+ },
98
+ onEnd(position, event) {
99
+ windowController?.stopDrag();
100
+ if (!desktopWorkspaceStore.overview) {
101
+ const snapped = endWindowSnapDrag(windowController);
102
+ if (!snapped) {
103
+ const moved = endWindowDrag(windowController);
104
+ if (!moved) {
105
+ windowController?.actions?.setPosition({
106
+ x: position.x,
107
+ y: position.y
108
+ });
109
+ if (windowController.state.layout && windowController.state.layout !== "normal") {
110
+ windowController.actions.clearLayout();
111
+ }
112
+ }
113
+ }
114
+ } else {
115
+ windowController?.actions?.setPosition({
116
+ x: position.x,
117
+ y: position.y
118
+ });
119
+ }
120
+ emit("drag:end", { left: position.x, top: position.y });
121
+ }
122
+ });
123
+ watch(
124
+ () => [
125
+ windowController?.state?.position?.x ?? windowController?.position?.x,
126
+ windowController?.state?.position?.y ?? windowController?.position?.y
127
+ ],
128
+ ([posX, posY]) => {
129
+ x.value = posX ?? 0;
130
+ y.value = posY ?? 0;
131
+ }
132
+ );
133
+ const width = ref(windowController?.size?.width ?? 300);
134
+ const height = ref(windowController?.size?.height ?? 200);
135
+ watch(
136
+ () => [
137
+ windowController?.state?.size?.width ?? windowController?.size?.width,
138
+ windowController?.state?.size?.height ?? windowController?.size?.height
139
+ ],
140
+ ([w, h]) => {
141
+ width.value = w ?? 300;
142
+ height.value = h ?? 200;
143
+ },
144
+ { immediate: true }
145
+ );
146
+ function onWindowPointerDown() {
147
+ windowController?.actions?.setActive(true);
148
+ windowController?.actions?.bringToFront();
149
+ }
150
+ function startResize(e, direction) {
151
+ if (!windowController) return;
152
+ e.stopPropagation();
153
+ e.preventDefault();
154
+ onWindowPointerDown();
155
+ windowController.startResize();
156
+ emit("resize:start", e);
157
+ const startX = e.clientX;
158
+ const startY = e.clientY;
159
+ const startWidth = windowRef.value ? windowRef.value.offsetWidth : windowController.size.width ?? 300;
160
+ const startHeight = windowRef.value ? windowRef.value.offsetHeight : windowController.size.height ?? 200;
161
+ const startLeft = windowController.position?.x ?? 0;
162
+ const startTop = windowController.position?.y ?? 0;
163
+ const minWidth = windowController.size.minWidth ?? 150;
164
+ const minHeight = windowController.size.minHeight ?? 150;
165
+ const maxWidth = windowController.size.maxWidth ?? Infinity;
166
+ const maxHeight = windowController.size.maxHeight ?? Infinity;
167
+ let currentLeft = startLeft;
168
+ let currentTop = startTop;
169
+ let currentWidth = startWidth;
170
+ let currentHeight = startHeight;
171
+ const cleanupMove = useEventListener(window, "pointermove", (event) => {
172
+ const deltaX = event.clientX - startX;
173
+ const deltaY = event.clientY - startY;
174
+ let nextWidth = startWidth;
175
+ let nextHeight = startHeight;
176
+ let nextLeft = startLeft;
177
+ let nextTop = startTop;
178
+ if (direction.includes("e")) {
179
+ nextWidth = Math.max(minWidth, Math.min(maxWidth, startWidth + deltaX));
180
+ }
181
+ if (direction.includes("w")) {
182
+ const proposedWidth = startWidth - deltaX;
183
+ nextWidth = Math.max(minWidth, Math.min(maxWidth, proposedWidth));
184
+ if (proposedWidth >= minWidth && proposedWidth <= maxWidth) {
185
+ nextLeft = startLeft + deltaX;
186
+ }
187
+ }
188
+ if (direction.includes("s")) {
189
+ nextHeight = Math.max(minHeight, Math.min(maxHeight, startHeight + deltaY));
190
+ }
191
+ if (direction.includes("n")) {
192
+ const proposedHeight = startHeight - deltaY;
193
+ nextHeight = Math.max(minHeight, Math.min(maxHeight, proposedHeight));
194
+ if (proposedHeight >= minHeight && proposedHeight <= maxHeight) {
195
+ nextTop = startTop + deltaY;
196
+ }
197
+ }
198
+ currentLeft = nextLeft;
199
+ currentTop = nextTop;
200
+ currentWidth = nextWidth;
201
+ currentHeight = nextHeight;
202
+ x.value = nextLeft;
203
+ y.value = nextTop;
204
+ width.value = nextWidth;
205
+ height.value = nextHeight;
206
+ emit("resize:move", { left: nextLeft, top: nextTop, width: nextWidth, height: nextHeight });
207
+ });
208
+ const cleanupUp = useEventListener(window, "pointerup", (event) => {
209
+ cleanupMove();
210
+ cleanupUp();
211
+ windowController.actions.setPosition({
212
+ x: currentLeft,
213
+ y: currentTop
214
+ });
215
+ windowController.actions.setSize({
216
+ width: currentWidth,
217
+ height: currentHeight
218
+ });
219
+ windowController.stopResize();
220
+ emit("resize:end", { left: currentLeft, top: currentTop, width: currentWidth, height: currentHeight });
221
+ });
222
+ }
223
+ const classes = computed(() => {
224
+ const list = ["desktop-window", "resizable-component"];
225
+ if (windowController?.state.focused) {
226
+ list.push("desktop-window--focused");
227
+ }
228
+ if (isDragging.value) {
229
+ list.push("desktop-window--dragging");
230
+ }
231
+ if (isResizing.value) {
232
+ list.push("desktop-window--resizing");
233
+ }
234
+ if (isHibernated.value) {
235
+ list.push("desktop-window--hibernated");
236
+ }
237
+ return list;
238
+ });
239
+ function onOverviewNativeDragStart(e) {
240
+ if (!desktopWorkspaceStore.overview || !windowController) return;
241
+ e.stopPropagation();
242
+ e.dataTransfer?.setData("text/plain", windowController.state.id);
243
+ e.dataTransfer.effectAllowed = "move";
244
+ try {
245
+ const img = new Image();
246
+ img.src = "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7";
247
+ e.dataTransfer?.setDragImage(img, 0, 0);
248
+ } catch {
249
+ }
250
+ }
251
+ const windowPositionMode = computed(
252
+ () => appConfig.desktop?.windows?.position ?? "fixed"
253
+ );
254
+ </script>
255
+
256
+ <template>
257
+ <div
258
+ ref="windowRef"
259
+ :class="classes"
260
+ :style="{
261
+ left: `${x}px`,
262
+ top: `${y}px`,
263
+ width: typeof width === 'number' ? `${width}px` : width,
264
+ height: typeof height === 'number' ? `${height}px` : height,
265
+ zIndex: windowController?.position?.z,
266
+ position: windowPositionMode
267
+ }"
268
+ :draggable="desktopWorkspaceStore.overview"
269
+ :aria-hidden="isHibernated ? 'true' : void 0"
270
+ @pointerenter="isHovered = true"
271
+ @pointerleave="isHovered = false"
272
+ @pointerdown="onWindowPointerDown"
273
+ @dragstart="onOverviewNativeDragStart"
274
+ >
275
+ <!-- 8-way Lazy Resize Handles (mounted only when focused, hovered, or resizing) -->
276
+ <div v-if="showResizeHandles" class="window-resize-handles">
277
+ <div class="resize-handle handle-t" @pointerdown.stop.prevent="startResize($event, 't')"></div>
278
+ <div class="resize-handle handle-b" @pointerdown.stop.prevent="startResize($event, 'b')"></div>
279
+ <div class="resize-handle handle-r" @pointerdown.stop.prevent="startResize($event, 'r')"></div>
280
+ <div class="resize-handle handle-l" @pointerdown.stop.prevent="startResize($event, 'l')"></div>
281
+ <div class="resize-handle handle-tl" @pointerdown.stop.prevent="startResize($event, 'tl')"></div>
282
+ <div class="resize-handle handle-tr" @pointerdown.stop.prevent="startResize($event, 'tr')"></div>
283
+ <div class="resize-handle handle-bl" @pointerdown.stop.prevent="startResize($event, 'bl')"></div>
284
+ <div class="resize-handle handle-br" @pointerdown.stop.prevent="startResize($event, 'br')"></div>
285
+ </div>
286
+
287
+ <slot />
288
+ </div>
289
+ </template>
290
+
291
+ <style scoped>
292
+ .desktop-window {
293
+ position: v-bind("windowPositionMode");
294
+ box-sizing: border-box;
295
+ /* Native CSS Containment: isolates layout, style, and paint calculations per window */
296
+ contain: layout paint style;
297
+ /* Relax paint containment on focused/hovered/resizing windows so -4px outer resize handles remain interactive */
298
+ }
299
+ .desktop-window--focused, .desktop-window--resizing, .desktop-window:hover {
300
+ contain: layout style;
301
+ }
302
+ .desktop-window--dragging, .desktop-window--resizing {
303
+ will-change: left, top, width, height;
304
+ }
305
+ .desktop-window--dragging :deep(.desktop-window__content), .desktop-window--resizing :deep(.desktop-window__content) {
306
+ pointer-events: none;
307
+ }
308
+ .desktop-window {
309
+ /* Window Hibernation / Occlusion Culling: skips layout & paint for minimized, off-workspace, or fully occluded windows */
310
+ }
311
+ .desktop-window--hibernated {
312
+ content-visibility: hidden;
313
+ pointer-events: none;
314
+ }
315
+ .desktop-window :deep(.desktop-window__content) {
316
+ overflow-y: auto;
317
+ height: 100%;
318
+ min-height: 0;
319
+ contain: layout paint style;
320
+ content-visibility: auto;
321
+ }
322
+
323
+ .window-resize-handles {
324
+ position: absolute;
325
+ top: 0;
326
+ left: 0;
327
+ right: 0;
328
+ bottom: 0;
329
+ pointer-events: none;
330
+ z-index: 9999;
331
+ }
332
+
333
+ .resize-handle {
334
+ position: absolute;
335
+ pointer-events: auto;
336
+ }
337
+
338
+ /* Borders */
339
+ .handle-t {
340
+ top: -4px;
341
+ left: 4px;
342
+ right: 4px;
343
+ height: 8px;
344
+ cursor: ns-resize;
345
+ }
346
+
347
+ .handle-b {
348
+ bottom: -4px;
349
+ left: 4px;
350
+ right: 4px;
351
+ height: 8px;
352
+ cursor: ns-resize;
353
+ }
354
+
355
+ .handle-r {
356
+ right: -4px;
357
+ top: 4px;
358
+ bottom: 4px;
359
+ width: 8px;
360
+ cursor: ew-resize;
361
+ }
362
+
363
+ .handle-l {
364
+ left: -4px;
365
+ top: 4px;
366
+ bottom: 4px;
367
+ width: 8px;
368
+ cursor: ew-resize;
369
+ }
370
+
371
+ /* Angles */
372
+ .handle-tl {
373
+ top: -4px;
374
+ left: -4px;
375
+ width: 8px;
376
+ height: 8px;
377
+ cursor: nwse-resize;
378
+ }
379
+
380
+ .handle-tr {
381
+ top: -4px;
382
+ right: -4px;
383
+ width: 8px;
384
+ height: 8px;
385
+ cursor: nesw-resize;
386
+ }
387
+
388
+ .handle-bl {
389
+ bottom: -4px;
390
+ left: -4px;
391
+ width: 8px;
392
+ height: 8px;
393
+ cursor: nesw-resize;
394
+ }
395
+
396
+ .handle-br {
397
+ bottom: -4px;
398
+ right: -4px;
399
+ width: 8px;
400
+ height: 8px;
401
+ cursor: nwse-resize;
402
+ }
403
+ </style>
@@ -0,0 +1,49 @@
1
+ type __VLS_Props = {
2
+ window?: IWindowController;
3
+ content?: WindowContent;
4
+ };
5
+ declare var __VLS_1: {};
6
+ type __VLS_Slots = {} & {
7
+ default?: (props: typeof __VLS_1) => any;
8
+ };
9
+ declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
10
+ maximize: (...args: any[]) => void;
11
+ focus: (...args: any[]) => void;
12
+ minimize: (...args: any[]) => void;
13
+ unmaximize: (...args: any[]) => void;
14
+ open: (...args: any[]) => void;
15
+ blur: (...args: any[]) => void;
16
+ close: (...args: any[]) => void;
17
+ "resize:start": (...args: any[]) => void;
18
+ "resize:move": (...args: any[]) => void;
19
+ "resize:end": (...args: any[]) => void;
20
+ "drag:start": (...args: any[]) => void;
21
+ "drag:move": (...args: any[]) => void;
22
+ "drag:end": (...args: any[]) => void;
23
+ restore: (...args: any[]) => void;
24
+ "toggle-maximize": (...args: any[]) => void;
25
+ }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
26
+ onMaximize?: ((...args: any[]) => any) | undefined;
27
+ onFocus?: ((...args: any[]) => any) | undefined;
28
+ onMinimize?: ((...args: any[]) => any) | undefined;
29
+ onUnmaximize?: ((...args: any[]) => any) | undefined;
30
+ onOpen?: ((...args: any[]) => any) | undefined;
31
+ onBlur?: ((...args: any[]) => any) | undefined;
32
+ onClose?: ((...args: any[]) => any) | undefined;
33
+ "onResize:start"?: ((...args: any[]) => any) | undefined;
34
+ "onResize:move"?: ((...args: any[]) => any) | undefined;
35
+ "onResize:end"?: ((...args: any[]) => any) | undefined;
36
+ "onDrag:start"?: ((...args: any[]) => any) | undefined;
37
+ "onDrag:move"?: ((...args: any[]) => any) | undefined;
38
+ "onDrag:end"?: ((...args: any[]) => any) | undefined;
39
+ onRestore?: ((...args: any[]) => any) | undefined;
40
+ "onToggle-maximize"?: ((...args: any[]) => any) | undefined;
41
+ }>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
42
+ declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
43
+ declare const _default: typeof __VLS_export;
44
+ export default _default;
45
+ type __VLS_WithSlots<T, S> = T & {
46
+ new (): {
47
+ $slots: S;
48
+ };
49
+ };
@@ -0,0 +1,13 @@
1
+ declare var __VLS_1: {};
2
+ type __VLS_Slots = {} & {
3
+ default?: (props: typeof __VLS_1) => any;
4
+ };
5
+ declare const __VLS_base: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
6
+ declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
7
+ declare const _default: typeof __VLS_export;
8
+ export default _default;
9
+ type __VLS_WithSlots<T, S> = T & {
10
+ new (): {
11
+ $slots: S;
12
+ };
13
+ };
@@ -0,0 +1,34 @@
1
+ <script setup>
2
+ import { inject, computed } from "vue";
3
+ const windowContent = inject("windowContent");
4
+ const windowHibernated = inject("windowHibernated", void 0);
5
+ const classes = computed(() => {
6
+ const list = ["desktop-window__content"];
7
+ if (windowContent?.centered) {
8
+ list.push("desktop-window__content--centered");
9
+ }
10
+ if (windowContent?.padded) {
11
+ list.push("desktop-window__content--padded");
12
+ }
13
+ if (windowHibernated?.value) {
14
+ list.push("desktop-window__content--hibernated");
15
+ }
16
+ return list;
17
+ });
18
+ </script>
19
+
20
+ <template>
21
+ <div :class="classes">
22
+ <slot />
23
+ </div>
24
+ </template>
25
+
26
+ <style scoped>
27
+ .desktop-window__content {
28
+ contain: layout paint style;
29
+ content-visibility: auto;
30
+ }
31
+ .desktop-window__content--hibernated {
32
+ content-visibility: hidden;
33
+ }
34
+ </style>
@@ -0,0 +1,13 @@
1
+ declare var __VLS_1: {};
2
+ type __VLS_Slots = {} & {
3
+ default?: (props: typeof __VLS_1) => any;
4
+ };
5
+ declare const __VLS_base: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
6
+ declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
7
+ declare const _default: typeof __VLS_export;
8
+ export default _default;
9
+ type __VLS_WithSlots<T, S> = T & {
10
+ new (): {
11
+ $slots: S;
12
+ };
13
+ };
@@ -0,0 +1,13 @@
1
+ declare var __VLS_1: {};
2
+ type __VLS_Slots = {} & {
3
+ default?: (props: typeof __VLS_1) => any;
4
+ };
5
+ declare const __VLS_base: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
6
+ declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
7
+ declare const _default: typeof __VLS_export;
8
+ export default _default;
9
+ type __VLS_WithSlots<T, S> = T & {
10
+ new (): {
11
+ $slots: S;
12
+ };
13
+ };
@@ -0,0 +1,54 @@
1
+ <script setup>
2
+ import { inject } from "vue";
3
+ import { computed } from "@vue/reactivity";
4
+ const windowController = inject("windowController");
5
+ const classes = computed(() => {
6
+ const list = ["desktop-window-nav"];
7
+ if (typeof windowController?.state.active === "undefined" || !!windowController?.state.active) {
8
+ list.push("desktop-window-nav--active");
9
+ }
10
+ if (windowController?.state.focused) {
11
+ list.push("desktop-window-nav--focused");
12
+ }
13
+ return list;
14
+ });
15
+ </script>
16
+
17
+ <template>
18
+ <div :class="classes">
19
+ <div class="desktop-window-nav__draggable" />
20
+
21
+ <slot />
22
+ </div>
23
+ </template>
24
+
25
+ <style>
26
+ /**
27
+ * Title/icon sit above the drag layer in DOM order; use pointer-events so
28
+ * mousedown reaches `.desktop-window-nav__draggable` for vue-resizable. Window
29
+ * controls stay clickable.
30
+ */
31
+ .desktop-window-nav {
32
+ position: relative;
33
+ display: flex;
34
+ align-items: stretch;
35
+ width: 100%;
36
+ min-height: 0;
37
+ }
38
+ .desktop-window-nav__draggable {
39
+ position: absolute;
40
+ inset: 0;
41
+ z-index: 1;
42
+ }
43
+ .desktop-window-nav > :not(.desktop-window-nav__draggable) {
44
+ position: relative;
45
+ z-index: 2;
46
+ pointer-events: none;
47
+ }
48
+ .desktop-window-nav > .desktop-window-nav__btn-group {
49
+ pointer-events: auto;
50
+ }
51
+ .desktop-window-nav > .desktop-window-nav__interactive {
52
+ pointer-events: auto;
53
+ }
54
+ </style>
@@ -0,0 +1,13 @@
1
+ declare var __VLS_1: {};
2
+ type __VLS_Slots = {} & {
3
+ default?: (props: typeof __VLS_1) => any;
4
+ };
5
+ declare const __VLS_base: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
6
+ declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
7
+ declare const _default: typeof __VLS_export;
8
+ export default _default;
9
+ type __VLS_WithSlots<T, S> = T & {
10
+ new (): {
11
+ $slots: S;
12
+ };
13
+ };
@@ -0,0 +1,19 @@
1
+ type __VLS_Props = {
2
+ enabled?: boolean;
3
+ };
4
+ declare var __VLS_1: {
5
+ zone: any;
6
+ rect: import("@owdproject/core").WindowBounds | null;
7
+ };
8
+ type __VLS_Slots = {} & {
9
+ default?: (props: typeof __VLS_1) => any;
10
+ };
11
+ declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
12
+ declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
13
+ declare const _default: typeof __VLS_export;
14
+ export default _default;
15
+ type __VLS_WithSlots<T, S> = T & {
16
+ new (): {
17
+ $slots: S;
18
+ };
19
+ };
@@ -0,0 +1,46 @@
1
+ <script setup>
2
+ import { computed } from "vue";
3
+ import { useDesktopWorkspaceStore } from "../../stores/storeDesktopWorkspace";
4
+ import { useDesktopWindowSnapDrop } from "../../composables/window/useDesktopWindowSnapDrop";
5
+ const props = defineProps({
6
+ enabled: { type: Boolean, required: false }
7
+ });
8
+ const desktopWorkspaceStore = useDesktopWorkspaceStore();
9
+ const { snapHint, snapHintRect, isSnapDragActive } = useDesktopWindowSnapDrop();
10
+ const visible = computed(
11
+ () => props.enabled !== false && !desktopWorkspaceStore.overview && isSnapDragActive.value && snapHint.value !== null && snapHintRect.value !== null
12
+ );
13
+ const hintStyle = computed(() => {
14
+ const rect = snapHintRect.value;
15
+ if (!rect) return void 0;
16
+ return {
17
+ left: `${rect.x}px`,
18
+ top: `${rect.y}px`,
19
+ width: `${rect.width}px`,
20
+ height: `${rect.height}px`
21
+ };
22
+ });
23
+ </script>
24
+
25
+ <template>
26
+ <div
27
+ v-if="visible"
28
+ class="desktop-window-snap-hints"
29
+ aria-hidden="true"
30
+ >
31
+ <div
32
+ class="desktop-window-snap-hints__zone"
33
+ :class="`desktop-window-snap-hints__zone--${snapHint}`"
34
+ :style="hintStyle"
35
+ >
36
+ <slot
37
+ :zone="snapHint"
38
+ :rect="snapHintRect"
39
+ />
40
+ </div>
41
+ </div>
42
+ </template>
43
+
44
+ <style scoped>
45
+ .desktop-window-snap-hints{inset:0;pointer-events:none;position:fixed;z-index:999998}.desktop-window-snap-hints__zone{background:rgba(96,165,250,.18);border:2px solid rgba(96,165,250,.85);border-radius:4px;box-sizing:border-box;position:fixed;transition:left 80ms ease,top 80ms ease,width 80ms ease,height 80ms ease}
46
+ </style>
@@ -0,0 +1,19 @@
1
+ type __VLS_Props = {
2
+ enabled?: boolean;
3
+ };
4
+ declare var __VLS_1: {
5
+ zone: any;
6
+ rect: import("@owdproject/core").WindowBounds | null;
7
+ };
8
+ type __VLS_Slots = {} & {
9
+ default?: (props: typeof __VLS_1) => any;
10
+ };
11
+ declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
12
+ declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
13
+ declare const _default: typeof __VLS_export;
14
+ export default _default;
15
+ type __VLS_WithSlots<T, S> = T & {
16
+ new (): {
17
+ $slots: S;
18
+ };
19
+ };