@yuzhouu/canvas-kit 0.1.2

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 (263) hide show
  1. package/README.md +145 -0
  2. package/_vendor/canvas-core/bindings/BindingUtil.ts +92 -0
  3. package/_vendor/canvas-core/bindings/BindingUtilRegistry.ts +22 -0
  4. package/_vendor/canvas-core/bindings/arrow/arrowBindingHelpers.ts +52 -0
  5. package/_vendor/canvas-core/contextMenu.ts +85 -0
  6. package/_vendor/canvas-core/editor/Editor.ts +2614 -0
  7. package/_vendor/canvas-core/editor/HistoryManager.ts +83 -0
  8. package/_vendor/canvas-core/editor/StateNode.ts +162 -0
  9. package/_vendor/canvas-core/editor/camera.ts +6 -0
  10. package/_vendor/canvas-core/editor/clipboard.ts +478 -0
  11. package/_vendor/canvas-core/editor/commands.ts +833 -0
  12. package/_vendor/canvas-core/editor/edgeScroll.ts +37 -0
  13. package/_vendor/canvas-core/editor/editorComputedHelpers.ts +257 -0
  14. package/_vendor/canvas-core/editor/editorSelectionTransforms.ts +116 -0
  15. package/_vendor/canvas-core/editor/events.ts +93 -0
  16. package/_vendor/canvas-core/editor/index.ts +12 -0
  17. package/_vendor/canvas-core/editor/interactions.ts +101 -0
  18. package/_vendor/canvas-core/editor/internal.ts +22 -0
  19. package/_vendor/canvas-core/editor/managers/BindingManager.ts +262 -0
  20. package/_vendor/canvas-core/editor/managers/CameraManager.ts +147 -0
  21. package/_vendor/canvas-core/editor/managers/ClipboardManager.ts +32 -0
  22. package/_vendor/canvas-core/editor/managers/DocumentSnapshotManager.ts +256 -0
  23. package/_vendor/canvas-core/editor/managers/InputsManager.ts +319 -0
  24. package/_vendor/canvas-core/editor/managers/InteractionTransientManager.ts +218 -0
  25. package/_vendor/canvas-core/editor/managers/QueryManager.ts +837 -0
  26. package/_vendor/canvas-core/editor/managers/RenderWindowManager.ts +347 -0
  27. package/_vendor/canvas-core/editor/managers/SelectionLayoutManager.ts +196 -0
  28. package/_vendor/canvas-core/editor/managers/SelectionManager.ts +98 -0
  29. package/_vendor/canvas-core/editor/managers/SelectionOverlayManager.ts +308 -0
  30. package/_vendor/canvas-core/editor/managers/ShapeEditingManager.ts +226 -0
  31. package/_vendor/canvas-core/editor/managers/ShapeGeometryManager.ts +162 -0
  32. package/_vendor/canvas-core/editor/managers/ShapeHierarchyManager.ts +797 -0
  33. package/_vendor/canvas-core/editor/managers/SideEffectManager.ts +83 -0
  34. package/_vendor/canvas-core/editor/managers/SnapManager.ts +433 -0
  35. package/_vendor/canvas-core/editor/managers/SnapSnapshotBuilder.ts +430 -0
  36. package/_vendor/canvas-core/editor/managers/SpatialIndexManager.ts +354 -0
  37. package/_vendor/canvas-core/editor/managers/ToolManager.ts +81 -0
  38. package/_vendor/canvas-core/editor/managers/queryState.ts +583 -0
  39. package/_vendor/canvas-core/editor/managers/selectionGeometry.ts +287 -0
  40. package/_vendor/canvas-core/editor/managers/shapeOrder.ts +350 -0
  41. package/_vendor/canvas-core/editor/managers/shapeReparenting.ts +160 -0
  42. package/_vendor/canvas-core/editor/managers/snapCalculations.ts +412 -0
  43. package/_vendor/canvas-core/editor/managers/snapGeometry.ts +202 -0
  44. package/_vendor/canvas-core/editor/managers/snapIndicators.ts +403 -0
  45. package/_vendor/canvas-core/editor/managers/snapTypes.ts +122 -0
  46. package/_vendor/canvas-core/editor/queries/shapeTransforms.ts +171 -0
  47. package/_vendor/canvas-core/editor/renderWindow.ts +439 -0
  48. package/_vendor/canvas-core/editor/resizeGeometry.ts +654 -0
  49. package/_vendor/canvas-core/editor/selection.ts +489 -0
  50. package/_vendor/canvas-core/editor/selectionHandleInteractions.ts +43 -0
  51. package/_vendor/canvas-core/editor/selectionOverlay.ts +567 -0
  52. package/_vendor/canvas-core/exports/integrity.ts +174 -0
  53. package/_vendor/canvas-core/exports/svg.ts +494 -0
  54. package/_vendor/canvas-core/geometry/Box.ts +80 -0
  55. package/_vendor/canvas-core/geometry/Ellipse2d.ts +67 -0
  56. package/_vendor/canvas-core/geometry/Geometry2d.ts +52 -0
  57. package/_vendor/canvas-core/geometry/Mat.ts +92 -0
  58. package/_vendor/canvas-core/geometry/Polyline2d.ts +63 -0
  59. package/_vendor/canvas-core/geometry/Rectangle2d.ts +64 -0
  60. package/_vendor/canvas-core/geometry/Vec.ts +123 -0
  61. package/_vendor/canvas-core/geometry/index.ts +13 -0
  62. package/_vendor/canvas-core/geometry/segments.ts +65 -0
  63. package/_vendor/canvas-core/index.ts +391 -0
  64. package/_vendor/canvas-core/plugins/index.ts +5 -0
  65. package/_vendor/canvas-core/plugins/types.ts +53 -0
  66. package/_vendor/canvas-core/reactivity.ts +16 -0
  67. package/_vendor/canvas-core/schema/records.ts +221 -0
  68. package/_vendor/canvas-core/schema/snapshots.ts +527 -0
  69. package/_vendor/canvas-core/shapes/ShapeUtil.ts +516 -0
  70. package/_vendor/canvas-core/shapes/ShapeUtilRegistry.ts +26 -0
  71. package/_vendor/canvas-core/shapes/capabilities.ts +67 -0
  72. package/_vendor/canvas-core/shapes/types.ts +20 -0
  73. package/_vendor/canvas-core/toolbar.ts +148 -0
  74. package/_vendor/canvas-core/tools/hand/HandTool.ts +75 -0
  75. package/_vendor/canvas-core/tools/index.ts +2 -0
  76. package/_vendor/canvas-core/tools/select/SelectTool.ts +33 -0
  77. package/_vendor/canvas-core/tools/select/selectContainment.ts +104 -0
  78. package/_vendor/canvas-core/tools/select/selectToolHelpers.ts +801 -0
  79. package/_vendor/canvas-core/tools/select/states/BrushingState.ts +145 -0
  80. package/_vendor/canvas-core/tools/select/states/DraggingSelectionHandleInteractionState.ts +116 -0
  81. package/_vendor/canvas-core/tools/select/states/IdleState.ts +159 -0
  82. package/_vendor/canvas-core/tools/select/states/PointingCanvasState.ts +41 -0
  83. package/_vendor/canvas-core/tools/select/states/PointingResizeHandleState.ts +78 -0
  84. package/_vendor/canvas-core/tools/select/states/PointingRotateHandleState.ts +64 -0
  85. package/_vendor/canvas-core/tools/select/states/PointingSelectionHandleInteractionState.ts +34 -0
  86. package/_vendor/canvas-core/tools/select/states/PointingShapeState.ts +140 -0
  87. package/_vendor/canvas-core/tools/select/states/ResizingState.ts +171 -0
  88. package/_vendor/canvas-core/tools/select/states/RotatingState.ts +124 -0
  89. package/_vendor/canvas-core/tools/select/states/SelectStateNode.ts +128 -0
  90. package/_vendor/canvas-core/tools/select/states/TranslatingState.ts +139 -0
  91. package/_vendor/canvas-core/tools/select/states/index.ts +11 -0
  92. package/_vendor/canvas-plugin-api/feature.ts +204 -0
  93. package/_vendor/canvas-plugin-api/index.ts +142 -0
  94. package/_vendor/canvas-product-react/api/apiRegistry.ts +35 -0
  95. package/_vendor/canvas-product-react/api/canvasProductApi.ts +422 -0
  96. package/_vendor/canvas-product-react/api/index.ts +31 -0
  97. package/_vendor/canvas-product-react/capabilities/clipboard/clipboardService.ts +36 -0
  98. package/_vendor/canvas-product-react/capabilities/clipboard/systemClipboard.ts +245 -0
  99. package/_vendor/canvas-product-react/capabilities/context-menu/systemContextMenu.ts +396 -0
  100. package/_vendor/canvas-product-react/capabilities/context-menu/useContextMenuSurface.ts +59 -0
  101. package/_vendor/canvas-product-react/capabilities/export/useSvgExport.ts +156 -0
  102. package/_vendor/canvas-product-react/capabilities/history/useHistoryControls.ts +23 -0
  103. package/_vendor/canvas-product-react/capabilities/pages/usePageControls.ts +41 -0
  104. package/_vendor/canvas-product-react/capabilities/toolbar/systemToolbar.ts +490 -0
  105. package/_vendor/canvas-product-react/capabilities/toolbar/useToolbarSurfaces.ts +92 -0
  106. package/_vendor/canvas-product-react/capabilities/zoom/useZoomControls.ts +27 -0
  107. package/_vendor/canvas-product-react/index.ts +84 -0
  108. package/_vendor/canvas-product-react/persistence/index.ts +18 -0
  109. package/_vendor/canvas-product-react/persistence/localSnapshotPersistence.ts +294 -0
  110. package/_vendor/canvas-product-react/runtime/CanvasProductRoot.tsx +250 -0
  111. package/_vendor/canvas-product-react/runtime/productDefinition.ts +72 -0
  112. package/_vendor/canvas-product-react/runtime/productServices.ts +96 -0
  113. package/_vendor/canvas-react/components/CanvasView.tsx +796 -0
  114. package/_vendor/canvas-react/components/OverlayLayer.tsx +879 -0
  115. package/_vendor/canvas-react/components/PageSpace.tsx +34 -0
  116. package/_vendor/canvas-react/components/ShapeLayer.tsx +428 -0
  117. package/_vendor/canvas-react/components/index.ts +4 -0
  118. package/_vendor/canvas-react/hooks/useEditor.ts +11 -0
  119. package/_vendor/canvas-react/hooks/useValue.ts +14 -0
  120. package/_vendor/canvas-react/host/CanvasRendererRegistryContext.tsx +14 -0
  121. package/_vendor/canvas-react/host/contextMenuRegistry.ts +61 -0
  122. package/_vendor/canvas-react/host/domEventGuards.ts +61 -0
  123. package/_vendor/canvas-react/host/index.ts +38 -0
  124. package/_vendor/canvas-react/host/pluginHost.ts +635 -0
  125. package/_vendor/canvas-react/host/rendererRegistry.tsx +58 -0
  126. package/_vendor/canvas-react/host/toolbarRegistry.ts +100 -0
  127. package/_vendor/canvas-react/index.ts +3 -0
  128. package/_vendor/plugin-arrow/ArrowBindingUtil.ts +239 -0
  129. package/_vendor/plugin-arrow/ArrowShapeUtil.ts +311 -0
  130. package/_vendor/plugin-arrow/ArrowTool.ts +208 -0
  131. package/_vendor/plugin-arrow/arrowGeometry.ts +441 -0
  132. package/_vendor/plugin-arrow/arrowTerminalBindingResolver.ts +253 -0
  133. package/_vendor/plugin-arrow/arrowTerminalCommands.ts +230 -0
  134. package/_vendor/plugin-arrow/canvas.tsx +92 -0
  135. package/_vendor/plugin-arrow/core.ts +409 -0
  136. package/_vendor/plugin-arrow/feature.ts +20 -0
  137. package/_vendor/plugin-arrow/index.ts +28 -0
  138. package/_vendor/plugin-arrow/selectionHandleInteractions.ts +154 -0
  139. package/_vendor/plugin-arrow/types.ts +63 -0
  140. package/_vendor/plugin-draw/DrawShapeRenderer.tsx +60 -0
  141. package/_vendor/plugin-draw/DrawShapeUtil.ts +372 -0
  142. package/_vendor/plugin-draw/DrawTool.ts +444 -0
  143. package/_vendor/plugin-draw/canvas.tsx +24 -0
  144. package/_vendor/plugin-draw/core.ts +515 -0
  145. package/_vendor/plugin-draw/drawGeometry.ts +491 -0
  146. package/_vendor/plugin-draw/drawHitTest.ts +271 -0
  147. package/_vendor/plugin-draw/drawInterpolation.ts +250 -0
  148. package/_vendor/plugin-draw/drawPath.ts +550 -0
  149. package/_vendor/plugin-draw/drawSegments.ts +106 -0
  150. package/_vendor/plugin-draw/drawSelectionTransform.ts +67 -0
  151. package/_vendor/plugin-draw/drawShapeGeometry.ts +307 -0
  152. package/_vendor/plugin-draw/drawStrokeGeometry.ts +454 -0
  153. package/_vendor/plugin-draw/feature.ts +20 -0
  154. package/_vendor/plugin-draw/index.ts +31 -0
  155. package/_vendor/plugin-draw/types.ts +36 -0
  156. package/_vendor/plugin-eraser/EraserTool.ts +297 -0
  157. package/_vendor/plugin-eraser/canvas.tsx +616 -0
  158. package/_vendor/plugin-eraser/core.ts +49 -0
  159. package/_vendor/plugin-eraser/feature.ts +20 -0
  160. package/_vendor/plugin-eraser/index.ts +4 -0
  161. package/_vendor/plugin-frame/FrameShapeUtil.ts +173 -0
  162. package/_vendor/plugin-frame/FrameTool.ts +225 -0
  163. package/_vendor/plugin-frame/canvas.tsx +75 -0
  164. package/_vendor/plugin-frame/core.ts +534 -0
  165. package/_vendor/plugin-frame/feature.ts +20 -0
  166. package/_vendor/plugin-frame/index.ts +6 -0
  167. package/_vendor/plugin-geo/GeoShapeUtil.ts +463 -0
  168. package/_vendor/plugin-geo/GeoTools.ts +247 -0
  169. package/_vendor/plugin-geo/canvas.tsx +90 -0
  170. package/_vendor/plugin-geo/core.ts +495 -0
  171. package/_vendor/plugin-geo/feature.ts +20 -0
  172. package/_vendor/plugin-geo/index.ts +7 -0
  173. package/_vendor/plugin-geo/types.ts +27 -0
  174. package/_vendor/plugin-group/GroupShapeUtil.ts +59 -0
  175. package/_vendor/plugin-group/canvas.tsx +59 -0
  176. package/_vendor/plugin-group/core.ts +40 -0
  177. package/_vendor/plugin-group/feature.ts +20 -0
  178. package/_vendor/plugin-group/index.ts +5 -0
  179. package/_vendor/plugin-image/ImageShapeUtil.ts +95 -0
  180. package/_vendor/plugin-image/canvas.tsx +212 -0
  181. package/_vendor/plugin-image/core.ts +542 -0
  182. package/_vendor/plugin-image/crop.ts +770 -0
  183. package/_vendor/plugin-image/cropInteractions.ts +350 -0
  184. package/_vendor/plugin-image/cropSession.ts +38 -0
  185. package/_vendor/plugin-image/feature.ts +20 -0
  186. package/_vendor/plugin-image/index.ts +29 -0
  187. package/_vendor/plugin-image/types.ts +55 -0
  188. package/_vendor/plugin-image-product-react/ImageImportController.tsx +143 -0
  189. package/_vendor/plugin-image-product-react/imageAssetService.ts +52 -0
  190. package/_vendor/plugin-image-product-react/imageBlobStore.ts +315 -0
  191. package/_vendor/plugin-image-product-react/imageHostActions.ts +438 -0
  192. package/_vendor/plugin-image-product-react/imageProductApi.ts +88 -0
  193. package/_vendor/plugin-image-product-react/imageToolbarHostBridge.ts +48 -0
  194. package/_vendor/plugin-image-product-react/imageToolbarRuntime.ts +21 -0
  195. package/_vendor/plugin-image-product-react/index.ts +60 -0
  196. package/_vendor/plugin-image-product-react/snapshotGuards.ts +33 -0
  197. package/_vendor/plugin-image-product-react/svgImageAssetInliner.ts +54 -0
  198. package/_vendor/plugin-image-product-react/useImageImport.ts +64 -0
  199. package/_vendor/plugin-laser/LaserTool.ts +154 -0
  200. package/_vendor/plugin-laser/canvas.tsx +645 -0
  201. package/_vendor/plugin-laser/core.ts +49 -0
  202. package/_vendor/plugin-laser/feature.ts +20 -0
  203. package/_vendor/plugin-laser/index.ts +4 -0
  204. package/_vendor/plugin-text/ArrowLabelBindingUtil.ts +336 -0
  205. package/_vendor/plugin-text/GeoLabelBindingUtil.ts +391 -0
  206. package/_vendor/plugin-text/TextShapeSvgExporter.ts +101 -0
  207. package/_vendor/plugin-text/TextShapeUtil.ts +284 -0
  208. package/_vendor/plugin-text/TextTool.ts +228 -0
  209. package/_vendor/plugin-text/canvas.tsx +115 -0
  210. package/_vendor/plugin-text/core.ts +422 -0
  211. package/_vendor/plugin-text/feature.ts +20 -0
  212. package/_vendor/plugin-text/host/RichTextEditingBox.tsx +144 -0
  213. package/_vendor/plugin-text/host/RichTextToolbar.tsx +266 -0
  214. package/_vendor/plugin-text/host/TiptapTextEditor.tsx +191 -0
  215. package/_vendor/plugin-text/host/richTextRendering.tsx +49 -0
  216. package/_vendor/plugin-text/host/textDomSelection.ts +93 -0
  217. package/_vendor/plugin-text/host/textEditingBoxStyle.ts +36 -0
  218. package/_vendor/plugin-text/host/textEntryFocus.ts +307 -0
  219. package/_vendor/plugin-text/host/textFontLoader.ts +149 -0
  220. package/_vendor/plugin-text/host/textMeasurement.ts +258 -0
  221. package/_vendor/plugin-text/host/textMeasurementSync.ts +77 -0
  222. package/_vendor/plugin-text/host/textRangeSelection.ts +134 -0
  223. package/_vendor/plugin-text/host/textShapeRendererRuntime.tsx +89 -0
  224. package/_vendor/plugin-text/host/textShapeSync.ts +173 -0
  225. package/_vendor/plugin-text/host/tiptapTextEditorController.ts +148 -0
  226. package/_vendor/plugin-text/index.ts +18 -0
  227. package/_vendor/plugin-text/richTextUtils.ts +259 -0
  228. package/_vendor/plugin-text/textInteractions.ts +366 -0
  229. package/_vendor/plugin-text/textLabelHelpers.ts +235 -0
  230. package/_vendor/plugin-text/textShapeHelpers.ts +123 -0
  231. package/_vendor/plugin-text/textStyle.ts +96 -0
  232. package/_vendor/plugin-text/textTypes.ts +48 -0
  233. package/_vendor/signals/atom.ts +74 -0
  234. package/_vendor/signals/computed.ts +132 -0
  235. package/_vendor/signals/core.ts +130 -0
  236. package/_vendor/signals/effect.ts +117 -0
  237. package/_vendor/signals/index.ts +9 -0
  238. package/_vendor/signals/types.ts +17 -0
  239. package/_vendor/store/Store.ts +171 -0
  240. package/_vendor/store/diff.ts +229 -0
  241. package/_vendor/store/history.ts +177 -0
  242. package/_vendor/store/index.ts +32 -0
  243. package/_vendor/store/types.ts +37 -0
  244. package/api/canvasKitApi.d.ts +29 -0
  245. package/index.css +3 -0
  246. package/index.d.ts +16 -0
  247. package/index.mjs +1 -0
  248. package/internal-modules.d.ts +187 -0
  249. package/package.json +48 -0
  250. package/product/Shell.d.ts +19 -0
  251. package/product/chromeContext.d.ts +70 -0
  252. package/product/createCanvasKitEditor.d.ts +6 -0
  253. package/product/index.d.ts +7 -0
  254. package/product/persistence.d.ts +3 -0
  255. package/product/product.d.ts +22 -0
  256. package/product/useCanvasClipboardShortcuts.d.ts +6 -0
  257. package/product-iyBbEPIs.mjs +4 -0
  258. package/product.mjs +1 -0
  259. package/standard/extensions.d.ts +1 -0
  260. package/standard/index.d.ts +3 -0
  261. package/standard/standardApi.d.ts +91 -0
  262. package/standard-BmrxwqpJ.mjs +44 -0
  263. package/standard.mjs +1 -0
