@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 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): 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";
@@ -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 = 1;
696
- placeholder.height = 1;
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, updateMarkerScale_fn).call(this);
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
- updateMarkerScale_fn = function() {
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, 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 {
@@ -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 = 1;
2013
- placeholder.height = 1;
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, updateMarkerScale_fn).call(this);
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
- updateMarkerScale_fn = function() {
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.14",
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",