@bimetal/whiteboard-vue-components 0.29.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/LICENSE +129 -0
- package/README.md +58 -0
- package/dist/.tsbuildinfo +1 -0
- package/dist/components/CommentThread.d.ts +82 -0
- package/dist/components/CommentThread.d.ts.map +1 -0
- package/dist/components/CommentThread.js +55 -0
- package/dist/components/CommentThread.js.map +1 -0
- package/dist/components/StylePanel.d.ts +39 -0
- package/dist/components/StylePanel.d.ts.map +1 -0
- package/dist/components/StylePanel.js +53 -0
- package/dist/components/StylePanel.js.map +1 -0
- package/dist/components/TextDialog.d.ts +59 -0
- package/dist/components/TextDialog.d.ts.map +1 -0
- package/dist/components/TextDialog.js +45 -0
- package/dist/components/TextDialog.js.map +1 -0
- package/dist/components/TransformHandles.d.ts +39 -0
- package/dist/components/TransformHandles.d.ts.map +1 -0
- package/dist/components/TransformHandles.js +40 -0
- package/dist/components/TransformHandles.js.map +1 -0
- package/dist/components/Whiteboard.d.ts +68 -0
- package/dist/components/Whiteboard.d.ts.map +1 -0
- package/dist/components/Whiteboard.js +356 -0
- package/dist/components/Whiteboard.js.map +1 -0
- package/dist/components/WhiteboardShape.d.ts +49 -0
- package/dist/components/WhiteboardShape.d.ts.map +1 -0
- package/dist/components/WhiteboardShape.js +69 -0
- package/dist/components/WhiteboardShape.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/styles/index.css +1 -0
- package/dist/types.d.ts +15 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +59 -0
|
@@ -0,0 +1,356 @@
|
|
|
1
|
+
import { defineComponent, onMounted, onUnmounted, ref, getCurrentInstance, h } from 'vue';
|
|
2
|
+
import { useWhiteboardController } from '@bimetal/vue';
|
|
3
|
+
import { screenToBoard, boardToScreen, WHITEBOARD_TOOLS, WHITEBOARD_ALIGN, WHITEBOARD_DISTRIBUTE, whiteboardConnectorPath, whiteboardDrawPath, whiteboardDashArray, whiteboardCommentAnchor } from '@bimetal/whiteboard-headless';
|
|
4
|
+
import { WhiteboardShape } from './WhiteboardShape.js';
|
|
5
|
+
import { TransformHandles } from './TransformHandles.js';
|
|
6
|
+
import { StylePanel } from './StylePanel.js';
|
|
7
|
+
import { CommentThread } from './CommentThread.js';
|
|
8
|
+
import { TextDialog } from './TextDialog.js';
|
|
9
|
+
function isEditableTarget(t) {
|
|
10
|
+
const el = t;
|
|
11
|
+
if (!el || !el.tagName)
|
|
12
|
+
return false;
|
|
13
|
+
return el.tagName === 'INPUT' || el.tagName === 'TEXTAREA' || el.isContentEditable === true;
|
|
14
|
+
}
|
|
15
|
+
const mod = (n, m) => ((n % m) + m) % m;
|
|
16
|
+
/**
|
|
17
|
+
* The Vue whiteboard — a thin binding over `@bimetal/whiteboard-headless`. Owns
|
|
18
|
+
* DOM only: it converts `clientX/Y → boardPoint` through the controller's viewport
|
|
19
|
+
* (`screenToBoard` — the binding's ONE piece of geometry), wires window pointer +
|
|
20
|
+
* wheel events, and renders the snapshot. Every interaction decision (tool FSM,
|
|
21
|
+
* create/drag/marquee, pan/zoom math, input policy) lives in the controller. 1:1
|
|
22
|
+
* with the React reference.
|
|
23
|
+
*/
|
|
24
|
+
export const Whiteboard = defineComponent({
|
|
25
|
+
name: 'Whiteboard',
|
|
26
|
+
props: {
|
|
27
|
+
store: { type: Object, required: true },
|
|
28
|
+
canvasId: { type: String, required: true },
|
|
29
|
+
config: { type: Object, default: undefined },
|
|
30
|
+
darkMode: { type: Boolean, default: false },
|
|
31
|
+
onError: { type: Function, default: undefined },
|
|
32
|
+
},
|
|
33
|
+
setup(props) {
|
|
34
|
+
const { snapshot, ctrl } = useWhiteboardController({ store: props.store, canvasId: props.canvasId, config: props.config, onError: (err) => props.onError?.(err) }, { config: () => props.config });
|
|
35
|
+
const viewportRef = ref(null);
|
|
36
|
+
// Per-instance arrow marker id — document-global ids would collide across two
|
|
37
|
+
// mounted boards and `url(#…)` resolve to the wrong marker.
|
|
38
|
+
const arrowId = `bm-wb-arrow-${getCurrentInstance()?.uid ?? 0}`;
|
|
39
|
+
/** clientX/Y → board point via the live viewport rect + camera. */
|
|
40
|
+
const boardOf = (clientX, clientY) => {
|
|
41
|
+
const rect = viewportRef.value?.getBoundingClientRect();
|
|
42
|
+
const screen = { x: clientX - (rect?.left ?? 0), y: clientY - (rect?.top ?? 0) };
|
|
43
|
+
return screenToBoard(ctrl.getSnapshot().viewport, screen);
|
|
44
|
+
};
|
|
45
|
+
// Window pointer move/up/cancel feed the active gesture (pointerId-guarded in
|
|
46
|
+
// the controller). Wheel is a native non-passive listener so zoom can preventDefault.
|
|
47
|
+
const onMove = (e) => {
|
|
48
|
+
// Hit-test the shape under the pointer (for the connector gesture's drop target).
|
|
49
|
+
const el = document.elementFromPoint(e.clientX, e.clientY);
|
|
50
|
+
const over = el?.closest('.bm-wb__shape')?.dataset.shapeId ?? null;
|
|
51
|
+
ctrl.pointerMove(boardOf(e.clientX, e.clientY), e.pointerId, over);
|
|
52
|
+
};
|
|
53
|
+
const onUp = (e) => ctrl.pointerUp(e.pointerId);
|
|
54
|
+
const onCancel = (e) => ctrl.pointerCancel(e.pointerId);
|
|
55
|
+
const onWheel = (e) => {
|
|
56
|
+
e.preventDefault();
|
|
57
|
+
const vp = viewportRef.value;
|
|
58
|
+
if (e.ctrlKey || e.metaKey) {
|
|
59
|
+
const rect = vp.getBoundingClientRect();
|
|
60
|
+
ctrl.zoomBy(e.deltaY < 0 ? 1.1 : 0.9, { x: e.clientX - rect.left, y: e.clientY - rect.top });
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
ctrl.panBy(-e.deltaX, -e.deltaY);
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
onMounted(() => {
|
|
67
|
+
window.addEventListener('pointermove', onMove);
|
|
68
|
+
window.addEventListener('pointerup', onUp);
|
|
69
|
+
window.addEventListener('pointercancel', onCancel);
|
|
70
|
+
viewportRef.value?.addEventListener('wheel', onWheel, { passive: false });
|
|
71
|
+
});
|
|
72
|
+
onUnmounted(() => {
|
|
73
|
+
window.removeEventListener('pointermove', onMove);
|
|
74
|
+
window.removeEventListener('pointerup', onUp);
|
|
75
|
+
window.removeEventListener('pointercancel', onCancel);
|
|
76
|
+
viewportRef.value?.removeEventListener('wheel', onWheel);
|
|
77
|
+
});
|
|
78
|
+
// ── Pointer entry points (read the live snapshot for the armed tool) ──
|
|
79
|
+
const onViewportPointerDown = (e) => {
|
|
80
|
+
if (e.button !== 0)
|
|
81
|
+
return;
|
|
82
|
+
const activeTool = snapshot.value.activeTool;
|
|
83
|
+
const board = boardOf(e.clientX, e.clientY);
|
|
84
|
+
if (activeTool === 'connector')
|
|
85
|
+
ctrl.beginConnector(null, board, e.pointerId);
|
|
86
|
+
else if (activeTool === 'draw')
|
|
87
|
+
ctrl.beginDraw(board, e.pointerId);
|
|
88
|
+
else if (activeTool === 'laser')
|
|
89
|
+
ctrl.beginLaser(board, e.pointerId);
|
|
90
|
+
else if (activeTool === 'comment')
|
|
91
|
+
ctrl.beginComment(board, null);
|
|
92
|
+
else if (activeTool !== 'select')
|
|
93
|
+
ctrl.beginCreate(board, e.pointerId);
|
|
94
|
+
else
|
|
95
|
+
ctrl.beginMarquee(board, e.shiftKey, e.pointerId); // shapes stopPropagation, so this is empty canvas
|
|
96
|
+
};
|
|
97
|
+
const onShapePointerDown = (shapeId, e) => {
|
|
98
|
+
if (e.button !== 0)
|
|
99
|
+
return; // primary button only
|
|
100
|
+
const activeTool = snapshot.value.activeTool;
|
|
101
|
+
if (activeTool === 'connector') {
|
|
102
|
+
e.stopPropagation();
|
|
103
|
+
ctrl.beginConnector(shapeId, boardOf(e.clientX, e.clientY), e.pointerId);
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
if (activeTool === 'comment') {
|
|
107
|
+
e.stopPropagation();
|
|
108
|
+
ctrl.beginComment(boardOf(e.clientX, e.clientY), shapeId);
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
if (activeTool !== 'select')
|
|
112
|
+
return; // a shape tool is armed → bubble to the viewport's create
|
|
113
|
+
e.stopPropagation();
|
|
114
|
+
ctrl.beginShapeDrag(shapeId, boardOf(e.clientX, e.clientY), e.shiftKey, e.pointerId);
|
|
115
|
+
};
|
|
116
|
+
const onShapeDoubleClick = (shapeId, e) => {
|
|
117
|
+
e.stopPropagation();
|
|
118
|
+
ctrl.openEdit(shapeId, e.currentTarget.getBoundingClientRect());
|
|
119
|
+
};
|
|
120
|
+
const onResizeHandle = (shapeId, handle, e) => {
|
|
121
|
+
if (e.button !== 0)
|
|
122
|
+
return;
|
|
123
|
+
e.stopPropagation();
|
|
124
|
+
ctrl.beginResize(shapeId, boardOf(e.clientX, e.clientY), e.pointerId, handle);
|
|
125
|
+
};
|
|
126
|
+
const onRotateHandle = (shapeId, e) => {
|
|
127
|
+
if (e.button !== 0)
|
|
128
|
+
return;
|
|
129
|
+
e.stopPropagation();
|
|
130
|
+
ctrl.beginRotate(shapeId, boardOf(e.clientX, e.clientY), e.pointerId);
|
|
131
|
+
};
|
|
132
|
+
const onKeyDown = (e) => {
|
|
133
|
+
const norm = {
|
|
134
|
+
key: e.key, ctrlKey: e.ctrlKey, metaKey: e.metaKey, shiftKey: e.shiftKey,
|
|
135
|
+
isEditable: isEditableTarget(e.target), preventDefault: () => e.preventDefault(),
|
|
136
|
+
};
|
|
137
|
+
ctrl.handleKeydown(norm);
|
|
138
|
+
};
|
|
139
|
+
return () => {
|
|
140
|
+
const snap = snapshot.value;
|
|
141
|
+
const { viewport, activeTool } = snap;
|
|
142
|
+
const cfg = snap.config;
|
|
143
|
+
const locale = cfg.locale;
|
|
144
|
+
const selectedViews = snap.shapes.filter((v) => v.selected);
|
|
145
|
+
const transformView = snap.transformHandleId ? snap.shapes.find(v => v.shape.id === snap.transformHandleId) ?? null : null;
|
|
146
|
+
const hasSel = snap.selection.length > 0;
|
|
147
|
+
const canAlign = snap.selection.length >= 2; // controller no-ops below 2
|
|
148
|
+
const canDistribute = snap.selection.length >= 3; // controller no-ops below 3
|
|
149
|
+
const canGroup = snap.selection.length >= 2; // group needs ≥2
|
|
150
|
+
const canUngroup = selectedViews.some((v) => v.shape.kind === 'frame' || v.shape.kind === 'group');
|
|
151
|
+
const openComment = snap.openCommentId ? snap.comments.find((c) => c.id === snap.openCommentId) ?? null : null;
|
|
152
|
+
const openCommentAt = openComment ? whiteboardCommentAnchor(snap, openComment) : null;
|
|
153
|
+
const undo = snap.lastAction;
|
|
154
|
+
const gridPx = cfg.gridSize * viewport.scale;
|
|
155
|
+
const sceneStyle = { transform: `translate(${viewport.offsetX}px, ${viewport.offsetY}px) scale(${viewport.scale})` };
|
|
156
|
+
const viewportVars = {
|
|
157
|
+
'--bmw-grid-px': `${gridPx}px`,
|
|
158
|
+
'--bmw-grid-x': `${mod(viewport.offsetX, gridPx)}px`,
|
|
159
|
+
'--bmw-grid-y': `${mod(viewport.offsetY, gridPx)}px`,
|
|
160
|
+
};
|
|
161
|
+
// ── Toolbar ──
|
|
162
|
+
const toolButtons = WHITEBOARD_TOOLS.map((t) => h('button', {
|
|
163
|
+
key: t.id,
|
|
164
|
+
type: 'button',
|
|
165
|
+
class: `bm-wb__tool${activeTool === t.id ? ' bm-wb__tool--active' : ''}`,
|
|
166
|
+
title: locale.tools[t.id],
|
|
167
|
+
'aria-pressed': activeTool === t.id,
|
|
168
|
+
'data-tool': t.id,
|
|
169
|
+
onClick: () => ctrl.setTool(t.id),
|
|
170
|
+
}, t.glyph));
|
|
171
|
+
const alignButtons = WHITEBOARD_ALIGN.map((a) => h('button', {
|
|
172
|
+
key: a.edge, type: 'button', class: 'bm-wb__btn', title: locale.alignLabels[a.edge], 'data-align': a.edge,
|
|
173
|
+
disabled: !canAlign, onClick: () => ctrl.voidAlignSelection(a.edge),
|
|
174
|
+
}, a.glyph));
|
|
175
|
+
const distributeButtons = WHITEBOARD_DISTRIBUTE.map((d) => h('button', {
|
|
176
|
+
key: d.axis, type: 'button', class: 'bm-wb__btn', title: locale.distributeLabels[d.axis], 'data-distribute': d.axis,
|
|
177
|
+
disabled: !canDistribute, onClick: () => ctrl.voidDistributeSelection(d.axis),
|
|
178
|
+
}, d.glyph));
|
|
179
|
+
const toolbar = h('div', { class: 'bm-wb__toolbar' }, [
|
|
180
|
+
...toolButtons,
|
|
181
|
+
h('span', { class: 'bm-wb__toolbar-sep' }),
|
|
182
|
+
h('button', { type: 'button', class: 'bm-wb__btn', title: locale.bringToFront, disabled: !hasSel, onClick: () => ctrl.voidBringToFront() }, '⬆'),
|
|
183
|
+
h('button', { type: 'button', class: 'bm-wb__btn', title: locale.sendToBack, disabled: !hasSel, onClick: () => ctrl.voidSendToBack() }, '⬇'),
|
|
184
|
+
h('button', { type: 'button', class: 'bm-wb__btn bm-wb__lock-btn', title: locale.lock, disabled: !hasSel, onClick: () => ctrl.voidToggleLock() }, '🔒'),
|
|
185
|
+
h('button', { type: 'button', class: 'bm-wb__btn', title: locale.group, 'data-action': 'group', disabled: !canGroup, onClick: () => ctrl.voidGroup() }, '⧉'),
|
|
186
|
+
h('button', { type: 'button', class: 'bm-wb__btn', title: locale.ungroup, 'data-action': 'ungroup', disabled: !canUngroup, onClick: () => ctrl.voidUngroup() }, '⊟'),
|
|
187
|
+
h('button', { type: 'button', class: 'bm-wb__btn', title: locale.duplicate, 'data-action': 'duplicate', disabled: !hasSel, onClick: () => ctrl.voidDuplicate() }, '⧉⁺'),
|
|
188
|
+
h('button', { type: 'button', class: 'bm-wb__btn', title: locale.delete, disabled: !hasSel, onClick: () => ctrl.voidDeleteSelection() }, '🗑'),
|
|
189
|
+
h('span', { class: 'bm-wb__toolbar-sep' }),
|
|
190
|
+
...alignButtons,
|
|
191
|
+
...distributeButtons,
|
|
192
|
+
h('span', { class: 'bm-wb__toolbar-sep' }),
|
|
193
|
+
h('button', { type: 'button', class: 'bm-wb__btn', title: locale.resetZoom, onClick: () => ctrl.resetViewport() }, '⌖'),
|
|
194
|
+
h('span', { class: 'bm-wb__toolbar-zoom' }, `${Math.round(viewport.scale * 100)}%`),
|
|
195
|
+
]);
|
|
196
|
+
// ── Connectors SVG layer ──
|
|
197
|
+
const connectorPaths = snap.connectors.map((c) => {
|
|
198
|
+
const d = whiteboardConnectorPath(snap, c);
|
|
199
|
+
if (!d)
|
|
200
|
+
return null;
|
|
201
|
+
return h('path', {
|
|
202
|
+
key: c.id,
|
|
203
|
+
class: 'bm-wb__connector',
|
|
204
|
+
'data-connector-id': c.id,
|
|
205
|
+
d,
|
|
206
|
+
stroke: c.style.stroke,
|
|
207
|
+
'stroke-width': c.style.strokeWidth,
|
|
208
|
+
'stroke-dasharray': whiteboardDashArray(c.style.dash),
|
|
209
|
+
opacity: c.style.opacity,
|
|
210
|
+
'marker-end': c.style.arrowEnd ? `url(#${arrowId})` : undefined,
|
|
211
|
+
'marker-start': c.style.arrowStart ? `url(#${arrowId})` : undefined,
|
|
212
|
+
});
|
|
213
|
+
});
|
|
214
|
+
const connectorsSvg = h('svg', { class: 'bm-wb__connectors', 'data-testid': 'wb-connectors' }, [
|
|
215
|
+
h('defs', [
|
|
216
|
+
h('marker', { id: arrowId, markerWidth: '8', markerHeight: '8', refX: '7', refY: '4', orient: 'auto' }, [
|
|
217
|
+
h('path', { d: 'M0,0 L7,4 L0,8 Z', fill: 'context-stroke' }),
|
|
218
|
+
]),
|
|
219
|
+
]),
|
|
220
|
+
...connectorPaths,
|
|
221
|
+
snap.connectorPreview
|
|
222
|
+
? h('path', { class: 'bm-wb__connector-preview', d: `M ${snap.connectorPreview.from.x} ${snap.connectorPreview.from.y} L ${snap.connectorPreview.to.x} ${snap.connectorPreview.to.y}` })
|
|
223
|
+
: null,
|
|
224
|
+
snap.drawPreview && snap.drawPreview.length > 1
|
|
225
|
+
? h('path', { class: 'bm-wb__draw-preview', 'data-testid': 'wb-draw-preview', d: whiteboardDrawPath(snap.drawPreview) })
|
|
226
|
+
: null,
|
|
227
|
+
...snap.guides.map((g, i) => h('line', {
|
|
228
|
+
key: i,
|
|
229
|
+
class: 'bm-wb__guide',
|
|
230
|
+
'data-guide-axis': g.axis,
|
|
231
|
+
x1: g.axis === 'x' ? g.pos : g.start,
|
|
232
|
+
y1: g.axis === 'x' ? g.start : g.pos,
|
|
233
|
+
x2: g.axis === 'x' ? g.pos : g.end,
|
|
234
|
+
y2: g.axis === 'x' ? g.end : g.pos,
|
|
235
|
+
})),
|
|
236
|
+
]);
|
|
237
|
+
// ── Shapes ──
|
|
238
|
+
const shapeNodes = snap.shapes.map((v) => h(WhiteboardShape, {
|
|
239
|
+
key: v.shape.id,
|
|
240
|
+
view: v,
|
|
241
|
+
dropTarget: snap.dropTargetId === v.shape.id,
|
|
242
|
+
onShapePointerDown: (e) => onShapePointerDown(v.shape.id, e),
|
|
243
|
+
onShapeDoubleClick: (e) => onShapeDoubleClick(v.shape.id, e),
|
|
244
|
+
}));
|
|
245
|
+
// ── Comment pins (board coords, derived anchor) ──
|
|
246
|
+
const commentPins = snap.comments.map((c) => {
|
|
247
|
+
const at = whiteboardCommentAnchor(snap, c);
|
|
248
|
+
if (!at)
|
|
249
|
+
return null;
|
|
250
|
+
return h('button', {
|
|
251
|
+
key: c.id,
|
|
252
|
+
type: 'button',
|
|
253
|
+
class: `bm-wb__comment-pin${c.resolved ? ' bm-wb__comment-pin--resolved' : ''}`,
|
|
254
|
+
'data-comment-id': c.id,
|
|
255
|
+
style: { left: `${at.x}px`, top: `${at.y}px` },
|
|
256
|
+
title: c.text,
|
|
257
|
+
onPointerdown: (e) => { e.stopPropagation(); },
|
|
258
|
+
onClick: (e) => { e.stopPropagation(); ctrl.openCommentThread(c.id); },
|
|
259
|
+
}, c.resolved ? '✓' : '💬');
|
|
260
|
+
});
|
|
261
|
+
// ── Scene children (laser LAST so it paints above everything) ──
|
|
262
|
+
const sceneChildren = [
|
|
263
|
+
connectorsSvg,
|
|
264
|
+
...shapeNodes,
|
|
265
|
+
snap.marquee
|
|
266
|
+
? h('div', { class: 'bm-wb__marquee', style: { left: `${snap.marquee.x}px`, top: `${snap.marquee.y}px`, width: `${snap.marquee.width}px`, height: `${snap.marquee.height}px` } })
|
|
267
|
+
: null,
|
|
268
|
+
snap.createPreview
|
|
269
|
+
? h('div', { class: 'bm-wb__create-preview', style: { left: `${snap.createPreview.x}px`, top: `${snap.createPreview.y}px`, width: `${snap.createPreview.width}px`, height: `${snap.createPreview.height}px` } })
|
|
270
|
+
: null,
|
|
271
|
+
// The controller decides which shape (if any) shows handles via transformHandleId.
|
|
272
|
+
transformView
|
|
273
|
+
? h(TransformHandles, {
|
|
274
|
+
view: transformView,
|
|
275
|
+
onResize: (handle, e) => onResizeHandle(transformView.shape.id, handle, e),
|
|
276
|
+
onRotate: (e) => onRotateHandle(transformView.shape.id, e),
|
|
277
|
+
})
|
|
278
|
+
: null,
|
|
279
|
+
...commentPins,
|
|
280
|
+
// Laser is a presentation pointer — it must paint ABOVE every shape and
|
|
281
|
+
// overlay, so it lives in its own top SVG (LAST in the scene).
|
|
282
|
+
snap.laser && snap.laser.length > 1
|
|
283
|
+
? h('svg', { class: 'bm-wb__laser-layer', 'data-testid': 'wb-laser-layer' }, snap.laser.slice(1).map((pt, i) => h('line', {
|
|
284
|
+
key: i,
|
|
285
|
+
class: 'bm-wb__laser',
|
|
286
|
+
'data-testid': 'wb-laser',
|
|
287
|
+
x1: snap.laser[i].x, y1: snap.laser[i].y,
|
|
288
|
+
x2: pt.x, y2: pt.y,
|
|
289
|
+
'stroke-opacity': (i + 1) / snap.laser.length, // faint tail → bright head
|
|
290
|
+
})))
|
|
291
|
+
: null,
|
|
292
|
+
];
|
|
293
|
+
// ── Comment editor popovers (SCREEN space) ──
|
|
294
|
+
const commentEditors = [
|
|
295
|
+
snap.commentDraft
|
|
296
|
+
? h(CommentThread, {
|
|
297
|
+
key: 'draft', at: boardToScreen(viewport, snap.commentDraft), locale, initial: '', resolved: false,
|
|
298
|
+
onCommit: (text) => ctrl.voidCommitComment(text),
|
|
299
|
+
onClose: () => ctrl.cancelComment(),
|
|
300
|
+
})
|
|
301
|
+
: null,
|
|
302
|
+
openComment && openCommentAt
|
|
303
|
+
? h(CommentThread, {
|
|
304
|
+
key: openComment.id, at: boardToScreen(viewport, openCommentAt), locale,
|
|
305
|
+
initial: openComment.text, resolved: openComment.resolved,
|
|
306
|
+
onCommit: (text) => { ctrl.voidSetCommentText(openComment.id, text); ctrl.closeCommentThread(); },
|
|
307
|
+
onClose: () => ctrl.closeCommentThread(),
|
|
308
|
+
onResolve: () => ctrl.voidToggleCommentResolved(openComment.id),
|
|
309
|
+
onDelete: () => ctrl.voidRemoveComment(openComment.id),
|
|
310
|
+
})
|
|
311
|
+
: null,
|
|
312
|
+
];
|
|
313
|
+
const viewportEl = h('div', {
|
|
314
|
+
ref: viewportRef,
|
|
315
|
+
class: `bm-wb__viewport${activeTool !== 'select' ? ' bm-wb__viewport--tool' : ''}`,
|
|
316
|
+
style: viewportVars,
|
|
317
|
+
'data-testid': 'wb-viewport',
|
|
318
|
+
onPointerdown: onViewportPointerDown,
|
|
319
|
+
}, [
|
|
320
|
+
h('div', { class: 'bm-wb__scene', style: sceneStyle }, sceneChildren),
|
|
321
|
+
...commentEditors,
|
|
322
|
+
]);
|
|
323
|
+
return h('div', {
|
|
324
|
+
class: 'bm-wb',
|
|
325
|
+
'data-theme': props.darkMode ? 'dark' : undefined,
|
|
326
|
+
role: 'application',
|
|
327
|
+
'aria-label': snap.ariaLabel,
|
|
328
|
+
tabindex: 0,
|
|
329
|
+
onKeydown: onKeyDown,
|
|
330
|
+
}, [
|
|
331
|
+
toolbar,
|
|
332
|
+
viewportEl,
|
|
333
|
+
// Guard on the resolved VIEWS, not the raw selection length: a delete/ungroup
|
|
334
|
+
// transiently leaves `selection` pointing at an already-removed shape.
|
|
335
|
+
selectedViews.length > 0
|
|
336
|
+
? h(StylePanel, { style: selectedViews[0].shape.style, locale, onInput: (raw) => ctrl.voidSetSelectionStyleFromInput(raw) })
|
|
337
|
+
: null,
|
|
338
|
+
undo
|
|
339
|
+
? h('div', { class: 'bm-wb__toast', role: 'status' }, [
|
|
340
|
+
h('span', undo.description),
|
|
341
|
+
h('button', { type: 'button', class: 'bm-wb__toast-btn', onClick: () => ctrl.voidUndo() }, locale.undo),
|
|
342
|
+
])
|
|
343
|
+
: null,
|
|
344
|
+
snap.dialog
|
|
345
|
+
? h(TextDialog, {
|
|
346
|
+
key: snap.dialog.shape.id, initial: snap.dialog.shape.text, locale,
|
|
347
|
+
onSave: (text) => ctrl.voidSaveShape({ text }),
|
|
348
|
+
onClose: () => ctrl.closeDialog(),
|
|
349
|
+
onDelete: () => ctrl.voidDeleteShape(snap.dialog.shape.id),
|
|
350
|
+
})
|
|
351
|
+
: null,
|
|
352
|
+
]);
|
|
353
|
+
};
|
|
354
|
+
},
|
|
355
|
+
});
|
|
356
|
+
//# sourceMappingURL=Whiteboard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Whiteboard.js","sourceRoot":"","sources":["../../src/components/Whiteboard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { type PropType } from 'vue';
|
|
2
|
+
import type { ShapeView } from '@bimetal/whiteboard-headless';
|
|
3
|
+
/**
|
|
4
|
+
* One shape, positioned in BOARD coordinates inside the pan/zoom scene (the
|
|
5
|
+
* scene's transform supplies the camera, so this reads `shape.x/y/w/h` raw).
|
|
6
|
+
* Fill/stroke/font come INLINE from `shape.style`; the kind drives the silhouette
|
|
7
|
+
* (ellipse/diamond via CSS). A pure renderer — `onPointerDown` is the only seam.
|
|
8
|
+
* 1:1 with the React reference.
|
|
9
|
+
*/
|
|
10
|
+
export declare const WhiteboardShape: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
|
|
11
|
+
view: {
|
|
12
|
+
type: PropType<ShapeView>;
|
|
13
|
+
required: true;
|
|
14
|
+
};
|
|
15
|
+
dropTarget: {
|
|
16
|
+
type: BooleanConstructor;
|
|
17
|
+
default: boolean;
|
|
18
|
+
};
|
|
19
|
+
onShapePointerDown: {
|
|
20
|
+
type: PropType<(e: PointerEvent) => void>;
|
|
21
|
+
required: true;
|
|
22
|
+
};
|
|
23
|
+
onShapeDoubleClick: {
|
|
24
|
+
type: PropType<(e: MouseEvent) => void>;
|
|
25
|
+
required: true;
|
|
26
|
+
};
|
|
27
|
+
}>, () => import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
|
|
28
|
+
[key: string]: any;
|
|
29
|
+
}>, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
|
|
30
|
+
view: {
|
|
31
|
+
type: PropType<ShapeView>;
|
|
32
|
+
required: true;
|
|
33
|
+
};
|
|
34
|
+
dropTarget: {
|
|
35
|
+
type: BooleanConstructor;
|
|
36
|
+
default: boolean;
|
|
37
|
+
};
|
|
38
|
+
onShapePointerDown: {
|
|
39
|
+
type: PropType<(e: PointerEvent) => void>;
|
|
40
|
+
required: true;
|
|
41
|
+
};
|
|
42
|
+
onShapeDoubleClick: {
|
|
43
|
+
type: PropType<(e: MouseEvent) => void>;
|
|
44
|
+
required: true;
|
|
45
|
+
};
|
|
46
|
+
}>> & Readonly<{}>, {
|
|
47
|
+
dropTarget: boolean;
|
|
48
|
+
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
49
|
+
//# sourceMappingURL=WhiteboardShape.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WhiteboardShape.d.ts","sourceRoot":"","sources":["../../src/components/WhiteboardShape.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,KAAK,QAAQ,EAAyB,MAAM,KAAK,CAAC;AAE5E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAE9D;;;;;;GAMG;AACH,eAAO,MAAM,eAAe;;cAGA,QAAQ,CAAC,SAAS,CAAC;;;;;;;;cAEH,QAAQ,CAAC,CAAC,CAAC,EAAE,YAAY,KAAK,IAAI,CAAC;;;;cACnC,QAAQ,CAAC,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAC;;;;;;;cAHjD,QAAQ,CAAC,SAAS,CAAC;;;;;;;;cAEH,QAAQ,CAAC,CAAC,CAAC,EAAE,YAAY,KAAK,IAAI,CAAC;;;;cACnC,QAAQ,CAAC,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAC;;;;;4EAuD3E,CAAC"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { defineComponent, h } from 'vue';
|
|
2
|
+
import { whiteboardDrawPath, whiteboardDashArray } from '@bimetal/whiteboard-headless';
|
|
3
|
+
/**
|
|
4
|
+
* One shape, positioned in BOARD coordinates inside the pan/zoom scene (the
|
|
5
|
+
* scene's transform supplies the camera, so this reads `shape.x/y/w/h` raw).
|
|
6
|
+
* Fill/stroke/font come INLINE from `shape.style`; the kind drives the silhouette
|
|
7
|
+
* (ellipse/diamond via CSS). A pure renderer — `onPointerDown` is the only seam.
|
|
8
|
+
* 1:1 with the React reference.
|
|
9
|
+
*/
|
|
10
|
+
export const WhiteboardShape = defineComponent({
|
|
11
|
+
name: 'WhiteboardShape',
|
|
12
|
+
props: {
|
|
13
|
+
view: { type: Object, required: true },
|
|
14
|
+
dropTarget: { type: Boolean, default: false },
|
|
15
|
+
onShapePointerDown: { type: Function, required: true },
|
|
16
|
+
onShapeDoubleClick: { type: Function, required: true },
|
|
17
|
+
},
|
|
18
|
+
setup(props) {
|
|
19
|
+
return () => {
|
|
20
|
+
const view = props.view;
|
|
21
|
+
const s = view.shape;
|
|
22
|
+
const isText = s.kind === 'text';
|
|
23
|
+
const isFrame = s.kind === 'frame';
|
|
24
|
+
const isDraw = s.kind === 'draw';
|
|
25
|
+
const isGroup = s.kind === 'group';
|
|
26
|
+
const fillable = !isText && !isFrame && !isDraw && !isGroup;
|
|
27
|
+
const style = {
|
|
28
|
+
left: `${s.x}px`,
|
|
29
|
+
top: `${s.y}px`,
|
|
30
|
+
width: `${s.width}px`,
|
|
31
|
+
height: `${s.height}px`,
|
|
32
|
+
transform: s.rotation ? `rotate(${s.rotation}deg)` : undefined,
|
|
33
|
+
background: fillable ? (s.style.fill ?? 'transparent') : undefined,
|
|
34
|
+
// A group is an INVISIBLE container (selectable region, no own paint); frame
|
|
35
|
+
// paints its own bg via CSS; text/draw have no border.
|
|
36
|
+
border: isText || isDraw || isGroup ? undefined : `${s.style.strokeWidth}px ${s.style.dash} ${s.style.stroke}`,
|
|
37
|
+
color: s.style.textColor,
|
|
38
|
+
fontSize: `${s.style.fontSize}px`,
|
|
39
|
+
opacity: s.style.opacity,
|
|
40
|
+
textAlign: s.style.textAlign,
|
|
41
|
+
};
|
|
42
|
+
const cls = `bm-wb__shape bm-wb__shape--${s.kind}`
|
|
43
|
+
+ (view.selected ? ' bm-wb__shape--selected' : '')
|
|
44
|
+
+ (s.locked ? ' bm-wb__shape--locked' : '')
|
|
45
|
+
+ (props.dropTarget ? ' bm-wb__shape--drop-target' : '');
|
|
46
|
+
return h('div', {
|
|
47
|
+
class: cls,
|
|
48
|
+
style,
|
|
49
|
+
'data-shape-id': s.id,
|
|
50
|
+
'data-kind': s.kind,
|
|
51
|
+
onPointerdown: props.onShapePointerDown,
|
|
52
|
+
onDblclick: props.onShapeDoubleClick,
|
|
53
|
+
}, [
|
|
54
|
+
isDraw && s.points
|
|
55
|
+
? h('svg', { class: 'bm-wb__draw', width: s.width, height: s.height, viewBox: `0 0 ${s.width} ${s.height}` }, [
|
|
56
|
+
h('path', {
|
|
57
|
+
d: whiteboardDrawPath(s.points), fill: 'none', stroke: s.style.stroke,
|
|
58
|
+
'stroke-width': s.style.strokeWidth, 'stroke-dasharray': whiteboardDashArray(s.style.dash),
|
|
59
|
+
'stroke-linecap': 'round', 'stroke-linejoin': 'round',
|
|
60
|
+
}),
|
|
61
|
+
])
|
|
62
|
+
: null,
|
|
63
|
+
!isDraw && (isText || isFrame || s.text) ? h('span', { class: 'bm-wb__shape-text' }, s.text) : null,
|
|
64
|
+
s.locked ? h('span', { class: 'bm-wb__lock-badge', 'aria-label': 'locked' }, '🔒') : null,
|
|
65
|
+
]);
|
|
66
|
+
};
|
|
67
|
+
},
|
|
68
|
+
});
|
|
69
|
+
//# sourceMappingURL=WhiteboardShape.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WhiteboardShape.js","sourceRoot":"","sources":["../../src/components/WhiteboardShape.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module @bimetal/whiteboard-vue-components
|
|
3
|
+
*
|
|
4
|
+
* The default Vue 3 whiteboard — the shipped component family's instance #5 (Vue).
|
|
5
|
+
* A thin binding over the canonical `@bimetal/whiteboard-headless` controller:
|
|
6
|
+
* infinite-canvas pan/zoom, shapes, drag/resize/rotate, connectors, freehand,
|
|
7
|
+
* smart guides, align/distribute, group/frames, comments, laser, a style panel,
|
|
8
|
+
* undo. Styles ship from `@bimetal/whiteboard-themes`.
|
|
9
|
+
*/
|
|
10
|
+
export { Whiteboard } from './components/Whiteboard.js';
|
|
11
|
+
export type { WhiteboardProps } from './components/Whiteboard.js';
|
|
12
|
+
export { WhiteboardShape } from './components/WhiteboardShape.js';
|
|
13
|
+
export { TransformHandles } from './components/TransformHandles.js';
|
|
14
|
+
export { StylePanel } from './components/StylePanel.js';
|
|
15
|
+
export { CommentThread } from './components/CommentThread.js';
|
|
16
|
+
export { TextDialog } from './components/TextDialog.js';
|
|
17
|
+
export * from '@bimetal/vue';
|
|
18
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,YAAY,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAGxD,cAAc,cAAc,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module @bimetal/whiteboard-vue-components
|
|
3
|
+
*
|
|
4
|
+
* The default Vue 3 whiteboard — the shipped component family's instance #5 (Vue).
|
|
5
|
+
* A thin binding over the canonical `@bimetal/whiteboard-headless` controller:
|
|
6
|
+
* infinite-canvas pan/zoom, shapes, drag/resize/rotate, connectors, freehand,
|
|
7
|
+
* smart guides, align/distribute, group/frames, comments, laser, a style panel,
|
|
8
|
+
* undo. Styles ship from `@bimetal/whiteboard-themes`.
|
|
9
|
+
*/
|
|
10
|
+
export { Whiteboard } from './components/Whiteboard.js';
|
|
11
|
+
export { WhiteboardShape } from './components/WhiteboardShape.js';
|
|
12
|
+
export { TransformHandles } from './components/TransformHandles.js';
|
|
13
|
+
export { StylePanel } from './components/StylePanel.js';
|
|
14
|
+
export { CommentThread } from './components/CommentThread.js';
|
|
15
|
+
export { TextDialog } from './components/TextDialog.js';
|
|
16
|
+
// Re-export the generic Vue whiteboard binding for convenience.
|
|
17
|
+
export * from '@bimetal/vue';
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAExD,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAExD,gEAAgE;AAChE,cAAc,cAAc,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@import '@bimetal/whiteboard-themes';
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { WhiteboardStore } from '@bimetal/whiteboard-data';
|
|
2
|
+
import type { WhiteboardConfigInput } from '@bimetal/whiteboard-headless';
|
|
3
|
+
export interface WhiteboardProps {
|
|
4
|
+
/** The canvas store. Immutable after mount (the controller is created once). */
|
|
5
|
+
store: WhiteboardStore;
|
|
6
|
+
/** Which canvas to render (entityId for all commands). Immutable after mount. */
|
|
7
|
+
canvasId: string;
|
|
8
|
+
/** Locale + metric overrides, merged with the defaults. */
|
|
9
|
+
config?: WhiteboardConfigInput;
|
|
10
|
+
/** Apply the dark token set (`data-theme="dark"`). */
|
|
11
|
+
darkMode?: boolean;
|
|
12
|
+
/** Surfaces infrastructure errors (a domain rejection is an undo toast). */
|
|
13
|
+
onError?: (err: unknown) => void;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAE1E,MAAM,WAAW,eAAe;IAC9B,gFAAgF;IAChF,KAAK,EAAE,eAAe,CAAC;IACvB,iFAAiF;IACjF,QAAQ,EAAE,MAAM,CAAC;IACjB,2DAA2D;IAC3D,MAAM,CAAC,EAAE,qBAAqB,CAAC;IAC/B,sDAAsD;IACtD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,4EAA4E;IAC5E,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,CAAC;CAClC"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|