diff --git a/src/components/DesignCanvas.tsx b/src/components/DesignCanvas.tsx index c5c8f3e..edafc9b 100644 --- a/src/components/DesignCanvas.tsx +++ b/src/components/DesignCanvas.tsx @@ -1,7 +1,7 @@ 'use client'; import { useRef, useState, useEffect, useLayoutEffect, useCallback } from 'react'; -import { Stage, Layer, Text, Image as KonvaImage, Transformer, Rect } from 'react-konva'; +import { Stage, Layer, Text, TextPath, Image as KonvaImage, Transformer, Rect, Group } from 'react-konva'; import type Konva from 'konva'; import { v4 as uuid } from 'uuid'; import ProductMockup from './ProductMockup'; @@ -324,35 +324,62 @@ function PrintSurface({ /> {elements.map((el) => el.type === 'text' ? ( - { - if (node) nodeRefs.current.set(el.id, node); - }} - x={el.x} - y={el.y} - text={el.text} - fontFamily={el.fontFamily} - fontSize={el.fontSize} - fill={el.fill} - rotation={el.rotation} - draggable - listening={true} - onClick={() => setSelectedId(el.id)} - onTap={() => setSelectedId(el.id)} - onDragEnd={(e) => updateElement(el.id, { x: e.target.x(), y: e.target.y() })} - onTransformEnd={(e) => { - const node = e.target; - updateElement(el.id, { - x: node.x(), - y: node.y(), - rotation: node.rotation(), - fontSize: Math.max(8, el.fontSize * node.scaleX()), - }); - node.scaleX(1); - node.scaleY(1); - }} - /> + el.curvedPath ? ( + // Curved text path wrapped in a draggable Group + { + if (node) nodeRefs.current.set(el.id, node); + }} + x={el.x} + y={el.y} + draggable + listening={true} + onClick={() => setSelectedId(el.id)} + onTap={() => setSelectedId(el.id)} + onDragEnd={(e) => updateElement(el.id, { x: e.target.x(), y: e.target.y() })} + > + + + ) : ( + // Regular straight text + { + if (node) nodeRefs.current.set(el.id, node); + }} + x={el.x} + y={el.y} + text={el.text} + fontFamily={el.fontFamily} + fontSize={el.fontSize} + fill={el.fill} + rotation={el.rotation} + draggable + listening={true} + onClick={() => setSelectedId(el.id)} + onTap={() => setSelectedId(el.id)} + onDragEnd={(e) => updateElement(el.id, { x: e.target.x(), y: e.target.y() })} + onTransformEnd={(e) => { + const node = e.target; + updateElement(el.id, { + x: node.x(), + y: node.y(), + rotation: node.rotation(), + fontSize: Math.max(8, el.fontSize * node.scaleX()), + }); + node.scaleX(1); + node.scaleY(1); + }} + /> + ) ) : ( (product.sizes[0] ?? null); @@ -1199,6 +1279,62 @@ export default function DesignCanvas({ product }: { product: ProductDTO }) { {text.rotation || 0}° + + {/* Curved Text Controls */} +
+ + + {text.curvedPath && ( +
+ + + + + +
+ )} +
))}