@8btc/whiteboard 0.0.15 → 0.0.17

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 CHANGED
@@ -58,9 +58,13 @@ export declare class CanvasApi extends CanvasCore {
58
58
  /**
59
59
  * 导出带有标注的图片节点为图片
60
60
  * @param id - 图片节点 ID
61
- * @returns DataURL 格式的图片数据,如果节点不存在则返回 null
61
+ * @returns DataURL 格式的图片数据,如果节点或者 marker 不存在则返回 null
62
62
  */
63
- exportImageWithMarker(id: string): string | null;
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, updateMarkerScale_fn, setupEventHandlers_fn3, _canvasStage, _mainLayer, _canvasTransformer, _draftNode, _container, _handleKeyDown, _CanvasCore_instances, setupKeyboardEvents_fn;
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";
@@ -909,7 +909,7 @@ class ImageMarkerNode extends BaseCanvasNode {
909
909
  __privateSet(this, _text, __privateGet(this, _markerGroup).findOne("Text"));
910
910
  __privateMethod(this, _ImageMarkerNode_instances, setupEventHandlers_fn3).call(this);
911
911
  __privateSet(this, _handleViewportChange, () => {
912
- __privateMethod(this, _ImageMarkerNode_instances, updateMarkerScale_fn).call(this);
912
+ __privateMethod(this, _ImageMarkerNode_instances, changeVisulStyle_fn).call(this);
913
913
  });
914
914
  this.core.on("viewport:scale:change", __privateGet(this, _handleViewportChange));
915
915
  __privateSet(this, _handleNodesSelected, (selectedIds) => {
@@ -1065,7 +1065,7 @@ _ImageMarkerNode_instances = new WeakSet();
1065
1065
  /**
1066
1066
  * 更新标记点的缩放以保持视觉大小不变
1067
1067
  */
1068
- updateMarkerScale_fn = function() {
1068
+ changeVisulStyle_fn = function() {
1069
1069
  const stageScale = this.core.getStageScale();
1070
1070
  const radius = 14 / stageScale;
1071
1071
  const strokeWidth = 3 / stageScale;
@@ -1101,6 +1101,9 @@ setupEventHandlers_fn3 = function() {
1101
1101
  __privateGet(this, _markerGroup).on("pointerdown", () => {
1102
1102
  this.core.selectNode(this.node.id);
1103
1103
  });
1104
+ __privateGet(this, _markerGroup).on("transform", () => {
1105
+ console.log("image marker group on transform called");
1106
+ });
1104
1107
  };
1105
1108
  function createCanvasNodeByType(core, type, config, isDraft = false) {
1106
1109
  switch (type) {
@@ -1801,9 +1804,9 @@ class CanvasApi extends CanvasCore {
1801
1804
  /**
1802
1805
  * 导出带有标注的图片节点为图片
1803
1806
  * @param id - 图片节点 ID
1804
- * @returns DataURL 格式的图片数据,如果节点不存在则返回 null
1807
+ * @returns DataURL 格式的图片数据,如果节点或者 marker 不存在则返回 null
1805
1808
  */
1806
- exportImageWithMarker(id) {
1809
+ exportImageWithMarker(id, options) {
1807
1810
  const imageShape = this.getStage().findOne(`#${id}`);
1808
1811
  if (!imageShape) {
1809
1812
  console.warn("Image shape not found on stage");
@@ -1813,6 +1816,10 @@ class CanvasApi extends CanvasCore {
1813
1816
  const markerNodes = nodes.filter(
1814
1817
  (n) => n.type === "image-marker" && n.meta.parent === id
1815
1818
  );
1819
+ if (markerNodes.length === 0) {
1820
+ console.warn("No image-marker nodes found for the given image ID");
1821
+ return null;
1822
+ }
1816
1823
  const tempGroup = new Konva.Group();
1817
1824
  const imageClone = imageShape.clone();
1818
1825
  tempGroup.add(imageClone);
@@ -1820,16 +1827,42 @@ class CanvasApi extends CanvasCore {
1820
1827
  const markerShape = this.getStage().findOne(`#${markerNode.id}`);
1821
1828
  if (markerShape) {
1822
1829
  const markerClone = markerShape.clone();
1830
+ const rect = markerClone.findOne(".rect");
1831
+ const markerGroup = markerClone.findOne(".marker-group");
1832
+ if (rect) {
1833
+ rect.strokeWidth(3);
1834
+ rect.dash([5, 5]);
1835
+ rect.cornerRadius(6);
1836
+ }
1837
+ if (markerGroup) {
1838
+ const circle = markerGroup.findOne("Circle");
1839
+ const text = markerGroup.findOne("Text");
1840
+ if (circle) {
1841
+ circle.radius(14);
1842
+ circle.strokeWidth(3);
1843
+ }
1844
+ if (text) {
1845
+ const radius = 14;
1846
+ text.x(-radius);
1847
+ text.y(-radius);
1848
+ text.width(radius * 2);
1849
+ text.height(radius * 2);
1850
+ text.fontSize(16);
1851
+ }
1852
+ }
1823
1853
  tempGroup.add(markerClone);
1824
1854
  }
1825
1855
  });
1826
1856
  const box = tempGroup.getClientRect();
1857
+ console.log("Exporting image with markers, bounding box:", box);
1827
1858
  const dataURL = tempGroup.toDataURL({
1828
1859
  x: box.x,
1829
1860
  y: box.y,
1830
1861
  width: box.width,
1831
1862
  height: box.height,
1832
- pixelRatio: 2
1863
+ pixelRatio: options?.pixelRatio ?? 2,
1864
+ mimeType: options?.mimeType ?? "image/png",
1865
+ quality: options?.quality ?? 1
1833
1866
  });
1834
1867
  tempGroup.destroy();
1835
1868
  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, updateMarkerScale_fn, setupEventHandlers_fn3, _canvasStage, _mainLayer, _canvasTransformer, _draftNode, _container, _handleKeyDown, _CanvasCore_instances, setupKeyboardEvents_fn;
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 {
@@ -2226,7 +2226,7 @@ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "acce
2226
2226
  __privateSet(this, _text, __privateGet(this, _markerGroup).findOne("Text"));
2227
2227
  __privateMethod(this, _ImageMarkerNode_instances, setupEventHandlers_fn3).call(this);
2228
2228
  __privateSet(this, _handleViewportChange, () => {
2229
- __privateMethod(this, _ImageMarkerNode_instances, updateMarkerScale_fn).call(this);
2229
+ __privateMethod(this, _ImageMarkerNode_instances, changeVisulStyle_fn).call(this);
2230
2230
  });
2231
2231
  this.core.on("viewport:scale:change", __privateGet(this, _handleViewportChange));
2232
2232
  __privateSet(this, _handleNodesSelected, (selectedIds) => {
@@ -2382,7 +2382,7 @@ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "acce
2382
2382
  /**
2383
2383
  * 更新标记点的缩放以保持视觉大小不变
2384
2384
  */
2385
- updateMarkerScale_fn = function() {
2385
+ changeVisulStyle_fn = function() {
2386
2386
  const stageScale = this.core.getStageScale();
2387
2387
  const radius = 14 / stageScale;
2388
2388
  const strokeWidth = 3 / stageScale;
@@ -2418,6 +2418,9 @@ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "acce
2418
2418
  __privateGet(this, _markerGroup).on("pointerdown", () => {
2419
2419
  this.core.selectNode(this.node.id);
2420
2420
  });
2421
+ __privateGet(this, _markerGroup).on("transform", () => {
2422
+ console.log("image marker group on transform called");
2423
+ });
2421
2424
  };
2422
2425
  function createCanvasNodeByType(core, type, config, isDraft = false) {
2423
2426
  switch (type) {
@@ -3118,9 +3121,9 @@ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "acce
3118
3121
  /**
3119
3122
  * 导出带有标注的图片节点为图片
3120
3123
  * @param id - 图片节点 ID
3121
- * @returns DataURL 格式的图片数据,如果节点不存在则返回 null
3124
+ * @returns DataURL 格式的图片数据,如果节点或者 marker 不存在则返回 null
3122
3125
  */
3123
- exportImageWithMarker(id) {
3126
+ exportImageWithMarker(id, options) {
3124
3127
  const imageShape = this.getStage().findOne(`#${id}`);
3125
3128
  if (!imageShape) {
3126
3129
  console.warn("Image shape not found on stage");
@@ -3130,6 +3133,10 @@ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "acce
3130
3133
  const markerNodes = nodes.filter(
3131
3134
  (n) => n.type === "image-marker" && n.meta.parent === id
3132
3135
  );
3136
+ if (markerNodes.length === 0) {
3137
+ console.warn("No image-marker nodes found for the given image ID");
3138
+ return null;
3139
+ }
3133
3140
  const tempGroup = new Konva.Group();
3134
3141
  const imageClone = imageShape.clone();
3135
3142
  tempGroup.add(imageClone);
@@ -3137,16 +3144,42 @@ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "acce
3137
3144
  const markerShape = this.getStage().findOne(`#${markerNode.id}`);
3138
3145
  if (markerShape) {
3139
3146
  const markerClone = markerShape.clone();
3147
+ const rect = markerClone.findOne(".rect");
3148
+ const markerGroup = markerClone.findOne(".marker-group");
3149
+ if (rect) {
3150
+ rect.strokeWidth(3);
3151
+ rect.dash([5, 5]);
3152
+ rect.cornerRadius(6);
3153
+ }
3154
+ if (markerGroup) {
3155
+ const circle = markerGroup.findOne("Circle");
3156
+ const text = markerGroup.findOne("Text");
3157
+ if (circle) {
3158
+ circle.radius(14);
3159
+ circle.strokeWidth(3);
3160
+ }
3161
+ if (text) {
3162
+ const radius = 14;
3163
+ text.x(-radius);
3164
+ text.y(-radius);
3165
+ text.width(radius * 2);
3166
+ text.height(radius * 2);
3167
+ text.fontSize(16);
3168
+ }
3169
+ }
3140
3170
  tempGroup.add(markerClone);
3141
3171
  }
3142
3172
  });
3143
3173
  const box = tempGroup.getClientRect();
3174
+ console.log("Exporting image with markers, bounding box:", box);
3144
3175
  const dataURL = tempGroup.toDataURL({
3145
3176
  x: box.x,
3146
3177
  y: box.y,
3147
3178
  width: box.width,
3148
3179
  height: box.height,
3149
- pixelRatio: 2
3180
+ pixelRatio: options?.pixelRatio ?? 2,
3181
+ mimeType: options?.mimeType ?? "image/png",
3182
+ quality: options?.quality ?? 1
3150
3183
  });
3151
3184
  tempGroup.destroy();
3152
3185
  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.15",
4
+ "version": "0.0.17",
5
5
  "type": "module",
6
6
  "main": "./dist/index.umd.js",
7
7
  "module": "./dist/index.js",