@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,56 @@
|
|
|
1
|
+
import { Ref } from 'react';
|
|
2
|
+
import { RichText, CharacterStyle } from '../../../types/index.js';
|
|
3
|
+
import { TextElement } from '../../../core/TextElement.js';
|
|
4
|
+
import { ImageElement } from '../../../core/ImageElement.js';
|
|
5
|
+
import { GroupElement } from '../../../core/GroupElement.js';
|
|
6
|
+
import { ShapeElement } from '../../../core/ShapeElement.js';
|
|
7
|
+
import { PathElement } from '../../../core/PathElement.js';
|
|
8
|
+
/** Elements that can be selected in the canvas */
|
|
9
|
+
type CanvasElement = TextElement | ImageElement | GroupElement | ShapeElement | PathElement;
|
|
10
|
+
export interface TextEditingHandle {
|
|
11
|
+
applyTextFormatting: (style: CharacterStyle) => void;
|
|
12
|
+
toggleFormattingProperty: (property: 'bold' | 'italic' | 'underline' | 'strikethrough') => void;
|
|
13
|
+
isEditingText: () => boolean;
|
|
14
|
+
getSelectionStyle: () => CharacterStyle | null;
|
|
15
|
+
}
|
|
16
|
+
interface UseTextEditingProps {
|
|
17
|
+
selectedElement: CanvasElement | null | undefined;
|
|
18
|
+
ref?: Ref<TextEditingHandle>;
|
|
19
|
+
}
|
|
20
|
+
export declare function useTextEditing({ selectedElement, ref }: UseTextEditingProps): {
|
|
21
|
+
isEditing: boolean;
|
|
22
|
+
setIsEditing: import('react').Dispatch<import('react').SetStateAction<boolean>>;
|
|
23
|
+
editText: string;
|
|
24
|
+
setEditText: import('react').Dispatch<import('react').SetStateAction<string>>;
|
|
25
|
+
editPosition: {
|
|
26
|
+
x: number;
|
|
27
|
+
y: number;
|
|
28
|
+
width: number;
|
|
29
|
+
height?: number;
|
|
30
|
+
};
|
|
31
|
+
setEditPosition: import('react').Dispatch<import('react').SetStateAction<{
|
|
32
|
+
x: number;
|
|
33
|
+
y: number;
|
|
34
|
+
width: number;
|
|
35
|
+
height?: number;
|
|
36
|
+
}>>;
|
|
37
|
+
cursorPosition: number;
|
|
38
|
+
setCursorPosition: import('react').Dispatch<import('react').SetStateAction<number>>;
|
|
39
|
+
selectionStart: number;
|
|
40
|
+
setSelectionStart: import('react').Dispatch<import('react').SetStateAction<number>>;
|
|
41
|
+
selectionEnd: number;
|
|
42
|
+
setSelectionEnd: import('react').Dispatch<import('react').SetStateAction<number>>;
|
|
43
|
+
cursorOpacityRef: import('react').RefObject<number>;
|
|
44
|
+
cursorStartTimeRef: import('react').RefObject<number>;
|
|
45
|
+
selectionAnchorRef: import('react').RefObject<number>;
|
|
46
|
+
didDragSelectRef: import('react').RefObject<boolean>;
|
|
47
|
+
editRichText: RichText | null;
|
|
48
|
+
setEditRichText: import('react').Dispatch<import('react').SetStateAction<RichText | null>>;
|
|
49
|
+
editRichTextRef: import('react').RefObject<RichText | null>;
|
|
50
|
+
currentFormattingStyle: CharacterStyle | null;
|
|
51
|
+
setCurrentFormattingStyle: import('react').Dispatch<import('react').SetStateAction<CharacterStyle | null>>;
|
|
52
|
+
applyFormattingToSelection: (style: CharacterStyle) => void;
|
|
53
|
+
getSelectionStyle: () => CharacterStyle | null;
|
|
54
|
+
toggleFormattingProperty: (property: "bold" | "italic" | "underline" | "strikethrough") => void;
|
|
55
|
+
};
|
|
56
|
+
export {};
|
|
@@ -0,0 +1,75 @@
|
|
|
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 { TransformHandles } from '../../../core/TransformHandles.js';
|
|
6
|
+
import { RichText, CharacterStyle } from '../../../types/index.js';
|
|
7
|
+
import { PathElement } from '../../../core/PathElement.js';
|
|
8
|
+
type CanvasElement = TextElement | ImageElement | GroupElement | ShapeElement | PathElement;
|
|
9
|
+
type ChildElement = TextElement | ImageElement | ShapeElement | PathElement | GroupElement;
|
|
10
|
+
export interface UseTextEditingHandlersParams {
|
|
11
|
+
canvasRef: React.RefObject<HTMLCanvasElement | null>;
|
|
12
|
+
inputRef: React.RefObject<HTMLTextAreaElement | null>;
|
|
13
|
+
editingChildIdRef: React.MutableRefObject<string | null>;
|
|
14
|
+
editRichTextRef: React.MutableRefObject<RichText | null>;
|
|
15
|
+
selectionAnchorRef: React.MutableRefObject<number>;
|
|
16
|
+
cursorStartTimeRef: React.MutableRefObject<number>;
|
|
17
|
+
lastMultiClickTimeRef: React.MutableRefObject<number>;
|
|
18
|
+
multiClickSelectionRef: React.MutableRefObject<{
|
|
19
|
+
start: number;
|
|
20
|
+
end: number;
|
|
21
|
+
cursor: number;
|
|
22
|
+
} | null>;
|
|
23
|
+
editPositionUpdateTimerRef: React.MutableRefObject<ReturnType<typeof setTimeout> | null>;
|
|
24
|
+
draggingSelectionHandleRef: React.MutableRefObject<'start' | 'end' | null>;
|
|
25
|
+
repositioningCursorRef: React.MutableRefObject<boolean>;
|
|
26
|
+
editModeEnteredAtRef: React.MutableRefObject<number>;
|
|
27
|
+
lastTouchTargetRef: React.MutableRefObject<HTMLElement | null>;
|
|
28
|
+
MULTI_CLICK_DEBOUNCE: number;
|
|
29
|
+
EDIT_MODE_BLUR_DEBOUNCE: number;
|
|
30
|
+
isEditing: boolean;
|
|
31
|
+
editText: string;
|
|
32
|
+
editRichText: RichText | null;
|
|
33
|
+
cursorPosition: number;
|
|
34
|
+
selectionStart: number;
|
|
35
|
+
selectionEnd: number;
|
|
36
|
+
selectedId: string | null;
|
|
37
|
+
selectedElement: CanvasElement | undefined;
|
|
38
|
+
activeChildElement: ChildElement | null;
|
|
39
|
+
elements: CanvasElement[];
|
|
40
|
+
zoom: number;
|
|
41
|
+
paddingOffsetX: number;
|
|
42
|
+
paddingOffsetY: number;
|
|
43
|
+
setIsEditing: (v: boolean) => void;
|
|
44
|
+
setEditText: (v: string) => void;
|
|
45
|
+
setEditRichText: (v: RichText | null) => void;
|
|
46
|
+
setCursorPosition: React.Dispatch<React.SetStateAction<number>>;
|
|
47
|
+
setSelectionStart: React.Dispatch<React.SetStateAction<number>>;
|
|
48
|
+
setSelectionEnd: React.Dispatch<React.SetStateAction<number>>;
|
|
49
|
+
setEditPosition: (pos: {
|
|
50
|
+
x: number;
|
|
51
|
+
y: number;
|
|
52
|
+
width: number;
|
|
53
|
+
height: number;
|
|
54
|
+
}) => void;
|
|
55
|
+
setCurrentFormattingStyle: React.Dispatch<React.SetStateAction<CharacterStyle | null>>;
|
|
56
|
+
setCursorAnimationFrame: React.Dispatch<React.SetStateAction<number>>;
|
|
57
|
+
setHandlesVersion: React.Dispatch<React.SetStateAction<number>>;
|
|
58
|
+
setElements: React.Dispatch<React.SetStateAction<CanvasElement[]>>;
|
|
59
|
+
onElementUpdate: (element: CanvasElement) => void;
|
|
60
|
+
onTextSelectionChange?: () => void;
|
|
61
|
+
transformHandles: TransformHandles;
|
|
62
|
+
updateActiveChild: (child: ChildElement | null) => void;
|
|
63
|
+
}
|
|
64
|
+
export interface TextEditingHandlersResult {
|
|
65
|
+
handleTextEditComplete: () => void;
|
|
66
|
+
handleTextEditBlur: () => void;
|
|
67
|
+
handleTextKeyDown: (e: React.KeyboardEvent<HTMLTextAreaElement>) => void;
|
|
68
|
+
applyFormattingToSelection: (style: CharacterStyle) => void;
|
|
69
|
+
getSelectionStyle: () => CharacterStyle | null;
|
|
70
|
+
toggleFormattingProperty: (property: 'bold' | 'italic' | 'underline' | 'strikethrough') => void;
|
|
71
|
+
enterTextEditMode: (element: TextElement, worldX: number, worldY: number) => void;
|
|
72
|
+
getWrappedTextForEditing: (element: TextElement) => string;
|
|
73
|
+
}
|
|
74
|
+
export declare function useTextEditingHandlers(params: UseTextEditingHandlersParams): TextEditingHandlersResult;
|
|
75
|
+
export {};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { TextElement } from '../../../core/TextElement.js';
|
|
2
|
+
import { ImageElement } from '../../../core/ImageElement.js';
|
|
3
|
+
export interface RenderGroupSiblingHoverParams {
|
|
4
|
+
ctx: CanvasRenderingContext2D;
|
|
5
|
+
hoveredChild: TextElement | ImageElement;
|
|
6
|
+
zoom?: number;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Renders hover effect outline for a group sibling element
|
|
10
|
+
* @param params.zoom - Zoom factor (default 1.0) - line width is adjusted to maintain visual consistency
|
|
11
|
+
*/
|
|
12
|
+
export declare function renderGroupSiblingHover(params: RenderGroupSiblingHoverParams): void;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CanvasEditor Rendering Utilities
|
|
3
|
+
* Barrel export for all rendering functions
|
|
4
|
+
*/
|
|
5
|
+
export { renderMultiSelectionIndicators } from './multiSelectionRenderer.js';
|
|
6
|
+
export type { MultiSelectionOBB, MultiSelectionGroupBounds, RenderMultiSelectionParams, RenderMultiSelectionResult, } from './multiSelectionRenderer.js';
|
|
7
|
+
export { renderMarqueeSelection } from './marqueeRenderer.js';
|
|
8
|
+
export type { RenderMarqueeParams } from './marqueeRenderer.js';
|
|
9
|
+
export { renderGroupSiblingHover } from './hoverRenderer.js';
|
|
10
|
+
export type { RenderGroupSiblingHoverParams } from './hoverRenderer.js';
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Marquee Selection Renderer
|
|
3
|
+
* Handles rendering of the marquee selection box during drag
|
|
4
|
+
*/
|
|
5
|
+
export interface RenderMarqueeParams {
|
|
6
|
+
ctx: CanvasRenderingContext2D;
|
|
7
|
+
marqueeStart: {
|
|
8
|
+
x: number;
|
|
9
|
+
y: number;
|
|
10
|
+
};
|
|
11
|
+
marqueeEnd: {
|
|
12
|
+
x: number;
|
|
13
|
+
y: number;
|
|
14
|
+
};
|
|
15
|
+
zoom?: number;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Renders a marquee selection box with stroke and semi-transparent fill
|
|
19
|
+
* @param params.zoom - Zoom factor (default 1.0) - line width is adjusted to maintain visual consistency
|
|
20
|
+
*/
|
|
21
|
+
export declare function renderMarqueeSelection(params: RenderMarqueeParams): void;
|
|
@@ -0,0 +1,52 @@
|
|
|
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
|
+
import { InteractionStateMachine } from '../../../core/InteractionStateMachine.js';
|
|
7
|
+
/** Elements that can be on the canvas */
|
|
8
|
+
type CanvasElement = TextElement | ImageElement | GroupElement | ShapeElement | PathElement;
|
|
9
|
+
export interface MultiSelectionOBB {
|
|
10
|
+
centerX: number;
|
|
11
|
+
centerY: number;
|
|
12
|
+
width: number;
|
|
13
|
+
height: number;
|
|
14
|
+
rotation: number;
|
|
15
|
+
}
|
|
16
|
+
export interface MultiSelectionGroupBounds {
|
|
17
|
+
minX: number;
|
|
18
|
+
minY: number;
|
|
19
|
+
maxX: number;
|
|
20
|
+
maxY: number;
|
|
21
|
+
centerX: number;
|
|
22
|
+
centerY: number;
|
|
23
|
+
rotationHandleX: number;
|
|
24
|
+
rotationHandleY: number;
|
|
25
|
+
rotation: number;
|
|
26
|
+
}
|
|
27
|
+
export interface RenderMultiSelectionParams {
|
|
28
|
+
ctx: CanvasRenderingContext2D;
|
|
29
|
+
displaySelection: string[];
|
|
30
|
+
elements: CanvasElement[];
|
|
31
|
+
activeArtboardElementIds: Set<string>;
|
|
32
|
+
stateMachine: InteractionStateMachine;
|
|
33
|
+
multiSelectionOBB: MultiSelectionOBB | null;
|
|
34
|
+
isRotating: boolean;
|
|
35
|
+
currentRotation: number;
|
|
36
|
+
isMarqueeSelecting: boolean;
|
|
37
|
+
zoom?: number;
|
|
38
|
+
}
|
|
39
|
+
export interface RenderMultiSelectionResult {
|
|
40
|
+
updatedOBB: MultiSelectionOBB | null;
|
|
41
|
+
groupBounds: MultiSelectionGroupBounds | null;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Renders multi-selection indicators including:
|
|
45
|
+
* - Individual element borders
|
|
46
|
+
* - Group bounding box with dotted border
|
|
47
|
+
* - Corner resize handles
|
|
48
|
+
* - Rotation handle
|
|
49
|
+
* - Dimension label during resize
|
|
50
|
+
*/
|
|
51
|
+
export declare function renderMultiSelectionIndicators(params: RenderMultiSelectionParams): RenderMultiSelectionResult;
|
|
52
|
+
export {};
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared rendering constants for canvas UI elements
|
|
3
|
+
* Provides DRY (Don't Repeat Yourself) constants for consistent rendering
|
|
4
|
+
* All values should be divided by zoom to maintain visual consistency at different zoom levels
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Line width for selection borders, handles, and UI elements
|
|
8
|
+
* Should be divided by zoom: lineWidth = SELECTION_LINE_WIDTH / zoom
|
|
9
|
+
*/
|
|
10
|
+
export declare const SELECTION_LINE_WIDTH = 2;
|
|
11
|
+
/**
|
|
12
|
+
* Corner resize handle radius
|
|
13
|
+
* Should be divided by zoom: radius = HANDLE_RADIUS / zoom
|
|
14
|
+
*/
|
|
15
|
+
export declare const HANDLE_RADIUS = 6;
|
|
16
|
+
/**
|
|
17
|
+
* Rotation handle radius (larger than corner handles)
|
|
18
|
+
* Should be divided by zoom: radius = ROTATION_HANDLE_RADIUS / zoom
|
|
19
|
+
*/
|
|
20
|
+
export declare const ROTATION_HANDLE_RADIUS = 16;
|
|
21
|
+
/**
|
|
22
|
+
* Dash pattern for dotted lines (multi-selection group bounds)
|
|
23
|
+
* Should be divided by zoom: setLineDash([DASH_SIZE / zoom, DASH_GAP / zoom])
|
|
24
|
+
*/
|
|
25
|
+
export declare const DASH_SIZE = 5;
|
|
26
|
+
export declare const DASH_GAP = 5;
|
|
27
|
+
/**
|
|
28
|
+
* Rotation handle icon scale factor
|
|
29
|
+
*/
|
|
30
|
+
export declare const ROTATION_ICON_SCALE = 0.5;
|
|
31
|
+
/**
|
|
32
|
+
* Helper function to get zoom-adjusted line width
|
|
33
|
+
*/
|
|
34
|
+
export declare function getLineWidth(zoom: number): number;
|
|
35
|
+
/**
|
|
36
|
+
* Helper function to get zoom-adjusted handle radius
|
|
37
|
+
*/
|
|
38
|
+
export declare function getHandleRadius(zoom: number): number;
|
|
39
|
+
/**
|
|
40
|
+
* Helper function to get zoom-adjusted rotation handle radius
|
|
41
|
+
*/
|
|
42
|
+
export declare function getRotationHandleRadius(zoom: number): number;
|
|
43
|
+
/**
|
|
44
|
+
* Helper function to get zoom-adjusted dash pattern
|
|
45
|
+
*/
|
|
46
|
+
export declare function getDashPattern(zoom: number): number[];
|
|
47
|
+
/**
|
|
48
|
+
* Renders complete rotation handle (circle background + icon)
|
|
49
|
+
* Provides consistent rotation handle rendering across single and multi-selection
|
|
50
|
+
* Works in world coordinate space with zoom compensation for UI elements
|
|
51
|
+
*
|
|
52
|
+
* @param ctx - Canvas rendering context
|
|
53
|
+
* @param x - X position in world coordinates
|
|
54
|
+
* @param y - Y position in world coordinates
|
|
55
|
+
* @param zoom - Current zoom level (default 1.0)
|
|
56
|
+
* @param accentColor - Border color (default from theme)
|
|
57
|
+
* @param isHovering - Whether handle is being hovered (increases border width)
|
|
58
|
+
*/
|
|
59
|
+
export declare function renderRotationHandle(ctx: CanvasRenderingContext2D, x: number, y: number, zoom?: number, accentColor?: string, isHovering?: boolean): void;
|
|
@@ -0,0 +1,11 @@
|
|
|
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
|
+
export interface LocalHoverState {
|
|
7
|
+
type: 'element' | 'resize-handle' | 'rotation-handle' | 'crop-handle' | 'multi-selection-handle' | 'multi-selection-rotation-handle' | 'multi-selection-bounds' | 'group-sibling' | null;
|
|
8
|
+
data: unknown;
|
|
9
|
+
startTime: number | null;
|
|
10
|
+
}
|
|
11
|
+
export type AnyElement = TextElement | ImageElement | GroupElement | ShapeElement | PathElement;
|
|
@@ -0,0 +1,102 @@
|
|
|
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 { PathElement } from '../core/PathElement.js';
|
|
6
|
+
import { ShapeElement } from '../core/ShapeElement.js';
|
|
7
|
+
import { ArtboardElement } from '../core/ArtboardElement.js';
|
|
8
|
+
import { ArtboardManager } from '../core/ArtboardManager.js';
|
|
9
|
+
import { CharacterStyle } from '../types/index.js';
|
|
10
|
+
/** Union type for all canvas element types */
|
|
11
|
+
type CanvasElement = TextElement | ImageElement | GroupElement | ShapeElement | PathElement;
|
|
12
|
+
interface CanvasEditorProps {
|
|
13
|
+
elements: CanvasElement[];
|
|
14
|
+
artboards: ArtboardElement[];
|
|
15
|
+
artboardManager: ArtboardManager;
|
|
16
|
+
selectedId: string | null;
|
|
17
|
+
multiSelection: string[];
|
|
18
|
+
onElementUpdate: (element: CanvasElement) => void;
|
|
19
|
+
setElements: React.Dispatch<React.SetStateAction<CanvasElement[]>>;
|
|
20
|
+
executeElementUpdate: (oldElement: CanvasElement | undefined, newElement: CanvasElement) => void;
|
|
21
|
+
onSelectionChange: (id: string | null) => void;
|
|
22
|
+
onMultiSelectionChange: (ids: string[]) => void;
|
|
23
|
+
onActiveChildChange?: (child: CanvasElement | null) => void;
|
|
24
|
+
onTextSelectionChange?: () => void;
|
|
25
|
+
onHoverChange?: (elementId: string | null) => void;
|
|
26
|
+
onRotationStateChange?: (isRotating: boolean) => void;
|
|
27
|
+
onCropModeEnter?: () => void;
|
|
28
|
+
hideHandles?: boolean;
|
|
29
|
+
canvasRef?: React.RefObject<HTMLCanvasElement | null>;
|
|
30
|
+
width?: number;
|
|
31
|
+
height?: number;
|
|
32
|
+
zoom?: number;
|
|
33
|
+
offsetX?: number;
|
|
34
|
+
offsetY?: number;
|
|
35
|
+
viewPadding?: number;
|
|
36
|
+
artboardBorderRadius?: number;
|
|
37
|
+
fixedMargin?: number;
|
|
38
|
+
fixedMarginX?: number;
|
|
39
|
+
fixedMarginY?: number;
|
|
40
|
+
showRotationHandle?: boolean;
|
|
41
|
+
/** ADR-0054 Phase 4: cutout shapes (artboard px) punched through the
|
|
42
|
+
* `<canvas>` as truly transparent holes. Translated internally to a
|
|
43
|
+
* CSS `clip-path: path(evenodd, ...)` that accounts for padding +
|
|
44
|
+
* zoom, so consumers can think purely in artboard coordinates. */
|
|
45
|
+
canvasCutouts?: import('./embed/SnowconeCanvas').CanvasCutoutShape[];
|
|
46
|
+
/** ADR-0054: piece-guide overlays drawn inside the canvas render loop. */
|
|
47
|
+
pieceGuides?: import('./embed/SnowconeCanvas').PieceGuidesConfig;
|
|
48
|
+
/**
|
|
49
|
+
* ADR-0060: which piece (if any) the editor is focused on inside a
|
|
50
|
+
* multi-piece spread. `'spread'` (or undefined) shows every piece in
|
|
51
|
+
* the layout at full size — the historical behaviour. `{ pieceId }`
|
|
52
|
+
* fits the viewport to that piece (with a peek margin so neighbouring
|
|
53
|
+
* pieces remain visible at reduced opacity for overflow feedback).
|
|
54
|
+
* The pieces themselves come from `pieceGuides.pieces`.
|
|
55
|
+
*
|
|
56
|
+
* Spread-mode is derived from `pieces.length`: layouts with a single
|
|
57
|
+
* piece are unaffected by this prop (the toggle is a no-op for them).
|
|
58
|
+
*/
|
|
59
|
+
pieceFocus?: 'spread' | {
|
|
60
|
+
pieceId: string;
|
|
61
|
+
};
|
|
62
|
+
/**
|
|
63
|
+
* ADR-0060: optional override for the focused-piece rect, used by
|
|
64
|
+
* the parent (`Canvas.tsx`) to feed in an animated rect when
|
|
65
|
+
* switching pieces. When provided, it replaces the rect that would
|
|
66
|
+
* otherwise be derived from `pieceFocus` + `pieceGuides`. Lets the
|
|
67
|
+
* zoom-fit math (lives in `Canvas.tsx`) and the layout/render-loop
|
|
68
|
+
* (lives here) share one interpolating value during the dolly.
|
|
69
|
+
*/
|
|
70
|
+
focusedPieceRect?: {
|
|
71
|
+
x: number;
|
|
72
|
+
y: number;
|
|
73
|
+
width: number;
|
|
74
|
+
height: number;
|
|
75
|
+
} | null;
|
|
76
|
+
}
|
|
77
|
+
export interface CanvasEditorHandle {
|
|
78
|
+
applyTextFormatting: (style: CharacterStyle) => void;
|
|
79
|
+
toggleFormattingProperty: (property: 'bold' | 'italic' | 'underline' | 'strikethrough') => void;
|
|
80
|
+
isEditingText: () => boolean;
|
|
81
|
+
isRotating: () => boolean;
|
|
82
|
+
getSelectionStyle: () => CharacterStyle | null;
|
|
83
|
+
getZoom: () => number;
|
|
84
|
+
forceRender: () => void;
|
|
85
|
+
getEditingState: () => {
|
|
86
|
+
isEditing: boolean;
|
|
87
|
+
editText: string;
|
|
88
|
+
cursorPosition: number;
|
|
89
|
+
selectionStart: number;
|
|
90
|
+
selectionEnd: number;
|
|
91
|
+
};
|
|
92
|
+
getCropState: () => {
|
|
93
|
+
isCropping: boolean;
|
|
94
|
+
elementId: string | null;
|
|
95
|
+
};
|
|
96
|
+
getPaddingOffset: () => {
|
|
97
|
+
x: number;
|
|
98
|
+
y: number;
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
declare const CanvasEditor: React.ForwardRefExoticComponent<CanvasEditorProps & React.RefAttributes<CanvasEditorHandle>>;
|
|
102
|
+
export default CanvasEditor;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ColorPickerDropdown - Custom color picker with dropdown
|
|
3
|
+
* Uses react-colorful for a better UX than native browser picker
|
|
4
|
+
*/
|
|
5
|
+
export interface ColorPickerDropdownProps {
|
|
6
|
+
value: string;
|
|
7
|
+
onChange: (event: {
|
|
8
|
+
target: {
|
|
9
|
+
value: string;
|
|
10
|
+
};
|
|
11
|
+
}) => void;
|
|
12
|
+
/** Colours already in use elsewhere in the design (text, shapes,
|
|
13
|
+
* paths, strokes, artboard background). Surfaced as the
|
|
14
|
+
* "Document colors" row. */
|
|
15
|
+
documentColors?: string[];
|
|
16
|
+
/** Dominant colours sampled from image elements in the design.
|
|
17
|
+
* Surfaced as a separate "Image colors" row so users can match
|
|
18
|
+
* a colour from their artwork. Empty / omitted hides the row. */
|
|
19
|
+
imageColors?: string[];
|
|
20
|
+
icon?: React.ReactNode;
|
|
21
|
+
showSquare?: boolean;
|
|
22
|
+
allowTransparent?: boolean;
|
|
23
|
+
isOpen?: boolean;
|
|
24
|
+
onOpenChange?: (isOpen: boolean) => void;
|
|
25
|
+
/** When true, renders the color picker content directly without a popover trigger button */
|
|
26
|
+
embedded?: boolean;
|
|
27
|
+
}
|
|
28
|
+
declare const ColorPickerDropdown: import('react').MemoExoticComponent<({ value, onChange, documentColors, imageColors, icon, showSquare, allowTransparent, isOpen: controlledIsOpen, onOpenChange: controlledOnOpenChange, embedded, }: ColorPickerDropdownProps) => import("react/jsx-runtime").JSX.Element>;
|
|
29
|
+
export default ColorPickerDropdown;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { BlendMode, KnockoutConfig } from '../types/index.js';
|
|
2
|
+
interface CompositingPanelProps {
|
|
3
|
+
blendMode?: BlendMode;
|
|
4
|
+
knockoutParts?: KnockoutConfig;
|
|
5
|
+
onChange: (blendMode: BlendMode, knockoutParts?: KnockoutConfig) => void;
|
|
6
|
+
}
|
|
7
|
+
declare const CompositingPanel: ({ blendMode, knockoutParts, onChange }: CompositingPanelProps) => import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
export default CompositingPanel;
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
export interface ContextualToolbarsProps {
|
|
3
|
+
/**
|
|
4
|
+
* Positioning mode for the toolbar
|
|
5
|
+
* - 'floating': Positioned relative to selected element (default)
|
|
6
|
+
* - 'embedded': Static positioning for embedding in a container
|
|
7
|
+
*/
|
|
8
|
+
mode?: 'floating' | 'embedded';
|
|
9
|
+
/**
|
|
10
|
+
* @deprecated Effects panel drawer has been replaced by inline secondary panels.
|
|
11
|
+
* Stroke, masks, distress, and knockout are now accessible directly from the toolbar.
|
|
12
|
+
*/
|
|
13
|
+
onOpenEffectsPanel?: () => void;
|
|
14
|
+
/**
|
|
15
|
+
* Callback when glyph browser should be opened
|
|
16
|
+
*/
|
|
17
|
+
onOpenGlyphBrowser?: () => void;
|
|
18
|
+
/**
|
|
19
|
+
* Callback when image should be changed
|
|
20
|
+
*/
|
|
21
|
+
onChangeImage?: () => void;
|
|
22
|
+
/**
|
|
23
|
+
* Callback when shape type drawer should be opened
|
|
24
|
+
*/
|
|
25
|
+
onOpenShapeTypeDrawer?: () => void;
|
|
26
|
+
/**
|
|
27
|
+
* Document colors for color picker
|
|
28
|
+
*/
|
|
29
|
+
documentColors?: Set<string>;
|
|
30
|
+
/**
|
|
31
|
+
* Current viewport width for responsive behavior
|
|
32
|
+
*/
|
|
33
|
+
viewportWidth?: number;
|
|
34
|
+
/**
|
|
35
|
+
* Responsive breakpoints for layout
|
|
36
|
+
* - full: All controls visible (default: 1024)
|
|
37
|
+
* - compact: Some controls in overflow menu (default: 768)
|
|
38
|
+
* - minimal: Only essential controls, rest in overflow (default: 480)
|
|
39
|
+
*/
|
|
40
|
+
breakpoints?: {
|
|
41
|
+
full?: number;
|
|
42
|
+
compact?: number;
|
|
43
|
+
minimal?: number;
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* Whether element has glyphs available
|
|
47
|
+
*/
|
|
48
|
+
hasGlyphs?: boolean;
|
|
49
|
+
/**
|
|
50
|
+
* Callback to get more menu items for text elements
|
|
51
|
+
*/
|
|
52
|
+
getMoreMenuItems?: () => Array<{
|
|
53
|
+
label: string;
|
|
54
|
+
onClick: () => void;
|
|
55
|
+
icon: React.ReactNode;
|
|
56
|
+
active?: boolean;
|
|
57
|
+
}>;
|
|
58
|
+
/**
|
|
59
|
+
* Callback when artboard is updated
|
|
60
|
+
*/
|
|
61
|
+
onArtboardUpdate?: (artboardId: string, oldProps: Record<string, unknown>, newProps: Record<string, unknown>) => void;
|
|
62
|
+
/**
|
|
63
|
+
* Artboard screen bounds for positioning toolbars
|
|
64
|
+
*/
|
|
65
|
+
artboardScreenBounds?: {
|
|
66
|
+
left: number;
|
|
67
|
+
top: number;
|
|
68
|
+
width: number;
|
|
69
|
+
height: number;
|
|
70
|
+
bottom: number;
|
|
71
|
+
centerX: number;
|
|
72
|
+
};
|
|
73
|
+
/**
|
|
74
|
+
* Maximum width for the toolbar. When set, enables flex-wrap for multi-row layout.
|
|
75
|
+
* Can be a number (pixels) or a CSS string (e.g., '100%', '400px').
|
|
76
|
+
*/
|
|
77
|
+
maxWidth?: number | string;
|
|
78
|
+
/**
|
|
79
|
+
* When true, removes the toolbar background, border, and shadow for a transparent look.
|
|
80
|
+
* Useful when embedding in a custom UI where you want only the controls visible.
|
|
81
|
+
*/
|
|
82
|
+
transparent?: boolean;
|
|
83
|
+
/**
|
|
84
|
+
* Callback when a secondary panel is expanded or collapsed.
|
|
85
|
+
* Useful for styling the container as a bottom drawer when panels are visible.
|
|
86
|
+
*/
|
|
87
|
+
onPanelExpandChange?: (expanded: boolean) => void;
|
|
88
|
+
/**
|
|
89
|
+
* Default expanded panel type. Used to open a specific panel on mount.
|
|
90
|
+
* Useful when rendering in a drawer that needs to show a specific panel.
|
|
91
|
+
*/
|
|
92
|
+
defaultExpandedPanel?: 'cornerRadius' | 'effects' | 'crop' | 'rotation' | null;
|
|
93
|
+
/**
|
|
94
|
+
* Callback when expanded panel changes, passing the panel type.
|
|
95
|
+
* Useful for tracking which specific panel is expanded.
|
|
96
|
+
*/
|
|
97
|
+
onExpandedPanelTypeChange?: (panelType: 'cornerRadius' | 'effects' | 'crop' | 'rotation' | null) => void;
|
|
98
|
+
/**
|
|
99
|
+
* Callback when crop drawer should be opened.
|
|
100
|
+
* When provided, clicking the crop button will call this instead of showing inline panel.
|
|
101
|
+
* Use this to render the crop controls in a drawer in the parent component.
|
|
102
|
+
*/
|
|
103
|
+
onOpenCropDrawer?: () => void;
|
|
104
|
+
/**
|
|
105
|
+
* Callback when corner radius drawer should be opened.
|
|
106
|
+
* When provided, clicking the corner radius button will call this instead of showing inline panel.
|
|
107
|
+
* Use this to render the corner radius controls in a drawer in the parent component.
|
|
108
|
+
*/
|
|
109
|
+
onOpenCornerRadiusDrawer?: () => void;
|
|
110
|
+
/**
|
|
111
|
+
* Style for the close button in expanded panel headers.
|
|
112
|
+
* - 'icon': Shows X icon (default)
|
|
113
|
+
* - 'done': Shows "Done" text button
|
|
114
|
+
*/
|
|
115
|
+
closeButtonStyle?: 'icon' | 'done';
|
|
116
|
+
/**
|
|
117
|
+
* Message to display when no element is selected (embedded mode only).
|
|
118
|
+
* Set to null to hide the empty state completely.
|
|
119
|
+
* Default: "Tap an element to select and edit"
|
|
120
|
+
*/
|
|
121
|
+
emptyStateMessage?: string | null;
|
|
122
|
+
/**
|
|
123
|
+
* Custom content to render when no element is selected (embedded mode only).
|
|
124
|
+
* Replaces the default emptyStateMessage text. Use for live mockup previews, etc.
|
|
125
|
+
*/
|
|
126
|
+
emptyStateRender?: React.ReactNode;
|
|
127
|
+
/**
|
|
128
|
+
* When true and no element is selected, shows artboard distress panel
|
|
129
|
+
* in the empty state slot (embedded mode only).
|
|
130
|
+
*/
|
|
131
|
+
editArtboardMode?: boolean;
|
|
132
|
+
/**
|
|
133
|
+
* Called when artboard edit mode should change (e.g. dismissed by selecting
|
|
134
|
+
* an element or clicking the "Done" button).
|
|
135
|
+
*/
|
|
136
|
+
onEditArtboardModeChange?: (active: boolean) => void;
|
|
137
|
+
/**
|
|
138
|
+
* Called when the leading layer thumbnail in the toolbar is clicked.
|
|
139
|
+
* Typical wiring: open the host app's "Manage Layers" drawer with
|
|
140
|
+
* the currently-selected layer focused. The selected layer is
|
|
141
|
+
* already tracked by EditorContext so the drawer's `LayersPanel`
|
|
142
|
+
* will highlight the right row automatically.
|
|
143
|
+
*
|
|
144
|
+
* When omitted, the thumbnail is non-interactive (just a visual
|
|
145
|
+
* indicator of the selection).
|
|
146
|
+
*/
|
|
147
|
+
onLayerThumbnailClick?: () => void;
|
|
148
|
+
}
|
|
149
|
+
export declare const ContextualToolbars: React.FC<ContextualToolbarsProps>;
|
|
150
|
+
export default ContextualToolbars;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
import { ImageElement } from '../core/ImageElement.js';
|
|
3
|
+
export interface CropPanelProps {
|
|
4
|
+
/** The image element to crop */
|
|
5
|
+
element: ImageElement;
|
|
6
|
+
/** Callback when element is updated */
|
|
7
|
+
onElementUpdate: (element: ImageElement) => void;
|
|
8
|
+
/** Optional class name for the container */
|
|
9
|
+
className?: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* CropPanel - Controls for cropping image elements
|
|
13
|
+
*
|
|
14
|
+
* Provides:
|
|
15
|
+
* - 3x3 anchor grid for selecting resize origin
|
|
16
|
+
* - Width slider (10-100%)
|
|
17
|
+
* - Height slider (10-100%)
|
|
18
|
+
*/
|
|
19
|
+
export declare const CropPanel: React.FC<CropPanelProps>;
|
|
20
|
+
export default CropPanel;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { DistressEffect } from '../types/index.js';
|
|
2
|
+
interface DistressPanelProps {
|
|
3
|
+
distressEffect?: DistressEffect;
|
|
4
|
+
onChange: (distress: DistressEffect | undefined) => void;
|
|
5
|
+
}
|
|
6
|
+
declare const DistressPanel: ({ distressEffect, onChange }: DistressPanelProps) => import("react/jsx-runtime").JSX.Element;
|
|
7
|
+
export default DistressPanel;
|