package/README.md ADDED
@@ -0,0 +1,145 @@
1
+ # @land/canvas-kit
2
+
3
+ `@land/canvas-kit` 把 Land 画布打包成一个开箱即用的 React 画布套件,包含标准产品预设、插件集成和类型化 API。
4
+
5
+ 发布包包含:
6
+
7
+ - `CanvasKit`,用于直接嵌入标准画布套件
8
+ - `createCanvasKitApi` 和 `CanvasKitApi`,用于编辑器自动化
9
+ - `createCanvasKitProduct`,用于较底层的 `CanvasProductRoot` 产品组合
10
+ - `@land/canvas-kit/product`,用于自定义产品 chrome
11
+ - `@land/canvas-kit/standard`,用于标准内置插件扩展与类型化 API
12
+ - 打包进发布产物的 Land 内部依赖
13
+ - 作为 peer dependency 的 `react` 和 `react-dom`
14
+
15
+ ## 文档
16
+
17
+ - [使用文档](./docs/使用文档.md) - 基于 `apps/professional` 和 `apps/zen` 示例的使用指南。
18
+ - [API 文档](./docs/API文档.md) - `.`、`./product` 和 `./standard` 三个入口的完整 API 参考。
19
+
20
+ ## 安装
21
+
22
+ ```bash
23
+ pnpm add @land/canvas-kit react react-dom
24
+ ```
25
+
26
+ ## 使用
27
+
28
+ ```tsx
29
+ import { useRef } from "react";
30
+ import {
31
+ CanvasKit,
32
+ type CanvasKitHandle,
33
+ } from "@land/canvas-kit";
34
+ import "@land/canvas-kit/style.css";
35
+
36
+ export function App() {
37
+ const apiRef = useRef<CanvasKitHandle>(null);
38
+
39
+ return (
40
+ <div style={{ width: "100%", height: "100vh" }}>
41
+ <CanvasKit
42
+ ref={apiRef}
43
+ onReady={(api) => {
44
+ console.log(api.snapshot());
45
+ }}
46
+ />
47
+ </div>
48
+ );
49
+ }
50
+ ```
51
+
52
+ 宿主容器需要提供明确尺寸。`CanvasKit` 会以 `width: 100%` 和 `height: 100%` 填满父容器。
53
+
54
+ ## 注意事项
55
+
56
+ - 默认的 `canvas-kit` 产品包含画布表面、标准插件、产品运行时,以及插件自带的编辑 UI,例如文本行内格式工具条。
57
+ - 它不会注册产品级 chrome 面板、工具栏或上下文菜单。
58
+
59
+ ## 使用 `createCanvasKitProduct` 自定义 chrome
60
+
61
+ `createCanvasKitProduct` 是围绕标准 Land 画布构建自定义产品壳的较底层组合入口。它负责编辑器运行时、标准插件、图片导入、剪贴板集成、持久化和 API 生命周期;你的应用只需要通过一个 `chrome(context)` 函数提供产品 UI。
62
+
63
+ ```tsx
64
+ import { useMemo } from "react";
65
+ import { CanvasProductRoot } from "@land/canvas-product-react";
66
+ import {
67
+ createCanvasKitProduct,
68
+ type CanvasKitChromeContext,
69
+ } from "@land/canvas-kit/product";
70
+ import { type CanvasKitApi } from "@land/canvas-kit";
71
+ import "@land/canvas-kit/style.css";
72
+
73
+ function MyChrome({ context }: { context: CanvasKitChromeContext<CanvasKitApi> }) {
74
+ const { api, history, selectedShapeIds, selection, toolbarSurfaces, zoom } =
75
+ context;
76
+
77
+ return (
78
+ <>
79
+ <div className="my-topbar">
80
+ <button type="button" disabled={!history.canUndo} onClick={history.undo}>
81
+ 撤销
82
+ </button>
83
+ <button type="button" onClick={zoom.zoomIn}>
84
+ 放大
85
+ </button>
86
+ <button
87
+ type="button"
88
+ disabled={selection.count === 0}
89
+ onClick={() => api.deleteShapes([...selectedShapeIds])}
90
+ >
91
+ 删除
92
+ </button>
93
+ </div>
94
+
95
+ {toolbarSurfaces.contextToolbarGroups.length > 0 ? (
96
+ <aside className="my-context-panel">
97
+ {toolbarSurfaces.contextToolbarTitle}
98
+ </aside>
99
+ ) : null}
100
+ </>
101
+ );
102
+ }
103
+
104
+ export function App() {
105
+ const product = useMemo(
106
+ () =>
107
+ createCanvasKitProduct({
108
+ chrome: (context) => <MyChrome context={context} />,
109
+ exposeApiOnWindow: true,
110
+ }),
111
+ [],
112
+ );
113
+
114
+ return (
115
+ <div style={{ width: "100%", height: "100vh" }}>
116
+ <CanvasProductRoot product={product} />
117
+ </div>
118
+ );
119
+ }
120
+ ```
121
+
122
+ 如果要做 professional 风格的产品,可以围绕 `CanvasKitChromeContext` 添加自己的面板,并把文档改动保持在 `context.api` 上。chrome 不需要直接访问 `Editor`、`@land/canvas-core` 或 `@land/canvas-react/host`。
123
+
124
+ ## 高级入口
125
+
126
+ 包根入口会刻意保持精简。较底层的产品套件辅助方法请从显式子路径导入:
127
+
128
+ ```tsx
129
+ import { createCanvasKitProduct } from "@land/canvas-kit/product";
130
+ import { standardCanvasExtensions } from "@land/canvas-kit/standard";
131
+ ```
132
+
133
+ ## 本仓库本地构建
134
+
135
+ 从 workspace 根目录执行:
136
+
137
+ ```bash
138
+ pnpm build:canvas-kit:bundle
139
+ ```
140
+
141
+ 可发布产物会写入:
142
+
143
+ ```text
144
+ packages/canvas-kit/dist-component/
145
+ ```
@@ -0,0 +1,92 @@
1
+ import type { Editor } from "../editor/Editor";
2
+ import type { SelectionOverlayFrameGeometryState } from "../editor/selection";
3
+ import type {
4
+ BindingId,
5
+ BindingRecord,
6
+ BindingRecordBase,
7
+ ShapeRecord,
8
+ } from "../schema/records";
9
+
10
+ export interface BindingUtilEffect {
11
+ shapes?: ShapeRecord[];
12
+ bindings?: BindingRecord[];
13
+ deleteShapeIds?: ShapeRecord["id"][];
14
+ deleteBindingIds?: BindingId[];
15
+ }
16
+
17
+ export interface BindingShapeChangeContext {
18
+ before: ShapeRecord;
19
+ after: ShapeRecord;
20
+ role: "from" | "to";
21
+ }
22
+
23
+ export interface BindingShapeDeleteContext {
24
+ shape: ShapeRecord;
25
+ role: "from" | "to";
26
+ }
27
+
28
+ export interface BindingEndpointContext {
29
+ fromShape: ShapeRecord;
30
+ toShape: ShapeRecord;
31
+ }
32
+
33
+ export interface BindingSelectionCompanionFrameContext {
34
+ selectedShape: ShapeRecord;
35
+ }
36
+
37
+ export interface BindingShapeGeometryDependencyContext {
38
+ shape: ShapeRecord;
39
+ role: "from" | "to";
40
+ }
41
+
42
+ export abstract class BindingUtil<
43
+ B extends BindingRecordBase = BindingRecordBase,
44
+ > {
45
+ abstract readonly type: B["type"];
46
+
47
+ abstract getDefaultProps(): B["props"];
48
+
49
+ abstract validateProps(props: unknown): B["props"];
50
+
51
+ canBind?(editor: Editor, binding: B, context: BindingEndpointContext): boolean;
52
+
53
+ getExclusiveBindingKey?(binding: B): string | null;
54
+
55
+ onBindingCreate?(editor: Editor, binding: B): BindingUtilEffect | void;
56
+
57
+ onBindingUpdate?(
58
+ editor: Editor,
59
+ before: B,
60
+ after: B,
61
+ ): BindingUtilEffect | void;
62
+
63
+ onBindingLoad?(editor: Editor, binding: B): BindingUtilEffect | void;
64
+
65
+ onAfterShapeChange?(
66
+ editor: Editor,
67
+ binding: B,
68
+ context: BindingShapeChangeContext,
69
+ ): BindingUtilEffect | void;
70
+
71
+ onBeforeDeleteShape?(
72
+ editor: Editor,
73
+ binding: B,
74
+ context: BindingShapeDeleteContext,
75
+ ): BindingUtilEffect | void;
76
+
77
+ onBeforeDeleteBinding?(editor: Editor, binding: B): BindingUtilEffect | void;
78
+
79
+ getExportShapeIds?(editor: Editor, binding: B): ShapeRecord["id"][];
80
+
81
+ getGeometryDependentShapeIds?(
82
+ editor: Editor,
83
+ binding: B,
84
+ context: BindingShapeGeometryDependencyContext,
85
+ ): ShapeRecord["id"][];
86
+
87
+ getSelectionCompanionFrameGeometries?(
88
+ editor: Editor,
89
+ binding: B,
90
+ context: BindingSelectionCompanionFrameContext,
91
+ ): SelectionOverlayFrameGeometryState[];
92
+ }
@@ -0,0 +1,22 @@
1
+ import type { BindingRecordBase } from "../schema/records";
2
+ import { BindingUtil } from "./BindingUtil";
3
+
4
+ export class BindingUtilRegistry {
5
+ private readonly registry = new Map<string, BindingUtil>();
6
+
7
+ register<B extends BindingRecordBase>(util: BindingUtil<B>): void {
8
+ this.registry.set(util.type, util as BindingUtil);
9
+ }
10
+
11
+ values(): IterableIterator<BindingUtil> {
12
+ return this.registry.values();
13
+ }
14
+
15
+ get<B extends BindingRecordBase>(type: B["type"]): BindingUtil<B> {
16
+ const util = this.registry.get(type);
17
+ if (!util) {
18
+ throw new Error(`Missing binding util for type \"${type}\"`);
19
+ }
20
+ return util as BindingUtil<B>;
21
+ }
22
+ }
@@ -0,0 +1,52 @@
1
+ import { Vec } from "../../geometry/Vec";
2
+ import type { Editor } from "../../editor/Editor";
3
+ import type { ArrowBindingPreviewState } from "../../editor/selection";
4
+ import type { ShapeId } from "../../schema/records";
5
+
6
+ export interface ConnectionPoint {
7
+ x: number;
8
+ y: number;
9
+ }
10
+
11
+ export type ConnectionTerminal = "start" | "end";
12
+
13
+ export interface ArrowBindingTargetInput {
14
+ targetShapeId: ShapeId;
15
+ normalizedAnchor: ConnectionPoint;
16
+ }
17
+
18
+ export interface ResolvedArrowTerminalBinding {
19
+ pagePoint: Vec;
20
+ binding: ArrowBindingTargetInput | null;
21
+ preview: ArrowBindingPreviewState | null;
22
+ }
23
+
24
+ export interface ArrowTerminalBindingResolverInput {
25
+ terminal: ConnectionTerminal;
26
+ rawPagePoint: Vec;
27
+ oppositePagePoint: Vec;
28
+ excludeShapeId?: ShapeId;
29
+ ignoreTargets?: boolean;
30
+ }
31
+
32
+ export type ArrowTerminalBindingResolver = (
33
+ editor: Editor,
34
+ input: ArrowTerminalBindingResolverInput,
35
+ ) => ResolvedArrowTerminalBinding;
36
+
37
+ export function getFreeArrowTerminalBinding({
38
+ rawPagePoint,
39
+ }: ArrowTerminalBindingResolverInput): ResolvedArrowTerminalBinding {
40
+ return {
41
+ pagePoint: rawPagePoint.clone(),
42
+ binding: null,
43
+ preview: null,
44
+ };
45
+ }
46
+
47
+ export function resolveArrowTerminalBindingAtPoint(
48
+ editor: Editor,
49
+ input: ArrowTerminalBindingResolverInput,
50
+ ): ResolvedArrowTerminalBinding {
51
+ return editor.resolveArrowTerminalBinding(input);
52
+ }
@@ -0,0 +1,85 @@
1
+ import type { ShapeId, ShapeRecordBase } from "./schema/records";
2
+ import type { ToolbarActionValue, ToolbarContext } from "./toolbar";
3
+ import type { Vec } from "./geometry";
4
+
5
+ export interface ContextMenuCanvasTarget {
6
+ type: "canvas";
7
+ }
8
+
9
+ export interface ContextMenuShapeTarget {
10
+ type: "shape";
11
+ shapeId: ShapeId;
12
+ shapeType: ShapeRecordBase["type"];
13
+ selected: boolean;
14
+ }
15
+
16
+ export interface ContextMenuSelectionTarget {
17
+ type: "selection";
18
+ selectedShapeIds: readonly ShapeId[];
19
+ }
20
+
21
+ export type ContextMenuTarget =
22
+ | ContextMenuCanvasTarget
23
+ | ContextMenuShapeTarget
24
+ | ContextMenuSelectionTarget;
25
+
26
+ export interface ContextMenuOpenSnapshot {
27
+ screenPoint: Vec;
28
+ pagePoint: Vec;
29
+ target: ContextMenuTarget;
30
+ }
31
+
32
+ export interface ContextMenuContext extends ToolbarContext {
33
+ menu: ContextMenuOpenSnapshot;
34
+ }
35
+
36
+ export type ContextMenuContributionTarget =
37
+ | "canvas"
38
+ | "selection"
39
+ | "shape"
40
+ | "any";
41
+
42
+ export interface ContextMenuCommandItem {
43
+ kind: "command";
44
+ id: string;
45
+ actionId: string;
46
+ label: string;
47
+ icon?: string;
48
+ value?: ToolbarActionValue;
49
+ shortcut?: string;
50
+ tone?: "default" | "destructive";
51
+ dataUi?: string;
52
+ }
53
+
54
+ export interface ContextMenuSeparatorItem {
55
+ kind: "separator";
56
+ id: string;
57
+ }
58
+
59
+ export interface ContextMenuBadgeItem {
60
+ kind: "badge";
61
+ id: string;
62
+ label: string;
63
+ dataUi?: string;
64
+ }
65
+
66
+ export type ContextMenuItem =
67
+ | ContextMenuCommandItem
68
+ | ContextMenuSeparatorItem
69
+ | ContextMenuBadgeItem;
70
+
71
+ export interface ContextMenuSection {
72
+ id: string;
73
+ order?: number;
74
+ title?: string;
75
+ items: readonly ContextMenuItem[];
76
+ }
77
+
78
+ export interface ContextMenuContribution {
79
+ id: string;
80
+ target: ContextMenuContributionTarget;
81
+ order?: number;
82
+ actionIds: readonly string[];
83
+ when?(context: ContextMenuContext): boolean;
84
+ getSections(context: ContextMenuContext): readonly ContextMenuSection[];
85
+ }