@cs-open/react-fabric 0.0.3

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 (256) hide show
  1. package/LICENSE +21 -0
  2. package/dist/cjs/components/BackgroundImage/index.cjs +2 -0
  3. package/dist/cjs/components/BackgroundImage/index.cjs.map +1 -0
  4. package/dist/cjs/components/Canvas/index.cjs +2 -0
  5. package/dist/cjs/components/Canvas/index.cjs.map +1 -0
  6. package/dist/cjs/components/Control/index.cjs +2 -0
  7. package/dist/cjs/components/Control/index.cjs.map +1 -0
  8. package/dist/cjs/components/Ellipse/index.cjs +2 -0
  9. package/dist/cjs/components/Ellipse/index.cjs.map +1 -0
  10. package/dist/cjs/components/Group/index.cjs +2 -0
  11. package/dist/cjs/components/Group/index.cjs.map +1 -0
  12. package/dist/cjs/components/Image/index.cjs +2 -0
  13. package/dist/cjs/components/Image/index.cjs.map +1 -0
  14. package/dist/cjs/components/Line/index.cjs +2 -0
  15. package/dist/cjs/components/Line/index.cjs.map +1 -0
  16. package/dist/cjs/components/Loading/index.cjs +2 -0
  17. package/dist/cjs/components/Loading/index.cjs.map +1 -0
  18. package/dist/cjs/components/NodeToolbarPortal/index.cjs +2 -0
  19. package/dist/cjs/components/NodeToolbarPortal/index.cjs.map +1 -0
  20. package/dist/cjs/components/Objects/index.cjs +2 -0
  21. package/dist/cjs/components/Objects/index.cjs.map +1 -0
  22. package/dist/cjs/components/Path/index.cjs +2 -0
  23. package/dist/cjs/components/Path/index.cjs.map +1 -0
  24. package/dist/cjs/components/ReactFabricProvider.cjs +2 -0
  25. package/dist/cjs/components/ReactFabricProvider.cjs.map +1 -0
  26. package/dist/cjs/components/Rect/index.cjs +2 -0
  27. package/dist/cjs/components/Rect/index.cjs.map +1 -0
  28. package/dist/cjs/components/StoreUpdater/index.cjs +2 -0
  29. package/dist/cjs/components/StoreUpdater/index.cjs.map +1 -0
  30. package/dist/cjs/components/Text/index.cjs +2 -0
  31. package/dist/cjs/components/Text/index.cjs.map +1 -0
  32. package/dist/cjs/constants.cjs +2 -0
  33. package/dist/cjs/constants.cjs.map +1 -0
  34. package/dist/cjs/container/ReactFabric/Wrapper.cjs +2 -0
  35. package/dist/cjs/container/ReactFabric/Wrapper.cjs.map +1 -0
  36. package/dist/cjs/container/ReactFabric/index.cjs +2 -0
  37. package/dist/cjs/container/ReactFabric/index.cjs.map +1 -0
  38. package/dist/cjs/contexts/StoreContext.cjs +2 -0
  39. package/dist/cjs/contexts/StoreContext.cjs.map +1 -0
  40. package/dist/cjs/hooks/useCreateObject.cjs +2 -0
  41. package/dist/cjs/hooks/useCreateObject.cjs.map +1 -0
  42. package/dist/cjs/hooks/useDidUpdate.cjs +2 -0
  43. package/dist/cjs/hooks/useDidUpdate.cjs.map +1 -0
  44. package/dist/cjs/hooks/useDraggable.cjs +2 -0
  45. package/dist/cjs/hooks/useDraggable.cjs.map +1 -0
  46. package/dist/cjs/hooks/useReactFabric.cjs +2 -0
  47. package/dist/cjs/hooks/useReactFabric.cjs.map +1 -0
  48. package/dist/cjs/hooks/useResizeHandler.cjs +2 -0
  49. package/dist/cjs/hooks/useResizeHandler.cjs.map +1 -0
  50. package/dist/cjs/hooks/useSplitProps.cjs +2 -0
  51. package/dist/cjs/hooks/useSplitProps.cjs.map +1 -0
  52. package/dist/cjs/hooks/useStore.cjs +2 -0
  53. package/dist/cjs/hooks/useStore.cjs.map +1 -0
  54. package/dist/cjs/hooks/useZoom.cjs +2 -0
  55. package/dist/cjs/hooks/useZoom.cjs.map +1 -0
  56. package/dist/cjs/index.cjs +2 -0
  57. package/dist/cjs/index.cjs.map +1 -0
  58. package/dist/cjs/plugins/FreeRect.cjs +2 -0
  59. package/dist/cjs/plugins/FreeRect.cjs.map +1 -0
  60. package/dist/cjs/plugins/GridLine.cjs +5 -0
  61. package/dist/cjs/plugins/GridLine.cjs.map +1 -0
  62. package/dist/cjs/plugins/Pinch.cjs +2 -0
  63. package/dist/cjs/plugins/Pinch.cjs.map +1 -0
  64. package/dist/cjs/store/index.cjs +2 -0
  65. package/dist/cjs/store/index.cjs.map +1 -0
  66. package/dist/cjs/store/initialState.cjs +2 -0
  67. package/dist/cjs/store/initialState.cjs.map +1 -0
  68. package/dist/cjs/toolbar/Vertical/index.cjs +2 -0
  69. package/dist/cjs/toolbar/Vertical/index.cjs.map +1 -0
  70. package/dist/cjs/types/canvas.cjs +2 -0
  71. package/dist/cjs/types/canvas.cjs.map +1 -0
  72. package/dist/cjs/types/component-props.cjs +2 -0
  73. package/dist/cjs/types/component-props.cjs.map +1 -0
  74. package/dist/cjs/types/general.cjs +2 -0
  75. package/dist/cjs/types/general.cjs.map +1 -0
  76. package/dist/cjs/types/nodes.cjs +2 -0
  77. package/dist/cjs/types/nodes.cjs.map +1 -0
  78. package/dist/cjs/types/object.cjs +2 -0
  79. package/dist/cjs/types/object.cjs.map +1 -0
  80. package/dist/cjs/types/store.cjs +2 -0
  81. package/dist/cjs/types/store.cjs.map +1 -0
  82. package/dist/cjs/types/utils.cjs +2 -0
  83. package/dist/cjs/types/utils.cjs.map +1 -0
  84. package/dist/cjs/utils/constants.cjs +2 -0
  85. package/dist/cjs/utils/constants.cjs.map +1 -0
  86. package/dist/cjs/utils/dom.cjs +2 -0
  87. package/dist/cjs/utils/dom.cjs.map +1 -0
  88. package/dist/cjs/utils/events.cjs +2 -0
  89. package/dist/cjs/utils/events.cjs.map +1 -0
  90. package/dist/cjs/utils/position.cjs +2 -0
  91. package/dist/cjs/utils/position.cjs.map +1 -0
  92. package/dist/cjs/utils/props.cjs +2 -0
  93. package/dist/cjs/utils/props.cjs.map +1 -0
  94. package/dist/esm/components/BackgroundImage/index.mjs +2 -0
  95. package/dist/esm/components/BackgroundImage/index.mjs.map +1 -0
  96. package/dist/esm/components/Canvas/index.mjs +2 -0
  97. package/dist/esm/components/Canvas/index.mjs.map +1 -0
  98. package/dist/esm/components/Control/index.mjs +2 -0
  99. package/dist/esm/components/Control/index.mjs.map +1 -0
  100. package/dist/esm/components/Ellipse/index.mjs +2 -0
  101. package/dist/esm/components/Ellipse/index.mjs.map +1 -0
  102. package/dist/esm/components/Group/index.mjs +2 -0
  103. package/dist/esm/components/Group/index.mjs.map +1 -0
  104. package/dist/esm/components/Line/index.mjs +2 -0
  105. package/dist/esm/components/Line/index.mjs.map +1 -0
  106. package/dist/esm/components/Loading/index.mjs +2 -0
  107. package/dist/esm/components/Loading/index.mjs.map +1 -0
  108. package/dist/esm/components/NodeToolbarPortal/index.mjs +2 -0
  109. package/dist/esm/components/NodeToolbarPortal/index.mjs.map +1 -0
  110. package/dist/esm/components/Objects/index.mjs +2 -0
  111. package/dist/esm/components/Objects/index.mjs.map +1 -0
  112. package/dist/esm/components/Path/index.mjs +2 -0
  113. package/dist/esm/components/Path/index.mjs.map +1 -0
  114. package/dist/esm/components/ReactFabricProvider.mjs +2 -0
  115. package/dist/esm/components/ReactFabricProvider.mjs.map +1 -0
  116. package/dist/esm/components/Rect/index.mjs +2 -0
  117. package/dist/esm/components/Rect/index.mjs.map +1 -0
  118. package/dist/esm/components/StoreUpdater/index.mjs +2 -0
  119. package/dist/esm/components/StoreUpdater/index.mjs.map +1 -0
  120. package/dist/esm/components/Text/index.mjs +2 -0
  121. package/dist/esm/components/Text/index.mjs.map +1 -0
  122. package/dist/esm/container/ReactFabric/Wrapper.mjs +2 -0
  123. package/dist/esm/container/ReactFabric/Wrapper.mjs.map +1 -0
  124. package/dist/esm/container/ReactFabric/index.mjs +2 -0
  125. package/dist/esm/container/ReactFabric/index.mjs.map +1 -0
  126. package/dist/esm/contexts/StoreContext.mjs +2 -0
  127. package/dist/esm/contexts/StoreContext.mjs.map +1 -0
  128. package/dist/esm/hooks/useCreateObject.mjs +2 -0
  129. package/dist/esm/hooks/useCreateObject.mjs.map +1 -0
  130. package/dist/esm/hooks/useDidUpdate.mjs +2 -0
  131. package/dist/esm/hooks/useDidUpdate.mjs.map +1 -0
  132. package/dist/esm/hooks/useDraggable.mjs +2 -0
  133. package/dist/esm/hooks/useDraggable.mjs.map +1 -0
  134. package/dist/esm/hooks/useReactFabric.mjs +2 -0
  135. package/dist/esm/hooks/useReactFabric.mjs.map +1 -0
  136. package/dist/esm/hooks/useResizeHandler.mjs +2 -0
  137. package/dist/esm/hooks/useResizeHandler.mjs.map +1 -0
  138. package/dist/esm/hooks/useSplitProps.mjs +2 -0
  139. package/dist/esm/hooks/useSplitProps.mjs.map +1 -0
  140. package/dist/esm/hooks/useStore.mjs +2 -0
  141. package/dist/esm/hooks/useStore.mjs.map +1 -0
  142. package/dist/esm/hooks/useZoom.mjs +2 -0
  143. package/dist/esm/hooks/useZoom.mjs.map +1 -0
  144. package/dist/esm/index.mjs +2 -0
  145. package/dist/esm/index.mjs.map +1 -0
  146. package/dist/esm/plugins/FreeRect.mjs +2 -0
  147. package/dist/esm/plugins/FreeRect.mjs.map +1 -0
  148. package/dist/esm/plugins/GridLine.mjs +5 -0
  149. package/dist/esm/plugins/GridLine.mjs.map +1 -0
  150. package/dist/esm/plugins/Pinch.mjs +2 -0
  151. package/dist/esm/plugins/Pinch.mjs.map +1 -0
  152. package/dist/esm/store/index.mjs +2 -0
  153. package/dist/esm/store/index.mjs.map +1 -0
  154. package/dist/esm/store/initialState.mjs +2 -0
  155. package/dist/esm/store/initialState.mjs.map +1 -0
  156. package/dist/esm/toolbar/Vertical/index.mjs +2 -0
  157. package/dist/esm/toolbar/Vertical/index.mjs.map +1 -0
  158. package/dist/esm/utils/constants.mjs +2 -0
  159. package/dist/esm/utils/constants.mjs.map +1 -0
  160. package/dist/esm/utils/events.mjs +2 -0
  161. package/dist/esm/utils/events.mjs.map +1 -0
  162. package/dist/esm/utils/props.mjs +2 -0
  163. package/dist/esm/utils/props.mjs.map +1 -0
  164. package/dist/types/components/BackgroundImage/index.d.ts +19 -0
  165. package/dist/types/components/BackgroundImage/index.d.ts.map +1 -0
  166. package/dist/types/components/Canvas/index.d.ts +11 -0
  167. package/dist/types/components/Canvas/index.d.ts.map +1 -0
  168. package/dist/types/components/Control/index.d.ts +28 -0
  169. package/dist/types/components/Control/index.d.ts.map +1 -0
  170. package/dist/types/components/Ellipse/index.d.ts +19 -0
  171. package/dist/types/components/Ellipse/index.d.ts.map +1 -0
  172. package/dist/types/components/Group/index.d.ts +24 -0
  173. package/dist/types/components/Group/index.d.ts.map +1 -0
  174. package/dist/types/components/Image/index.d.ts +18 -0
  175. package/dist/types/components/Image/index.d.ts.map +1 -0
  176. package/dist/types/components/Line/index.d.ts +11 -0
  177. package/dist/types/components/Line/index.d.ts.map +1 -0
  178. package/dist/types/components/Loading/index.d.ts +3 -0
  179. package/dist/types/components/Loading/index.d.ts.map +1 -0
  180. package/dist/types/components/NodeToolbarPortal/index.d.ts +9 -0
  181. package/dist/types/components/NodeToolbarPortal/index.d.ts.map +1 -0
  182. package/dist/types/components/Objects/index.d.ts +9 -0
  183. package/dist/types/components/Objects/index.d.ts.map +1 -0
  184. package/dist/types/components/Path/index.d.ts +11 -0
  185. package/dist/types/components/Path/index.d.ts.map +1 -0
  186. package/dist/types/components/ReactFabricProvider.d.ts +11 -0
  187. package/dist/types/components/ReactFabricProvider.d.ts.map +1 -0
  188. package/dist/types/components/Rect/index.d.ts +20 -0
  189. package/dist/types/components/Rect/index.d.ts.map +1 -0
  190. package/dist/types/components/StoreUpdater/index.d.ts +8 -0
  191. package/dist/types/components/StoreUpdater/index.d.ts.map +1 -0
  192. package/dist/types/components/Text/index.d.ts +11 -0
  193. package/dist/types/components/Text/index.d.ts.map +1 -0
  194. package/dist/types/constants.d.ts +5 -0
  195. package/dist/types/constants.d.ts.map +1 -0
  196. package/dist/types/container/ReactFabric/Wrapper.d.ts +10 -0
  197. package/dist/types/container/ReactFabric/Wrapper.d.ts.map +1 -0
  198. package/dist/types/container/ReactFabric/index.d.ts +69 -0
  199. package/dist/types/container/ReactFabric/index.d.ts.map +1 -0
  200. package/dist/types/contexts/StoreContext.d.ts +4 -0
  201. package/dist/types/contexts/StoreContext.d.ts.map +1 -0
  202. package/dist/types/hooks/useCreateObject.d.ts +15 -0
  203. package/dist/types/hooks/useCreateObject.d.ts.map +1 -0
  204. package/dist/types/hooks/useDidUpdate.d.ts +9 -0
  205. package/dist/types/hooks/useDidUpdate.d.ts.map +1 -0
  206. package/dist/types/hooks/useDraggable.d.ts +3 -0
  207. package/dist/types/hooks/useDraggable.d.ts.map +1 -0
  208. package/dist/types/hooks/useReactFabric.d.ts +55 -0
  209. package/dist/types/hooks/useReactFabric.d.ts.map +1 -0
  210. package/dist/types/hooks/useResizeHandler.d.ts +3 -0
  211. package/dist/types/hooks/useResizeHandler.d.ts.map +1 -0
  212. package/dist/types/hooks/useSplitProps.d.ts +15 -0
  213. package/dist/types/hooks/useSplitProps.d.ts.map +1 -0
  214. package/dist/types/hooks/useStore.d.ts +13 -0
  215. package/dist/types/hooks/useStore.d.ts.map +1 -0
  216. package/dist/types/hooks/useZoom.d.ts +2 -0
  217. package/dist/types/hooks/useZoom.d.ts.map +1 -0
  218. package/dist/types/index.d.ts +29 -0
  219. package/dist/types/index.d.ts.map +1 -0
  220. package/dist/types/plugins/FreeRect.d.ts +15 -0
  221. package/dist/types/plugins/FreeRect.d.ts.map +1 -0
  222. package/dist/types/plugins/GridLine.d.ts +7 -0
  223. package/dist/types/plugins/GridLine.d.ts.map +1 -0
  224. package/dist/types/plugins/Pinch.d.ts +8 -0
  225. package/dist/types/plugins/Pinch.d.ts.map +1 -0
  226. package/dist/types/store/index.d.ts +10 -0
  227. package/dist/types/store/index.d.ts.map +1 -0
  228. package/dist/types/store/initialState.d.ts +12 -0
  229. package/dist/types/store/initialState.d.ts.map +1 -0
  230. package/dist/types/toolbar/Vertical/index.d.ts +10 -0
  231. package/dist/types/toolbar/Vertical/index.d.ts.map +1 -0
  232. package/dist/types/types/canvas.d.ts +15 -0
  233. package/dist/types/types/canvas.d.ts.map +1 -0
  234. package/dist/types/types/component-props.d.ts +41 -0
  235. package/dist/types/types/component-props.d.ts.map +1 -0
  236. package/dist/types/types/general.d.ts +2 -0
  237. package/dist/types/types/general.d.ts.map +1 -0
  238. package/dist/types/types/nodes.d.ts +91 -0
  239. package/dist/types/types/nodes.d.ts.map +1 -0
  240. package/dist/types/types/object.d.ts +22 -0
  241. package/dist/types/types/object.d.ts.map +1 -0
  242. package/dist/types/types/store.d.ts +59 -0
  243. package/dist/types/types/store.d.ts.map +1 -0
  244. package/dist/types/types/utils.d.ts +6 -0
  245. package/dist/types/types/utils.d.ts.map +1 -0
  246. package/dist/types/utils/constants.d.ts +5 -0
  247. package/dist/types/utils/constants.d.ts.map +1 -0
  248. package/dist/types/utils/dom.d.ts +3 -0
  249. package/dist/types/utils/dom.d.ts.map +1 -0
  250. package/dist/types/utils/events.d.ts +5 -0
  251. package/dist/types/utils/events.d.ts.map +1 -0
  252. package/dist/types/utils/position.d.ts +9 -0
  253. package/dist/types/utils/position.d.ts.map +1 -0
  254. package/dist/types/utils/props.d.ts +4 -0
  255. package/dist/types/utils/props.d.ts.map +1 -0
  256. package/package.json +100 -0
