@nuforge/editor 0.2.0 → 0.3.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.
- package/dist/index.cjs +190 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +252 -3
- package/dist/index.mjs +186 -1
- package/dist/index.mjs.map +1 -0
- package/dist/react.cjs +325 -3
- package/dist/react.cjs.map +1 -0
- package/dist/react.d.ts +205 -4
- package/dist/react.mjs +325 -4
- package/dist/react.mjs.map +1 -0
- package/package.json +5 -5
package/dist/react.mjs
CHANGED
|
@@ -1,9 +1,44 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { createViewElement, observer } from '@nuforge/react';
|
|
3
|
+
import { flatten } from '@nuforge/types';
|
|
3
4
|
import { createContext, memo, createElement, Fragment, useRef, useState, useEffect, useLayoutEffect, useContext } from 'react';
|
|
4
5
|
import { createPortal } from 'react-dom';
|
|
5
|
-
import '@nuforge/types';
|
|
6
6
|
|
|
7
|
+
/**
|
|
8
|
+
* Wire protocol for `RemoteCanvasHost` <-> `createCanvasReceiver`: a genuinely
|
|
9
|
+
* navigated `/canvas/[id]`-style iframe has its own JS realm, so state and
|
|
10
|
+
* interaction can't cross as direct object references the way `IframeCanvas`'s
|
|
11
|
+
* portal allows — everything here is a structured-clone-safe plain message.
|
|
12
|
+
*
|
|
13
|
+
* Deliberately generic: only the shapes the editor primitive itself needs
|
|
14
|
+
* (state sync, ready handshake, the core interaction events) are typed. Host
|
|
15
|
+
* concerns like theme/preview-mode/overrides ride through `CanvasUiMessage`'s
|
|
16
|
+
* opaque `payload` — this package relays it, never interprets it.
|
|
17
|
+
*/
|
|
18
|
+
const CANVAS_CHANNEL = 'nuforge-canvas';
|
|
19
|
+
const CANVAS_PROTOCOL_VERSION = 1;
|
|
20
|
+
/** Namespace the `BroadcastChannel` per canvas instance (derive from the
|
|
21
|
+
* iframe's own `src`, so a host never has to invent/track a separate id). */
|
|
22
|
+
function canvasChannelName(src) {
|
|
23
|
+
return `${CANVAS_CHANNEL}:${src}`;
|
|
24
|
+
}
|
|
25
|
+
/** Narrow an arbitrary `BroadcastChannel` payload to a message from this
|
|
26
|
+
* protocol — guards against unrelated traffic on the same channel name and
|
|
27
|
+
* against a version mismatch across a stale cached bundle. */
|
|
28
|
+
function isCanvasMessage(data) {
|
|
29
|
+
return (!!data &&
|
|
30
|
+
typeof data === 'object' &&
|
|
31
|
+
data.channel === CANVAS_CHANNEL &&
|
|
32
|
+
data.v === CANVAS_PROTOCOL_VERSION);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Compute a drop position from the pointer's Y against a target's bounding rect.
|
|
37
|
+
* When `allowInside` is set, the middle band is `inside` (drop as a child) and
|
|
38
|
+
* the outer bands are `before`/`after`; otherwise it's a simple before/after
|
|
39
|
+
* split at the midpoint. Pure — use it from an `onDragOver`/`onPointerMove`
|
|
40
|
+
* handler to drive a drop indicator and the eventual `moveNode`/`pasteNode`.
|
|
41
|
+
*/
|
|
7
42
|
function dropPositionFromPointer(clientY, rect, opts = {}) {
|
|
8
43
|
const ratio = rect.height > 0 ? (clientY - rect.top) / rect.height : 0;
|
|
9
44
|
if (opts.allowInside) {
|
|
@@ -16,6 +51,9 @@ function dropPositionFromPointer(clientY, rect, opts = {}) {
|
|
|
16
51
|
return ratio < 0.5 ? 'before' : 'after';
|
|
17
52
|
}
|
|
18
53
|
|
|
54
|
+
// Tag every rendered element with its template id so a canvas can map a clicked
|
|
55
|
+
// DOM node back to its source node. Covers external components too, so they're
|
|
56
|
+
// independently selectable/highlightable in the editor canvas.
|
|
19
57
|
const decorate = (view) => ({
|
|
20
58
|
'data-nu-id': view.template?.id,
|
|
21
59
|
});
|
|
@@ -24,6 +62,18 @@ const AMBIENT_CANVAS_WINDOW = {
|
|
|
24
62
|
window: typeof window === 'undefined' ? null : window,
|
|
25
63
|
};
|
|
26
64
|
const CanvasWindowContext = createContext(AMBIENT_CANVAS_WINDOW);
|
|
65
|
+
/**
|
|
66
|
+
* The real `window`/`document` a canvas-rendered element visually lives in.
|
|
67
|
+
* `IframeCanvas` portals its content into an `<iframe>`, but a portal only
|
|
68
|
+
* relocates DOM nodes — the JS building them still runs in the host page's
|
|
69
|
+
* realm. Any library that reads a bare `window`/`document` global (scroll
|
|
70
|
+
* listeners, `matchMedia`, `ResizeObserver`/`IntersectionObserver` defaults)
|
|
71
|
+
* silently ends up watching the HOST page, not the iframe the user actually
|
|
72
|
+
* sees and scrolls. Build refs/options from `useCanvasWindow()` instead of the
|
|
73
|
+
* ambient global so they resolve to the right realm — this works identically
|
|
74
|
+
* outside `IframeCanvas` too (e.g. `NuFrame`'s direct, non-iframe render),
|
|
75
|
+
* where it's just the ambient `window`/`document`.
|
|
76
|
+
*/
|
|
27
77
|
function useCanvasWindow() {
|
|
28
78
|
return useContext(CanvasWindowContext);
|
|
29
79
|
}
|
|
@@ -31,14 +81,17 @@ const EditorView = memo(function EditorView({ view, }) {
|
|
|
31
81
|
const renderChildren = (views) => views.map((child) => createElement(EditorView, { key: child.key, view: child }));
|
|
32
82
|
return createViewElement(view, renderChildren, decorate);
|
|
33
83
|
});
|
|
84
|
+
/** Reactive renderer for a frame, decorating each element with `data-nu-id`. */
|
|
34
85
|
const EditorFrame = observer(function EditorFrame({ frame }) {
|
|
35
86
|
return createElement(Fragment, null, frame.view.children.map((view) => createElement(EditorView, { key: view.key, view })));
|
|
36
87
|
});
|
|
88
|
+
/** Map a DOM node (or event target) back to its template id. */
|
|
37
89
|
function templateIdFromElement(target) {
|
|
38
90
|
return (target
|
|
39
91
|
?.closest('[data-nu-id]')
|
|
40
92
|
?.getAttribute('data-nu-id') ?? null);
|
|
41
93
|
}
|
|
94
|
+
/** Sensible default styling for the isolated canvas document. */
|
|
42
95
|
const DEFAULT_CANVAS_CSS = `
|
|
43
96
|
*, *::before, *::after { box-sizing: border-box; }
|
|
44
97
|
html, body { margin: 0; }
|
|
@@ -57,6 +110,13 @@ const DEFAULT_CANVAS_CSS = `
|
|
|
57
110
|
img { max-width: 100%; }
|
|
58
111
|
[data-nu-id] { cursor: default; }
|
|
59
112
|
`;
|
|
113
|
+
/**
|
|
114
|
+
* A style-isolated editor canvas: the frame is portaled into an `<iframe>` so
|
|
115
|
+
* the host's CSS can't leak into the preview (and vice-versa). Selection/hover
|
|
116
|
+
* use native capture listeners on the iframe document, so element handlers stay
|
|
117
|
+
* inert while editing. Selection/hover rects are computed (in a layout effect,
|
|
118
|
+
* after the iframe commits) and handed to `renderBox` for the overlay.
|
|
119
|
+
*/
|
|
60
120
|
function IframeCanvas({ frame, selectedId = null, hoveredId = null, revision = 0, previewMode = false, onSelect, onHover, onDropOnNode, baseCss = DEFAULT_CANVAS_CSS, srcDoc, className, containerClassName, renderBox, }) {
|
|
61
121
|
const iframeRef = useRef(null);
|
|
62
122
|
const [doc, setDoc] = useState(null);
|
|
@@ -91,6 +151,9 @@ function IframeCanvas({ frame, selectedId = null, hoveredId = null, revision = 0
|
|
|
91
151
|
if (!doc) {
|
|
92
152
|
return;
|
|
93
153
|
}
|
|
154
|
+
// In preview mode, only keep the scroll listener alive (so an overlay, if any
|
|
155
|
+
// lingers during a toggle, stays aligned). Skip the capturing click handler
|
|
156
|
+
// so element `onClick`s actually fire, and skip hover highlighting.
|
|
94
157
|
const onScroll = () => setTick((x) => x + 1);
|
|
95
158
|
doc.addEventListener('scroll', onScroll, true);
|
|
96
159
|
if (previewMode) {
|
|
@@ -113,6 +176,7 @@ function IframeCanvas({ frame, selectedId = null, hoveredId = null, revision = 0
|
|
|
113
176
|
doc.removeEventListener('scroll', onScroll, true);
|
|
114
177
|
};
|
|
115
178
|
}, [doc, previewMode, onSelect, onHover]);
|
|
179
|
+
// Drop-on-canvas: compute the drop target node + position from the pointer.
|
|
116
180
|
useEffect(() => {
|
|
117
181
|
if (!doc || !onDropOnNode || previewMode) {
|
|
118
182
|
return;
|
|
@@ -129,7 +193,7 @@ function IframeCanvas({ frame, selectedId = null, hoveredId = null, revision = 0
|
|
|
129
193
|
setDrop(null);
|
|
130
194
|
return;
|
|
131
195
|
}
|
|
132
|
-
e.preventDefault();
|
|
196
|
+
e.preventDefault(); // allow the drop
|
|
133
197
|
setDrop({
|
|
134
198
|
rect: { top: r.top, left: r.left, width: r.width, height: r.height },
|
|
135
199
|
position: dropPositionFromPointer(e.clientY, r, { allowInside: true }),
|
|
@@ -155,6 +219,8 @@ function IframeCanvas({ frame, selectedId = null, hoveredId = null, revision = 0
|
|
|
155
219
|
doc.removeEventListener('dragleave', onDragLeave);
|
|
156
220
|
};
|
|
157
221
|
}, [doc, onDropOnNode]);
|
|
222
|
+
// Recompute overlay rects when the iframe is resized (panel/device resize) or
|
|
223
|
+
// its content reflows — otherwise the selection box keeps a stale size.
|
|
158
224
|
useEffect(() => {
|
|
159
225
|
const iframe = iframeRef.current;
|
|
160
226
|
if (!iframe) {
|
|
@@ -167,6 +233,7 @@ function IframeCanvas({ frame, selectedId = null, hoveredId = null, revision = 0
|
|
|
167
233
|
}
|
|
168
234
|
return () => observer.disconnect();
|
|
169
235
|
}, [doc]);
|
|
236
|
+
// Drop-on-canvas indicator has no meaning while previewing.
|
|
170
237
|
useEffect(() => {
|
|
171
238
|
if (previewMode) {
|
|
172
239
|
setDrop(null);
|
|
@@ -203,7 +270,12 @@ function IframeCanvas({ frame, selectedId = null, hoveredId = null, revision = 0
|
|
|
203
270
|
}, [previewMode, selectedId, hoveredId, revision, tick, doc]);
|
|
204
271
|
return createElement('div', { className: containerClassName, style: { position: 'relative' } }, createElement('iframe', { ref: iframeRef, title: 'nuforge preview', className, srcDoc }, doc?.body
|
|
205
272
|
? createPortal(createElement(CanvasWindowContext.Provider, { value: { doc, window: doc.defaultView } }, createElement(EditorFrame, { frame })), doc.body)
|
|
206
|
-
: null),
|
|
273
|
+
: null),
|
|
274
|
+
// The overlay is fully yours: omit `renderBox` for none, or build borders,
|
|
275
|
+
// labels and action toolbars from the computed rects + selectedLabel. The
|
|
276
|
+
// container is pointer-events:none; set pointerEvents:'auto' on interactive
|
|
277
|
+
// bits (e.g. an action toolbar) so clicks land.
|
|
278
|
+
renderBox && !previewMode
|
|
207
279
|
? createElement('div', {
|
|
208
280
|
style: {
|
|
209
281
|
position: 'absolute',
|
|
@@ -214,16 +286,263 @@ function IframeCanvas({ frame, selectedId = null, hoveredId = null, revision = 0
|
|
|
214
286
|
}, renderBox({ selected, hovered, selectedLabel, drop }))
|
|
215
287
|
: null);
|
|
216
288
|
}
|
|
289
|
+
/**
|
|
290
|
+
* The `IframeCanvas` alternative for when a canvas needs its OWN genuine JS
|
|
291
|
+
* realm — e.g. so a third-party library reading bare `window`/`document` at
|
|
292
|
+
* module scope (an animation library's scroll-linked internals, a gesture
|
|
293
|
+
* library, ...) resolves against the canvas's real globals instead of
|
|
294
|
+
* silently binding to the host page's. A portal can't fix this (see
|
|
295
|
+
* `useCanvasWindow`'s docs for that half of the problem) because it only
|
|
296
|
+
* relocates DOM nodes, not the JS module graph building them.
|
|
297
|
+
*
|
|
298
|
+
* Renders a genuinely-`src`-navigated `<iframe>` — no `createPortal`, so
|
|
299
|
+
* nothing here shares object identity with the canvas's own React tree. State
|
|
300
|
+
* flows one-way, host -> canvas, over a `BroadcastChannel` as `t.flatten`'d
|
|
301
|
+
* JSON (see `./canvas-protocol`); interaction (select/hover/drop/keydown/
|
|
302
|
+
* link-click) relays back the other way as small typed messages. Pair with
|
|
303
|
+
* `createCanvasReceiver` (`./canvas-client`) on the canvas route's own end.
|
|
304
|
+
*/
|
|
305
|
+
function RemoteCanvasHost({ nu, activeComponent, src, selectedId = null, hoveredId = null, revision = 0, previewMode = false, uiPayload, onSelect, onHover, onDropOnNode, onKeydownRelay, onLinkClick, className, containerClassName, renderBox, }) {
|
|
306
|
+
const iframeRef = useRef(null);
|
|
307
|
+
const [doc, setDoc] = useState(null);
|
|
308
|
+
const [tick, setTick] = useState(0);
|
|
309
|
+
const [selected, setSelected] = useState(null);
|
|
310
|
+
const [hovered, setHovered] = useState(null);
|
|
311
|
+
const [selectedLabel, setSelectedLabel] = useState(null);
|
|
312
|
+
const props = useRef({
|
|
313
|
+
nu,
|
|
314
|
+
activeComponent,
|
|
315
|
+
uiPayload,
|
|
316
|
+
onSelect,
|
|
317
|
+
onHover,
|
|
318
|
+
onDropOnNode,
|
|
319
|
+
onKeydownRelay,
|
|
320
|
+
onLinkClick,
|
|
321
|
+
});
|
|
322
|
+
props.current = {
|
|
323
|
+
nu,
|
|
324
|
+
activeComponent,
|
|
325
|
+
uiPayload,
|
|
326
|
+
onSelect,
|
|
327
|
+
onHover,
|
|
328
|
+
onDropOnNode,
|
|
329
|
+
onKeydownRelay,
|
|
330
|
+
onLinkClick,
|
|
331
|
+
};
|
|
332
|
+
const connectionRef = useRef(null);
|
|
333
|
+
// A same-origin `src` navigation still allows the host to read the iframe's
|
|
334
|
+
// own document for layout geometry — that's a plain DOM read, not blocked
|
|
335
|
+
// by realm separation (only shared JS object identity is). Used purely to
|
|
336
|
+
// size/position the overlay; no sync-protocol concern.
|
|
337
|
+
useEffect(() => {
|
|
338
|
+
const iframe = iframeRef.current;
|
|
339
|
+
if (!iframe) {
|
|
340
|
+
return;
|
|
341
|
+
}
|
|
342
|
+
const onLoad = () => setDoc(iframe.contentDocument);
|
|
343
|
+
iframe.addEventListener('load', onLoad);
|
|
344
|
+
return () => iframe.removeEventListener('load', onLoad);
|
|
345
|
+
}, [src]);
|
|
346
|
+
useEffect(() => {
|
|
347
|
+
if (!doc) {
|
|
348
|
+
return;
|
|
349
|
+
}
|
|
350
|
+
const onScroll = () => setTick((x) => x + 1);
|
|
351
|
+
doc.addEventListener('scroll', onScroll, true);
|
|
352
|
+
return () => doc.removeEventListener('scroll', onScroll, true);
|
|
353
|
+
}, [doc]);
|
|
354
|
+
useEffect(() => {
|
|
355
|
+
const iframe = iframeRef.current;
|
|
356
|
+
if (!iframe) {
|
|
357
|
+
return;
|
|
358
|
+
}
|
|
359
|
+
const observer = new ResizeObserver(() => setTick((x) => x + 1));
|
|
360
|
+
observer.observe(iframe);
|
|
361
|
+
if (doc?.documentElement) {
|
|
362
|
+
observer.observe(doc.documentElement);
|
|
363
|
+
}
|
|
364
|
+
return () => observer.disconnect();
|
|
365
|
+
}, [doc]);
|
|
366
|
+
useEffect(() => {
|
|
367
|
+
const channel = new BroadcastChannel(canvasChannelName(src));
|
|
368
|
+
let ready = false;
|
|
369
|
+
let mountGen = null;
|
|
370
|
+
let rafId = null;
|
|
371
|
+
let rev = 0;
|
|
372
|
+
const sendInit = () => {
|
|
373
|
+
channel.postMessage({
|
|
374
|
+
channel: CANVAS_CHANNEL,
|
|
375
|
+
v: CANVAS_PROTOCOL_VERSION,
|
|
376
|
+
type: 'init',
|
|
377
|
+
activeComponent: props.current.activeComponent,
|
|
378
|
+
flat: flatten(props.current.nu.state),
|
|
379
|
+
});
|
|
380
|
+
};
|
|
381
|
+
const requestPatch = () => {
|
|
382
|
+
if (!ready || rafId !== null) {
|
|
383
|
+
return;
|
|
384
|
+
}
|
|
385
|
+
rafId = requestAnimationFrame(() => {
|
|
386
|
+
rafId = null;
|
|
387
|
+
channel.postMessage({
|
|
388
|
+
channel: CANVAS_CHANNEL,
|
|
389
|
+
v: CANVAS_PROTOCOL_VERSION,
|
|
390
|
+
type: 'patch',
|
|
391
|
+
activeComponent: props.current.activeComponent,
|
|
392
|
+
flat: flatten(props.current.nu.state),
|
|
393
|
+
rev: ++rev,
|
|
394
|
+
});
|
|
395
|
+
});
|
|
396
|
+
};
|
|
397
|
+
const postUi = (payload) => {
|
|
398
|
+
channel.postMessage({
|
|
399
|
+
channel: CANVAS_CHANNEL,
|
|
400
|
+
v: CANVAS_PROTOCOL_VERSION,
|
|
401
|
+
type: 'ui',
|
|
402
|
+
payload,
|
|
403
|
+
});
|
|
404
|
+
};
|
|
405
|
+
connectionRef.current = { sendInit, requestPatch, postUi };
|
|
406
|
+
const onMessage = (event) => {
|
|
407
|
+
if (!isCanvasMessage(event.data)) {
|
|
408
|
+
return;
|
|
409
|
+
}
|
|
410
|
+
const message = event.data;
|
|
411
|
+
const p = props.current;
|
|
412
|
+
switch (message.type) {
|
|
413
|
+
case 'ready':
|
|
414
|
+
if (mountGen !== null && message.mountGen <= mountGen) {
|
|
415
|
+
return;
|
|
416
|
+
}
|
|
417
|
+
mountGen = message.mountGen;
|
|
418
|
+
ready = true;
|
|
419
|
+
sendInit();
|
|
420
|
+
// The `uiPayload` effect below only fires again when the payload
|
|
421
|
+
// itself changes — on a fresh mount (or a remount after an error
|
|
422
|
+
// boundary), that push happens before the canvas has attached its
|
|
423
|
+
// listener (it hasn't navigated/mounted yet) and is silently lost,
|
|
424
|
+
// since BroadcastChannel doesn't buffer for late listeners. Resend
|
|
425
|
+
// the CURRENT payload here too, gated on the same readiness signal
|
|
426
|
+
// as the state bootstrap, so theme/overrides never depend on some
|
|
427
|
+
// unrelated prop changing later to "unstick" them.
|
|
428
|
+
postUi(props.current.uiPayload);
|
|
429
|
+
break;
|
|
430
|
+
case 'select':
|
|
431
|
+
p.onSelect?.(message.nodeId);
|
|
432
|
+
setTick((x) => x + 1);
|
|
433
|
+
break;
|
|
434
|
+
case 'hover':
|
|
435
|
+
p.onHover?.(message.nodeId);
|
|
436
|
+
setTick((x) => x + 1);
|
|
437
|
+
break;
|
|
438
|
+
case 'drop':
|
|
439
|
+
p.onDropOnNode?.(message.targetId, message.position);
|
|
440
|
+
break;
|
|
441
|
+
case 'keydown':
|
|
442
|
+
p.onKeydownRelay?.(message);
|
|
443
|
+
break;
|
|
444
|
+
case 'link-click':
|
|
445
|
+
p.onLinkClick?.(message.href);
|
|
446
|
+
break;
|
|
447
|
+
}
|
|
448
|
+
};
|
|
449
|
+
channel.addEventListener('message', onMessage);
|
|
450
|
+
const unlistenChangeset = nu.listenToChangeset(() => {
|
|
451
|
+
requestPatch();
|
|
452
|
+
setTick((x) => x + 1);
|
|
453
|
+
});
|
|
454
|
+
return () => {
|
|
455
|
+
channel.removeEventListener('message', onMessage);
|
|
456
|
+
channel.close();
|
|
457
|
+
unlistenChangeset();
|
|
458
|
+
if (rafId !== null) {
|
|
459
|
+
cancelAnimationFrame(rafId);
|
|
460
|
+
}
|
|
461
|
+
connectionRef.current = null;
|
|
462
|
+
};
|
|
463
|
+
// `nu` is stable for the app's lifetime; `src` identifies the channel.
|
|
464
|
+
// Everything else is read fresh off `props.current` inside the handlers.
|
|
465
|
+
}, [src, nu]);
|
|
466
|
+
// A page switch or preview-mode transition needs a fresh `init`, not just an
|
|
467
|
+
// incremental `patch` — see `previewMode`'s doc above for why preview mode
|
|
468
|
+
// specifically must never let a local-only mutation linger into edit mode.
|
|
469
|
+
const resyncKey = `${activeComponent}:${previewMode}`;
|
|
470
|
+
const lastResyncKey = useRef(null);
|
|
471
|
+
useEffect(() => {
|
|
472
|
+
if (lastResyncKey.current === resyncKey) {
|
|
473
|
+
return;
|
|
474
|
+
}
|
|
475
|
+
lastResyncKey.current = resyncKey;
|
|
476
|
+
connectionRef.current?.sendInit();
|
|
477
|
+
}, [resyncKey]);
|
|
478
|
+
useEffect(() => {
|
|
479
|
+
connectionRef.current?.postUi(uiPayload);
|
|
480
|
+
}, [uiPayload]);
|
|
481
|
+
const rectOf = (id) => {
|
|
482
|
+
if (!doc || !id) {
|
|
483
|
+
return null;
|
|
484
|
+
}
|
|
485
|
+
const el = doc.querySelector(`[data-nu-id="${id}"]`);
|
|
486
|
+
if (!el) {
|
|
487
|
+
return null;
|
|
488
|
+
}
|
|
489
|
+
const r = el.getBoundingClientRect();
|
|
490
|
+
return { top: r.top, left: r.left, width: r.width, height: r.height };
|
|
491
|
+
};
|
|
492
|
+
const labelOf = (id) => {
|
|
493
|
+
if (!doc || !id) {
|
|
494
|
+
return null;
|
|
495
|
+
}
|
|
496
|
+
const el = doc.querySelector(`[data-nu-id="${id}"]`);
|
|
497
|
+
return el ? el.tagName.toLowerCase() : null;
|
|
498
|
+
};
|
|
499
|
+
useLayoutEffect(() => {
|
|
500
|
+
if (previewMode) {
|
|
501
|
+
setSelected(null);
|
|
502
|
+
setHovered(null);
|
|
503
|
+
setSelectedLabel(null);
|
|
504
|
+
return;
|
|
505
|
+
}
|
|
506
|
+
setSelected(rectOf(selectedId));
|
|
507
|
+
setHovered(hoveredId && hoveredId !== selectedId ? rectOf(hoveredId) : null);
|
|
508
|
+
setSelectedLabel(labelOf(selectedId));
|
|
509
|
+
}, [previewMode, selectedId, hoveredId, revision, tick, doc]);
|
|
510
|
+
return createElement('div', { className: containerClassName, style: { position: 'relative' } }, createElement('iframe', {
|
|
511
|
+
ref: iframeRef,
|
|
512
|
+
title: 'nuforge canvas',
|
|
513
|
+
className,
|
|
514
|
+
src,
|
|
515
|
+
}), renderBox && !previewMode
|
|
516
|
+
? createElement('div', {
|
|
517
|
+
style: {
|
|
518
|
+
position: 'absolute',
|
|
519
|
+
inset: 0,
|
|
520
|
+
pointerEvents: 'none',
|
|
521
|
+
overflow: 'hidden',
|
|
522
|
+
},
|
|
523
|
+
}, renderBox({ selected, hovered, selectedLabel }))
|
|
524
|
+
: null);
|
|
525
|
+
}
|
|
526
|
+
// Structural param types (not the nominal `Editor` class), so these hooks accept
|
|
527
|
+
// an Editor imported from the package's main entry without a dual-bundle clash.
|
|
528
|
+
/** Re-render only when the tree shape changes (add/remove/move). */
|
|
217
529
|
function useStructureRevision(editor) {
|
|
218
530
|
const [rev, setRev] = useState(0);
|
|
219
531
|
useEffect(() => editor.onStructureChange(() => setRev((r) => r + 1)), [editor]);
|
|
220
532
|
return rev;
|
|
221
533
|
}
|
|
534
|
+
/** Re-render on every committed change (for undo state, inspectors, …). */
|
|
222
535
|
function useEditorRevision(editor) {
|
|
223
536
|
const [rev, setRev] = useState(0);
|
|
224
537
|
useEffect(() => editor.onChange(() => setRev((r) => r + 1)), [editor]);
|
|
225
538
|
return rev;
|
|
226
539
|
}
|
|
540
|
+
/**
|
|
541
|
+
* A headless inspector renderer: builds a control per {@link PropSchemaField}
|
|
542
|
+
* (text / number / checkbox / select / expression) so you don't hand-write a
|
|
543
|
+
* form per block. Style via `className` and your own CSS; wire `onChange` to the
|
|
544
|
+
* editor's mutation methods.
|
|
545
|
+
*/
|
|
227
546
|
function PropFields({ fields, values, onChange, className, }) {
|
|
228
547
|
return createElement('div', { className, 'data-nu-propfields': '' }, fields.map((field) => createElement(PropFieldControl, {
|
|
229
548
|
key: field.name,
|
|
@@ -261,6 +580,7 @@ function PropFieldControl({ field, value, onChange, }) {
|
|
|
261
580
|
}, (field.options ?? []).map((opt) => createElement('option', { key: opt, value: opt }, opt)));
|
|
262
581
|
break;
|
|
263
582
|
default:
|
|
583
|
+
// 'string' | 'expression'
|
|
264
584
|
control = createElement('input', {
|
|
265
585
|
id,
|
|
266
586
|
type: 'text',
|
|
@@ -272,4 +592,5 @@ function PropFieldControl({ field, value, onChange, }) {
|
|
|
272
592
|
return createElement('label', { htmlFor: id, 'data-nu-field': field.name }, createElement('span', null, label), control);
|
|
273
593
|
}
|
|
274
594
|
|
|
275
|
-
export { DEFAULT_CANVAS_CSS, EditorFrame, IframeCanvas, PropFields, templateIdFromElement, useCanvasWindow, useEditorRevision, useStructureRevision };
|
|
595
|
+
export { DEFAULT_CANVAS_CSS, EditorFrame, IframeCanvas, PropFields, RemoteCanvasHost, templateIdFromElement, useCanvasWindow, useEditorRevision, useStructureRevision };
|
|
596
|
+
//# sourceMappingURL=react.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"react.mjs","sources":["../src/canvas-protocol.ts","../src/template.ts","../src/react.tsx"],"sourcesContent":[null,null,null],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nuforge/editor",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "High-level SDK for building visual page editors on nuforge (mutations, blocks, commands, selection)",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -31,8 +31,8 @@
|
|
|
31
31
|
"react-dom": "^18 || ^19",
|
|
32
32
|
"@nuforge/core": "0.1.4",
|
|
33
33
|
"@nuforge/parser": "0.1.3",
|
|
34
|
-
"@nuforge/
|
|
35
|
-
"@nuforge/
|
|
34
|
+
"@nuforge/types": "0.1.3",
|
|
35
|
+
"@nuforge/react": "0.1.4"
|
|
36
36
|
},
|
|
37
37
|
"peerDependenciesMeta": {
|
|
38
38
|
"@nuforge/react": {
|
|
@@ -51,9 +51,9 @@
|
|
|
51
51
|
"react": "^19.2.0",
|
|
52
52
|
"react-dom": "^19.2.0",
|
|
53
53
|
"@nuforge/core": "0.1.4",
|
|
54
|
-
"@nuforge/parser": "0.1.3",
|
|
55
54
|
"@nuforge/react": "0.1.4",
|
|
56
|
-
"@nuforge/types": "0.1.3"
|
|
55
|
+
"@nuforge/types": "0.1.3",
|
|
56
|
+
"@nuforge/parser": "0.1.3"
|
|
57
57
|
},
|
|
58
58
|
"publishConfig": {
|
|
59
59
|
"access": "public"
|