@floegence/floe-webapp-core 0.36.18 → 0.36.19

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.
@@ -1,231 +1,323 @@
1
- import { insert as c, createComponent as a, Portal as v, addEventListener as w, effect as h, className as k, setAttribute as p, template as g, delegateEvents as W } from "solid-js/web";
2
- import { createEffect as s, onCleanup as u, Show as b } from "solid-js";
3
- import { isTypingElement as C } from "../../utils/dom.js";
4
- import { clientToCanvasWorld as A } from "../ui/canvasGeometry.js";
5
- import { WorkbenchCanvas as D } from "./WorkbenchCanvas.js";
6
- import { WorkbenchContextMenu as y } from "./WorkbenchContextMenu.js";
7
- import { WorkbenchFilterBar as S } from "./WorkbenchFilterBar.js";
8
- import { WorkbenchHud as x } from "./WorkbenchHud.js";
9
- import { WorkbenchLockButton as M } from "./WorkbenchLockButton.js";
10
- import { installWorkbenchContextMenuDismissListeners as F } from "./workbenchContextMenuDismiss.js";
11
- import { useWorkbenchModel as R } from "./useWorkbenchModel.js";
12
- var T = /* @__PURE__ */ g("<div class=workbench-menu-backdrop data-floe-workbench-boundary=true>"), L = /* @__PURE__ */ g("<div><div class=workbench-surface__body data-floe-workbench-canvas-frame=true>");
13
- const E = "F1";
14
- function H(i) {
15
- const e = R({
1
+ import { use as L, spread as O, mergeProps as T, insert as g, createComponent as d, Portal as _, addEventListener as B, template as S, delegateEvents as q } from "solid-js/web";
2
+ import { createSignal as y, createMemo as m, untrack as h, createEffect as f, onCleanup as v, Show as z } from "solid-js";
3
+ import { clientToCanvasWorld as $ } from "../ui/canvasGeometry.js";
4
+ import { WorkbenchCanvas as V } from "./WorkbenchCanvas.js";
5
+ import { WorkbenchContextMenu as N } from "./WorkbenchContextMenu.js";
6
+ import { WorkbenchFilterBar as P } from "./WorkbenchFilterBar.js";
7
+ import { WorkbenchHud as X } from "./WorkbenchHud.js";
8
+ import { WorkbenchLockButton as Y } from "./WorkbenchLockButton.js";
9
+ import { installWorkbenchContextMenuDismissListeners as H } from "./workbenchContextMenuDismiss.js";
10
+ import { useWorkbenchModel as K } from "./useWorkbenchModel.js";
11
+ import { resolveWorkbenchInteractionAdapter as U } from "./workbenchInteractionAdapter.js";
12
+ var Z = /* @__PURE__ */ S("<div class=workbench-menu-backdrop data-floe-workbench-boundary=true>"), G = /* @__PURE__ */ S("<div><div class=workbench-surface__body data-floe-workbench-canvas-frame=true>");
13
+ const j = "F1";
14
+ function ue(i) {
15
+ const t = K({
16
16
  state: () => i.state(),
17
- setState: (t) => i.setState(t),
17
+ setState: (e) => i.setState(e),
18
18
  widgetDefinitions: () => i.widgetDefinitions,
19
19
  onClose: () => {
20
20
  }
21
- });
22
- s(() => {
21
+ }), [u, A] = y(null), a = m(() => U(i.interactionAdapter)), [W, w] = y(h(() => a().createInitialInputOwner())), p = m(() => {
22
+ const e = i.launcherWidgetTypes;
23
+ return !e || e.length <= 0 ? null : new Set(e);
24
+ }), I = m(() => {
25
+ const e = t.widgetDefinitions(), n = p();
26
+ return n ? e.filter((r) => n.has(r.type)) : e;
27
+ }), D = m(() => {
28
+ const e = t.contextMenu.items(), n = p();
29
+ return n ? e.filter((r) => {
30
+ if (r.kind !== "action")
31
+ return !0;
32
+ const o = /^add-(.+)$/.exec(String(r.id ?? ""));
33
+ return o ? n.has(o[1]) : !0;
34
+ }) : e;
35
+ }), k = (e, n, r) => {
36
+ const o = a(), c = o.findWidgetRoot(e), s = o.readWidgetId(c);
37
+ if (s) {
38
+ w(o.createWidgetInputOwner(s, n));
39
+ return;
40
+ }
41
+ const b = u();
42
+ b && e instanceof Node && b.contains(e) && w(o.createCanvasInputOwner(r));
43
+ }, x = () => {
44
+ const e = u()?.querySelector('[data-floe-workbench-canvas-frame="true"]'), n = t.viewport(), r = e?.getBoundingClientRect(), o = r?.width ?? 0, c = r?.height ?? 0;
45
+ return {
46
+ worldX: o > 0 ? (o / 2 - n.x) / n.scale : 240,
47
+ worldY: c > 0 ? (c / 2 - n.y) / n.scale : 180
48
+ };
49
+ }, l = (e) => {
50
+ const n = h(a), r = h(u);
51
+ queueMicrotask(() => {
52
+ n.focusWidgetElement(r, e), w(n.createWidgetInputOwner(e, "activation"));
53
+ });
54
+ }, M = (e) => {
55
+ const n = t.navigation.fitWidget(e);
56
+ l(n.id);
57
+ }, R = (e) => {
58
+ const n = t.navigation.overviewWidget(e);
59
+ l(n.id);
60
+ };
61
+ f(() => {
23
62
  i.onApiReady?.({
24
- ensureWidget: (t, r) => e.widgetActions.ensureWidget(t, r) ?? null,
25
- clearSelection: () => e.selection.clear(),
26
- focusWidget: (t, r) => e.navigation.focusWidget(t, r),
27
- fitWidget: (t) => e.navigation.fitWidget(t),
28
- overviewWidget: (t) => e.navigation.overviewWidget(t),
29
- findWidgetByType: (t) => e.queries.findWidgetByType(t)
30
- }), u(() => {
63
+ ensureWidget: (e, n) => t.widgetActions.ensureWidget(e, n) ?? null,
64
+ createWidget: (e, n) => {
65
+ const r = x(), o = t.widgetActions.addWidgetAtCursor(e, n?.worldX ?? r.worldX, n?.worldY ?? r.worldY) ?? null;
66
+ return o && n?.centerViewport !== !1 && t.navigation.centerOnWidget(o), o;
67
+ },
68
+ clearSelection: () => t.selection.clear(),
69
+ focusWidget: (e, n) => {
70
+ const r = t.navigation.focusWidget(e, n);
71
+ return l(r.id), r;
72
+ },
73
+ fitWidget: (e) => {
74
+ const n = t.navigation.fitWidget(e);
75
+ return l(n.id), n;
76
+ },
77
+ overviewWidget: (e) => {
78
+ const n = t.navigation.overviewWidget(e);
79
+ return l(n.id), n;
80
+ },
81
+ findWidgetByType: (e) => t.queries.findWidgetByType(e),
82
+ findWidgetById: (e) => t.queries.findWidgetById(e),
83
+ updateWidgetTitle: (e, n) => {
84
+ const r = String(e ?? "").trim(), o = String(n ?? "").trim();
85
+ !r || !o || i.setState((c) => ({
86
+ ...c,
87
+ widgets: c.widgets.map((s) => s.id === r && s.title !== o ? {
88
+ ...s,
89
+ title: o
90
+ } : s)
91
+ }));
92
+ }
93
+ }), v(() => {
31
94
  i.onApiReady?.(null);
32
95
  });
33
96
  });
34
- const l = () => i.lockShortcut === void 0 ? E : i.lockShortcut;
35
- s(() => {
36
- if (typeof window > "u" || !e.contextMenu.state()) return;
37
- const t = F({
97
+ const C = () => i.lockShortcut === void 0 ? j : i.lockShortcut;
98
+ f(() => {
99
+ if (typeof window > "u" || !t.contextMenu.state()) return;
100
+ const e = H({
38
101
  ownerWindow: window,
39
- onDismiss: e.contextMenu.close
102
+ onDismiss: t.contextMenu.close
103
+ });
104
+ v(() => e());
105
+ }), f(() => {
106
+ const e = W();
107
+ if (e.kind !== "widget") return;
108
+ t.widgets().some((r) => r.id === e.widgetId) || w(a().createCanvasInputOwner("widget_removed"));
109
+ }), f(() => {
110
+ const e = u();
111
+ if (!e) return;
112
+ const n = (o) => {
113
+ k(o.target, "pointer", "background_pointer");
114
+ }, r = (o) => {
115
+ k(o.target, "focus", "background_focus");
116
+ };
117
+ e.addEventListener("pointerdown", n, !0), e.addEventListener("focusin", r), v(() => {
118
+ e.removeEventListener("pointerdown", n, !0), e.removeEventListener("focusin", r);
40
119
  });
41
- u(() => t());
42
- }), s(() => {
120
+ }), f(() => {
43
121
  if (i.enableKeyboard === !1 || typeof document > "u") return;
44
- const t = l(), r = (n) => {
45
- if (n.defaultPrevented || n.isComposing) return;
46
- if (t !== null && n.key === t) {
47
- n.preventDefault(), e.lock.toggle();
48
- return;
49
- }
50
- const o = n.target;
51
- if (!(o instanceof Element && C(o)))
52
- switch (n.key) {
53
- case "ArrowUp":
54
- n.preventDefault(), e.navigation.handleArrowNavigation("up");
55
- break;
56
- case "ArrowDown":
57
- n.preventDefault(), e.navigation.handleArrowNavigation("down");
58
- break;
59
- case "ArrowLeft":
60
- n.preventDefault(), e.navigation.handleArrowNavigation("left");
61
- break;
62
- case "ArrowRight":
63
- n.preventDefault(), e.navigation.handleArrowNavigation("right");
64
- break;
65
- case "Delete":
66
- case "Backspace":
67
- e.selectedWidgetId() && (n.preventDefault(), e.widgetActions.deleteSelected());
68
- break;
122
+ const e = C(), n = (r) => {
123
+ if (!(r.defaultPrevented || r.isComposing)) {
124
+ if (e !== null && r.key === e) {
125
+ r.preventDefault(), t.lock.toggle();
126
+ return;
69
127
  }
128
+ if (!a().shouldBypassGlobalHotkeys({
129
+ root: u(),
130
+ target: r.target,
131
+ owner: W(),
132
+ interactiveSelector: a().interactiveSelector
133
+ }))
134
+ switch (r.key) {
135
+ case "ArrowUp":
136
+ r.preventDefault(), t.navigation.handleArrowNavigation("up");
137
+ break;
138
+ case "ArrowDown":
139
+ r.preventDefault(), t.navigation.handleArrowNavigation("down");
140
+ break;
141
+ case "ArrowLeft":
142
+ r.preventDefault(), t.navigation.handleArrowNavigation("left");
143
+ break;
144
+ case "ArrowRight":
145
+ r.preventDefault(), t.navigation.handleArrowNavigation("right");
146
+ break;
147
+ case "Delete":
148
+ case "Backspace":
149
+ t.selectedWidgetId() && (r.preventDefault(), t.widgetActions.deleteSelected());
150
+ break;
151
+ }
152
+ }
70
153
  };
71
- document.addEventListener("keydown", r, !0), u(() => document.removeEventListener("keydown", r, !0));
154
+ document.addEventListener("keydown", n, !0), v(() => document.removeEventListener("keydown", n, !0));
72
155
  });
73
- const m = (t, r) => {
74
- const n = document.querySelector('[data-floe-workbench-canvas-frame="true"]');
75
- if (!n) return null;
76
- const o = n.getBoundingClientRect();
77
- return A(o, e.viewport(), {
78
- clientX: t,
79
- clientY: r
156
+ const E = (e, n) => {
157
+ const r = u()?.querySelector('[data-floe-workbench-canvas-frame="true"]');
158
+ if (!r) return null;
159
+ const o = r.getBoundingClientRect();
160
+ return $(o, t.viewport(), {
161
+ clientX: e,
162
+ clientY: n
80
163
  });
81
- }, f = (t, r, n) => {
82
- const o = m(r, n);
83
- o && e.widgetActions.addWidgetAtCursor(t, o.worldX, o.worldY);
164
+ }, F = (e, n, r) => {
165
+ const o = E(n, r);
166
+ o && t.widgetActions.addWidgetAtCursor(e, o.worldX, o.worldY);
84
167
  };
85
168
  return (() => {
86
- var t = L(), r = t.firstChild;
87
- return c(r, a(D, {
169
+ var e = G(), n = e.firstChild;
170
+ return L(A, e), O(e, T({
171
+ get class() {
172
+ return `workbench-surface${i.class ? ` ${i.class}` : ""}`;
173
+ }
174
+ }, () => ({
175
+ [a().surfaceRootAttr]: "true"
176
+ }), {
177
+ get "data-workbench-theme"() {
178
+ return t.theme();
179
+ }
180
+ }), !1, !0), g(n, d(V, {
88
181
  get widgetDefinitions() {
89
- return e.widgetDefinitions();
182
+ return t.widgetDefinitions();
90
183
  },
91
184
  get widgets() {
92
- return e.widgets();
185
+ return t.widgets();
93
186
  },
94
187
  get viewport() {
95
- return e.viewport();
188
+ return t.viewport();
96
189
  },
97
190
  get canvasFrameSize() {
98
- return e.canvasFrameSize();
191
+ return t.canvasFrameSize();
99
192
  },
100
193
  get selectedWidgetId() {
101
- return e.selectedWidgetId();
194
+ return t.selectedWidgetId();
102
195
  },
103
196
  get optimisticFrontWidgetId() {
104
- return e.optimisticFrontWidgetId();
197
+ return t.optimisticFrontWidgetId();
105
198
  },
106
199
  get locked() {
107
- return e.locked();
200
+ return t.locked();
108
201
  },
109
202
  get filters() {
110
- return e.filters();
203
+ return t.filters();
204
+ },
205
+ get interactionAdapter() {
206
+ return a();
111
207
  },
112
208
  get setCanvasFrameRef() {
113
- return e.setCanvasFrameRef;
209
+ return t.setCanvasFrameRef;
114
210
  },
115
211
  get onViewportCommit() {
116
- return e.canvas.commitViewport;
212
+ return t.canvas.commitViewport;
117
213
  },
118
214
  get onViewportInteractionStart() {
119
- return e.canvas.cancelViewportNavigation;
215
+ return t.canvas.cancelViewportNavigation;
120
216
  },
121
217
  get onCanvasContextMenu() {
122
- return e.canvas.openCanvasContextMenu;
218
+ return t.canvas.openCanvasContextMenu;
123
219
  },
124
220
  get onCanvasPointerDown() {
125
- return e.selection.clear;
221
+ return t.selection.clear;
126
222
  },
127
223
  get onSelectWidget() {
128
- return e.canvas.selectWidget;
224
+ return t.canvas.selectWidget;
129
225
  },
130
226
  get onWidgetContextMenu() {
131
- return e.canvas.openWidgetContextMenu;
227
+ return t.canvas.openWidgetContextMenu;
132
228
  },
133
229
  get onStartOptimisticFront() {
134
- return e.canvas.startOptimisticFront;
230
+ return t.canvas.startOptimisticFront;
135
231
  },
136
232
  get onCommitFront() {
137
- return e.canvas.commitFront;
233
+ return t.canvas.commitFront;
138
234
  },
139
235
  get onCommitMove() {
140
- return e.canvas.commitMove;
236
+ return t.canvas.commitMove;
141
237
  },
142
238
  get onCommitResize() {
143
- return e.canvas.commitResize;
239
+ return t.canvas.commitResize;
144
240
  },
145
- get onRequestOverview() {
146
- return e.navigation.overviewWidget;
241
+ onRequestOverview: R,
242
+ onRequestFit: M,
243
+ get onRequestDelete() {
244
+ return i.onRequestDelete ?? t.widgetActions.deleteWidget;
147
245
  },
148
- get onRequestFit() {
149
- return e.navigation.fitWidget;
246
+ get onLayoutInteractionStart() {
247
+ return i.onLayoutInteractionStart;
150
248
  },
151
- get onRequestDelete() {
152
- return e.widgetActions.deleteWidget;
249
+ get onLayoutInteractionEnd() {
250
+ return i.onLayoutInteractionEnd;
153
251
  }
154
- })), c(t, a(M, {
252
+ })), g(e, d(Y, {
155
253
  get locked() {
156
- return e.locked();
254
+ return t.locked();
157
255
  },
158
256
  get onToggle() {
159
- return e.lock.toggle;
257
+ return t.lock.toggle;
160
258
  },
161
259
  get shortcutLabel() {
162
- return l() ?? void 0;
260
+ return C() ?? void 0;
163
261
  }
164
- }), null), c(t, a(S, {
262
+ }), null), g(e, d(P, {
165
263
  get widgetDefinitions() {
166
- return e.widgetDefinitions();
264
+ return I();
167
265
  },
168
266
  get widgets() {
169
- return e.widgets();
267
+ return t.widgets();
170
268
  },
171
269
  get filters() {
172
- return e.filters();
270
+ return t.filters();
173
271
  },
174
272
  get onSoloFilter() {
175
- return e.filter.solo;
273
+ return t.filter.solo;
176
274
  },
177
275
  get onShowAll() {
178
- return e.filter.showAll;
276
+ return t.filter.showAll;
179
277
  },
180
- onCreateAt: f
181
- }), null), c(t, a(x, {
278
+ onCreateAt: F
279
+ }), null), g(e, d(X, {
182
280
  get scaleLabel() {
183
- return e.scaleLabel();
281
+ return t.scaleLabel();
184
282
  },
185
283
  get onZoomOut() {
186
- return e.hud.zoomOut;
284
+ return t.hud.zoomOut;
187
285
  },
188
286
  get onZoomIn() {
189
- return e.hud.zoomIn;
287
+ return t.hud.zoomIn;
190
288
  },
191
289
  get activeTheme() {
192
- return e.theme();
290
+ return t.theme();
193
291
  },
194
- onSelectTheme: (n) => e.appearance.setTheme(n)
195
- }), null), c(t, a(b, {
292
+ onSelectTheme: (r) => t.appearance.setTheme(r)
293
+ }), null), g(e, d(z, {
196
294
  get when() {
197
- return e.contextMenu.state();
295
+ return t.contextMenu.state();
198
296
  },
199
297
  get children() {
200
- return a(v, {
298
+ return d(_, {
201
299
  get children() {
202
300
  return [(() => {
203
- var n = T();
204
- return w(n, "contextmenu", e.contextMenu.retarget, !0), n;
205
- })(), a(y, {
301
+ var r = Z();
302
+ return B(r, "contextmenu", t.contextMenu.retarget, !0), r;
303
+ })(), d(N, {
206
304
  get x() {
207
- return e.contextMenu.position()?.left ?? 0;
305
+ return t.contextMenu.position()?.left ?? 0;
208
306
  },
209
307
  get y() {
210
- return e.contextMenu.position()?.top ?? 0;
308
+ return t.contextMenu.position()?.top ?? 0;
211
309
  },
212
310
  get items() {
213
- return e.contextMenu.items();
311
+ return D();
214
312
  }
215
313
  })];
216
314
  }
217
315
  });
218
316
  }
219
- }), null), h((n) => {
220
- var o = `workbench-surface${i.class ? ` ${i.class}` : ""}`, d = e.theme();
221
- return o !== n.e && k(t, n.e = o), d !== n.t && p(t, "data-workbench-theme", n.t = d), n;
222
- }, {
223
- e: void 0,
224
- t: void 0
225
- }), t;
317
+ }), null), e;
226
318
  })();
227
319
  }
228
- W(["contextmenu"]);
320
+ q(["contextmenu"]);
229
321
  export {
230
- H as WorkbenchSurface
322
+ ue as WorkbenchSurface
231
323
  };
@@ -1,5 +1,6 @@
1
1
  import { type JSX } from 'solid-js';
2
- import type { WorkbenchViewport, WorkbenchWidgetDefinition, WorkbenchWidgetItem, WorkbenchWidgetRenderMode, WorkbenchWidgetType } from './types';
2
+ import { type ResolvedWorkbenchInteractionAdapter } from './workbenchInteractionAdapter';
3
+ import type { WorkbenchViewport, WorkbenchInteractionAdapter, WorkbenchWidgetDefinition, WorkbenchWidgetItem, WorkbenchWidgetRenderMode, WorkbenchWidgetType } from './types';
3
4
  export interface WorkbenchWidgetProps {
4
5
  definition: WorkbenchWidgetDefinition;
5
6
  widgetId: string;
@@ -20,6 +21,7 @@ export interface WorkbenchWidgetProps {
20
21
  layoutMode?: WorkbenchWidgetRenderMode;
21
22
  projectedViewport?: WorkbenchViewport;
22
23
  surfaceReady?: boolean;
24
+ interactionAdapter?: WorkbenchInteractionAdapter | ResolvedWorkbenchInteractionAdapter;
23
25
  onSelect: (widgetId: string) => void;
24
26
  onContextMenu: (event: MouseEvent, item: WorkbenchWidgetItem) => void;
25
27
  onStartOptimisticFront: (widgetId: string) => void;
@@ -35,5 +37,7 @@ export interface WorkbenchWidgetProps {
35
37
  onRequestOverview: (item: WorkbenchWidgetItem) => void;
36
38
  onRequestFit: (item: WorkbenchWidgetItem) => void;
37
39
  onRequestDelete: (widgetId: string) => void;
40
+ onLayoutInteractionStart?: () => void;
41
+ onLayoutInteractionEnd?: () => void;
38
42
  }
39
43
  export declare function WorkbenchWidget(props: WorkbenchWidgetProps): JSX.Element;