@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.
- package/LICENSE.txt +70 -0
- package/README.md +357 -0
- package/dist/CanvasStateV1-D5GzvmnY.cjs +65 -0
- package/dist/CanvasStateV1-D5GzvmnY.cjs.map +1 -0
- package/dist/CanvasStateV1-ejb4d_LM.js +3692 -0
- package/dist/CanvasStateV1-ejb4d_LM.js.map +1 -0
- package/dist/ElementFactory-B7UOaJSD.cjs +23865 -0
- package/dist/ElementFactory-B7UOaJSD.cjs.map +1 -0
- package/dist/ElementFactory-uJTXU-nP.js +29615 -0
- package/dist/ElementFactory-uJTXU-nP.js.map +1 -0
- package/dist/HybridHistoryManager-BV6XV0nD.js +8048 -0
- package/dist/HybridHistoryManager-BV6XV0nD.js.map +1 -0
- package/dist/HybridHistoryManager-BXD93pp8.cjs +8 -0
- package/dist/HybridHistoryManager-BXD93pp8.cjs.map +1 -0
- package/dist/ImportManager-BYwuK6n4.cjs +2 -0
- package/dist/ImportManager-BYwuK6n4.cjs.map +1 -0
- package/dist/ImportManager-CxiaRg1N.js +222 -0
- package/dist/ImportManager-CxiaRg1N.js.map +1 -0
- package/dist/ThemeContext-4mJ_y0Me.cjs +2 -0
- package/dist/ThemeContext-4mJ_y0Me.cjs.map +1 -0
- package/dist/ThemeContext-H0Z-MqqR.js +1077 -0
- package/dist/ThemeContext-H0Z-MqqR.js.map +1 -0
- package/dist/advanced.d.ts +2 -0
- package/dist/advanced.js +48 -0
- package/dist/advanced.js.map +1 -0
- package/dist/advanced.mjs +15679 -0
- package/dist/advanced.mjs.map +1 -0
- package/dist/api/advanced.d.ts +110 -0
- package/dist/api/internals.d.ts +39 -0
- package/dist/api/stable.d.ts +44 -0
- package/dist/api/testing.d.ts +25 -0
- package/dist/browser-module-D0gHY9rY.cjs +9 -0
- package/dist/browser-module-D0gHY9rY.cjs.map +1 -0
- package/dist/browser-module-DFvKXBUE.js +15474 -0
- package/dist/browser-module-DFvKXBUE.js.map +1 -0
- package/dist/components/ArtboardDistressPanel.d.ts +7 -0
- package/dist/components/ArtboardImageMaskPanel.d.ts +7 -0
- package/dist/components/ArtboardPropertiesToolbar.d.ts +19 -0
- package/dist/components/ArtboardToolbar.d.ts +10 -0
- package/dist/components/BackButton.d.ts +7 -0
- package/dist/components/BackgroundPickerDropdown.d.ts +11 -0
- package/dist/components/BackgroundSwitcher.d.ts +7 -0
- package/dist/components/CanvasA11yFallback.d.ts +62 -0
- package/dist/components/CanvasEditor/CanvasRendererComponent.d.ts +51 -0
- package/dist/components/CanvasEditor/handlers/cropModeHandlers.d.ts +114 -0
- package/dist/components/CanvasEditor/handlers/groupChildHandlers.d.ts +65 -0
- package/dist/components/CanvasEditor/handlers/index.d.ts +10 -0
- package/dist/components/CanvasEditor/handlers/multiSelectionHandlers.d.ts +86 -0
- package/dist/components/CanvasEditor/hooks/buildSpreadClipShape.d.ts +20 -0
- package/dist/components/CanvasEditor/hooks/index.d.ts +24 -0
- package/dist/components/CanvasEditor/hooks/useActiveChild.d.ts +23 -0
- package/dist/components/CanvasEditor/hooks/useAnimatedFocusRect.d.ts +17 -0
- package/dist/components/CanvasEditor/hooks/useCanvasInteraction.d.ts +284 -0
- package/dist/components/CanvasEditor/hooks/useCanvasLayout.d.ts +50 -0
- package/dist/components/CanvasEditor/hooks/useCanvasRenderLoop.d.ts +140 -0
- package/dist/components/CanvasEditor/hooks/useCropMode.d.ts +4 -0
- package/dist/components/CanvasEditor/hooks/useHoverState.d.ts +9 -0
- package/dist/components/CanvasEditor/hooks/useInteractionState.d.ts +23 -0
- package/dist/components/CanvasEditor/hooks/useKeyboardHandlers.d.ts +16 -0
- package/dist/components/CanvasEditor/hooks/useMarqueeSelection.d.ts +22 -0
- package/dist/components/CanvasEditor/hooks/useMultiSelection.d.ts +5 -0
- package/dist/components/CanvasEditor/hooks/usePenTool.d.ts +10 -0
- package/dist/components/CanvasEditor/hooks/useRenderState.d.ts +31 -0
- package/dist/components/CanvasEditor/hooks/useSnapAndSpacing.d.ts +42 -0
- package/dist/components/CanvasEditor/hooks/useTextEditing.d.ts +56 -0
- package/dist/components/CanvasEditor/hooks/useTextEditingHandlers.d.ts +75 -0
- package/dist/components/CanvasEditor/renderers/hoverRenderer.d.ts +12 -0
- package/dist/components/CanvasEditor/renderers/index.d.ts +10 -0
- package/dist/components/CanvasEditor/renderers/marqueeRenderer.d.ts +21 -0
- package/dist/components/CanvasEditor/renderers/multiSelectionRenderer.d.ts +52 -0
- package/dist/components/CanvasEditor/renderers/renderingConstants.d.ts +59 -0
- package/dist/components/CanvasEditor/types/index.d.ts +11 -0
- package/dist/components/CanvasEditor.d.ts +102 -0
- package/dist/components/ColorPickerDropdown.d.ts +29 -0
- package/dist/components/CompositingPanel.d.ts +8 -0
- package/dist/components/ContextualToolbars.d.ts +150 -0
- package/dist/components/CropPanel.d.ts +20 -0
- package/dist/components/DistressPanel.d.ts +7 -0
- package/dist/components/DocsPage.d.ts +6 -0
- package/dist/components/Drawer.d.ts +39 -0
- package/dist/components/EffectsPanel.d.ts +14 -0
- package/dist/components/ExportTestPanel.d.ts +16 -0
- package/dist/components/FontBrowserDrawer.d.ts +20 -0
- package/dist/components/FontSizeDropdown.d.ts +12 -0
- package/dist/components/GlyphBrowserDrawer.d.ts +13 -0
- package/dist/components/GlyphPicker.d.ts +14 -0
- package/dist/components/IconMatchTest.d.ts +3 -0
- package/dist/components/IconSizeTest.d.ts +3 -0
- package/dist/components/ImageBrowserDrawer.d.ts +27 -0
- package/dist/components/ImageToolbar.d.ts +47 -0
- package/dist/components/LayerEffects.d.ts +11 -0
- package/dist/components/LayerLeadingChip.d.ts +9 -0
- package/dist/components/LayersPanel.d.ts +30 -0
- package/dist/components/MaskItem.d.ts +12 -0
- package/dist/components/MasksPanel.d.ts +7 -0
- package/dist/components/MonotypeDemoPage.d.ts +2 -0
- package/dist/components/MoreMenu.d.ts +15 -0
- package/dist/components/OpenTypeFeaturesPanel.d.ts +12 -0
- package/dist/components/PathToolbar.d.ts +10 -0
- package/dist/components/PenToolDemo.d.ts +3 -0
- package/dist/components/ProgressiveBlur.d.ts +25 -0
- package/dist/components/RotationHandle.d.ts +47 -0
- package/dist/components/SaveLoadMenu.d.ts +15 -0
- package/dist/components/ShapeToolbar.d.ts +71 -0
- package/dist/components/ShapeTypeDrawer.d.ts +10 -0
- package/dist/components/StrokePanel.d.ts +7 -0
- package/dist/components/TailwindDemo.d.ts +3 -0
- package/dist/components/TextEffectsDropdown.d.ts +14 -0
- package/dist/components/TextToolbar.d.ts +47 -0
- package/dist/components/TextTypeDrawer.d.ts +8 -0
- package/dist/components/ThemeToggle.d.ts +2 -0
- package/dist/components/TransformControlPanel.d.ts +12 -0
- package/dist/components/VisualGuideOverlay.d.ts +156 -0
- package/dist/components/embed/ArtboardTabs.d.ts +74 -0
- package/dist/components/embed/Canvas.d.ts +72 -0
- package/dist/components/embed/EffectsPanel.d.ts +76 -0
- package/dist/components/embed/ErrorBoundary.d.ts +34 -0
- package/dist/components/embed/ExportPanel.d.ts +51 -0
- package/dist/components/embed/GlyphPanel.d.ts +70 -0
- package/dist/components/embed/ImagePanel.d.ts +58 -0
- package/dist/components/embed/LayersPanel.d.ts +13 -0
- package/dist/components/embed/LoadingStates.d.ts +32 -0
- package/dist/components/embed/MenuButton.d.ts +47 -0
- package/dist/components/embed/SnowconeCanvas.d.ts +844 -0
- package/dist/components/embed/ZoomControls.d.ts +16 -0
- package/dist/components/embed/index.d.ts +129 -0
- package/dist/components/embed/primitives/index.d.ts +42 -0
- package/dist/components/embed/ui/index.d.ts +52 -0
- package/dist/components/embed/utils/index.d.ts +31 -0
- package/dist/components/embedded/ArtboardEmbed.d.ts +70 -0
- package/dist/components/embedded/MerchifyThemeWrapper.d.ts +30 -0
- package/dist/components/embedded/ProductPreviewCard.d.ts +8 -0
- package/dist/components/embedded/index.d.ts +7 -0
- package/dist/components/primitives/ButtonGroup.d.ts +27 -0
- package/dist/components/primitives/ControlGroup.d.ts +15 -0
- package/dist/components/primitives/Dropdown.d.ts +27 -0
- package/dist/components/primitives/DropdownMenu.d.ts +9 -0
- package/dist/components/primitives/MenuItem.d.ts +13 -0
- package/dist/components/primitives/Panel.d.ts +25 -0
- package/dist/components/primitives/SecondaryToolbar.d.ts +9 -0
- package/dist/components/primitives/Switch.d.ts +10 -0
- package/dist/components/primitives/Toggle.d.ts +17 -0
- package/dist/components/primitives/index.d.ts +22 -0
- package/dist/components/stories/utils/MockEditorProvider.d.ts +32 -0
- package/dist/components/stories/utils/QACanvasCard.d.ts +41 -0
- package/dist/components/stories/utils/VisualQACard.d.ts +24 -0
- package/dist/components/stories/utils/element-factories.d.ts +188 -0
- package/dist/components/stories/utils/spec-to-elements.d.ts +74 -0
- package/dist/components/stories/utils/themeDecorator.d.ts +45 -0
- package/dist/components/stories/utils/unified-test-cases.d.ts +27 -0
- package/dist/components/text-toolbar/BoldButton.d.ts +5 -0
- package/dist/components/text-toolbar/FontColorButton.d.ts +6 -0
- package/dist/components/text-toolbar/FontSizeGroup.d.ts +5 -0
- package/dist/components/text-toolbar/ItalicButton.d.ts +5 -0
- package/dist/components/text-toolbar/TextAlignButton.d.ts +5 -0
- package/dist/components/text-toolbar/TextMoreMenu.d.ts +7 -0
- package/dist/components/text-toolbar/UnderlineButton.d.ts +5 -0
- package/dist/components/text-toolbar/UppercaseButton.d.ts +5 -0
- package/dist/components/text-toolbar/index.d.ts +25 -0
- package/dist/components/toolbars/EmbeddedToolbarLayout.d.ts +49 -0
- package/dist/components/toolbars/ExpandedPanelIcon.d.ts +13 -0
- package/dist/components/toolbars/FloatingPanels.d.ts +23 -0
- package/dist/components/toolbars/GroupElementToolbar.d.ts +35 -0
- package/dist/components/toolbars/SecondaryPanels.d.ts +125 -0
- package/dist/components/toolbars/index.d.ts +18 -0
- package/dist/components/toolbars/shared/ColorPanelWrapper.d.ts +9 -0
- package/dist/components/toolbars/shared/SecondaryPanelWrapper.d.ts +9 -0
- package/dist/components/ui/PresetCarousel.d.ts +21 -0
- package/dist/components/ui/SecondaryPanel.d.ts +28 -0
- package/dist/components/ui/SliderRow.d.ts +30 -0
- package/dist/components/ui/collapsed-toolbar-header.d.ts +14 -0
- package/dist/components/ui/custom-icons.d.ts +25 -0
- package/dist/components/ui/icons.d.ts +100 -0
- package/dist/components/ui/index.d.ts +48 -0
- package/dist/components/ui/normalized-icon.d.ts +63 -0
- package/dist/components/ui/toolbar-button.d.ts +24 -0
- package/dist/compose-Bo108juW.cjs +33 -0
- package/dist/compose-Bo108juW.cjs.map +1 -0
- package/dist/compose-DQ1FZS3O.js +7690 -0
- package/dist/compose-DQ1FZS3O.js.map +1 -0
- package/dist/constants.d.ts +121 -0
- package/dist/contexts/CommandContext.d.ts +87 -0
- package/dist/contexts/EditorContext.d.ts +190 -0
- package/dist/contexts/ElementsContext.d.ts +104 -0
- package/dist/contexts/HistoryContext.d.ts +60 -0
- package/dist/contexts/KitContext.d.ts +50 -0
- package/dist/contexts/SelectionContext.d.ts +51 -0
- package/dist/contexts/ThemeContext.d.ts +55 -0
- package/dist/contexts/ToolStateContext.d.ts +60 -0
- package/dist/contexts/ViewportContext.d.ts +87 -0
- package/dist/core/AlignmentSnapSystem.d.ts +270 -0
- package/dist/core/ArtboardElement.d.ts +106 -0
- package/dist/core/ArtboardManager.d.ts +130 -0
- package/dist/core/ArtboardRenderer.d.ts +97 -0
- package/dist/core/BaseElement.d.ts +94 -0
- package/dist/core/CanvasRenderer.d.ts +237 -0
- package/dist/core/CommandHistory.d.ts +173 -0
- package/dist/core/CoordinateTransform.d.ts +69 -0
- package/dist/core/CropModeController.d.ts +90 -0
- package/dist/core/EditModeRenderer.d.ts +51 -0
- package/dist/core/ElementFactory.d.ts +73 -0
- package/dist/core/ElementStore.d.ts +69 -0
- package/dist/core/EventBus.d.ts +163 -0
- package/dist/core/GeometryUtils.d.ts +247 -0
- package/dist/core/GroupElement.d.ts +134 -0
- package/dist/core/HoverRenderer.d.ts +103 -0
- package/dist/core/HybridHistoryManager.d.ts +137 -0
- package/dist/core/ImageCache.d.ts +63 -0
- package/dist/core/ImageElement.d.ts +226 -0
- package/dist/core/ImageLoadEvents.d.ts +23 -0
- package/dist/core/InteractionFeedbackRenderer.d.ts +15 -0
- package/dist/core/InteractionStateMachine.d.ts +199 -0
- package/dist/core/PathElement.d.ts +84 -0
- package/dist/core/PenToolManager.d.ts +112 -0
- package/dist/core/PinchHandler.d.ts +32 -0
- package/dist/core/ResizeHandler.d.ts +51 -0
- package/dist/core/ResizePipeline.d.ts +83 -0
- package/dist/core/ResizeUtils.d.ts +17 -0
- package/dist/core/RotationAnchorResolver.d.ts +60 -0
- package/dist/core/RotationUtils.d.ts +28 -0
- package/dist/core/SelectionRenderer.d.ts +24 -0
- package/dist/core/ShapeElement.d.ts +121 -0
- package/dist/core/SpacingSystem.d.ts +73 -0
- package/dist/core/SpatialGrid.d.ts +53 -0
- package/dist/core/TextElement.d.ts +80 -0
- package/dist/core/TextMetrics.d.ts +117 -0
- package/dist/core/Transform.d.ts +158 -0
- package/dist/core/TransformConverter.d.ts +16 -0
- package/dist/core/TransformHandles.d.ts +55 -0
- package/dist/core/artboardReducer.d.ts +46 -0
- package/dist/effects/DistressGenerator.d.ts +26 -0
- package/dist/effects/DistressTextureCache.d.ts +49 -0
- package/dist/effects/distress-presets.d.ts +86 -0
- package/dist/effects/distress-textures.d.ts +34 -0
- package/dist/effects/distress-utils.d.ts +39 -0
- package/dist/effects/mask-presets.d.ts +36 -0
- package/dist/fonts/google-fonts.d.ts +48 -0
- package/dist/google-fonts.json +1 -0
- package/dist/hooks/index.d.ts +42 -0
- package/dist/hooks/useArtboards.d.ts +71 -0
- package/dist/hooks/useAutoExport.d.ts +66 -0
- package/dist/hooks/useBreakpoint.d.ts +53 -0
- package/dist/hooks/useCanvasEvents.d.ts +8 -0
- package/dist/hooks/useCanvasReady.d.ts +22 -0
- package/dist/hooks/useClickOutside.d.ts +3 -0
- package/dist/hooks/useCommandHistory.d.ts +39 -0
- package/dist/hooks/useCommands.d.ts +47 -0
- package/dist/hooks/useContentReady.d.ts +18 -0
- package/dist/hooks/useElementById.d.ts +20 -0
- package/dist/hooks/useElementByName.d.ts +10 -0
- package/dist/hooks/useElementProperties.d.ts +29 -0
- package/dist/hooks/useExport.d.ts +89 -0
- package/dist/hooks/useImageBinding.d.ts +34 -0
- package/dist/hooks/useKeyboardShortcuts.d.ts +13 -0
- package/dist/hooks/useLayerDndKit.d.ts +24 -0
- package/dist/hooks/useLayerDragDrop.d.ts +58 -0
- package/dist/hooks/useLayerPreview.d.ts +31 -0
- package/dist/hooks/useLayerSelection.d.ts +76 -0
- package/dist/hooks/useLayers.d.ts +91 -0
- package/dist/hooks/usePerformance.d.ts +48 -0
- package/dist/hooks/useProjectLoader.d.ts +64 -0
- package/dist/hooks/useSelectedElement.d.ts +17 -0
- package/dist/hooks/useTextBinding.d.ts +26 -0
- package/dist/hooks/useTextToolbar.d.ts +61 -0
- package/dist/hooks/useViewport.d.ts +46 -0
- package/dist/icons/icon-data.d.ts +2 -0
- package/dist/icons/registry.d.ts +28 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +1138 -0
- package/dist/index.mjs.map +1 -0
- package/dist/internals.d.ts +2 -0
- package/dist/internals.js +2 -0
- package/dist/internals.js.map +1 -0
- package/dist/internals.mjs +219 -0
- package/dist/internals.mjs.map +1 -0
- package/dist/kits/compose.d.ts +69 -0
- package/dist/kits/index.d.ts +21 -0
- package/dist/kits/presets.d.ts +40 -0
- package/dist/kits/registry.d.ts +33 -0
- package/dist/kits/sections.d.ts +119 -0
- package/dist/kits/serialization.d.ts +78 -0
- package/dist/kits/types.d.ts +129 -0
- package/dist/kits/validation.d.ts +36 -0
- package/dist/lib/utils.d.ts +2 -0
- package/dist/plugins/ElementTypePlugin.d.ts +90 -0
- package/dist/presets/artboard-color-presets.d.ts +22 -0
- package/dist/presets/tshirt-presets.d.ts +60 -0
- package/dist/rendering/CompositingRenderer.d.ts +33 -0
- package/dist/rendering/DistressTextureRenderer.d.ts +39 -0
- package/dist/rendering/ElementRenderUtils.d.ts +17 -0
- package/dist/rendering/MaskRenderer.d.ts +41 -0
- package/dist/rendering/PieceGuideRenderer.d.ts +177 -0
- package/dist/rendering/StrokeRenderer.d.ts +24 -0
- package/dist/rendering/canvas-renderer.d.ts +18 -0
- package/dist/rendering/element-serializer.d.ts +143 -0
- package/dist/rendering/image-renderer.d.ts +6 -0
- package/dist/rendering/knockout-utils.d.ts +48 -0
- package/dist/rendering/mask-utils.d.ts +65 -0
- package/dist/rendering/renderer-types.d.ts +79 -0
- package/dist/rendering/rich-text-renderer.d.ts +43 -0
- package/dist/rendering/serialize-for-server.d.ts +45 -0
- package/dist/rendering/shape-renderer.d.ts +6 -0
- package/dist/rendering/stroke-utils.d.ts +18 -0
- package/dist/rendering/text-renderer.d.ts +71 -0
- package/dist/rendering/transform-renderer.d.ts +33 -0
- package/dist/services/AutoExportManager.d.ts +107 -0
- package/dist/services/falApi.d.ts +63 -0
- package/dist/services/nounProjectApi.d.ts +90 -0
- package/dist/services/recraftApi.d.ts +65 -0
- package/dist/services/runwareApi.d.ts +69 -0
- package/dist/state/CanvasStateV1.d.ts +373 -0
- package/dist/state/index.d.ts +10 -0
- package/dist/style.css +1 -0
- package/dist/taco-reference-cropped.jpg +0 -0
- package/dist/testing/MockEditorProvider.d.ts +49 -0
- package/dist/testing/index.d.ts +25 -0
- package/dist/testing/utils.d.ts +128 -0
- package/dist/testing.d.ts +2 -0
- package/dist/testing.js +2 -0
- package/dist/testing.js.map +1 -0
- package/dist/testing.mjs +140 -0
- package/dist/testing.mjs.map +1 -0
- package/dist/textures/glass-frame.svg +32 -0
- package/dist/theme.d.ts +99 -0
- package/dist/themes/index.d.ts +23 -0
- package/dist/transforms/ArchTransform.d.ts +14 -0
- package/dist/transforms/AscendTransform.d.ts +14 -0
- package/dist/transforms/CircleTransform.d.ts +51 -0
- package/dist/transforms/CustomTransform.d.ts +81 -0
- package/dist/transforms/FlagTransform.d.ts +14 -0
- package/dist/transforms/LeanTransform.d.ts +14 -0
- package/dist/transforms/WaveTransform.d.ts +16 -0
- package/dist/transforms/defaults.d.ts +33 -0
- package/dist/transforms/index.d.ts +10 -0
- package/dist/transforms/registry.d.ts +51 -0
- package/dist/types/capabilities.d.ts +50 -0
- package/dist/types/guards.d.ts +31 -0
- package/dist/types/index.d.ts +765 -0
- package/dist/types/public.d.ts +31 -0
- package/dist/types/react.d.ts +132 -0
- package/dist/utils/ArtworkPlacement.d.ts +97 -0
- package/dist/utils/ElementPreviewRenderer.d.ts +19 -0
- package/dist/utils/ExportManager.d.ts +208 -0
- package/dist/utils/FontAnalyzer.d.ts +137 -0
- package/dist/utils/GlyphRenderer.d.ts +55 -0
- package/dist/utils/GoogleFontsService.d.ts +37 -0
- package/dist/utils/ImageLoader.d.ts +124 -0
- package/dist/utils/ImportManager.d.ts +72 -0
- package/dist/utils/MonotypeCategoryMapping.d.ts +36 -0
- package/dist/utils/MonotypeService.d.ts +148 -0
- package/dist/utils/PerformanceMonitor.d.ts +54 -0
- package/dist/utils/TextureManager.d.ts +60 -0
- package/dist/utils/UnifiedFontService.d.ts +117 -0
- package/dist/utils/WorkerExportManager.d.ts +185 -0
- package/dist/utils/clickProtection.d.ts +39 -0
- package/dist/utils/cn.d.ts +4 -0
- package/dist/utils/colorConversion.d.ts +101 -0
- package/dist/utils/documentColors.d.ts +108 -0
- package/dist/utils/featureApplied.d.ts +14 -0
- package/dist/utils/google-fonts-loader.d.ts +67 -0
- package/dist/utils/logger.d.ts +66 -0
- package/dist/utils/selectionPreservation.d.ts +42 -0
- package/dist/utils/textCursorUtils.d.ts +39 -0
- package/dist/utils/textUtils.d.ts +11 -0
- package/dist/workers/export-protocol.d.ts +119 -0
- package/dist/workers/export-worker.bundle.string.d.ts +2 -0
- package/dist/workers/export-worker.d.ts +5 -0
- package/package.json +201 -0
|
@@ -0,0 +1,765 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Comprehensive TypeScript type definitions for custom-canvas
|
|
3
|
+
* Uses discriminated unions for type-safe transform handling
|
|
4
|
+
*/
|
|
5
|
+
export type TransformType = 'custom' | 'distort' | 'circle' | 'lean' | 'arch' | 'ascend' | 'wave' | 'flag' | 'image' | 'group' | 'artboard' | 'shape' | 'path';
|
|
6
|
+
export interface BoundingBox {
|
|
7
|
+
x: number;
|
|
8
|
+
y: number;
|
|
9
|
+
width: number;
|
|
10
|
+
height: number;
|
|
11
|
+
}
|
|
12
|
+
export interface Point {
|
|
13
|
+
x: number;
|
|
14
|
+
y: number;
|
|
15
|
+
}
|
|
16
|
+
export type ResizeAnchor = 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right' | 'top' | 'bottom' | 'left' | 'right' | 'middle-left' | 'middle-right' | 'middle-top' | 'middle-bottom';
|
|
17
|
+
export type TextAlign = 'left' | 'center' | 'right';
|
|
18
|
+
export interface CustomTransformData {
|
|
19
|
+
type: 'custom';
|
|
20
|
+
controlPoints: Point[];
|
|
21
|
+
/** Container width for text wrapping */
|
|
22
|
+
width: number;
|
|
23
|
+
}
|
|
24
|
+
export interface DistortTransformData {
|
|
25
|
+
type: 'distort';
|
|
26
|
+
[key: string]: unknown;
|
|
27
|
+
}
|
|
28
|
+
export interface CircleTransformData {
|
|
29
|
+
type: 'circle';
|
|
30
|
+
radius: number;
|
|
31
|
+
scale: number;
|
|
32
|
+
reverse: boolean;
|
|
33
|
+
}
|
|
34
|
+
export interface LeanTransformData {
|
|
35
|
+
type: 'lean';
|
|
36
|
+
leanAmount: number;
|
|
37
|
+
/** Container width for text layout */
|
|
38
|
+
width: number;
|
|
39
|
+
}
|
|
40
|
+
export interface ArchTransformData {
|
|
41
|
+
type: 'arch';
|
|
42
|
+
archHeight: number;
|
|
43
|
+
/** Container width for text layout */
|
|
44
|
+
width: number;
|
|
45
|
+
}
|
|
46
|
+
export interface AscendTransformData {
|
|
47
|
+
type: 'ascend';
|
|
48
|
+
ascendAngle: number;
|
|
49
|
+
/** Container width for text layout */
|
|
50
|
+
width: number;
|
|
51
|
+
}
|
|
52
|
+
export interface WaveTransformData {
|
|
53
|
+
type: 'wave';
|
|
54
|
+
amplitude: number;
|
|
55
|
+
frequency: number;
|
|
56
|
+
/** Container width for text layout */
|
|
57
|
+
width: number;
|
|
58
|
+
}
|
|
59
|
+
export interface FlagTransformData {
|
|
60
|
+
type: 'flag';
|
|
61
|
+
amplitude: number;
|
|
62
|
+
frequency: number;
|
|
63
|
+
/** Container width for text layout */
|
|
64
|
+
width: number;
|
|
65
|
+
}
|
|
66
|
+
export interface ImageTransformData {
|
|
67
|
+
type: 'image';
|
|
68
|
+
width: number;
|
|
69
|
+
height: number;
|
|
70
|
+
cropX: number;
|
|
71
|
+
cropY: number;
|
|
72
|
+
cropWidth: number;
|
|
73
|
+
cropHeight: number;
|
|
74
|
+
flipHorizontal: boolean;
|
|
75
|
+
flipVertical: boolean;
|
|
76
|
+
borderRadius: number;
|
|
77
|
+
}
|
|
78
|
+
export interface GroupTransformData {
|
|
79
|
+
type: 'group';
|
|
80
|
+
}
|
|
81
|
+
export interface ArtboardTransformData {
|
|
82
|
+
type: 'artboard';
|
|
83
|
+
}
|
|
84
|
+
export type ShapeType = 'rectangle' | 'circle' | 'ellipse' | 'triangle' | 'polygon' | 'star' | 'line';
|
|
85
|
+
export interface ShapeTransformData {
|
|
86
|
+
type: 'shape';
|
|
87
|
+
shapeType: ShapeType;
|
|
88
|
+
width: number;
|
|
89
|
+
height: number;
|
|
90
|
+
borderRadius?: number;
|
|
91
|
+
radiusX?: number;
|
|
92
|
+
radiusY?: number;
|
|
93
|
+
sides?: number;
|
|
94
|
+
points?: number;
|
|
95
|
+
innerRadius?: number;
|
|
96
|
+
fillColor?: string;
|
|
97
|
+
fillOpacity?: number;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Path point types define how curve handles behave
|
|
101
|
+
*/
|
|
102
|
+
export type PathPointType = 'corner' | 'smooth' | 'bezier';
|
|
103
|
+
/**
|
|
104
|
+
* A single point in a path with optional bezier control handles
|
|
105
|
+
* All coordinates are relative to the path element's position
|
|
106
|
+
*/
|
|
107
|
+
export interface PathPoint {
|
|
108
|
+
id: string;
|
|
109
|
+
x: number;
|
|
110
|
+
y: number;
|
|
111
|
+
type: PathPointType;
|
|
112
|
+
handleIn?: Point;
|
|
113
|
+
handleOut?: Point;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Transform data for custom path elements
|
|
117
|
+
*/
|
|
118
|
+
export interface PathTransformData {
|
|
119
|
+
type: 'path';
|
|
120
|
+
points: PathPoint[];
|
|
121
|
+
closed: boolean;
|
|
122
|
+
width: number;
|
|
123
|
+
height: number;
|
|
124
|
+
fillEnabled?: boolean;
|
|
125
|
+
fillColor?: string;
|
|
126
|
+
fillOpacity?: number;
|
|
127
|
+
strokeEnabled?: boolean;
|
|
128
|
+
strokeColor?: string;
|
|
129
|
+
strokeWidth?: number;
|
|
130
|
+
}
|
|
131
|
+
export type AnyTransformData = CustomTransformData | DistortTransformData | CircleTransformData | LeanTransformData | ArchTransformData | AscendTransformData | WaveTransformData | FlagTransformData | ImageTransformData | GroupTransformData | ArtboardTransformData | ShapeTransformData | PathTransformData;
|
|
132
|
+
export interface TransformStartData {
|
|
133
|
+
id: string;
|
|
134
|
+
x: number;
|
|
135
|
+
y: number;
|
|
136
|
+
rotation: number;
|
|
137
|
+
transformData: Record<string, any>;
|
|
138
|
+
width?: number;
|
|
139
|
+
height?: number;
|
|
140
|
+
fontSize?: number;
|
|
141
|
+
richText?: unknown;
|
|
142
|
+
lineCount?: number;
|
|
143
|
+
visualX?: number;
|
|
144
|
+
visualY?: number;
|
|
145
|
+
visualWidth?: number;
|
|
146
|
+
visualHeight?: number;
|
|
147
|
+
bboxX?: number;
|
|
148
|
+
bboxY?: number;
|
|
149
|
+
cropX?: number;
|
|
150
|
+
cropY?: number;
|
|
151
|
+
cropWidth?: number;
|
|
152
|
+
cropHeight?: number;
|
|
153
|
+
strokeWidth?: number;
|
|
154
|
+
childrenStartData?: TransformStartData[];
|
|
155
|
+
[key: string]: unknown;
|
|
156
|
+
}
|
|
157
|
+
export type BlendMode = 'normal' | 'knockout' | 'clip';
|
|
158
|
+
export type CompositingScope = 'group' | 'artboard';
|
|
159
|
+
export type KnockoutScope = CompositingScope;
|
|
160
|
+
export interface CompositingConfig {
|
|
161
|
+
fill?: boolean;
|
|
162
|
+
stroke?: boolean;
|
|
163
|
+
scope?: CompositingScope;
|
|
164
|
+
}
|
|
165
|
+
export type KnockoutConfig = CompositingConfig;
|
|
166
|
+
export interface StrokeConfig {
|
|
167
|
+
enabled: boolean;
|
|
168
|
+
color: string;
|
|
169
|
+
width: number;
|
|
170
|
+
dashArray?: number[];
|
|
171
|
+
lineCap?: 'butt' | 'round' | 'square';
|
|
172
|
+
lineJoin?: 'miter' | 'round' | 'bevel';
|
|
173
|
+
miterLimit?: number;
|
|
174
|
+
opacity?: number;
|
|
175
|
+
feather?: number;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Rendering context metadata passed to renderers
|
|
179
|
+
* Used to customize rendering behavior for specific contexts (e.g., knockout, export, preview)
|
|
180
|
+
*/
|
|
181
|
+
export interface RenderingContext {
|
|
182
|
+
/** True when rendering for knockout compositing (affects stroke color/opacity) */
|
|
183
|
+
isKnockout?: boolean;
|
|
184
|
+
/** True when rendering for export (may skip certain preview-only features) */
|
|
185
|
+
isExport?: boolean;
|
|
186
|
+
/** True when rendering for mask application */
|
|
187
|
+
isMask?: boolean;
|
|
188
|
+
/** True when the caller has already applied element positioning (translate/rotate) */
|
|
189
|
+
positionApplied?: boolean;
|
|
190
|
+
}
|
|
191
|
+
export type MaskType = 'clip' | 'alpha' | 'luma' | 'distress';
|
|
192
|
+
export interface MaskDefinition {
|
|
193
|
+
id: string;
|
|
194
|
+
type: MaskType;
|
|
195
|
+
maskElement: AnyElementConfig;
|
|
196
|
+
inverted?: boolean;
|
|
197
|
+
feather?: number;
|
|
198
|
+
opacity?: number;
|
|
199
|
+
blendMode?: string;
|
|
200
|
+
}
|
|
201
|
+
export type DistressStyle = 'worn' | 'cracked' | 'grunge' | 'retro' | 'custom';
|
|
202
|
+
export interface DistressEffect {
|
|
203
|
+
enabled: boolean;
|
|
204
|
+
style: DistressStyle;
|
|
205
|
+
intensity: number;
|
|
206
|
+
fadeAmount?: number;
|
|
207
|
+
grainAmount?: number;
|
|
208
|
+
scratchAmount?: number;
|
|
209
|
+
edgeWear?: number;
|
|
210
|
+
textureUrl?: string;
|
|
211
|
+
textureOpacity?: number;
|
|
212
|
+
textureBlendMode?: 'multiply' | 'screen' | 'overlay';
|
|
213
|
+
seed?: number;
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Per-character glyph override
|
|
217
|
+
* Allows substituting specific characters with alternate glyphs from the font
|
|
218
|
+
*/
|
|
219
|
+
export interface GlyphOverride {
|
|
220
|
+
/** Index of the character in the text string */
|
|
221
|
+
charIndex: number;
|
|
222
|
+
/** Glyph index in the font file */
|
|
223
|
+
glyphIndex: number;
|
|
224
|
+
/** Unicode codepoint of the original character */
|
|
225
|
+
unicode: string;
|
|
226
|
+
/** Human-readable name of the alternate (e.g., "Swash A", "Fancy G") */
|
|
227
|
+
alternateName?: string;
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* OpenType feature settings for advanced typography
|
|
231
|
+
* Features are applied globally to the entire text element
|
|
232
|
+
*/
|
|
233
|
+
export interface OpenTypeFeatures {
|
|
234
|
+
/** Standard ligatures (fi, fl, etc.) */
|
|
235
|
+
liga?: boolean;
|
|
236
|
+
/** Discretionary ligatures (ct, st, etc.) */
|
|
237
|
+
dlig?: boolean;
|
|
238
|
+
/** Contextual alternates */
|
|
239
|
+
calt?: boolean;
|
|
240
|
+
/** Swash alternates */
|
|
241
|
+
swsh?: boolean;
|
|
242
|
+
/** Small capitals */
|
|
243
|
+
smcp?: boolean;
|
|
244
|
+
/** All small capitals */
|
|
245
|
+
c2sc?: boolean;
|
|
246
|
+
/** Oldstyle figures (0-9) */
|
|
247
|
+
onum?: boolean;
|
|
248
|
+
/** Lining figures (0-9) */
|
|
249
|
+
lnum?: boolean;
|
|
250
|
+
/** Tabular figures */
|
|
251
|
+
tnum?: boolean;
|
|
252
|
+
/** Proportional figures */
|
|
253
|
+
pnum?: boolean;
|
|
254
|
+
/** Stylistic sets (ss01-ss20) */
|
|
255
|
+
ss01?: boolean;
|
|
256
|
+
ss02?: boolean;
|
|
257
|
+
ss03?: boolean;
|
|
258
|
+
ss04?: boolean;
|
|
259
|
+
ss05?: boolean;
|
|
260
|
+
ss06?: boolean;
|
|
261
|
+
ss07?: boolean;
|
|
262
|
+
ss08?: boolean;
|
|
263
|
+
ss09?: boolean;
|
|
264
|
+
ss10?: boolean;
|
|
265
|
+
ss11?: boolean;
|
|
266
|
+
ss12?: boolean;
|
|
267
|
+
ss13?: boolean;
|
|
268
|
+
ss14?: boolean;
|
|
269
|
+
ss15?: boolean;
|
|
270
|
+
ss16?: boolean;
|
|
271
|
+
ss17?: boolean;
|
|
272
|
+
ss18?: boolean;
|
|
273
|
+
ss19?: boolean;
|
|
274
|
+
ss20?: boolean;
|
|
275
|
+
/** Character variants (cv01-cv99) - common ones */
|
|
276
|
+
cv01?: boolean;
|
|
277
|
+
cv02?: boolean;
|
|
278
|
+
cv03?: boolean;
|
|
279
|
+
cv04?: boolean;
|
|
280
|
+
cv05?: boolean;
|
|
281
|
+
/** Glyph composition/decomposition */
|
|
282
|
+
ccmp?: boolean;
|
|
283
|
+
/** Localized forms */
|
|
284
|
+
locl?: boolean;
|
|
285
|
+
/** Kerning */
|
|
286
|
+
kern?: boolean;
|
|
287
|
+
/** Mark positioning */
|
|
288
|
+
mark?: boolean;
|
|
289
|
+
/** Mark-to-mark positioning */
|
|
290
|
+
mkmk?: boolean;
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* Metadata about available glyphs for a specific character
|
|
294
|
+
*/
|
|
295
|
+
export interface GlyphAlternate {
|
|
296
|
+
/** Glyph index in the font file */
|
|
297
|
+
glyphIndex: number;
|
|
298
|
+
/** Unicode codepoint this glyph represents */
|
|
299
|
+
unicode: string;
|
|
300
|
+
/** Human-readable name (e.g., "A.swash", "g.alt01") */
|
|
301
|
+
name: string;
|
|
302
|
+
/** Category of alternate (swash, stylistic, etc.) */
|
|
303
|
+
category?: 'default' | 'swash' | 'stylistic' | 'contextual' | 'ligature';
|
|
304
|
+
/** Preview data URL (base64-encoded image) */
|
|
305
|
+
previewDataUrl?: string;
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Character-level styling properties
|
|
309
|
+
* Each property is optional - undefined means inherit from element defaults
|
|
310
|
+
*/
|
|
311
|
+
export interface CharacterStyle {
|
|
312
|
+
/** Text color (CSS color string) */
|
|
313
|
+
color?: string;
|
|
314
|
+
/** Font family name */
|
|
315
|
+
fontFamily?: string;
|
|
316
|
+
/** Font size in pixels */
|
|
317
|
+
fontSize?: number;
|
|
318
|
+
/** Bold weight */
|
|
319
|
+
bold?: boolean;
|
|
320
|
+
/** Italic style */
|
|
321
|
+
italic?: boolean;
|
|
322
|
+
/** Underline decoration */
|
|
323
|
+
underline?: boolean;
|
|
324
|
+
/** Strikethrough decoration */
|
|
325
|
+
strikethrough?: boolean;
|
|
326
|
+
}
|
|
327
|
+
/**
|
|
328
|
+
* A span of text with uniform styling
|
|
329
|
+
* Used for efficient storage of rich text (avoids per-character arrays)
|
|
330
|
+
*/
|
|
331
|
+
export interface TextSpan {
|
|
332
|
+
/** The text content of this span */
|
|
333
|
+
text: string;
|
|
334
|
+
/** Style properties for this span (optional properties inherit from element defaults) */
|
|
335
|
+
style: CharacterStyle;
|
|
336
|
+
}
|
|
337
|
+
/**
|
|
338
|
+
* Rich text data structure with helper methods
|
|
339
|
+
* Stores text as an array of styled spans for efficient rendering
|
|
340
|
+
*/
|
|
341
|
+
export declare class RichText {
|
|
342
|
+
spans: TextSpan[];
|
|
343
|
+
constructor(spans?: TextSpan[]);
|
|
344
|
+
/**
|
|
345
|
+
* Create RichText from plain text string (no special formatting)
|
|
346
|
+
*/
|
|
347
|
+
static fromPlainText(text: string, style?: CharacterStyle): RichText;
|
|
348
|
+
/**
|
|
349
|
+
* Get the full text content (all spans concatenated)
|
|
350
|
+
*/
|
|
351
|
+
getText(): string;
|
|
352
|
+
/**
|
|
353
|
+
* Get the total character count
|
|
354
|
+
*/
|
|
355
|
+
getLength(): number;
|
|
356
|
+
/**
|
|
357
|
+
* Get the style at a specific character index
|
|
358
|
+
* @param charIndex Character index (0-based)
|
|
359
|
+
* @returns The style object for the span containing this character
|
|
360
|
+
*/
|
|
361
|
+
getStyleAt(charIndex: number): CharacterStyle;
|
|
362
|
+
/**
|
|
363
|
+
* Apply a style to a character range
|
|
364
|
+
* @param start Start index (inclusive)
|
|
365
|
+
* @param end End index (exclusive)
|
|
366
|
+
* @param style Style to apply (merged with existing styles)
|
|
367
|
+
*/
|
|
368
|
+
applyStyle(start: number, end: number, style: CharacterStyle): void;
|
|
369
|
+
/**
|
|
370
|
+
* Insert text at a specific position with a given style
|
|
371
|
+
* @param index Character index to insert at
|
|
372
|
+
* @param text Text to insert
|
|
373
|
+
* @param style Style for the inserted text
|
|
374
|
+
*/
|
|
375
|
+
insert(index: number, text: string, style: CharacterStyle): void;
|
|
376
|
+
/**
|
|
377
|
+
* Delete text in a character range
|
|
378
|
+
* @param start Start index (inclusive)
|
|
379
|
+
* @param end End index (exclusive)
|
|
380
|
+
*/
|
|
381
|
+
delete(start: number, end: number): void;
|
|
382
|
+
/**
|
|
383
|
+
* Normalize spans by:
|
|
384
|
+
* 1. Removing empty spans
|
|
385
|
+
* 2. Merging adjacent spans with identical styles
|
|
386
|
+
* This prevents fragmentation and improves performance
|
|
387
|
+
*/
|
|
388
|
+
private normalize;
|
|
389
|
+
/**
|
|
390
|
+
* Check if two styles are equal
|
|
391
|
+
*/
|
|
392
|
+
private stylesEqual;
|
|
393
|
+
/**
|
|
394
|
+
* Clone this RichText instance
|
|
395
|
+
*/
|
|
396
|
+
clone(): RichText;
|
|
397
|
+
/**
|
|
398
|
+
* Clear a specific style property from all spans.
|
|
399
|
+
* Used when element-level property changes should override character-level.
|
|
400
|
+
* After clearing, spans will inherit the property from element defaults.
|
|
401
|
+
* @param property The style property to clear (e.g., 'fontFamily', 'bold')
|
|
402
|
+
*/
|
|
403
|
+
clearStyleProperty(property: keyof CharacterStyle): void;
|
|
404
|
+
/**
|
|
405
|
+
* Serialize to JSON
|
|
406
|
+
*/
|
|
407
|
+
toJSON(): {
|
|
408
|
+
spans: TextSpan[];
|
|
409
|
+
};
|
|
410
|
+
/**
|
|
411
|
+
* Deserialize from JSON
|
|
412
|
+
*/
|
|
413
|
+
static fromJSON(json: {
|
|
414
|
+
spans: TextSpan[];
|
|
415
|
+
}): RichText;
|
|
416
|
+
}
|
|
417
|
+
export interface BaseElementConfig {
|
|
418
|
+
id?: string;
|
|
419
|
+
x?: number;
|
|
420
|
+
y?: number;
|
|
421
|
+
rotation?: number;
|
|
422
|
+
opacity?: number;
|
|
423
|
+
transformType?: TransformType;
|
|
424
|
+
transformData?: Partial<AnyTransformData>;
|
|
425
|
+
blendMode?: BlendMode;
|
|
426
|
+
knockoutParts?: KnockoutConfig;
|
|
427
|
+
stroke?: StrokeConfig;
|
|
428
|
+
masks?: MaskDefinition[];
|
|
429
|
+
distressEffect?: DistressEffect;
|
|
430
|
+
name?: string;
|
|
431
|
+
visible?: boolean;
|
|
432
|
+
locked?: boolean;
|
|
433
|
+
isClipping?: boolean;
|
|
434
|
+
}
|
|
435
|
+
export interface BaseTextElementConfig extends BaseElementConfig {
|
|
436
|
+
richText?: RichText | {
|
|
437
|
+
spans: TextSpan[];
|
|
438
|
+
};
|
|
439
|
+
text?: string;
|
|
440
|
+
fontSize?: number;
|
|
441
|
+
fontFamily?: string;
|
|
442
|
+
color?: string;
|
|
443
|
+
textAlign?: TextAlign;
|
|
444
|
+
bold?: boolean;
|
|
445
|
+
italic?: boolean;
|
|
446
|
+
underline?: boolean;
|
|
447
|
+
strikethrough?: boolean;
|
|
448
|
+
glyphOverrides?: GlyphOverride[];
|
|
449
|
+
openTypeFeatures?: OpenTypeFeatures;
|
|
450
|
+
}
|
|
451
|
+
export interface CustomElementConfig extends BaseTextElementConfig {
|
|
452
|
+
transformType: 'custom';
|
|
453
|
+
transformData?: Partial<CustomTransformData>;
|
|
454
|
+
}
|
|
455
|
+
export interface DistortElementConfig extends BaseTextElementConfig {
|
|
456
|
+
transformType: 'distort';
|
|
457
|
+
transformData?: Partial<DistortTransformData>;
|
|
458
|
+
}
|
|
459
|
+
export interface CircleElementConfig extends BaseTextElementConfig {
|
|
460
|
+
transformType: 'circle';
|
|
461
|
+
transformData?: Partial<CircleTransformData>;
|
|
462
|
+
}
|
|
463
|
+
export interface LeanElementConfig extends BaseTextElementConfig {
|
|
464
|
+
transformType: 'lean';
|
|
465
|
+
transformData?: Partial<LeanTransformData>;
|
|
466
|
+
}
|
|
467
|
+
export interface ArchElementConfig extends BaseTextElementConfig {
|
|
468
|
+
transformType: 'arch';
|
|
469
|
+
transformData?: Partial<ArchTransformData>;
|
|
470
|
+
}
|
|
471
|
+
export interface AscendElementConfig extends BaseTextElementConfig {
|
|
472
|
+
transformType: 'ascend';
|
|
473
|
+
transformData?: Partial<AscendTransformData>;
|
|
474
|
+
}
|
|
475
|
+
export interface WaveElementConfig extends BaseTextElementConfig {
|
|
476
|
+
transformType: 'wave';
|
|
477
|
+
transformData?: Partial<WaveTransformData>;
|
|
478
|
+
}
|
|
479
|
+
export interface FlagElementConfig extends BaseTextElementConfig {
|
|
480
|
+
transformType: 'flag';
|
|
481
|
+
transformData?: Partial<FlagTransformData>;
|
|
482
|
+
}
|
|
483
|
+
export interface ImageElementConfig extends BaseElementConfig {
|
|
484
|
+
transformType: 'image';
|
|
485
|
+
transformData?: Partial<ImageTransformData>;
|
|
486
|
+
imageUrl?: string;
|
|
487
|
+
imageAspectRatio?: number;
|
|
488
|
+
/**
|
|
489
|
+
* Callback invoked when the image finishes loading.
|
|
490
|
+
*
|
|
491
|
+
* The parameter is an `ImageElement` instance (clone of the loaded element).
|
|
492
|
+
* Import `ImageElement` from `@snowcone-app/canvas/advanced` to narrow the type.
|
|
493
|
+
*
|
|
494
|
+
* @example
|
|
495
|
+
* ```ts
|
|
496
|
+
* import type { ImageElement } from '@snowcone-app/canvas/advanced';
|
|
497
|
+
* const config: ImageElementConfig = {
|
|
498
|
+
* transformType: 'image',
|
|
499
|
+
* onLoadCallback(el) {
|
|
500
|
+
* const img = el as ImageElement;
|
|
501
|
+
* console.log(img.id, img.transformData.width);
|
|
502
|
+
* },
|
|
503
|
+
* };
|
|
504
|
+
* ```
|
|
505
|
+
*/
|
|
506
|
+
onLoadCallback?(element: BaseElementConfig & {
|
|
507
|
+
readonly id: string;
|
|
508
|
+
readonly transformType: 'image';
|
|
509
|
+
}): void;
|
|
510
|
+
/**
|
|
511
|
+
* If true, dimensions (width/height) won't be recalculated when the image loads.
|
|
512
|
+
* Use this when you've explicitly calculated dimensions (e.g., for "cover" sizing).
|
|
513
|
+
*/
|
|
514
|
+
preserveDimensions?: boolean;
|
|
515
|
+
}
|
|
516
|
+
export interface GroupElementConfig extends BaseElementConfig {
|
|
517
|
+
transformType: 'group';
|
|
518
|
+
transformData?: Partial<GroupTransformData>;
|
|
519
|
+
children?: AnyElementConfig[];
|
|
520
|
+
}
|
|
521
|
+
export interface ShapeElementConfig extends BaseElementConfig {
|
|
522
|
+
transformType: 'shape';
|
|
523
|
+
transformData?: Partial<ShapeTransformData>;
|
|
524
|
+
}
|
|
525
|
+
export interface PathElementConfig extends BaseElementConfig {
|
|
526
|
+
transformType: 'path';
|
|
527
|
+
transformData?: Partial<PathTransformData>;
|
|
528
|
+
}
|
|
529
|
+
export type ArtboardBackgroundType = 'color' | 'transparent' | 'texture';
|
|
530
|
+
export interface ArtboardDistressTexture {
|
|
531
|
+
enabled: boolean;
|
|
532
|
+
textureUrl: string;
|
|
533
|
+
intensity: number;
|
|
534
|
+
}
|
|
535
|
+
export interface ArtboardImageMask {
|
|
536
|
+
enabled: boolean;
|
|
537
|
+
imageUrl: string;
|
|
538
|
+
maskType: 'clip' | 'alpha' | 'luma';
|
|
539
|
+
opacity: number;
|
|
540
|
+
inverted?: boolean;
|
|
541
|
+
}
|
|
542
|
+
export type ClipShape = 'rectangle' | 'circle' | {
|
|
543
|
+
type: 'rounded';
|
|
544
|
+
radius: number;
|
|
545
|
+
} | {
|
|
546
|
+
type: 'path';
|
|
547
|
+
d: string;
|
|
548
|
+
} | {
|
|
549
|
+
type: 'composite-path';
|
|
550
|
+
pieces: Array<{
|
|
551
|
+
d: string;
|
|
552
|
+
x: number;
|
|
553
|
+
y: number;
|
|
554
|
+
rotation?: 0 | 90 | 180 | 270;
|
|
555
|
+
baseWidth?: number;
|
|
556
|
+
baseHeight?: number;
|
|
557
|
+
}>;
|
|
558
|
+
};
|
|
559
|
+
export interface ArtboardConfig {
|
|
560
|
+
id?: string;
|
|
561
|
+
name?: string;
|
|
562
|
+
x?: number;
|
|
563
|
+
y?: number;
|
|
564
|
+
width?: number;
|
|
565
|
+
height?: number;
|
|
566
|
+
backgroundColor?: string;
|
|
567
|
+
backgroundType?: ArtboardBackgroundType;
|
|
568
|
+
backgroundTexture?: string;
|
|
569
|
+
exportBackground?: boolean;
|
|
570
|
+
elementIds?: string[];
|
|
571
|
+
transformType?: 'artboard';
|
|
572
|
+
clipShape?: ClipShape;
|
|
573
|
+
previewBackgroundColor?: string;
|
|
574
|
+
distressTexture?: ArtboardDistressTexture;
|
|
575
|
+
imageMask?: ArtboardImageMask;
|
|
576
|
+
}
|
|
577
|
+
export type AnyElementConfig = CustomElementConfig | DistortElementConfig | CircleElementConfig | LeanElementConfig | ArchElementConfig | AscendElementConfig | WaveElementConfig | FlagElementConfig | ImageElementConfig | GroupElementConfig | ShapeElementConfig | PathElementConfig;
|
|
578
|
+
export type TextOnlyElementConfig = Exclude<AnyElementConfig, ImageElementConfig | ShapeElementConfig | PathElementConfig>;
|
|
579
|
+
export type InteractionMode = 'idle' | 'drag' | 'resize' | 'rotate' | 'crop' | 'pen' | 'edit-path' | 'pinch';
|
|
580
|
+
export interface InteractionContext<T = unknown> {
|
|
581
|
+
mode: InteractionMode;
|
|
582
|
+
startX: number;
|
|
583
|
+
startY: number;
|
|
584
|
+
startData: TransformStartData;
|
|
585
|
+
activeHandle?: ResizeAnchor;
|
|
586
|
+
element: T;
|
|
587
|
+
}
|
|
588
|
+
export interface Command {
|
|
589
|
+
execute(): void;
|
|
590
|
+
undo(): void;
|
|
591
|
+
}
|
|
592
|
+
export interface ElementUpdate<T = unknown> {
|
|
593
|
+
oldElement: T;
|
|
594
|
+
newElement: T;
|
|
595
|
+
}
|
|
596
|
+
export interface MultiElementUpdate<T = unknown> {
|
|
597
|
+
updates: Map<string, ElementUpdate<T>>;
|
|
598
|
+
}
|
|
599
|
+
export type SelectionState = {
|
|
600
|
+
type: 'none';
|
|
601
|
+
} | {
|
|
602
|
+
type: 'single';
|
|
603
|
+
elementId: string;
|
|
604
|
+
} | {
|
|
605
|
+
type: 'multiple';
|
|
606
|
+
elementIds: Set<string>;
|
|
607
|
+
};
|
|
608
|
+
export interface SnapGuide {
|
|
609
|
+
type: 'vertical' | 'horizontal';
|
|
610
|
+
sourceId?: string;
|
|
611
|
+
targetId?: string;
|
|
612
|
+
x?: number;
|
|
613
|
+
y1?: number;
|
|
614
|
+
y2?: number;
|
|
615
|
+
y?: number;
|
|
616
|
+
x1?: number;
|
|
617
|
+
x2?: number;
|
|
618
|
+
}
|
|
619
|
+
export interface SnapResult {
|
|
620
|
+
x: number;
|
|
621
|
+
y: number;
|
|
622
|
+
snappedX: boolean;
|
|
623
|
+
snappedY: boolean;
|
|
624
|
+
guides: SnapGuide[];
|
|
625
|
+
}
|
|
626
|
+
export interface SpacingIndicator {
|
|
627
|
+
type: 'horizontal' | 'vertical';
|
|
628
|
+
distance: number;
|
|
629
|
+
isSnapTarget?: boolean;
|
|
630
|
+
isAltHover?: boolean;
|
|
631
|
+
x1?: number;
|
|
632
|
+
x2?: number;
|
|
633
|
+
y?: number;
|
|
634
|
+
x?: number;
|
|
635
|
+
y1?: number;
|
|
636
|
+
y2?: number;
|
|
637
|
+
labelX: number;
|
|
638
|
+
labelY: number;
|
|
639
|
+
}
|
|
640
|
+
export interface ResizeResult {
|
|
641
|
+
newWidth: number;
|
|
642
|
+
newHeight: number;
|
|
643
|
+
newX: number;
|
|
644
|
+
newY: number;
|
|
645
|
+
newRotation: number;
|
|
646
|
+
}
|
|
647
|
+
export interface ResizeParams<T = unknown> {
|
|
648
|
+
element: T;
|
|
649
|
+
anchor: ResizeAnchor;
|
|
650
|
+
dx: number;
|
|
651
|
+
dy: number;
|
|
652
|
+
startData: TransformStartData;
|
|
653
|
+
maintainAspectRatio?: boolean;
|
|
654
|
+
}
|
|
655
|
+
export interface RenderContext {
|
|
656
|
+
ctx: CanvasRenderingContext2D;
|
|
657
|
+
isSelected: boolean;
|
|
658
|
+
isHovered?: boolean;
|
|
659
|
+
scale?: number;
|
|
660
|
+
}
|
|
661
|
+
export interface HandleInfo {
|
|
662
|
+
anchor: ResizeAnchor;
|
|
663
|
+
x: number;
|
|
664
|
+
y: number;
|
|
665
|
+
cursor: string;
|
|
666
|
+
}
|
|
667
|
+
export interface TransformControl {
|
|
668
|
+
key: string;
|
|
669
|
+
label: string;
|
|
670
|
+
type?: 'checkbox' | 'slider' | 'select';
|
|
671
|
+
defaultValue?: number | boolean | string;
|
|
672
|
+
defaultInternalValue?: number;
|
|
673
|
+
step?: number;
|
|
674
|
+
options?: Array<{
|
|
675
|
+
value: string;
|
|
676
|
+
label: string;
|
|
677
|
+
}>;
|
|
678
|
+
toSlider?: (internal: number) => number;
|
|
679
|
+
fromSlider?: (slider: number) => number;
|
|
680
|
+
toDisplay?: (internal: number) => string;
|
|
681
|
+
visibleWhen?: (data: Record<string, unknown>) => boolean;
|
|
682
|
+
}
|
|
683
|
+
export interface TransformTypeDefinition {
|
|
684
|
+
id: TransformType;
|
|
685
|
+
label: string;
|
|
686
|
+
Component: new (config?: Partial<BaseTextElementConfig>) => unknown;
|
|
687
|
+
}
|
|
688
|
+
export type ExtractElementByType<T extends TransformType> = Extract<AnyElementConfig, {
|
|
689
|
+
transformType: T;
|
|
690
|
+
}>;
|
|
691
|
+
export type ExtractTransformData<T extends TransformType> = Extract<AnyTransformData, {
|
|
692
|
+
type: T;
|
|
693
|
+
}>;
|
|
694
|
+
export declare function isCustomTransform(data: AnyTransformData): data is CustomTransformData;
|
|
695
|
+
export declare function isDistortTransform(data: AnyTransformData): data is DistortTransformData;
|
|
696
|
+
export declare function isCircleTransform(data: AnyTransformData): data is CircleTransformData;
|
|
697
|
+
export declare function isLeanTransform(data: AnyTransformData): data is LeanTransformData;
|
|
698
|
+
export declare function isArchTransform(data: AnyTransformData): data is ArchTransformData;
|
|
699
|
+
export declare function isAscendTransform(data: AnyTransformData): data is AscendTransformData;
|
|
700
|
+
export declare function isWaveTransform(data: AnyTransformData): data is WaveTransformData;
|
|
701
|
+
export declare function isFlagTransform(data: AnyTransformData): data is FlagTransformData;
|
|
702
|
+
export declare function isImageTransform(data: AnyTransformData): data is ImageTransformData;
|
|
703
|
+
export declare function isGroupTransform(data: AnyTransformData): data is GroupTransformData;
|
|
704
|
+
export declare function isArtboardTransform(data: AnyTransformData): data is ArtboardTransformData;
|
|
705
|
+
export declare function isTextElementConfig(config: AnyElementConfig): config is TextOnlyElementConfig;
|
|
706
|
+
export declare function isImageElementConfig(config: AnyElementConfig): config is ImageElementConfig;
|
|
707
|
+
export declare function isCustomElementConfig(config: AnyElementConfig): config is CustomElementConfig;
|
|
708
|
+
export declare function isCircleElementConfig(config: AnyElementConfig): config is CircleElementConfig;
|
|
709
|
+
export declare function isLeanElementConfig(config: AnyElementConfig): config is LeanElementConfig;
|
|
710
|
+
export declare function isArchElementConfig(config: AnyElementConfig): config is ArchElementConfig;
|
|
711
|
+
export declare function isAscendElementConfig(config: AnyElementConfig): config is AscendElementConfig;
|
|
712
|
+
export declare function isWaveElementConfig(config: AnyElementConfig): config is WaveElementConfig;
|
|
713
|
+
export declare function isFlagElementConfig(config: AnyElementConfig): config is FlagElementConfig;
|
|
714
|
+
export declare function isGroupElementConfig(config: AnyElementConfig): config is GroupElementConfig;
|
|
715
|
+
export declare function isShapeElementConfig(config: AnyElementConfig): config is ShapeElementConfig;
|
|
716
|
+
export declare function isPathElementConfig(config: AnyElementConfig): config is PathElementConfig;
|
|
717
|
+
export declare function isShapeTransform(data: AnyTransformData): data is ShapeTransformData;
|
|
718
|
+
export declare function isPathTransform(data: AnyTransformData): data is PathTransformData;
|
|
719
|
+
export declare function hasStroke(config: AnyElementConfig): boolean;
|
|
720
|
+
export declare function hasMasks(config: AnyElementConfig): boolean;
|
|
721
|
+
export declare function isKnockout(config: AnyElementConfig): boolean;
|
|
722
|
+
export declare function hasDistressEffect(config: AnyElementConfig): boolean;
|
|
723
|
+
/**
|
|
724
|
+
* Categories of errors that can occur within the canvas.
|
|
725
|
+
*
|
|
726
|
+
* - 'render': Errors during canvas rendering (element draw, compositing)
|
|
727
|
+
* - 'export': Errors during artboard export (PNG generation, worker failures)
|
|
728
|
+
* - 'import': Errors loading or deserializing saved state / initial elements
|
|
729
|
+
* - 'image': Errors loading images (network failures, CORS, decode errors)
|
|
730
|
+
* - 'worker': Errors in the export web worker
|
|
731
|
+
* - 'state': Errors in state management (artboard creation, element updates)
|
|
732
|
+
* - 'unknown': Uncategorized errors caught by the ErrorBoundary
|
|
733
|
+
*/
|
|
734
|
+
export type CanvasErrorCategory = 'render' | 'export' | 'import' | 'image' | 'worker' | 'state' | 'unknown';
|
|
735
|
+
/**
|
|
736
|
+
* Structured error type for all canvas errors.
|
|
737
|
+
* Provides consistent error reporting with category, context, and recoverability info.
|
|
738
|
+
*
|
|
739
|
+
* @example
|
|
740
|
+
* ```tsx
|
|
741
|
+
* <SnowconeCanvas
|
|
742
|
+
* onError={(error) => {
|
|
743
|
+
* if (error.category === 'image' && error.recoverable) {
|
|
744
|
+
* showToast('Image failed to load, please try another');
|
|
745
|
+
* } else if (!error.recoverable) {
|
|
746
|
+
* reportCrash(error);
|
|
747
|
+
* }
|
|
748
|
+
* }}
|
|
749
|
+
* />
|
|
750
|
+
* ```
|
|
751
|
+
*/
|
|
752
|
+
export interface CanvasError {
|
|
753
|
+
/** The category of this error */
|
|
754
|
+
category: CanvasErrorCategory;
|
|
755
|
+
/** Human-readable error message */
|
|
756
|
+
message: string;
|
|
757
|
+
/** The original Error object, if available */
|
|
758
|
+
originalError?: Error;
|
|
759
|
+
/** The element ID involved, if applicable */
|
|
760
|
+
elementId?: string;
|
|
761
|
+
/** The artboard ID involved, if applicable */
|
|
762
|
+
artboardId?: string;
|
|
763
|
+
/** Whether the canvas can continue operating after this error */
|
|
764
|
+
recoverable: boolean;
|
|
765
|
+
}
|