@@ -0,0 +1,2 @@
1
+ "use client";import{useMemo as s}from"react";import{UNCONTROLLED_PROPS as h}from"../utils/constants.mjs";const l=o=>{h.forEach(t=>{const r=`default${t.charAt(0).toUpperCase()}${t.slice(1)}`;if(o[t]!==void 0&&o[r]!==void 0)throw new Error(`Cannot use both controlled '${t}' and uncontrolled '${r}' for the same property. Either use controlled mode with '${t}', or uncontrolled mode with '${r}', but not both.`)});const i=s(()=>JSON.stringify(Object.fromEntries(Object.entries(o).filter(([t])=>!t.startsWith("on")&&!t.startsWith("default")))),[o]),n=s(()=>{const t={};return Object.entries(o).forEach(([r,e])=>{r.startsWith("on")&&(t[r]=e)}),t},[o]),c=s(()=>{const t={};return Object.entries(o).forEach(([r,e])=>{r.startsWith("default")&&(t[r]=e)}),t},[o]),a=s(()=>{const t={};return Object.entries(o).forEach(([r,e])=>{!r.startsWith("on")&&!r.startsWith("default")&&(t[r]=e)}),t},[i]);return[n,a,c]};export{l as useSplitProps};
2
+ //# sourceMappingURL=useSplitProps.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSplitProps.mjs","sources":["../../../src/hooks/useSplitProps.ts"],"sourcesContent":["import { useMemo } from 'react'\nimport type { AllCanvasEvents } from '../types/canvas'\nimport { UNCONTROLLED_PROPS } from '../utils/constants'\n\n// 提取 default 属性的键\ntype DefaultKeys<T> = keyof T & `default${string}`\n\n// 从 default 属性名转换为普通属性名\ntype DefaultToRegular<T> = {\n [K in DefaultKeys<T> as Uncapitalize<K extends `default${infer R}` ? R : never>]: T[K]\n}\n\n// 返回类型定义\ntype SplitResult<T> = [\n { [K in keyof AllCanvasEvents]?: AllCanvasEvents[K] }, // listeners\n Omit<T, keyof AllCanvasEvents | DefaultKeys<T>>, // attributes\n DefaultToRegular<T>, // defaults\n]\n\n// TODO 同时存在defaultValue和attributes时,defaultValue优先级更高,进行报错,受控非受控模式只能二选一\nexport const useSplitProps = <T extends Record<string, any>>(props: T): SplitResult<T> => {\n // 检查属性冲突\n UNCONTROLLED_PROPS.forEach(prop => {\n const defaultProp = `default${prop.charAt(0).toUpperCase()}${prop.slice(1)}`\n if (props[prop] !== undefined && props[defaultProp] !== undefined) {\n throw new Error(\n `Cannot use both controlled '${prop}' and uncontrolled '${defaultProp}' for the same property. ` +\n `Either use controlled mode with '${prop}', or uncontrolled mode with '${defaultProp}', but not both.`,\n )\n }\n })\n\n // 计算非事件和非default属性的值的字符串表示\n const nonEventAndDefaultPropsString = useMemo(\n () =>\n JSON.stringify(\n Object.fromEntries(\n Object.entries(props).filter(([key]) => !key.startsWith('on') && !key.startsWith('default')),\n ),\n ),\n [props],\n )\n\n // 事件处理函数\n const listeners = useMemo(() => {\n const result: { [key: string]: any } = {}\n Object.entries(props).forEach(([key, value]) => {\n if (key.startsWith('on')) {\n result[key] = value\n }\n })\n return result as { [K in keyof AllCanvasEvents]?: AllCanvasEvents[K] }\n }, [props])\n\n // default 属性\n const defaults = useMemo(() => {\n const result: Record<string, unknown> = {}\n Object.entries(props).forEach(([key, value]) => {\n if (key.startsWith('default')) {\n result[key] = value\n }\n })\n return result as DefaultToRegular<T>\n }, [props])\n\n // 其他属性\n const attributes = useMemo(\n () => {\n const result: { [key: string]: any } = {}\n Object.entries(props).forEach(([key, value]) => {\n if (!key.startsWith('on') && !key.startsWith('default')) {\n result[key] = value\n }\n })\n return result as Omit<T, keyof AllCanvasEvents | DefaultKeys<T>>\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [nonEventAndDefaultPropsString],\n )\n\n return [listeners, attributes, defaults]\n}\n"],"names":["useSplitProps","props","UNCONTROLLED_PROPS","prop","defaultProp","nonEventAndDefaultPropsString","useMemo","key","listeners","result","value","defaults","attributes"],"mappings":"yGAoBa,MAAAA,EAAgDC,GAA6B,CAExFC,EAAmB,QAAQC,GAAQ,CACjC,MAAMC,EAAc,UAAUD,EAAK,OAAO,CAAC,EAAE,YAAY,CAAC,GAAGA,EAAK,MAAM,CAAC,CAAC,GAC1E,GAAIF,EAAME,CAAI,IAAM,QAAaF,EAAMG,CAAW,IAAM,OACtD,MAAM,IAAI,MACR,+BAA+BD,CAAI,uBAAuBC,CAAW,6DAC/BD,CAAI,iCAAiCC,CAAW,kBACxF,CAEJ,CAAC,EAGD,MAAMC,EAAgCC,EACpC,IACE,KAAK,UACH,OAAO,YACL,OAAO,QAAQL,CAAK,EAAE,OAAO,CAAC,CAACM,CAAG,IAAM,CAACA,EAAI,WAAW,IAAI,GAAK,CAACA,EAAI,WAAW,SAAS,CAAC,CAC7F,CACF,EACF,CAACN,CAAK,CACR,EAGMO,EAAYF,EAAQ,IAAM,CAC9B,MAAMG,EAAiC,GACvC,OAAO,OAAA,QAAQR,CAAK,EAAE,QAAQ,CAAC,CAACM,EAAKG,CAAK,IAAM,CAC1CH,EAAI,WAAW,IAAI,IACrBE,EAAOF,CAAG,EAAIG,EAElB,CAAC,EACMD,CACT,EAAG,CAACR,CAAK,CAAC,EAGJU,EAAWL,EAAQ,IAAM,CAC7B,MAAMG,EAAkC,GACxC,cAAO,QAAQR,CAAK,EAAE,QAAQ,CAAC,CAACM,EAAKG,CAAK,IAAM,CAC1CH,EAAI,WAAW,SAAS,IAC1BE,EAAOF,CAAG,EAAIG,EAElB,CAAC,EACMD,CACT,EAAG,CAACR,CAAK,CAAC,EAGJW,EAAaN,EACjB,IAAM,CACJ,MAAMG,EAAiC,GACvC,OAAA,OAAO,QAAQR,CAAK,EAAE,QAAQ,CAAC,CAACM,EAAKG,CAAK,IAAM,CAC1C,CAACH,EAAI,WAAW,IAAI,GAAK,CAACA,EAAI,WAAW,SAAS,IACpDE,EAAOF,CAAG,EAAIG,EAElB,CAAC,EACMD,CACT,EAEA,CAACJ,CAA6B,CAChC,EAEA,MAAO,CAACG,EAAWI,EAAYD,CAAQ,CACzC"}
@@ -0,0 +1,2 @@
1
+ "use client";import{useContext as r,useMemo as s}from"react";import{useStoreWithEqualityFn as n}from"zustand/traditional";import o from"../contexts/StoreContext.mjs";function i(t,u){const e=r(o);if(e===null)throw new Error("\u7F3A\u5931zustandProvider");return n(e,t,u)}function a(){const t=r(o);if(t===null)throw new Error("\u7F3A\u5931zustandProvider");return s(()=>({getState:t.getState,setState:t.setState,subscribe:t.subscribe}),[t])}export{i as useStore,a as useStoreApi};
2
+ //# sourceMappingURL=useStore.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useStore.mjs","sources":["../../../src/hooks/useStore.ts"],"sourcesContent":["import { useContext, useMemo } from 'react'\nimport type { StoreApi } from 'zustand'\nimport type { UseBoundStoreWithEqualityFn } from 'zustand/traditional'\nimport { useStoreWithEqualityFn as useZustandStore } from 'zustand/traditional'\nimport StoreContext from '../contexts/StoreContext'\nimport type { Node } from '../types/nodes'\nimport type { ReactFabricState } from '../types/store'\n\nfunction useStore<StateSlice = unknown>(\n selector: (state: ReactFabricState) => StateSlice,\n equalityFn?: (a: StateSlice, b: StateSlice) => boolean,\n) {\n const store = useContext(StoreContext)\n\n if (store === null) {\n throw new Error('缺失zustandProvider')\n }\n\n return useZustandStore(store, selector, equalityFn)\n}\n\nfunction useStoreApi<NodeType extends Node = Node>() {\n const store = useContext(StoreContext) as UseBoundStoreWithEqualityFn<StoreApi<ReactFabricState<NodeType>>> | null\n\n if (store === null) {\n throw new Error('缺失zustandProvider')\n }\n\n return useMemo(\n () => ({\n getState: store.getState,\n setState: store.setState,\n subscribe: store.subscribe,\n }),\n [store],\n )\n}\n\nexport { useStore, useStoreApi }\n"],"names":["useStore","selector","equalityFn","store","useContext","StoreContext","useZustandStore","useStoreApi","useMemo"],"mappings":"sKAQA,SAASA,EACPC,EACAC,EACA,CACA,MAAMC,EAAQC,EAAWC,CAAY,EAErC,GAAIF,IAAU,KACZ,MAAM,IAAI,MAAM,6BAAmB,EAGrC,OAAOG,EAAgBH,EAAOF,EAAUC,CAAU,CACpD,CAEA,SAASK,GAA4C,CACnD,MAAMJ,EAAQC,EAAWC,CAAY,EAErC,GAAIF,IAAU,KACZ,MAAM,IAAI,MAAM,6BAAmB,EAGrC,OAAOK,EACL,KAAO,CACL,SAAUL,EAAM,SAChB,SAAUA,EAAM,SAChB,UAAWA,EAAM,SACnB,GACA,CAACA,CAAK,CACR,CACF"}
@@ -0,0 +1,2 @@
1
+ "use client";import{shallow as r}from"zustand/shallow";import{useStore as t}from"./useStore.mjs";const e=o=>o.zoom;function s(){return t(e,r)}export{s as useZoom};
2
+ //# sourceMappingURL=useZoom.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useZoom.mjs","sources":["../../../src/hooks/useZoom.ts"],"sourcesContent":["import { shallow } from 'zustand/shallow'\nimport { useStore } from '../hooks/useStore'\nimport type { ReactFabricState } from '../types/store'\n\nconst nodesSelector = (state: ReactFabricState) => state.zoom\n\nexport function useZoom(): number {\n const zoom = useStore(nodesSelector, shallow)\n\n return zoom\n}\n"],"names":["nodesSelector","state","useZoom","useStore","shallow"],"mappings":"iGAIA,MAAMA,EAAiBC,GAA4BA,EAAM,cAEzCC,GAAkB,CAGhC,OAFaC,EAASH,EAAeI,CAAO,CAG9C"}
@@ -0,0 +1,2 @@
1
+ "use client";import{default as o}from"./container/ReactFabric/index.mjs";import{useReactFabric as t}from"./hooks/useReactFabric.mjs";import{useZoom as l}from"./hooks/useZoom.mjs";import{default as s}from"./toolbar/Vertical/index.mjs";import{default as p}from"./components/BackgroundImage/index.mjs";import{default as x}from"./components/Canvas/index.mjs";import{default as c}from"./components/Group/index.mjs";import{default as P}from"./components/NodeToolbarPortal/index.mjs";import{ReactFabricProvider as g}from"./components/ReactFabricProvider.mjs";import{default as F}from"./components/Rect/index.mjs";import{default as h}from"./components/Control/index.mjs";import{default as C}from"./components/Text/index.mjs";import{default as L}from"./components/Path/index.mjs";import{default as k}from"./components/Line/index.mjs";import{default as E}from"./components/Ellipse/index.mjs";import{default as N}from"./components/Objects/index.mjs";import{default as V}from"./plugins/FreeRect.mjs";import{default as q}from"./plugins/GridLine.mjs";import{default as y}from"./plugins/Pinch.mjs";export{p as BackgroundImage,x as Canvas,h as Control,E as Ellipse,c as Group,k as Line,P as NodeToolbarPortal,N as Objects,L as Path,V as PluginFreeRect,q as PluginGridLine,y as PluginPinch,s as PluginToolbarVertical,o as ReactFabric,g as ReactFabricProvider,F as Rect,C as Text,t as useReactFabric,l as useZoom};
2
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ "use client";import{Rect as C}from"fabric";import{useRef as i,useMemo as M,useEffect as x}from"react";import{useStoreApi as k}from"../hooks/useStore.mjs";const a={stroke:"#04aa65",strokeWidth:5,fill:"transparent"},W=({onComplete:f,disableWhenActive:d=!0,...u})=>{const m=k(),o=i(null),t=i(null),c=i(!1),l=i(!1),h=M(()=>u?.strokeWidth??a.strokeWidth,[u?.strokeWidth]);return x(()=>{const{canvas:e}=m.getState();if(!e)return;const y=e.hoverCursor;e.hoverCursor="crosshair";const p=r=>{if(!o.current||!t.current)return;const{x:n,y:s}=e.getScenePoint(r.e);t.current.set({left:Math.min(o.current.x,n),top:Math.min(o.current.y,s),width:Math.abs(n-o.current.x)-h,height:Math.abs(s-o.current.y)-h}),t.current.setCoords(),e.requestRenderAll()},v=()=>{if(e.off("mouse:move",p),e.off("mouse:up",v),!t.current)return;const r=t.current,n=()=>{e.remove(r),o.current=null,t.current=null,c.current=!1,l.current=!1,e.requestRenderAll()};if(r.width<10||r.height<10)n();else{const s=r.getCoords();l.current=!0,Promise.resolve(f({...a,...u,left:r.left,top:r.top,width:r.width,height:r.height,pointsArray:s.reduce((A,w)=>[...A,Math.round(w.x),Math.round(w.y)],[])},{canvas:e})).finally(n)}},g=r=>{if(c.current||l.current)return;const n=e.getScenePoint(r.e);o.current=n,!(d&&e.getActiveObject())&&(c.current=!0,t.current=new C({...a,left:n.x,top:n.y,width:0,height:0,...u}),e.add(t.current),e.on("mouse:move",p),e.on("mouse:up",v))};return e.on("mouse:down",g),()=>{e.hoverCursor=y,e.off("mouse:down",g),t.current&&e.remove(t.current),c.current=!1,e.requestRenderAll()}},[m,f,u,h,d]),null};export{W as default};
2
+ //# sourceMappingURL=FreeRect.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FreeRect.mjs","sources":["../../../src/plugins/FreeRect.tsx"],"sourcesContent":["import type { Canvas, RectProps, TPointerEvent, TPointerEventInfo } from 'fabric'\nimport { Rect } from 'fabric'\nimport { useEffect, useMemo, useRef } from 'react'\nimport { useStoreApi } from '../hooks/useStore'\n\nexport type FreeRectProps = Partial<RectProps> & {\n onComplete: (\n rectProps: Required<\n Pick<RectProps, 'left' | 'top' | 'width' | 'height'> & {\n pointsArray: number[]\n }\n > &\n RectProps,\n { canvas }: { canvas: Canvas },\n ) => Promise<void>\n /**\n * 当画布有选中对象时,是否禁用\n */\n disableWhenActive?: boolean\n}\n\nconst DEFAULT_OPTIONS: Pick<RectProps, 'stroke' | 'strokeWidth' | 'fill'> = {\n stroke: '#04aa65',\n strokeWidth: 5,\n fill: 'transparent',\n}\n\nconst FreeRect = ({ onComplete, disableWhenActive = true, ...rectProps }: FreeRectProps) => {\n const store = useStoreApi()\n const mouseDownPoint = useRef<{ x: number; y: number } | null>(null)\n const rectRef = useRef<Rect | null>(null)\n const isDrawing = useRef(false)\n const isCompleting = useRef(false)\n const strokeWidth = useMemo(() => rectProps?.strokeWidth ?? DEFAULT_OPTIONS.strokeWidth, [rectProps?.strokeWidth])\n\n useEffect(() => {\n const { canvas } = store.getState()\n if (!canvas) return\n const originHoverCursor = canvas.hoverCursor\n canvas.hoverCursor = 'crosshair'\n\n const handleMouseMove = (opt: TPointerEventInfo<TPointerEvent>) => {\n if (!mouseDownPoint.current || !rectRef.current) return\n\n const { x: currentX, y: currentY } = canvas.getScenePoint(opt.e)\n\n rectRef.current.set({\n left: Math.min(mouseDownPoint.current.x, currentX),\n top: Math.min(mouseDownPoint.current.y, currentY),\n width: Math.abs(currentX - mouseDownPoint.current.x) - strokeWidth,\n height: Math.abs(currentY - mouseDownPoint.current.y) - strokeWidth,\n })\n\n rectRef.current.setCoords()\n canvas.requestRenderAll()\n }\n\n const handleMouseUp = () => {\n canvas.off('mouse:move', handleMouseMove)\n canvas.off('mouse:up', handleMouseUp)\n if (!rectRef.current) return\n\n const currentRect = rectRef.current\n\n const cleanup = () => {\n canvas.remove(currentRect)\n mouseDownPoint.current = null\n rectRef.current = null\n isDrawing.current = false\n isCompleting.current = false\n canvas.requestRenderAll()\n }\n\n if (currentRect.width < 10 || currentRect.height < 10) {\n cleanup()\n } else {\n const coords = currentRect.getCoords()\n isCompleting.current = true\n Promise.resolve(\n onComplete(\n {\n ...DEFAULT_OPTIONS,\n ...(rectProps as RectProps),\n left: currentRect.left,\n top: currentRect.top,\n width: currentRect.width,\n height: currentRect.height,\n pointsArray: coords.reduce<number[]>(\n (acc, coord) => [...acc, Math.round(coord.x), Math.round(coord.y)],\n [],\n ),\n },\n {\n canvas: canvas,\n },\n ),\n ).finally(cleanup)\n }\n }\n\n const handleMouseDown = (opt: TPointerEventInfo<TPointerEvent>) => {\n if (isDrawing.current || isCompleting.current) return\n\n const point = canvas.getScenePoint(opt.e)\n mouseDownPoint.current = point\n\n if (disableWhenActive) {\n const activeObject = canvas.getActiveObject()\n if (activeObject) {\n return\n }\n }\n\n isDrawing.current = true\n rectRef.current = new Rect({\n ...DEFAULT_OPTIONS,\n left: point.x,\n top: point.y,\n width: 0,\n height: 0,\n ...rectProps,\n })\n canvas.add(rectRef.current)\n\n canvas.on('mouse:move', handleMouseMove)\n canvas.on('mouse:up', handleMouseUp)\n }\n\n canvas.on('mouse:down', handleMouseDown)\n\n return () => {\n canvas.hoverCursor = originHoverCursor\n canvas.off('mouse:down', handleMouseDown)\n if (rectRef.current) {\n canvas.remove(rectRef.current)\n }\n isDrawing.current = false\n canvas.requestRenderAll()\n }\n }, [store, onComplete, rectProps, strokeWidth, disableWhenActive])\n\n return null\n}\n\nexport default FreeRect\n"],"names":["DEFAULT_OPTIONS","FreeRect","onComplete","disableWhenActive","rectProps","store","useStoreApi","mouseDownPoint","useRef","rectRef","isDrawing","isCompleting","strokeWidth","useMemo","useEffect","canvas","originHoverCursor","handleMouseMove","opt","currentX","currentY","handleMouseUp","currentRect","cleanup","coords","acc","coord","handleMouseDown","point","Rect"],"mappings":"0JAqBA,MAAMA,EAAsE,CAC1E,OAAQ,UACR,YAAa,EACb,KAAM,aACR,EAEMC,EAAW,CAAC,CAAE,WAAAC,EAAY,kBAAAC,EAAoB,GAAM,GAAGC,CAAU,IAAqB,CAC1F,MAAMC,EAAQC,IACRC,EAAiBC,EAAwC,IAAI,EAC7DC,EAAUD,EAAoB,IAAI,EAClCE,EAAYF,EAAO,EAAK,EACxBG,EAAeH,EAAO,EAAK,EAC3BI,EAAcC,EAAQ,IAAMT,GAAW,aAAeJ,EAAgB,YAAa,CAACI,GAAW,WAAW,CAAC,EAEjH,OAAAU,EAAU,IAAM,CACd,KAAM,CAAE,OAAAC,CAAO,EAAIV,EAAM,SACzB,EAAA,GAAI,CAACU,EAAQ,OACb,MAAMC,EAAoBD,EAAO,YACjCA,EAAO,YAAc,YAErB,MAAME,EAAmBC,GAA0C,CACjE,GAAI,CAACX,EAAe,SAAW,CAACE,EAAQ,QAAS,OAEjD,KAAM,CAAE,EAAGU,EAAU,EAAGC,CAAS,EAAIL,EAAO,cAAcG,EAAI,CAAC,EAE/DT,EAAQ,QAAQ,IAAI,CAClB,KAAM,KAAK,IAAIF,EAAe,QAAQ,EAAGY,CAAQ,EACjD,IAAK,KAAK,IAAIZ,EAAe,QAAQ,EAAGa,CAAQ,EAChD,MAAO,KAAK,IAAID,EAAWZ,EAAe,QAAQ,CAAC,EAAIK,EACvD,OAAQ,KAAK,IAAIQ,EAAWb,EAAe,QAAQ,CAAC,EAAIK,CAC1D,CAAC,EAEDH,EAAQ,QAAQ,UAAA,EAChBM,EAAO,iBAAA,CACT,EAEMM,EAAgB,IAAM,CAG1B,GAFAN,EAAO,IAAI,aAAcE,CAAe,EACxCF,EAAO,IAAI,WAAYM,CAAa,EAChC,CAACZ,EAAQ,QAAS,OAEtB,MAAMa,EAAcb,EAAQ,QAEtBc,EAAU,IAAM,CACpBR,EAAO,OAAOO,CAAW,EACzBf,EAAe,QAAU,KACzBE,EAAQ,QAAU,KAClBC,EAAU,QAAU,GACpBC,EAAa,QAAU,GACvBI,EAAO,iBAAiB,CAC1B,EAEA,GAAIO,EAAY,MAAQ,IAAMA,EAAY,OAAS,GACjDC,QACK,CACL,MAAMC,EAASF,EAAY,YAC3BX,EAAa,QAAU,GACvB,QAAQ,QACNT,EACE,CACE,GAAGF,EACH,GAAII,EACJ,KAAMkB,EAAY,KAClB,IAAKA,EAAY,IACjB,MAAOA,EAAY,MACnB,OAAQA,EAAY,OACpB,YAAaE,EAAO,OAClB,CAACC,EAAKC,IAAU,CAAC,GAAGD,EAAK,KAAK,MAAMC,EAAM,CAAC,EAAG,KAAK,MAAMA,EAAM,CAAC,CAAC,EACjE,CACF,CAAA,CACF,EACA,CACE,OAAQX,CACV,CACF,CACF,EAAE,QAAQQ,CAAO,CACnB,CACF,EAEMI,EAAmBT,GAA0C,CACjE,GAAIR,EAAU,SAAWC,EAAa,QAAS,OAE/C,MAAMiB,EAAQb,EAAO,cAAcG,EAAI,CAAC,EACxCX,EAAe,QAAUqB,EAErB,EAAAzB,GACmBY,EAAO,gBAAgB,KAM9CL,EAAU,QAAU,GACpBD,EAAQ,QAAU,IAAIoB,EAAK,CACzB,GAAG7B,EACH,KAAM4B,EAAM,EACZ,IAAKA,EAAM,EACX,MAAO,EACP,OAAQ,EACR,GAAGxB,CACL,CAAC,EACDW,EAAO,IAAIN,EAAQ,OAAO,EAE1BM,EAAO,GAAG,aAAcE,CAAe,EACvCF,EAAO,GAAG,WAAYM,CAAa,EACrC,EAEA,OAAAN,EAAO,GAAG,aAAcY,CAAe,EAEhC,IAAM,CACXZ,EAAO,YAAcC,EACrBD,EAAO,IAAI,aAAcY,CAAe,EACpClB,EAAQ,SACVM,EAAO,OAAON,EAAQ,OAAO,EAE/BC,EAAU,QAAU,GACpBK,EAAO,kBACT,CACF,EAAG,CAACV,EAAOH,EAAYE,EAAWQ,EAAaT,CAAiB,CAAC,EAE1D,IACT"}
@@ -0,0 +1,5 @@
1
+ "use client";import{jsx as a}from"react/jsx-runtime";import{memo as r}from"react";const t={pointerEvents:"none",position:"absolute",inset:0,"--s":"20px","--n":3,"--t":"1px","--g":"3px","--c":"#1890ff70 25%, #0000 0",background:`conic-gradient(at var(--g) var(--t), var(--c)) calc((var(--s) / var(--n) - var(--g) + var(--t)) / 2) 0 /
2
+ calc(var(--s) / var(--n)) var(--s),
3
+ conic-gradient(from 180deg at var(--t) var(--g), var(--c)) 0 calc((var(--s) / var(--n) - var(--g) + var(--t)) / 2) /
4
+ var(--s) calc(var(--s) / var(--n))`},v=r(()=>a("div",{style:t}));export{v as default};
5
+ //# sourceMappingURL=GridLine.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GridLine.mjs","sources":["../../../src/plugins/GridLine.tsx"],"sourcesContent":["import type { CSSProperties } from 'react'\nimport { memo } from 'react'\n\nexport interface MyCustomCSS extends CSSProperties {\n [key: `--${string}`]: number | string\n}\n\nconst gridLinesStyle: MyCustomCSS = {\n pointerEvents: 'none',\n position: 'absolute',\n inset: 0,\n '--s': '20px' /* control the size of the grid */,\n '--n': 3 /* control the granularity */,\n '--t': '1px' /* the thickness */,\n '--g': '3px' /* the gap between dashes */,\n '--c': '#1890ff70 25%, #0000 0',\n background: `conic-gradient(at var(--g) var(--t), var(--c)) calc((var(--s) / var(--n) - var(--g) + var(--t)) / 2) 0 /\n calc(var(--s) / var(--n)) var(--s),\n conic-gradient(from 180deg at var(--t) var(--g), var(--c)) 0 calc((var(--s) / var(--n) - var(--g) + var(--t)) / 2) /\n var(--s) calc(var(--s) / var(--n))`,\n /* you probably don't need to set any size in your case */\n /* width: calc(round(down, 100%, var(--s)) + var(--t));\n height: calc(4 * var(--s) + var(--t)); */\n}\n\nconst GridLine = memo(() => {\n return <div style={gridLinesStyle}></div>\n})\n\nexport default GridLine\n"],"names":["gridLinesStyle","GridLine","memo","jsx"],"mappings":"kFAOMA,MAAAA,EAA8B,CAClC,cAAe,OACf,SAAU,WACV,MAAO,EACP,MAAO,OACP,MAAO,EACP,MAAO,MACP,MAAO,MACP,MAAO,yBACP,WAAY;AAAA;AAAA;AAAA,yCAOd,EAEMC,EAAWC,EAAK,IACbC,EAAC,OAAI,MAAOH,CAAAA,CAAgB,CACpC"}
@@ -0,0 +1,2 @@
1
+ "use client";import{useRef as E,useEffect as S}from"react";import{useStoreApi as g}from"../hooks/useStore.mjs";import Z from"hammerjs";import{Point as u}from"fabric";const d=()=>{const o=g(),{canvas:c}=o.getState(),r=E(1);return S(()=>{const a=t=>{const{canvas:s,manualZoom:l,fitZoom:p,minManualZoom:i,maxManualZoom:f}=o.getState();let n=t.scale*l;n<=i&&(n=i),n>=f&&(n=f);const v=n*p,h=t.srcEvent instanceof TouchEvent?new u(t.srcEvent.touches[0].clientX,t.srcEvent.touches[0].clientY):new u(t.srcEvent.offsetX,t.srcEvent.offsetY);s?.zoomToPoint(h,v),r.current=n},m=()=>{const{fitZoom:t}=o.getState(),s=r.current*t;o.setState({manualZoom:r.current,zoom:s})};if(!c)return;const e=new Z(c.getSelectionElement());return e.get("pinch").set({enable:!0}),e.on("pinchmove",a),e.on("pinchend",m),()=>{e&&(e.off("pinchmove",a),e.off("pinchend",m),e.destroy())}},[c,o]),null};export{d as default};
2
+ //# sourceMappingURL=Pinch.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Pinch.mjs","sources":["../../../src/plugins/Pinch.tsx"],"sourcesContent":["import { useEffect, useRef } from 'react'\nimport { useStoreApi } from '../hooks/useStore'\nimport Hammer from 'hammerjs'\nimport { Point } from 'fabric'\n\n/**\n * 双指缩放(捏)\n * @param fabric\n * @returns\n */\nconst Pinch = () => {\n const store = useStoreApi()\n const { canvas } = store.getState()\n // 双指缩放记录\n const newManualZoomRef = useRef(1)\n /**\n * 注册时间\n */\n useEffect(() => {\n /**\n * 双指缩放\n * @param e\n */\n const onPinchMove = (e: HammerInput) => {\n const { canvas, manualZoom, fitZoom, minManualZoom, maxManualZoom } = store.getState()\n let newManualZoom = e.scale * manualZoom\n // 最小缩放限制\n if (newManualZoom <= minManualZoom) {\n newManualZoom = minManualZoom\n }\n // 最大缩放限制\n if (newManualZoom >= maxManualZoom) {\n newManualZoom = maxManualZoom\n }\n // 计算原图比例\n const combinedZoom = newManualZoom * fitZoom\n // 渲染更新\n const point =\n e.srcEvent instanceof TouchEvent\n ? new Point(e.srcEvent.touches[0].clientX, e.srcEvent.touches[0].clientY)\n : new Point(e.srcEvent.offsetX, e.srcEvent.offsetY)\n canvas?.zoomToPoint(point, combinedZoom)\n // 记录手动缩放比例,onPinchEnd使用\n newManualZoomRef.current = newManualZoom\n }\n /**\n * 缩放结束\n */\n const onPinchEnd = () => {\n const { fitZoom } = store.getState()\n const combinedZoom = newManualZoomRef.current * fitZoom\n store.setState({\n manualZoom: newManualZoomRef.current,\n zoom: combinedZoom,\n })\n }\n if (!canvas) return\n\n const hammer = new Hammer(canvas.getSelectionElement())\n // 启用 pinch 事件识别器\n hammer.get('pinch').set({ enable: true })\n hammer.on('pinchmove', onPinchMove)\n hammer.on('pinchend', onPinchEnd)\n\n return () => {\n if (hammer) {\n hammer.off('pinchmove', onPinchMove)\n hammer.off('pinchend', onPinchEnd)\n hammer.destroy()\n }\n }\n }, [canvas, store])\n\n return null\n}\n\nexport default Pinch\n"],"names":["Pinch","store","useStoreApi","canvas","newManualZoomRef","useRef","useEffect","onPinchMove","e","manualZoom","fitZoom","minManualZoom","maxManualZoom","newManualZoom","combinedZoom","point","Point","onPinchEnd","hammer","Hammer"],"mappings":"4KAUMA,EAAQ,IAAM,CAClB,MAAMC,EAAQC,EAAAA,EACR,CAAE,OAAAC,CAAO,EAAIF,EAAM,WAEnBG,EAAmBC,EAAO,CAAC,EAIjC,OAAAC,EAAU,IAAM,CAKd,MAAMC,EAAeC,GAAmB,CACtC,KAAM,CAAE,OAAAL,EAAQ,WAAAM,EAAY,QAAAC,EAAS,cAAAC,EAAe,cAAAC,CAAc,EAAIX,EAAM,WAC5E,IAAIY,EAAgBL,EAAE,MAAQC,EAE1BI,GAAiBF,IACnBE,EAAgBF,GAGdE,GAAiBD,IACnBC,EAAgBD,GAGlB,MAAME,EAAeD,EAAgBH,EAE/BK,EACJP,EAAE,oBAAoB,WAClB,IAAIQ,EAAMR,EAAE,SAAS,QAAQ,CAAC,EAAE,QAASA,EAAE,SAAS,QAAQ,CAAC,EAAE,OAAO,EACtE,IAAIQ,EAAMR,EAAE,SAAS,QAASA,EAAE,SAAS,OAAO,EACtDL,GAAQ,YAAYY,EAAOD,CAAY,EAEvCV,EAAiB,QAAUS,CAC7B,EAIMI,EAAa,IAAM,CACvB,KAAM,CAAE,QAAAP,CAAQ,EAAIT,EAAM,SAAA,EACpBa,EAAeV,EAAiB,QAAUM,EAChDT,EAAM,SAAS,CACb,WAAYG,EAAiB,QAC7B,KAAMU,CACR,CAAC,CACH,EACA,GAAI,CAACX,EAAQ,OAEb,MAAMe,EAAS,IAAIC,EAAOhB,EAAO,oBAAqB,CAAA,EAEtD,OAAAe,EAAO,IAAI,OAAO,EAAE,IAAI,CAAE,OAAQ,EAAK,CAAC,EACxCA,EAAO,GAAG,YAAaX,CAAW,EAClCW,EAAO,GAAG,WAAYD,CAAU,EAEzB,IAAM,CACPC,IACFA,EAAO,IAAI,YAAaX,CAAW,EACnCW,EAAO,IAAI,WAAYD,CAAU,EACjCC,EAAO,UAEX,CACF,EAAG,CAACf,EAAQF,CAAK,CAAC,EAEX,IACT"}
@@ -0,0 +1,2 @@
1
+ "use client";import{createWithEqualityFn as m}from"zustand/traditional";import l from"./initialState.mjs";const c=({nodes:n,defaultNodes:r,width:g,height:u})=>m((o,t)=>({...l({nodes:n,width:g,height:u,defaultNodes:r}),setDimensions:e=>{const{width:a,height:d}=e,s=t(),i={width:a??s.width,height:d??s.height};t().canvas?.setDimensions(i),o(i)},setLoading:e=>{o({loading:e})},setDraggable:e=>{o({draggable:e});const a=t().canvas;a&&(a.setCursor(e?"grab":"default"),a.hoverCursor=e?"grab":"default",a.requestRenderAll())},setZoomable:e=>{o({zoomable:e})},setIsDragging:e=>{o({isDragging:e})},setSelection:e=>{const a=t().canvas;a&&(o({selection:e}),a.set("selection",e),a.requestRenderAll())},setDefaultDraggable:e=>{if(e===void 0)return;const{setDraggable:a}=t();o({hasDefaultDraggable:!0}),a(e)},setDefaultSelection:e=>{if(e===void 0)return;const{setSelection:a}=t();o({hasDefaultSelection:!0}),a(e)},setFitZoom:e=>{o({fitZoom:e})},setManualZoom:e=>{o({manualZoom:e})},setMinManualZoom:e=>{o({minManualZoom:e})},setZoom:e=>{o({zoom:e})},setMaxManualZoom:e=>{o({maxManualZoom:e})},reset:()=>o({...l()})}),Object.is);export{c as createStore};
2
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","sources":["../../../src/store/index.ts"],"sourcesContent":["import { createWithEqualityFn } from 'zustand/traditional'\nimport type { Node } from '../types/nodes'\nimport type { ReactFabricState } from '../types/store'\nimport getInitialState from './initialState'\n\nconst createStore = ({\n nodes,\n defaultNodes,\n width,\n height,\n}: {\n nodes?: Node[]\n defaultNodes?: Node[]\n width?: number\n height?: number\n}) =>\n createWithEqualityFn<ReactFabricState>(\n (set, get) => ({\n ...getInitialState({ nodes, width, height, defaultNodes }),\n setDimensions: (options: { width?: number; height?: number }) => {\n const { width, height } = options\n const currentState = get()\n\n // 合并现有尺寸和新尺寸\n const newDimensions = {\n width: width ?? currentState.width,\n height: height ?? currentState.height,\n }\n\n get().canvas?.setDimensions(newDimensions)\n set(newDimensions)\n },\n setLoading: loading => {\n set({ loading })\n },\n setDraggable: draggable => {\n set({ draggable })\n const canvas = get().canvas\n // TODO 无效\n if (canvas) {\n canvas.setCursor(draggable ? 'grab' : 'default')\n canvas.hoverCursor = draggable ? 'grab' : 'default'\n canvas.requestRenderAll()\n }\n },\n setZoomable: zoomable => {\n set({ zoomable })\n },\n\n setIsDragging: isDragging => {\n set({ isDragging })\n },\n setSelection: selection => {\n const canvas = get().canvas\n if (!canvas) return\n set({ selection })\n canvas.set('selection', selection)\n canvas.requestRenderAll()\n },\n setDefaultDraggable: defaultDraggable => {\n if (defaultDraggable === undefined) return\n const { setDraggable } = get()\n set({ hasDefaultDraggable: true })\n setDraggable(defaultDraggable)\n },\n setDefaultSelection: defaultSelection => {\n if (defaultSelection === undefined) return\n const { setSelection } = get()\n set({ hasDefaultSelection: true })\n setSelection(defaultSelection)\n },\n setFitZoom: (fitZoom: number) => {\n set({ fitZoom: fitZoom })\n },\n setManualZoom: (manualZoom: number) => {\n set({ manualZoom: manualZoom })\n },\n setMinManualZoom: (zoom: number) => {\n set({ minManualZoom: zoom })\n },\n setZoom: (zoom: number) => {\n set({ zoom: zoom })\n },\n setMaxManualZoom: (zoom: number) => {\n set({ maxManualZoom: zoom })\n },\n\n reset: () => set({ ...getInitialState() }),\n }),\n Object.is,\n )\n\nexport { createStore }\n"],"names":["createStore","nodes","defaultNodes","width","height","createWithEqualityFn","set","get","getInitialState","options","currentState","newDimensions","loading","draggable","canvas","zoomable","isDragging","selection","defaultDraggable","setDraggable","defaultSelection","setSelection","fitZoom","manualZoom","zoom"],"mappings":"0GAKMA,MAAAA,EAAc,CAAC,CACnB,MAAAC,EACA,aAAAC,EACA,MAAAC,EACA,OAAAC,CACF,IAMEC,EACE,CAACC,EAAKC,KAAS,CACb,GAAGC,EAAgB,CAAE,MAAAP,EAAO,MAAAE,EAAO,OAAAC,EAAQ,aAAAF,CAAa,CAAC,EACzD,cAAgBO,GAAiD,CAC/D,KAAM,CAAE,MAAAN,EAAO,OAAAC,CAAO,EAAIK,EACpBC,EAAeH,EAAI,EAGnBI,EAAgB,CACpB,MAAOR,GAASO,EAAa,MAC7B,OAAQN,GAAUM,EAAa,MACjC,EAEAH,IAAM,QAAQ,cAAcI,CAAa,EACzCL,EAAIK,CAAa,CACnB,EACA,WAAYC,GAAW,CACrBN,EAAI,CAAE,QAAAM,CAAQ,CAAC,CACjB,EACA,aAAcC,GAAa,CACzBP,EAAI,CAAE,UAAAO,CAAU,CAAC,EACjB,MAAMC,EAASP,EAAI,EAAE,OAEjBO,IACFA,EAAO,UAAUD,EAAY,OAAS,SAAS,EAC/CC,EAAO,YAAcD,EAAY,OAAS,UAC1CC,EAAO,mBAEX,EACA,YAAaC,GAAY,CACvBT,EAAI,CAAE,SAAAS,CAAS,CAAC,CAClB,EAEA,cAAeC,GAAc,CAC3BV,EAAI,CAAE,WAAAU,CAAW,CAAC,CACpB,EACA,aAAcC,GAAa,CACzB,MAAMH,EAASP,EAAM,EAAA,OAChBO,IACLR,EAAI,CAAE,UAAAW,CAAU,CAAC,EACjBH,EAAO,IAAI,YAAaG,CAAS,EACjCH,EAAO,iBAAiB,EAC1B,EACA,oBAAqBI,GAAoB,CACvC,GAAIA,IAAqB,OAAW,OACpC,KAAM,CAAE,aAAAC,CAAa,EAAIZ,EAAI,EAC7BD,EAAI,CAAE,oBAAqB,EAAK,CAAC,EACjCa,EAAaD,CAAgB,CAC/B,EACA,oBAAqBE,GAAoB,CACvC,GAAIA,IAAqB,OAAW,OACpC,KAAM,CAAE,aAAAC,CAAa,EAAId,EACzBD,EAAAA,EAAI,CAAE,oBAAqB,EAAK,CAAC,EACjCe,EAAaD,CAAgB,CAC/B,EACA,WAAaE,GAAoB,CAC/BhB,EAAI,CAAE,QAASgB,CAAQ,CAAC,CAC1B,EACA,cAAgBC,GAAuB,CACrCjB,EAAI,CAAE,WAAYiB,CAAW,CAAC,CAChC,EACA,iBAAmBC,GAAiB,CAClClB,EAAI,CAAE,cAAekB,CAAK,CAAC,CAC7B,EACA,QAAUA,GAAiB,CACzBlB,EAAI,CAAE,KAAMkB,CAAK,CAAC,CACpB,EACA,iBAAmBA,GAAiB,CAClClB,EAAI,CAAE,cAAekB,CAAK,CAAC,CAC7B,EAEA,MAAO,IAAMlB,EAAI,CAAE,GAAGE,EAAgB,CAAE,CAAC,CAC3C,GACA,OAAO,EACT"}
@@ -0,0 +1,2 @@
1
+ "use client";const d=({nodes:o,defaultNodes:a,defaultSelection:e,defaultDraggable:l}={})=>({width:200,height:200,canvas:null,nodes:a??o??[],onNodesChange:null,hasDefaultNodes:a!==void 0,hasDefaultSelection:e!==void 0,hasDefaultDraggable:l!==void 0,zoom:1,minManualZoom:.4,maxManualZoom:3,domNode:null,debug:!1,isDragging:!1,selection:e??!0,zoomable:!0,draggable:!1,scale:1,lastPosX:void 0,lastPosY:void 0,loading:!1,fitZoom:1,manualZoom:1,defaultCentered:!1});export{d as default};
2
+ //# sourceMappingURL=initialState.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"initialState.mjs","sources":["../../../src/store/initialState.ts"],"sourcesContent":["import type { Node } from '../types/nodes'\nimport type { ReactFabricStore } from '../types/store'\n\nconst getInitialState = ({\n nodes,\n defaultNodes,\n defaultSelection,\n defaultDraggable,\n}: {\n nodes?: Node[]\n defaultNodes?: Node[]\n width?: number\n defaultSelection?: boolean\n defaultDraggable?: boolean\n height?: number\n} = {}): ReactFabricStore => {\n const storeNodes = defaultNodes ?? nodes ?? []\n\n return {\n width: 200,\n height: 200,\n canvas: null,\n nodes: storeNodes,\n onNodesChange: null,\n hasDefaultNodes: defaultNodes !== undefined,\n hasDefaultSelection: defaultSelection !== undefined,\n hasDefaultDraggable: defaultDraggable !== undefined,\n zoom: 1,\n minManualZoom: 0.4,\n maxManualZoom: 3,\n domNode: null,\n debug: false,\n isDragging: false,\n selection: defaultSelection ?? true, // 必须跟着 fabric 默认值 true\n zoomable: true,\n draggable: false,\n scale: 1,\n lastPosX: undefined,\n lastPosY: undefined,\n loading: false,\n fitZoom: 1,\n manualZoom: 1,\n defaultCentered: false,\n }\n}\n\nexport default getInitialState\n"],"names":["getInitialState","nodes","defaultNodes","defaultSelection","defaultDraggable"],"mappings":"aAGA,MAAMA,EAAkB,CAAC,CACvB,MAAAC,EACA,aAAAC,EACA,iBAAAC,EACA,iBAAAC,CACF,EAOI,CAAA,KAGK,CACL,MAAO,IACP,OAAQ,IACR,OAAQ,KACR,MANiBF,GAAgBD,GAAS,CAAA,EAO1C,cAAe,KACf,gBAAiBC,IAAiB,OAClC,oBAAqBC,IAAqB,OAC1C,oBAAqBC,IAAqB,OAC1C,KAAM,EACN,cAAe,GACf,cAAe,EACf,QAAS,KACT,MAAO,GACP,WAAY,GACZ,UAAWD,GAAoB,GAC/B,SAAU,GACV,UAAW,GACX,MAAO,EACP,SAAU,OACV,SAAU,OACV,QAAS,GACT,QAAS,EACT,WAAY,EACZ,gBAAiB,EACnB"}
@@ -0,0 +1,2 @@
1
+ "use client";import{jsxs as o,jsx as e}from"react/jsx-runtime";import{twMerge as x}from"tailwind-merge";import{useReactFabric as p}from"../../hooks/useReactFabric.mjs";const d=({className:n})=>{const{manualZoom:r,zoomIn:c,zoomOut:a,maxManualZoom:s,minManualZoom:i,draggable:t,setDraggable:l,resetViewport:m}=p();return o("section",{className:x("flex flex-col items-center p-[10px_7px] bg-[#f7f7f7] rounded-lg gap-4",n),children:[o("div",{className:"flex flex-col items-center",children:[e("div",{className:"w-[30px] h-[30px] flex items-center justify-center rounded cursor-pointer hover:bg-[var(--color-primary)]",children:e("span",{className:`iconfont T_narrow text-[25px] ${Number(r.toFixed(2))<=i?"text-[#c4c4c4]":""}`,onClick:a})}),o("span",{className:"inline-block text-center my-[6px] text-sm font-semibold leading-[22px] min-w-[40px]",children:[" ",Math.round(r*100),"%"]}),e("div",{className:"w-[30px] h-[30px] flex items-center justify-center rounded cursor-pointer hover:bg-[var(--color-primary)]",children:e("span",{className:`iconfont T_enlarge text-[25px] ${Number(r.toFixed(2))>=s?"text-[#c4c4c4]":""}`,onClick:c})})]}),e("div",{onClick:()=>l(!t),className:`w-[30px] h-[30px] flex items-center justify-center rounded cursor-pointer hover:bg-[var(--color-primary)] ${t?"bg-[#04aa65]":""}`,children:e("span",{className:"iconfont T_drag text-[25px]"})}),e("div",{className:"w-[30px] h-[30px] flex items-center justify-center rounded cursor-pointer hover:bg-[var(--color-primary)]",onClick:m,children:e("span",{className:"iconfont T_reset text-[25px]"})})]})};export{d as default};
2
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","sources":["../../../../src/toolbar/Vertical/index.tsx"],"sourcesContent":["import { twMerge } from 'tailwind-merge'\nimport { useReactFabric } from '../../hooks/useReactFabric'\n\nexport type ToolbarVerticalProps = {\n className?: string\n}\n\n/**\n *@desc 垂直toolbar\n * @returns\n */\nconst ToolbarVertical = ({ className }: ToolbarVerticalProps) => {\n const { manualZoom, zoomIn, zoomOut, maxManualZoom, minManualZoom, draggable, setDraggable, resetViewport } =\n useReactFabric()\n\n return (\n <section\n className={twMerge('flex flex-col items-center p-[10px_7px] bg-[#f7f7f7] rounded-lg gap-4', className)}\n >\n {/* fabric-tool */}\n <div className=\"flex flex-col items-center\">\n {/* scale-view */}\n <div className=\"w-[30px] h-[30px] flex items-center justify-center rounded cursor-pointer hover:bg-[var(--color-primary)]\">\n {/* ic-tool-box */}\n <span\n className={`iconfont T_narrow text-[25px] ${Number(manualZoom.toFixed(2)) <= minManualZoom ? 'text-[#c4c4c4]' : ''}`}\n onClick={zoomOut}\n ></span>\n </div>\n <span className=\"inline-block text-center my-[6px] text-sm font-semibold leading-[22px] min-w-[40px]\">\n {' '}\n {/* scale-num */}\n {Math.round(manualZoom * 100)}%\n </span>\n <div className=\"w-[30px] h-[30px] flex items-center justify-center rounded cursor-pointer hover:bg-[var(--color-primary)]\">\n <span\n className={`iconfont T_enlarge text-[25px] ${Number(manualZoom.toFixed(2)) >= maxManualZoom ? 'text-[#c4c4c4]' : ''}`}\n onClick={zoomIn}\n ></span>\n </div>\n </div>\n <div\n onClick={() => setDraggable(!draggable)}\n className={`w-[30px] h-[30px] flex items-center justify-center rounded cursor-pointer hover:bg-[var(--color-primary)] ${\n draggable ? 'bg-[#04aa65]' : ''\n }`}\n >\n <span className=\"iconfont T_drag text-[25px]\"></span>\n </div>\n <div\n className=\"w-[30px] h-[30px] flex items-center justify-center rounded cursor-pointer hover:bg-[var(--color-primary)]\"\n onClick={resetViewport}\n >\n <span className=\"iconfont T_reset text-[25px]\"></span>\n </div>\n </section>\n )\n}\n\nexport default ToolbarVertical\n"],"names":["ToolbarVertical","className","manualZoom","zoomIn","zoomOut","maxManualZoom","minManualZoom","draggable","setDraggable","resetViewport","useReactFabric","jsxs","twMerge","jsx"],"mappings":"wKAWMA,MAAAA,EAAkB,CAAC,CAAE,UAAAC,CAAU,IAA4B,CAC/D,KAAM,CAAE,WAAAC,EAAY,OAAAC,EAAQ,QAAAC,EAAS,cAAAC,EAAe,cAAAC,EAAe,UAAAC,EAAW,aAAAC,EAAc,cAAAC,CAAc,EACxGC,IAEF,OACEC,EAAC,UACC,CAAA,UAAWC,EAAQ,wEAAyEX,CAAS,EAGrG,SAAA,CAAAU,EAAC,MAAA,CAAI,UAAU,6BAEX,SAAA,CAAAE,EAAC,MAAA,CAAI,UAAU,4GAEb,SAAAA,EAAC,OAAA,CACC,UAAW,iCAAiC,OAAOX,EAAW,QAAQ,CAAC,CAAC,GAAKI,EAAgB,iBAAmB,EAAE,GAClH,QAASF,CACV,CAAA,CAAA,CACH,EACFO,EAAC,OAAK,CAAA,UAAU,sFACb,SAEA,CAAA,IAAA,KAAK,MAAMT,EAAa,GAAG,EAAE,GAAA,CAAA,CAChC,EACEW,EAAC,OAAI,UAAU,4GACb,SAAAA,EAAC,OACC,CAAA,UAAW,kCAAkC,OAAOX,EAAW,QAAQ,CAAC,CAAC,GAAKG,EAAgB,iBAAmB,EAAE,GACnH,QAASF,EACV,CACH,CAAA,CAAA,CAAA,CACJ,EACEU,EAAC,MACC,CAAA,QAAS,IAAML,EAAa,CAACD,CAAS,EACtC,UAAW,6GACTA,EAAY,eAAiB,EAC/B,GAEA,SAAAM,EAAC,OAAK,CAAA,UAAU,6BAA8B,CAAA,CAAA,CAChD,EACAA,EAAC,MAAA,CACC,UAAU,4GACV,QAASJ,EAET,SAAAI,EAAC,OAAA,CAAK,UAAU,8BAA+B,CAAA,CAAA,CACjD,CACJ,CAAA,CAAA,CAEJ"}
@@ -0,0 +1,2 @@
1
+ "use client";const t=["left","top","width","height","scaleX","scaleY","angle","points","path","originX","originY"];t.map(e=>`default${e.charAt(0).toUpperCase()}${e.slice(1)}`);export{t as UNCONTROLLED_PROPS};
2
+ //# sourceMappingURL=constants.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.mjs","sources":["../../../src/utils/constants.ts"],"sourcesContent":["// 定义位置相关属性的类型\nexport type UncontrolledProp =\n | 'left'\n | 'top'\n | 'width'\n | 'height'\n | 'scaleX'\n | 'scaleY'\n | 'angle'\n | 'points'\n | 'path'\n | 'originX'\n | 'originY'\n\n// 定义可以非受控的属性\nexport const UNCONTROLLED_PROPS = [\n 'left',\n 'top',\n 'width',\n 'height',\n 'scaleX',\n 'scaleY',\n 'angle',\n 'points',\n 'path',\n 'originX',\n 'originY',\n] as readonly UncontrolledProp[]\n\n// 定义默认属性的类型\nexport type DefaultProp = `default${Capitalize<UncontrolledProp>}`\n\n// 生成对应的 default 属性\nexport const DEFAULT_PROPS = UNCONTROLLED_PROPS.map(\n prop => `default${prop.charAt(0).toUpperCase()}${prop.slice(1)}` as DefaultProp,\n) as readonly DefaultProp[]\n"],"names":["UNCONTROLLED_PROPS","prop"],"mappings":"aAeO,MAAMA,EAAqB,CAChC,OACA,MACA,QACA,SACA,SACA,SACA,QACA,SACA,OACA,UACA,SACF,EAM6BA,EAAmB,IAC9CC,GAAQ,UAAUA,EAAK,OAAO,CAAC,EAAE,YAAa,CAAA,GAAGA,EAAK,MAAM,CAAC,CAAC,EAChE"}
@@ -0,0 +1,2 @@
1
+ "use client";const i=(n,t)=>{const c=[];return Object.entries(t).forEach(([e,o])=>{if(o){const r=e.slice(2).replace(/[A-Z]/g,(s,f)=>f===0?s.toLowerCase():":"+s.toLowerCase());n.on(r,o),c.push(()=>n.off(r,o))}}),()=>c.forEach(e=>e())};export{i as bindEvents};
2
+ //# sourceMappingURL=events.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.mjs","sources":["../../../src/utils/events.ts"],"sourcesContent":["import type { CanvasEvents, GroupEvents, ObjectEvents } from 'fabric'\nimport type { AllCanvasEvents } from '../types/canvas'\nimport type { AllObjectEvents } from '../types/object'\n\nexport const bindEvents = <T extends CanvasEvents | ObjectEvents | GroupEvents>(\n target: any,\n listeners: Partial<T extends CanvasEvents ? AllCanvasEvents : AllObjectEvents>,\n) => {\n const cleanup: (() => void)[] = []\n\n Object.entries(listeners).forEach(([key, handler]) => {\n if (handler) {\n const rawEventName = key\n .slice(2)\n .replace(/[A-Z]/g, (match, offset) =>\n offset === 0 ? match.toLowerCase() : ':' + match.toLowerCase(),\n ) as keyof T\n\n target.on(rawEventName, handler)\n cleanup.push(() => target.off(rawEventName, handler))\n }\n })\n\n return () => cleanup.forEach(fn => fn())\n}\n"],"names":["bindEvents","target","listeners","cleanup","key","handler","rawEventName","match","offset","fn"],"mappings":"aAIO,MAAMA,EAAa,CACxBC,EACAC,IACG,CACH,MAAMC,EAA0B,GAEhC,OAAA,OAAO,QAAQD,CAAS,EAAE,QAAQ,CAAC,CAACE,EAAKC,CAAO,IAAM,CACpD,GAAIA,EAAS,CACX,MAAMC,EAAeF,EAClB,MAAM,CAAC,EACP,QAAQ,SAAU,CAACG,EAAOC,IACzBA,IAAW,EAAID,EAAM,YAAY,EAAI,IAAMA,EAAM,YACnD,CAAA,EAEFN,EAAO,GAAGK,EAAcD,CAAO,EAC/BF,EAAQ,KAAK,IAAMF,EAAO,IAAIK,EAAcD,CAAO,CAAC,CACtD,CACF,CAAC,EAEM,IAAMF,EAAQ,QAAQM,GAAMA,EAAAA,CAAI,CACzC"}
@@ -0,0 +1,2 @@
1
+ "use client";const c=r=>Object.entries(r).reduce((e,[t,s])=>{if(t.startsWith("default")){const o=t.replace(/^default([A-Z])/,(u,a)=>a.toLowerCase());e[o]=s}return e},{});export{c as transformDefaultProps};
2
+ //# sourceMappingURL=props.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"props.mjs","sources":["../../../src/utils/props.ts"],"sourcesContent":["import type { AllCanvasEvents } from '../types/canvas'\n\nexport const splitListenerProps = <T extends Record<string, any>>(\n props: T,\n): [{ [K in keyof AllCanvasEvents]?: AllCanvasEvents[K] }, Omit<T, keyof AllCanvasEvents>] => {\n return Object.entries(props).reduce(\n ([listeners, options], [key, value]) => {\n if (key.startsWith('on')) {\n ;(listeners as any)[key] = value\n } else {\n ;(options as any)[key] = value\n }\n return [listeners, options]\n },\n [{} as { [K in keyof AllCanvasEvents]?: AllCanvasEvents[K] }, {} as Omit<T, keyof AllCanvasEvents>],\n )\n}\n\n// 工具函数:转换 default 属性\nexport const transformDefaultProps = (defaultValues: Record<string, unknown>) => {\n return Object.entries(defaultValues).reduce(\n (acc, [key, value]) => {\n if (key.startsWith('default')) {\n // 使用正则替换 'default' 并将首字母小写\n const propName = key.replace(/^default([A-Z])/, (_, c) => c.toLowerCase())\n acc[propName] = value\n }\n return acc\n },\n {} as Record<string, unknown>,\n )\n}\n"],"names":["transformDefaultProps","defaultValues","acc","key","value","propName","_","c"],"mappings":"aAEO,MAiBMA,EAAyBC,GAC7B,OAAO,QAAQA,CAAa,EAAE,OACnC,CAACC,EAAK,CAACC,EAAKC,CAAK,IAAM,CACrB,GAAID,EAAI,WAAW,SAAS,EAAG,CAE7B,MAAME,EAAWF,EAAI,QAAQ,kBAAmB,CAACG,EAAGC,IAAMA,EAAE,aAAa,EACzEL,EAAIG,CAAQ,EAAID,CAClB,CACA,OAAOF,CACT,EACA,CACF,CAAA"}
@@ -0,0 +1,19 @@
1
+ import type { BasicTransformEvent, ImageProps, ObjectEvents, SerializedImageProps, TPointerEvent } from 'fabric';
2
+ import { FabricImage } from 'fabric';
3
+ export type Handle = {};
4
+ type ScaleMode = {
5
+ scaleToFit?: boolean;
6
+ scaleToCover?: boolean;
7
+ };
8
+ export type BackgroundImageProps = Partial<ImageProps> & {
9
+ src: string;
10
+ onLoad?: (imageSource: FabricImage<Partial<ImageProps>, SerializedImageProps, ObjectEvents>) => void;
11
+ onScaling?: (scale: BasicTransformEvent<TPointerEvent>) => void;
12
+ } & ScaleMode;
13
+ declare const _default: import("react").MemoExoticComponent<import("react").ForwardRefExoticComponent<Partial<ImageProps> & {
14
+ src: string;
15
+ onLoad?: (imageSource: FabricImage<Partial<ImageProps>, SerializedImageProps, ObjectEvents>) => void;
16
+ onScaling?: (scale: BasicTransformEvent<TPointerEvent>) => void;
17
+ } & ScaleMode & import("react").RefAttributes<Handle>>>;
18
+ export default _default;
19
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/BackgroundImage/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,mBAAmB,EACnB,UAAU,EACV,YAAY,EACZ,oBAAoB,EAEpB,aAAa,EACd,MAAM,QAAQ,CAAA;AACf,OAAO,EAAE,WAAW,EAAQ,MAAM,QAAQ,CAAA;AAM1C,MAAM,MAAM,MAAM,GAAG,EAAE,CAAA;AAEvB,KAAK,SAAS,GAAG;IACf,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB,CAAA;AACD,MAAM,MAAM,oBAAoB,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG;IACvD,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,CAAC,EAAE,CAAC,WAAW,EAAE,WAAW,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,oBAAoB,EAAE,YAAY,CAAC,KAAK,IAAI,CAAA;IACpG,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,mBAAmB,CAAC,aAAa,CAAC,KAAK,IAAI,CAAA;CAGhE,GAAG,SAAS,CAAA;;SALN,MAAM;aACF,CAAC,WAAW,EAAE,WAAW,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,oBAAoB,EAAE,YAAY,CAAC,KAAK,IAAI;gBACxF,CAAC,KAAK,EAAE,mBAAmB,CAAC,aAAa,CAAC,KAAK,IAAI;;AAwLjE,wBAAoC"}
@@ -0,0 +1,11 @@
1
+ import type { CanvasOptions } from 'fabric';
2
+ import type { PropsWithChildren } from 'react';
3
+ import type { AllCanvasEvents } from '../../types/canvas';
4
+ type CanvasEventProps = {
5
+ [K in keyof AllCanvasEvents]: AllCanvasEvents[K];
6
+ };
7
+ type CanvasConfigProps = Omit<CanvasOptions, keyof CanvasEventProps>;
8
+ export type CanvasProps = PropsWithChildren<Partial<CanvasConfigProps> & Partial<CanvasEventProps>>;
9
+ declare const Canvas: ({ children, onMouseWheel, ...props }: CanvasProps) => import("react/jsx-runtime").JSX.Element;
10
+ export default Canvas;
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/Canvas/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAgB,aAAa,EAAqB,MAAM,QAAQ,CAAA;AAE5E,OAAO,KAAK,EAAiB,iBAAiB,EAAE,MAAM,OAAO,CAAA;AAM7D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAYzD,KAAK,gBAAgB,GAAG;KACrB,CAAC,IAAI,MAAM,eAAe,GAAG,eAAe,CAAC,CAAC,CAAC;CACjD,CAAA;AAGD,KAAK,iBAAiB,GAAG,IAAI,CAAC,aAAa,EAAE,MAAM,gBAAgB,CAAC,CAAA;AAGpE,MAAM,MAAM,WAAW,GAAG,iBAAiB,CAAC,OAAO,CAAC,iBAAiB,CAAC,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAA;AAEnG,QAAA,MAAM,MAAM,yCAA0C,WAAW,4CA4GhE,CAAA;AAED,eAAe,MAAM,CAAA"}
@@ -0,0 +1,28 @@
1
+ import { ComputePositionConfig } from '@floating-ui/core';
2
+ import type { FabricObjectProps } from 'fabric';
3
+ import type { ReactNode } from 'react';
4
+ import React from 'react';
5
+ import type { AllObjectEvents } from '../../types/object';
6
+ /**
7
+ * @desc 不能内置支持 selected , 因为需要 rect 开启 lockMovementX lockMovementY, 这样支持的场景就受限了
8
+ */
9
+ export type ControlProps = Partial<AllObjectEvents & FabricObjectProps> & {
10
+ Content: ReactNode;
11
+ children: ReactNode;
12
+ placement?: ComputePositionConfig['placement'];
13
+ className?: string;
14
+ open?: boolean;
15
+ onOpenChange?: (open: boolean) => void;
16
+ closeOnOutsideClick?: boolean;
17
+ };
18
+ declare const Control: React.ForwardRefExoticComponent<Partial<AllObjectEvents & FabricObjectProps> & {
19
+ Content: ReactNode;
20
+ children: ReactNode;
21
+ placement?: ComputePositionConfig["placement"];
22
+ className?: string;
23
+ open?: boolean;
24
+ onOpenChange?: (open: boolean) => void;
25
+ closeOnOutsideClick?: boolean;
26
+ } & React.RefAttributes<unknown>>;
27
+ export default Control;
28
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/Control/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAuC,qBAAqB,EAAE,MAAM,mBAAmB,CAAA;AAC9F,OAAO,KAAK,EAAgB,iBAAiB,EAAoC,MAAM,QAAQ,CAAA;AAG/F,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAKtC,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAGzD;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,OAAO,CAAC,eAAe,GAAG,iBAAiB,CAAC,GAAG;IACxE,OAAO,EAAE,SAAS,CAAA;IAClB,QAAQ,EAAE,SAAS,CAAA;IACnB,SAAS,CAAC,EAAE,qBAAqB,CAAC,WAAW,CAAC,CAAA;IAC9C,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAA;IACtC,mBAAmB,CAAC,EAAE,OAAO,CAAA;CAC9B,CAAA;AAED,QAAA,MAAM,OAAO;aATF,SAAS;cACR,SAAS;gBACP,qBAAqB,CAAC,WAAW,CAAC;gBAClC,MAAM;WACX,OAAO;mBACC,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI;0BAChB,OAAO;iCAuK9B,CAAA;AAED,eAAe,OAAO,CAAA"}
@@ -0,0 +1,19 @@
1
+ import type { Group as BaseGroup } from 'fabric';
2
+ import { Ellipse as BaseEllipse } from 'fabric';
3
+ import type { AllObjectEvents } from '../../types/object';
4
+ export type EllipseProps<T = unknown> = Partial<BaseEllipse & AllObjectEvents> & {
5
+ group?: BaseGroup;
6
+ defaultLeft?: number;
7
+ defaultTop?: number;
8
+ defaultWidth?: number;
9
+ defaultHeight?: number;
10
+ } & T;
11
+ declare const _default: import("react").MemoExoticComponent<import("react").ForwardRefExoticComponent<Partial<BaseEllipse<Partial<import("fabric").EllipseProps>, import("fabric").SerializedEllipseProps, import("fabric").ObjectEvents> & AllObjectEvents> & {
12
+ group?: BaseGroup;
13
+ defaultLeft?: number;
14
+ defaultTop?: number;
15
+ defaultWidth?: number;
16
+ defaultHeight?: number;
17
+ } & import("react").RefAttributes<BaseEllipse<Partial<import("fabric").EllipseProps>, import("fabric").SerializedEllipseProps, import("fabric").ObjectEvents> | undefined>>>;
18
+ export default _default;
19
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/Ellipse/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,QAAQ,CAAA;AAChD,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,QAAQ,CAAA;AAI/C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAEzD,MAAM,MAAM,YAAY,CAAC,CAAC,GAAG,OAAO,IAAI,OAAO,CAAC,WAAW,GAAG,eAAe,CAAC,GAAG;IAC/E,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB,GAAG,CAAC,CAAA;;YALK,SAAS;kBACH,MAAM;iBACP,MAAM;mBACJ,MAAM;oBACL,MAAM;;AAmBxB,wBAA4B"}
@@ -0,0 +1,24 @@
1
+ import type { GroupEvents, GroupProps } from 'fabric';
2
+ import { Group as BaseGroup } from 'fabric';
3
+ import type { AllEvents } from '../../types/canvas';
4
+ export type MyGroupProps = Partial<GroupProps & AllEvents<GroupEvents>> & {
5
+ children: React.ReactElement<{
6
+ group?: BaseGroup;
7
+ }>[] | React.ReactElement<{
8
+ group?: BaseGroup;
9
+ }>;
10
+ controlsVisibility?: {
11
+ ml?: boolean;
12
+ mt?: boolean;
13
+ mr?: boolean;
14
+ mb?: boolean;
15
+ mtr?: boolean;
16
+ tl?: boolean;
17
+ tr?: boolean;
18
+ bl?: boolean;
19
+ br?: boolean;
20
+ };
21
+ };
22
+ declare const Group: import("react").MemoExoticComponent<({ children, controlsVisibility, ...props }: MyGroupProps) => import("react/jsx-runtime").JSX.Element>;
23
+ export default Group;
24
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/Group/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AACrD,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,QAAQ,CAAA;AAK3C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAGnD,MAAM,MAAM,YAAY,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,WAAW,CAAC,CAAC,GAAG;IACxE,QAAQ,EAAE,KAAK,CAAC,YAAY,CAAC;QAAE,KAAK,CAAC,EAAE,SAAS,CAAA;KAAE,CAAC,EAAE,GAAG,KAAK,CAAC,YAAY,CAAC;QAAE,KAAK,CAAC,EAAE,SAAS,CAAA;KAAE,CAAC,CAAA;IACjG,kBAAkB,CAAC,EAAE;QACnB,EAAE,CAAC,EAAE,OAAO,CAAA;QACZ,EAAE,CAAC,EAAE,OAAO,CAAA;QACZ,EAAE,CAAC,EAAE,OAAO,CAAA;QACZ,EAAE,CAAC,EAAE,OAAO,CAAA;QACZ,GAAG,CAAC,EAAE,OAAO,CAAA;QACb,EAAE,CAAC,EAAE,OAAO,CAAA;QACZ,EAAE,CAAC,EAAE,OAAO,CAAA;QACZ,EAAE,CAAC,EAAE,OAAO,CAAA;QACZ,EAAE,CAAC,EAAE,OAAO,CAAA;KACb,CAAA;CACF,CAAA;AAED,QAAA,MAAM,KAAK,mFAAqD,YAAY,6CAoE1E,CAAA;AAEF,eAAe,KAAK,CAAA"}
@@ -0,0 +1,18 @@
1
+ import type { ImageProps as FabricImageProps, ObjectEvents, SerializedImageProps } from 'fabric';
2
+ import { FabricImage } from 'fabric';
3
+ import type { Group as BaseGroup } from 'fabric';
4
+ export type Handle = {
5
+ instance: FabricImage | undefined;
6
+ };
7
+ export type ImageProps = Partial<FabricImageProps> & {
8
+ src: string;
9
+ group?: BaseGroup;
10
+ onLoad?: (imageSource: FabricImage<Partial<ImageProps>, SerializedImageProps, ObjectEvents>) => void;
11
+ };
12
+ declare const _default: import("react").MemoExoticComponent<import("react").ForwardRefExoticComponent<Partial<FabricImageProps> & {
13
+ src: string;
14
+ group?: BaseGroup;
15
+ onLoad?: (imageSource: FabricImage<Partial<ImageProps>, SerializedImageProps, ObjectEvents>) => void;
16
+ } & import("react").RefAttributes<Handle>>>;
17
+ export default _default;
18
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/Image/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,IAAI,gBAAgB,EAAE,YAAY,EAAE,oBAAoB,EAAU,MAAM,QAAQ,CAAA;AACxG,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAA;AACpC,OAAO,KAAK,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,QAAQ,CAAA;AAKhD,MAAM,MAAM,MAAM,GAAG;IACnB,QAAQ,EAAE,WAAW,GAAG,SAAS,CAAA;CAClC,CAAA;AAED,MAAM,MAAM,UAAU,GAAG,OAAO,CAAC,gBAAgB,CAAC,GAAG;IACnD,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB,MAAM,CAAC,EAAE,CAAC,WAAW,EAAE,WAAW,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,oBAAoB,EAAE,YAAY,CAAC,KAAK,IAAI,CAAA;CACrG,CAAA;;SAHM,MAAM;YACH,SAAS;aACR,CAAC,WAAW,EAAE,WAAW,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,oBAAoB,EAAE,YAAY,CAAC,KAAK,IAAI;;AAsDtG,wBAA0B"}
@@ -0,0 +1,11 @@
1
+ import type { Group as BaseGroup } from 'fabric';
2
+ import { Line as BaseLine } from 'fabric';
3
+ import type { AllObjectEvents } from '../../types/object';
4
+ export type Handle = BaseLine | undefined;
5
+ export type LineProps<T = unknown> = Partial<ConstructorParameters<typeof BaseLine>[1] & AllObjectEvents> & {
6
+ group?: BaseGroup;
7
+ path?: string;
8
+ } & T;
9
+ declare const _default: import("react").MemoExoticComponent<import("react").ForwardRefExoticComponent<Omit<LineProps<unknown>, "ref"> & import("react").RefAttributes<Handle>>>;
10
+ export default _default;
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/Line/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,QAAQ,CAAA;AAChD,OAAO,EAAE,IAAI,IAAI,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAIzC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAEzD,MAAM,MAAM,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAA;AAEzC,MAAM,MAAM,SAAS,CAAC,CAAC,GAAG,OAAO,IAAI,OAAO,CAAC,qBAAqB,CAAC,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,eAAe,CAAC,GAAG;IAC1G,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB,IAAI,CAAC,EAAE,MAAM,CAAA;CACd,GAAG,CAAC,CAAA;;AAkBL,wBAAyB"}
@@ -0,0 +1,3 @@
1
+ declare const Loading: () => import("react/jsx-runtime").JSX.Element | null;
2
+ export default Loading;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/Loading/index.tsx"],"names":[],"mappings":"AAIA,QAAA,MAAM,OAAO,sDASZ,CAAA;AAED,eAAe,OAAO,CAAA"}
@@ -0,0 +1,9 @@
1
+ import type { ReactNode } from 'react';
2
+ interface Props {
3
+ children: ReactNode;
4
+ className?: string;
5
+ onClick?: (e: React.MouseEvent) => void;
6
+ }
7
+ declare const NodeToolbarPortal: import("react").ForwardRefExoticComponent<Props & import("react").RefAttributes<HTMLDivElement>>;
8
+ export default NodeToolbarPortal;
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/NodeToolbarPortal/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAOtC,UAAU,KAAK;IACb,QAAQ,EAAE,SAAS,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,KAAK,IAAI,CAAA;CACxC;AAED,QAAA,MAAM,iBAAiB,kGAgDrB,CAAA;AAEF,eAAe,iBAAiB,CAAA"}
@@ -0,0 +1,9 @@
1
+ export type ObjectsProps = {
2
+ objects: {
3
+ type: string;
4
+ [index: string]: any;
5
+ }[];
6
+ };
7
+ declare const _default: import("react").MemoExoticComponent<({ objects }: ObjectsProps) => import("react/jsx-runtime").JSX.Element | null>;
8
+ export default _default;
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/Objects/index.tsx"],"names":[],"mappings":"AAMA,MAAM,MAAM,YAAY,GAAG;IACzB,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,EAAE,CAAA;CAClD,CAAA;0EAE6B,YAAY;AAyB1C,wBAA4B"}
@@ -0,0 +1,11 @@
1
+ import type { Group as BaseGroup } from 'fabric';
2
+ import { Path as BasePath } from 'fabric';
3
+ import type { AllObjectEvents } from '../../types/object';
4
+ export type Handle = BasePath | undefined;
5
+ export type PathProps<T = unknown> = Partial<ConstructorParameters<typeof BasePath>[1] & AllObjectEvents> & {
6
+ group?: BaseGroup;
7
+ path?: string;
8
+ } & T;
9
+ declare const _default: import("react").MemoExoticComponent<import("react").ForwardRefExoticComponent<Omit<PathProps<unknown>, "ref"> & import("react").RefAttributes<Handle>>>;
10
+ export default _default;
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/Path/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,QAAQ,CAAA;AAChD,OAAO,EAAE,IAAI,IAAI,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAIzC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAEzD,MAAM,MAAM,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAA;AAEzC,MAAM,MAAM,SAAS,CAAC,CAAC,GAAG,OAAO,IAAI,OAAO,CAAC,qBAAqB,CAAC,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,eAAe,CAAC,GAAG;IAC1G,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB,IAAI,CAAC,EAAE,MAAM,CAAA;CACd,GAAG,CAAC,CAAA;;AAkBL,wBAAyB"}
@@ -0,0 +1,11 @@
1
+ import type { ReactNode } from 'react';
2
+ import type { Node } from '../types/nodes';
3
+ export type ReactFabricProviderProps = {
4
+ initialNodes?: Node[];
5
+ defaultNodes?: Node[];
6
+ initialWidth?: number;
7
+ initialHeight?: number;
8
+ children: ReactNode;
9
+ };
10
+ export declare function ReactFabricProvider({ initialNodes: nodes, defaultNodes, initialWidth: width, initialHeight: height, children, }: ReactFabricProviderProps): import("react/jsx-runtime").JSX.Element;
11
+ //# sourceMappingURL=ReactFabricProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReactFabricProvider.d.ts","sourceRoot":"","sources":["../../../src/components/ReactFabricProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAItC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAA;AAE1C,MAAM,MAAM,wBAAwB,GAAG;IACrC,YAAY,CAAC,EAAE,IAAI,EAAE,CAAA;IACrB,YAAY,CAAC,EAAE,IAAI,EAAE,CAAA;IACrB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,EAAE,SAAS,CAAA;CACpB,CAAA;AACD,wBAAgB,mBAAmB,CAAC,EAClC,YAAY,EAAE,KAAK,EACnB,YAAY,EACZ,YAAY,EAAE,KAAK,EACnB,aAAa,EAAE,MAAM,EACrB,QAAQ,GACT,EAAE,wBAAwB,2CAW1B"}
@@ -0,0 +1,20 @@
1
+ import type { Group as BaseGroup } from 'fabric';
2
+ import { Rect as BaseRect } from 'fabric';
3
+ import type { AllObjectEvents } from '../../types/object';
4
+ export type Handle = BaseRect | undefined;
5
+ export type RectProps<T = unknown> = Partial<BaseRect & AllObjectEvents> & {
6
+ group?: BaseGroup;
7
+ defaultLeft?: number;
8
+ defaultTop?: number;
9
+ defaultWidth?: number;
10
+ defaultHeight?: number;
11
+ } & T;
12
+ declare const _default: import("react").MemoExoticComponent<import("react").ForwardRefExoticComponent<Partial<BaseRect<Partial<import("fabric").RectProps>, import("fabric").SerializedRectProps, import("fabric").ObjectEvents> & AllObjectEvents> & {
13
+ group?: BaseGroup;
14
+ defaultLeft?: number;
15
+ defaultTop?: number;
16
+ defaultWidth?: number;
17
+ defaultHeight?: number;
18
+ } & import("react").RefAttributes<Handle>>>;
19
+ export default _default;
20
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/Rect/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,QAAQ,CAAA;AAChD,OAAO,EAAE,IAAI,IAAI,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAIzC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAEzD,MAAM,MAAM,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAA;AAEzC,MAAM,MAAM,SAAS,CAAC,CAAC,GAAG,OAAO,IAAI,OAAO,CAAC,QAAQ,GAAG,eAAe,CAAC,GAAG;IACzE,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB,GAAG,CAAC,CAAA;;YALK,SAAS;kBACH,MAAM;iBACP,MAAM;mBACJ,MAAM;oBACL,MAAM;;AAmBxB,wBAAyB"}
@@ -0,0 +1,8 @@
1
+ import type { ReactFabricProps } from '../../container/ReactFabric';
2
+ import type { Node } from '../../types/nodes';
3
+ declare const reactFabricFieldsToTrack: readonly ["minManualZoom", "maxManualZoom", "width", "height", "zoomable", "defaultCentered", "defaultSelection", "defaultDraggable", "selection"];
4
+ type ReactFabricFieldsToTrack = (typeof reactFabricFieldsToTrack)[number];
5
+ type StoreUpdaterProps = Pick<ReactFabricProps, ReactFabricFieldsToTrack>;
6
+ export declare function StoreUpdater<NodeType extends Node = Node>(props: StoreUpdaterProps): null;
7
+ export {};
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/StoreUpdater/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAA;AAEnE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAA;AAG7C,QAAA,MAAM,wBAAwB,oJAUpB,CAAA;AAEV,KAAK,wBAAwB,GAAG,CAAC,OAAO,wBAAwB,CAAC,CAAC,MAAM,CAAC,CAAA;AAEzE,KAAK,iBAAiB,GAAG,IAAI,CAAC,gBAAgB,EAAE,wBAAwB,CAAC,CAAA;AAczE,wBAAgB,YAAY,CAAC,QAAQ,SAAS,IAAI,GAAG,IAAI,EAAE,KAAK,EAAE,iBAAiB,QAoClF"}
@@ -0,0 +1,11 @@
1
+ import type { Group as BaseGroup } from 'fabric';
2
+ import { FabricText } from 'fabric';
3
+ import type { AllObjectEvents } from '../../types/object';
4
+ export type Handle = FabricText | undefined;
5
+ export type TextProps<T = unknown> = Partial<ConstructorParameters<typeof FabricText>[1] & AllObjectEvents> & {
6
+ group?: BaseGroup;
7
+ text: string;
8
+ } & T;
9
+ declare const _default: import("react").MemoExoticComponent<import("react").ForwardRefExoticComponent<Omit<TextProps<unknown>, "ref"> & import("react").RefAttributes<Handle>>>;
10
+ export default _default;
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/Text/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,QAAQ,CAAA;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AAKnC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAGzD,MAAM,MAAM,MAAM,GAAG,UAAU,GAAG,SAAS,CAAA;AAE3C,MAAM,MAAM,SAAS,CAAC,CAAC,GAAG,OAAO,IAAI,OAAO,CAAC,qBAAqB,CAAC,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,eAAe,CAAC,GAAG;IAC5G,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB,IAAI,EAAE,MAAM,CAAA;CACb,GAAG,CAAC,CAAA;;AAyCL,wBAAyB"}
@@ -0,0 +1,5 @@
1
+ export declare const errorMessages: {
2
+ error001: () => string;
3
+ error004: () => string;
4
+ };
5
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,aAAa;;;CAGzB,CAAA"}
@@ -0,0 +1,10 @@
1
+ import type { ReactNode } from 'react';
2
+ import type { Node } from '../../types/nodes';
3
+ export declare function Wrapper({ children, nodes, defaultNodes, width, height, }: {
4
+ children: ReactNode;
5
+ nodes?: Node[];
6
+ defaultNodes?: Node[];
7
+ width?: number;
8
+ height?: number;
9
+ }): import("react/jsx-runtime").JSX.Element;
10
+ //# sourceMappingURL=Wrapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Wrapper.d.ts","sourceRoot":"","sources":["../../../../src/container/ReactFabric/Wrapper.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAItC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAA;AAE7C,wBAAgB,OAAO,CAAC,EACtB,QAAQ,EACR,KAAK,EACL,YAAY,EACZ,KAAK,EACL,MAAM,GACP,EAAE;IACD,QAAQ,EAAE,SAAS,CAAA;IACnB,KAAK,CAAC,EAAE,IAAI,EAAE,CAAA;IACd,YAAY,CAAC,EAAE,IAAI,EAAE,CAAA;IACrB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB,2CAYA"}