@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.
Files changed (37) hide show
  1. package/LICENSE +129 -0
  2. package/README.md +58 -0
  3. package/dist/.tsbuildinfo +1 -0
  4. package/dist/components/CommentThread.d.ts +82 -0
  5. package/dist/components/CommentThread.d.ts.map +1 -0
  6. package/dist/components/CommentThread.js +55 -0
  7. package/dist/components/CommentThread.js.map +1 -0
  8. package/dist/components/StylePanel.d.ts +39 -0
  9. package/dist/components/StylePanel.d.ts.map +1 -0
  10. package/dist/components/StylePanel.js +53 -0
  11. package/dist/components/StylePanel.js.map +1 -0
  12. package/dist/components/TextDialog.d.ts +59 -0
  13. package/dist/components/TextDialog.d.ts.map +1 -0
  14. package/dist/components/TextDialog.js +45 -0
  15. package/dist/components/TextDialog.js.map +1 -0
  16. package/dist/components/TransformHandles.d.ts +39 -0
  17. package/dist/components/TransformHandles.d.ts.map +1 -0
  18. package/dist/components/TransformHandles.js +40 -0
  19. package/dist/components/TransformHandles.js.map +1 -0
  20. package/dist/components/Whiteboard.d.ts +68 -0
  21. package/dist/components/Whiteboard.d.ts.map +1 -0
  22. package/dist/components/Whiteboard.js +356 -0
  23. package/dist/components/Whiteboard.js.map +1 -0
  24. package/dist/components/WhiteboardShape.d.ts +49 -0
  25. package/dist/components/WhiteboardShape.d.ts.map +1 -0
  26. package/dist/components/WhiteboardShape.js +69 -0
  27. package/dist/components/WhiteboardShape.js.map +1 -0
  28. package/dist/index.d.ts +18 -0
  29. package/dist/index.d.ts.map +1 -0
  30. package/dist/index.js +18 -0
  31. package/dist/index.js.map +1 -0
  32. package/dist/styles/index.css +1 -0
  33. package/dist/types.d.ts +15 -0
  34. package/dist/types.d.ts.map +1 -0
  35. package/dist/types.js +2 -0
  36. package/dist/types.js.map +1 -0
  37. 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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"}
@@ -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';
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}