@snowcone-app/canvas 0.1.0

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 (370) hide show
  1. package/LICENSE.txt +70 -0
  2. package/README.md +357 -0
  3. package/dist/CanvasStateV1-D5GzvmnY.cjs +65 -0
  4. package/dist/CanvasStateV1-D5GzvmnY.cjs.map +1 -0
  5. package/dist/CanvasStateV1-ejb4d_LM.js +3692 -0
  6. package/dist/CanvasStateV1-ejb4d_LM.js.map +1 -0
  7. package/dist/ElementFactory-B7UOaJSD.cjs +23865 -0
  8. package/dist/ElementFactory-B7UOaJSD.cjs.map +1 -0
  9. package/dist/ElementFactory-uJTXU-nP.js +29615 -0
  10. package/dist/ElementFactory-uJTXU-nP.js.map +1 -0
  11. package/dist/HybridHistoryManager-BV6XV0nD.js +8048 -0
  12. package/dist/HybridHistoryManager-BV6XV0nD.js.map +1 -0
  13. package/dist/HybridHistoryManager-BXD93pp8.cjs +8 -0
  14. package/dist/HybridHistoryManager-BXD93pp8.cjs.map +1 -0
  15. package/dist/ImportManager-BYwuK6n4.cjs +2 -0
  16. package/dist/ImportManager-BYwuK6n4.cjs.map +1 -0
  17. package/dist/ImportManager-CxiaRg1N.js +222 -0
  18. package/dist/ImportManager-CxiaRg1N.js.map +1 -0
  19. package/dist/ThemeContext-4mJ_y0Me.cjs +2 -0
  20. package/dist/ThemeContext-4mJ_y0Me.cjs.map +1 -0
  21. package/dist/ThemeContext-H0Z-MqqR.js +1077 -0
  22. package/dist/ThemeContext-H0Z-MqqR.js.map +1 -0
  23. package/dist/advanced.d.ts +2 -0
  24. package/dist/advanced.js +48 -0
  25. package/dist/advanced.js.map +1 -0
  26. package/dist/advanced.mjs +15679 -0
  27. package/dist/advanced.mjs.map +1 -0
  28. package/dist/api/advanced.d.ts +110 -0
  29. package/dist/api/internals.d.ts +39 -0
  30. package/dist/api/stable.d.ts +44 -0
  31. package/dist/api/testing.d.ts +25 -0
  32. package/dist/browser-module-D0gHY9rY.cjs +9 -0
  33. package/dist/browser-module-D0gHY9rY.cjs.map +1 -0
  34. package/dist/browser-module-DFvKXBUE.js +15474 -0
  35. package/dist/browser-module-DFvKXBUE.js.map +1 -0
  36. package/dist/components/ArtboardDistressPanel.d.ts +7 -0
  37. package/dist/components/ArtboardImageMaskPanel.d.ts +7 -0
  38. package/dist/components/ArtboardPropertiesToolbar.d.ts +19 -0
  39. package/dist/components/ArtboardToolbar.d.ts +10 -0
  40. package/dist/components/BackButton.d.ts +7 -0
  41. package/dist/components/BackgroundPickerDropdown.d.ts +11 -0
  42. package/dist/components/BackgroundSwitcher.d.ts +7 -0
  43. package/dist/components/CanvasA11yFallback.d.ts +62 -0
  44. package/dist/components/CanvasEditor/CanvasRendererComponent.d.ts +51 -0
  45. package/dist/components/CanvasEditor/handlers/cropModeHandlers.d.ts +114 -0
  46. package/dist/components/CanvasEditor/handlers/groupChildHandlers.d.ts +65 -0
  47. package/dist/components/CanvasEditor/handlers/index.d.ts +10 -0
  48. package/dist/components/CanvasEditor/handlers/multiSelectionHandlers.d.ts +86 -0
  49. package/dist/components/CanvasEditor/hooks/buildSpreadClipShape.d.ts +20 -0
  50. package/dist/components/CanvasEditor/hooks/index.d.ts +24 -0
  51. package/dist/components/CanvasEditor/hooks/useActiveChild.d.ts +23 -0
  52. package/dist/components/CanvasEditor/hooks/useAnimatedFocusRect.d.ts +17 -0
  53. package/dist/components/CanvasEditor/hooks/useCanvasInteraction.d.ts +284 -0
  54. package/dist/components/CanvasEditor/hooks/useCanvasLayout.d.ts +50 -0
  55. package/dist/components/CanvasEditor/hooks/useCanvasRenderLoop.d.ts +140 -0
  56. package/dist/components/CanvasEditor/hooks/useCropMode.d.ts +4 -0
  57. package/dist/components/CanvasEditor/hooks/useHoverState.d.ts +9 -0
  58. package/dist/components/CanvasEditor/hooks/useInteractionState.d.ts +23 -0
  59. package/dist/components/CanvasEditor/hooks/useKeyboardHandlers.d.ts +16 -0
  60. package/dist/components/CanvasEditor/hooks/useMarqueeSelection.d.ts +22 -0
  61. package/dist/components/CanvasEditor/hooks/useMultiSelection.d.ts +5 -0
  62. package/dist/components/CanvasEditor/hooks/usePenTool.d.ts +10 -0
  63. package/dist/components/CanvasEditor/hooks/useRenderState.d.ts +31 -0
  64. package/dist/components/CanvasEditor/hooks/useSnapAndSpacing.d.ts +42 -0
  65. package/dist/components/CanvasEditor/hooks/useTextEditing.d.ts +56 -0
  66. package/dist/components/CanvasEditor/hooks/useTextEditingHandlers.d.ts +75 -0
  67. package/dist/components/CanvasEditor/renderers/hoverRenderer.d.ts +12 -0
  68. package/dist/components/CanvasEditor/renderers/index.d.ts +10 -0
  69. package/dist/components/CanvasEditor/renderers/marqueeRenderer.d.ts +21 -0
  70. package/dist/components/CanvasEditor/renderers/multiSelectionRenderer.d.ts +52 -0
  71. package/dist/components/CanvasEditor/renderers/renderingConstants.d.ts +59 -0
  72. package/dist/components/CanvasEditor/types/index.d.ts +11 -0
  73. package/dist/components/CanvasEditor.d.ts +102 -0
  74. package/dist/components/ColorPickerDropdown.d.ts +29 -0
  75. package/dist/components/CompositingPanel.d.ts +8 -0
  76. package/dist/components/ContextualToolbars.d.ts +150 -0
  77. package/dist/components/CropPanel.d.ts +20 -0
  78. package/dist/components/DistressPanel.d.ts +7 -0
  79. package/dist/components/DocsPage.d.ts +6 -0
  80. package/dist/components/Drawer.d.ts +39 -0
  81. package/dist/components/EffectsPanel.d.ts +14 -0
  82. package/dist/components/ExportTestPanel.d.ts +16 -0
  83. package/dist/components/FontBrowserDrawer.d.ts +20 -0
  84. package/dist/components/FontSizeDropdown.d.ts +12 -0
  85. package/dist/components/GlyphBrowserDrawer.d.ts +13 -0
  86. package/dist/components/GlyphPicker.d.ts +14 -0
  87. package/dist/components/IconMatchTest.d.ts +3 -0
  88. package/dist/components/IconSizeTest.d.ts +3 -0
  89. package/dist/components/ImageBrowserDrawer.d.ts +27 -0
  90. package/dist/components/ImageToolbar.d.ts +47 -0
  91. package/dist/components/LayerEffects.d.ts +11 -0
  92. package/dist/components/LayerLeadingChip.d.ts +9 -0
  93. package/dist/components/LayersPanel.d.ts +30 -0
  94. package/dist/components/MaskItem.d.ts +12 -0
  95. package/dist/components/MasksPanel.d.ts +7 -0
  96. package/dist/components/MonotypeDemoPage.d.ts +2 -0
  97. package/dist/components/MoreMenu.d.ts +15 -0
  98. package/dist/components/OpenTypeFeaturesPanel.d.ts +12 -0
  99. package/dist/components/PathToolbar.d.ts +10 -0
  100. package/dist/components/PenToolDemo.d.ts +3 -0
  101. package/dist/components/ProgressiveBlur.d.ts +25 -0
  102. package/dist/components/RotationHandle.d.ts +47 -0
  103. package/dist/components/SaveLoadMenu.d.ts +15 -0
  104. package/dist/components/ShapeToolbar.d.ts +71 -0
  105. package/dist/components/ShapeTypeDrawer.d.ts +10 -0
  106. package/dist/components/StrokePanel.d.ts +7 -0
  107. package/dist/components/TailwindDemo.d.ts +3 -0
  108. package/dist/components/TextEffectsDropdown.d.ts +14 -0
  109. package/dist/components/TextToolbar.d.ts +47 -0
  110. package/dist/components/TextTypeDrawer.d.ts +8 -0
  111. package/dist/components/ThemeToggle.d.ts +2 -0
  112. package/dist/components/TransformControlPanel.d.ts +12 -0
  113. package/dist/components/VisualGuideOverlay.d.ts +156 -0
  114. package/dist/components/embed/ArtboardTabs.d.ts +74 -0
  115. package/dist/components/embed/Canvas.d.ts +72 -0
  116. package/dist/components/embed/EffectsPanel.d.ts +76 -0
  117. package/dist/components/embed/ErrorBoundary.d.ts +34 -0
  118. package/dist/components/embed/ExportPanel.d.ts +51 -0
  119. package/dist/components/embed/GlyphPanel.d.ts +70 -0
  120. package/dist/components/embed/ImagePanel.d.ts +58 -0
  121. package/dist/components/embed/LayersPanel.d.ts +13 -0
  122. package/dist/components/embed/LoadingStates.d.ts +32 -0
  123. package/dist/components/embed/MenuButton.d.ts +47 -0
  124. package/dist/components/embed/SnowconeCanvas.d.ts +844 -0
  125. package/dist/components/embed/ZoomControls.d.ts +16 -0
  126. package/dist/components/embed/index.d.ts +129 -0
  127. package/dist/components/embed/primitives/index.d.ts +42 -0
  128. package/dist/components/embed/ui/index.d.ts +52 -0
  129. package/dist/components/embed/utils/index.d.ts +31 -0
  130. package/dist/components/embedded/ArtboardEmbed.d.ts +70 -0
  131. package/dist/components/embedded/MerchifyThemeWrapper.d.ts +30 -0
  132. package/dist/components/embedded/ProductPreviewCard.d.ts +8 -0
  133. package/dist/components/embedded/index.d.ts +7 -0
  134. package/dist/components/primitives/ButtonGroup.d.ts +27 -0
  135. package/dist/components/primitives/ControlGroup.d.ts +15 -0
  136. package/dist/components/primitives/Dropdown.d.ts +27 -0
  137. package/dist/components/primitives/DropdownMenu.d.ts +9 -0
  138. package/dist/components/primitives/MenuItem.d.ts +13 -0
  139. package/dist/components/primitives/Panel.d.ts +25 -0
  140. package/dist/components/primitives/SecondaryToolbar.d.ts +9 -0
  141. package/dist/components/primitives/Switch.d.ts +10 -0
  142. package/dist/components/primitives/Toggle.d.ts +17 -0
  143. package/dist/components/primitives/index.d.ts +22 -0
  144. package/dist/components/stories/utils/MockEditorProvider.d.ts +32 -0
  145. package/dist/components/stories/utils/QACanvasCard.d.ts +41 -0
  146. package/dist/components/stories/utils/VisualQACard.d.ts +24 -0
  147. package/dist/components/stories/utils/element-factories.d.ts +188 -0
  148. package/dist/components/stories/utils/spec-to-elements.d.ts +74 -0
  149. package/dist/components/stories/utils/themeDecorator.d.ts +45 -0
  150. package/dist/components/stories/utils/unified-test-cases.d.ts +27 -0
  151. package/dist/components/text-toolbar/BoldButton.d.ts +5 -0
  152. package/dist/components/text-toolbar/FontColorButton.d.ts +6 -0
  153. package/dist/components/text-toolbar/FontSizeGroup.d.ts +5 -0
  154. package/dist/components/text-toolbar/ItalicButton.d.ts +5 -0
  155. package/dist/components/text-toolbar/TextAlignButton.d.ts +5 -0
  156. package/dist/components/text-toolbar/TextMoreMenu.d.ts +7 -0
  157. package/dist/components/text-toolbar/UnderlineButton.d.ts +5 -0
  158. package/dist/components/text-toolbar/UppercaseButton.d.ts +5 -0
  159. package/dist/components/text-toolbar/index.d.ts +25 -0
  160. package/dist/components/toolbars/EmbeddedToolbarLayout.d.ts +49 -0
  161. package/dist/components/toolbars/ExpandedPanelIcon.d.ts +13 -0
  162. package/dist/components/toolbars/FloatingPanels.d.ts +23 -0
  163. package/dist/components/toolbars/GroupElementToolbar.d.ts +35 -0
  164. package/dist/components/toolbars/SecondaryPanels.d.ts +125 -0
  165. package/dist/components/toolbars/index.d.ts +18 -0
  166. package/dist/components/toolbars/shared/ColorPanelWrapper.d.ts +9 -0
  167. package/dist/components/toolbars/shared/SecondaryPanelWrapper.d.ts +9 -0
  168. package/dist/components/ui/PresetCarousel.d.ts +21 -0
  169. package/dist/components/ui/SecondaryPanel.d.ts +28 -0
  170. package/dist/components/ui/SliderRow.d.ts +30 -0
  171. package/dist/components/ui/collapsed-toolbar-header.d.ts +14 -0
  172. package/dist/components/ui/custom-icons.d.ts +25 -0
  173. package/dist/components/ui/icons.d.ts +100 -0
  174. package/dist/components/ui/index.d.ts +48 -0
  175. package/dist/components/ui/normalized-icon.d.ts +63 -0
  176. package/dist/components/ui/toolbar-button.d.ts +24 -0
  177. package/dist/compose-Bo108juW.cjs +33 -0
  178. package/dist/compose-Bo108juW.cjs.map +1 -0
  179. package/dist/compose-DQ1FZS3O.js +7690 -0
  180. package/dist/compose-DQ1FZS3O.js.map +1 -0
  181. package/dist/constants.d.ts +121 -0
  182. package/dist/contexts/CommandContext.d.ts +87 -0
  183. package/dist/contexts/EditorContext.d.ts +190 -0
  184. package/dist/contexts/ElementsContext.d.ts +104 -0
  185. package/dist/contexts/HistoryContext.d.ts +60 -0
  186. package/dist/contexts/KitContext.d.ts +50 -0
  187. package/dist/contexts/SelectionContext.d.ts +51 -0
  188. package/dist/contexts/ThemeContext.d.ts +55 -0
  189. package/dist/contexts/ToolStateContext.d.ts +60 -0
  190. package/dist/contexts/ViewportContext.d.ts +87 -0
  191. package/dist/core/AlignmentSnapSystem.d.ts +270 -0
  192. package/dist/core/ArtboardElement.d.ts +106 -0
  193. package/dist/core/ArtboardManager.d.ts +130 -0
  194. package/dist/core/ArtboardRenderer.d.ts +97 -0
  195. package/dist/core/BaseElement.d.ts +94 -0
  196. package/dist/core/CanvasRenderer.d.ts +237 -0
  197. package/dist/core/CommandHistory.d.ts +173 -0
  198. package/dist/core/CoordinateTransform.d.ts +69 -0
  199. package/dist/core/CropModeController.d.ts +90 -0
  200. package/dist/core/EditModeRenderer.d.ts +51 -0
  201. package/dist/core/ElementFactory.d.ts +73 -0
  202. package/dist/core/ElementStore.d.ts +69 -0
  203. package/dist/core/EventBus.d.ts +163 -0
  204. package/dist/core/GeometryUtils.d.ts +247 -0
  205. package/dist/core/GroupElement.d.ts +134 -0
  206. package/dist/core/HoverRenderer.d.ts +103 -0
  207. package/dist/core/HybridHistoryManager.d.ts +137 -0
  208. package/dist/core/ImageCache.d.ts +63 -0
  209. package/dist/core/ImageElement.d.ts +226 -0
  210. package/dist/core/ImageLoadEvents.d.ts +23 -0
  211. package/dist/core/InteractionFeedbackRenderer.d.ts +15 -0
  212. package/dist/core/InteractionStateMachine.d.ts +199 -0
  213. package/dist/core/PathElement.d.ts +84 -0
  214. package/dist/core/PenToolManager.d.ts +112 -0
  215. package/dist/core/PinchHandler.d.ts +32 -0
  216. package/dist/core/ResizeHandler.d.ts +51 -0
  217. package/dist/core/ResizePipeline.d.ts +83 -0
  218. package/dist/core/ResizeUtils.d.ts +17 -0
  219. package/dist/core/RotationAnchorResolver.d.ts +60 -0
  220. package/dist/core/RotationUtils.d.ts +28 -0
  221. package/dist/core/SelectionRenderer.d.ts +24 -0
  222. package/dist/core/ShapeElement.d.ts +121 -0
  223. package/dist/core/SpacingSystem.d.ts +73 -0
  224. package/dist/core/SpatialGrid.d.ts +53 -0
  225. package/dist/core/TextElement.d.ts +80 -0
  226. package/dist/core/TextMetrics.d.ts +117 -0
  227. package/dist/core/Transform.d.ts +158 -0
  228. package/dist/core/TransformConverter.d.ts +16 -0
  229. package/dist/core/TransformHandles.d.ts +55 -0
  230. package/dist/core/artboardReducer.d.ts +46 -0
  231. package/dist/effects/DistressGenerator.d.ts +26 -0
  232. package/dist/effects/DistressTextureCache.d.ts +49 -0
  233. package/dist/effects/distress-presets.d.ts +86 -0
  234. package/dist/effects/distress-textures.d.ts +34 -0
  235. package/dist/effects/distress-utils.d.ts +39 -0
  236. package/dist/effects/mask-presets.d.ts +36 -0
  237. package/dist/fonts/google-fonts.d.ts +48 -0
  238. package/dist/google-fonts.json +1 -0
  239. package/dist/hooks/index.d.ts +42 -0
  240. package/dist/hooks/useArtboards.d.ts +71 -0
  241. package/dist/hooks/useAutoExport.d.ts +66 -0
  242. package/dist/hooks/useBreakpoint.d.ts +53 -0
  243. package/dist/hooks/useCanvasEvents.d.ts +8 -0
  244. package/dist/hooks/useCanvasReady.d.ts +22 -0
  245. package/dist/hooks/useClickOutside.d.ts +3 -0
  246. package/dist/hooks/useCommandHistory.d.ts +39 -0
  247. package/dist/hooks/useCommands.d.ts +47 -0
  248. package/dist/hooks/useContentReady.d.ts +18 -0
  249. package/dist/hooks/useElementById.d.ts +20 -0
  250. package/dist/hooks/useElementByName.d.ts +10 -0
  251. package/dist/hooks/useElementProperties.d.ts +29 -0
  252. package/dist/hooks/useExport.d.ts +89 -0
  253. package/dist/hooks/useImageBinding.d.ts +34 -0
  254. package/dist/hooks/useKeyboardShortcuts.d.ts +13 -0
  255. package/dist/hooks/useLayerDndKit.d.ts +24 -0
  256. package/dist/hooks/useLayerDragDrop.d.ts +58 -0
  257. package/dist/hooks/useLayerPreview.d.ts +31 -0
  258. package/dist/hooks/useLayerSelection.d.ts +76 -0
  259. package/dist/hooks/useLayers.d.ts +91 -0
  260. package/dist/hooks/usePerformance.d.ts +48 -0
  261. package/dist/hooks/useProjectLoader.d.ts +64 -0
  262. package/dist/hooks/useSelectedElement.d.ts +17 -0
  263. package/dist/hooks/useTextBinding.d.ts +26 -0
  264. package/dist/hooks/useTextToolbar.d.ts +61 -0
  265. package/dist/hooks/useViewport.d.ts +46 -0
  266. package/dist/icons/icon-data.d.ts +2 -0
  267. package/dist/icons/registry.d.ts +28 -0
  268. package/dist/index.d.ts +6 -0
  269. package/dist/index.js +2 -0
  270. package/dist/index.js.map +1 -0
  271. package/dist/index.mjs +1138 -0
  272. package/dist/index.mjs.map +1 -0
  273. package/dist/internals.d.ts +2 -0
  274. package/dist/internals.js +2 -0
  275. package/dist/internals.js.map +1 -0
  276. package/dist/internals.mjs +219 -0
  277. package/dist/internals.mjs.map +1 -0
  278. package/dist/kits/compose.d.ts +69 -0
  279. package/dist/kits/index.d.ts +21 -0
  280. package/dist/kits/presets.d.ts +40 -0
  281. package/dist/kits/registry.d.ts +33 -0
  282. package/dist/kits/sections.d.ts +119 -0
  283. package/dist/kits/serialization.d.ts +78 -0
  284. package/dist/kits/types.d.ts +129 -0
  285. package/dist/kits/validation.d.ts +36 -0
  286. package/dist/lib/utils.d.ts +2 -0
  287. package/dist/plugins/ElementTypePlugin.d.ts +90 -0
  288. package/dist/presets/artboard-color-presets.d.ts +22 -0
  289. package/dist/presets/tshirt-presets.d.ts +60 -0
  290. package/dist/rendering/CompositingRenderer.d.ts +33 -0
  291. package/dist/rendering/DistressTextureRenderer.d.ts +39 -0
  292. package/dist/rendering/ElementRenderUtils.d.ts +17 -0
  293. package/dist/rendering/MaskRenderer.d.ts +41 -0
  294. package/dist/rendering/PieceGuideRenderer.d.ts +177 -0
  295. package/dist/rendering/StrokeRenderer.d.ts +24 -0
  296. package/dist/rendering/canvas-renderer.d.ts +18 -0
  297. package/dist/rendering/element-serializer.d.ts +143 -0
  298. package/dist/rendering/image-renderer.d.ts +6 -0
  299. package/dist/rendering/knockout-utils.d.ts +48 -0
  300. package/dist/rendering/mask-utils.d.ts +65 -0
  301. package/dist/rendering/renderer-types.d.ts +79 -0
  302. package/dist/rendering/rich-text-renderer.d.ts +43 -0
  303. package/dist/rendering/serialize-for-server.d.ts +45 -0
  304. package/dist/rendering/shape-renderer.d.ts +6 -0
  305. package/dist/rendering/stroke-utils.d.ts +18 -0
  306. package/dist/rendering/text-renderer.d.ts +71 -0
  307. package/dist/rendering/transform-renderer.d.ts +33 -0
  308. package/dist/services/AutoExportManager.d.ts +107 -0
  309. package/dist/services/falApi.d.ts +63 -0
  310. package/dist/services/nounProjectApi.d.ts +90 -0
  311. package/dist/services/recraftApi.d.ts +65 -0
  312. package/dist/services/runwareApi.d.ts +69 -0
  313. package/dist/state/CanvasStateV1.d.ts +373 -0
  314. package/dist/state/index.d.ts +10 -0
  315. package/dist/style.css +1 -0
  316. package/dist/taco-reference-cropped.jpg +0 -0
  317. package/dist/testing/MockEditorProvider.d.ts +49 -0
  318. package/dist/testing/index.d.ts +25 -0
  319. package/dist/testing/utils.d.ts +128 -0
  320. package/dist/testing.d.ts +2 -0
  321. package/dist/testing.js +2 -0
  322. package/dist/testing.js.map +1 -0
  323. package/dist/testing.mjs +140 -0
  324. package/dist/testing.mjs.map +1 -0
  325. package/dist/textures/glass-frame.svg +32 -0
  326. package/dist/theme.d.ts +99 -0
  327. package/dist/themes/index.d.ts +23 -0
  328. package/dist/transforms/ArchTransform.d.ts +14 -0
  329. package/dist/transforms/AscendTransform.d.ts +14 -0
  330. package/dist/transforms/CircleTransform.d.ts +51 -0
  331. package/dist/transforms/CustomTransform.d.ts +81 -0
  332. package/dist/transforms/FlagTransform.d.ts +14 -0
  333. package/dist/transforms/LeanTransform.d.ts +14 -0
  334. package/dist/transforms/WaveTransform.d.ts +16 -0
  335. package/dist/transforms/defaults.d.ts +33 -0
  336. package/dist/transforms/index.d.ts +10 -0
  337. package/dist/transforms/registry.d.ts +51 -0
  338. package/dist/types/capabilities.d.ts +50 -0
  339. package/dist/types/guards.d.ts +31 -0
  340. package/dist/types/index.d.ts +765 -0
  341. package/dist/types/public.d.ts +31 -0
  342. package/dist/types/react.d.ts +132 -0
  343. package/dist/utils/ArtworkPlacement.d.ts +97 -0
  344. package/dist/utils/ElementPreviewRenderer.d.ts +19 -0
  345. package/dist/utils/ExportManager.d.ts +208 -0
  346. package/dist/utils/FontAnalyzer.d.ts +137 -0
  347. package/dist/utils/GlyphRenderer.d.ts +55 -0
  348. package/dist/utils/GoogleFontsService.d.ts +37 -0
  349. package/dist/utils/ImageLoader.d.ts +124 -0
  350. package/dist/utils/ImportManager.d.ts +72 -0
  351. package/dist/utils/MonotypeCategoryMapping.d.ts +36 -0
  352. package/dist/utils/MonotypeService.d.ts +148 -0
  353. package/dist/utils/PerformanceMonitor.d.ts +54 -0
  354. package/dist/utils/TextureManager.d.ts +60 -0
  355. package/dist/utils/UnifiedFontService.d.ts +117 -0
  356. package/dist/utils/WorkerExportManager.d.ts +185 -0
  357. package/dist/utils/clickProtection.d.ts +39 -0
  358. package/dist/utils/cn.d.ts +4 -0
  359. package/dist/utils/colorConversion.d.ts +101 -0
  360. package/dist/utils/documentColors.d.ts +108 -0
  361. package/dist/utils/featureApplied.d.ts +14 -0
  362. package/dist/utils/google-fonts-loader.d.ts +67 -0
  363. package/dist/utils/logger.d.ts +66 -0
  364. package/dist/utils/selectionPreservation.d.ts +42 -0
  365. package/dist/utils/textCursorUtils.d.ts +39 -0
  366. package/dist/utils/textUtils.d.ts +11 -0
  367. package/dist/workers/export-protocol.d.ts +119 -0
  368. package/dist/workers/export-worker.bundle.string.d.ts +2 -0
  369. package/dist/workers/export-worker.d.ts +5 -0
  370. package/package.json +201 -0
