@8btc/whiteboard 0.0.14 → 0.0.16
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.d.ts +5 -1
- package/dist/index.js +41 -7
- package/dist/index.umd.js +41 -7
- package/package.json +2 -2
package/dist/index.d.ts
CHANGED
|
@@ -60,7 +60,11 @@ export declare class CanvasApi extends CanvasCore {
|
|
|
60
60
|
* @param id - 图片节点 ID
|
|
61
61
|
* @returns DataURL 格式的图片数据,如果节点不存在则返回 null
|
|
62
62
|
*/
|
|
63
|
-
exportImageWithMarker(id: string
|
|
63
|
+
exportImageWithMarker(id: string, options?: {
|
|
64
|
+
pixelRatio?: number;
|
|
65
|
+
mimeType?: string;
|
|
66
|
+
quality?: number;
|
|
67
|
+
}): string | null;
|
|
64
68
|
/**
|
|
65
69
|
* 删除当前选中的节点
|
|
66
70
|
* 如果删除的是 image 节点,会同步删除所有关联的 image-marker
|
package/dist/index.js
CHANGED
|
@@ -9,7 +9,7 @@ var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read fr
|
|
|
9
9
|
var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
10
10
|
var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
|
|
11
11
|
var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
|
|
12
|
-
var _core, _stage, _viewport, _handleWheel, _handlePointerDown, _handlePointerMove, _handlePointerUp, _handleDragStart, _handleDragMove, _handleDragEnd, _CanvasStage_instances, setupEventListeners_fn, _core2, _transformer, _handleTransformStart, _handleTransform, _handleTransformEnd, _handleDragStart2, _handleDragMove2, _handleDragEnd2, _CanvasTransformer_instances, setupEventListeners_fn2, _toolTypeChangeHandler, _RectNode_instances, setupEventHandlers_fn, _ImageNode_instances, loadImage_fn, _toolTypeChangeHandler2, setupEventHandlers_fn2, syncImageMarkers_fn, syncImageMarkersToState_fn, _rect, _markerGroup, _circle, _text, _handleViewportChange, _handleNodesSelected, _ImageMarkerNode_instances,
|
|
12
|
+
var _core, _stage, _viewport, _handleWheel, _handlePointerDown, _handlePointerMove, _handlePointerUp, _handleDragStart, _handleDragMove, _handleDragEnd, _CanvasStage_instances, setupEventListeners_fn, _core2, _transformer, _handleTransformStart, _handleTransform, _handleTransformEnd, _handleDragStart2, _handleDragMove2, _handleDragEnd2, _CanvasTransformer_instances, setupEventListeners_fn2, _toolTypeChangeHandler, _RectNode_instances, setupEventHandlers_fn, _ImageNode_instances, loadImage_fn, _toolTypeChangeHandler2, setupEventHandlers_fn2, syncImageMarkers_fn, syncImageMarkersToState_fn, _rect, _markerGroup, _circle, _text, _handleViewportChange, _handleNodesSelected, _ImageMarkerNode_instances, changeVisulStyle_fn, setupEventHandlers_fn3, _canvasStage, _mainLayer, _canvasTransformer, _draftNode, _container, _handleKeyDown, _CanvasCore_instances, setupKeyboardEvents_fn;
|
|
13
13
|
import { jsxs, jsx, Fragment } from "react/jsx-runtime";
|
|
14
14
|
import { useState, useEffect, useRef } from "react";
|
|
15
15
|
import Konva from "konva";
|
|
@@ -691,13 +691,18 @@ class ImageNode extends BaseCanvasNode {
|
|
|
691
691
|
__privateMethod(this, _ImageNode_instances, setupEventHandlers_fn2).call(this, this.getElement());
|
|
692
692
|
}
|
|
693
693
|
createElement() {
|
|
694
|
+
const width = this.node.props.width || IMAGE.MIN_SIZE;
|
|
695
|
+
const height = this.node.props.height || IMAGE.MIN_SIZE;
|
|
694
696
|
const placeholder = document.createElement("canvas");
|
|
695
|
-
placeholder.width =
|
|
696
|
-
placeholder.height =
|
|
697
|
+
placeholder.width = width;
|
|
698
|
+
placeholder.height = height;
|
|
697
699
|
const img = new Konva.Image({
|
|
698
700
|
id: this.node.id,
|
|
699
701
|
x: this.node.props.x,
|
|
700
702
|
y: this.node.props.y,
|
|
703
|
+
width,
|
|
704
|
+
height,
|
|
705
|
+
rotation: this.node.props.rotation || 0,
|
|
701
706
|
name: `${NODE_NAMES.nodeRoot} ${NODE_NAMES.selectable} ${NODE_NAMES.image}`,
|
|
702
707
|
draggable: true,
|
|
703
708
|
image: placeholder
|
|
@@ -904,7 +909,7 @@ class ImageMarkerNode extends BaseCanvasNode {
|
|
|
904
909
|
__privateSet(this, _text, __privateGet(this, _markerGroup).findOne("Text"));
|
|
905
910
|
__privateMethod(this, _ImageMarkerNode_instances, setupEventHandlers_fn3).call(this);
|
|
906
911
|
__privateSet(this, _handleViewportChange, () => {
|
|
907
|
-
__privateMethod(this, _ImageMarkerNode_instances,
|
|
912
|
+
__privateMethod(this, _ImageMarkerNode_instances, changeVisulStyle_fn).call(this);
|
|
908
913
|
});
|
|
909
914
|
this.core.on("viewport:scale:change", __privateGet(this, _handleViewportChange));
|
|
910
915
|
__privateSet(this, _handleNodesSelected, (selectedIds) => {
|
|
@@ -1060,7 +1065,7 @@ _ImageMarkerNode_instances = new WeakSet();
|
|
|
1060
1065
|
/**
|
|
1061
1066
|
* 更新标记点的缩放以保持视觉大小不变
|
|
1062
1067
|
*/
|
|
1063
|
-
|
|
1068
|
+
changeVisulStyle_fn = function() {
|
|
1064
1069
|
const stageScale = this.core.getStageScale();
|
|
1065
1070
|
const radius = 14 / stageScale;
|
|
1066
1071
|
const strokeWidth = 3 / stageScale;
|
|
@@ -1096,6 +1101,9 @@ setupEventHandlers_fn3 = function() {
|
|
|
1096
1101
|
__privateGet(this, _markerGroup).on("pointerdown", () => {
|
|
1097
1102
|
this.core.selectNode(this.node.id);
|
|
1098
1103
|
});
|
|
1104
|
+
__privateGet(this, _markerGroup).on("transform", () => {
|
|
1105
|
+
console.log("image marker group on transform called");
|
|
1106
|
+
});
|
|
1099
1107
|
};
|
|
1100
1108
|
function createCanvasNodeByType(core, type, config, isDraft = false) {
|
|
1101
1109
|
switch (type) {
|
|
@@ -1798,7 +1806,7 @@ class CanvasApi extends CanvasCore {
|
|
|
1798
1806
|
* @param id - 图片节点 ID
|
|
1799
1807
|
* @returns DataURL 格式的图片数据,如果节点不存在则返回 null
|
|
1800
1808
|
*/
|
|
1801
|
-
exportImageWithMarker(id) {
|
|
1809
|
+
exportImageWithMarker(id, options) {
|
|
1802
1810
|
const imageShape = this.getStage().findOne(`#${id}`);
|
|
1803
1811
|
if (!imageShape) {
|
|
1804
1812
|
console.warn("Image shape not found on stage");
|
|
@@ -1815,16 +1823,42 @@ class CanvasApi extends CanvasCore {
|
|
|
1815
1823
|
const markerShape = this.getStage().findOne(`#${markerNode.id}`);
|
|
1816
1824
|
if (markerShape) {
|
|
1817
1825
|
const markerClone = markerShape.clone();
|
|
1826
|
+
const rect = markerClone.findOne(".rect");
|
|
1827
|
+
const markerGroup = markerClone.findOne(".marker-group");
|
|
1828
|
+
if (rect) {
|
|
1829
|
+
rect.strokeWidth(3);
|
|
1830
|
+
rect.dash([5, 5]);
|
|
1831
|
+
rect.cornerRadius(6);
|
|
1832
|
+
}
|
|
1833
|
+
if (markerGroup) {
|
|
1834
|
+
const circle = markerGroup.findOne("Circle");
|
|
1835
|
+
const text = markerGroup.findOne("Text");
|
|
1836
|
+
if (circle) {
|
|
1837
|
+
circle.radius(14);
|
|
1838
|
+
circle.strokeWidth(3);
|
|
1839
|
+
}
|
|
1840
|
+
if (text) {
|
|
1841
|
+
const radius = 14;
|
|
1842
|
+
text.x(-radius);
|
|
1843
|
+
text.y(-radius);
|
|
1844
|
+
text.width(radius * 2);
|
|
1845
|
+
text.height(radius * 2);
|
|
1846
|
+
text.fontSize(16);
|
|
1847
|
+
}
|
|
1848
|
+
}
|
|
1818
1849
|
tempGroup.add(markerClone);
|
|
1819
1850
|
}
|
|
1820
1851
|
});
|
|
1821
1852
|
const box = tempGroup.getClientRect();
|
|
1853
|
+
console.log("Exporting image with markers, bounding box:", box);
|
|
1822
1854
|
const dataURL = tempGroup.toDataURL({
|
|
1823
1855
|
x: box.x,
|
|
1824
1856
|
y: box.y,
|
|
1825
1857
|
width: box.width,
|
|
1826
1858
|
height: box.height,
|
|
1827
|
-
pixelRatio: 2
|
|
1859
|
+
pixelRatio: options?.pixelRatio ?? 2,
|
|
1860
|
+
mimeType: options?.mimeType ?? "image/png",
|
|
1861
|
+
quality: options?.quality ?? 1
|
|
1828
1862
|
});
|
|
1829
1863
|
tempGroup.destroy();
|
|
1830
1864
|
return dataURL;
|
package/dist/index.umd.js
CHANGED
|
@@ -13,7 +13,7 @@ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot
|
|
|
13
13
|
var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
|
|
14
14
|
var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
|
|
15
15
|
|
|
16
|
-
var _core, _stage, _viewport, _handleWheel, _handlePointerDown, _handlePointerMove, _handlePointerUp, _handleDragStart, _handleDragMove, _handleDragEnd, _CanvasStage_instances, setupEventListeners_fn, _core2, _transformer, _handleTransformStart, _handleTransform, _handleTransformEnd, _handleDragStart2, _handleDragMove2, _handleDragEnd2, _CanvasTransformer_instances, setupEventListeners_fn2, _toolTypeChangeHandler, _RectNode_instances, setupEventHandlers_fn, _ImageNode_instances, loadImage_fn, _toolTypeChangeHandler2, setupEventHandlers_fn2, syncImageMarkers_fn, syncImageMarkersToState_fn, _rect, _markerGroup, _circle, _text, _handleViewportChange, _handleNodesSelected, _ImageMarkerNode_instances,
|
|
16
|
+
var _core, _stage, _viewport, _handleWheel, _handlePointerDown, _handlePointerMove, _handlePointerUp, _handleDragStart, _handleDragMove, _handleDragEnd, _CanvasStage_instances, setupEventListeners_fn, _core2, _transformer, _handleTransformStart, _handleTransform, _handleTransformEnd, _handleDragStart2, _handleDragMove2, _handleDragEnd2, _CanvasTransformer_instances, setupEventListeners_fn2, _toolTypeChangeHandler, _RectNode_instances, setupEventHandlers_fn, _ImageNode_instances, loadImage_fn, _toolTypeChangeHandler2, setupEventHandlers_fn2, syncImageMarkers_fn, syncImageMarkersToState_fn, _rect, _markerGroup, _circle, _text, _handleViewportChange, _handleNodesSelected, _ImageMarkerNode_instances, changeVisulStyle_fn, setupEventHandlers_fn3, _canvasStage, _mainLayer, _canvasTransformer, _draftNode, _container, _handleKeyDown, _CanvasCore_instances, setupKeyboardEvents_fn;
|
|
17
17
|
var __vite_style__ = document.createElement("style");
|
|
18
18
|
__vite_style__.textContent = `/*! tailwindcss v4.1.18 | MIT License | https://tailwindcss.com */
|
|
19
19
|
@layer properties {
|
|
@@ -2008,13 +2008,18 @@ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "acce
|
|
|
2008
2008
|
__privateMethod(this, _ImageNode_instances, setupEventHandlers_fn2).call(this, this.getElement());
|
|
2009
2009
|
}
|
|
2010
2010
|
createElement() {
|
|
2011
|
+
const width = this.node.props.width || IMAGE.MIN_SIZE;
|
|
2012
|
+
const height = this.node.props.height || IMAGE.MIN_SIZE;
|
|
2011
2013
|
const placeholder = document.createElement("canvas");
|
|
2012
|
-
placeholder.width =
|
|
2013
|
-
placeholder.height =
|
|
2014
|
+
placeholder.width = width;
|
|
2015
|
+
placeholder.height = height;
|
|
2014
2016
|
const img = new Konva.Image({
|
|
2015
2017
|
id: this.node.id,
|
|
2016
2018
|
x: this.node.props.x,
|
|
2017
2019
|
y: this.node.props.y,
|
|
2020
|
+
width,
|
|
2021
|
+
height,
|
|
2022
|
+
rotation: this.node.props.rotation || 0,
|
|
2018
2023
|
name: `${NODE_NAMES.nodeRoot} ${NODE_NAMES.selectable} ${NODE_NAMES.image}`,
|
|
2019
2024
|
draggable: true,
|
|
2020
2025
|
image: placeholder
|
|
@@ -2221,7 +2226,7 @@ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "acce
|
|
|
2221
2226
|
__privateSet(this, _text, __privateGet(this, _markerGroup).findOne("Text"));
|
|
2222
2227
|
__privateMethod(this, _ImageMarkerNode_instances, setupEventHandlers_fn3).call(this);
|
|
2223
2228
|
__privateSet(this, _handleViewportChange, () => {
|
|
2224
|
-
__privateMethod(this, _ImageMarkerNode_instances,
|
|
2229
|
+
__privateMethod(this, _ImageMarkerNode_instances, changeVisulStyle_fn).call(this);
|
|
2225
2230
|
});
|
|
2226
2231
|
this.core.on("viewport:scale:change", __privateGet(this, _handleViewportChange));
|
|
2227
2232
|
__privateSet(this, _handleNodesSelected, (selectedIds) => {
|
|
@@ -2377,7 +2382,7 @@ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "acce
|
|
|
2377
2382
|
/**
|
|
2378
2383
|
* 更新标记点的缩放以保持视觉大小不变
|
|
2379
2384
|
*/
|
|
2380
|
-
|
|
2385
|
+
changeVisulStyle_fn = function() {
|
|
2381
2386
|
const stageScale = this.core.getStageScale();
|
|
2382
2387
|
const radius = 14 / stageScale;
|
|
2383
2388
|
const strokeWidth = 3 / stageScale;
|
|
@@ -2413,6 +2418,9 @@ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "acce
|
|
|
2413
2418
|
__privateGet(this, _markerGroup).on("pointerdown", () => {
|
|
2414
2419
|
this.core.selectNode(this.node.id);
|
|
2415
2420
|
});
|
|
2421
|
+
__privateGet(this, _markerGroup).on("transform", () => {
|
|
2422
|
+
console.log("image marker group on transform called");
|
|
2423
|
+
});
|
|
2416
2424
|
};
|
|
2417
2425
|
function createCanvasNodeByType(core, type, config, isDraft = false) {
|
|
2418
2426
|
switch (type) {
|
|
@@ -3115,7 +3123,7 @@ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "acce
|
|
|
3115
3123
|
* @param id - 图片节点 ID
|
|
3116
3124
|
* @returns DataURL 格式的图片数据,如果节点不存在则返回 null
|
|
3117
3125
|
*/
|
|
3118
|
-
exportImageWithMarker(id) {
|
|
3126
|
+
exportImageWithMarker(id, options) {
|
|
3119
3127
|
const imageShape = this.getStage().findOne(`#${id}`);
|
|
3120
3128
|
if (!imageShape) {
|
|
3121
3129
|
console.warn("Image shape not found on stage");
|
|
@@ -3132,16 +3140,42 @@ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "acce
|
|
|
3132
3140
|
const markerShape = this.getStage().findOne(`#${markerNode.id}`);
|
|
3133
3141
|
if (markerShape) {
|
|
3134
3142
|
const markerClone = markerShape.clone();
|
|
3143
|
+
const rect = markerClone.findOne(".rect");
|
|
3144
|
+
const markerGroup = markerClone.findOne(".marker-group");
|
|
3145
|
+
if (rect) {
|
|
3146
|
+
rect.strokeWidth(3);
|
|
3147
|
+
rect.dash([5, 5]);
|
|
3148
|
+
rect.cornerRadius(6);
|
|
3149
|
+
}
|
|
3150
|
+
if (markerGroup) {
|
|
3151
|
+
const circle = markerGroup.findOne("Circle");
|
|
3152
|
+
const text = markerGroup.findOne("Text");
|
|
3153
|
+
if (circle) {
|
|
3154
|
+
circle.radius(14);
|
|
3155
|
+
circle.strokeWidth(3);
|
|
3156
|
+
}
|
|
3157
|
+
if (text) {
|
|
3158
|
+
const radius = 14;
|
|
3159
|
+
text.x(-radius);
|
|
3160
|
+
text.y(-radius);
|
|
3161
|
+
text.width(radius * 2);
|
|
3162
|
+
text.height(radius * 2);
|
|
3163
|
+
text.fontSize(16);
|
|
3164
|
+
}
|
|
3165
|
+
}
|
|
3135
3166
|
tempGroup.add(markerClone);
|
|
3136
3167
|
}
|
|
3137
3168
|
});
|
|
3138
3169
|
const box = tempGroup.getClientRect();
|
|
3170
|
+
console.log("Exporting image with markers, bounding box:", box);
|
|
3139
3171
|
const dataURL = tempGroup.toDataURL({
|
|
3140
3172
|
x: box.x,
|
|
3141
3173
|
y: box.y,
|
|
3142
3174
|
width: box.width,
|
|
3143
3175
|
height: box.height,
|
|
3144
|
-
pixelRatio: 2
|
|
3176
|
+
pixelRatio: options?.pixelRatio ?? 2,
|
|
3177
|
+
mimeType: options?.mimeType ?? "image/png",
|
|
3178
|
+
quality: options?.quality ?? 1
|
|
3145
3179
|
});
|
|
3146
3180
|
tempGroup.destroy();
|
|
3147
3181
|
return dataURL;
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@8btc/whiteboard",
|
|
3
3
|
"private": false,
|
|
4
|
-
"version": "0.0.
|
|
4
|
+
"version": "0.0.16",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.umd.js",
|
|
7
7
|
"module": "./dist/index.js",
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"**/*.css"
|
|
21
21
|
],
|
|
22
22
|
"scripts": {
|
|
23
|
-
"dev": "vite --port 6999",
|
|
23
|
+
"dev": "vite --port 6999 --host",
|
|
24
24
|
"build": "tsc -b && vite build",
|
|
25
25
|
"lint": "eslint .",
|
|
26
26
|
"preview": "vite preview",
|