vue-dockable-desktop 1.0.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 (82) hide show
  1. package/CHANGELOG.md +60 -0
  2. package/LICENSE +21 -0
  3. package/README.md +169 -0
  4. package/dist/components/VddConfirm.vue.d.ts +19 -0
  5. package/dist/components/VddContextMenu.vue.d.ts +35 -0
  6. package/dist/components/VddDesktop.vue.d.ts +28 -0
  7. package/dist/components/VddDragGhost.vue.d.ts +3 -0
  8. package/dist/components/VddDropZones.vue.d.ts +6 -0
  9. package/dist/components/VddEdgeZones.vue.d.ts +3 -0
  10. package/dist/components/VddFloatingWidget.vue.d.ts +51 -0
  11. package/dist/components/VddFloatingWindow.vue.d.ts +12 -0
  12. package/dist/components/VddLeafGroup.vue.d.ts +7 -0
  13. package/dist/components/VddModalHost.vue.d.ts +9 -0
  14. package/dist/components/VddModals.vue.d.ts +3 -0
  15. package/dist/components/VddOverlayFrame.vue.d.ts +28 -0
  16. package/dist/components/VddPanelMount.vue.d.ts +8 -0
  17. package/dist/components/VddPanelOverlay.vue.d.ts +13 -0
  18. package/dist/components/VddPanelSlot.vue.d.ts +9 -0
  19. package/dist/components/VddPanelToolbar.vue.d.ts +26 -0
  20. package/dist/components/VddSecondarySidebar.vue.d.ts +16 -0
  21. package/dist/components/VddSidePanelHost.vue.d.ts +10 -0
  22. package/dist/components/VddSidePanels.vue.d.ts +12 -0
  23. package/dist/components/VddSidebar.vue.d.ts +54 -0
  24. package/dist/components/VddSidebarDrawer.vue.d.ts +51 -0
  25. package/dist/components/VddSidebarRail.vue.d.ts +22 -0
  26. package/dist/components/VddSidebarTabScope.vue.d.ts +22 -0
  27. package/dist/components/VddTaskbar.vue.d.ts +17 -0
  28. package/dist/components/VddTaskbarPreview.vue.d.ts +24 -0
  29. package/dist/components/VddToastIcon.vue.d.ts +8 -0
  30. package/dist/components/VddToastItem.vue.d.ts +18 -0
  31. package/dist/components/VddToasts.vue.d.ts +36 -0
  32. package/dist/components/VddToolbar.vue.d.ts +20 -0
  33. package/dist/components/VddToolbarButton.vue.d.ts +25 -0
  34. package/dist/components/VddToolbarCenter.vue.d.ts +13 -0
  35. package/dist/components/VddToolbarGroupButton.vue.d.ts +8 -0
  36. package/dist/components/VddToolbarItem.vue.d.ts +13 -0
  37. package/dist/components/VddToolbarSearch.vue.d.ts +27 -0
  38. package/dist/components/VddToolbarSeparator.vue.d.ts +3 -0
  39. package/dist/components/VddToolbarSpacer.vue.d.ts +3 -0
  40. package/dist/components/VddToolbarToggle.vue.d.ts +32 -0
  41. package/dist/components/VddWorkspaceGrid.vue.d.ts +8 -0
  42. package/dist/composables/useColorScheme.d.ts +19 -0
  43. package/dist/composables/useContextMenu.d.ts +29 -0
  44. package/dist/composables/useContributions.d.ts +48 -0
  45. package/dist/composables/useDragDock.d.ts +59 -0
  46. package/dist/composables/useOverlayHost.d.ts +30 -0
  47. package/dist/composables/useOverlays.d.ts +51 -0
  48. package/dist/composables/usePanel.d.ts +82 -0
  49. package/dist/composables/usePanelDom.d.ts +7 -0
  50. package/dist/composables/usePanelOverlay.d.ts +35 -0
  51. package/dist/composables/useSidebar.d.ts +15 -0
  52. package/dist/composables/useToolbar.d.ts +9 -0
  53. package/dist/composables/useWorkspace.d.ts +18 -0
  54. package/dist/core/anchorGeometry.d.ts +39 -0
  55. package/dist/core/contextMenu.d.ts +74 -0
  56. package/dist/core/contributions.d.ts +56 -0
  57. package/dist/core/dragResize.d.ts +67 -0
  58. package/dist/core/eventBus.d.ts +73 -0
  59. package/dist/core/layoutTree.d.ts +96 -0
  60. package/dist/core/messages.d.ts +117 -0
  61. package/dist/core/overlayState.d.ts +64 -0
  62. package/dist/core/overlays.d.ts +114 -0
  63. package/dist/core/panelDom.d.ts +79 -0
  64. package/dist/core/panelMenu.d.ts +45 -0
  65. package/dist/core/panelOverlay.d.ts +121 -0
  66. package/dist/core/registry.d.ts +61 -0
  67. package/dist/core/serializable.d.ts +26 -0
  68. package/dist/core/serialize.d.ts +32 -0
  69. package/dist/core/sidebarTypes.d.ts +102 -0
  70. package/dist/core/stretch.d.ts +47 -0
  71. package/dist/core/toast.d.ts +474 -0
  72. package/dist/core/toolbarState.d.ts +13 -0
  73. package/dist/core/toolbarTypes.d.ts +99 -0
  74. package/dist/core/workspace.d.ts +222 -0
  75. package/dist/index.cjs +5 -0
  76. package/dist/index.cjs.map +1 -0
  77. package/dist/index.d.ts +64 -0
  78. package/dist/index.js +4851 -0
  79. package/dist/index.js.map +1 -0
  80. package/dist/styles.css +3944 -0
  81. package/dist/types.d.ts +145 -0
  82. package/package.json +102 -0
