@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
@@ -0,0 +1,11 @@
1
+ export { BrushingState } from "./BrushingState";
2
+ export { DraggingSelectionHandleInteractionState } from "./DraggingSelectionHandleInteractionState";
3
+ export { IdleState } from "./IdleState";
4
+ export { PointingCanvasState } from "./PointingCanvasState";
5
+ export { PointingResizeHandleState } from "./PointingResizeHandleState";
6
+ export { PointingRotateHandleState } from "./PointingRotateHandleState";
7
+ export { PointingSelectionHandleInteractionState } from "./PointingSelectionHandleInteractionState";
8
+ export { PointingShapeState } from "./PointingShapeState";
9
+ export { ResizingState } from "./ResizingState";
10
+ export { RotatingState } from "./RotatingState";
11
+ export { TranslatingState } from "./TranslatingState";
@@ -0,0 +1,204 @@
1
+ import type {
2
+ LandCorePlugin,
3
+ ShapeRecordBase,
4
+ } from "@land/canvas-core";
5
+ import type { LandCanvasPlugin } from "./index";
6
+
7
+ type LandExtensionOptions = Record<string, unknown>;
8
+
9
+ export interface LandFeatureBundle {
10
+ id: string;
11
+ corePlugins: readonly LandCorePlugin[];
12
+ canvasPlugins: readonly LandCanvasPlugin[];
13
+ shapeTypes: readonly ShapeRecordBase["type"][];
14
+ }
15
+
16
+ export interface LandExtension {
17
+ readonly name: string;
18
+ readonly options: Readonly<LandExtensionOptions>;
19
+ readonly priority: number;
20
+ createFeature(): LandFeatureBundle | null;
21
+ getExtensions(): readonly LandExtension[];
22
+ }
23
+
24
+ export type LandExtensionOptionsInput<T> =
25
+ T extends readonly unknown[]
26
+ ? T
27
+ : T extends LandExtensionOptions
28
+ ? { [K in keyof T]?: LandExtensionOptionsInput<T[K]> }
29
+ : T;
30
+
31
+ export interface ConfigurableLandExtension<
32
+ Options extends LandExtensionOptions,
33
+ > extends LandExtension {
34
+ readonly options: Readonly<Options>;
35
+ configure(
36
+ options?: LandExtensionOptionsInput<Options>,
37
+ ): ConfigurableLandExtension<Options>;
38
+ }
39
+
40
+ export interface LandExtensionConfig<
41
+ Options extends LandExtensionOptions,
42
+ > {
43
+ name: string;
44
+ priority?: number;
45
+ addOptions?(): Options;
46
+ addExtensions?(
47
+ options: Readonly<Options>,
48
+ ): readonly LandExtension[];
49
+ createFeature?(options: Readonly<Options>): LandFeatureBundle;
50
+ }
51
+
52
+ export interface ResolvedLandExtension {
53
+ extension: LandExtension;
54
+ feature: LandFeatureBundle | null;
55
+ }
56
+
57
+ const DEFAULT_EXTENSION_PRIORITY = 100;
58
+
59
+ class LandExtensionInstance<
60
+ Options extends LandExtensionOptions,
61
+ > implements ConfigurableLandExtension<Options> {
62
+ readonly name: string;
63
+ readonly options: Readonly<Options>;
64
+ readonly priority: number;
65
+
66
+ constructor(
67
+ private readonly config: LandExtensionConfig<Options>,
68
+ options: Options,
69
+ ) {
70
+ this.name = config.name;
71
+ this.options = Object.freeze(options);
72
+ this.priority = config.priority ?? DEFAULT_EXTENSION_PRIORITY;
73
+ }
74
+
75
+ configure(
76
+ options?: LandExtensionOptionsInput<Options>,
77
+ ): ConfigurableLandExtension<Options> {
78
+ return new LandExtensionInstance(
79
+ this.config,
80
+ mergeExtensionOptions(
81
+ this.options,
82
+ options ?? ({} as LandExtensionOptionsInput<Options>),
83
+ ),
84
+ );
85
+ }
86
+
87
+ createFeature(): LandFeatureBundle | null {
88
+ return this.config.createFeature?.(this.options) ?? null;
89
+ }
90
+
91
+ getExtensions(): readonly LandExtension[] {
92
+ return this.config.addExtensions?.(this.options) ?? [];
93
+ }
94
+ }
95
+
96
+ export function defineLandExtension<
97
+ Options extends LandExtensionOptions = Record<string, never>,
98
+ >(
99
+ config: LandExtensionConfig<Options>,
100
+ ): ConfigurableLandExtension<Options> {
101
+ if (!config.createFeature && !config.addExtensions) {
102
+ throw new Error(
103
+ `Land extension "${config.name}" must define createFeature() or addExtensions().`,
104
+ );
105
+ }
106
+
107
+ const options = config.addOptions?.() ?? ({} as Options);
108
+ return new LandExtensionInstance(config, options);
109
+ }
110
+
111
+ export function resolveLandExtensions(
112
+ extensions: readonly LandExtension[],
113
+ ): ResolvedLandExtension[] {
114
+ const flattened: Array<{ extension: LandExtension; index: number }> = [];
115
+ const activeExtensions = new Set<LandExtension>();
116
+ let index = 0;
117
+
118
+ const visit = (extension: LandExtension) => {
119
+ if (activeExtensions.has(extension)) {
120
+ throw new Error(
121
+ `Circular Land extension bundle detected at "${extension.name}".`,
122
+ );
123
+ }
124
+
125
+ activeExtensions.add(extension);
126
+ flattened.push({ extension, index });
127
+ index += 1;
128
+ for (const child of extension.getExtensions()) {
129
+ visit(child);
130
+ }
131
+ activeExtensions.delete(extension);
132
+ };
133
+
134
+ for (const extension of extensions) {
135
+ visit(extension);
136
+ }
137
+
138
+ const duplicateNames = getDuplicateNames(
139
+ flattened.map(({ extension }) => extension.name),
140
+ );
141
+ if (duplicateNames.length > 0) {
142
+ throw new Error(
143
+ `Duplicate Land extension names: ${duplicateNames.join(", ")}.`,
144
+ );
145
+ }
146
+
147
+ return flattened
148
+ .sort(
149
+ (a, b) =>
150
+ b.extension.priority - a.extension.priority ||
151
+ a.index - b.index,
152
+ )
153
+ .map(({ extension }) => ({
154
+ extension,
155
+ feature: extension.createFeature(),
156
+ }));
157
+ }
158
+
159
+ function mergeExtensionOptions<Options extends LandExtensionOptions>(
160
+ base: Readonly<Options>,
161
+ overrides: LandExtensionOptionsInput<Options>,
162
+ ): Options {
163
+ return mergeRecords(base, overrides as LandExtensionOptions) as Options;
164
+ }
165
+
166
+ function mergeRecords(
167
+ base: Readonly<LandExtensionOptions>,
168
+ overrides: Readonly<LandExtensionOptions>,
169
+ ): LandExtensionOptions {
170
+ const result: LandExtensionOptions = { ...base };
171
+
172
+ for (const [key, overrideValue] of Object.entries(overrides)) {
173
+ const baseValue = base[key];
174
+ result[key] =
175
+ isPlainRecord(baseValue) && isPlainRecord(overrideValue)
176
+ ? mergeRecords(baseValue, overrideValue)
177
+ : overrideValue;
178
+ }
179
+
180
+ return result;
181
+ }
182
+
183
+ function isPlainRecord(value: unknown): value is LandExtensionOptions {
184
+ return (
185
+ typeof value === "object" &&
186
+ value !== null &&
187
+ !Array.isArray(value)
188
+ );
189
+ }
190
+
191
+ function getDuplicateNames(names: readonly string[]): string[] {
192
+ const seen = new Set<string>();
193
+ const duplicates = new Set<string>();
194
+
195
+ for (const name of names) {
196
+ if (seen.has(name)) {
197
+ duplicates.add(name);
198
+ } else {
199
+ seen.add(name);
200
+ }
201
+ }
202
+
203
+ return [...duplicates];
204
+ }
@@ -0,0 +1,142 @@
1
+ import type { ComponentType, ReactNode } from "react";
2
+ import type {
3
+ Editor,
4
+ LandCorePlugin,
5
+ ShapeEditingSession,
6
+ ShapeRecordBase,
7
+ ToolbarAction,
8
+ ToolbarActionRunInput,
9
+ ToolbarActionValue,
10
+ ToolbarBadgeItem,
11
+ ToolbarButtonItem,
12
+ ToolbarContext,
13
+ ToolbarContribution,
14
+ ToolbarGroup,
15
+ ToolbarItem,
16
+ ToolbarSegmentedItem,
17
+ ToolbarSegmentedOption,
18
+ ToolbarSelectionSnapshot,
19
+ ToolbarSeparatorItem,
20
+ ToolbarStepperItem,
21
+ ToolbarStepperOption,
22
+ ToolbarTextInputItem,
23
+ ToolbarSurface,
24
+ ToolbarSwatchesItem,
25
+ ToolbarSwatchOption,
26
+ ToolbarToolSnapshot,
27
+ } from "@land/canvas-core";
28
+ export {
29
+ defineLandExtension,
30
+ resolveLandExtensions,
31
+ } from "./feature";
32
+ export type {
33
+ ConfigurableLandExtension,
34
+ LandExtension,
35
+ LandExtensionConfig,
36
+ LandExtensionOptionsInput,
37
+ LandFeatureBundle,
38
+ ResolvedLandExtension,
39
+ } from "./feature";
40
+
41
+ export interface ShapeRendererProps<
42
+ S extends ShapeRecordBase = ShapeRecordBase,
43
+ > {
44
+ shape: S;
45
+ editor: Editor;
46
+ isSelected: boolean;
47
+ shapeEditingSession: ShapeEditingSession | null;
48
+ }
49
+
50
+ export interface RegisteredShapeRenderer<
51
+ S extends ShapeRecordBase = ShapeRecordBase,
52
+ > {
53
+ type: S["type"];
54
+ component: ComponentType<ShapeRendererProps<S>>;
55
+ }
56
+
57
+ export type AnyRegisteredShapeRenderer = RegisteredShapeRenderer<ShapeRecordBase>;
58
+
59
+ export interface CanvasPluginComponent {
60
+ id: string;
61
+ component: ComponentType;
62
+ }
63
+
64
+ export interface CanvasPluginProvider {
65
+ id: string;
66
+ component: ComponentType<{ children: ReactNode }>;
67
+ }
68
+
69
+ export type ShapeRendererRegistrar = <S extends ShapeRecordBase>(
70
+ renderer: RegisteredShapeRenderer<S>,
71
+ ) => void;
72
+
73
+ export type CanvasDomEventGuardName =
74
+ | "pointer_down"
75
+ | "pointer_move"
76
+ | "pointer_up"
77
+ | "pointer_cancel"
78
+ | "wheel"
79
+ | "key_down"
80
+ | "key_up";
81
+
82
+ export type CanvasDomEventGuardDecision = "continue" | "handled";
83
+
84
+ export interface CanvasDomEventGuardInput {
85
+ name: CanvasDomEventGuardName;
86
+ event: Event;
87
+ editor: Editor;
88
+ container: HTMLElement;
89
+ }
90
+
91
+ export interface CanvasDomEventGuardCursorInput {
92
+ element: Element | null;
93
+ editor: Editor;
94
+ container: HTMLElement;
95
+ clientPoint: { x: number; y: number } | null;
96
+ }
97
+
98
+ export interface CanvasDomEventGuard {
99
+ id: string;
100
+ handle(input: CanvasDomEventGuardInput): CanvasDomEventGuardDecision;
101
+ getCursor?(input: CanvasDomEventGuardCursorInput): string | undefined;
102
+ }
103
+
104
+ export interface LandCanvasPlugin {
105
+ id: string;
106
+ domEventGuards?: readonly CanvasDomEventGuard[];
107
+ canvasProviders?: readonly CanvasPluginProvider[];
108
+ canvasComponents?: readonly CanvasPluginComponent[];
109
+ setup(registerShapeRenderer: ShapeRendererRegistrar): void;
110
+ }
111
+
112
+ export type {
113
+ ToolbarAction,
114
+ ToolbarActionRunInput,
115
+ ToolbarActionValue,
116
+ ToolbarBadgeItem,
117
+ ToolbarButtonItem,
118
+ ToolbarContext,
119
+ ToolbarContribution,
120
+ ToolbarGroup,
121
+ ToolbarItem,
122
+ ToolbarSegmentedItem,
123
+ ToolbarSegmentedOption,
124
+ ToolbarSelectionSnapshot,
125
+ ToolbarSeparatorItem,
126
+ ToolbarStepperItem,
127
+ ToolbarStepperOption,
128
+ ToolbarTextInputItem,
129
+ ToolbarSurface,
130
+ ToolbarSwatchesItem,
131
+ ToolbarSwatchOption,
132
+ ToolbarToolSnapshot,
133
+ };
134
+
135
+ export function setupCanvasPlugins(
136
+ plugins: readonly LandCanvasPlugin[],
137
+ registerShapeRenderer: ShapeRendererRegistrar,
138
+ ): void {
139
+ for (const plugin of plugins) {
140
+ plugin.setup(registerShapeRenderer);
141
+ }
142
+ }
@@ -0,0 +1,35 @@
1
+ export interface ProductApiToken<TApi> {
2
+ readonly id: string;
3
+ readonly __api?: TApi;
4
+ }
5
+
6
+ export interface ProductApiRegistry {
7
+ get<TApi>(token: ProductApiToken<TApi>): TApi | null;
8
+ }
9
+
10
+ export interface ProductApiRegistryRuntime extends ProductApiRegistry {
11
+ register<TApi>(token: ProductApiToken<TApi>, api: TApi): void;
12
+ }
13
+
14
+ export function createProductApiToken<TApi>(
15
+ id: string,
16
+ ): ProductApiToken<TApi> {
17
+ return { id };
18
+ }
19
+
20
+ export function createProductApiRegistry(): ProductApiRegistryRuntime {
21
+ const apis = new Map<string, unknown>();
22
+
23
+ return {
24
+ register<TApi>(token: ProductApiToken<TApi>, api: TApi): void {
25
+ if (apis.has(token.id)) {
26
+ throw new Error(`Product API already registered: ${token.id}`);
27
+ }
28
+ apis.set(token.id, api);
29
+ },
30
+ get<TApi>(token: ProductApiToken<TApi>): TApi | null {
31
+ return (apis.get(token.id) as TApi | undefined) ?? null;
32
+ },
33
+ };
34
+ }
35
+