@@ -0,0 +1,284 @@
1
+ import { default as React } from 'react';
2
+ import { TextElement } from '../../../core/TextElement.js';
3
+ import { ImageElement } from '../../../core/ImageElement.js';
4
+ import { GroupElement } from '../../../core/GroupElement.js';
5
+ import { ShapeElement } from '../../../core/ShapeElement.js';
6
+ import { PathElement } from '../../../core/PathElement.js';
7
+ import { BaseElement } from '../../../core/BaseElement.js';
8
+ import { TransformHandles } from '../../../core/TransformHandles.js';
9
+ import { InteractionStateMachine } from '../../../core/InteractionStateMachine.js';
10
+ import { AlignmentSnapSystem } from '../../../core/AlignmentSnapSystem.js';
11
+ import { SpacingSystem } from '../../../core/SpacingSystem.js';
12
+ import { SnapGuide, SpacingIndicator, RichText, CharacterStyle, ImageTransformData } from '../../../types/index.js';
13
+ import { LocalHoverState } from '../types/index.js';
14
+ import { MultiSelectionOBB, MultiSelectionGroupBounds } from '../renderers/index.js';
15
+ type CanvasElement = TextElement | ImageElement | GroupElement | ShapeElement | PathElement;
16
+ type ChildElement = TextElement | ImageElement | ShapeElement | PathElement | GroupElement;
17
+ /** Context attached when the user clicks a group child (pending selection on pointerUp) */
18
+ type PendingChildSelection = ChildElement;
19
+ /** Context for pending text edit mode entry (set on pointerDown, consumed on pointerUp) */
20
+ interface PendingTextEditMode {
21
+ elementId: string;
22
+ originalX: number;
23
+ originalY: number;
24
+ clickX: number;
25
+ clickY: number;
26
+ }
27
+ /** Per-element start data stored in multi-selection drag/resize/rotation contexts */
28
+ interface MultiElementStartData {
29
+ element: CanvasElement;
30
+ startData: {
31
+ x: number;
32
+ y: number;
33
+ width: number;
34
+ height: number;
35
+ rotation: number;
36
+ transformData: ImageTransformData | Record<string, unknown>;
37
+ [key: string]: unknown;
38
+ };
39
+ }
40
+ /**
41
+ * Gate element hit-tests by clipped-zone overlap.
42
+ *
43
+ * If an element has at least `HIT_FILTER_MIN_VISIBLE_AREA` square
44
+ * world-pixels INSIDE the clipped rect, we treat it as "primarily
45
+ * visible inside" — taps outside the rect won't select it, so a
46
+ * user can't grab an element from the dim overflow next to it.
47
+ * Below that threshold the overlap is too small to count as
48
+ * "visibly present in the clipped area" and we let tap-anywhere
49
+ * behaviour stand (covers neighbour-piece elements that just
50
+ * graze the clipped area).
51
+ *
52
+ * Absolute area instead of a percentage handles the case where the
53
+ * element is huge but the clipped area is small — the percentage
54
+ * rule was missing those because the element's total area dwarfed
55
+ * the overlap.
56
+ *
57
+ * No-op when `focusedPieceRect` is null (no clipped area defined).
58
+ *
59
+ * @internal — exposed for tests; not part of the public canvas API.
60
+ */
61
+ export declare function isHitAllowedInFocus(element: BaseElement, pointX: number, pointY: number, focusedPieceRect: {
62
+ x: number;
63
+ y: number;
64
+ width: number;
65
+ height: number;
66
+ } | null | undefined): boolean;
67
+ /** Multi-selection drag context */
68
+ interface MultiSelectionDragContext {
69
+ startX: number;
70
+ startY: number;
71
+ elementsStartData: MultiElementStartData[];
72
+ currentElements?: Map<string, CanvasElement>;
73
+ currentDelta?: {
74
+ dx: number;
75
+ dy: number;
76
+ };
77
+ startOBB?: MultiSelectionOBB;
78
+ }
79
+ /** Multi-selection resize context */
80
+ interface MultiSelectionResizeContext {
81
+ startBounds: {
82
+ minX: number;
83
+ maxX: number;
84
+ minY: number;
85
+ maxY: number;
86
+ };
87
+ anchor: string;
88
+ elementsStartData: MultiElementStartData[];
89
+ }
90
+ /** Multi-selection rotation context */
91
+ interface MultiSelectionRotationContext {
92
+ startBounds: {
93
+ centerX: number;
94
+ centerY: number;
95
+ };
96
+ elementsStartData: MultiElementStartData[];
97
+ currentRotation: number;
98
+ }
99
+ /**
100
+ * Augmented InteractionStateMachine type that includes the temporary ad-hoc
101
+ * properties used during interactions. This avoids `as any` throughout the file.
102
+ */
103
+ type AugmentedStateMachine = InteractionStateMachine & {
104
+ _pendingChildSelection?: PendingChildSelection;
105
+ _pendingTextEditMode?: PendingTextEditMode;
106
+ _groupDragOriginalElement?: CanvasElement;
107
+ _multiSelectionDragContext?: MultiSelectionDragContext;
108
+ _multiSelectionResizeContext?: MultiSelectionResizeContext;
109
+ _multiSelectionRotationContext?: MultiSelectionRotationContext;
110
+ };
111
+ /** PenTool interface - only the methods needed by interaction handlers */
112
+ interface PenToolLike {
113
+ isActive(): boolean;
114
+ canClosePath(x: number, y: number, threshold: number): boolean;
115
+ startClosing(x: number, y: number): void;
116
+ startDraggingHandle(): void;
117
+ addPoint(x: number, y: number): void;
118
+ isDraggingHandle(): boolean;
119
+ updateHandle(x: number, y: number): void;
120
+ setPreviewPoint(x: number, y: number): void;
121
+ finishDraggingHandle(): void;
122
+ isClosingPath(): boolean;
123
+ editPath(element: PathElement): void;
124
+ finishPath(): void;
125
+ deleteLastPoint(): void;
126
+ }
127
+ /** CropController interface - mirrors CropModeController methods */
128
+ interface CropControllerLike {
129
+ handleCropImageDrag(image: BaseElement, context: any, x: number, y: number): {
130
+ x: number;
131
+ y: number;
132
+ cropX: number;
133
+ cropY: number;
134
+ cropWidth: number;
135
+ cropHeight: number;
136
+ };
137
+ handleCropBoxResize(image: BaseElement, anchor: string, resizeContext: any, context: any, x: number, y: number): {
138
+ x: number;
139
+ y: number;
140
+ rotation: number;
141
+ width: number;
142
+ height: number;
143
+ cropX: number;
144
+ cropY: number;
145
+ cropWidth: number;
146
+ cropHeight: number;
147
+ cursor: string;
148
+ };
149
+ }
150
+ export interface UseCanvasInteractionParams {
151
+ canvasRef: React.RefObject<HTMLCanvasElement | null>;
152
+ inputRef: React.RefObject<HTMLTextAreaElement | null>;
153
+ repositioningCursorRef: React.MutableRefObject<boolean>;
154
+ lastClickTimeRef: React.MutableRefObject<number>;
155
+ clickCountRef: React.MutableRefObject<number>;
156
+ lastProcessedClickTimeRef: React.MutableRefObject<number>;
157
+ lastMultiClickTimeRef: React.MutableRefObject<number>;
158
+ multiClickSelectionRef: React.MutableRefObject<{
159
+ start: number;
160
+ end: number;
161
+ cursor: number;
162
+ } | null>;
163
+ skipDragSelectionRef: React.MutableRefObject<boolean>;
164
+ draggingSelectionHandleRef: React.MutableRefObject<'start' | 'end' | null>;
165
+ selectionHandlePositionsRef: React.MutableRefObject<{
166
+ start: {
167
+ center: {
168
+ x: number;
169
+ y: number;
170
+ };
171
+ textEdge: {
172
+ x: number;
173
+ y: number;
174
+ };
175
+ } | null;
176
+ end: {
177
+ center: {
178
+ x: number;
179
+ y: number;
180
+ };
181
+ textEdge: {
182
+ x: number;
183
+ y: number;
184
+ };
185
+ } | null;
186
+ }>;
187
+ lastMousePosRef: React.MutableRefObject<{
188
+ x: number;
189
+ y: number;
190
+ } | null>;
191
+ dragOriginalElementsRef: React.MutableRefObject<Map<string, CanvasElement> | null>;
192
+ rotatingElementRef: React.MutableRefObject<CanvasElement | null>;
193
+ editingChildIdRef: React.MutableRefObject<string | null>;
194
+ editRichTextRef: React.MutableRefObject<RichText | null>;
195
+ editModeEnteredAtRef: React.MutableRefObject<number>;
196
+ multiSelectionGroupBoundsRef: React.MutableRefObject<MultiSelectionGroupBounds | null>;
197
+ elementsRef: React.MutableRefObject<CanvasElement[]>;
198
+ MULTI_CLICK_THRESHOLD: number;
199
+ MULTI_CLICK_DEBOUNCE: number;
200
+ CLICK_DEDUP_THRESHOLD: number;
201
+ isEditing: boolean;
202
+ editText: string;
203
+ isTouchDevice: boolean;
204
+ selectionStart: number;
205
+ selectionEnd: number;
206
+ isRotating: boolean;
207
+ isMarqueeSelecting: boolean;
208
+ isAltKeyPressed: boolean;
209
+ selectedId: string | null;
210
+ selectedElement: CanvasElement | undefined;
211
+ activeChildElement: ChildElement | null;
212
+ elements: CanvasElement[];
213
+ multiSelection: string[];
214
+ multiSelectionOBBRef: React.MutableRefObject<MultiSelectionOBB | null>;
215
+ zoom: number;
216
+ paddingOffsetX: number;
217
+ paddingOffsetY: number;
218
+ spacingIndicators: SpacingIndicator[];
219
+ /**
220
+ * ADR-0060 focused-piece rect (in artboard coords). When set,
221
+ * elements whose visible-bbox sits primarily inside this rect can
222
+ * only be hit-tested by pointer positions also inside the rect —
223
+ * a tap on the dim overflow next to a "focused" element no longer
224
+ * selects it. Lets users tap dim regions without accidentally
225
+ * grabbing elements that happen to extend into them.
226
+ */
227
+ focusedPieceRect?: {
228
+ x: number;
229
+ y: number;
230
+ width: number;
231
+ height: number;
232
+ } | null;
233
+ setCursorPosition: React.Dispatch<React.SetStateAction<number>>;
234
+ setSelectionStart: React.Dispatch<React.SetStateAction<number>>;
235
+ setSelectionEnd: React.Dispatch<React.SetStateAction<number>>;
236
+ setIsRotating: (v: boolean) => void;
237
+ setRotationStartAngle: (v: number) => void;
238
+ setCurrentRotation: (v: number) => void;
239
+ setRotatingElementVersion: React.Dispatch<React.SetStateAction<number>>;
240
+ setIsAltKeyPressed: (v: boolean) => void;
241
+ setSnapGuides: (v: SnapGuide[]) => void;
242
+ setSpacingIndicators: (v: SpacingIndicator[]) => void;
243
+ setHandlesVersion: React.Dispatch<React.SetStateAction<number>>;
244
+ setHoverState: (v: Omit<LocalHoverState, 'startTime'>) => void;
245
+ setElements: React.Dispatch<React.SetStateAction<CanvasElement[]>>;
246
+ forceUpdate: (v: object) => void;
247
+ stateMachine: AugmentedStateMachine;
248
+ transformHandles: TransformHandles;
249
+ snapSystem: AlignmentSnapSystem;
250
+ spacingSystem: SpacingSystem;
251
+ penTool: PenToolLike;
252
+ cropController: CropControllerLike;
253
+ onElementUpdate: (element: CanvasElement) => void;
254
+ executeElementUpdate: (oldElement: CanvasElement | undefined, newElement: CanvasElement) => void;
255
+ onSelectionChange: (id: string | null) => void;
256
+ onMultiSelectionChange: (ids: string[]) => void;
257
+ onRotationStateChange?: (isRotating: boolean) => void;
258
+ onCropModeEnter?: () => void;
259
+ updateActiveChild: (child: ChildElement | null) => void;
260
+ getActiveArtboardElements: () => CanvasElement[];
261
+ startMarqueeSelection: (x: number, y: number) => void;
262
+ updateMarqueeSelection: (x: number, y: number, elements: CanvasElement[]) => void;
263
+ finishMarqueeSelection: (onMultiSelectionChange: (ids: string[]) => void) => void;
264
+ enterTextEditMode: (element: TextElement, worldX: number, worldY: number) => void;
265
+ setEditPosition: (pos: {
266
+ x: number;
267
+ y: number;
268
+ width: number;
269
+ height: number;
270
+ }) => void;
271
+ setEditText: (v: string) => void;
272
+ setEditRichText: (v: RichText | null) => void;
273
+ setIsEditing: (v: boolean) => void;
274
+ setCurrentFormattingStyle: React.Dispatch<React.SetStateAction<CharacterStyle | null>>;
275
+ getWrappedTextForEditing: (element: TextElement) => string;
276
+ }
277
+ export interface CanvasInteractionResult {
278
+ handlePointerDown: (e: React.PointerEvent<HTMLCanvasElement>) => void;
279
+ handlePointerMove: (e: React.PointerEvent<HTMLCanvasElement>) => void;
280
+ handlePointerUp: (e: React.PointerEvent<HTMLCanvasElement>) => void;
281
+ handleDoubleClick: (e: React.MouseEvent<HTMLCanvasElement>) => void;
282
+ }
283
+ export declare function useCanvasInteraction(params: UseCanvasInteractionParams): CanvasInteractionResult;
284
+ export {};
@@ -0,0 +1,50 @@
1
+ import { ArtboardElement } from '../../../core/ArtboardElement.js';
2
+ import { ArtboardManager } from '../../../core/ArtboardManager.js';
3
+ export interface UseCanvasLayoutParams {
4
+ width: number | undefined;
5
+ height: number | undefined;
6
+ zoom: number;
7
+ viewPadding: number;
8
+ artboardBorderRadius: number;
9
+ fixedMargin: number | undefined;
10
+ fixedMarginX: number | undefined;
11
+ fixedMarginY: number | undefined;
12
+ artboards: ArtboardElement[];
13
+ artboardManager: ArtboardManager;
14
+ /**
15
+ * ADR-0060: when present, fit the viewport to this piece (in artboard
16
+ * / spread coordinates) plus a peek margin so neighbouring pieces
17
+ * stay visible at the edges. When `null` / `undefined`, the viewport
18
+ * fits the active artboard (historical behaviour).
19
+ */
20
+ focusedPieceRect?: {
21
+ x: number;
22
+ y: number;
23
+ width: number;
24
+ height: number;
25
+ } | null;
26
+ }
27
+ export interface UseCanvasLayoutReturn {
28
+ /** Whether the device supports touch input */
29
+ isTouchDevice: boolean;
30
+ /** Current canvas dimensions */
31
+ canvasSize: {
32
+ width: number;
33
+ height: number;
34
+ };
35
+ /** Ref tracking the last touch/pointer target for iOS Safari blur handling */
36
+ lastTouchTargetRef: React.RefObject<HTMLElement | null>;
37
+ /** View padding clamped to [0.1, 1.0] */
38
+ effectiveViewPadding: number;
39
+ /** Canvas width including padding/margins, in world space */
40
+ paddedCanvasWidth: number;
41
+ /** Canvas height including padding/margins, in world space */
42
+ paddedCanvasHeight: number;
43
+ /** Horizontal padding offset in world space */
44
+ paddingOffsetX: number;
45
+ /** Vertical padding offset in world space */
46
+ paddingOffsetY: number;
47
+ /** Border radius adjusted for current zoom level */
48
+ zoomInvariantBorderRadius: number;
49
+ }
50
+ export declare function useCanvasLayout({ width, height, zoom, viewPadding, artboardBorderRadius, fixedMargin, fixedMarginX, fixedMarginY, artboards, artboardManager, focusedPieceRect, }: UseCanvasLayoutParams): UseCanvasLayoutReturn;
@@ -0,0 +1,140 @@
1
+ import { default as React } from 'react';
2
+ import { PieceGuidesConfig } from '../../embed/SnowconeCanvas.js';
3
+ import { ArtboardRenderer } from '../../../core/ArtboardRenderer.js';
4
+ import { ArtboardElement } from '../../../core/ArtboardElement.js';
5
+ import { ArtboardManager } from '../../../core/ArtboardManager.js';
6
+ import { TransformHandles } from '../../../core/TransformHandles.js';
7
+ import { InteractionStateMachine } from '../../../core/InteractionStateMachine.js';
8
+ import { TextElement } from '../../../core/TextElement.js';
9
+ import { ImageElement } from '../../../core/ImageElement.js';
10
+ import { GroupElement } from '../../../core/GroupElement.js';
11
+ import { ShapeElement } from '../../../core/ShapeElement.js';
12
+ import { PathElement } from '../../../core/PathElement.js';
13
+ import { SnapGuide, SpacingIndicator, RichText } from '../../../types/index.js';
14
+ import { LocalHoverState } from '../types/index.js';
15
+ import { MultiSelectionOBB, MultiSelectionGroupBounds } from '../renderers/index.js';
16
+ type CanvasElement = TextElement | ImageElement | GroupElement | ShapeElement | PathElement;
17
+ type ChildElement = TextElement | ImageElement | ShapeElement | PathElement | GroupElement;
18
+ /** PenTool interface - only the methods used by the render loop */
19
+ interface PenToolLike {
20
+ isActive(): boolean;
21
+ renderPreview(ctx: CanvasRenderingContext2D, element: PathElement): void;
22
+ }
23
+ export interface UseCanvasRenderLoopParams {
24
+ canvasRef: React.RefObject<HTMLCanvasElement | null>;
25
+ elements: CanvasElement[];
26
+ elementsByArtboard: Map<string | null, CanvasElement[]>;
27
+ artboards: ArtboardElement[];
28
+ artboardManager: ArtboardManager;
29
+ artboardRenderer: ArtboardRenderer;
30
+ selectedId: string | null;
31
+ selectedElement: CanvasElement | undefined;
32
+ activeChildElement: ChildElement | null;
33
+ editingChildIdRef: React.MutableRefObject<string | null>;
34
+ transformHandles: TransformHandles;
35
+ stateMachine: InteractionStateMachine;
36
+ canvasSize: {
37
+ width: number;
38
+ height: number;
39
+ };
40
+ paddedCanvasWidth: number;
41
+ paddedCanvasHeight: number;
42
+ paddingOffsetX: number;
43
+ paddingOffsetY: number;
44
+ zoom: number;
45
+ zoomInvariantBorderRadius: number;
46
+ effectiveViewPadding: number;
47
+ showRotationHandle: boolean;
48
+ isRotating: boolean;
49
+ currentRotation: number;
50
+ hoverState: LocalHoverState;
51
+ isEditing: boolean;
52
+ editText: string;
53
+ editRichText: RichText | null;
54
+ cursorPosition: number;
55
+ selectionStart: number;
56
+ selectionEnd: number;
57
+ cursorOpacityRef: React.MutableRefObject<number>;
58
+ cursorStartTimeRef: React.MutableRefObject<number>;
59
+ isTouchDevice: boolean;
60
+ selectionHandlePositionsRef: React.MutableRefObject<{
61
+ start: {
62
+ center: {
63
+ x: number;
64
+ y: number;
65
+ };
66
+ textEdge: {
67
+ x: number;
68
+ y: number;
69
+ };
70
+ } | null;
71
+ end: {
72
+ center: {
73
+ x: number;
74
+ y: number;
75
+ };
76
+ textEdge: {
77
+ x: number;
78
+ y: number;
79
+ };
80
+ } | null;
81
+ }>;
82
+ multiClickSelectionRef: React.MutableRefObject<{
83
+ start: number;
84
+ end: number;
85
+ cursor: number;
86
+ } | null>;
87
+ lastMultiClickTimeRef: React.MutableRefObject<number>;
88
+ MULTI_CLICK_DEBOUNCE: number;
89
+ snapGuides: SnapGuide[];
90
+ spacingIndicators: SpacingIndicator[];
91
+ isAltKeyPressed: boolean;
92
+ multiSelection: string[];
93
+ multiSelectionOBBRef: React.MutableRefObject<MultiSelectionOBB | null>;
94
+ multiSelectionGroupBoundsRef: React.MutableRefObject<MultiSelectionGroupBounds | null>;
95
+ isMarqueeSelecting: boolean;
96
+ marqueeStart: {
97
+ x: number;
98
+ y: number;
99
+ };
100
+ marqueeEnd: {
101
+ x: number;
102
+ y: number;
103
+ };
104
+ marqueePreviewSelection: string[];
105
+ penTool: PenToolLike;
106
+ handlesVersion: number;
107
+ hideHandles: boolean;
108
+ resolvedTheme: string;
109
+ cursorAnimationFrame: number;
110
+ renderVersion: number;
111
+ /** ADR-0054: piece-guide overlays drawn after elements, before
112
+ * selection UI. Coordinates are in artboard-local px. */
113
+ pieceGuides?: PieceGuidesConfig;
114
+ /** ADR-0060: id of the currently focused piece (or null for spread
115
+ * / single-piece). Forwarded to `renderPieceGuides` so non-focused
116
+ * pieces' guide chrome dims to keep visual focus on the active
117
+ * piece without losing the structural context of neighbours. */
118
+ focusedPieceId?: string | null;
119
+ /** ADR-0060: animated rect of the focused piece (in artboard
120
+ * coords). Drives the post-pass that dims artwork outside the
121
+ * focused piece. Decoupled from `focusedPieceId` so the parent
122
+ * can interpolate the rect during piece switches without
123
+ * changing which piece is "logically" focused. Falls back to
124
+ * the static rect of `focusedPieceId` when not provided. */
125
+ focusedPieceRect?: {
126
+ x: number;
127
+ y: number;
128
+ width: number;
129
+ height: number;
130
+ } | null;
131
+ }
132
+ /**
133
+ * Hook that manages the main canvas render loop.
134
+ *
135
+ * Uses a dirty flag + requestAnimationFrame pattern to prevent double-renders
136
+ * when multiple state updates happen in the same frame. Dependencies mark the
137
+ * render as dirty, and a single RAF loop performs the actual render only when needed.
138
+ */
139
+ export declare function useCanvasRenderLoop(params: UseCanvasRenderLoopParams): void;
140
+ export {};
@@ -0,0 +1,4 @@
1
+ import { CropModeController } from '../../../core/CropModeController.js';
2
+ export declare function useCropMode(): {
3
+ cropController: CropModeController;
4
+ };
@@ -0,0 +1,9 @@
1
+ import { LocalHoverState } from '../types/index.js';
2
+ interface UseHoverStateProps {
3
+ onHoverChange?: (elementId: string | null) => void;
4
+ }
5
+ export declare function useHoverState({ onHoverChange }: UseHoverStateProps): {
6
+ hoverState: LocalHoverState;
7
+ setHoverState: (newState: Omit<LocalHoverState, "startTime">) => void;
8
+ };
9
+ export {};
@@ -0,0 +1,23 @@
1
+ import { SnapGuide, SpacingIndicator } from '../../../types/index.js';
2
+ export interface UseInteractionStateReturn {
3
+ /** Active snap guide lines */
4
+ snapGuides: SnapGuide[];
5
+ setSnapGuides: React.Dispatch<React.SetStateAction<SnapGuide[]>>;
6
+ /** Spacing measurement indicators (shown with Alt key) */
7
+ spacingIndicators: SpacingIndicator[];
8
+ setSpacingIndicators: React.Dispatch<React.SetStateAction<SpacingIndicator[]>>;
9
+ /** Whether the Alt key is currently pressed */
10
+ isAltKeyPressed: boolean;
11
+ setIsAltKeyPressed: React.Dispatch<React.SetStateAction<boolean>>;
12
+ /** Whether the user is currently rotating an element */
13
+ isRotating: boolean;
14
+ setIsRotating: React.Dispatch<React.SetStateAction<boolean>>;
15
+ /** The angle at which rotation started */
16
+ setRotationStartAngle: React.Dispatch<React.SetStateAction<number>>;
17
+ /** Current rotation angle during a rotation gesture */
18
+ currentRotation: number;
19
+ setCurrentRotation: React.Dispatch<React.SetStateAction<number>>;
20
+ /** Version counter to trigger re-renders when rotating element updates */
21
+ setRotatingElementVersion: React.Dispatch<React.SetStateAction<number>>;
22
+ }
23
+ export declare function useInteractionState(): UseInteractionStateReturn;
@@ -0,0 +1,16 @@
1
+ import { PenToolManager } from '../../../core/PenToolManager.js';
2
+ import { TextElement } from '../../../core/TextElement.js';
3
+ import { ImageElement } from '../../../core/ImageElement.js';
4
+ import { GroupElement } from '../../../core/GroupElement.js';
5
+ interface UseKeyboardHandlersProps {
6
+ penTool: PenToolManager;
7
+ selectedElement: TextElement | ImageElement | GroupElement | null | undefined;
8
+ executeElementUpdate: (oldElement: TextElement | ImageElement | GroupElement | undefined, newElement: TextElement | ImageElement | GroupElement) => void;
9
+ setHandlesVersion: React.Dispatch<React.SetStateAction<number>>;
10
+ isEditing: boolean;
11
+ }
12
+ export declare function useKeyboardHandlers({ penTool, selectedElement, executeElementUpdate, setHandlesVersion, isEditing, }: UseKeyboardHandlersProps): {
13
+ isAltKeyPressed: boolean;
14
+ setIsAltKeyPressed: import('react').Dispatch<import('react').SetStateAction<boolean>>;
15
+ };
16
+ export {};
@@ -0,0 +1,22 @@
1
+ import { TextElement } from '../../../core/TextElement.js';
2
+ import { ImageElement } from '../../../core/ImageElement.js';
3
+ import { GroupElement } from '../../../core/GroupElement.js';
4
+ import { ShapeElement } from '../../../core/ShapeElement.js';
5
+ import { PathElement } from '../../../core/PathElement.js';
6
+ type CanvasElement = TextElement | ImageElement | GroupElement | ShapeElement | PathElement;
7
+ export declare function useMarqueeSelection(): {
8
+ isMarqueeSelecting: boolean;
9
+ marqueeStart: {
10
+ x: number;
11
+ y: number;
12
+ };
13
+ marqueeEnd: {
14
+ x: number;
15
+ y: number;
16
+ };
17
+ marqueePreviewSelection: string[];
18
+ startMarqueeSelection: (x: number, y: number) => void;
19
+ updateMarqueeSelection: (x: number, y: number, elements: CanvasElement[]) => void;
20
+ finishMarqueeSelection: (onMultiSelectionChange: (ids: string[]) => void) => void;
21
+ };
22
+ export {};
@@ -0,0 +1,5 @@
1
+ import { MultiSelectionOBB, MultiSelectionGroupBounds } from '../renderers/index.js';
2
+ export declare function useMultiSelection(multiSelection: string[]): {
3
+ multiSelectionGroupBoundsRef: import('react').RefObject<MultiSelectionGroupBounds | null>;
4
+ multiSelectionOBBRef: import('react').RefObject<MultiSelectionOBB | null>;
5
+ };
@@ -0,0 +1,10 @@
1
+ import { PenToolManager } from '../../../core/PenToolManager.js';
2
+ import { BaseElement } from '../../../core/BaseElement.js';
3
+ interface UsePenToolProps {
4
+ selectedElement: BaseElement | null | undefined;
5
+ }
6
+ export declare function usePenTool({ selectedElement }: UsePenToolProps): {
7
+ penTool: PenToolManager;
8
+ penCursor: string;
9
+ };
10
+ export {};
@@ -0,0 +1,31 @@
1
+ /**
2
+ * useRenderState - Composite hook for render versioning and triggers
3
+ *
4
+ * Groups state that controls when the canvas re-renders:
5
+ * - renderVersion: incremented when external events (image loads) require a re-render
6
+ * - handlesVersion: incremented when transform handles need recalculation
7
+ * - forceUpdate: generic trigger for component re-render
8
+ * - cursorAnimationFrame: drives text cursor blink animation
9
+ * - Image load subscription: listens for async image loads to trigger re-renders
10
+ */
11
+ export interface UseRenderStateParams {
12
+ /** Current elements array, used to check if loaded image belongs to an active element */
13
+ elements: Array<{
14
+ id: string;
15
+ }>;
16
+ }
17
+ export interface UseRenderStateReturn {
18
+ /** Version counter for render-triggering events */
19
+ renderVersion: number;
20
+ /** Force a render by incrementing the render version */
21
+ forceRender: () => void;
22
+ /** Version counter for transform handle recalculation */
23
+ handlesVersion: number;
24
+ setHandlesVersion: React.Dispatch<React.SetStateAction<number>>;
25
+ /** Generic force re-render trigger */
26
+ forceUpdate: React.Dispatch<React.SetStateAction<object>>;
27
+ /** Frame counter for cursor blink animation */
28
+ cursorAnimationFrame: number;
29
+ setCursorAnimationFrame: React.Dispatch<React.SetStateAction<number>>;
30
+ }
31
+ export declare function useRenderState({ elements }: UseRenderStateParams): UseRenderStateReturn;
@@ -0,0 +1,42 @@
1
+ import { AlignmentSnapSystem } from '../../../core/AlignmentSnapSystem.js';
2
+ import { SpacingSystem } from '../../../core/SpacingSystem.js';
3
+ import { GroupElement } from '../../../core/GroupElement.js';
4
+ import { SnapGuide, SpacingIndicator } from '../../../types/index.js';
5
+ import { TextElement } from '../../../core/TextElement.js';
6
+ import { ImageElement } from '../../../core/ImageElement.js';
7
+ import { ShapeElement } from '../../../core/ShapeElement.js';
8
+ import { PathElement } from '../../../core/PathElement.js';
9
+ import { InteractionStateMachine } from '../../../core/InteractionStateMachine.js';
10
+ /** Elements that can be on the canvas */
11
+ type CanvasElement = TextElement | ImageElement | GroupElement | ShapeElement | PathElement;
12
+ interface UseSnapAndSpacingProps {
13
+ isAltKeyPressed: boolean;
14
+ stateMachine: InteractionStateMachine;
15
+ getActiveArtboardElements: () => CanvasElement[];
16
+ /**
17
+ * ADR-0060: focused piece rect in spread mode. When set, the snap
18
+ * system also offers the piece's corners / edges / center as snap
19
+ * targets, so dragging an element to the *focused piece* feels like
20
+ * centering inside the visible area instead of the full spread.
21
+ */
22
+ focusedPieceRect?: {
23
+ x: number;
24
+ y: number;
25
+ width: number;
26
+ height: number;
27
+ } | null;
28
+ }
29
+ export declare function useSnapAndSpacing({ isAltKeyPressed, stateMachine, getActiveArtboardElements, focusedPieceRect, }: UseSnapAndSpacingProps): {
30
+ snapSystem: AlignmentSnapSystem;
31
+ spacingSystem: SpacingSystem;
32
+ snapGuides: SnapGuide[];
33
+ setSnapGuides: import('react').Dispatch<import('react').SetStateAction<SnapGuide[]>>;
34
+ spacingIndicators: SpacingIndicator[];
35
+ setSpacingIndicators: import('react').Dispatch<import('react').SetStateAction<SpacingIndicator[]>>;
36
+ lastMousePosRef: import('react').RefObject<{
37
+ x: number;
38
+ y: number;
39
+ } | null>;
40
+ clearSnapAndSpacing: () => void;
41
+ };
42
+ export {};