package/dist/index.js ADDED
@@ -0,0 +1,4851 @@
1
+ import { Fragment as e, Teleport as t, computed as n, createBlock as r, createCommentVNode as i, createElementBlock as a, createElementVNode as o, createSlots as s, createTextVNode as c, createVNode as l, defineComponent as u, getCurrentScope as d, guardReactiveProps as f, inject as p, isVNode as m, markRaw as h, mergeModels as g, mergeProps as _, nextTick as v, normalizeClass as y, normalizeProps as b, normalizeStyle as x, onBeforeUnmount as S, onMounted as C, onScopeDispose as w, openBlock as T, provide as E, reactive as D, readonly as O, ref as k, renderList as A, renderSlot as j, resolveComponent as M, resolveDynamicComponent as N, shallowReactive as P, shallowRef as F, toDisplayString as I, toRaw as L, toValue as R, unref as z, useModel as B, useSlots as ee, useTemplateRef as V, vModelText as te, watch as H, watchEffect as ne, withCtx as U, withDirectives as re, withKeys as ie, withModifiers as W } from "vue";
2
+ //#region src/core/layoutTree.ts
3
+ var ae = {
4
+ type: "leaf",
5
+ id: "group-default",
6
+ panels: [],
7
+ activePanelId: null
8
+ }, G = () => ({
9
+ ...ae,
10
+ panels: []
11
+ });
12
+ function oe(e, t) {
13
+ if (e.type === "leaf") {
14
+ let n = e.panels.indexOf(t);
15
+ if (n === -1) return e;
16
+ let r = e.panels.filter((e) => e !== t), i = e.activePanelId === t ? r[n] ?? r[n - 1] ?? r[0] ?? null : e.activePanelId;
17
+ return r.length === 0 && !e.keepOnEmpty ? null : {
18
+ ...e,
19
+ panels: r,
20
+ activePanelId: i
21
+ };
22
+ }
23
+ let n = e.children.map((e) => oe(e, t)).filter((e) => e !== null);
24
+ if (n.length === 0) return null;
25
+ if (n.length === 1) return n[0];
26
+ let r = e.sizes.slice(0, n.length), i = r.reduce((e, t) => e + t, 0);
27
+ return {
28
+ ...e,
29
+ children: n,
30
+ sizes: r.map((e) => e / i)
31
+ };
32
+ }
33
+ function K(e, t, n, r) {
34
+ let i = r?.select !== !1;
35
+ if (e.type === "leaf") {
36
+ if (e.id !== t) return e;
37
+ let r = e.panels.includes(n) ? e.panels : [...e.panels, n], a = i ? n : e.activePanelId ?? n;
38
+ return {
39
+ ...e,
40
+ panels: r,
41
+ activePanelId: a
42
+ };
43
+ }
44
+ return {
45
+ ...e,
46
+ children: e.children.map((e) => K(e, t, n, r))
47
+ };
48
+ }
49
+ function se(e, t, n, r) {
50
+ if (e.type === "leaf") {
51
+ if (e.id !== t) return e;
52
+ let i = e.panels.filter((e) => e !== n), a = Math.max(0, Math.min(r, i.length)), o = [...i];
53
+ return o.splice(a, 0, n), {
54
+ ...e,
55
+ panels: o,
56
+ activePanelId: n
57
+ };
58
+ }
59
+ return {
60
+ ...e,
61
+ children: e.children.map((e) => se(e, t, n, r))
62
+ };
63
+ }
64
+ var ce = (e) => `group-${e}-${Date.now()}-${Math.floor(Math.random() * 1e3)}`;
65
+ function le(e, t, n, r, i, a = ce("split")) {
66
+ if (e.type === "leaf") {
67
+ if (e.id !== t) return e;
68
+ let o = {
69
+ type: "leaf",
70
+ id: a,
71
+ panels: [n],
72
+ activePanelId: n
73
+ }, s = r === "left" || r === "top";
74
+ return {
75
+ type: "branch",
76
+ orientation: r === "left" || r === "right" ? "horizontal" : "vertical",
77
+ sizes: s ? [i, 1 - i] : [1 - i, i],
78
+ children: s ? [o, e] : [e, o]
79
+ };
80
+ }
81
+ return {
82
+ ...e,
83
+ children: e.children.map((e) => le(e, t, n, r, i, a))
84
+ };
85
+ }
86
+ function ue(e, t, n, r, i = ce("edge")) {
87
+ let a = {
88
+ type: "leaf",
89
+ id: i,
90
+ panels: [t],
91
+ activePanelId: t
92
+ }, o = n === "left" || n === "top";
93
+ return {
94
+ type: "branch",
95
+ orientation: n === "left" || n === "right" ? "horizontal" : "vertical",
96
+ sizes: o ? [r, 1 - r] : [1 - r, r],
97
+ children: o ? [a, e] : [e, a]
98
+ };
99
+ }
100
+ function de(e, t) {
101
+ if (e.type === "leaf") return e.id === t && e.canClose !== !1 ? null : e;
102
+ let n = e.children.map((e) => de(e, t)).filter((e) => e !== null);
103
+ if (n.length === 0) return null;
104
+ if (n.length === 1) return n[0];
105
+ let r = e.sizes.slice(0, n.length), i = r.reduce((e, t) => e + t, 0);
106
+ return {
107
+ ...e,
108
+ children: n,
109
+ sizes: r.map((e) => e / i)
110
+ };
111
+ }
112
+ function fe(e, t) {
113
+ return e.type === "leaf" ? e.panels.includes(t) ? {
114
+ ...e,
115
+ activePanelId: t
116
+ } : e : {
117
+ ...e,
118
+ children: e.children.map((e) => fe(e, t))
119
+ };
120
+ }
121
+ function pe(e) {
122
+ if (e.type === "leaf") return e.id;
123
+ for (let t of e.children) {
124
+ let e = pe(t);
125
+ if (e) return e;
126
+ }
127
+ return null;
128
+ }
129
+ function me(e, t) {
130
+ if (e.type === "leaf") return e.panels.includes(t) ? e.id : null;
131
+ for (let n of e.children) {
132
+ let e = me(n, t);
133
+ if (e) return e;
134
+ }
135
+ return null;
136
+ }
137
+ function he(e, t) {
138
+ if (!e) return null;
139
+ if (e.type === "leaf") return e.id === t ? e : null;
140
+ for (let n of e.children) {
141
+ let e = he(n, t);
142
+ if (e) return e;
143
+ }
144
+ return null;
145
+ }
146
+ function ge(e, t) {
147
+ return he(e, t) !== null;
148
+ }
149
+ function _e(e, t, n) {
150
+ let r = (e, i) => {
151
+ if (e.type === "leaf") return e;
152
+ if (i === t.length) return {
153
+ ...e,
154
+ sizes: n
155
+ };
156
+ let a = t[i];
157
+ return {
158
+ ...e,
159
+ children: e.children.map((e, t) => t === a ? r(e, i + 1) : e)
160
+ };
161
+ };
162
+ return r(e, 0);
163
+ }
164
+ function ve(e, t) {
165
+ let n = t.panels[e];
166
+ if (!n || n.state === "minimized") return !1;
167
+ if (t.floating.some((t) => t.id === e)) return !0;
168
+ let r = (t) => t.type === "leaf" ? t.activePanelId === e : t.children.some(r);
169
+ return t.gridRoot ? r(t.gridRoot) : !1;
170
+ }
171
+ function ye(e) {
172
+ let t = (t) => t !== null && !!e.panels[t] && e.panels[t].state !== "minimized", n = (e) => {
173
+ if (e.type === "leaf") return t(e.activePanelId) ? e.activePanelId : null;
174
+ for (let t of e.children) {
175
+ let e = n(t);
176
+ if (e) return e;
177
+ }
178
+ return null;
179
+ }, r = e.gridRoot ? n(e.gridRoot) : null;
180
+ if (r) return r;
181
+ let i = null;
182
+ for (let n of e.floating) t(n.id) && (!i || n.z > i.z) && (i = n);
183
+ return i?.id ?? null;
184
+ }
185
+ //#endregion
186
+ //#region src/core/serialize.ts
187
+ function be(e) {
188
+ return e.map((e) => {
189
+ let t = e;
190
+ if (!("stickyRight" in t) && !("stickyBottom" in t)) return t;
191
+ let n = t.stickyRight && t.stickyBottom ? "bottom-right" : t.stickyRight ? "top-right" : t.stickyBottom ? "bottom-left" : null, { stickyRight: r, stickyBottom: i, ...a } = t;
192
+ return {
193
+ ...a,
194
+ anchor: n
195
+ };
196
+ });
197
+ }
198
+ function xe(e, t) {
199
+ if (!e || typeof e != "object") return null;
200
+ let n = e;
201
+ if (!n.gridRoot || !Array.isArray(n.floating) || !Array.isArray(n.minimized) || !n.panels) return null;
202
+ let r = be(n.floating), i = n.gridRoot, a = n.panels, o = {
203
+ gridRoot: i,
204
+ floating: r,
205
+ panels: a
206
+ }, s = typeof n.activePanelId == "string" ? n.activePanelId : null, c = null;
207
+ return s !== null && (ve(s, o) ? c = s : t?.(`Ignoring the saved layout's activePanelId ("${s}") — it does not name a currently visible panel (it may have been closed, minimised, or excluded from the snapshot as non-serialisable). Falling back to the selected tab of the first leaf.`)), c === null && (c = ye(o)), {
208
+ gridRoot: i,
209
+ floating: r,
210
+ minimized: n.minimized,
211
+ panels: a,
212
+ activePanelId: c
213
+ };
214
+ }
215
+ function Se(e, t) {
216
+ if (e) try {
217
+ let n = xe(JSON.parse(e), t);
218
+ if (n) return n;
219
+ } catch {
220
+ t?.("initialState is not valid JSON; starting from an empty workspace.");
221
+ }
222
+ return {
223
+ gridRoot: {
224
+ ...ae,
225
+ panels: []
226
+ },
227
+ floating: [],
228
+ minimized: [],
229
+ panels: {},
230
+ activePanelId: null
231
+ };
232
+ }
233
+ //#endregion
234
+ //#region src/core/serializable.ts
235
+ function Ce(e) {
236
+ if (e === null) return !0;
237
+ if (e === void 0) return !1;
238
+ let t = typeof e;
239
+ if (t === "string" || t === "number" || t === "boolean") return !0;
240
+ if (t === "function" || t === "symbol" || t === "bigint") return !1;
241
+ if (e instanceof Date) return !0;
242
+ if (m(e)) return !1;
243
+ if (Array.isArray(e)) return e.every(Ce);
244
+ let n = Object.getPrototypeOf(e);
245
+ return n !== Object.prototype && n !== null ? !1 : Object.values(e).every(Ce);
246
+ }
247
+ //#endregion
248
+ //#region src/core/registry.ts
249
+ var we = class {
250
+ entries = /* @__PURE__ */ new Map();
251
+ register(e, t, n) {
252
+ this.entries.set(e, {
253
+ component: h(t),
254
+ ...n ? { defaultOptions: {
255
+ ...n,
256
+ ...n.icon ? { icon: h(n.icon) } : {}
257
+ } } : {}
258
+ });
259
+ }
260
+ get(e) {
261
+ return this.entries.get(e);
262
+ }
263
+ has(e) {
264
+ return this.entries.has(e);
265
+ }
266
+ keys() {
267
+ return Array.from(this.entries.keys());
268
+ }
269
+ }, Te = class {
270
+ listeners = /* @__PURE__ */ new Map();
271
+ subscribe(e, t) {
272
+ let n = this.listeners.get(e);
273
+ n || (n = /* @__PURE__ */ new Set(), this.listeners.set(e, n));
274
+ let r = t;
275
+ return n.add(r), () => {
276
+ n.delete(r);
277
+ };
278
+ }
279
+ publish(e, t) {
280
+ this.dispatch(e, t);
281
+ }
282
+ emit(e, t) {
283
+ this.dispatch(e, t);
284
+ }
285
+ dispatch(e, t) {
286
+ let n = this.listeners.get(e);
287
+ if (n) for (let e of Array.from(n)) e(t);
288
+ }
289
+ count(e) {
290
+ return this.listeners.get(e)?.size ?? 0;
291
+ }
292
+ clear() {
293
+ this.listeners.clear();
294
+ }
295
+ }, Ee = (e) => "separator" in e, De = (e) => !Ee(e) && "items" in e;
296
+ function Oe(e) {
297
+ let t = e.event;
298
+ if (!t) return {
299
+ x: e.x ?? 0,
300
+ y: e.y ?? 0
301
+ };
302
+ if ("touches" in t && t.touches.length > 0) {
303
+ let e = t.touches[0];
304
+ return {
305
+ x: e.clientX,
306
+ y: e.clientY
307
+ };
308
+ }
309
+ let n = t;
310
+ return {
311
+ x: n.clientX,
312
+ y: n.clientY
313
+ };
314
+ }
315
+ function ke(e, t, n, r = 8) {
316
+ let { x: i, y: a } = e;
317
+ return i + t.width > n.width - r && (i = Math.max(r, n.width - t.width - r)), a + t.height > n.height - r && (a = Math.max(r, n.height - t.height - r)), {
318
+ x: Math.max(r, i),
319
+ y: Math.max(r, a)
320
+ };
321
+ }
322
+ //#endregion
323
+ //#region src/core/messages.ts
324
+ var Ae = {
325
+ floatWindow: {
326
+ id: "vdd.floatWindow",
327
+ defaultMessage: "Float Window"
328
+ },
329
+ minimizePanel: {
330
+ id: "vdd.minimizePanel",
331
+ defaultMessage: "Minimize Panel"
332
+ },
333
+ closeTab: {
334
+ id: "vdd.closeTab",
335
+ defaultMessage: "Close Tab"
336
+ },
337
+ restorePanel: {
338
+ id: "vdd.restorePanel",
339
+ defaultMessage: "Restore Panel"
340
+ },
341
+ maximizePanel: {
342
+ id: "vdd.maximizePanel",
343
+ defaultMessage: "Maximize Panel"
344
+ },
345
+ closePanel: {
346
+ id: "vdd.closePanel",
347
+ defaultMessage: "Close Panel"
348
+ },
349
+ dockWindow: {
350
+ id: "vdd.dockWindow",
351
+ defaultMessage: "Dock Window"
352
+ },
353
+ minimize: {
354
+ id: "vdd.minimize",
355
+ defaultMessage: "Minimize"
356
+ },
357
+ maximize: {
358
+ id: "vdd.maximize",
359
+ defaultMessage: "Maximize"
360
+ },
361
+ restoreSize: {
362
+ id: "vdd.restoreSize",
363
+ defaultMessage: "Restore Size"
364
+ },
365
+ close: {
366
+ id: "vdd.close",
367
+ defaultMessage: "Close"
368
+ },
369
+ closeEmptyGroup: {
370
+ id: "vdd.closeEmptyGroup",
371
+ defaultMessage: "Close empty split group"
372
+ },
373
+ emptyGroup: {
374
+ id: "vdd.emptyGroup",
375
+ defaultMessage: "Empty workspace section"
376
+ },
377
+ unsavedChangesTitle: {
378
+ id: "vdd.unsavedChangesTitle",
379
+ defaultMessage: "Unsaved Changes"
380
+ },
381
+ unsavedChangesMessage: {
382
+ id: "vdd.unsavedChangesMessage",
383
+ defaultMessage: "\"{title}\" has unsaved changes. Do you want to discard your changes and close?"
384
+ },
385
+ discardChanges: {
386
+ id: "vdd.discardChanges",
387
+ defaultMessage: "Discard Changes"
388
+ },
389
+ cancel: {
390
+ id: "vdd.cancel",
391
+ defaultMessage: "Cancel"
392
+ },
393
+ yes: {
394
+ id: "vdd.yes",
395
+ defaultMessage: "Yes"
396
+ },
397
+ no: {
398
+ id: "vdd.no",
399
+ defaultMessage: "No"
400
+ },
401
+ ok: {
402
+ id: "vdd.ok",
403
+ defaultMessage: "OK"
404
+ },
405
+ closeTooltip: {
406
+ id: "vdd.closeTooltip",
407
+ defaultMessage: "Close"
408
+ },
409
+ scrollTabsLeft: {
410
+ id: "vdd.scrollTabsLeft",
411
+ defaultMessage: "Scroll tabs left"
412
+ },
413
+ scrollTabsRight: {
414
+ id: "vdd.scrollTabsRight",
415
+ defaultMessage: "Scroll tabs right"
416
+ },
417
+ moreActions: {
418
+ id: "vdd.moreActions",
419
+ defaultMessage: "More actions"
420
+ },
421
+ search: {
422
+ id: "vdd.search",
423
+ defaultMessage: "Search"
424
+ }
425
+ };
426
+ function je(e, t) {
427
+ if (e == null) return "";
428
+ if (typeof e == "string") return e;
429
+ if (t) return t(e);
430
+ let n = e.defaultMessage ?? e.id;
431
+ if (e.values) for (let [t, r] of Object.entries(e.values)) n = n.replace(`{${t}}`, String(r));
432
+ return n;
433
+ }
434
+ //#endregion
435
+ //#region src/core/toolbarState.ts
436
+ function Me() {
437
+ let e = D({}), t = D({});
438
+ return {
439
+ activeInGroup: (t) => e[t] ?? null,
440
+ setActiveInGroup: (t, n) => {
441
+ e[t] = n;
442
+ },
443
+ isToggled: (e) => t[e] === !0,
444
+ setToggled: (e, n) => {
445
+ t[e] = n;
446
+ },
447
+ toggle: (e) => {
448
+ t[e] = !t[e];
449
+ }
450
+ };
451
+ }
452
+ //#endregion
453
+ //#region src/core/overlays.ts
454
+ var Ne = 0, Pe = (e) => `vdd-${e}-${++Ne}`;
455
+ function Fe() {
456
+ let e = D({
457
+ leftPanel: null,
458
+ rightPanel: null,
459
+ modals: P([])
460
+ }), t = /* @__PURE__ */ new Map(), n = null, r = () => [
461
+ e.leftPanel,
462
+ e.rightPanel,
463
+ ...e.modals
464
+ ].filter((e) => e !== null), i = (e) => r().find((t) => t.id === e);
465
+ function a(e, t, n, r) {
466
+ return {
467
+ id: Pe(e),
468
+ component: h(t),
469
+ props: n,
470
+ kind: e,
471
+ options: r,
472
+ dirty: !1
473
+ };
474
+ }
475
+ async function o(n, r, i, o = {}, s = {}) {
476
+ let c = e[n];
477
+ if (c) {
478
+ let e = t.get(c.id);
479
+ if (e && !await e()) return null;
480
+ t.delete(c.id);
481
+ }
482
+ let l = a(r, i, o, s);
483
+ return e[n] = l, l.id;
484
+ }
485
+ function s(t, n = {}, r = {}) {
486
+ let i = a("modal", t, n, r);
487
+ return e.modals.push(i), i.id;
488
+ }
489
+ function c(n) {
490
+ if (t.delete(n), e.leftPanel?.id === n) {
491
+ e.leftPanel = null;
492
+ return;
493
+ }
494
+ if (e.rightPanel?.id === n) {
495
+ e.rightPanel = null;
496
+ return;
497
+ }
498
+ let r = e.modals.findIndex((e) => e.id === n);
499
+ r !== -1 && e.modals.splice(r, 1);
500
+ }
501
+ function l(t, n) {
502
+ let r = i(t);
503
+ if (!r) return;
504
+ let a = {
505
+ ...r,
506
+ ...n
507
+ };
508
+ if (e.leftPanel?.id === t) {
509
+ e.leftPanel = a;
510
+ return;
511
+ }
512
+ if (e.rightPanel?.id === t) {
513
+ e.rightPanel = a;
514
+ return;
515
+ }
516
+ let o = e.modals.findIndex((e) => e.id === t);
517
+ o !== -1 && e.modals.splice(o, 1, a);
518
+ }
519
+ async function u(e, n) {
520
+ if (n?.force) {
521
+ c(e);
522
+ return;
523
+ }
524
+ let r = t.get(e);
525
+ if (r && !await r()) return;
526
+ let a = i(e);
527
+ (!a?.dirty || n?.confirm && await n.confirm(a)) && c(e);
528
+ }
529
+ return {
530
+ state: e,
531
+ openLeftPanel: (e, t, n) => o("leftPanel", "left-panel", e, t, n),
532
+ openRightPanel: (e, t, n) => o("rightPanel", "right-panel", e, t, n),
533
+ openModal: s,
534
+ close: c,
535
+ closeAll: () => {
536
+ t.clear(), e.leftPanel = null, e.rightPanel = null, e.modals.splice(0);
537
+ },
538
+ closeAllModals: () => {
539
+ for (let n of e.modals) t.delete(n.id);
540
+ e.modals.splice(0);
541
+ },
542
+ getInstance: i,
543
+ updateInstance: l,
544
+ setDirty: (e, t, n) => l(e, {
545
+ dirty: t,
546
+ dirtyOptions: n
547
+ }),
548
+ requestClose: u,
549
+ registerCloseGuard: (e, n) => (t.set(e, n), () => {
550
+ t.get(e) === n && t.delete(e);
551
+ }),
552
+ topmostModal: () => e.modals[e.modals.length - 1] ?? null,
553
+ confirmDiscard: (e) => n?.(e) ?? Promise.resolve(!1),
554
+ setConfirmRenderer: (e) => {
555
+ n = e;
556
+ },
557
+ dispose: () => {
558
+ t.clear(), n = null;
559
+ }
560
+ };
561
+ }
562
+ //#endregion
563
+ //#region src/core/contributions.ts
564
+ function Ie() {
565
+ let e = P(/* @__PURE__ */ new Map()), t = k(0);
566
+ return {
567
+ publish(n, r) {
568
+ let i = {
569
+ toolbarItems: r.toolbarItems,
570
+ sidebarSections: r.sidebarSections?.map((e) => ({
571
+ ...e,
572
+ component: h(e.component),
573
+ icon: e.icon ? h(e.icon) : void 0
574
+ }))
575
+ };
576
+ return e.set(n, i), t.value++, () => {
577
+ e.get(n) === i && (e.delete(n), t.value++);
578
+ };
579
+ },
580
+ get(n) {
581
+ return t.value, e.get(n) ?? null;
582
+ },
583
+ ids() {
584
+ return t.value, Array.from(e.keys());
585
+ }
586
+ };
587
+ }
588
+ function Le(e, t) {
589
+ return {
590
+ id: e.id,
591
+ label: e.label,
592
+ icon: e.icon ?? t,
593
+ component: e.component,
594
+ props: e.props
595
+ };
596
+ }
597
+ function Re(e, t) {
598
+ let n = t?.toolbarItems;
599
+ return n?.length ? [
600
+ ...e,
601
+ { type: "separator" },
602
+ ...n
603
+ ] : e;
604
+ }
605
+ function ze(e, t, n) {
606
+ let r = t?.sidebarSections;
607
+ return r?.length ? [...e, ...r.map((e) => Le(e, n))] : e;
608
+ }
609
+ function Be(e, t) {
610
+ return n(() => {
611
+ let n = t();
612
+ return n ? e.get(n) : null;
613
+ });
614
+ }
615
+ //#endregion
616
+ //#region src/core/workspace.ts
617
+ var Ve = (e, t) => Math.min(.9, Math.max(.1, e ?? t)), q = {
618
+ x: 300,
619
+ y: 150,
620
+ width: 450,
621
+ height: 350
622
+ }, He = Symbol("vdd-workspace");
623
+ function Ue(e = {}) {
624
+ let t = new we();
625
+ for (let [n, r] of Object.entries(e.panels ?? {})) t.register(n, r.component, r.defaultOptions);
626
+ let r = new Te(), i = /* @__PURE__ */ new Map(), a = /* @__PURE__ */ new Map(), o = /* @__PURE__ */ new Map(), s = k(0), c = F(null), l = {
627
+ ...Ae,
628
+ ...e.messages ?? {}
629
+ }, u = e.zIndexBase ?? 1e3, d = u, f = Se(e.initialState, m), p = D({
630
+ gridRoot: f.gridRoot,
631
+ floating: f.floating,
632
+ minimized: f.minimized,
633
+ panels: f.panels,
634
+ activePanelId: f.activePanelId,
635
+ draggedPanelId: null,
636
+ dir: e.dir ?? "ltr",
637
+ isRtl: e.dir === "rtl",
638
+ splitRatio: Ve(e.defaultSplitRatio, .5),
639
+ edgeSplitRatio: Ve(e.defaultEdgeSplitRatio, .2)
640
+ });
641
+ for (let e of p.floating) d = Math.max(d, e.z);
642
+ function m(e) {
643
+ process.env.NODE_ENV !== "production" && console.warn(`[vue-dockable-desktop] ${e}`);
644
+ }
645
+ let g = () => ({
646
+ gridRoot: L(p).gridRoot,
647
+ floating: L(p).floating,
648
+ panels: L(p).panels
649
+ });
650
+ function _(e) {
651
+ let t = p.activePanelId, n;
652
+ n = e && ve(e, g()) ? e : p.activePanelId && ve(p.activePanelId, g()) ? p.activePanelId : ye(g()), n !== t && (p.activePanelId = n, r.emit("panel:activated", {
653
+ id: n,
654
+ previous: t
655
+ }));
656
+ }
657
+ let v = () => r.emit("layout:changed", {}), y = (e) => {
658
+ let n = p.panels[e];
659
+ return n ? t.get(n.component) : void 0;
660
+ }, b = (e) => y(e)?.defaultOptions ?? {};
661
+ function x(e) {
662
+ let t = (e, t) => {
663
+ let n = typeof e == "string" ? Number.parseFloat(e) : e;
664
+ return Number.isNaN(n) ? t : n;
665
+ }, n = t(e.x, q.x), r = t(e.y, q.y), i = t(e.width, q.width), a = t(e.height, q.height), o = (e, t) => p.floating.some((n) => {
666
+ if (n.maximized) return !1;
667
+ let r = typeof n.x == "string" ? Number.parseFloat(n.x) : n.x, i = typeof n.y == "string" ? Number.parseFloat(n.y) : n.y;
668
+ return Math.abs(r - e) < 20 && Math.abs(i - t) < 20;
669
+ }), s = 0;
670
+ for (; o(n, r) && s < 10;) n += 30, r += 30, s++;
671
+ let c = Math.max(100, typeof window < "u" && window.innerWidth || 1024), l = Math.max(100, typeof window < "u" && window.innerHeight || 768);
672
+ return (n + i > c || r + a > l) && (n = 100 + s % 5 * 30, r = 100 + s % 5 * 30), {
673
+ x: Math.max(0, Math.min(n, c - 100)),
674
+ y: Math.max(0, Math.min(r, l - 40)),
675
+ width: i,
676
+ height: a
677
+ };
678
+ }
679
+ function S(e, t, n) {
680
+ d += 1, p.floating = [...p.floating, {
681
+ ...t,
682
+ id: e,
683
+ z: d,
684
+ anchor: n
685
+ }];
686
+ }
687
+ function C(e) {
688
+ p.gridRoot = oe(L(p).gridRoot, e) ?? G(), p.floating = p.floating.filter((t) => t.id !== e), p.minimized = p.minimized.filter((t) => t.id !== e);
689
+ }
690
+ function w(e, n, i) {
691
+ t.has(n) || m(`Panel "${e}" references component key "${n}", which is not registered. Add it to createWorkspace({ panels: { "${n}": { component: YourComponent } } }).`);
692
+ let a = e;
693
+ if (i?.dedupeKey !== void 0) {
694
+ let e = Object.values(p.panels).find((e) => e.component === n && e.dedupeKey === i.dedupeKey);
695
+ e && (a = e.id);
696
+ }
697
+ let o = p.panels[a], s = i?.focus !== !1, c = t.get(n), l = i?.initialTarget ?? c?.defaultOptions?.initialTarget ?? "docked", u = c?.defaultOptions?.favoritePosition ?? q;
698
+ if (o) {
699
+ if (o.state === "minimized") {
700
+ j(a, { focus: s });
701
+ return;
702
+ }
703
+ s && B(a);
704
+ return;
705
+ }
706
+ let d = i?.props !== void 0, f = {
707
+ id: a,
708
+ title: i?.title ?? c?.defaultOptions?.title ?? a,
709
+ component: n,
710
+ state: l === "floating" ? "floating" : "docked",
711
+ serializable: !d || Ce(L(i.props)),
712
+ ...d ? { props: h(i.props) } : {},
713
+ ...i?.dedupeKey === void 0 ? {} : { dedupeKey: i.dedupeKey }
714
+ };
715
+ if (p.panels = {
716
+ ...p.panels,
717
+ [a]: f
718
+ }, l === "floating") S(a, x(u), i?.anchor ?? c?.defaultOptions?.defaultAnchor ?? null);
719
+ else {
720
+ let e = pe(L(p).gridRoot) ?? G().id;
721
+ p.gridRoot = K(L(p).gridRoot, e, a, { select: s });
722
+ }
723
+ _(s ? a : null), r.emit("panel:opened", {
724
+ id: a,
725
+ component: n
726
+ }), v();
727
+ }
728
+ function T(e) {
729
+ if (!p.panels[e] || b(e).canClose === !1) return;
730
+ i.delete(e), a.delete(e), C(e);
731
+ let t = { ...p.panels };
732
+ delete t[e], p.panels = t, _(), r.emit("panel:closed", { id: e }), v();
733
+ }
734
+ async function E(e, t) {
735
+ if (t?.force) {
736
+ T(e);
737
+ return;
738
+ }
739
+ let n = i.get(e);
740
+ if (n && !await n()) return;
741
+ let r = p.panels[e];
742
+ (!r?.dirty || await (t?.onConfirm ?? ((e) => be.confirmDiscard({
743
+ title: he(r.title),
744
+ dirtyOptions: e
745
+ })))(r.dirtyOptions)) && T(e);
746
+ }
747
+ function A(e) {
748
+ let t = p.panels[e];
749
+ if (!t || t.state === "minimized" || b(e).canMinimize === !1) return;
750
+ let n, i;
751
+ if (t.state === "floating") {
752
+ let t = p.floating.find((t) => t.id === e);
753
+ t && (n = {
754
+ x: Number(t.x),
755
+ y: Number(t.y),
756
+ width: Number(t.width),
757
+ height: Number(t.height),
758
+ anchor: t.anchor ?? null
759
+ });
760
+ } else i = me(L(p).gridRoot, e) ?? void 0;
761
+ C(e), p.panels = {
762
+ ...p.panels,
763
+ [e]: {
764
+ ...t,
765
+ state: "minimized",
766
+ previousState: t.state,
767
+ lastFloatingRect: n,
768
+ lastLeafId: i
769
+ }
770
+ }, p.minimized = [...p.minimized, {
771
+ id: e,
772
+ title: t.title,
773
+ component: t.component
774
+ }], _(), r.emit("panel:minimized", { id: e }), v();
775
+ }
776
+ function j(e, n) {
777
+ let i = p.panels[e];
778
+ if (!i || i.state !== "minimized") return;
779
+ let a = n?.focus !== !1;
780
+ p.minimized = p.minimized.filter((t) => t.id !== e);
781
+ let o = i.previousState ?? "docked", s = t.get(i.component), c = i.lastFloatingRect ?? s?.defaultOptions?.favoritePosition ?? q, l = () => {
782
+ p.panels = {
783
+ ...p.panels,
784
+ [e]: {
785
+ ...i,
786
+ state: "floating"
787
+ }
788
+ }, S(e, x(c), i.lastFloatingRect?.anchor ?? null);
789
+ }, u = (t) => {
790
+ p.panels = {
791
+ ...p.panels,
792
+ [e]: {
793
+ ...i,
794
+ state: "docked"
795
+ }
796
+ }, p.gridRoot = K(L(p).gridRoot, t, e, { select: a });
797
+ };
798
+ o === "floating" ? l() : i.lastLeafId && ge(L(p).gridRoot, i.lastLeafId) ? u(i.lastLeafId) : b(e).canDrag === !1 ? u(pe(L(p).gridRoot) ?? G().id) : l(), _(a ? e : null), r.emit("panel:restored", { id: e }), v();
799
+ }
800
+ function M(e, n, r) {
801
+ let i = p.panels[e];
802
+ if (!i || b(e).canDrag === !1) return;
803
+ let a = n ?? t.get(i.component)?.defaultOptions?.favoritePosition ?? q;
804
+ C(e), p.panels = {
805
+ ...p.panels,
806
+ [e]: {
807
+ ...i,
808
+ state: "floating"
809
+ }
810
+ }, S(e, x(a), r ?? null), _(e), v();
811
+ }
812
+ function N(e, t) {
813
+ let n = p.panels[e];
814
+ if (!n) return;
815
+ C(e);
816
+ let r = n.lastLeafId && ge(L(p).gridRoot, n.lastLeafId) ? n.lastLeafId : void 0, i = t ?? r ?? pe(L(p).gridRoot) ?? G().id;
817
+ p.panels = {
818
+ ...p.panels,
819
+ [e]: {
820
+ ...n,
821
+ state: "docked"
822
+ }
823
+ }, p.gridRoot = K(L(p).gridRoot, i, e), _(e), v();
824
+ }
825
+ function P(e, t, n) {
826
+ let r = p.panels[e];
827
+ r && (C(e), p.panels = {
828
+ ...p.panels,
829
+ [e]: {
830
+ ...r,
831
+ state: "docked"
832
+ }
833
+ }, p.gridRoot = n === "center" ? K(L(p).gridRoot, t, e) : le(L(p).gridRoot, t, e, n, p.splitRatio), p.draggedPanelId = null, _(e), v());
834
+ }
835
+ function I(e, t) {
836
+ let n = p.panels[e];
837
+ n && (C(e), p.panels = {
838
+ ...p.panels,
839
+ [e]: {
840
+ ...n,
841
+ state: "docked"
842
+ }
843
+ }, p.gridRoot = ue(L(p).gridRoot, e, t, p.edgeSplitRatio), p.draggedPanelId = null, _(e), v());
844
+ }
845
+ function R(e, t, n) {
846
+ let r = p.panels[e];
847
+ if (!r) return;
848
+ let i = oe(L(p).gridRoot, e) ?? G();
849
+ p.floating = p.floating.filter((t) => t.id !== e), p.minimized = p.minimized.filter((t) => t.id !== e), p.panels = {
850
+ ...p.panels,
851
+ [e]: {
852
+ ...r,
853
+ state: "docked"
854
+ }
855
+ }, p.gridRoot = se(i, t, e, n), p.draggedPanelId = null, _(e), v();
856
+ }
857
+ function z(e) {
858
+ p.panels[e]?.state === "minimized" && j(e);
859
+ let t = p.panels[e];
860
+ t && (t.state === "docked" && M(e), p.floating = p.floating.map((t) => t.id === e ? {
861
+ ...t,
862
+ maximized: !t.maximized
863
+ } : t), _(e), v());
864
+ }
865
+ function B(e) {
866
+ let t = p.panels[e];
867
+ if (t) {
868
+ if (t.state === "floating") {
869
+ let t = p.floating.find((t) => t.id === e);
870
+ if (t && p.floating.some((e) => e.z > t.z)) {
871
+ d += 1;
872
+ let t = d;
873
+ p.floating = p.floating.map((n) => n.id === e ? {
874
+ ...n,
875
+ z: t
876
+ } : n);
877
+ }
878
+ } else t.state === "docked" && (p.gridRoot = fe(L(p).gridRoot, e));
879
+ if (t.state === "minimized") {
880
+ let t = p.activePanelId;
881
+ t !== e && (p.activePanelId = e, r.emit("panel:activated", {
882
+ id: e,
883
+ previous: t
884
+ }));
885
+ return;
886
+ }
887
+ _(e);
888
+ }
889
+ }
890
+ function ee(e) {
891
+ p.gridRoot = de(L(p).gridRoot, e) ?? G(), _(), v();
892
+ }
893
+ function V(e, t) {
894
+ p.gridRoot = _e(L(p).gridRoot, e, t), v();
895
+ }
896
+ function te(e, t) {
897
+ p.floating = p.floating.map((n) => n.id === e ? {
898
+ ...n,
899
+ ...t
900
+ } : n);
901
+ }
902
+ function H(e, t, n) {
903
+ let r = p.panels[e];
904
+ r && (p.panels = {
905
+ ...p.panels,
906
+ [e]: {
907
+ ...r,
908
+ dirty: t,
909
+ dirtyOptions: n
910
+ }
911
+ });
912
+ }
913
+ function ne(e, t) {
914
+ let n = p.panels[e];
915
+ n && (p.panels = {
916
+ ...p.panels,
917
+ [e]: {
918
+ ...n,
919
+ title: t
920
+ }
921
+ }, p.minimized.findIndex((t) => t.id === e) !== -1 && (p.minimized = p.minimized.map((n) => n.id === e ? {
922
+ ...n,
923
+ title: t
924
+ } : n)));
925
+ }
926
+ function U(e) {
927
+ p.dir !== e && (p.dir = e, p.isRtl = e === "rtl");
928
+ }
929
+ function re() {
930
+ let e = L(p), t = [], n = {};
931
+ for (let [r, i] of Object.entries(e.panels)) {
932
+ let e = a.get(r), o = e?.(), s = e !== void 0 && o !== void 0, c = s ? o : i.props;
933
+ (s ? Ce(L(o)) : i.serializable) ? n[r] = s ? {
934
+ ...i,
935
+ props: c,
936
+ serializable: !0
937
+ } : i : t.push(r);
938
+ }
939
+ let i = e.gridRoot, o = e.floating, s = e.minimized;
940
+ for (let e of t) i = oe(i, e) ?? G(), o = o.filter((t) => t.id !== e), s = s.filter((t) => t.id !== e);
941
+ t.length && r.emit("layout:panels-excluded", { panels: t.map((t) => ({
942
+ id: t,
943
+ component: e.panels[t].component
944
+ })) });
945
+ let c = e.activePanelId, l = c !== null && ve(c, {
946
+ gridRoot: i,
947
+ floating: o,
948
+ panels: n
949
+ }) ? c : null, u = {
950
+ version: 2,
951
+ ...l === null ? {} : { activePanelId: l },
952
+ gridRoot: i,
953
+ floating: o,
954
+ minimized: s,
955
+ panels: n
956
+ };
957
+ return JSON.stringify(u);
958
+ }
959
+ function ie(e) {
960
+ let t;
961
+ try {
962
+ let n = JSON.parse(e), r = Se(JSON.stringify(n), m);
963
+ if (!n || typeof n != "object" || !n.gridRoot) return !1;
964
+ t = r;
965
+ } catch {
966
+ return m("loadLayout received invalid JSON; the current layout is unchanged."), !1;
967
+ }
968
+ p.gridRoot = t.gridRoot, p.floating = t.floating, p.minimized = t.minimized, p.panels = t.panels, p.draggedPanelId = null, d = Math.max(u, ...t.floating.map((e) => e.z), 0);
969
+ let n = p.activePanelId;
970
+ return p.activePanelId = t.activePanelId, n !== t.activePanelId && r.emit("panel:activated", {
971
+ id: t.activePanelId,
972
+ previous: n
973
+ }), v(), !0;
974
+ }
975
+ function W(e, t) {
976
+ return i.set(e, t), () => {
977
+ i.get(e) === t && i.delete(e);
978
+ };
979
+ }
980
+ function ae(e, t) {
981
+ return a.set(e, t), () => {
982
+ a.get(e) === t && a.delete(e);
983
+ };
984
+ }
985
+ function ce(e, t) {
986
+ return o.set(e, t), s.value++, () => {
987
+ o.get(e) === t && (o.delete(e), s.value++);
988
+ };
989
+ }
990
+ let he = (t) => {
991
+ if (t == null) return "";
992
+ if (typeof t == "string") return t;
993
+ if (e.formatMessage) return e.formatMessage(t);
994
+ let n = t.defaultMessage ?? t.id;
995
+ for (let [e, r] of Object.entries(t.values ?? {})) n = n.replace(`{${e}}`, String(r));
996
+ return n;
997
+ }, be = Fe(), xe = Ie(), Ee = {
998
+ state: O(p),
999
+ registry: t,
1000
+ gridRoot: n(() => p.gridRoot),
1001
+ floating: n(() => p.floating),
1002
+ minimized: n(() => p.minimized),
1003
+ panels: n(() => p.panels),
1004
+ activePanelId: n(() => p.activePanelId),
1005
+ draggedPanelId: n(() => p.draggedPanelId),
1006
+ dir: n(() => p.dir),
1007
+ isRtl: n(() => p.isRtl),
1008
+ openPanel: w,
1009
+ closePanel: T,
1010
+ requestClosePanel: E,
1011
+ minimizePanel: A,
1012
+ restorePanel: j,
1013
+ floatPanel: M,
1014
+ dockPanel: N,
1015
+ dockPanelToGroup: P,
1016
+ dockPanelToWorkspaceEdge: I,
1017
+ maximizePanel: z,
1018
+ focusPanel: B,
1019
+ movePanelOrder: R,
1020
+ closeLeafGroup: ee,
1021
+ updateSplitSizes: V,
1022
+ updateFloatingPosition: te,
1023
+ setPanelDirty: H,
1024
+ updatePanelTitle: ne,
1025
+ setDirection: U,
1026
+ setDraggedPanelId: (e) => {
1027
+ p.draggedPanelId = e;
1028
+ },
1029
+ isOpen: (e) => e in p.panels,
1030
+ getOpenPanelIds: () => Object.keys(p.panels),
1031
+ findPanelId: (e, t) => Object.values(p.panels).find((n) => n.component === e && n.dedupeKey === t)?.id ?? null,
1032
+ saveLayout: re,
1033
+ loadLayout: ie,
1034
+ publish: (e, t) => r.publish(e, t),
1035
+ subscribe: (e, t) => r.subscribe(e, t),
1036
+ toolbar: Me(),
1037
+ overlays: be,
1038
+ contributions: xe,
1039
+ activeContribution: Be(xe, () => p.activePanelId),
1040
+ registerCloseGuard: W,
1041
+ registerStateProvider: ae,
1042
+ registerPanelMenu: ce,
1043
+ panelMenuItems: (e) => (s.value, o.get(e)?.() ?? []),
1044
+ showContextMenu: (e) => {
1045
+ e.event?.preventDefault?.(), c.value = {
1046
+ ...Oe(e),
1047
+ items: e.items
1048
+ };
1049
+ },
1050
+ closeContextMenu: () => {
1051
+ c.value = null;
1052
+ },
1053
+ contextMenu: n(() => c.value),
1054
+ classes: {
1055
+ modal: e.classes?.modal ?? "",
1056
+ modalBody: e.classes?.modalBody ?? "",
1057
+ sidePanel: e.classes?.sidePanel ?? "",
1058
+ sidePanelBody: e.classes?.sidePanelBody ?? "",
1059
+ window: e.classes?.window ?? "",
1060
+ windowBody: e.classes?.windowBody ?? ""
1061
+ },
1062
+ format: he,
1063
+ messages: l,
1064
+ config: {
1065
+ ...e,
1066
+ zIndexBase: u
1067
+ },
1068
+ install(e) {
1069
+ e.provide(He, Ee);
1070
+ },
1071
+ dispose() {
1072
+ r.clear(), be.dispose(), i.clear(), a.clear(), o.clear(), c.value = null;
1073
+ }
1074
+ };
1075
+ return Ee;
1076
+ }
1077
+ //#endregion
1078
+ //#region src/core/anchorGeometry.ts
1079
+ function We(e) {
1080
+ return e === "top-left" ? "top-right" : e === "top-right" ? "top-left" : e === "bottom-left" ? "bottom-right" : "bottom-left";
1081
+ }
1082
+ function Ge(e, t, n) {
1083
+ let { x: r, y: i, width: a, height: o } = e;
1084
+ if (a > t.width && (a = Math.max(200, t.width - 20)), o > t.height && (o = Math.max(150, t.height - 40)), !n) {
1085
+ let e = t.width - 100, n = t.height - 40;
1086
+ r > e && (r = Math.max(0, e)), i > n && (i = Math.max(0, n));
1087
+ }
1088
+ return r === e.x && i === e.y && a === e.width && o === e.height ? e : {
1089
+ x: r,
1090
+ y: i,
1091
+ width: a,
1092
+ height: o
1093
+ };
1094
+ }
1095
+ //#endregion
1096
+ //#region src/core/panelDom.ts
1097
+ function Ke(e) {
1098
+ return e.offsetParent !== null || e.getClientRects().length > 0;
1099
+ }
1100
+ function qe(e) {
1101
+ let t = [], n = (e) => {
1102
+ (e.scrollHeight > e.clientHeight || e.scrollWidth > e.clientWidth) && t.push(e);
1103
+ for (let t of Array.from(e.children)) n(t);
1104
+ };
1105
+ return n(e), t;
1106
+ }
1107
+ var Je = class {
1108
+ doc;
1109
+ elements = /* @__PURE__ */ new Map();
1110
+ preserved = /* @__PURE__ */ new Map();
1111
+ sizes = /* @__PURE__ */ new Map();
1112
+ hidden = null;
1113
+ constructor(e = document) {
1114
+ this.doc = e;
1115
+ }
1116
+ hiddenStore() {
1117
+ if (!this.hidden || !this.hidden.isConnected) {
1118
+ let e = this.doc.createElement("div");
1119
+ e.className = "vdd-panel-store", e.style.display = "none", this.doc.body.appendChild(e), this.hidden = e;
1120
+ }
1121
+ return this.hidden;
1122
+ }
1123
+ elementFor(e) {
1124
+ let t = this.elements.get(e);
1125
+ return t || (t = this.doc.createElement("div"), t.className = "vdd-panel-mount", t.dataset.vddPanel = e, this.hiddenStore().appendChild(t), this.elements.set(e, t)), t;
1126
+ }
1127
+ has(e) {
1128
+ return this.elements.has(e);
1129
+ }
1130
+ reportSize(e, t) {
1131
+ this.sizes.set(e, t);
1132
+ }
1133
+ sizeOf(e) {
1134
+ return this.sizes.get(e) ?? {
1135
+ width: 800,
1136
+ height: 500
1137
+ };
1138
+ }
1139
+ hostOf(e) {
1140
+ return this.elements.get(e)?.parentElement ?? null;
1141
+ }
1142
+ moveTo(e, t, n) {
1143
+ let r = this.elementFor(e), i = t ?? this.hiddenStore();
1144
+ if (r.parentElement === i) return;
1145
+ let a = n?.preserveScroll !== !1;
1146
+ a && this.remember(e, r), i.appendChild(r), a && this.apply(e, r, n?.refocus === !0);
1147
+ }
1148
+ release(e) {
1149
+ this.elements.get(e)?.remove(), this.elements.delete(e), this.preserved.delete(e), this.sizes.delete(e);
1150
+ }
1151
+ dispose() {
1152
+ for (let e of this.elements.values()) e.remove();
1153
+ this.elements.clear(), this.preserved.clear(), this.sizes.clear(), this.hidden?.remove(), this.hidden = null;
1154
+ }
1155
+ remember(e, t) {
1156
+ if (!Ke(t)) return;
1157
+ let n = qe(t).map((e) => ({
1158
+ el: e,
1159
+ top: e.scrollTop,
1160
+ left: e.scrollLeft
1161
+ })), r = null, i = this.doc.activeElement;
1162
+ if (i && t.contains(i)) {
1163
+ let e = i, t = "selectionStart" in e && e.selectionStart !== null;
1164
+ r = {
1165
+ el: i,
1166
+ start: t ? e.selectionStart : null,
1167
+ end: t ? e.selectionEnd : null
1168
+ };
1169
+ }
1170
+ this.preserved.set(e, {
1171
+ scrolls: n,
1172
+ focus: r
1173
+ });
1174
+ }
1175
+ apply(e, t, n) {
1176
+ let r = this.preserved.get(e);
1177
+ if (!r) return;
1178
+ let i = () => {
1179
+ for (let e of r.scrolls) e.el.scrollTop = e.top, e.el.scrollLeft = e.left;
1180
+ if (n && r.focus && (r.focus.el.focus({ preventScroll: !0 }), r.focus.start !== null)) try {
1181
+ r.focus.el.setSelectionRange(r.focus.start, r.focus.end ?? r.focus.start);
1182
+ } catch {}
1183
+ };
1184
+ Ke(t) && i(), typeof requestAnimationFrame == "function" && requestAnimationFrame(() => {
1185
+ Ke(t) && i();
1186
+ });
1187
+ }
1188
+ }, Ye = Symbol("vdd-panel-dom");
1189
+ function Xe(e) {
1190
+ E(Ye, e);
1191
+ }
1192
+ function Ze() {
1193
+ return p(Ye, null);
1194
+ }
1195
+ //#endregion
1196
+ //#region src/composables/useDragDock.ts
1197
+ var Qe = 5, $e = Symbol("vdd-drag-dock");
1198
+ function et(e) {
1199
+ let t = k(null), r = k({
1200
+ x: 0,
1201
+ y: 0
1202
+ }), i = k(null), a = k(null), o = k(null), s = F(null), c = n(() => t.value !== null), l = (t) => e.state.isRtl ? t === "left" ? "right" : t === "right" ? "left" : t : t;
1203
+ function u() {
1204
+ t.value = null, i.value = null, a.value = null, o.value = null, s.value = null, e.setDraggedPanelId(null), document.body.classList.remove("vdd-dragging-active");
1205
+ }
1206
+ function d(n) {
1207
+ t.value = n, e.setDraggedPanelId(n), document.body.classList.add("vdd-dragging-active");
1208
+ }
1209
+ function f(e, t) {
1210
+ i.value = t ? {
1211
+ leafId: e,
1212
+ position: t
1213
+ } : null, t && (a.value = null, o.value = null);
1214
+ }
1215
+ let p = (e) => {
1216
+ a.value = e;
1217
+ }, m = (e) => {
1218
+ o.value = e, e && (a.value = null);
1219
+ }, h = (e) => {
1220
+ s.value = e;
1221
+ };
1222
+ function g(e, t) {
1223
+ let n = document.elementsFromPoint(e, t), r = !1, c = !1, l = !1;
1224
+ for (let t of n) if (t instanceof HTMLElement) {
1225
+ if (!r && t.dataset.vddDropZone && t.dataset.vddLeaf && (i.value = {
1226
+ leafId: t.dataset.vddLeaf,
1227
+ position: t.dataset.vddDropZone
1228
+ }, r = !0), !l && t.dataset.vddTab && t.dataset.vddTabLeaf) {
1229
+ let n = t.getBoundingClientRect();
1230
+ s.value = {
1231
+ leafId: t.dataset.vddTabLeaf,
1232
+ panelId: t.dataset.vddTab,
1233
+ index: Number.parseInt(t.dataset.vddTabIndex ?? "0", 10),
1234
+ side: e - n.left < n.width / 2 ? "left" : "right"
1235
+ }, l = !0;
1236
+ }
1237
+ if (!c && t.dataset.vddEdge && (a.value = t.dataset.vddEdge, c = !0), !r && t.dataset.vddCorner && (o.value = t.dataset.vddCorner), r && c && l) break;
1238
+ }
1239
+ r || (i.value = null), c || (a.value = null), l || (s.value = null);
1240
+ }
1241
+ function _(t, n) {
1242
+ let r = a.value, c = s.value, d = i.value, f = o.value;
1243
+ if (r) e.dockPanelToWorkspaceEdge(t, l(r));
1244
+ else if (c) {
1245
+ let n = c.index;
1246
+ c.side === "right" && (n += 1);
1247
+ let r = he(e.state.gridRoot, c.leafId);
1248
+ if (r) {
1249
+ let e = r.panels.indexOf(t);
1250
+ e !== -1 && e < n && --n;
1251
+ }
1252
+ e.movePanelOrder(t, c.leafId, n);
1253
+ } else d ? e.dockPanelToGroup(t, d.leafId, l(d.position)) : f ? e.floatPanel(t, void 0, e.state.isRtl ? We(f) : f) : e.floatPanel(t, {
1254
+ x: n.clientX - 150,
1255
+ y: n.clientY - 15,
1256
+ width: 450,
1257
+ height: 350
1258
+ });
1259
+ u();
1260
+ }
1261
+ function v(e, t, n) {
1262
+ if (t.pointerType === "mouse" && t.button !== 0) return;
1263
+ let i = t.currentTarget, a = t.clientX, o = t.clientY;
1264
+ if (t.pointerType === "touch") {
1265
+ let s = t.pointerId, c = !1, l = !1, f = () => {
1266
+ clearTimeout(v), i.removeEventListener("pointermove", p), i.removeEventListener("pointerup", m), i.removeEventListener("pointercancel", h);
1267
+ }, p = (e) => {
1268
+ Math.hypot(e.clientX - a, e.clientY - o) > 8 && (c = !0, f());
1269
+ }, m = () => {
1270
+ c = !0, f();
1271
+ }, h = m, v = setTimeout(() => {
1272
+ if (c) return;
1273
+ f();
1274
+ try {
1275
+ i.setPointerCapture(s);
1276
+ } catch {
1277
+ return;
1278
+ }
1279
+ i.classList.add("vdd-long-press-active"), document.body.classList.add("vdd-dragging-active"), navigator.vibrate?.(10);
1280
+ let t = (t) => {
1281
+ l || (l = !0, d(e)), r.value = {
1282
+ x: t.clientX,
1283
+ y: t.clientY
1284
+ }, g(t.clientX, t.clientY);
1285
+ }, a = (r) => {
1286
+ i.classList.remove("vdd-long-press-active"), i.removeEventListener("pointermove", t), i.removeEventListener("pointerup", a), i.removeEventListener("pointercancel", o), l ? _(e, r) : (document.body.classList.remove("vdd-dragging-active"), n?.(r));
1287
+ }, o = () => {
1288
+ i.classList.remove("vdd-long-press-active"), i.removeEventListener("pointermove", t), i.removeEventListener("pointerup", a), i.removeEventListener("pointercancel", o), u();
1289
+ };
1290
+ i.addEventListener("pointermove", t), i.addEventListener("pointerup", a), i.addEventListener("pointercancel", o);
1291
+ }, 300);
1292
+ i.addEventListener("pointermove", p), i.addEventListener("pointerup", m), i.addEventListener("pointercancel", h);
1293
+ return;
1294
+ }
1295
+ let s = !1, c = (t) => {
1296
+ if (!s) {
1297
+ if (Math.abs(t.clientX - a) <= Qe && Math.abs(t.clientY - o) <= Qe) return;
1298
+ s = !0, d(e);
1299
+ }
1300
+ r.value = {
1301
+ x: t.clientX,
1302
+ y: t.clientY
1303
+ };
1304
+ }, l = () => {
1305
+ window.removeEventListener("pointermove", c), window.removeEventListener("pointerup", f), window.removeEventListener("pointercancel", p);
1306
+ }, f = (t) => {
1307
+ l(), s ? _(e, t) : document.body.classList.remove("vdd-dragging-active");
1308
+ }, p = () => {
1309
+ l(), u();
1310
+ };
1311
+ window.addEventListener("pointermove", c), window.addEventListener("pointerup", f), window.addEventListener("pointercancel", p);
1312
+ }
1313
+ let y = {
1314
+ draggedId: t,
1315
+ pointer: r,
1316
+ zone: i,
1317
+ edge: a,
1318
+ corner: o,
1319
+ tab: s,
1320
+ dragging: c,
1321
+ startTabDrag: v,
1322
+ beginDrag: d,
1323
+ trackPointer: (e, t) => {
1324
+ r.value = {
1325
+ x: e,
1326
+ y: t
1327
+ }, g(e, t);
1328
+ },
1329
+ hoverZone: f,
1330
+ hoverEdge: p,
1331
+ hoverCorner: m,
1332
+ hoverTab: h,
1333
+ finishDrag: _,
1334
+ cancel: u
1335
+ };
1336
+ return E($e, y), y;
1337
+ }
1338
+ function tt() {
1339
+ return p($e, null);
1340
+ }
1341
+ //#endregion
1342
+ //#region src/core/panelMenu.ts
1343
+ function nt(e, t, n, r) {
1344
+ let i = [];
1345
+ return n.canDrag !== !1 && i.push({
1346
+ label: e.messages.floatWindow,
1347
+ action: r.float
1348
+ }), n.canMinimize !== !1 && i.push({
1349
+ label: e.messages.minimizePanel,
1350
+ action: r.minimize
1351
+ }), i.length > 0 && n.canClose !== !1 && i.push({ separator: !0 }), n.canClose !== !1 && i.push({
1352
+ label: e.messages.closeTab,
1353
+ action: r.close
1354
+ }), it(e, t, i);
1355
+ }
1356
+ function rt(e, t, n, r) {
1357
+ let i = [{
1358
+ label: e.messages.restorePanel,
1359
+ action: r.restore
1360
+ }];
1361
+ return n.canDrag !== !1 && i.push({
1362
+ label: e.messages.maximizePanel,
1363
+ action: r.maximize
1364
+ }), n.canClose !== !1 && (i.push({ separator: !0 }), i.push({
1365
+ label: e.messages.closePanel,
1366
+ action: r.close
1367
+ })), it(e, t, i);
1368
+ }
1369
+ function it(e, t, n) {
1370
+ let r = e.panelMenuItems(t);
1371
+ return r.length === 0 ? n : n.length > 0 ? [
1372
+ ...n,
1373
+ { separator: !0 },
1374
+ ...r
1375
+ ] : [...r];
1376
+ }
1377
+ //#endregion
1378
+ //#region src/composables/useWorkspace.ts
1379
+ function J() {
1380
+ let e = p(He, null);
1381
+ if (!e) throw Error("[vue-dockable-desktop] useWorkspace() found no workspace. Create one with createWorkspace() and install it with app.use(workspace).");
1382
+ return d() ? {
1383
+ ...e,
1384
+ subscribe(t, n) {
1385
+ let r = e.subscribe(t, n);
1386
+ return w(r), r;
1387
+ }
1388
+ } : e;
1389
+ }
1390
+ //#endregion
1391
+ //#region src/core/dragResize.ts
1392
+ function Y(e) {
1393
+ let { element: t, pointerId: n, startClientX: r, startClientY: i, captureStart: a, onMove: o, onEnd: s, activeClasses: c } = e;
1394
+ t.setPointerCapture(n), c?.forEach(({ el: e, classes: t }) => e.classList.add(...t));
1395
+ let l = a(), u = (e) => {
1396
+ o(e.clientX - r, e.clientY - i, l);
1397
+ }, d = () => {
1398
+ c?.forEach(({ el: e, classes: t }) => e.classList.remove(...t)), t.removeEventListener("pointermove", u), t.removeEventListener("pointerup", d), t.removeEventListener("pointercancel", d), s?.(l);
1399
+ };
1400
+ t.addEventListener("pointermove", u), t.addEventListener("pointerup", d), t.addEventListener("pointercancel", d);
1401
+ }
1402
+ function at(e, t, n, r, i) {
1403
+ let { minW: a, minH: o, maxW: s, maxH: c, minX: l, minY: u } = i, { x: d, y: f, w: p, h: m } = r;
1404
+ if (e.includes("e") && (p = Math.max(a, Math.min(r.w + t, s ?? Infinity))), e.includes("w")) {
1405
+ let e = r.w - a, n = l == null ? -Infinity : -(r.x - l), i = Math.max(n, Math.min(t, e));
1406
+ p = r.w - i, d = r.x + i;
1407
+ }
1408
+ if (e.includes("s") && (m = Math.max(o, Math.min(r.h + n, c ?? Infinity))), e.includes("n")) {
1409
+ let e = r.h - o, t = u == null ? -Infinity : -(r.y - u), i = Math.max(t, Math.min(n, e));
1410
+ m = r.h - i, f = r.y + i;
1411
+ }
1412
+ return {
1413
+ x: d,
1414
+ y: f,
1415
+ w: p,
1416
+ h: m
1417
+ };
1418
+ }
1419
+ //#endregion
1420
+ //#region src/components/VddPanelSlot.vue?vue&type=script&setup=true&lang.ts
1421
+ var ot = ["data-vdd-slot"], st = /* @__PURE__ */ u({
1422
+ __name: "VddPanelSlot",
1423
+ props: {
1424
+ panelId: {},
1425
+ hostClass: {}
1426
+ },
1427
+ setup(e) {
1428
+ let t = e, n = Ze(), r = J(), i = null;
1429
+ function o(e) {
1430
+ let a = e ?? null;
1431
+ i = a, n && a && n.moveTo(t.panelId, a, {
1432
+ refocus: r.state.activePanelId === t.panelId,
1433
+ preserveScroll: r.registry.get(r.state.panels[t.panelId]?.component ?? "")?.defaultOptions?.preserveScroll !== !1
1434
+ });
1435
+ }
1436
+ return S(() => {
1437
+ n && n.hostOf(t.panelId) === i && n.moveTo(t.panelId, null);
1438
+ }), (t, n) => (T(), a("div", {
1439
+ ref: o,
1440
+ class: y(["vdd-panel-slot", e.hostClass]),
1441
+ "data-vdd-slot": e.panelId
1442
+ }, null, 10, ot));
1443
+ }
1444
+ }), ct = { class: "vdd-dock-drop-zone-overlay" }, lt = { class: "vdd-dock-target-cross" }, ut = [
1445
+ "data-vdd-drop-zone",
1446
+ "data-vdd-leaf",
1447
+ "onPointerenter"
1448
+ ], dt = /* @__PURE__ */ u({
1449
+ __name: "VddDropZones",
1450
+ props: { leafId: {} },
1451
+ setup(t) {
1452
+ let r = t, s = tt(), c = J(), l = [
1453
+ "top",
1454
+ "bottom",
1455
+ "left",
1456
+ "right",
1457
+ "center"
1458
+ ], u = {
1459
+ top: "▲",
1460
+ bottom: "▼",
1461
+ left: "◀",
1462
+ right: "▶",
1463
+ center: "▣"
1464
+ }, d = (e) => s?.zone.value?.leafId === r.leafId && s.zone.value.position === e, f = n(() => {
1465
+ let e = s?.zone.value;
1466
+ if (!e || e.leafId !== r.leafId) return null;
1467
+ let t = `${c.state.splitRatio * 100}%`, n = `${(1 - c.state.splitRatio) * 100}%`, i = e.position;
1468
+ return {
1469
+ left: i === "right" ? n : "0",
1470
+ top: i === "bottom" ? n : "0",
1471
+ width: i === "left" || i === "right" ? t : "100%",
1472
+ height: i === "top" || i === "bottom" ? t : "100%"
1473
+ };
1474
+ });
1475
+ return (n, r) => (T(), a(e, null, [o("div", ct, [o("div", lt, [(T(), a(e, null, A(l, (e) => o("div", {
1476
+ key: e,
1477
+ class: y(["vdd-dock-target-box", [`vdd-dock-target-${e}`, { "vdd-dock-target-box--active": d(e) }]]),
1478
+ "data-vdd-drop-zone": e,
1479
+ "data-vdd-leaf": t.leafId,
1480
+ onPointerenter: (n) => z(s)?.hoverZone(t.leafId, e),
1481
+ onPointerleave: r[0] ||= (e) => z(s)?.hoverZone(t.leafId, null)
1482
+ }, I(u[e]), 43, ut)), 64))])]), f.value ? (T(), a("div", {
1483
+ key: 0,
1484
+ class: "vdd-dock-preview-highlight",
1485
+ style: x(f.value)
1486
+ }, null, 4)) : i("", !0)], 64));
1487
+ }
1488
+ }), ft = ["data-vdd-leaf", "data-active-panel-id"], pt = { class: "vdd-workspace-tab-bar" }, mt = { class: "vdd-tab-headers-container" }, ht = [
1489
+ "data-vdd-tab",
1490
+ "data-vdd-tab-leaf",
1491
+ "data-vdd-tab-index",
1492
+ "aria-selected",
1493
+ "onClick",
1494
+ "onContextmenu",
1495
+ "onPointerdown",
1496
+ "onPointermove"
1497
+ ], gt = { class: "vdd-text-truncate" }, _t = {
1498
+ key: 0,
1499
+ class: "vdd-workspace-tab-icon"
1500
+ }, vt = [
1501
+ "title",
1502
+ "data-vdd-close",
1503
+ "onClick"
1504
+ ], yt = {
1505
+ key: 0,
1506
+ class: "vdd-tab-header-actions"
1507
+ }, bt = ["title", "aria-label"], xt = { class: "vdd-panel-body" }, St = {
1508
+ key: 2,
1509
+ class: "vdd-empty-leaf-placeholder"
1510
+ }, Ct = /* @__PURE__ */ u({
1511
+ __name: "VddLeafGroup",
1512
+ props: { leaf: {} },
1513
+ setup(t) {
1514
+ let s = t, c = J(), l = tt();
1515
+ function u(e, t) {
1516
+ let n = c.state.panels[e];
1517
+ if (!n) return;
1518
+ let r = c.registry.get(n.component)?.defaultOptions ?? {}, i = nt(c, e, r, {
1519
+ float: () => c.floatPanel(e),
1520
+ minimize: () => c.minimizePanel(e),
1521
+ close: () => c.requestClosePanel(e),
1522
+ restore: () => c.restorePanel(e),
1523
+ maximize: () => c.maximizePanel(e)
1524
+ });
1525
+ i.length !== 0 && c.showContextMenu({
1526
+ event: t,
1527
+ items: i
1528
+ });
1529
+ }
1530
+ function d(e, t, n, r) {
1531
+ if (!l?.dragging.value || r.pointerType === "touch") return;
1532
+ let i = r.currentTarget.getBoundingClientRect();
1533
+ l.hoverTab({
1534
+ leafId: e,
1535
+ panelId: t,
1536
+ index: n,
1537
+ side: r.clientX - i.left < i.width / 2 ? "left" : "right"
1538
+ });
1539
+ }
1540
+ let f = n(() => s.leaf.panels.flatMap((e) => {
1541
+ let t = c.state.panels[e];
1542
+ return t ? [{
1543
+ id: e,
1544
+ panel: t,
1545
+ options: c.registry.get(t.component)?.defaultOptions ?? {}
1546
+ }] : [];
1547
+ })), p = n(() => s.leaf.activePanelId), m = (e) => {
1548
+ let t = l?.tab.value, n = t?.leafId === s.leaf.id && t.panelId === e;
1549
+ return [
1550
+ "vdd-workspace-tab",
1551
+ e === p.value ? ["vdd-active", e === c.state.activePanelId ? "vdd-workspace-tab-active-focused" : "vdd-workspace-tab-active-unfocused"] : "vdd-workspace-tab-inactive",
1552
+ n ? t.side === "left" ? "vdd-drag-hover-left" : "vdd-drag-hover-right" : ""
1553
+ ];
1554
+ };
1555
+ return (n, s) => (T(), a("div", {
1556
+ class: "vdd-workspace-panel",
1557
+ "data-vdd-leaf": t.leaf.id,
1558
+ "data-active-panel-id": p.value ?? "",
1559
+ onPointerdown: s[2] ||= (e) => p.value && z(c).focusPanel(p.value)
1560
+ }, [o("div", pt, [o("div", mt, [(T(!0), a(e, null, A(f.value, (e, n) => (T(), a("div", {
1561
+ key: e.id,
1562
+ class: y(m(e.id)),
1563
+ "data-vdd-tab": e.id,
1564
+ "data-vdd-tab-leaf": t.leaf.id,
1565
+ "data-vdd-tab-index": String(n),
1566
+ role: "tab",
1567
+ "aria-selected": e.id === p.value,
1568
+ style: x({ cursor: e.options.canDrag === !1 ? "default" : "pointer" }),
1569
+ onClick: (t) => z(c).focusPanel(e.id),
1570
+ onContextmenu: W((t) => u(e.id, t), ["prevent"]),
1571
+ onPointerdown: (t) => e.options.canDrag === !1 ? void 0 : z(l)?.startTabDrag(e.id, t, (t) => u(e.id, t)),
1572
+ onPointermove: (r) => d(t.leaf.id, e.id, n, r),
1573
+ onPointerleave: s[0] ||= (e) => z(l)?.dragging.value && z(l).hoverTab(null)
1574
+ }, [o("span", gt, [e.options.icon ? (T(), a("span", _t, [(T(), r(N(e.options.icon)))])) : i("", !0), o("span", null, I(z(c).format(e.panel.title)) + I(e.panel.dirty ? " *" : ""), 1)]), e.options.canClose === !1 ? i("", !0) : (T(), a("span", {
1575
+ key: 0,
1576
+ class: "vdd-close-tab-x",
1577
+ title: z(c).format(z(c).messages.closeTab),
1578
+ "data-vdd-close": e.id,
1579
+ onClick: W((t) => z(c).requestClosePanel(e.id), ["stop"])
1580
+ }, [...s[3] ||= [o("svg", {
1581
+ width: "12",
1582
+ height: "12",
1583
+ viewBox: "0 0 24 24",
1584
+ fill: "none",
1585
+ stroke: "currentColor",
1586
+ "stroke-width": "2.5"
1587
+ }, [o("path", { d: "M18 6L6 18M6 6l12 12" })], -1)]], 8, vt))], 46, ht))), 128))]), f.value.length === 0 ? (T(), a("div", yt, [o("button", {
1588
+ type: "button",
1589
+ class: "vdd-header-close-empty-group",
1590
+ title: z(c).format(z(c).messages.closeEmptyGroup),
1591
+ "aria-label": z(c).format(z(c).messages.closeEmptyGroup),
1592
+ "data-vdd-close-empty-group": "",
1593
+ onClick: s[1] ||= W((e) => z(c).closeLeafGroup(t.leaf.id), ["stop"])
1594
+ }, [...s[4] ||= [o("svg", {
1595
+ width: "12",
1596
+ height: "12",
1597
+ viewBox: "0 0 24 24",
1598
+ fill: "none",
1599
+ stroke: "currentColor",
1600
+ "stroke-width": "2.5"
1601
+ }, [o("path", { d: "M18 6L6 18M6 6l12 12" })], -1)]], 8, bt)])) : i("", !0)]), o("div", xt, [z(l)?.dragging.value ? (T(), r(dt, {
1602
+ key: 0,
1603
+ "leaf-id": t.leaf.id
1604
+ }, null, 8, ["leaf-id"])) : i("", !0), p.value ? (T(), r(st, {
1605
+ key: p.value,
1606
+ "panel-id": p.value
1607
+ }, null, 8, ["panel-id"])) : (T(), a("div", St, [o("span", null, I(z(c).format(z(c).messages.emptyGroup)), 1)]))])], 40, ft));
1608
+ }
1609
+ }), wt = ["data-vdd-divider", "onPointerdown"], Tt = /* @__PURE__ */ u({
1610
+ __name: "VddWorkspaceGrid",
1611
+ props: {
1612
+ node: {},
1613
+ path: {}
1614
+ },
1615
+ setup(t) {
1616
+ let s = t, c = J(), u = n(() => s.node.type === "branch" && s.node.orientation === "horizontal");
1617
+ function d(e, t) {
1618
+ if (s.node.type !== "branch") return;
1619
+ t.preventDefault();
1620
+ let n = t.currentTarget, r = n.parentElement, i = r ? u.value ? r.clientWidth : r.clientHeight : u.value ? 1e3 : 800, a = [...s.node.sizes];
1621
+ Y({
1622
+ element: n,
1623
+ pointerId: t.pointerId,
1624
+ startClientX: t.clientX,
1625
+ startClientY: t.clientY,
1626
+ captureStart: () => a,
1627
+ activeClasses: [{
1628
+ el: n,
1629
+ classes: ["vdd-active"]
1630
+ }, {
1631
+ el: document.body,
1632
+ classes: ["vdd-resizing-active", u.value ? "vdd-resizing-col-active" : "vdd-resizing-row-active"]
1633
+ }],
1634
+ onMove: (t, n, r) => {
1635
+ let a = (u.value ? t : n) / i, o = [...r];
1636
+ o[e] = (r[e] ?? 0) + a, o[e + 1] = (r[e + 1] ?? 0) - a, (o[e] ?? 0) > .05 && (o[e + 1] ?? 0) > .05 && c.updateSplitSizes(s.path, o);
1637
+ }
1638
+ });
1639
+ }
1640
+ return (n, s) => {
1641
+ let c = M("VddWorkspaceGrid", !0);
1642
+ return t.node.type === "leaf" ? (T(), r(Ct, {
1643
+ key: 0,
1644
+ leaf: t.node
1645
+ }, null, 8, ["leaf"])) : (T(), a("div", {
1646
+ key: 1,
1647
+ class: y(["vdd-workspace-branch", u.value ? "vdd-row" : "vdd-column"]),
1648
+ style: x({
1649
+ display: "flex",
1650
+ flexDirection: u.value ? "row" : "column",
1651
+ width: "100%",
1652
+ height: "100%",
1653
+ overflow: "hidden",
1654
+ position: "relative"
1655
+ })
1656
+ }, [(T(!0), a(e, null, A(t.node.children, (n, r) => (T(), a(e, { key: r }, [o("div", { style: x({
1657
+ flexGrow: t.node.sizes[r],
1658
+ flexBasis: `${(t.node.sizes[r] ?? 0) * 100}%`,
1659
+ overflow: "hidden",
1660
+ position: "relative",
1661
+ minWidth: 0,
1662
+ minHeight: 0
1663
+ }) }, [l(c, {
1664
+ node: n,
1665
+ path: [...t.path, r]
1666
+ }, null, 8, ["node", "path"])], 4), r < t.node.children.length - 1 ? (T(), a("div", {
1667
+ key: 0,
1668
+ class: "vdd-resizer-bar",
1669
+ "data-vdd-divider": [...t.path, r].join("-"),
1670
+ style: x({
1671
+ cursor: u.value ? "col-resize" : "row-resize",
1672
+ width: u.value ? "1px" : "100%",
1673
+ height: u.value ? "100%" : "1px",
1674
+ zIndex: 20
1675
+ }),
1676
+ onPointerdown: (e) => d(r, e)
1677
+ }, null, 44, wt)) : i("", !0)], 64))), 128))], 6));
1678
+ };
1679
+ }
1680
+ }), Et = Symbol("vdd-panel");
1681
+ function Dt(e) {
1682
+ E(Et, e);
1683
+ }
1684
+ var Ot = "standalone";
1685
+ function kt() {
1686
+ let e = p(Et, null), t = p(He, null), r = e?.id ?? Ot, i = (e) => {
1687
+ process.env.NODE_ENV !== "production" && console.warn(`[vue-dockable-desktop] usePanel().${e} was called outside a panel container, so it did nothing. This is expected when a panel component is rendered standalone.`);
1688
+ }, a = n(() => t ? t.state.panels[r] : void 0), o = k(null);
1689
+ return {
1690
+ id: r,
1691
+ title: n(() => a.value?.title ?? r),
1692
+ isActive: n(() => !!t && t.state.activePanelId === r),
1693
+ isMinimized: n(() => a.value?.state === "minimized"),
1694
+ isFloating: n(() => a.value?.state === "floating"),
1695
+ containerType: n(() => e?.containerType.value ?? Ot),
1696
+ size: n(() => (e?.size ?? o).value),
1697
+ dirty: n(() => a.value?.dirty === !0),
1698
+ setTitle: (n) => {
1699
+ e?.setTitle ? e.setTitle(n) : t && a.value ? t.updatePanelTitle(r, n) : i("setTitle");
1700
+ },
1701
+ setIcon: (t) => {
1702
+ e?.setIcon ? e.setIcon(t) : i("setIcon");
1703
+ },
1704
+ setDirty: (n, o) => {
1705
+ e?.setDirty ? e.setDirty(n, o) : t && a.value ? t.setPanelDirty(r, n, o) : i("setDirty");
1706
+ },
1707
+ close: (n) => {
1708
+ if (e?.close) return e.close(n);
1709
+ if (t && a.value) return t.requestClosePanel(r, n);
1710
+ i("close");
1711
+ },
1712
+ minimize: () => {
1713
+ t && a.value ? t.minimizePanel(r) : i("minimize");
1714
+ },
1715
+ onBeforeClose: (e) => {
1716
+ if (!t || !a.value) {
1717
+ i("onBeforeClose");
1718
+ return;
1719
+ }
1720
+ let n = t.registerCloseGuard(r, e);
1721
+ d() && w(n);
1722
+ },
1723
+ onSaveState: (e) => {
1724
+ if (!t || !a.value) {
1725
+ i("onSaveState");
1726
+ return;
1727
+ }
1728
+ let n = t.registerStateProvider(r, e);
1729
+ d() && w(n);
1730
+ }
1731
+ };
1732
+ }
1733
+ //#endregion
1734
+ //#region src/components/VddPanelMount.vue?vue&type=script&setup=true&lang.ts
1735
+ var At = ["dir"], jt = {
1736
+ key: 1,
1737
+ class: "vdd-unregistered-panel"
1738
+ }, Mt = /* @__PURE__ */ u({
1739
+ __name: "VddPanelMount",
1740
+ props: {
1741
+ panelId: {},
1742
+ cache: {}
1743
+ },
1744
+ setup(e) {
1745
+ let i = e, s = J(), c = n(() => s.state.panels[i.panelId]), l = n(() => c.value ? s.registry.get(c.value.component) : void 0), u = n(() => {
1746
+ let e = c.value;
1747
+ return e && (e.state === "minimized" ? e.previousState ?? "docked" : e.state) === "floating" ? "floating-window" : "dockable-panel";
1748
+ }), d = k(null);
1749
+ Dt({
1750
+ id: i.panelId,
1751
+ containerType: u,
1752
+ size: d
1753
+ });
1754
+ let f = n(() => i.cache.elementFor(i.panelId)), p = null;
1755
+ return ne((e) => {
1756
+ let t = f.value;
1757
+ typeof ResizeObserver > "u" || (p = new ResizeObserver((e) => {
1758
+ for (let t of e) {
1759
+ let { width: e, height: n } = t.contentRect;
1760
+ e > 0 && n > 0 && (d.value = {
1761
+ width: e,
1762
+ height: n
1763
+ }, i.cache.reportSize(i.panelId, {
1764
+ width: e,
1765
+ height: n
1766
+ }));
1767
+ }
1768
+ }), p.observe(t), e(() => {
1769
+ p?.disconnect(), p = null;
1770
+ }));
1771
+ }), (n, i) => (T(), r(t, { to: f.value }, [o("div", {
1772
+ class: "vdd-panel-content",
1773
+ dir: z(s).state.dir
1774
+ }, [l.value ? (T(), r(N(l.value.component), _({ key: 0 }, c.value?.props ?? {}, { "panel-id": e.panelId }), null, 16, ["panel-id"])) : (T(), a("div", jt, [i[0] ||= o("strong", null, "Unregistered panel", -1), o("span", null, "No component is registered for key \"" + I(c.value?.component) + "\".", 1)]))], 8, At)], 8, ["to"]));
1775
+ }
1776
+ }), Nt = ["data-vdd-window", "dir"], Pt = ["data-vdd-titlebar"], Ft = { class: "vdd-floating-window-title" }, It = {
1777
+ key: 0,
1778
+ class: "vdd-window-title-icon"
1779
+ }, Lt = ["data-vdd-more", "title"], Rt = {
1780
+ width: "14",
1781
+ height: "14",
1782
+ viewBox: "0 0 24 24",
1783
+ fill: "currentColor",
1784
+ style: { display: "block" }
1785
+ }, zt = ["data-vdd-maximize", "title"], Bt = ["data-vdd-minimize", "title"], Vt = ["data-vdd-close-window", "title"], Ht = ["data-vdd-handle", "onPointerdown"], Ut = 8, Wt = 8, Gt = /* @__PURE__ */ u({
1786
+ __name: "VddFloatingWindow",
1787
+ props: {
1788
+ window: {},
1789
+ viewport: {}
1790
+ },
1791
+ setup(t) {
1792
+ let s = t, c = J(), u = tt(), d = [
1793
+ "n",
1794
+ "ne",
1795
+ "e",
1796
+ "se",
1797
+ "s",
1798
+ "sw",
1799
+ "w",
1800
+ "nw"
1801
+ ], f = n(() => c.state.panels[s.window.id]), p = n(() => f.value ? c.registry.get(f.value.component)?.defaultOptions ?? {} : {}), m = n(() => c.state.activePanelId === s.window.id), h = n(() => c.state.draggedPanelId === s.window.id), g = (e) => typeof e == "number" ? `${e}px` : e, _ = n(() => c.state.floating.filter((e) => e.anchor === s.window.anchor && !e.maximized)), v = n(() => {
1802
+ if (!s.window.anchor) return 0;
1803
+ let e = _.value.findIndex((e) => e.id === s.window.id), t = Ut;
1804
+ for (let n = 0; n < e; n++) {
1805
+ let e = _.value[n].height;
1806
+ t += (typeof e == "number" ? e : Number.parseFloat(String(e))) + Wt;
1807
+ }
1808
+ return t;
1809
+ }), b = n(() => {
1810
+ let e = s.window, t = {
1811
+ position: "absolute",
1812
+ zIndex: e.z,
1813
+ pointerEvents: h.value ? "none" : "auto"
1814
+ };
1815
+ if (e.maximized) return {
1816
+ ...t,
1817
+ left: 0,
1818
+ top: 0,
1819
+ width: "100%",
1820
+ height: "100%"
1821
+ };
1822
+ if (e.anchor) {
1823
+ let n = e.anchor.startsWith("top"), r = e.anchor.endsWith("-right");
1824
+ return {
1825
+ ...t,
1826
+ [r ? "insetInlineEnd" : "insetInlineStart"]: `${Ut}px`,
1827
+ [n ? "top" : "bottom"]: `${v.value}px`,
1828
+ width: g(e.width),
1829
+ height: g(e.height),
1830
+ transition: h.value ? "none" : "top 0.2s ease, bottom 0.2s ease"
1831
+ };
1832
+ }
1833
+ return {
1834
+ ...t,
1835
+ left: g(e.x),
1836
+ top: g(e.y),
1837
+ width: g(e.width),
1838
+ height: g(e.height)
1839
+ };
1840
+ }), S = n(() => c.panelMenuItems(s.window.id));
1841
+ function C(e, t = !1) {
1842
+ let n = t ? S.value : nt(c, s.window.id, p.value, {
1843
+ float: () => c.floatPanel(s.window.id),
1844
+ minimize: () => c.minimizePanel(s.window.id),
1845
+ close: () => c.requestClosePanel(s.window.id),
1846
+ restore: () => c.restorePanel(s.window.id),
1847
+ maximize: () => c.maximizePanel(s.window.id)
1848
+ });
1849
+ n.length !== 0 && c.showContextMenu({
1850
+ event: e,
1851
+ items: n
1852
+ });
1853
+ }
1854
+ function w(e) {
1855
+ if (p.value.canDrag === !1 || s.window.maximized || e.button !== 0) return;
1856
+ e.preventDefault(), c.focusPanel(s.window.id);
1857
+ let t = e.currentTarget.closest(".vdd-floating-window"), n = t?.offsetLeft ?? 0, r = t?.offsetTop ?? 0, i = e.clientX, a = e.clientY, o = !1;
1858
+ Y({
1859
+ element: e.currentTarget,
1860
+ pointerId: e.pointerId,
1861
+ startClientX: e.clientX,
1862
+ startClientY: e.clientY,
1863
+ captureStart: () => ({
1864
+ x: n,
1865
+ y: r
1866
+ }),
1867
+ activeClasses: [{
1868
+ el: document.body,
1869
+ classes: ["vdd-dragging-active"]
1870
+ }],
1871
+ onMove: (e, t, n) => {
1872
+ o || (o = !0, u?.beginDrag(s.window.id)), c.updateFloatingPosition(s.window.id, {
1873
+ x: n.x + e,
1874
+ y: n.y + t,
1875
+ anchor: null
1876
+ }), u?.trackPointer(i + e, a + t);
1877
+ },
1878
+ onEnd: () => {
1879
+ o && u && (u.zone.value ?? u.edge.value ?? u.corner.value ?? u.tab.value ? u.finishDrag(s.window.id, new PointerEvent("pointerup")) : u.cancel());
1880
+ }
1881
+ });
1882
+ }
1883
+ function E(e, t) {
1884
+ if (s.window.maximized || t.button !== 0) return;
1885
+ t.preventDefault(), t.stopPropagation(), c.focusPanel(s.window.id);
1886
+ let n = t.currentTarget.closest(".vdd-floating-window"), r = {
1887
+ x: n?.offsetLeft ?? 0,
1888
+ y: n?.offsetTop ?? 0,
1889
+ w: n?.offsetWidth ?? 400,
1890
+ h: n?.offsetHeight ?? 300
1891
+ };
1892
+ Y({
1893
+ element: t.currentTarget,
1894
+ pointerId: t.pointerId,
1895
+ startClientX: t.clientX,
1896
+ startClientY: t.clientY,
1897
+ captureStart: () => r,
1898
+ activeClasses: [{
1899
+ el: document.body,
1900
+ classes: ["vdd-resizing-active"]
1901
+ }],
1902
+ onMove: (t, n, r) => {
1903
+ let i = at(e, t, n, r, {
1904
+ minW: 200,
1905
+ minH: 150
1906
+ });
1907
+ c.updateFloatingPosition(s.window.id, {
1908
+ x: i.x,
1909
+ y: i.y,
1910
+ width: i.w,
1911
+ height: i.h
1912
+ });
1913
+ }
1914
+ });
1915
+ }
1916
+ return (n, s) => f.value ? (T(), a("div", {
1917
+ key: 0,
1918
+ class: y(["vdd-floating-window", [{
1919
+ "vdd-maximized": t.window.maximized,
1920
+ "vdd-window-focused": m.value
1921
+ }, z(c).classes.window]]),
1922
+ "data-vdd-window": t.window.id,
1923
+ dir: z(c).state.dir,
1924
+ style: x(b.value),
1925
+ onPointerdownCapture: s[7] ||= (e) => z(c).focusPanel(t.window.id)
1926
+ }, [
1927
+ o("div", {
1928
+ class: "vdd-floating-window-titlebar",
1929
+ "data-vdd-titlebar": t.window.id,
1930
+ style: x({ cursor: t.window.maximized || p.value.canDrag === !1 ? "default" : "move" }),
1931
+ onPointerdown: w,
1932
+ onContextmenu: s[5] ||= W((e) => C(e), ["prevent"]),
1933
+ onDblclick: s[6] ||= (e) => z(c).maximizePanel(t.window.id)
1934
+ }, [o("span", Ft, [p.value.icon ? (T(), a("span", It, [(T(), r(N(p.value.icon)))])) : i("", !0), o("span", null, I(z(c).format(f.value.title)) + I(f.value.dirty ? " *" : ""), 1)]), o("div", {
1935
+ class: "vdd-titlebar-actions",
1936
+ onPointerdown: s[4] ||= W(() => {}, ["stop"])
1937
+ }, [
1938
+ S.value.length > 0 ? (T(), a("button", {
1939
+ key: 0,
1940
+ type: "button",
1941
+ class: "vdd-custom-tab-btn vdd-btn-more-actions",
1942
+ "data-vdd-more": t.window.id,
1943
+ title: z(c).format(z(c).messages.moreActions),
1944
+ onClick: s[0] ||= (e) => C(e, !0)
1945
+ }, [(T(), a("svg", Rt, [...s[8] ||= [
1946
+ o("circle", {
1947
+ cx: "12",
1948
+ cy: "5",
1949
+ r: "2"
1950
+ }, null, -1),
1951
+ o("circle", {
1952
+ cx: "12",
1953
+ cy: "12",
1954
+ r: "2"
1955
+ }, null, -1),
1956
+ o("circle", {
1957
+ cx: "12",
1958
+ cy: "19",
1959
+ r: "2"
1960
+ }, null, -1)
1961
+ ]]))], 8, Lt)) : i("", !0),
1962
+ o("button", {
1963
+ type: "button",
1964
+ class: "vdd-custom-tab-btn vdd-btn-maximize-tab",
1965
+ "data-vdd-maximize": t.window.id,
1966
+ title: z(c).format(t.window.maximized ? z(c).messages.restoreSize : z(c).messages.maximize),
1967
+ onClick: s[1] ||= (e) => z(c).maximizePanel(t.window.id)
1968
+ }, [...s[9] ||= [o("svg", {
1969
+ width: "10",
1970
+ height: "10",
1971
+ viewBox: "0 0 24 24",
1972
+ fill: "none",
1973
+ stroke: "currentColor",
1974
+ "stroke-width": "2.5"
1975
+ }, [o("rect", {
1976
+ x: "4",
1977
+ y: "4",
1978
+ width: "16",
1979
+ height: "16",
1980
+ rx: "1.5"
1981
+ })], -1)]], 8, zt),
1982
+ p.value.canMinimize === !1 ? i("", !0) : (T(), a("button", {
1983
+ key: 1,
1984
+ type: "button",
1985
+ class: "vdd-custom-tab-btn vdd-btn-minimize-tab",
1986
+ "data-vdd-minimize": t.window.id,
1987
+ title: z(c).format(z(c).messages.minimize),
1988
+ onClick: s[2] ||= (e) => z(c).minimizePanel(t.window.id)
1989
+ }, [...s[10] ||= [o("svg", {
1990
+ width: "10",
1991
+ height: "10",
1992
+ viewBox: "0 0 24 24",
1993
+ fill: "none",
1994
+ stroke: "currentColor",
1995
+ "stroke-width": "3"
1996
+ }, [o("path", { d: "M5 12h14" })], -1)]], 8, Bt)),
1997
+ p.value.canClose === !1 ? i("", !0) : (T(), a("button", {
1998
+ key: 2,
1999
+ type: "button",
2000
+ class: "vdd-custom-tab-btn vdd-btn-close-tab",
2001
+ "data-vdd-close-window": t.window.id,
2002
+ title: z(c).format(z(c).messages.close),
2003
+ onClick: s[3] ||= (e) => z(c).requestClosePanel(t.window.id)
2004
+ }, [...s[11] ||= [o("svg", {
2005
+ width: "10",
2006
+ height: "10",
2007
+ viewBox: "0 0 24 24",
2008
+ fill: "none",
2009
+ stroke: "currentColor",
2010
+ "stroke-width": "3"
2011
+ }, [o("path", { d: "M18 6L6 18M6 6l12 12" })], -1)]], 8, Vt))
2012
+ ], 32)], 44, Pt),
2013
+ o("div", { class: y(["vdd-floating-window-body", z(c).classes.windowBody]) }, [l(st, { "panel-id": t.window.id }, null, 8, ["panel-id"])], 2),
2014
+ t.window.maximized ? i("", !0) : (T(), a(e, { key: 0 }, A(d, (e) => o("div", {
2015
+ key: e,
2016
+ class: y(["vdd-resize-handle", `vdd-resize-${e}`]),
2017
+ "data-vdd-handle": `${t.window.id}:${e}`,
2018
+ onPointerdown: (t) => E(e, t)
2019
+ }, null, 42, Ht)), 64))
2020
+ ], 46, Nt)) : i("", !0);
2021
+ }
2022
+ }), Kt = ["data-vdd-edge", "onPointerenter"], qt = ["data-vdd-corner", "onPointerenter"], Jt = /* @__PURE__ */ u({
2023
+ __name: "VddEdgeZones",
2024
+ setup(t) {
2025
+ let r = tt(), s = J(), c = [
2026
+ "left",
2027
+ "right",
2028
+ "top",
2029
+ "bottom"
2030
+ ], l = [
2031
+ "top-left",
2032
+ "top-right",
2033
+ "bottom-left",
2034
+ "bottom-right"
2035
+ ], u = n(() => {
2036
+ let e = r?.edge.value;
2037
+ if (!e) return null;
2038
+ let t = `${s.state.edgeSplitRatio * 100}%`;
2039
+ switch (e) {
2040
+ case "left": return {
2041
+ left: "0",
2042
+ top: "0",
2043
+ bottom: "0",
2044
+ width: t
2045
+ };
2046
+ case "right": return {
2047
+ right: "0",
2048
+ top: "0",
2049
+ bottom: "0",
2050
+ width: t
2051
+ };
2052
+ case "top": return {
2053
+ top: "0",
2054
+ left: "0",
2055
+ right: "0",
2056
+ height: t
2057
+ };
2058
+ default: return {
2059
+ bottom: "0",
2060
+ left: "0",
2061
+ right: "0",
2062
+ height: t
2063
+ };
2064
+ }
2065
+ });
2066
+ return (t, n) => (T(), a(e, null, [
2067
+ (T(), a(e, null, A(c, (e) => o("div", {
2068
+ key: e,
2069
+ class: y(["vdd-workspace-edge-trigger", `vdd-edge-trigger-${e}`]),
2070
+ "data-vdd-edge": e,
2071
+ onPointerenter: (t) => z(r)?.hoverEdge(e),
2072
+ onPointerleave: n[0] ||= (e) => z(r)?.hoverEdge(null)
2073
+ }, null, 42, Kt)), 64)),
2074
+ (T(), a(e, null, A(l, (e) => o("div", {
2075
+ key: e,
2076
+ class: y(["vdd-corner-zone", [`vdd-corner-zone--${e}`, { "vdd-corner-zone--hovered": z(r)?.corner.value === e }]]),
2077
+ "data-vdd-corner": e,
2078
+ "aria-hidden": "true",
2079
+ onPointerenter: (t) => z(r)?.hoverCorner(e),
2080
+ onPointerleave: n[1] ||= (e) => z(r)?.hoverCorner(null)
2081
+ }, null, 42, qt)), 64)),
2082
+ u.value ? (T(), a("div", {
2083
+ key: 0,
2084
+ class: "vdd-workspace-edge-preview",
2085
+ style: x(u.value)
2086
+ }, null, 4)) : i("", !0)
2087
+ ], 64));
2088
+ }
2089
+ }), Yt = /* @__PURE__ */ u({
2090
+ __name: "VddDragGhost",
2091
+ setup(e) {
2092
+ let t = tt(), r = J(), o = n(() => {
2093
+ let e = t?.draggedId.value;
2094
+ if (!e) return "";
2095
+ let n = r.state.panels[e];
2096
+ return n ? r.format(n.title) : e;
2097
+ }), s = n(() => !!t?.draggedId.value && !r.state.floating.some((e) => e.id === t.draggedId.value));
2098
+ return (e, n) => s.value ? (T(), a("div", {
2099
+ key: 0,
2100
+ class: "vdd-drag-ghost-tab",
2101
+ "data-vdd-ghost": "",
2102
+ style: x({
2103
+ left: `${(z(t)?.pointer.value.x ?? 0) + 12}px`,
2104
+ top: `${(z(t)?.pointer.value.y ?? 0) + 12}px`
2105
+ })
2106
+ }, I(o.value), 5)) : i("", !0);
2107
+ }
2108
+ }), Xt = ["dir"], Zt = { class: "vdd-tooltip-header-row" }, Qt = { class: "vdd-tooltip-title-text vdd-text-truncate" }, $t = ["data-vdd-preview-close", "title"], en = {
2109
+ key: 1,
2110
+ class: "vdd-taskbar-item-preview-letter"
2111
+ }, tn = 220, nn = 140, rn = /* @__PURE__ */ u({
2112
+ __name: "VddTaskbarPreview",
2113
+ props: {
2114
+ panelId: {},
2115
+ anchor: {},
2116
+ cache: {}
2117
+ },
2118
+ emits: [
2119
+ "restore",
2120
+ "close",
2121
+ "dismiss",
2122
+ "keep"
2123
+ ],
2124
+ setup(e, { emit: i }) {
2125
+ let s = e, c = i, l = J(), u = n(() => l.state.panels[s.panelId]), d = n(() => u.value ? l.registry.get(u.value.component)?.defaultOptions ?? {} : {}), f = n(() => d.value.disableLivePreview !== !0), p = n(() => s.cache.sizeOf(s.panelId)), m = n(() => Math.min(tn / p.value.width, nn / p.value.height)), h = n(() => ({
2126
+ width: `${Math.round(p.value.width * m.value)}px`,
2127
+ height: `${Math.round(p.value.height * m.value)}px`
2128
+ })), g = n(() => ({
2129
+ width: `${p.value.width}px`,
2130
+ height: `${p.value.height}px`,
2131
+ transform: `scale(${m.value})`,
2132
+ transformOrigin: "top left",
2133
+ position: "absolute",
2134
+ top: "0",
2135
+ left: "0",
2136
+ "--vdd-preview-scale": String(m.value)
2137
+ })), _ = n(() => {
2138
+ let e = l.format(u.value?.title) || s.panelId;
2139
+ return (Array.from(e)[0] ?? "P").toUpperCase();
2140
+ }), v = null;
2141
+ function y(e) {
2142
+ if (!f.value) return;
2143
+ let t = e ?? null;
2144
+ t ? (v = t, s.cache.moveTo(s.panelId, t, { refocus: !1 })) : b(s.panelId);
2145
+ }
2146
+ function b(e) {
2147
+ if (f.value) {
2148
+ if (v === null || s.cache.hostOf(e) !== v) {
2149
+ v = null;
2150
+ return;
2151
+ }
2152
+ v = null, s.cache.moveTo(e, null, { refocus: !1 });
2153
+ }
2154
+ }
2155
+ return H(() => s.panelId, (e, t) => {
2156
+ t !== void 0 && b(t);
2157
+ }), S(() => b(s.panelId)), (n, i) => (T(), r(t, { to: "body" }, [o("div", {
2158
+ class: "vdd-taskbar-item-tooltip",
2159
+ "data-vdd-preview": "",
2160
+ dir: z(l).state.dir,
2161
+ style: x({
2162
+ position: "fixed",
2163
+ left: `${e.anchor.left + e.anchor.width / 2}px`,
2164
+ top: `${e.anchor.top - 8}px`,
2165
+ transform: "translateX(-50%) translateY(-100%)"
2166
+ }),
2167
+ onClick: i[1] ||= (e) => c("restore"),
2168
+ onPointerenter: i[2] ||= (e) => c("keep"),
2169
+ onPointerleave: i[3] ||= (e) => c("dismiss")
2170
+ }, [o("div", Zt, [o("span", Qt, I(z(l).format(u.value?.title)) + I(u.value?.dirty ? " *" : ""), 1), o("span", {
2171
+ class: "vdd-tooltip-close-x",
2172
+ "data-vdd-preview-close": e.panelId,
2173
+ title: z(l).format(z(l).messages.closePanel),
2174
+ onClick: i[0] ||= W((e) => c("close"), ["stop"])
2175
+ }, [...i[4] ||= [o("svg", {
2176
+ width: "12",
2177
+ height: "12",
2178
+ viewBox: "0 0 24 24",
2179
+ fill: "none",
2180
+ stroke: "currentColor",
2181
+ "stroke-width": "2.5"
2182
+ }, [o("path", { d: "M18 6L6 18M6 6l12 12" })], -1)]], 8, $t)]), o("div", {
2183
+ class: "vdd-taskbar-item-preview-frame",
2184
+ style: x(h.value)
2185
+ }, [f.value ? (T(), a("div", {
2186
+ key: 0,
2187
+ ref: y,
2188
+ class: "vdd-taskbar-item-preview-host",
2189
+ style: x(g.value)
2190
+ }, null, 4)) : (T(), a("div", en, I(_.value), 1))], 4)], 44, Xt)]));
2191
+ }
2192
+ }), an = ["data-vdd-taskbar-mode"], on = {
2193
+ key: 0,
2194
+ class: "vdd-taskbar-peek-handle",
2195
+ "data-vdd-peek": ""
2196
+ }, sn = ["aria-label"], cn = [
2197
+ "data-vdd-taskbar-item",
2198
+ "title",
2199
+ "onClick",
2200
+ "onContextmenu",
2201
+ "onPointerdown",
2202
+ "onPointerenter"
2203
+ ], ln = { class: "vdd-taskbar-item-icon" }, un = {
2204
+ key: 1,
2205
+ width: "14",
2206
+ height: "14",
2207
+ viewBox: "0 0 24 24",
2208
+ fill: "none",
2209
+ stroke: "currentColor",
2210
+ "stroke-width": "2"
2211
+ }, dn = ["aria-label"], fn = 4, pn = 400, mn = 2e3, hn = /* @__PURE__ */ u({
2212
+ __name: "VddTaskbar",
2213
+ props: {
2214
+ visibility: { default: "always" },
2215
+ cache: {},
2216
+ defaultIcon: {}
2217
+ },
2218
+ emits: ["contextMenu"],
2219
+ setup(t, { emit: s }) {
2220
+ let c = t, l = s, u = J(), d = F(null), f = k(!1), p = k(null), m, h, g = n(() => u.state.minimized.map((e) => ({
2221
+ ...e,
2222
+ options: u.registry.get(e.component)?.defaultOptions ?? {}
2223
+ }))), _ = n(() => c.visibility === "always" || g.value.length > 0), v = n(() => g.value.length > fn);
2224
+ function b(e) {
2225
+ d.value?.scrollBy({
2226
+ left: e * 150,
2227
+ behavior: "smooth"
2228
+ });
2229
+ }
2230
+ let x = () => {
2231
+ clearTimeout(m), f.value = !0;
2232
+ }, C = () => {
2233
+ clearTimeout(m), m = setTimeout(() => {
2234
+ f.value = !1;
2235
+ }, pn);
2236
+ };
2237
+ H(() => u.state.minimized.length, (e, t) => {
2238
+ c.visibility !== "autohide" || e <= (t ?? 0) || (x(), m = setTimeout(() => {
2239
+ f.value = !1;
2240
+ }, mn));
2241
+ });
2242
+ let w = (e) => {
2243
+ let t = e.getBoundingClientRect();
2244
+ return {
2245
+ left: t.left,
2246
+ top: t.top,
2247
+ width: t.width
2248
+ };
2249
+ };
2250
+ function E(e, t, n = !1) {
2251
+ clearTimeout(h), p.value = {
2252
+ id: e,
2253
+ anchor: w(t),
2254
+ fromTouch: n
2255
+ };
2256
+ }
2257
+ let D = () => {
2258
+ clearTimeout(h), h = setTimeout(() => {
2259
+ p.value = null;
2260
+ }, 150);
2261
+ }, O = () => clearTimeout(h);
2262
+ function j(e, t) {
2263
+ if (t.pointerType === "touch") return;
2264
+ let n = t.currentTarget, r = n.getBoundingClientRect();
2265
+ t.clientX < r.left || t.clientX > r.right || t.clientY < r.top || t.clientY > r.bottom || E(e, n, !1);
2266
+ }
2267
+ function M(e) {
2268
+ p.value = null, u.restorePanel(e);
2269
+ }
2270
+ function P(e, t) {
2271
+ p.value?.fromTouch || M(e);
2272
+ }
2273
+ function I(e, t) {
2274
+ if (t.pointerType !== "touch") return;
2275
+ let n = t.currentTarget, r = t.clientX, i = t.clientY, a = !1, o = () => {
2276
+ clearTimeout(u), n.removeEventListener("pointermove", s), n.removeEventListener("pointerup", c), n.removeEventListener("pointercancel", o);
2277
+ }, s = (e) => {
2278
+ Math.hypot(e.clientX - r, e.clientY - i) > 8 && (a = !0, o());
2279
+ }, c = () => {
2280
+ o(), !a && (p.value?.id === e ? M(e) : E(e, n, !0));
2281
+ }, u = setTimeout(() => {
2282
+ a || (o(), navigator.vibrate?.(10), l("contextMenu", e, t));
2283
+ }, 300);
2284
+ n.addEventListener("pointermove", s), n.addEventListener("pointerup", c), n.addEventListener("pointercancel", o);
2285
+ }
2286
+ return H(() => u.state.minimized.map((e) => e.id).join(","), (e) => {
2287
+ p.value && !e.split(",").includes(p.value.id) && (p.value = null);
2288
+ }), S(() => {
2289
+ clearTimeout(m), clearTimeout(h);
2290
+ }), (n, s) => _.value ? (T(), a("div", {
2291
+ key: 0,
2292
+ class: y(["vdd-taskbar-footer-container", [`vdd-taskbar-mode-${t.visibility}`, { "vdd-taskbar-expanded": t.visibility === "autohide" && f.value }]]),
2293
+ "data-vdd-taskbar": "",
2294
+ "data-vdd-taskbar-mode": t.visibility,
2295
+ onPointerenter: s[7] ||= (e) => t.visibility === "autohide" && x(),
2296
+ onPointerleave: s[8] ||= (e) => t.visibility === "autohide" && C()
2297
+ }, [
2298
+ t.visibility === "autohide" ? (T(), a("div", on)) : i("", !0),
2299
+ v.value ? (T(), a("button", {
2300
+ key: 1,
2301
+ type: "button",
2302
+ class: "vdd-taskbar-nav-btn",
2303
+ "data-vdd-taskbar-scroll": "left",
2304
+ "aria-label": z(u).format(z(u).messages.scrollTabsLeft),
2305
+ onClick: s[0] ||= (e) => b(-1)
2306
+ }, "◀", 8, sn)) : i("", !0),
2307
+ o("div", {
2308
+ ref_key: "strip",
2309
+ ref: d,
2310
+ class: "vdd-taskbar-items-container"
2311
+ }, [(T(!0), a(e, null, A(g.value, (e) => (T(), a("div", {
2312
+ key: e.id,
2313
+ class: "vdd-taskbar-glassmorphic-item",
2314
+ "data-vdd-taskbar-item": e.id,
2315
+ role: "button",
2316
+ title: z(u).format(e.title),
2317
+ onClick: (t) => P(e.id, t),
2318
+ onContextmenu: W((t) => l("contextMenu", e.id, t), ["prevent"]),
2319
+ onPointerdown: (t) => I(e.id, t),
2320
+ onPointerenter: (t) => j(e.id, t),
2321
+ onPointerleave: s[1] ||= (e) => D()
2322
+ }, [o("span", ln, [e.options.icon ?? t.defaultIcon ? (T(), r(N(e.options.icon ?? t.defaultIcon), { key: 0 })) : (T(), a("svg", un, [...s[9] ||= [
2323
+ o("rect", {
2324
+ x: "3",
2325
+ y: "3",
2326
+ width: "7",
2327
+ height: "9",
2328
+ rx: "1"
2329
+ }, null, -1),
2330
+ o("rect", {
2331
+ x: "14",
2332
+ y: "3",
2333
+ width: "7",
2334
+ height: "5",
2335
+ rx: "1"
2336
+ }, null, -1),
2337
+ o("rect", {
2338
+ x: "14",
2339
+ y: "12",
2340
+ width: "7",
2341
+ height: "9",
2342
+ rx: "1"
2343
+ }, null, -1),
2344
+ o("rect", {
2345
+ x: "3",
2346
+ y: "16",
2347
+ width: "7",
2348
+ height: "5",
2349
+ rx: "1"
2350
+ }, null, -1)
2351
+ ]]))])], 40, cn))), 128))], 512),
2352
+ v.value ? (T(), a("button", {
2353
+ key: 2,
2354
+ type: "button",
2355
+ class: "vdd-taskbar-nav-btn",
2356
+ "data-vdd-taskbar-scroll": "right",
2357
+ "aria-label": z(u).format(z(u).messages.scrollTabsRight),
2358
+ onClick: s[2] ||= (e) => b(1)
2359
+ }, "▶", 8, dn)) : i("", !0),
2360
+ p.value ? (T(), r(rn, {
2361
+ key: p.value.id,
2362
+ "panel-id": p.value.id,
2363
+ anchor: p.value.anchor,
2364
+ cache: t.cache,
2365
+ onKeep: s[3] ||= (e) => O(),
2366
+ onRestore: s[4] ||= (e) => M(p.value.id),
2367
+ onClose: s[5] ||= (e) => {
2368
+ z(u).requestClosePanel(p.value.id), p.value = null;
2369
+ },
2370
+ onDismiss: s[6] ||= (e) => D()
2371
+ }, null, 8, [
2372
+ "panel-id",
2373
+ "anchor",
2374
+ "cache"
2375
+ ])) : i("", !0)
2376
+ ], 42, an)) : i("", !0);
2377
+ }
2378
+ }), gn = ["data-vdd-skin", "dir"], _n = {
2379
+ class: "vdd-panel-port",
2380
+ "aria-hidden": "true"
2381
+ }, vn = /* @__PURE__ */ u({
2382
+ __name: "VddDesktop",
2383
+ props: {
2384
+ skin: { default: "vscode" },
2385
+ animations: {
2386
+ type: Boolean,
2387
+ default: !0
2388
+ },
2389
+ taskbar: { default: "always" },
2390
+ defaultPanelIcon: {}
2391
+ },
2392
+ emits: ["taskbarContextMenu"],
2393
+ setup(t, { emit: s }) {
2394
+ let c = t, u = s, d = J(), f = new Je();
2395
+ Xe(f);
2396
+ let p = et(d), m = n(() => Object.keys(d.state.panels));
2397
+ H(m, (e, t) => {
2398
+ for (let n of t ?? []) e.includes(n) || f.release(n);
2399
+ }), C(() => {
2400
+ if (process.env.NODE_ENV !== "production") try {
2401
+ getComputedStyle(document.documentElement).getPropertyValue("--vdd-styles-loaded").trim() !== "1" && console.error("[vue-dockable-desktop] the stylesheet is not imported.\nAdd this to your entry file (main.ts):\n import 'vue-dockable-desktop/styles.css'\nWithout it the workspace renders as a black rectangle, with no other error.");
2402
+ } catch {}
2403
+ });
2404
+ let h = V("viewport"), g = k({
2405
+ width: 1024,
2406
+ height: 768
2407
+ }), _ = null, v = !1;
2408
+ H(h, (e) => {
2409
+ _?.disconnect(), !(!e || typeof ResizeObserver > "u") && (_ = new ResizeObserver((t) => {
2410
+ let n = t[0]?.contentRect;
2411
+ if (n && (g.value = {
2412
+ width: Math.max(100, n.width),
2413
+ height: Math.max(100, n.height)
2414
+ }, process.env.NODE_ENV !== "production" && n.height < 10 && !v)) {
2415
+ v = !0;
2416
+ let t = e, n = e.parentElement;
2417
+ for (; n && n !== document.documentElement && n.getBoundingClientRect().height < 10;) t = n, n = n.parentElement;
2418
+ let r = t === e ? "the workspace element itself" : `<${t.tagName.toLowerCase()}${t.id ? ` id="${t.id}"` : ""}${t.className ? ` class="${t.className}"` : ""}>`;
2419
+ console.warn(`[vue-dockable-desktop] The workspace has no height, so it is invisible.\n\nZero height starts at: ${r}\n\nIn CSS, height: 100% only resolves when every ancestor has a real height. If any one of them is height: auto (a div's default), the chain breaks.\n\nGive the workspace's container a height — 100vh, or flex: 1 with min-height: 0 inside a flex column. The library deliberately does not style your page; .vdd-fill-viewport is available if you want the simple case.`);
2420
+ }
2421
+ }), _.observe(e));
2422
+ }, {
2423
+ immediate: !0,
2424
+ flush: "post"
2425
+ }), H([g, () => d.state.floating], ([e, t]) => {
2426
+ for (let n of t) {
2427
+ let t = (e) => typeof e == "number" ? e : Number.parseFloat(String(e)), r = {
2428
+ x: t(n.x),
2429
+ y: t(n.y),
2430
+ width: t(n.width),
2431
+ height: t(n.height)
2432
+ }, i = Ge(r, e, n.anchor != null);
2433
+ i !== r && d.updateFloatingPosition(n.id, i);
2434
+ }
2435
+ }, { deep: !0 });
2436
+ function b(e, t) {
2437
+ let n = d.state.panels[e];
2438
+ if (n) {
2439
+ let r = d.registry.get(n.component)?.defaultOptions ?? {}, i = rt(d, e, r, {
2440
+ float: () => d.floatPanel(e),
2441
+ minimize: () => d.minimizePanel(e),
2442
+ close: () => d.requestClosePanel(e),
2443
+ restore: () => d.restorePanel(e),
2444
+ maximize: () => d.maximizePanel(e)
2445
+ });
2446
+ i.length > 0 && d.showContextMenu({
2447
+ event: t,
2448
+ items: i
2449
+ });
2450
+ }
2451
+ u("taskbarContextMenu", e, t);
2452
+ }
2453
+ let x = () => {
2454
+ let e = document.documentElement;
2455
+ e.setAttribute("data-vdd-skin", c.skin), e.classList.toggle("vdd-no-animations", c.animations === !1), e.style.setProperty("--vdd-z-base", String(d.config.zIndexBase));
2456
+ };
2457
+ return H(() => [
2458
+ c.skin,
2459
+ c.animations,
2460
+ d.config.zIndexBase
2461
+ ], x), C(x), S(() => {
2462
+ _?.disconnect();
2463
+ let e = document.documentElement;
2464
+ e.removeAttribute("data-vdd-skin"), e.classList.remove("vdd-no-animations"), e.style.removeProperty("--vdd-z-base"), f.dispose();
2465
+ }), (n, s) => (T(), a("div", {
2466
+ class: y(["vdd-workspace", { "vdd-no-animations": t.animations === !1 }]),
2467
+ "data-vdd-skin": t.skin,
2468
+ dir: z(d).state.dir
2469
+ }, [
2470
+ o("div", {
2471
+ ref_key: "viewport",
2472
+ ref: g,
2473
+ class: "vdd-workspace-viewport"
2474
+ }, [
2475
+ z(p).dragging.value ? (T(), r(Jt, { key: 0 })) : i("", !0),
2476
+ l(Tt, {
2477
+ node: z(d).state.gridRoot,
2478
+ path: []
2479
+ }, null, 8, ["node"]),
2480
+ (T(!0), a(e, null, A(z(d).state.floating, (e) => (T(), r(Gt, {
2481
+ key: e.id,
2482
+ window: e,
2483
+ viewport: g.value
2484
+ }, null, 8, ["window", "viewport"]))), 128))
2485
+ ], 512),
2486
+ l(hn, {
2487
+ visibility: t.taskbar,
2488
+ cache: z(f),
2489
+ "default-icon": t.defaultPanelIcon,
2490
+ onContextMenu: b
2491
+ }, null, 8, [
2492
+ "visibility",
2493
+ "cache",
2494
+ "default-icon"
2495
+ ]),
2496
+ l(Yt),
2497
+ o("div", _n, [(T(!0), a(e, null, A(m.value, (e) => (T(), r(Mt, {
2498
+ key: e,
2499
+ "panel-id": e,
2500
+ cache: z(f)
2501
+ }, null, 8, ["panel-id", "cache"]))), 128))])
2502
+ ], 10, gn));
2503
+ }
2504
+ }), yn = ["dir"], bn = {
2505
+ key: 0,
2506
+ class: "vdd-context-menu__separator",
2507
+ role: "separator"
2508
+ }, xn = [
2509
+ "title",
2510
+ "data-vdd-menu-submenu",
2511
+ "aria-expanded",
2512
+ "onPointerenter",
2513
+ "onPointerleave"
2514
+ ], Sn = { class: "vdd-context-menu__label" }, Cn = [
2515
+ "disabled",
2516
+ "title",
2517
+ "data-cy-action",
2518
+ "data-vdd-menu-item",
2519
+ "aria-checked",
2520
+ "onClick",
2521
+ "onPointerenter",
2522
+ "onPointerleave"
2523
+ ], wn = ["aria-hidden"], Tn = { class: "vdd-context-menu__label" }, En = {
2524
+ width: "12",
2525
+ height: "12",
2526
+ viewBox: "0 0 12 12",
2527
+ fill: "none"
2528
+ }, Dn = ["fill"], On = {
2529
+ key: 0,
2530
+ d: "M2.5 6 L4.5 8.5 L9.5 3.5",
2531
+ stroke: "white",
2532
+ "stroke-width": "1.5",
2533
+ "stroke-linecap": "round",
2534
+ "stroke-linejoin": "round"
2535
+ }, kn = ["dir"], An = {
2536
+ key: 0,
2537
+ class: "vdd-context-menu__separator",
2538
+ role: "separator"
2539
+ }, jn = [
2540
+ "disabled",
2541
+ "data-vdd-menu-item",
2542
+ "onClick"
2543
+ ], Mn = ["aria-hidden"], Nn = { class: "vdd-context-menu__label" }, Pn = 150, Fn = 200, In = /* @__PURE__ */ u({
2544
+ __name: "VddContextMenu",
2545
+ props: { theme: { default: "dark" } },
2546
+ setup(s) {
2547
+ let c = J(), l = V("root"), u = V("submenuRoot"), d = n(() => c.contextMenu.value), f = k({
2548
+ x: 0,
2549
+ y: 0
2550
+ }), p = k(null), m = k({
2551
+ x: 0,
2552
+ y: 0
2553
+ }), h = /* @__PURE__ */ new Map(), g, _, b = () => {
2554
+ clearTimeout(g), clearTimeout(_);
2555
+ };
2556
+ function C() {
2557
+ b(), p.value = null, c.closeContextMenu();
2558
+ }
2559
+ H(d, async (e) => {
2560
+ if (!e) {
2561
+ p.value = null;
2562
+ return;
2563
+ }
2564
+ f.value = {
2565
+ x: e.x,
2566
+ y: e.y
2567
+ }, h.clear(), p.value = null, await v();
2568
+ let t = l.value;
2569
+ if (!t) return;
2570
+ let n = t.getBoundingClientRect();
2571
+ f.value = ke({
2572
+ x: e.x,
2573
+ y: e.y
2574
+ }, {
2575
+ width: n.width,
2576
+ height: n.height
2577
+ }, {
2578
+ width: window.innerWidth,
2579
+ height: window.innerHeight
2580
+ });
2581
+ }), H(d, (e) => {
2582
+ e ? (document.addEventListener("pointerdown", w, { capture: !0 }), window.addEventListener("click", w), document.addEventListener("keydown", E)) : (document.removeEventListener("pointerdown", w, { capture: !0 }), window.removeEventListener("click", w), document.removeEventListener("keydown", E));
2583
+ });
2584
+ function w(e) {
2585
+ let t = e.target;
2586
+ if (!(t instanceof Node)) {
2587
+ C();
2588
+ return;
2589
+ }
2590
+ l.value?.contains(t) || u.value?.contains(t) || C();
2591
+ }
2592
+ function E(e) {
2593
+ e.key === "Escape" && (e.stopPropagation(), C());
2594
+ }
2595
+ S(() => {
2596
+ b(), document.removeEventListener("pointerdown", w, { capture: !0 }), window.removeEventListener("click", w), document.removeEventListener("keydown", E);
2597
+ });
2598
+ let D = (e) => e, O = (e) => {
2599
+ let t = D(e).checkbox;
2600
+ return !!t && t.active !== !1;
2601
+ }, M = (e) => O(e) && D(e).checkbox.value === !0, P = (e) => D(e).disabled === !0 || O(e) && D(e).checkbox.enabled === !1;
2602
+ function F(e, t) {
2603
+ let n = t;
2604
+ n ? h.set(e, n) : h.delete(e);
2605
+ }
2606
+ function L(e) {
2607
+ P(e) || (D(e).action?.(), C());
2608
+ }
2609
+ function R(e, t) {
2610
+ clearTimeout(_), p.value !== null && p.value !== e && (clearTimeout(g), p.value = null), De(t) && t.items?.length ? (clearTimeout(g), g = setTimeout(() => {
2611
+ let t = h.get(e);
2612
+ if (t) {
2613
+ let e = t.getBoundingClientRect();
2614
+ m.value = c.state.isRtl ? {
2615
+ x: window.innerWidth - e.left + 2,
2616
+ y: e.top
2617
+ } : {
2618
+ x: e.right + 2,
2619
+ y: e.top
2620
+ };
2621
+ }
2622
+ p.value = e;
2623
+ }, Pn)) : (clearTimeout(g), p.value !== null && (_ = setTimeout(() => {
2624
+ p.value = null;
2625
+ }, Fn)));
2626
+ }
2627
+ function B(e) {
2628
+ clearTimeout(g), De(e) && e.items?.length && (_ = setTimeout(() => {
2629
+ p.value = null;
2630
+ }, Fn));
2631
+ }
2632
+ let ee = n(() => {
2633
+ let e = p.value;
2634
+ if (e === null || !d.value) return [];
2635
+ let t = d.value.items[e];
2636
+ return t && De(t) ? t.items ?? [] : [];
2637
+ }), te = n(() => c.state.isRtl ? {
2638
+ position: "fixed",
2639
+ right: `${m.value.x}px`,
2640
+ top: `${m.value.y}px`
2641
+ } : {
2642
+ position: "fixed",
2643
+ left: `${m.value.x}px`,
2644
+ top: `${m.value.y}px`
2645
+ });
2646
+ return (n, m) => d.value ? (T(), r(t, {
2647
+ key: 0,
2648
+ to: "body"
2649
+ }, [n.$slots.default ? j(n.$slots, "default", {
2650
+ items: d.value.items,
2651
+ x: f.value.x,
2652
+ y: f.value.y,
2653
+ close: () => z(c).closeContextMenu()
2654
+ }, void 0, void 0, 0) : (T(), a("div", {
2655
+ key: 1,
2656
+ ref_key: "root",
2657
+ ref: l,
2658
+ class: y(["vdd-context-menu", `vdd-context-menu--${s.theme}`]),
2659
+ style: x({
2660
+ position: "fixed",
2661
+ left: `${f.value.x}px`,
2662
+ top: `${f.value.y}px`
2663
+ }),
2664
+ dir: z(c).state.dir,
2665
+ "data-vdd-menu": "",
2666
+ role: "menu",
2667
+ "aria-orientation": "vertical"
2668
+ }, [(T(!0), a(e, null, A(d.value.items, (t, n) => (T(), a(e, { key: n }, [z(Ee)(t) ? (T(), a("hr", bn)) : z(De)(t) ? (T(), a("button", {
2669
+ key: 1,
2670
+ ref_for: !0,
2671
+ ref: (e) => F(n, e),
2672
+ type: "button",
2673
+ class: y(["vdd-context-menu__item vdd-context-menu__item--has-submenu", { "vdd-context-menu__item--submenu-open": p.value === n }]),
2674
+ title: t.title ? z(c).format(t.title) : void 0,
2675
+ "data-vdd-menu-submenu": z(c).format(t.label),
2676
+ role: "menuitem",
2677
+ "aria-haspopup": "true",
2678
+ "aria-expanded": p.value === n,
2679
+ onPointerenter: (e) => R(n, t),
2680
+ onPointerleave: (e) => B(t)
2681
+ }, [
2682
+ m[2] ||= o("span", {
2683
+ class: "vdd-context-menu__icon",
2684
+ "aria-hidden": "true"
2685
+ }, null, -1),
2686
+ o("span", Sn, I(z(c).format(t.label)), 1),
2687
+ m[3] ||= o("span", {
2688
+ class: "vdd-context-menu__chevron",
2689
+ "aria-hidden": "true"
2690
+ }, "›", -1)
2691
+ ], 42, xn)) : (T(), a("button", {
2692
+ key: 2,
2693
+ ref_for: !0,
2694
+ ref: (e) => F(n, e),
2695
+ type: "button",
2696
+ class: y(["vdd-context-menu__item", { "vdd-context-menu__item--disabled": P(t) }]),
2697
+ disabled: P(t),
2698
+ title: D(t).title ? z(c).format(D(t).title) : void 0,
2699
+ "data-cy-action": D(t).cyAction,
2700
+ "data-vdd-menu-item": z(c).format(D(t).label),
2701
+ role: "menuitem",
2702
+ "aria-checked": O(t) ? M(t) : void 0,
2703
+ onClick: (e) => L(t),
2704
+ onPointerenter: (e) => R(n, t),
2705
+ onPointerleave: (e) => B(t)
2706
+ }, [
2707
+ o("span", {
2708
+ class: "vdd-context-menu__icon",
2709
+ "aria-hidden": !D(t).icon
2710
+ }, [D(t).icon ? (T(), r(N(D(t).icon), { key: 0 })) : i("", !0)], 8, wn),
2711
+ o("span", Tn, I(z(c).format(D(t).label)), 1),
2712
+ O(t) ? (T(), a("span", {
2713
+ key: 0,
2714
+ class: y(["vdd-context-menu__checkbox", { "vdd-context-menu__checkbox--checked": M(t) }]),
2715
+ "aria-hidden": "true"
2716
+ }, [(T(), a("svg", En, [o("rect", {
2717
+ x: "0.75",
2718
+ y: "0.75",
2719
+ width: "10.5",
2720
+ height: "10.5",
2721
+ rx: "2",
2722
+ fill: M(t) ? "currentColor" : "none",
2723
+ stroke: "currentColor",
2724
+ "stroke-width": "1.5"
2725
+ }, null, 8, Dn), M(t) ? (T(), a("path", On)) : i("", !0)]))], 2)) : i("", !0)
2726
+ ], 42, Cn))], 64))), 128))], 14, yn)), p.value !== null && ee.value.length ? (T(), a("div", {
2727
+ key: 2,
2728
+ ref_key: "submenuRoot",
2729
+ ref: u,
2730
+ class: y(["vdd-context-menu vdd-context-menu--submenu", `vdd-context-menu--${s.theme}`]),
2731
+ style: x(te.value),
2732
+ dir: z(c).state.dir,
2733
+ "data-vdd-submenu": "",
2734
+ role: "menu",
2735
+ onPointerenter: m[0] ||= (e) => b(),
2736
+ onPointerleave: m[1] ||= (e) => p.value = null
2737
+ }, [(T(!0), a(e, null, A(ee.value, (t, n) => (T(), a(e, { key: n }, [z(Ee)(t) ? (T(), a("hr", An)) : (T(), a("button", {
2738
+ key: 1,
2739
+ type: "button",
2740
+ class: y(["vdd-context-menu__item", { "vdd-context-menu__item--disabled": P(t) }]),
2741
+ disabled: P(t),
2742
+ "data-vdd-menu-item": z(c).format(D(t).label),
2743
+ role: "menuitem",
2744
+ onClick: (e) => L(t)
2745
+ }, [o("span", {
2746
+ class: "vdd-context-menu__icon",
2747
+ "aria-hidden": !D(t).icon
2748
+ }, [D(t).icon ? (T(), r(N(D(t).icon), { key: 0 })) : i("", !0)], 8, Mn), o("span", Nn, I(z(c).format(D(t).label)), 1)], 10, jn))], 64))), 128))], 46, kn)) : i("", !0)])) : i("", !0);
2749
+ }
2750
+ }), Ln = (e) => "custom" in e && e.custom === !0, Rn = (e) => !Ln(e) && !("onClick" in e), zn = (e) => !Ln(e) && "onClick" in e, Bn = (e) => e == null ? [] : Array.isArray(e) ? e : [e], Vn = Symbol("vdd-sidebar"), Hn = Symbol("vdd-sidebar-tab"), Un = {
2751
+ key: 0,
2752
+ class: "vdd-sidebar-tabs-list"
2753
+ }, Wn = [
2754
+ "title",
2755
+ "aria-pressed",
2756
+ "data-vdd-sidebar-tab",
2757
+ "onClick"
2758
+ ], Gn = [
2759
+ "disabled",
2760
+ "title",
2761
+ "aria-label",
2762
+ "data-vdd-rail-action",
2763
+ "onClick"
2764
+ ], Kn = [
2765
+ "title",
2766
+ "aria-pressed",
2767
+ "data-vdd-sidebar-tab",
2768
+ "onClick"
2769
+ ], qn = 56, Jn = /* @__PURE__ */ u({
2770
+ __name: "VddSidebarRail",
2771
+ props: {
2772
+ tabs: {},
2773
+ header: {},
2774
+ footer: {},
2775
+ activeTabId: {},
2776
+ position: {},
2777
+ visible: { type: Boolean }
2778
+ },
2779
+ emits: ["select"],
2780
+ setup(t, { emit: n }) {
2781
+ let s = n, c = (e) => e.filter((e) => !e.hidden);
2782
+ return (n, l) => (T(), a("div", {
2783
+ class: "vdd-sidebar-strip-outer",
2784
+ style: x({ width: t.visible ? `${qn}px` : "0px" }),
2785
+ "data-vdd-sidebar-strip": ""
2786
+ }, [o("div", {
2787
+ class: y(["vdd-sidebar-tabs-strip", [`vdd-${t.position}`, {
2788
+ "vdd-sidebar-tabs-strip--has-header-action": t.header.length > 0,
2789
+ "vdd-sidebar-tabs-strip--has-footer-action": t.footer.length > 0
2790
+ }]]),
2791
+ style: x({ width: `${qn}px` })
2792
+ }, [(T(), a(e, null, A([
2793
+ "header",
2794
+ "tabs",
2795
+ "footer"
2796
+ ], (n) => (T(), a(e, { key: n }, [n === "tabs" ? (T(), a("div", Un, [(T(!0), a(e, null, A(c(t.tabs), (e) => (T(), a("button", {
2797
+ key: e.id,
2798
+ type: "button",
2799
+ class: y(["vdd-sidebar-tab-btn", { "vdd-active": t.activeTabId === e.id }]),
2800
+ title: e.label,
2801
+ "aria-pressed": t.activeTabId === e.id,
2802
+ "data-vdd-sidebar-tab": e.id,
2803
+ onClick: (t) => s("select", e.id)
2804
+ }, [(T(), r(N(e.icon)))], 10, Wn))), 128))])) : (n === "header" ? t.header : t.footer).length ? (T(), a("div", {
2805
+ key: 1,
2806
+ class: y(n === "header" ? "vdd-sidebar-header-area" : "vdd-sidebar-footer-area")
2807
+ }, [(T(!0), a(e, null, A(n === "header" ? t.header : t.footer, (n, o) => (T(), a(e, { key: o }, [z(Ln)(n) ? (T(), r(N(n.component), _({
2808
+ key: 0,
2809
+ ref_for: !0
2810
+ }, n.props), null, 16)) : z(zn)(n) ? (T(), a("button", {
2811
+ key: 1,
2812
+ type: "button",
2813
+ class: "vdd-sidebar-tab-btn vdd-sidebar-header-action-btn",
2814
+ disabled: n.disabled,
2815
+ title: n.label,
2816
+ "aria-label": n.label,
2817
+ "data-vdd-rail-action": n.id ?? n.label,
2818
+ onClick: (e) => n.onClick()
2819
+ }, [(T(), r(N(n.icon)))], 8, Gn)) : n.hidden ? i("", !0) : (T(), a("button", {
2820
+ key: 2,
2821
+ type: "button",
2822
+ class: y(["vdd-sidebar-tab-btn", { "vdd-active": t.activeTabId === n.id }]),
2823
+ title: n.label,
2824
+ "aria-pressed": t.activeTabId === n.id,
2825
+ "data-vdd-sidebar-tab": n.id,
2826
+ onClick: (e) => s("select", n.id)
2827
+ }, [(T(), r(N(n.icon)))], 10, Kn))], 64))), 128))], 2)) : i("", !0)], 64))), 64))], 6)], 4));
2828
+ }
2829
+ }), Yn = /* @__PURE__ */ u({
2830
+ __name: "VddSidebarTabScope",
2831
+ props: { tabId: {} },
2832
+ emits: ["close", "open"],
2833
+ setup(e, { emit: t }) {
2834
+ let n = e, r = t;
2835
+ return E(Hn, {
2836
+ tabId: n.tabId,
2837
+ open: () => r("open", n.tabId),
2838
+ close: () => r("close"),
2839
+ openTab: (e) => r("open", e)
2840
+ }), (e, t) => (T(), a("div", null, [j(e.$slots, "default")]));
2841
+ }
2842
+ }), Xn = ["data-vdd-sidebar-pane"], Zn = {
2843
+ key: 1,
2844
+ class: "vdd-sidebar-drawer-header"
2845
+ }, Qn = { class: "vdd-sidebar-header-title" }, $n = /* @__PURE__ */ u({
2846
+ __name: "VddSidebarDrawer",
2847
+ props: {
2848
+ tabs: {},
2849
+ activeTabId: {},
2850
+ position: {},
2851
+ open: { type: Boolean },
2852
+ width: {},
2853
+ minWidth: {},
2854
+ maxWidth: {},
2855
+ headerOverridden: { type: Boolean },
2856
+ showCloseButton: { type: Boolean },
2857
+ resizing: { type: Boolean }
2858
+ },
2859
+ emits: ["close", "open"],
2860
+ setup(t, { emit: n }) {
2861
+ let s = n;
2862
+ return (n, c) => (T(), a("div", {
2863
+ class: y(["vdd-sidebar-content-drawer", `vdd-${t.position}`]),
2864
+ "data-vdd-sidebar-drawer": "",
2865
+ style: x({
2866
+ flexBasis: t.open ? `${t.width}px` : "0px",
2867
+ minWidth: t.open ? `${t.minWidth}px` : "0px",
2868
+ maxWidth: t.open ? `${t.maxWidth}px` : "0px",
2869
+ ...t.resizing ? { transition: "none" } : {}
2870
+ })
2871
+ }, [(T(!0), a(e, null, A(t.tabs, (e) => (T(), a("div", {
2872
+ key: e.id,
2873
+ class: "vdd-sidebar-drawer-pane",
2874
+ style: x({ display: t.activeTabId === e.id ? "flex" : "none" }),
2875
+ "data-vdd-sidebar-pane": e.id
2876
+ }, [t.headerOverridden ? j(n.$slots, "header", {
2877
+ tab: e,
2878
+ close: () => s("close"),
2879
+ open: () => s("open", e.id)
2880
+ }, void 0, void 0, 0) : (T(), a("div", Zn, [o("span", Qn, I(e.label), 1), t.showCloseButton ? (T(), a("button", {
2881
+ key: 0,
2882
+ type: "button",
2883
+ class: "vdd-sidebar-drawer-close-button",
2884
+ "data-vdd-sidebar-close": "",
2885
+ title: "Close",
2886
+ "aria-label": "Close",
2887
+ onClick: c[0] ||= (e) => s("close")
2888
+ }, [...c[3] ||= [o("svg", {
2889
+ width: "14",
2890
+ height: "14",
2891
+ viewBox: "0 0 24 24",
2892
+ fill: "none",
2893
+ stroke: "currentColor",
2894
+ "stroke-width": "2.5"
2895
+ }, [o("path", { d: "M18 6L6 18M6 6l12 12" })], -1)]])) : i("", !0)])), l(Yn, {
2896
+ class: "vdd-sidebar-drawer-body",
2897
+ "tab-id": e.id,
2898
+ onClose: c[1] ||= (e) => s("close"),
2899
+ onOpen: c[2] ||= (e) => s("open", e)
2900
+ }, {
2901
+ default: U(() => [j(n.$slots, `tab-${e.id}`, {
2902
+ tab: e,
2903
+ close: () => s("close"),
2904
+ open: () => s("open", e.id)
2905
+ }, () => [e.component ? (T(), r(N(e.component), _({
2906
+ key: 0,
2907
+ ref_for: !0
2908
+ }, e.props), null, 16)) : i("", !0)])]),
2909
+ _: 2
2910
+ }, 1032, ["tab-id"])], 12, Xn))), 128))], 6));
2911
+ }
2912
+ }), er = ["data-vdd-sidebar"], tr = {
2913
+ key: 3,
2914
+ class: "vdd-sidebar-main"
2915
+ }, nr = /* @__PURE__ */ u({
2916
+ __name: "VddSidebar",
2917
+ props: /*@__PURE__*/ g({
2918
+ position: { default: "right" },
2919
+ tabs: {},
2920
+ headerAction: {},
2921
+ footerAction: {},
2922
+ minWidth: { default: 150 },
2923
+ maxWidth: { default: 600 },
2924
+ showCloseButton: {
2925
+ type: Boolean,
2926
+ default: !1
2927
+ },
2928
+ hideDefaultHeader: {
2929
+ type: Boolean,
2930
+ default: !1
2931
+ },
2932
+ isSecondary: {
2933
+ type: Boolean,
2934
+ default: !1
2935
+ }
2936
+ }, {
2937
+ activeTabId: { default: null },
2938
+ activeTabIdModifiers: {},
2939
+ visible: {
2940
+ type: Boolean,
2941
+ default: !0
2942
+ },
2943
+ visibleModifiers: {},
2944
+ stripVisible: {
2945
+ type: Boolean,
2946
+ default: !0
2947
+ },
2948
+ stripVisibleModifiers: {},
2949
+ width: { default: 280 },
2950
+ widthModifiers: {}
2951
+ }),
2952
+ emits: [
2953
+ "update:activeTabId",
2954
+ "update:visible",
2955
+ "update:stripVisible",
2956
+ "update:width"
2957
+ ],
2958
+ setup(t) {
2959
+ let o = t, c = ee(), l = B(t, "activeTabId"), u = B(t, "visible"), d = B(t, "stripVisible"), f = B(t, "width"), p = n(() => Bn(o.headerAction)), m = n(() => Bn(o.footerAction)), h = n(() => [
2960
+ ...p.value.filter(Rn),
2961
+ ...o.tabs,
2962
+ ...m.value.filter(Rn)
2963
+ ]), g = k(/* @__PURE__ */ new Set()), v = n(() => {
2964
+ let e = new Set(g.value);
2965
+ l.value && e.add(l.value);
2966
+ for (let t of h.value) t.eagerMount && e.add(t.id);
2967
+ return e;
2968
+ });
2969
+ function y(e) {
2970
+ if (e !== null) {
2971
+ if (!g.value.has(e)) {
2972
+ let t = new Set(g.value);
2973
+ t.add(e), g.value = t;
2974
+ }
2975
+ } else {
2976
+ let e = new Set(g.value), t = !1;
2977
+ for (let n of g.value) {
2978
+ let r = h.value.find((e) => e.id === n);
2979
+ r && !r.eagerMount && !r.preserveState && (e.delete(n), t = !0);
2980
+ }
2981
+ t && (g.value = e);
2982
+ }
2983
+ l.value = e;
2984
+ }
2985
+ H([l, h], ([e, t]) => {
2986
+ e != null && !t.some((t) => t.id === e) && y(null);
2987
+ }, { immediate: !0 });
2988
+ let b = n(() => h.value.filter((e) => v.value.has(e.id))), x = n(() => u.value !== !1), S = n(() => x.value && d.value !== !1), C = n(() => x.value && l.value != null), w = n(() => h.value.find((e) => e.id === l.value) ?? null), D = n(() => o.hideDefaultHeader || c.header !== void 0), O = (e) => y(l.value === e ? null : e), M = () => y(null), N = k(!1);
2989
+ function P(e) {
2990
+ e.preventDefault();
2991
+ let t = e.currentTarget;
2992
+ N.value = !0, Y({
2993
+ element: t,
2994
+ pointerId: e.pointerId,
2995
+ startClientX: e.clientX,
2996
+ startClientY: e.clientY,
2997
+ captureStart: () => f.value,
2998
+ activeClasses: [{
2999
+ el: t,
3000
+ classes: ["vdd-active"]
3001
+ }, {
3002
+ el: document.body,
3003
+ classes: ["vdd-resizing-active", "vdd-resizing-col-active"]
3004
+ }],
3005
+ onMove: (e, t, n) => {
3006
+ let r = o.position === "right" ? n - e : n + e;
3007
+ f.value = Math.max(o.minWidth, Math.min(o.maxWidth, r));
3008
+ },
3009
+ onEnd: () => {
3010
+ N.value = !1;
3011
+ }
3012
+ });
3013
+ }
3014
+ E(Vn, {
3015
+ openTab: (e) => y(e),
3016
+ closeDrawer: M,
3017
+ activeTabId: l,
3018
+ position: o.position,
3019
+ isSecondary: o.isSecondary
3020
+ });
3021
+ let F = process.env.NODE_ENV !== "production", I = !1;
3022
+ H([() => o.showCloseButton, D], ([e, t]) => {
3023
+ F && e && t && !I && (I = !0, console.warn("[vue-dockable-desktop] `showCloseButton` has no effect because the default drawer header is suppressed (`hideDefaultHeader` is set, or a #header slot was provided). The button is part of that header. Put your own close control in the #header slot, wired to its `close`."));
3024
+ }, { immediate: !0 });
3025
+ let L = !1;
3026
+ return H(w, (e) => {
3027
+ F && e && !L && (c[`tab-${e.id}`] || e.component || (L = !0, console.warn(`[vue-dockable-desktop] Sidebar tab "${e.id}" has no content: give it a #tab-${e.id} slot or a \`component\`. The drawer will open empty.`)));
3028
+ }), (n, o) => (T(), a("div", {
3029
+ class: "vdd-sidebar-layout",
3030
+ "data-vdd-sidebar": t.position
3031
+ }, [(T(!0), a(e, null, A(t.position === "left" ? [
3032
+ "rail",
3033
+ "drawer",
3034
+ "resizer",
3035
+ "main"
3036
+ ] : [
3037
+ "main",
3038
+ "resizer",
3039
+ "drawer",
3040
+ "rail"
3041
+ ], (o) => (T(), a(e, { key: o }, [o === "rail" ? (T(), r(Jn, {
3042
+ key: 0,
3043
+ tabs: t.tabs,
3044
+ header: p.value,
3045
+ footer: m.value,
3046
+ "active-tab-id": l.value,
3047
+ position: t.position,
3048
+ visible: S.value,
3049
+ onSelect: O
3050
+ }, null, 8, [
3051
+ "tabs",
3052
+ "header",
3053
+ "footer",
3054
+ "active-tab-id",
3055
+ "position",
3056
+ "visible"
3057
+ ])) : o === "drawer" ? (T(), r($n, {
3058
+ key: 1,
3059
+ tabs: b.value,
3060
+ "active-tab-id": l.value,
3061
+ position: t.position,
3062
+ open: C.value,
3063
+ width: f.value,
3064
+ "min-width": t.minWidth,
3065
+ "max-width": t.maxWidth,
3066
+ "header-overridden": D.value,
3067
+ "show-close-button": t.showCloseButton,
3068
+ resizing: N.value,
3069
+ onClose: M,
3070
+ onOpen: y
3071
+ }, s({ _: 2 }, [n.$slots.header ? {
3072
+ name: "header",
3073
+ fn: U((e) => [j(n.$slots, "header", _({ ref_for: !0 }, e))]),
3074
+ key: "0"
3075
+ } : void 0, A(b.value, (e) => ({
3076
+ name: `tab-${e.id}`,
3077
+ fn: U((t) => [j(n.$slots, `tab-${e.id}`, _({ ref_for: !0 }, t))])
3078
+ }))]), 1032, [
3079
+ "tabs",
3080
+ "active-tab-id",
3081
+ "position",
3082
+ "open",
3083
+ "width",
3084
+ "min-width",
3085
+ "max-width",
3086
+ "header-overridden",
3087
+ "show-close-button",
3088
+ "resizing"
3089
+ ])) : o === "resizer" && C.value ? (T(), a("div", {
3090
+ key: 2,
3091
+ class: "vdd-resizer-bar",
3092
+ "data-vdd-sidebar-resizer": "",
3093
+ style: {
3094
+ cursor: "col-resize",
3095
+ width: "1px",
3096
+ height: "100%",
3097
+ flexShrink: 0,
3098
+ zIndex: 20
3099
+ },
3100
+ onPointerdown: P
3101
+ }, null, 32)) : o === "main" ? (T(), a("div", tr, [j(n.$slots, "default")])) : i("", !0)], 64))), 128))], 8, er));
3102
+ }
3103
+ }), rr = /* @__PURE__ */ u({
3104
+ __name: "VddSecondarySidebar",
3105
+ props: {
3106
+ tabs: {},
3107
+ headerAction: {},
3108
+ footerAction: {},
3109
+ minWidth: {},
3110
+ maxWidth: {},
3111
+ showCloseButton: { type: Boolean },
3112
+ hideDefaultHeader: { type: Boolean }
3113
+ },
3114
+ setup(e) {
3115
+ let t = e, i = p(Vn, null);
3116
+ if (!i) throw Error("[vue-dockable-desktop] <VddSecondarySidebar> must be rendered inside a <VddSidebar>. It takes the edge the primary sidebar is not using, so it needs one to be nested in.");
3117
+ if (i.isSecondary) throw Error("[vue-dockable-desktop] <VddSecondarySidebar> cannot be nested inside another one. The library supports one primary and one secondary sidebar, nothing deeper.");
3118
+ let a = n(() => i.position === "left" ? "right" : "left");
3119
+ return (e, n) => (T(), r(nr, _({
3120
+ ...t,
3121
+ ...e.$attrs
3122
+ }, {
3123
+ position: a.value,
3124
+ "is-secondary": ""
3125
+ }), s({ _: 2 }, [A(e.$slots, (t, n) => ({
3126
+ name: n,
3127
+ fn: U((t) => [j(e.$slots, n, b(f(t ?? {})))])
3128
+ }))]), 1040, ["position"]));
3129
+ }
3130
+ }), ir = (e) => !("type" in e);
3131
+ function ar(e, t, n, r = !1, i = 8) {
3132
+ switch (t) {
3133
+ case "left": return r ? {
3134
+ right: n.width - e.left + i,
3135
+ top: e.top
3136
+ } : {
3137
+ left: e.right + i,
3138
+ top: e.top
3139
+ };
3140
+ case "right": return r ? {
3141
+ left: e.right + i,
3142
+ top: e.top
3143
+ } : {
3144
+ right: n.width - e.left + i,
3145
+ top: e.top
3146
+ };
3147
+ case "top": return r ? {
3148
+ top: e.bottom + i,
3149
+ right: n.width - e.right
3150
+ } : {
3151
+ top: e.bottom + i,
3152
+ left: e.left
3153
+ };
3154
+ default: return r ? {
3155
+ bottom: n.height - e.top + i,
3156
+ right: n.width - e.right
3157
+ } : {
3158
+ bottom: n.height - e.top + i,
3159
+ left: e.left
3160
+ };
3161
+ }
3162
+ }
3163
+ //#endregion
3164
+ //#region src/components/VddToolbarGroupButton.vue?vue&type=script&setup=true&lang.ts
3165
+ var or = [
3166
+ "title",
3167
+ "aria-label",
3168
+ "aria-expanded",
3169
+ "disabled",
3170
+ "data-vdd-toolbar-item"
3171
+ ], sr = ["dir", "data-vdd-flyout"], cr = {
3172
+ key: 0,
3173
+ class: "vdd-toolbar-group-flyout-sep",
3174
+ role: "separator"
3175
+ }, lr = [
3176
+ "disabled",
3177
+ "aria-pressed",
3178
+ "data-vdd-flyout-item",
3179
+ "onClick"
3180
+ ], ur = { class: "vdd-toolbar-group-flyout-icon" }, dr = { class: "vdd-toolbar-group-flyout-label" }, fr = {
3181
+ key: 0,
3182
+ class: "vdd-toolbar-group-flyout-shortcut"
3183
+ }, pr = /* @__PURE__ */ u({
3184
+ __name: "VddToolbarGroupButton",
3185
+ props: {
3186
+ item: {},
3187
+ position: {}
3188
+ },
3189
+ setup(s) {
3190
+ let c = s, l = J(), u = V("button"), d = V("flyout"), f = k(!1), p = k({}), m = n(() => c.item.activeItemId !== void 0), h = n(() => m.value ? c.item.activeItemId ?? null : l.toolbar.activeInGroup(c.item.id)), g = n(() => c.item.items.find((e) => ir(e) && e.id === h.value)), _ = n(() => g.value && ir(g.value) ? g.value.icon : c.item.defaultIcon), b = n(() => g.value && ir(g.value) ? g.value.label : c.item.label);
3191
+ async function C() {
3192
+ if (c.item.disabled) return;
3193
+ if (f.value) {
3194
+ f.value = !1;
3195
+ return;
3196
+ }
3197
+ let e = u.value?.getBoundingClientRect();
3198
+ e && (p.value = ar(e, c.position, {
3199
+ width: window.innerWidth,
3200
+ height: window.innerHeight
3201
+ }, l.state.isRtl)), f.value = !0, await v(), E(), document.addEventListener("pointerdown", D, { capture: !0 }), document.addEventListener("keydown", O);
3202
+ }
3203
+ function w() {
3204
+ f.value = !1, document.removeEventListener("pointerdown", D, { capture: !0 }), document.removeEventListener("keydown", O);
3205
+ }
3206
+ function E() {
3207
+ let e = d.value;
3208
+ if (!e) return;
3209
+ let t = e.getBoundingClientRect(), n = { ...p.value };
3210
+ t.right > window.innerWidth - 8 && (n.left = Math.max(8, window.innerWidth - t.width - 8), delete n.right), t.left < 8 && (n.left = 8, delete n.right), t.bottom > window.innerHeight - 8 && (n.top = Math.max(8, window.innerHeight - t.height - 8), delete n.bottom), t.top < 8 && (n.top = 8, delete n.bottom), p.value = n;
3211
+ }
3212
+ function D(e) {
3213
+ let t = e.target;
3214
+ if (!(t instanceof Node)) {
3215
+ w();
3216
+ return;
3217
+ }
3218
+ u.value?.contains(t) || d.value?.contains(t) || w();
3219
+ }
3220
+ function O(e) {
3221
+ e.key === "Escape" && w();
3222
+ }
3223
+ function j(e, t) {
3224
+ m.value ? c.item.onActiveItemChange?.(e) : l.toolbar.setActiveInGroup(c.item.id, e), t?.(e), w();
3225
+ }
3226
+ S(w);
3227
+ let M = n(() => {
3228
+ let e = { position: "fixed" };
3229
+ for (let [t, n] of Object.entries(p.value)) e[t] = `${n}px`;
3230
+ return e;
3231
+ });
3232
+ return (n, c) => (T(), a(e, null, [o("button", {
3233
+ ref_key: "button",
3234
+ ref: u,
3235
+ type: "button",
3236
+ class: y(["vdd-toolbar-btn vdd-toolbar-btn-group", { "vdd-active": h.value !== null }]),
3237
+ title: b.value,
3238
+ "aria-label": b.value,
3239
+ "aria-expanded": f.value,
3240
+ "aria-haspopup": "menu",
3241
+ disabled: s.item.disabled,
3242
+ "data-vdd-toolbar-item": s.item.id,
3243
+ onClick: C
3244
+ }, [(T(), r(N(_.value)))], 10, or), f.value ? (T(), r(t, {
3245
+ key: 0,
3246
+ to: "body"
3247
+ }, [o("div", {
3248
+ ref_key: "flyout",
3249
+ ref: d,
3250
+ class: y(["vdd-toolbar-group-flyout", `vdd-${s.position}`]),
3251
+ style: x(M.value),
3252
+ dir: z(l).state.dir,
3253
+ "data-vdd-flyout": s.item.id,
3254
+ role: "menu"
3255
+ }, [(T(!0), a(e, null, A(s.item.items, (t, n) => (T(), a(e, { key: n }, [z(ir)(t) ? (T(), a("button", {
3256
+ key: 1,
3257
+ type: "button",
3258
+ class: y(["vdd-toolbar-group-flyout-item", { "vdd-active": h.value === t.id }]),
3259
+ disabled: t.disabled,
3260
+ role: "menuitem",
3261
+ "aria-pressed": h.value === t.id,
3262
+ "data-vdd-flyout-item": t.id,
3263
+ onClick: (e) => j(t.id, t.onActivate)
3264
+ }, [
3265
+ o("span", ur, [(T(), r(N(t.icon)))]),
3266
+ o("span", dr, I(t.label), 1),
3267
+ t.shortcut ? (T(), a("span", fr, I(t.shortcut), 1)) : i("", !0)
3268
+ ], 10, lr)) : (T(), a("div", cr))], 64))), 128))], 14, sr)])) : i("", !0)], 64));
3269
+ }
3270
+ }), mr = ["data-vdd-toolbar", "aria-orientation"], hr = {
3271
+ key: 0,
3272
+ class: "vdd-toolbar-separator",
3273
+ role: "separator"
3274
+ }, gr = [
3275
+ "title",
3276
+ "aria-label",
3277
+ "disabled",
3278
+ "data-vdd-toolbar-item",
3279
+ "onClick"
3280
+ ], _r = [
3281
+ "title",
3282
+ "aria-label",
3283
+ "aria-pressed",
3284
+ "disabled",
3285
+ "data-vdd-toolbar-item",
3286
+ "onClick"
3287
+ ], vr = [
3288
+ "title",
3289
+ "aria-label",
3290
+ "aria-pressed",
3291
+ "disabled",
3292
+ "data-vdd-toolbar-item",
3293
+ "onClick"
3294
+ ], yr = /* @__PURE__ */ u({
3295
+ __name: "VddToolbar",
3296
+ props: /*@__PURE__*/ g({
3297
+ position: { default: "left" },
3298
+ items: {}
3299
+ }, {
3300
+ visible: {
3301
+ type: Boolean,
3302
+ default: !0
3303
+ },
3304
+ visibleModifiers: {}
3305
+ }),
3306
+ emits: ["update:visible"],
3307
+ setup(t) {
3308
+ let o = t, s = B(t, "visible"), c = J(), l = n(() => o.position === "left" || o.position === "right"), u = n(() => s.value === !1 ? l.value ? { width: "0px" } : { height: "0px" } : {}), d = (e, t) => c.toolbar.activeInGroup(e) === t;
3309
+ function f(e, t, n) {
3310
+ c.toolbar.setActiveInGroup(e, t), n?.(t);
3311
+ }
3312
+ let p = (e) => e.active === void 0 ? c.toolbar.isToggled(e.id) : e.active;
3313
+ function m(e) {
3314
+ let t = !p(e);
3315
+ e.active === void 0 && c.toolbar.setToggled(e.id, t), e.onToggle?.(t);
3316
+ }
3317
+ return (n, o) => (T(), a("div", {
3318
+ class: y(["vdd-toolbar-strip", `vdd-${t.position}`]),
3319
+ style: x(u.value),
3320
+ "data-vdd-toolbar": t.position,
3321
+ role: "toolbar",
3322
+ "aria-orientation": l.value ? "vertical" : "horizontal"
3323
+ }, [(T(!0), a(e, null, A(t.items, (n, o) => (T(), a(e, { key: n.type === "separator" ? `sep-${o}` : n.id }, [n.type === "separator" ? (T(), a("div", hr)) : n.type === "action" ? (T(), a("button", {
3324
+ key: 1,
3325
+ type: "button",
3326
+ class: "vdd-toolbar-btn vdd-toolbar-btn-action",
3327
+ title: n.label,
3328
+ "aria-label": n.label,
3329
+ disabled: n.disabled,
3330
+ "data-vdd-toolbar-item": n.id,
3331
+ onClick: (e) => n.onClick()
3332
+ }, [(T(), r(N(n.icon)))], 8, gr)) : n.type === "radio" ? (T(), a("button", {
3333
+ key: 2,
3334
+ type: "button",
3335
+ class: y(["vdd-toolbar-btn vdd-toolbar-btn-radio", { "vdd-active": d(n.group, n.id) }]),
3336
+ title: n.label,
3337
+ "aria-label": n.label,
3338
+ "aria-pressed": d(n.group, n.id),
3339
+ disabled: n.disabled,
3340
+ "data-vdd-toolbar-item": n.id,
3341
+ onClick: (e) => f(n.group, n.id, n.onActivate)
3342
+ }, [(T(), r(N(n.icon)))], 10, _r)) : n.type === "toggle" ? (T(), a("button", {
3343
+ key: 3,
3344
+ type: "button",
3345
+ class: y(["vdd-toolbar-btn vdd-toolbar-btn-toggle", { "vdd-active": p(n) }]),
3346
+ title: n.label,
3347
+ "aria-label": n.label,
3348
+ "aria-pressed": p(n),
3349
+ disabled: n.disabled,
3350
+ "data-vdd-toolbar-item": n.id,
3351
+ onClick: (e) => m(n)
3352
+ }, [(T(), r(N(n.icon)))], 10, vr)) : n.type === "group" ? (T(), r(pr, {
3353
+ key: 4,
3354
+ item: n,
3355
+ position: t.position
3356
+ }, null, 8, ["item", "position"])) : i("", !0)], 64))), 128))], 14, mr));
3357
+ }
3358
+ });
3359
+ //#endregion
3360
+ //#region src/composables/useOverlayHost.ts
3361
+ function br(e) {
3362
+ let t = J(), { overlays: r } = t, i = () => R(e), a = k(null), o = n(() => i().kind !== "modal" || i().options.closable !== !1), s = (e) => r.requestClose(i().id, {
3363
+ ...e,
3364
+ confirm: (e) => r.confirmDiscard({
3365
+ title: t.format(e.options.title),
3366
+ dirtyOptions: e.dirtyOptions
3367
+ })
3368
+ });
3369
+ function c(e) {
3370
+ if (e.key !== "Escape" || !o.value) return;
3371
+ let t = i();
3372
+ if (t.kind === "modal") {
3373
+ if (r.topmostModal()?.id !== t.id) return;
3374
+ e.stopPropagation();
3375
+ } else if (r.state.modals.length > 0) return;
3376
+ s();
3377
+ }
3378
+ return C(() => document.addEventListener("keydown", c)), S(() => document.removeEventListener("keydown", c)), Dt({
3379
+ id: i().id,
3380
+ containerType: n(() => i().kind),
3381
+ close: s,
3382
+ setTitle: (e) => r.updateInstance(i().id, { options: {
3383
+ ...i().options,
3384
+ title: e
3385
+ } }),
3386
+ setIcon: (e) => {
3387
+ a.value = e ?? null;
3388
+ },
3389
+ setDirty: (e, t) => r.setDirty(i().id, e, t)
3390
+ }), {
3391
+ displayTitle: n(() => {
3392
+ let e = t.format(i().options.title);
3393
+ return i().dirty ? `${e} *` : e;
3394
+ }),
3395
+ dismissible: o,
3396
+ icon: n(() => a.value ?? i().options.icon ?? null),
3397
+ close: s,
3398
+ bodyPadding: n(() => {
3399
+ let e = i().options.bodyPadding;
3400
+ if (e != null) return typeof e == "number" ? `${e}px` : e;
3401
+ })
3402
+ };
3403
+ }
3404
+ //#endregion
3405
+ //#region src/components/VddOverlayFrame.vue?vue&type=script&setup=true&lang.ts
3406
+ var xr = ["title", "aria-label"], Sr = /* @__PURE__ */ u({
3407
+ __name: "VddOverlayFrame",
3408
+ props: {
3409
+ block: {},
3410
+ title: {},
3411
+ icon: {},
3412
+ closable: { type: Boolean },
3413
+ closeLabel: {},
3414
+ bodyPadding: {}
3415
+ },
3416
+ emits: ["close"],
3417
+ setup(t, { emit: s }) {
3418
+ let c = t, l = s, u = {
3419
+ header: "vdd-modal-header",
3420
+ icon: "vdd-modal-icon",
3421
+ title: "vdd-modal-title",
3422
+ closeButton: "vdd-modal-close-button",
3423
+ body: "vdd-modal-body"
3424
+ }, d = {
3425
+ header: "vdd-side-panel-header",
3426
+ icon: "vdd-side-panel-icon",
3427
+ title: "vdd-side-panel-title",
3428
+ closeButton: "vdd-side-panel-close-button",
3429
+ body: "vdd-side-panel-body"
3430
+ }, f = n(() => c.block === "modal" ? u : d), p = J(), m = n(() => c.block === "modal" ? p.classes.modalBody : p.classes.sidePanelBody);
3431
+ return (n, s) => (T(), a(e, null, [o("div", { class: y(f.value.header) }, [
3432
+ t.icon ? (T(), a("div", {
3433
+ key: 0,
3434
+ class: y(f.value.icon)
3435
+ }, [(T(), r(N(t.icon)))], 2)) : i("", !0),
3436
+ o("h4", { class: y(f.value.title) }, I(t.title), 3),
3437
+ t.closable ? (T(), a("button", {
3438
+ key: 1,
3439
+ type: "button",
3440
+ class: y(f.value.closeButton),
3441
+ title: t.closeLabel,
3442
+ "aria-label": t.closeLabel,
3443
+ "data-vdd-overlay-close": "",
3444
+ onClick: s[0] ||= (e) => l("close")
3445
+ }, [...s[1] ||= [o("svg", {
3446
+ width: "14",
3447
+ height: "14",
3448
+ viewBox: "0 0 24 24",
3449
+ fill: "none",
3450
+ stroke: "currentColor",
3451
+ "stroke-width": "2.5"
3452
+ }, [o("path", { d: "M18 6L6 18M6 6l12 12" })], -1)]], 10, xr)) : i("", !0)
3453
+ ], 2), o("div", {
3454
+ class: y([f.value.body, m.value]),
3455
+ style: x(t.bodyPadding == null ? void 0 : { padding: t.bodyPadding })
3456
+ }, [j(n.$slots, "default")], 6)], 64));
3457
+ }
3458
+ }), Cr = ["dir", "data-vdd-side-panel"], wr = /* @__PURE__ */ u({
3459
+ __name: "VddSidePanelHost",
3460
+ props: {
3461
+ instance: {},
3462
+ position: {},
3463
+ defaultWidth: {}
3464
+ },
3465
+ setup(e) {
3466
+ let t = e, i = J(), { displayTitle: s, icon: c, close: u, bodyPadding: d } = br(() => t.instance), p = n(() => {
3467
+ let e = t.instance.options.width ?? t.defaultWidth;
3468
+ return typeof e == "number" ? `${e}px` : e;
3469
+ });
3470
+ return (t, n) => (T(), a("div", {
3471
+ class: y(["vdd-side-panel vdd-side-panel-visible", e.position === "left" ? "vdd-side-panel-left" : "vdd-side-panel-right"]),
3472
+ style: x({ width: p.value }),
3473
+ dir: z(i).state.dir,
3474
+ "data-vdd-side-panel": e.position
3475
+ }, [o("div", { class: y(["vdd-side-panel-window", z(i).classes.sidePanel]) }, [l(Sr, {
3476
+ block: "side-panel",
3477
+ title: z(s),
3478
+ icon: z(c),
3479
+ closable: !0,
3480
+ "close-label": z(i).format(z(i).messages.closeTooltip),
3481
+ "body-padding": z(d),
3482
+ onClose: n[0] ||= (e) => z(u)()
3483
+ }, {
3484
+ default: U(() => [(T(), r(N(e.instance.component), b(f({
3485
+ ...e.instance.props,
3486
+ panelId: e.instance.id
3487
+ })), null, 16))]),
3488
+ _: 1
3489
+ }, 8, [
3490
+ "title",
3491
+ "icon",
3492
+ "close-label",
3493
+ "body-padding"
3494
+ ])], 2)], 14, Cr));
3495
+ }
3496
+ }), Tr = /* @__PURE__ */ u({
3497
+ __name: "VddSidePanels",
3498
+ props: {
3499
+ defaultWidth: { default: 400 },
3500
+ sides: { default: "both" }
3501
+ },
3502
+ setup(t) {
3503
+ let o = t, { overlays: s } = J(), c = n(() => o.sides === "right" ? null : s.state.leftPanel), l = n(() => o.sides === "left" ? null : s.state.rightPanel);
3504
+ return (n, o) => (T(), a(e, null, [c.value ? (T(), r(wr, {
3505
+ key: c.value.id,
3506
+ instance: c.value,
3507
+ position: "left",
3508
+ "default-width": t.defaultWidth
3509
+ }, null, 8, ["instance", "default-width"])) : i("", !0), l.value ? (T(), r(wr, {
3510
+ key: l.value.id,
3511
+ instance: l.value,
3512
+ position: "right",
3513
+ "default-width": t.defaultWidth
3514
+ }, null, 8, ["instance", "default-width"])) : i("", !0)], 64));
3515
+ }
3516
+ }), Er = ["dir", "data-vdd-modal"], Dr = /* @__PURE__ */ u({
3517
+ __name: "VddModalHost",
3518
+ props: {
3519
+ instance: {},
3520
+ index: {}
3521
+ },
3522
+ setup(e) {
3523
+ let t = e, i = J(), { displayTitle: s, icon: c, dismissible: u, close: d, bodyPadding: p } = br(() => t.instance), m = n(() => `vdd-modal-size-${t.instance.options.size ?? "auto"}`), h = n(() => `calc(var(--vdd-z-base, 1000) + 9000 + ${t.index * 10})`);
3524
+ return (t, n) => (T(), a("div", {
3525
+ class: "vdd-modal-overlay",
3526
+ style: x({ zIndex: h.value }),
3527
+ dir: z(i).state.dir,
3528
+ "data-vdd-modal": e.instance.id
3529
+ }, [o("div", {
3530
+ class: "vdd-modal-curtain",
3531
+ "data-vdd-modal-curtain": "",
3532
+ onClick: n[0] ||= (e) => z(u) && z(d)()
3533
+ }), o("div", { class: y(["vdd-modal-window", [m.value, z(i).classes.modal]]) }, [l(Sr, {
3534
+ block: "modal",
3535
+ title: z(s),
3536
+ icon: z(c),
3537
+ closable: z(u),
3538
+ "close-label": z(i).format(z(i).messages.closeTooltip),
3539
+ "body-padding": z(p),
3540
+ onClose: n[1] ||= (e) => z(d)()
3541
+ }, {
3542
+ default: U(() => [(T(), r(N(e.instance.component), b(f({
3543
+ ...e.instance.props,
3544
+ panelId: e.instance.id
3545
+ })), null, 16))]),
3546
+ _: 1
3547
+ }, 8, [
3548
+ "title",
3549
+ "icon",
3550
+ "closable",
3551
+ "close-label",
3552
+ "body-padding"
3553
+ ])], 2)], 12, Er));
3554
+ }
3555
+ }), Or = { class: "vdd-confirmation-message" }, kr = { class: "vdd-confirmation-actions" }, Ar = /* @__PURE__ */ u({
3556
+ __name: "VddConfirm",
3557
+ props: {
3558
+ message: {},
3559
+ alert: {},
3560
+ alertType: { default: "info" },
3561
+ yesNo: {
3562
+ type: Boolean,
3563
+ default: !1
3564
+ },
3565
+ onOk: {},
3566
+ onCancel: {},
3567
+ onSettled: {}
3568
+ },
3569
+ setup(e) {
3570
+ let t = e, n = J(), r = kt(), s = V("confirmButton"), c = !1;
3571
+ function l(e) {
3572
+ c || (c = !0, t.onSettled?.(e));
3573
+ }
3574
+ function u() {
3575
+ l(!0), t.onOk?.(), r.close({ force: !0 });
3576
+ }
3577
+ function d() {
3578
+ l(!1), t.onCancel?.(), r.close({ force: !0 });
3579
+ }
3580
+ return C(() => {
3581
+ r.setIcon(void 0), s.value?.focus({ preventScroll: !0 });
3582
+ }), S(() => l(!1)), (t, r) => (T(), a("form", {
3583
+ class: "vdd-confirmation-form-body",
3584
+ onSubmit: W(u, ["prevent"])
3585
+ }, [
3586
+ e.alert ? (T(), a("div", {
3587
+ key: 0,
3588
+ class: y(["vdd-confirmation-alert", `vdd-confirmation-alert-${e.alertType}`])
3589
+ }, [o("span", null, I(e.alert), 1)], 2)) : i("", !0),
3590
+ o("div", Or, I(z(n).format(e.message)), 1),
3591
+ o("div", kr, [o("button", {
3592
+ type: "button",
3593
+ class: "vdd-btn vdd-btn-sm vdd-btn-outline",
3594
+ "data-vdd-confirm-cancel": "",
3595
+ onClick: d
3596
+ }, I(z(n).format(e.yesNo ? z(n).messages.no : z(n).messages.cancel)), 1), o("button", {
3597
+ ref_key: "confirmButton",
3598
+ ref: s,
3599
+ type: "submit",
3600
+ class: "vdd-btn vdd-btn-sm vdd-btn-primary",
3601
+ "data-vdd-confirm-ok": ""
3602
+ }, I(z(n).format(e.yesNo ? z(n).messages.yes : z(n).messages.ok)), 513)])
3603
+ ], 32));
3604
+ }
3605
+ }), jr = /* @__PURE__ */ u({
3606
+ __name: "VddModals",
3607
+ setup(t) {
3608
+ let n = J(), { overlays: i } = n;
3609
+ function o(e) {
3610
+ return new Promise((t) => {
3611
+ i.openModal(Ar, {
3612
+ message: e.dirtyOptions?.message ?? {
3613
+ ...n.messages.unsavedChangesMessage,
3614
+ values: { title: e.title }
3615
+ },
3616
+ alert: e.dirtyOptions?.alert,
3617
+ alertType: e.dirtyOptions?.alertType ?? "danger",
3618
+ yesNo: !0,
3619
+ onSettled: (e) => t(e)
3620
+ }, {
3621
+ title: e.dirtyOptions?.title ?? n.messages.unsavedChangesTitle,
3622
+ size: "small"
3623
+ });
3624
+ });
3625
+ }
3626
+ return C(() => i.setConfirmRenderer(o)), S(() => i.setConfirmRenderer(null)), (t, n) => (T(!0), a(e, null, A(z(i).state.modals, (e, t) => (T(), r(Dr, {
3627
+ key: e.id,
3628
+ instance: e,
3629
+ index: t
3630
+ }, null, 8, ["instance", "index"]))), 128));
3631
+ }
3632
+ }), X = D({
3633
+ items: [],
3634
+ adapter: null
3635
+ }), Mr = 0;
3636
+ function Z(e, t = {}) {
3637
+ let n = t.id ?? `vdd-toast-${++Mr}`, r = {
3638
+ ...t,
3639
+ id: n
3640
+ }, i = X.items.find((e) => e.id === n);
3641
+ return i ? (i.message = e, i.options = {
3642
+ ...i.options,
3643
+ ...r
3644
+ }, i.exiting = !1, i.revision++, X.adapter?.update(n, e, r), n) : (X.items.push({
3645
+ id: n,
3646
+ message: e,
3647
+ options: r,
3648
+ exiting: !1,
3649
+ revision: 0
3650
+ }), n);
3651
+ }
3652
+ function Nr(e) {
3653
+ let t = X.items.find((t) => t.id === e);
3654
+ t && !t.exiting && (t.exiting = !0, t.options.onClose?.());
3655
+ }
3656
+ function Pr(e) {
3657
+ let t = X.items.findIndex((t) => t.id === e);
3658
+ t !== -1 && X.items.splice(t, 1);
3659
+ }
3660
+ function Fr(e) {
3661
+ if (X.adapter) {
3662
+ X.adapter.dismiss(e);
3663
+ return;
3664
+ }
3665
+ if (e === void 0) {
3666
+ for (let e of [...X.items]) Nr(e.id);
3667
+ return;
3668
+ }
3669
+ Nr(e);
3670
+ }
3671
+ var Ir = Object.assign((e, t) => Z(e, t), {
3672
+ info: (e, t) => Z(e, {
3673
+ ...t,
3674
+ type: "info"
3675
+ }),
3676
+ success: (e, t) => Z(e, {
3677
+ ...t,
3678
+ type: "success"
3679
+ }),
3680
+ warning: (e, t) => Z(e, {
3681
+ ...t,
3682
+ type: "warning"
3683
+ }),
3684
+ error: (e, t) => Z(e, {
3685
+ ...t,
3686
+ type: "error"
3687
+ }),
3688
+ dismiss: Fr,
3689
+ promise(e, t, n) {
3690
+ let r = Z(t.pending, {
3691
+ ...n,
3692
+ type: "info",
3693
+ duration: 0
3694
+ });
3695
+ return e.then((e) => {
3696
+ Z(typeof t.success == "function" ? t.success(e) : t.success, {
3697
+ ...n,
3698
+ id: r,
3699
+ type: "success",
3700
+ duration: n?.duration ?? 5e3
3701
+ });
3702
+ }, (e) => {
3703
+ Z(typeof t.error == "function" ? t.error(e) : t.error, {
3704
+ ...n,
3705
+ id: r,
3706
+ type: "error",
3707
+ duration: n?.duration ?? 5e3
3708
+ });
3709
+ }), e;
3710
+ }
3711
+ });
3712
+ function Lr() {
3713
+ X.items.splice(0), X.adapter = null;
3714
+ }
3715
+ //#endregion
3716
+ //#region src/components/VddToastIcon.vue?vue&type=script&setup=true&lang.ts
3717
+ var Rr = {
3718
+ class: "vdd-toast__icon",
3719
+ viewBox: "0 0 16 16",
3720
+ fill: "none",
3721
+ "aria-hidden": "true"
3722
+ }, zr = {
3723
+ key: 0,
3724
+ d: "M5 8l2 2 4-4",
3725
+ stroke: "currentColor",
3726
+ "stroke-width": "1.5",
3727
+ "stroke-linecap": "round",
3728
+ "stroke-linejoin": "round"
3729
+ }, Br = {
3730
+ key: 1,
3731
+ d: "M5.5 5.5l5 5M10.5 5.5l-5 5",
3732
+ stroke: "currentColor",
3733
+ "stroke-width": "1.5",
3734
+ "stroke-linecap": "round"
3735
+ }, Vr = {
3736
+ key: 2,
3737
+ d: "M8 5v.01M8 7.5v3.5",
3738
+ stroke: "currentColor",
3739
+ "stroke-width": "1.5",
3740
+ "stroke-linecap": "round"
3741
+ }, Hr = /* @__PURE__ */ u({
3742
+ __name: "VddToastIcon",
3743
+ props: { type: {} },
3744
+ setup(t) {
3745
+ return (n, r) => (T(), a("svg", Rr, [t.type === "warning" ? (T(), a(e, { key: 0 }, [r[0] ||= o("path", {
3746
+ d: "M8 2.5L14 13.5H2L8 2.5z",
3747
+ stroke: "currentColor",
3748
+ "stroke-width": "1.5",
3749
+ "stroke-linejoin": "round"
3750
+ }, null, -1), r[1] ||= o("path", {
3751
+ d: "M8 7v2.5M8 11.5v.01",
3752
+ stroke: "currentColor",
3753
+ "stroke-width": "1.5",
3754
+ "stroke-linecap": "round"
3755
+ }, null, -1)], 64)) : (T(), a(e, { key: 1 }, [r[2] ||= o("circle", {
3756
+ cx: "8",
3757
+ cy: "8",
3758
+ r: "7",
3759
+ stroke: "currentColor",
3760
+ "stroke-width": "1.5"
3761
+ }, null, -1), t.type === "success" ? (T(), a("path", zr)) : t.type === "error" ? (T(), a("path", Br)) : (T(), a("path", Vr))], 64))]));
3762
+ }
3763
+ }), Ur = ["data-vdd-toast"], Wr = /* @__PURE__ */ u({
3764
+ __name: "VddToastItem",
3765
+ props: {
3766
+ toast: {},
3767
+ isLeft: { type: Boolean },
3768
+ showProgress: { type: Boolean },
3769
+ pauseOnHover: { type: Boolean },
3770
+ animation: {},
3771
+ defaultDuration: {},
3772
+ defaultClosable: { type: Boolean }
3773
+ },
3774
+ emits: ["exited"],
3775
+ setup(t, { emit: s }) {
3776
+ let l = t, u = s, d = V("card"), f = V("body"), p = n(() => l.toast.options.type ?? "info"), m = n(() => l.toast.options.duration ?? l.defaultDuration), h = n(() => l.toast.options.closable ?? l.defaultClosable), g = n(() => l.toast.options.icon ?? null), v = k(l.animation === "none" ? "vdd-toast--visible" : l.animation === "fade" ? "vdd-toast--fade-entering" : l.isLeft ? "vdd-toast--entering-left" : "vdd-toast--entering"), w = k(!1), E = null, D = 0, O = 0;
3777
+ function A(e) {
3778
+ e <= 0 || (O = Date.now(), E = setTimeout(() => Nr(l.toast.id), e));
3779
+ }
3780
+ function j() {
3781
+ E &&= (clearTimeout(E), null);
3782
+ }
3783
+ H([m, () => l.toast.revision], () => {
3784
+ j(), D = m.value, A(m.value);
3785
+ }, { immediate: !0 });
3786
+ function M() {
3787
+ l.pauseOnHover && m.value !== 0 && E && (j(), D = Math.max(0, D - (Date.now() - O)), w.value = !0);
3788
+ }
3789
+ function P() {
3790
+ l.pauseOnHover && m.value !== 0 && (w.value = !1, A(D));
3791
+ }
3792
+ let F = null;
3793
+ function L() {
3794
+ let e = d.value;
3795
+ e && !l.toast.exiting && (e.style.maxHeight = `${e.scrollHeight}px`);
3796
+ }
3797
+ C(() => {
3798
+ L(), typeof ResizeObserver < "u" && f.value && (F = new ResizeObserver(L), F.observe(f.value)), l.animation !== "none" && requestAnimationFrame(() => {
3799
+ v.value = "vdd-toast--visible";
3800
+ });
3801
+ });
3802
+ let R = null;
3803
+ H(() => l.toast.exiting, (e) => {
3804
+ if (e) {
3805
+ if (j(), F?.disconnect(), F = null, l.animation === "none" || !d.value) {
3806
+ u("exited", l.toast.id);
3807
+ return;
3808
+ }
3809
+ R = setTimeout(() => u("exited", l.toast.id), 520);
3810
+ }
3811
+ }, { immediate: !0 });
3812
+ function B(e) {
3813
+ l.toast.exiting && e.propertyName === "max-height" && u("exited", l.toast.id);
3814
+ }
3815
+ return S(() => {
3816
+ j(), R && clearTimeout(R), F?.disconnect();
3817
+ }), (n, s) => (T(), a("div", {
3818
+ ref_key: "card",
3819
+ ref: d,
3820
+ role: "status",
3821
+ "aria-live": "polite",
3822
+ class: y(["vdd-toast", [
3823
+ `vdd-toast--${p.value}`,
3824
+ v.value,
3825
+ {
3826
+ "vdd-toast--exiting": t.toast.exiting,
3827
+ "vdd-toast--paused": w.value
3828
+ }
3829
+ ]]),
3830
+ "data-vdd-toast": t.toast.id,
3831
+ onMouseenter: M,
3832
+ onMouseleave: P,
3833
+ onTransitionend: B
3834
+ }, [
3835
+ g.value ? (T(), r(N(g.value), { key: 0 })) : (T(), r(Hr, {
3836
+ key: 1,
3837
+ type: p.value
3838
+ }, null, 8, ["type"])),
3839
+ o("div", {
3840
+ ref_key: "body",
3841
+ ref: f,
3842
+ class: "vdd-toast__body"
3843
+ }, [t.toast.options.content ? (T(), r(N(t.toast.options.content), b(_({ key: 0 }, t.toast.options.contentProps)), null, 16)) : (T(), a(e, { key: 1 }, [c(I(t.toast.message), 1)], 64))], 512),
3844
+ h.value ? (T(), a("button", {
3845
+ key: 2,
3846
+ type: "button",
3847
+ class: "vdd-toast__close",
3848
+ "aria-label": "Close notification",
3849
+ "data-vdd-toast-close": "",
3850
+ onClick: s[0] ||= (e) => z(Nr)(t.toast.id)
3851
+ }, [...s[1] ||= [o("svg", {
3852
+ width: "14",
3853
+ height: "14",
3854
+ viewBox: "0 0 16 16",
3855
+ fill: "none",
3856
+ "aria-hidden": "true"
3857
+ }, [o("path", {
3858
+ d: "M4 4l8 8M12 4l-8 8",
3859
+ stroke: "currentColor",
3860
+ "stroke-width": "1.5",
3861
+ "stroke-linecap": "round"
3862
+ })], -1)]])) : i("", !0),
3863
+ t.showProgress && m.value > 0 ? (T(), a("div", {
3864
+ key: 3,
3865
+ class: "vdd-toast__progress",
3866
+ style: x({ animationDuration: `${m.value}ms` })
3867
+ }, null, 4)) : i("", !0)
3868
+ ], 42, Ur));
3869
+ }
3870
+ }), Gr = /* @__PURE__ */ u({
3871
+ __name: "VddToasts",
3872
+ props: {
3873
+ position: { default: "top-right" },
3874
+ maxVisible: { default: 3 },
3875
+ defaultDuration: { default: 5e3 },
3876
+ defaultClosable: {
3877
+ type: Boolean,
3878
+ default: !0
3879
+ },
3880
+ pauseOnHover: {
3881
+ type: Boolean,
3882
+ default: !0
3883
+ },
3884
+ animation: { default: "slide" },
3885
+ newestOnTop: {
3886
+ type: Boolean,
3887
+ default: !1
3888
+ },
3889
+ progressBar: {
3890
+ type: Boolean,
3891
+ default: !1
3892
+ },
3893
+ width: { default: 320 },
3894
+ adapter: {}
3895
+ },
3896
+ setup(s) {
3897
+ let c = s;
3898
+ H(() => c.adapter, (e) => {
3899
+ X.adapter = e ?? null;
3900
+ }, { immediate: !0 }), S(() => {
3901
+ X.adapter === c.adapter && (X.adapter = null);
3902
+ });
3903
+ let l = n(() => {
3904
+ let e = [], t = 0;
3905
+ for (let n of X.items) {
3906
+ if (n.exiting) {
3907
+ e.push(n);
3908
+ continue;
3909
+ }
3910
+ if (t >= c.maxVisible) break;
3911
+ e.push(n), t++;
3912
+ }
3913
+ return c.newestOnTop ? [...e].reverse() : e;
3914
+ });
3915
+ H(() => X.items.map((e) => `${e.id}:${e.exiting}`).join(","), () => {
3916
+ let e = new Set(l.value.map((e) => e.id));
3917
+ for (let t of [...X.items]) t.exiting && !e.has(t.id) && Pr(t.id);
3918
+ }, { immediate: !0 });
3919
+ let u = n(() => c.position.endsWith("left"));
3920
+ return (n, c) => s.adapter ? (T(), r(t, {
3921
+ key: 0,
3922
+ to: "body"
3923
+ }, [s.adapter.component ? (T(), r(N(s.adapter.component), {
3924
+ key: 0,
3925
+ position: s.position
3926
+ }, null, 8, ["position"])) : i("", !0)])) : (T(), r(t, {
3927
+ key: 1,
3928
+ to: "body"
3929
+ }, [o("div", {
3930
+ class: y(["vdd-toast-container", [`vdd-toast-container--${s.position}`, s.newestOnTop ? "vdd-toast-container--newest-top" : "vdd-toast-container--newest-bottom"]]),
3931
+ style: x({ width: `${s.width}px` }),
3932
+ "aria-label": "Notifications",
3933
+ "aria-live": "polite",
3934
+ "data-vdd-toasts": ""
3935
+ }, [(T(!0), a(e, null, A(l.value, (e) => (T(), r(Wr, {
3936
+ key: e.id,
3937
+ toast: e,
3938
+ "is-left": u.value,
3939
+ "show-progress": s.progressBar,
3940
+ "pause-on-hover": s.pauseOnHover,
3941
+ animation: s.animation,
3942
+ "default-duration": s.defaultDuration,
3943
+ "default-closable": s.defaultClosable,
3944
+ onExited: z(Pr)
3945
+ }, null, 8, [
3946
+ "toast",
3947
+ "is-left",
3948
+ "show-progress",
3949
+ "pause-on-hover",
3950
+ "animation",
3951
+ "default-duration",
3952
+ "default-closable",
3953
+ "onExited"
3954
+ ]))), 128))], 6)]));
3955
+ }
3956
+ }), Q = (e) => e === "width" || e === "both", $ = (e) => e === "height" || e === "both", Kr = (e, t) => t === "inline" ? $(e) ? "both" : "width" : Q(e) ? "both" : "height", qr = (e, t) => t === "inline" ? e === "both" ? "height" : Q(e) ? null : e : e === "both" ? "width" : $(e) ? null : e, Jr = (e, t) => $(t) ? [] : Q(t) ? e.startsWith("top-") ? ["top-left", "top-right"] : ["bottom-left", "bottom-right"] : [e], Yr = [
3957
+ "top-left",
3958
+ "top-right",
3959
+ "bottom-left",
3960
+ "bottom-right"
3961
+ ];
3962
+ function Xr(e, t, n) {
3963
+ let r = t - e.left, i = n - e.top;
3964
+ return r < 80 && i < 80 ? "top-left" : r > e.width - 80 && i < 80 ? "top-right" : r < 80 && i > e.height - 80 ? "bottom-left" : r > e.width - 80 && i > e.height - 80 ? "bottom-right" : null;
3965
+ }
3966
+ var Zr = (e) => e.endsWith("-left") ? e.replace("-left", "-right") : e.replace("-right", "-left");
3967
+ function Qr(e, t) {
3968
+ return {
3969
+ left: (t ? e.inlineEnd : e.inlineStart) + 8,
3970
+ right: (t ? e.inlineStart : e.inlineEnd) + 8,
3971
+ top: e.top,
3972
+ bottom: e.bottom
3973
+ };
3974
+ }
3975
+ function $r(e, t, n, r) {
3976
+ if (e === "free") return [
3977
+ "n",
3978
+ "ne",
3979
+ "e",
3980
+ "se",
3981
+ "s",
3982
+ "sw",
3983
+ "w",
3984
+ "nw"
3985
+ ];
3986
+ let i = t.startsWith("top-") ? "s" : "n", a = t.endsWith("-right") === r ? "e" : "w", o = Q(n), s = $(n), c = [];
3987
+ return c.push(...o ? ["e", "w"] : [a]), c.push(...s ? ["n", "s"] : [i]), !o && !s && c.push(`${i}${a}`), c;
3988
+ }
3989
+ function ei(e, t, n, r) {
3990
+ let i = e;
3991
+ if (n.inline) {
3992
+ let e = t.includes("e");
3993
+ i = `${i.startsWith("top-") ? "top" : "bottom"}-${e === r ? "right" : "left"}`;
3994
+ }
3995
+ return n.block && (i = `${t.includes("s") ? "top" : "bottom"}-${i.endsWith("-right") ? "right" : "left"}`), i;
3996
+ }
3997
+ function ti(e, t, n, r, i) {
3998
+ let a = t.length === 0, o = 0;
3999
+ for (let s of t) {
4000
+ let t = n[s] ?? [], c = t.indexOf(e);
4001
+ if (c === -1) continue;
4002
+ a = !0;
4003
+ let l = 0;
4004
+ for (let e = 0; e < c; e++) l += (r[t[e]] ?? i) + 8;
4005
+ o = Math.max(o, l);
4006
+ }
4007
+ return {
4008
+ offset: o,
4009
+ registered: a
4010
+ };
4011
+ }
4012
+ //#endregion
4013
+ //#region src/core/overlayState.ts
4014
+ var ni = Symbol("vdd-panel-overlay");
4015
+ function ri() {
4016
+ let e = F(null), t = D({
4017
+ top: 0,
4018
+ bottom: 0,
4019
+ inlineStart: 0,
4020
+ inlineEnd: 0
4021
+ }), n = k(null), r = D({}), i = D({
4022
+ "top-left": [],
4023
+ "top-right": [],
4024
+ "bottom-left": [],
4025
+ "bottom-right": []
4026
+ }), a = D({}), o = k(null), s = k(null), c = /* @__PURE__ */ new Map(), l = k(0), u = 100, d = (e) => e === "top" ? "top" : e === "bottom" ? "bottom" : e === "left" ? "inlineStart" : "inlineEnd";
4027
+ return {
4028
+ container: e,
4029
+ insets: t,
4030
+ topId: n,
4031
+ zOrders: r,
4032
+ stacks: i,
4033
+ dockedSizes: a,
4034
+ draggingId: o,
4035
+ hovered: s,
4036
+ managed: c,
4037
+ managedVersion: l,
4038
+ registerToolbar: (e, n) => {
4039
+ t[d(e)] = n;
4040
+ },
4041
+ unregisterToolbar: (e) => {
4042
+ t[d(e)] = 0;
4043
+ },
4044
+ focus: (e) => {
4045
+ u += 1, r[e] = u, n.value = e;
4046
+ },
4047
+ dock: (e, t, n) => {
4048
+ let r = Jr(t, n);
4049
+ for (let t of Yr) {
4050
+ let n = i[t].filter((t) => t !== e), a = r.includes(t) ? [...n, e] : n;
4051
+ a.length === i[t].length && a.every((e, n) => e === i[t][n]) || (i[t] = a);
4052
+ }
4053
+ },
4054
+ undock: (e) => {
4055
+ for (let t of Yr) i[t].includes(e) && (i[t] = i[t].filter((t) => t !== e));
4056
+ },
4057
+ reportSize: (e, t) => {
4058
+ a[e] !== t && (a[e] = t);
4059
+ },
4060
+ openManaged: (e, t) => {
4061
+ c.set(e, {
4062
+ ...t,
4063
+ component: h(t.component)
4064
+ }), l.value++;
4065
+ },
4066
+ closeManaged: (e) => {
4067
+ c.delete(e) && l.value++;
4068
+ },
4069
+ closeAllManaged: () => {
4070
+ c.size !== 0 && (c.clear(), l.value++);
4071
+ },
4072
+ managedIds: () => (l.value, Array.from(c.keys()))
4073
+ };
4074
+ }
4075
+ //#endregion
4076
+ //#region src/composables/usePanelOverlay.ts
4077
+ function ii() {
4078
+ let e = p(ni, null);
4079
+ if (!e) throw Error("[vue-dockable-desktop] This component must be used inside a <VddPanelOverlay>. Wrap your panel content in one to enable toolbars and floating widgets.");
4080
+ return e;
4081
+ }
4082
+ function ai() {
4083
+ return p(ni, null);
4084
+ }
4085
+ function oi() {
4086
+ let e = ii();
4087
+ return {
4088
+ openIds: n(() => e.managedIds()),
4089
+ open: e.openManaged,
4090
+ close: e.closeManaged,
4091
+ closeAll: e.closeAllManaged,
4092
+ isOpen: (t) => (e.managedVersion.value, e.managed.has(t))
4093
+ };
4094
+ }
4095
+ //#endregion
4096
+ //#region src/components/VddFloatingWidget.vue?vue&type=script&setup=true&lang.ts
4097
+ var si = ["dir", "data-vdd-widget"], ci = {
4098
+ key: 0,
4099
+ class: "vdd-panel-float__icon"
4100
+ }, li = { class: "vdd-panel-float__title" }, ui = ["title", "aria-label"], di = { class: "vdd-panel-float__body" }, fi = ["data-vdd-widget-resize", "onPointerdown"], pi = /* @__PURE__ */ u({
4101
+ __name: "VddFloatingWidget",
4102
+ props: /*@__PURE__*/ g({
4103
+ widgetId: {},
4104
+ title: {},
4105
+ icon: {},
4106
+ width: { default: 320 },
4107
+ height: { default: 240 },
4108
+ stretchable: {
4109
+ type: Boolean,
4110
+ default: !0
4111
+ }
4112
+ }, {
4113
+ open: {
4114
+ type: Boolean,
4115
+ default: !0
4116
+ },
4117
+ openModifiers: {},
4118
+ placement: { default: () => ({
4119
+ anchor: "top-right",
4120
+ stretch: null
4121
+ }) },
4122
+ placementModifiers: {}
4123
+ }),
4124
+ emits: ["update:open", "update:placement"],
4125
+ setup(t) {
4126
+ let s = t, c = B(t, "open"), l = B(t, "placement"), u = J(), d = ai(), f = V("el"), p = n(() => u.state.isRtl), m = n(() => l.value.anchor), h = n(() => l.value.stretch), g = k("docked"), _ = k(null), v = k({
4127
+ w: s.width,
4128
+ h: s.height
4129
+ }), b = k({
4130
+ inline: !1,
4131
+ block: !1
4132
+ });
4133
+ function C(e, t) {
4134
+ l.value = {
4135
+ anchor: e,
4136
+ stretch: t
4137
+ };
4138
+ }
4139
+ H([
4140
+ () => c.value,
4141
+ g,
4142
+ m,
4143
+ h
4144
+ ], ([e, t]) => {
4145
+ if (d && e) {
4146
+ if (t !== "docked") {
4147
+ d.undock(s.widgetId);
4148
+ return;
4149
+ }
4150
+ d.dock(s.widgetId, m.value, h.value);
4151
+ }
4152
+ }, { immediate: !0 }), H(() => v.value.h, (e) => d?.reportSize(s.widgetId, e), { immediate: !0 }), S(() => d?.undock(s.widgetId));
4153
+ let w = !1;
4154
+ H([
4155
+ g,
4156
+ m,
4157
+ h
4158
+ ], () => {
4159
+ if (process.env.NODE_ENV === "production" || w || !d || g.value !== "docked" || !$(h.value)) return;
4160
+ let e = m.value.endsWith("-right") ? "right" : "left", t = [`top-${e}`, `bottom-${e}`].flatMap((e) => d.stacks[e] ?? []).filter((e) => e !== s.widgetId);
4161
+ t.length !== 0 && (w = !0, console.warn(`[vue-dockable-desktop] <VddFloatingWidget> "${s.widgetId}" stretches the block axis ("${h.value}") while ${t.length} other widget(s) are anchored to the same side (${t.join(", ")}). A block-stretched widget spans the axis stacking uses to separate siblings, so it cannot stack and will overlap them — z-order decides which is on top. Give it a fixed height, or move the others to the opposite side.`));
4162
+ });
4163
+ let E = n(() => d?.zOrders[s.widgetId] ?? 101), D = n(() => !d || d.topId.value === s.widgetId), O = () => Qr(d?.insets ?? {
4164
+ top: 0,
4165
+ bottom: 0,
4166
+ inlineStart: 0,
4167
+ inlineEnd: 0
4168
+ }, p.value);
4169
+ function M() {
4170
+ let e = f.value?.offsetParent;
4171
+ return {
4172
+ cw: e?.clientWidth ?? 9999,
4173
+ ch: e?.clientHeight ?? 9999
4174
+ };
4175
+ }
4176
+ let P = n(() => !d || g.value !== "docked" ? {
4177
+ offset: 0,
4178
+ registered: !0
4179
+ } : ti(s.widgetId, Jr(m.value, h.value), d.stacks, d.dockedSizes, s.height)), F = n(() => {
4180
+ if (g.value !== "docked" || !d) return {
4181
+ left: `${_.value?.x ?? 0}px`,
4182
+ top: `${_.value?.y ?? 0}px`,
4183
+ width: `${v.value.w}px`,
4184
+ height: `${v.value.h}px`,
4185
+ zIndex: E.value
4186
+ };
4187
+ let e = O(), t = {
4188
+ zIndex: E.value,
4189
+ opacity: P.value.registered ? void 0 : 0,
4190
+ pointerEvents: P.value.registered ? void 0 : "none"
4191
+ };
4192
+ return Q(h.value) ? (t.insetInlineStart = `${d.insets.inlineStart + 8}px`, t.insetInlineEnd = `${d.insets.inlineEnd + 8}px`) : (t[m.value.endsWith("-right") ? "insetInlineEnd" : "insetInlineStart"] = "8px", t.width = `${v.value.w}px`), $(h.value) ? (t.top = `${e.top}px`, t.bottom = `${e.bottom}px`) : m.value.startsWith("top-") ? (t.top = `${e.top + P.value.offset}px`, t.height = `${v.value.h}px`) : (t.bottom = `${e.bottom + P.value.offset}px`, t.height = `${v.value.h}px`), t;
4193
+ }), L = n(() => $r(g.value, m.value, h.value, p.value)), R = null;
4194
+ function ee(e) {
4195
+ if (e.button !== 0) return;
4196
+ e.preventDefault();
4197
+ let t, n;
4198
+ if (g.value === "docked") {
4199
+ let e = f.value, r = d?.container.value;
4200
+ if (e && r) {
4201
+ let i = e.getBoundingClientRect(), a = r.getBoundingClientRect();
4202
+ t = i.left - a.left, n = i.top - a.top;
4203
+ } else t = 8, n = d?.insets.top ?? 0;
4204
+ } else t = _.value?.x ?? 0, n = _.value?.y ?? 0;
4205
+ R = {
4206
+ mouseX: e.clientX,
4207
+ mouseY: e.clientY,
4208
+ posX: t,
4209
+ posY: n,
4210
+ moved: !1
4211
+ }, f.value?.setPointerCapture(e.pointerId);
4212
+ }
4213
+ function te(e) {
4214
+ if (!R) return;
4215
+ if (!R.moved) {
4216
+ if (Math.abs(e.clientX - R.mouseX) + Math.abs(e.clientY - R.mouseY) < 4) return;
4217
+ if (R.moved = !0, g.value === "docked") {
4218
+ if (h.value) {
4219
+ let e = f.value?.getBoundingClientRect();
4220
+ e && (v.value = {
4221
+ w: Math.round(e.width),
4222
+ h: Math.round(e.height)
4223
+ }), C(m.value, null);
4224
+ }
4225
+ d?.undock(s.widgetId), g.value = "free";
4226
+ }
4227
+ document.body.classList.add("vdd-dragging-active"), d && (d.draggingId.value = s.widgetId);
4228
+ }
4229
+ let { cw: t, ch: n } = M();
4230
+ _.value = {
4231
+ x: Math.max(0, Math.min(R.posX + e.clientX - R.mouseX, t - v.value.w)),
4232
+ y: Math.max(0, Math.min(R.posY + e.clientY - R.mouseY, n - v.value.h))
4233
+ };
4234
+ let r = d?.container.value;
4235
+ if (r && d) {
4236
+ let t = Xr(r.getBoundingClientRect(), e.clientX, e.clientY);
4237
+ d.hovered.value = t && p.value ? Zr(t) : t;
4238
+ }
4239
+ }
4240
+ function ne() {
4241
+ if (R?.moved && d) {
4242
+ let e = d.hovered.value;
4243
+ e && (g.value = "docked", _.value = null, C(e, h.value)), d.hovered.value = null, d.draggingId.value = null;
4244
+ }
4245
+ document.body.classList.remove("vdd-dragging-active"), R = null;
4246
+ }
4247
+ function U() {
4248
+ R?.moved && d && (d.hovered.value = null, d.draggingId.value = null), document.body.classList.remove("vdd-dragging-active"), R = null;
4249
+ }
4250
+ function re(e, t) {
4251
+ if (t.button !== 0) return;
4252
+ t.preventDefault(), t.stopPropagation();
4253
+ let n = 0, r = 0;
4254
+ if (g.value === "free") n = _.value?.x ?? 0, r = _.value?.y ?? 0;
4255
+ else {
4256
+ let e = f.value, t = e?.offsetParent;
4257
+ if (e && t) {
4258
+ let i = e.getBoundingClientRect(), a = t.getBoundingClientRect();
4259
+ n = i.left - a.left, r = i.top - a.top;
4260
+ }
4261
+ }
4262
+ let i = f.value?.getBoundingClientRect(), a = {
4263
+ x: n,
4264
+ y: r,
4265
+ w: Q(h.value) && i ? i.width : v.value.w,
4266
+ h: $(h.value) && i ? i.height : v.value.h
4267
+ }, o = e.includes("e") || e.includes("w"), c = e.includes("n") || e.includes("s"), l = !1, u = {
4268
+ inline: !1,
4269
+ block: !1
4270
+ };
4271
+ function d() {
4272
+ if (l || g.value !== "docked") return;
4273
+ let t = h.value, n = {
4274
+ inline: o && Q(t),
4275
+ block: c && $(t)
4276
+ };
4277
+ if (!n.inline && !n.block) return;
4278
+ l = !0;
4279
+ let r = t;
4280
+ n.inline && (r = qr(r, "inline")), n.block && (r = qr(r, "block")), C(ei(m.value, e, n, p.value), r);
4281
+ }
4282
+ Y({
4283
+ element: t.currentTarget,
4284
+ pointerId: t.pointerId,
4285
+ startClientX: t.clientX,
4286
+ startClientY: t.clientY,
4287
+ captureStart: () => a,
4288
+ activeClasses: [{
4289
+ el: document.body,
4290
+ classes: ["vdd-resizing-active"]
4291
+ }],
4292
+ onMove: (t, n, r) => {
4293
+ let { cw: i, ch: a } = M(), f = g.value === "docked" ? O() : {
4294
+ left: 0,
4295
+ right: 0,
4296
+ top: 0,
4297
+ bottom: 0
4298
+ }, p = at(e, t, n, r, {
4299
+ minW: 120,
4300
+ minH: 60,
4301
+ maxW: i - f.right - r.x,
4302
+ maxH: a - f.bottom - r.y,
4303
+ minX: f.left,
4304
+ minY: f.top
4305
+ });
4306
+ if (d(), g.value === "docked" && s.stretchable) {
4307
+ let e = i - f.left - f.right, t = a - f.top - f.bottom - P.value.offset, n = h.value, r = { ...u };
4308
+ o && !Q(n) && (p.w >= e - 16 ? r.inline = !0 : u.inline && p.w < e - 40 && (r.inline = !1)), c && !$(n) && (p.h >= t - 16 ? r.block = !0 : u.block && p.h < t - 40 && (r.block = !1)), (r.inline !== u.inline || r.block !== u.block) && (u = r, b.value = r);
4309
+ }
4310
+ let m = l ? qr(qr(h.value, o ? "inline" : "block"), c ? "block" : "inline") : h.value;
4311
+ v.value = {
4312
+ w: Q(m) ? v.value.w : p.w,
4313
+ h: $(m) ? v.value.h : p.h
4314
+ }, g.value === "free" && (_.value = {
4315
+ x: p.x,
4316
+ y: p.y
4317
+ });
4318
+ },
4319
+ onEnd: (e) => {
4320
+ if (!u.inline && !u.block) {
4321
+ (b.value.inline || b.value.block) && (b.value = {
4322
+ inline: !1,
4323
+ block: !1
4324
+ });
4325
+ return;
4326
+ }
4327
+ v.value = {
4328
+ w: u.inline ? e.w : v.value.w,
4329
+ h: u.block ? e.h : v.value.h
4330
+ };
4331
+ let t = h.value;
4332
+ u.inline && (t = Kr(t, "inline")), u.block && (t = Kr(t, "block")), C(m.value, t), b.value = {
4333
+ inline: !1,
4334
+ block: !1
4335
+ };
4336
+ }
4337
+ });
4338
+ }
4339
+ return (n, s) => c.value ? (T(), a("div", {
4340
+ key: 0,
4341
+ ref_key: "el",
4342
+ ref: f,
4343
+ class: y(["vdd-panel-float", {
4344
+ "vdd-panel-float--active": D.value,
4345
+ "vdd-panel-float--snapping": b.value.inline || b.value.block
4346
+ }]),
4347
+ style: x(F.value),
4348
+ dir: z(u).state.dir,
4349
+ "data-vdd-widget": t.widgetId,
4350
+ onPointerdown: s[2] ||= (e) => z(d)?.focus(t.widgetId),
4351
+ onPointermove: te,
4352
+ onPointerup: ne,
4353
+ onPointercancel: U
4354
+ }, [
4355
+ o("div", {
4356
+ class: "vdd-panel-float__header",
4357
+ "data-vdd-widget-header": "",
4358
+ onPointerdown: ee
4359
+ }, [
4360
+ t.icon ? (T(), a("span", ci, [(T(), r(N(t.icon)))])) : i("", !0),
4361
+ o("span", li, I(z(u).format(t.title)), 1),
4362
+ o("button", {
4363
+ type: "button",
4364
+ class: "vdd-panel-float__close",
4365
+ title: z(u).format(z(u).messages.close),
4366
+ "aria-label": z(u).format(z(u).messages.close),
4367
+ "data-vdd-widget-close": "",
4368
+ onClick: s[0] ||= (e) => c.value = !1,
4369
+ onPointerdown: s[1] ||= W(() => {}, ["stop"])
4370
+ }, [...s[3] ||= [o("svg", {
4371
+ width: "8",
4372
+ height: "8",
4373
+ viewBox: "0 0 10 10",
4374
+ fill: "none",
4375
+ stroke: "currentColor",
4376
+ "stroke-width": "1.5",
4377
+ "stroke-linecap": "round"
4378
+ }, [o("line", {
4379
+ x1: "1",
4380
+ y1: "1",
4381
+ x2: "9",
4382
+ y2: "9"
4383
+ }), o("line", {
4384
+ x1: "9",
4385
+ y1: "1",
4386
+ x2: "1",
4387
+ y2: "9"
4388
+ })], -1)]], 40, ui)
4389
+ ], 32),
4390
+ o("div", di, [j(n.$slots, "default")]),
4391
+ (T(!0), a(e, null, A(L.value, (e) => (T(), a("div", {
4392
+ key: e,
4393
+ class: y(["vdd-resize-handle", `vdd-resize-${e}`]),
4394
+ "data-vdd-widget-resize": e,
4395
+ onPointerdown: (t) => re(e, t)
4396
+ }, null, 42, fi))), 128))
4397
+ ], 46, si)) : i("", !0);
4398
+ }
4399
+ }), mi = ["data-vdd-dropzone"], hi = /* @__PURE__ */ u({
4400
+ __name: "VddPanelOverlay",
4401
+ setup(t) {
4402
+ let o = ri();
4403
+ E(ni, o);
4404
+ let s = V("root");
4405
+ ne(() => {
4406
+ o.container.value = s.value;
4407
+ });
4408
+ let c = n(() => o.managedIds().map((e) => ({
4409
+ id: e,
4410
+ widget: o.managed.get(e)
4411
+ }))), l = n(() => o.draggingId.value !== null);
4412
+ return (t, n) => (T(), a("div", {
4413
+ ref_key: "root",
4414
+ ref: s,
4415
+ class: y(["vdd-panel-overlay-root", { "vdd-dragging-active": l.value }]),
4416
+ "data-vdd-panel-overlay": ""
4417
+ }, [
4418
+ j(t.$slots, "default"),
4419
+ l.value ? (T(!0), a(e, { key: 0 }, A(z(Yr), (e) => (T(), a("div", {
4420
+ key: e,
4421
+ class: y(["vdd-panel-float-dropzone", [`vdd-panel-float-dropzone--${e}`, { "vdd-panel-float-dropzone--hovered": z(o).hovered.value === e }]]),
4422
+ "data-vdd-dropzone": e,
4423
+ "aria-hidden": "true"
4424
+ }, null, 10, mi))), 128)) : i("", !0),
4425
+ (T(!0), a(e, null, A(c.value, ({ id: e, widget: t }) => (T(), r(pi, {
4426
+ key: e,
4427
+ "widget-id": e,
4428
+ title: t.title,
4429
+ icon: t.icon,
4430
+ open: !0,
4431
+ placement: {
4432
+ anchor: t.anchor ?? "top-right",
4433
+ stretch: t.stretch ?? null
4434
+ },
4435
+ width: t.width ?? 320,
4436
+ height: t.height ?? 240,
4437
+ "onUpdate:open": (t) => {
4438
+ t || z(o).closeManaged(e);
4439
+ }
4440
+ }, {
4441
+ default: U(() => [(T(), r(N(t.component), _({ ref_for: !0 }, t.props), null, 16))]),
4442
+ _: 2
4443
+ }, 1032, [
4444
+ "widget-id",
4445
+ "title",
4446
+ "icon",
4447
+ "placement",
4448
+ "width",
4449
+ "height",
4450
+ "onUpdate:open"
4451
+ ]))), 128))
4452
+ ], 2));
4453
+ }
4454
+ }), gi = [
4455
+ "data-variant",
4456
+ "data-btn-variant",
4457
+ "data-vdd-panel-toolbar",
4458
+ "aria-orientation"
4459
+ ], _i = /* @__PURE__ */ u({
4460
+ __name: "VddPanelToolbar",
4461
+ props: {
4462
+ position: {},
4463
+ variant: { default: "transparent" },
4464
+ buttonVariant: { default: "ghost" },
4465
+ buttonSize: {}
4466
+ },
4467
+ setup(e) {
4468
+ let t = e, r = ii(), i = V("el"), o = n(() => t.position === "top" || t.position === "bottom"), s = null;
4469
+ ne((e) => {
4470
+ let n = i.value, a = t.position;
4471
+ if (!n) return;
4472
+ let c = () => {
4473
+ r.registerToolbar(a, o.value ? n.offsetHeight : n.offsetWidth);
4474
+ };
4475
+ c(), typeof ResizeObserver < "u" && (s = new ResizeObserver(c), s.observe(n)), e(() => {
4476
+ s?.disconnect(), s = null, r.unregisterToolbar(a);
4477
+ });
4478
+ }), S(() => r.unregisterToolbar(t.position));
4479
+ let c = n(() => {
4480
+ switch (t.position) {
4481
+ case "top": return {
4482
+ top: "0px",
4483
+ left: "0px",
4484
+ right: "0px"
4485
+ };
4486
+ case "bottom": return {
4487
+ bottom: "0px",
4488
+ left: "0px",
4489
+ right: "0px"
4490
+ };
4491
+ case "left": return {
4492
+ insetInlineStart: "0px",
4493
+ top: `${r.insets.top}px`,
4494
+ bottom: `${r.insets.bottom}px`
4495
+ };
4496
+ default: return {
4497
+ insetInlineEnd: "0px",
4498
+ top: `${r.insets.top}px`,
4499
+ bottom: `${r.insets.bottom}px`
4500
+ };
4501
+ }
4502
+ }), l = n(() => t.buttonSize == null ? {} : { "--vdd-panel-toolbar-btn-size": `${t.buttonSize}px` });
4503
+ return (t, n) => (T(), a("div", {
4504
+ ref_key: "el",
4505
+ ref: i,
4506
+ class: y(["vdd-panel-toolbar", `vdd-panel-toolbar--${e.position}`]),
4507
+ "data-variant": e.variant,
4508
+ "data-btn-variant": e.buttonVariant,
4509
+ "data-vdd-panel-toolbar": e.position,
4510
+ style: x({
4511
+ ...c.value,
4512
+ ...l.value
4513
+ }),
4514
+ role: "toolbar",
4515
+ "aria-orientation": o.value ? "horizontal" : "vertical"
4516
+ }, [j(t.$slots, "default")], 14, gi));
4517
+ }
4518
+ }), vi = [
4519
+ "title",
4520
+ "aria-label",
4521
+ "disabled",
4522
+ "data-variant"
4523
+ ], yi = /* @__PURE__ */ u({
4524
+ __name: "VddToolbarButton",
4525
+ props: {
4526
+ title: {},
4527
+ disabled: { type: Boolean },
4528
+ variant: {}
4529
+ },
4530
+ emits: ["click"],
4531
+ setup(e, { emit: t }) {
4532
+ let n = t;
4533
+ return (t, r) => (T(), a("button", {
4534
+ type: "button",
4535
+ class: "vdd-panel-toolbar-btn",
4536
+ title: e.title,
4537
+ "aria-label": e.title,
4538
+ disabled: e.disabled,
4539
+ "data-variant": e.variant,
4540
+ onClick: r[0] ||= (e) => n("click")
4541
+ }, [j(t.$slots, "default")], 8, vi));
4542
+ }
4543
+ }), bi = [
4544
+ "title",
4545
+ "aria-label",
4546
+ "aria-pressed",
4547
+ "disabled",
4548
+ "data-variant"
4549
+ ], xi = /* @__PURE__ */ u({
4550
+ __name: "VddToolbarToggle",
4551
+ props: /*@__PURE__*/ g({
4552
+ title: {},
4553
+ disabled: { type: Boolean },
4554
+ variant: {}
4555
+ }, {
4556
+ active: {
4557
+ type: Boolean,
4558
+ default: !1
4559
+ },
4560
+ activeModifiers: {}
4561
+ }),
4562
+ emits: ["update:active"],
4563
+ setup(e) {
4564
+ let t = B(e, "active");
4565
+ return (n, r) => (T(), a("button", {
4566
+ type: "button",
4567
+ class: y(["vdd-panel-toolbar-btn", { "vdd-panel-toolbar-btn--active": t.value }]),
4568
+ title: e.title,
4569
+ "aria-label": e.title,
4570
+ "aria-pressed": t.value,
4571
+ disabled: e.disabled,
4572
+ "data-variant": e.variant,
4573
+ onClick: r[0] ||= (e) => t.value = !t.value
4574
+ }, [j(n.$slots, "default")], 10, bi));
4575
+ }
4576
+ }), Si = {
4577
+ class: "vdd-panel-toolbar__sep",
4578
+ "aria-hidden": "true"
4579
+ }, Ci = /* @__PURE__ */ u({
4580
+ __name: "VddToolbarSeparator",
4581
+ setup(e) {
4582
+ return (e, t) => (T(), a("span", Si));
4583
+ }
4584
+ }), wi = {
4585
+ class: "vdd-panel-toolbar__spacer",
4586
+ "aria-hidden": "true"
4587
+ }, Ti = /* @__PURE__ */ u({
4588
+ __name: "VddToolbarSpacer",
4589
+ setup(e) {
4590
+ return (e, t) => (T(), a("span", wi));
4591
+ }
4592
+ }), Ei = { class: "vdd-panel-toolbar__item" }, Di = /* @__PURE__ */ u({
4593
+ __name: "VddToolbarItem",
4594
+ setup(e) {
4595
+ return (e, t) => (T(), a("span", Ei, [j(e.$slots, "default")]));
4596
+ }
4597
+ }), Oi = { class: "vdd-panel-toolbar__center" }, ki = /* @__PURE__ */ u({
4598
+ __name: "VddToolbarCenter",
4599
+ setup(e) {
4600
+ return (e, t) => (T(), a("div", Oi, [j(e.$slots, "default")]));
4601
+ }
4602
+ }), Ai = ["title", "aria-label"], ji = ["placeholder"], Mi = {
4603
+ key: 0,
4604
+ class: "vdd-panel-toolbar-search__group"
4605
+ }, Ni = ["data-vdd-search-result", "onClick"], Pi = {
4606
+ key: 0,
4607
+ class: "vdd-panel-toolbar-search__item-icon"
4608
+ }, Fi = { class: "vdd-panel-toolbar-search__item-label" }, Ii = {
4609
+ key: 1,
4610
+ class: "vdd-panel-toolbar-search__item-desc"
4611
+ }, Li = /* @__PURE__ */ u({
4612
+ __name: "VddToolbarSearch",
4613
+ props: {
4614
+ placeholder: {},
4615
+ search: {},
4616
+ debounce: { default: 300 }
4617
+ },
4618
+ emits: ["select"],
4619
+ setup(s, { emit: c }) {
4620
+ let l = s, u = c, d = J(), f = V("root"), p = V("input"), m = k(!1), h = k(""), g = k([]), _ = k(null), b = null, C = null;
4621
+ function w() {
4622
+ b?.abort(), b = null, C &&= (clearTimeout(C), null);
4623
+ }
4624
+ async function E() {
4625
+ m.value = !0, await v(), p.value?.focus({ preventScroll: !0 });
4626
+ }
4627
+ function D() {
4628
+ m.value = !1, h.value = "", g.value = [], _.value = null, w();
4629
+ }
4630
+ function O() {
4631
+ let e = f.value;
4632
+ if (!e || g.value.length === 0) {
4633
+ _.value = null;
4634
+ return;
4635
+ }
4636
+ let t = e.getBoundingClientRect(), n = Math.max(t.width, 240), r = Math.min(t.left, window.innerWidth - n - 8);
4637
+ _.value = {
4638
+ top: t.bottom + 4,
4639
+ left: Math.max(8, r),
4640
+ width: n
4641
+ };
4642
+ }
4643
+ function j() {
4644
+ if (w(), !h.value.trim()) {
4645
+ g.value = [], _.value = null;
4646
+ return;
4647
+ }
4648
+ C = setTimeout(async () => {
4649
+ let e = new AbortController();
4650
+ b = e;
4651
+ try {
4652
+ let t = await l.search(h.value, e.signal);
4653
+ if (e.signal.aborted) return;
4654
+ g.value = t, O();
4655
+ } catch {}
4656
+ }, l.debounce);
4657
+ }
4658
+ function M(e) {
4659
+ u("select", e), D();
4660
+ }
4661
+ function P(e) {
4662
+ let t = e.relatedTarget;
4663
+ t instanceof Node && f.value?.contains(t) || D();
4664
+ }
4665
+ let F = n(() => {
4666
+ let e = /* @__PURE__ */ new Map();
4667
+ for (let t of g.value) {
4668
+ let n = t.group ?? "", r = e.get(n);
4669
+ r ? r.push(t) : e.set(n, [t]);
4670
+ }
4671
+ return Array.from(e, ([e, t]) => ({
4672
+ group: e,
4673
+ items: t
4674
+ }));
4675
+ });
4676
+ return S(w), (n, c) => (T(), a("div", {
4677
+ ref_key: "root",
4678
+ ref: f,
4679
+ class: y(["vdd-panel-toolbar-search", { "vdd-panel-toolbar-search--open": m.value }]),
4680
+ "data-vdd-toolbar-search": "",
4681
+ onFocusout: P
4682
+ }, [
4683
+ o("button", {
4684
+ type: "button",
4685
+ class: "vdd-panel-toolbar-btn",
4686
+ title: z(d).format(z(d).messages.search),
4687
+ "aria-label": z(d).format(z(d).messages.search),
4688
+ "data-vdd-search-toggle": "",
4689
+ onClick: c[0] ||= (e) => m.value ? D() : E()
4690
+ }, [...c[3] ||= [o("svg", {
4691
+ width: "14",
4692
+ height: "14",
4693
+ viewBox: "0 0 16 16",
4694
+ fill: "none",
4695
+ stroke: "currentColor",
4696
+ "stroke-width": "1.5",
4697
+ "stroke-linecap": "round",
4698
+ "stroke-linejoin": "round"
4699
+ }, [o("circle", {
4700
+ cx: "6.5",
4701
+ cy: "6.5",
4702
+ r: "4.5"
4703
+ }), o("line", {
4704
+ x1: "10",
4705
+ y1: "10",
4706
+ x2: "14",
4707
+ y2: "14"
4708
+ })], -1)]], 8, Ai),
4709
+ m.value ? re((T(), a("input", {
4710
+ key: 0,
4711
+ ref_key: "input",
4712
+ ref: p,
4713
+ "onUpdate:modelValue": c[1] ||= (e) => h.value = e,
4714
+ class: "vdd-panel-toolbar-search__input",
4715
+ type: "text",
4716
+ placeholder: s.placeholder ?? z(d).format(z(d).messages.search),
4717
+ autocomplete: "off",
4718
+ "data-vdd-search-input": "",
4719
+ onInput: j,
4720
+ onKeydown: ie(D, ["esc"])
4721
+ }, null, 40, ji)), [[te, h.value]]) : i("", !0),
4722
+ _.value && g.value.length ? (T(), r(t, {
4723
+ key: 1,
4724
+ to: "body"
4725
+ }, [o("div", {
4726
+ class: "vdd-panel-toolbar-search__dropdown",
4727
+ style: x({
4728
+ position: "fixed",
4729
+ top: `${_.value.top}px`,
4730
+ left: `${_.value.left}px`,
4731
+ width: `${_.value.width}px`
4732
+ }),
4733
+ "data-vdd-search-results": "",
4734
+ onMousedown: c[2] ||= W(() => {}, ["prevent"])
4735
+ }, [(T(!0), a(e, null, A(F.value, ({ group: t, items: n }) => (T(), a(e, { key: t || "__default__" }, [t ? (T(), a("div", Mi, I(t), 1)) : i("", !0), (T(!0), a(e, null, A(n, (e) => (T(), a("button", {
4736
+ key: e.id,
4737
+ type: "button",
4738
+ class: "vdd-panel-toolbar-search__item",
4739
+ "data-vdd-search-result": e.id,
4740
+ onClick: (t) => M(e)
4741
+ }, [
4742
+ e.icon ? (T(), a("span", Pi, [(T(), r(N(e.icon)))])) : i("", !0),
4743
+ o("span", Fi, I(e.label), 1),
4744
+ e.description ? (T(), a("span", Ii, I(e.description), 1)) : i("", !0)
4745
+ ], 8, Ni))), 128))], 64))), 128))], 36)])) : i("", !0)
4746
+ ], 34));
4747
+ }
4748
+ });
4749
+ //#endregion
4750
+ //#region src/composables/useContextMenu.ts
4751
+ function Ri() {
4752
+ let e = J();
4753
+ return (t) => e.showContextMenu(t);
4754
+ }
4755
+ function zi(e) {
4756
+ let t = J(), { id: n } = kt();
4757
+ if (n === "standalone") {
4758
+ process.env.NODE_ENV !== "production" && console.warn("[vue-dockable-desktop] usePanelContextMenu() was called outside a panel, so it did nothing. This is expected when a panel component is rendered standalone.");
4759
+ return;
4760
+ }
4761
+ let r = t.registerPanelMenu(n, e);
4762
+ d() && w(r);
4763
+ }
4764
+ //#endregion
4765
+ //#region src/composables/useSidebar.ts
4766
+ function Bi() {
4767
+ let e = p(Vn, null);
4768
+ if (!e) throw Error("[vue-dockable-desktop] useSidebar() must be used inside a <VddSidebar>.");
4769
+ return e;
4770
+ }
4771
+ function Vi() {
4772
+ let e = p(Hn, null);
4773
+ if (!e) throw Error("[vue-dockable-desktop] useSidebarTab() must be used inside a sidebar tab's content.");
4774
+ return e;
4775
+ }
4776
+ //#endregion
4777
+ //#region src/composables/useToolbar.ts
4778
+ function Hi() {
4779
+ return J().toolbar;
4780
+ }
4781
+ //#endregion
4782
+ //#region src/composables/useOverlays.ts
4783
+ function Ui() {
4784
+ let { overlays: e } = J();
4785
+ return {
4786
+ stack: n(() => e.state.modals),
4787
+ topmost: n(() => e.state.modals[e.state.modals.length - 1] ?? null),
4788
+ open: e.openModal,
4789
+ close: (t, n) => e.requestClose(t, n),
4790
+ closeAll: e.closeAllModals
4791
+ };
4792
+ }
4793
+ function Wi() {
4794
+ let { overlays: e } = J();
4795
+ return {
4796
+ left: n(() => e.state.leftPanel),
4797
+ right: n(() => e.state.rightPanel),
4798
+ openLeft: e.openLeftPanel,
4799
+ openRight: e.openRightPanel,
4800
+ close: (t, n) => e.requestClose(t, n),
4801
+ closeAll: () => {
4802
+ for (let t of [e.state.leftPanel, e.state.rightPanel]) t && e.close(t.id);
4803
+ }
4804
+ };
4805
+ }
4806
+ //#endregion
4807
+ //#region src/composables/useContributions.ts
4808
+ function Gi(e) {
4809
+ let t = J(), { id: n } = kt();
4810
+ if (n === "standalone") {
4811
+ process.env.NODE_ENV !== "production" && console.warn("[vue-dockable-desktop] usePanelContribution() was called outside a panel, so it did nothing. This is expected when a panel component is rendered standalone.");
4812
+ return;
4813
+ }
4814
+ let r = t.contributions.publish(n, R(e)), i = H(() => R(e), (e) => {
4815
+ let i = r;
4816
+ r = t.contributions.publish(n, e), i();
4817
+ }, { deep: !0 });
4818
+ d() && w(() => {
4819
+ i(), r();
4820
+ });
4821
+ }
4822
+ function Ki() {
4823
+ return J().activeContribution;
4824
+ }
4825
+ function qi(e) {
4826
+ let t = Ki();
4827
+ return n(() => Re(R(e), t.value));
4828
+ }
4829
+ function Ji(e, t) {
4830
+ let r = Ki();
4831
+ return n(() => ze(R(e), r.value, t));
4832
+ }
4833
+ //#endregion
4834
+ //#region src/composables/useColorScheme.ts
4835
+ var Yi = () => document.documentElement.getAttribute("data-color-scheme") === "light" ? "light" : "dark";
4836
+ function Xi() {
4837
+ let e = k(Yi()), t = new MutationObserver(() => {
4838
+ e.value = Yi();
4839
+ });
4840
+ return t.observe(document.documentElement, {
4841
+ attributes: !0,
4842
+ attributeFilter: ["data-color-scheme"]
4843
+ }), w(() => t.disconnect()), n(() => e.value);
4844
+ }
4845
+ //#endregion
4846
+ //#region src/index.ts
4847
+ var Zi = "1.0.0";
4848
+ //#endregion
4849
+ export { we as PanelRegistry, Ar as VddConfirm, In as VddContextMenu, vn as VddDesktop, pi as VddFloatingWidget, jr as VddModals, hi as VddPanelOverlay, _i as VddPanelToolbar, rr as VddSecondarySidebar, Tr as VddSidePanels, nr as VddSidebar, Gr as VddToasts, yr as VddToolbar, yi as VddToolbarButton, ki as VddToolbarCenter, Di as VddToolbarItem, Li as VddToolbarSearch, Ci as VddToolbarSeparator, Ti as VddToolbarSpacer, xi as VddToolbarToggle, He as WORKSPACE_KEY, Ge as clampFloatingRect, at as computeResizedRect, Ue as createWorkspace, Ae as defaultMessages, je as formatLabel, Ce as isSerializable, ze as mergeSidebarTabs, Re as mergeToolbarItems, Lr as resetToasts, Le as sectionToTab, Y as startPointerDrag, Ir as toast, Ki as useActiveContribution, Xi as useColorScheme, Ri as useContextMenu, oi as useFloatingWidgets, Ji as useMergedSidebarTabs, qi as useMergedToolbarItems, Ui as useModals, kt as usePanel, zi as usePanelContextMenu, Gi as usePanelContribution, Wi as useSidePanels, Bi as useSidebar, Vi as useSidebarTab, Hi as useToolbar, J as useWorkspace, Zi as version };
4850
+
4851
+ //# sourceMappingURL=index.js.map