@pixerate/editor-react 0.83.0 → 0.85.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/vector/useVectorEditor.ts","../../src/vector/VectorCanvas.tsx","../../src/vector/VectorWidthPointEditor.tsx","../../src/vector/VectorToolbar.tsx","../../src/vector/VectorEffectsPanel.tsx","../../src/vector/VectorAppearancePanel.tsx","../../src/vector/VectorEnvelopePanel.tsx","../../src/vector/VectorMaskPanel.tsx","../../src/vector/VectorTextPanel.tsx","../../src/vector/VectorSymbolsPanel.tsx","../../src/vector/VectorConstraintsPanel.tsx","../../src/vector/VectorFramePanel.tsx","../../src/vector/VectorConnectorPanel.tsx","../../src/vector/VectorShadingPanel.tsx","../../src/vector/VectorTracePanel.tsx","../../src/vector/VectorSymmetryPanel.tsx","../../src/vector/VectorLensPanel.tsx","../../src/vector/VectorGradientEditor.tsx","../../src/vector/VectorProviderEffectsPanel.tsx","../../src/vector/VectorEditor.tsx"],"sourcesContent":["import { useEffect, useMemo, useRef, useSyncExternalStore } from 'react';\nimport {\n VectorEditorController,\n createVectorCommands,\n createVectorEffectsToolProvider,\n type VectorEffectsToolProviderOptions,\n type VectorCommandOptions,\n type VectorEditorOptions,\n type VectorEditorState,\n type VectorTool,\n} from '@pixerate/editor/vector';\nimport type { ToolRegistry } from '@pixerate/editor/tools';\n\n/** A `VectorEditorController` created once for the component's lifetime (destroyed on unmount). */\nexport function useVectorEditorController(options: VectorEditorOptions = {}): VectorEditorController {\n const ref = useRef<VectorEditorController | null>(null);\n if (!ref.current) ref.current = new VectorEditorController(options);\n const controller = ref.current;\n useEffect(() => () => controller.destroy(), [controller]);\n return controller;\n}\n\n/** The controller's state (re-renders on every change). */\nexport function useVectorEditorState(controller: VectorEditorController): VectorEditorState {\n return useSyncExternalStore(controller.subscribe, controller.getState, controller.getState);\n}\n\nexport interface UseVectorEditorResult {\n controller: VectorEditorController;\n state: VectorEditorState;\n setTool: (tool: VectorTool) => void;\n undo: () => void;\n redo: () => void;\n deleteSelection: () => void;\n toSvg: () => string;\n}\n\n/**\n * Subscribes to a vector editor controller and exposes its state with bound actions. Pass\n * options instead of a controller to create one for the component's lifetime.\n */\nexport function useVectorEditor(controllerOrOptions: VectorEditorController | VectorEditorOptions = {}): UseVectorEditorResult {\n const own = useRef<VectorEditorController | null>(null);\n let controller: VectorEditorController;\n if (controllerOrOptions instanceof VectorEditorController) controller = controllerOrOptions;\n else {\n if (!own.current) own.current = new VectorEditorController(controllerOrOptions);\n controller = own.current;\n }\n const state = useVectorEditorState(controller);\n const actions = useMemo(\n () => ({\n setTool: (tool: VectorTool) => controller.setTool(tool),\n undo: () => void controller.undo(),\n redo: () => void controller.redo(),\n deleteSelection: () => void controller.deleteSelection(),\n toSvg: () => controller.toSvg(),\n }),\n [controller],\n );\n return { controller, state, ...actions };\n}\n\n/** Anything with `register(specs) → unregister` (a `CommandRegistry`). */\nexport interface VectorCommandTarget {\n register(specs: any): () => void;\n}\n\n/**\n * Registers the controller's palette / agent commands (`vector.addShape`, `vector.boolean`, …)\n * in `registry` while mounted, so `createCommandToolProvider` exposes them to agents.\n */\nexport function useVectorCommands(\n registry: VectorCommandTarget | null | undefined,\n controller: VectorEditorController,\n options: VectorCommandOptions = {},\n): void {\n const { prefix, group, scope } = options;\n useEffect(() => {\n if (!registry) return;\n return registry.register(createVectorCommands(controller, { prefix, group, scope }));\n }, [registry, controller, prefix, group, scope]);\n}\n\n/**\n * Registers the vector editor's provider-effect tools (`search_effects`, `apply_effect`, …) in\n * `registry` while mounted. They work once an effects provider is registered (see `useEffects`).\n */\nexport function useVectorEffectsTools(\n registry: ToolRegistry | null | undefined,\n controller: VectorEditorController,\n options: VectorEffectsToolProviderOptions = {},\n): void {\n const { id, namespace, readOnly } = options;\n useEffect(() => {\n if (!registry) return;\n return registry.register(createVectorEffectsToolProvider(controller, { id, namespace, readOnly }));\n }, [registry, controller, id, namespace, readOnly]);\n}\n","import React, { useEffect, useId, useRef, useState } from 'react';\nimport {\n VECTOR_OVERLAY_THEME as THEME,\n getVectorOverlayRenderData,\n getVectorSceneRenderData,\n getVectorSymbolEditBackground,\n isVectorTextTarget,\n toVectorKeyInput,\n toVectorPointerInput,\n vectorDiamondPath,\n type VectorEditorController,\n type VectorRenderNode,\n type VectorRenderMask,\n type VectorRenderPath,\n type VectorRenderPaintLayer,\n type VectorRenderFilter,\n type VectorFilterPrimitive,\n type SvgGradientDef,\n type VectorPaintDef,\n type VectorRenderGradientAnnotator,\n type VectorRenderText,\n} from '@pixerate/editor/vector';\nimport { useVectorEditorState } from './useVectorEditor';\nimport { VectorWidthPointEditor } from './VectorWidthPointEditor';\n\nexport interface VectorCanvasProps {\n controller: VectorEditorController;\n /** Fit the artboard into the canvas when it first gets a size (default `true`). */\n fitOnMount?: boolean;\n /** Draw a checkerboard behind a transparent artboard (default `true`). */\n checkerboard?: boolean;\n /** Overlay accent colour (default sky blue). */\n accentColor?: string;\n /** Smart guide colour (default magenta). */\n guideColor?: string;\n className?: string;\n style?: React.CSSProperties;\n /** Accessible label (default \"Vector canvas\"). */\n 'aria-label'?: string;\n}\n\nfunction GradientElement({ def }: { def: SvgGradientDef }) {\n const stops = def.stops.map((s, i) => <stop key={i} offset={s.offset} stopColor={s.stopColor} stopOpacity={s.stopOpacity} />);\n return def.type === 'radial' ? (\n <radialGradient id={def.id} {...(def.attrs as any)}>\n {stops}\n </radialGradient>\n ) : (\n <linearGradient id={def.id} {...(def.attrs as any)}>\n {stops}\n </linearGradient>\n );\n}\n\n/**\n * Renders paint servers: `<linearGradient>` / `<radialGradient>` descriptors and patterns of\n * gradient tiles (conic, diamond and stroke-mode gradients).\n */\nexport function VectorGradientDefs({ defs }: { defs: readonly VectorPaintDef[] }) {\n if (!defs.length) return null;\n return (\n <defs>\n {defs.map((def) =>\n def.type === 'pattern' ? (\n <pattern key={def.id} id={def.id} {...(def.attrs as any)}>\n {def.gradients.map((g) => (\n <GradientElement key={g.id} def={g} />\n ))}\n {def.tiles.map((t, i) => (\n <path key={i} d={t.d} fill={t.fill} />\n ))}\n </pattern>\n ) : (\n <GradientElement key={def.id} def={def} />\n )\n )}\n </defs>\n );\n}\n\n/** The gradient tool's annotator (screen space): extent, bar, handles, stop chips and midpoints. */\nexport function VectorGradientAnnotator({ annotator: g, accentColor = THEME.accent }: { annotator: VectorRenderGradientAnnotator; accentColor?: string }) {\n const r = THEME.handleRadius + 1.5;\n const ring = (p: { x: number; y: number; hovered: boolean }, part: string, size = r) => (\n <circle data-vector-gradient-handle={part} cx={p.x} cy={p.y} r={size + (p.hovered ? 1 : 0)} fill={THEME.handleFill} stroke={accentColor} strokeWidth={p.hovered ? 2 : 1} />\n );\n return (\n <g data-vector-gradient-annotator={g.type}>\n {g.extent && <path data-vector-gradient-extent=\"\" d={g.extent} fill=\"none\" stroke={accentColor} strokeDasharray=\"4 3\" />}\n <line x1={g.start.x} y1={g.start.y} x2={g.end.x} y2={g.end.y} stroke=\"#ffffff\" strokeWidth={3} />\n <line data-vector-gradient-bar=\"\" x1={g.start.x} y1={g.start.y} x2={g.end.x} y2={g.end.y} stroke={accentColor} />\n {g.aspect && <line x1={g.start.x} y1={g.start.y} x2={g.aspect.x} y2={g.aspect.y} stroke={accentColor} strokeDasharray=\"2 2\" />}\n {ring(g.start, 'start')}\n <rect\n data-vector-gradient-handle={g.end.handle}\n x={g.end.x - r}\n y={g.end.y - r}\n width={2 * r}\n height={2 * r}\n fill={THEME.handleFill}\n stroke={accentColor}\n strokeWidth={g.end.hovered ? 2 : 1}\n />\n {g.aspect && ring(g.aspect, 'aspect', THEME.handleRadius)}\n {g.focal && (\n <g data-vector-gradient-handle=\"focal\">\n <circle cx={g.focal.x} cy={g.focal.y} r={THEME.handleRadius - 1 + (g.focal.hovered ? 1 : 0)} fill={accentColor} stroke={THEME.handleFill} />\n </g>\n )}\n {g.midpoints.map((m) => (\n <path key={m.index} data-vector-gradient-midpoint={m.index} d={vectorDiamondPath(m.x, m.y, 4 + (m.hovered ? 1 : 0))} fill={THEME.handleFill} stroke={accentColor} />\n ))}\n {g.stops.map((s) => (\n <g key={s.index} data-vector-gradient-stop={s.index} data-selected={s.selected || undefined} opacity={g.removing && s.selected ? 0.35 : 1}>\n <line x1={s.barX} y1={s.barY} x2={s.x} y2={s.y} stroke={accentColor} />\n <rect x={s.x - 5} y={s.y - 5} width={10} height={10} rx={2} fill={s.color} fillOpacity={s.opacity} stroke={s.selected ? accentColor : '#ffffff'} strokeWidth={s.selected || s.hovered ? 2 : 1} />\n <rect x={s.x - 6.5} y={s.y - 6.5} width={13} height={13} rx={3} fill=\"none\" stroke={s.selected ? '#ffffff' : accentColor} />\n </g>\n ))}\n </g>\n );\n}\n\n/** SVG `<filter>` elements for `getVectorSceneRenderData(...).filters` (shadows, glows, blurs, feather). */\nexport function VectorFilterDefs({ filters }: { filters: readonly VectorRenderFilter[] }) {\n if (!filters.length) return null;\n // React wants presentation attributes camel-cased (`flood-color` → `floodColor`).\n const props = (attrs: VectorFilterPrimitive['attrs']) => Object.fromEntries(Object.entries(attrs).map(([k, v]) => [k.replace(/-([a-z])/g, (_, c: string) => c.toUpperCase()), v]));\n const primitive = (p: VectorFilterPrimitive, key: number): React.ReactNode =>\n React.createElement(p.tag, { key, ...props(p.attrs) }, p.children?.map(primitive));\n return (\n <defs>\n {filters.map((f) => (\n <filter key={f.id} id={f.id} filterUnits=\"userSpaceOnUse\" x={f.x} y={f.y} width={f.width} height={f.height} colorInterpolationFilters=\"sRGB\">\n {f.primitives.map(primitive)}\n </filter>\n ))}\n </defs>\n );\n}\n\nconst blendStyle = (blendMode: string | undefined): React.CSSProperties | undefined => (blendMode ? { mixBlendMode: blendMode as React.CSSProperties['mixBlendMode'] } : undefined);\n\n/**\n * Text drawn as SVG text: one `<text>` per paint layer, every span a `<tspan>` placed character by\n * character (the layout is the editor's, not the browser's).\n */\nexport function VectorTextElement({ node }: { node: VectorRenderText }) {\n return (\n <g data-vector-id={node.id} data-vector-text=\"\" transform={node.transform} opacity={node.opacity < 1 ? node.opacity : undefined} filter={node.filter} style={blendStyle(node.blendMode)}>\n {node.layers.map((layer, i) => (\n <text\n key={i}\n data-vector-layer={layer.kind}\n xmlSpace=\"preserve\"\n fill={layer.fill}\n stroke={layer.stroke}\n strokeWidth={layer.stroke === 'none' ? undefined : layer.strokeWidth}\n strokeLinejoin={layer.strokeLinejoin as any}\n strokeDasharray={layer.strokeDasharray}\n opacity={layer.opacity < 1 ? layer.opacity : undefined}\n style={{ whiteSpace: 'pre', ...blendStyle(layer.blendMode) }}\n >\n {node.spans.map((sp, k) => (\n <tspan\n key={k}\n x={sp.x}\n y={sp.y}\n rotate={sp.rotate}\n fontFamily={sp.fontFamily}\n fontSize={sp.fontSize}\n fontWeight={sp.fontWeight}\n fontStyle={sp.fontStyle}\n textDecoration={sp.textDecoration}\n fill={layer.runFills && sp.fill ? sp.fill : undefined}\n >\n {sp.text}\n </tspan>\n ))}\n </text>\n ))}\n </g>\n );\n}\n\n/** Renders scene nodes (paths, text and groups) from `getVectorSceneRenderData`. */\nexport function VectorSceneNodes({ nodes }: { nodes: readonly VectorRenderNode[] }) {\n return (\n <>\n {nodes.map((node) => (\n <VectorSceneNode key={node.id} node={node} />\n ))}\n </>\n );\n}\n\n/**\n * One scene node. Memoised on the node object: the scene data hands back the same object for a\n * node an edit did not touch, so only changed nodes re-render.\n */\nconst VectorSceneNode = React.memo(function VectorSceneNode({ node }: { node: VectorRenderNode }) {\n if (node.kind === 'text') return <VectorTextElement node={node} />;\n if (node.kind === 'group')\n return (\n <g data-vector-id={node.id} data-vector-mask={node.mask?.type} transform={node.transform} opacity={node.opacity < 1 ? node.opacity : undefined} filter={node.filter} style={blendStyle(node.blendMode)}>\n {node.mask ? <VectorMaskedNodes mask={node.mask} nodes={node.children} /> : <VectorSceneNodes nodes={node.children} />}\n </g>\n );\n if (node.layers)\n return (\n // Fill and stroke stacks: each layer in order, bottom to top.\n <g data-vector-id={node.id} transform={node.transform} opacity={node.opacity < 1 ? node.opacity : undefined} filter={node.filter} style={blendStyle(node.blendMode)}>\n {node.layers.map((layer) => (\n <VectorPaintPath key={`${layer.kind}-${layer.index}`} paint={layer} d={node.d} fillRule={node.fillRule} layer={`${layer.kind}-${layer.index}`} />\n ))}\n </g>\n );\n return <VectorPaintPath paint={node} d={node.d} fillRule={node.fillRule} id={node.id} transform={node.transform} filter={node.filter} blendMode={node.blendMode} />;\n});\n\n/**\n * A mask group's contents under its mask: the `<clipPath>` (clip) or `<mask>` (alpha, luminance;\n * the mask drawn inside, through the inverting filter when inverted), and an inner `<g>` that\n * references it. The group's own transform, opacity, blend mode and filter are on the outer `<g>`.\n */\nexport function VectorMaskedNodes({ mask, nodes }: { mask: VectorRenderMask; nodes: readonly VectorRenderNode[] }) {\n const b = mask.bounds;\n return (\n <>\n <defs>\n {mask.clip ? (\n <clipPath id={mask.id}>\n {mask.clip.map((c, i) => (\n <path key={i} d={c.d} clipRule={c.clipRule} />\n ))}\n </clipPath>\n ) : (\n b && (\n <mask id={mask.id} maskUnits=\"userSpaceOnUse\" x={b.x} y={b.y} width={b.width} height={b.height} style={mask.type === 'alpha' ? { maskType: 'alpha' } : undefined}>\n {mask.filter ? (\n <g filter={mask.filter}>\n <VectorSceneNodes nodes={mask.nodes ?? []} />\n </g>\n ) : (\n <VectorSceneNodes nodes={mask.nodes ?? []} />\n )}\n </mask>\n )\n )}\n </defs>\n <g data-vector-masked=\"\" clipPath={mask.clip ? `url(#${mask.id})` : undefined} mask={mask.clip ? undefined : `url(#${mask.id})`}>\n <VectorSceneNodes nodes={nodes} />\n </g>\n </>\n );\n}\n\n/**\n * One paint of a path: a node's fill and stroke, or one layer of its stacks. A stroke aligned\n * inside / outside (double width, clipped or masked by the shape) or with arrowheads draws in\n * parts inside a group.\n */\nfunction VectorPaintPath({\n paint,\n d,\n fillRule,\n id,\n transform,\n filter,\n blendMode,\n layer,\n}: {\n paint: VectorRenderPaintLayer | VectorRenderPath;\n d: string;\n fillRule: 'nonzero' | 'evenodd';\n id?: string;\n transform?: string;\n filter?: string;\n blendMode?: string;\n layer?: string;\n}) {\n const opacity = paint.opacity < 1 ? paint.opacity : undefined;\n // A node's blend mode is passed in; a layer carries its own.\n const style = blendStyle(blendMode ?? (layer ? paint.blendMode : undefined));\n const sp = paint.strokeParts;\n if (!sp)\n return (\n <path\n data-vector-id={id}\n data-vector-layer={layer}\n transform={transform}\n d={d}\n fill={paint.fill}\n fillRule={fillRule}\n stroke={paint.stroke}\n strokeWidth={paint.stroke === 'none' ? undefined : paint.strokeWidth}\n strokeLinecap={paint.strokeLinecap as any}\n strokeLinejoin={paint.strokeLinejoin as any}\n strokeDasharray={paint.strokeDasharray}\n opacity={opacity}\n filter={filter}\n style={style}\n />\n );\n const clip = sp.clip;\n const b = clip?.bounds;\n return (\n <g data-vector-id={id} data-vector-layer={layer} data-vector-stroke-align={sp.align} transform={transform} opacity={opacity} filter={filter} style={style}>\n {clip && b && (\n <defs>\n {clip.kind === 'clip' ? (\n <clipPath id={clip.id}>\n <path d={d} clipRule={fillRule} />\n </clipPath>\n ) : (\n <mask id={clip.id} maskUnits=\"userSpaceOnUse\" x={b.x} y={b.y} width={b.width} height={b.height}>\n <rect x={b.x} y={b.y} width={b.width} height={b.height} fill=\"#fff\" />\n <path d={d} fill=\"#000\" fillRule={fillRule} />\n </mask>\n )}\n </defs>\n )}\n <path data-vector-part=\"fill\" d={d} fill={paint.fill} fillRule={fillRule} stroke=\"none\" />\n {sp.outline !== undefined ? (\n // A variable-width stroke: its outline, filled.\n <path\n data-vector-part=\"stroke-outline\"\n d={sp.outline}\n fill={paint.stroke}\n clipPath={clip?.kind === 'clip' ? `url(#${clip.id})` : undefined}\n mask={clip?.kind === 'mask' ? `url(#${clip.id})` : undefined}\n />\n ) : (\n <path\n data-vector-part=\"stroke\"\n d={sp.d}\n fill=\"none\"\n stroke={paint.stroke}\n strokeWidth={sp.width}\n strokeLinecap={paint.strokeLinecap as any}\n strokeLinejoin={paint.strokeLinejoin as any}\n strokeDasharray={paint.strokeDasharray}\n clipPath={clip?.kind === 'clip' ? `url(#${clip.id})` : undefined}\n mask={clip?.kind === 'mask' ? `url(#${clip.id})` : undefined}\n />\n )}\n {sp.heads.map((head, i) => (\n <path key={i} data-vector-part=\"head\" d={head} fill={paint.stroke} />\n ))}\n </g>\n );\n}\n\n/**\n * An SVG canvas for a `VectorEditorController`: draws the document and the editing overlay\n * and forwards pointer, wheel, keyboard and clipboard events. Focus it to use shortcuts.\n */\nexport function VectorCanvas({\n controller,\n fitOnMount = true,\n checkerboard = true,\n accentColor = THEME.accent,\n guideColor = THEME.guide,\n className,\n style,\n 'aria-label': ariaLabel = 'Vector canvas',\n}: VectorCanvasProps) {\n const state = useVectorEditorState(controller);\n const svgRef = useRef<SVGSVGElement | null>(null);\n const textRef = useRef<HTMLTextAreaElement | null>(null);\n const editingText = state.textEdit?.nodeId ?? null;\n const fitted = useRef(!fitOnMount);\n const uid = useId().replace(/:/g, '');\n // The canvas size, so the scene leaves out what is off screen and simplifies what is tiny.\n const [size, setSize] = useState<{ width: number; height: number } | null>(null);\n const scene = getVectorSceneRenderData(state, { idPrefix: `ve${uid}-`, ...(size ? { viewportSize: size } : {}) });\n const overlay = getVectorOverlayRenderData(state);\n // Isolation mode: the rest of the document, dimmed behind the symbol's art.\n const host = getVectorSymbolEditBackground(state, { idPrefix: `ve${uid}-host-` });\n\n useEffect(() => {\n const el = svgRef.current;\n if (!el || fitted.current) return;\n const fit = () => {\n const rect = el.getBoundingClientRect();\n if (fitted.current || rect.width <= 0 || rect.height <= 0) return;\n fitted.current = true;\n controller.zoomToFit({ width: rect.width, height: rect.height });\n };\n fit();\n if (fitted.current || typeof ResizeObserver === 'undefined') return;\n const observer = new ResizeObserver(fit);\n observer.observe(el);\n return () => observer.disconnect();\n }, [controller]);\n\n useEffect(() => {\n const el = svgRef.current;\n if (!el || typeof ResizeObserver === 'undefined') return;\n const measure = () => {\n const r = el.getBoundingClientRect();\n if (r.width > 0 && r.height > 0) setSize((s) => (s && s.width === r.width && s.height === r.height ? s : { width: r.width, height: r.height }));\n };\n measure();\n const observer = new ResizeObserver(measure);\n observer.observe(el);\n return () => observer.disconnect();\n }, []);\n\n // Typing goes into a hidden textarea while text is edited (focused after the click that started it).\n useEffect(() => {\n if (!editingText) return;\n const t = setTimeout(() => textRef.current?.focus({ preventScroll: true }), 0);\n return () => clearTimeout(t);\n }, [editingText]);\n\n // Wheel needs a non-passive listener to stop page scroll / browser zoom.\n useEffect(() => {\n const el = svgRef.current;\n if (!el) return;\n const onWheel = (e: WheelEvent) => {\n e.preventDefault();\n controller.wheel(local(e), { x: e.deltaX, y: e.deltaY }, toVectorPointerInput(e));\n };\n el.addEventListener('wheel', onWheel, { passive: false });\n return () => el.removeEventListener('wheel', onWheel);\n }, [controller]);\n\n const local = (e: { clientX: number; clientY: number }) => {\n const rect = svgRef.current?.getBoundingClientRect();\n return { x: e.clientX - (rect?.left ?? 0), y: e.clientY - (rect?.top ?? 0) };\n };\n\n const clipboard = (kind: 'copy' | 'cut' | 'paste') => (event: React.ClipboardEvent) => {\n const native = (event && 'nativeEvent' in event ? event.nativeEvent : event) as ClipboardEvent;\n const data = native?.clipboardData;\n if (kind === 'paste') {\n const text = data?.getData('text/plain') ?? '';\n const pasted = text ? controller.paste(text) : controller.paste();\n if (pasted.length) event.preventDefault?.();\n return;\n }\n const text = kind === 'cut' ? controller.cut() : controller.copy();\n if (text && data) {\n data.setData('text/plain', text);\n event.preventDefault?.();\n }\n };\n\n const hs = THEME.transformHandleSize;\n const as = THEME.anchorSize;\n const box = overlay.selectionBox;\n const edit = state.widthPointEdit;\n const editAt = edit && { x: edit.point.x * state.viewport.zoom + state.viewport.x, y: edit.point.y * state.viewport.zoom + state.viewport.y };\n\n return (\n <svg\n ref={svgRef}\n role=\"application\"\n aria-label={ariaLabel}\n tabIndex={0}\n data-tool={state.tool}\n className={className}\n style={{ display: 'block', width: '100%', height: '100%', outline: 'none', touchAction: 'none', userSelect: 'none', cursor: state.cursor, ...style }}\n onPointerDown={(e) => {\n svgRef.current?.focus({ preventScroll: true });\n (e.currentTarget as Element).setPointerCapture?.(e.pointerId);\n controller.pointerDown(local(e), toVectorPointerInput(e));\n }}\n onPointerMove={(e) => controller.pointerMove(local(e), toVectorPointerInput(e))}\n onPointerUp={(e) => {\n (e.currentTarget as Element).releasePointerCapture?.(e.pointerId);\n controller.pointerUp(local(e), toVectorPointerInput(e));\n }}\n onPointerCancel={() => controller.cancelDrag()}\n onPointerLeave={() => controller.pointerLeave()}\n onDoubleClick={(e) => controller.doubleClick(local(e))}\n onKeyDown={(e) => {\n if (isVectorTextTarget(e.target)) return;\n if (controller.keyDown(toVectorKeyInput(e))) e.preventDefault();\n }}\n onKeyUp={(e) => controller.keyUp(toVectorKeyInput(e))}\n onCopy={clipboard('copy')}\n onCut={clipboard('cut')}\n onPaste={clipboard('paste')}\n >\n {checkerboard && (\n <defs>\n <pattern id={`ve${uid}-checker`} width={16} height={16} patternUnits=\"userSpaceOnUse\">\n <rect width={16} height={16} fill=\"#ffffff\" />\n <rect width={8} height={8} fill=\"#e5e7eb\" />\n <rect x={8} y={8} width={8} height={8} fill=\"#e5e7eb\" />\n </pattern>\n </defs>\n )}\n <VectorGradientDefs defs={scene.defs} />\n <VectorFilterDefs filters={scene.filters} />\n <rect\n data-vector-artboard=\"\"\n x={overlay.artboard.x}\n y={overlay.artboard.y}\n width={overlay.artboard.width}\n height={overlay.artboard.height}\n fill={scene.background ?? (checkerboard ? `url(#ve${uid}-checker)` : '#ffffff')}\n stroke=\"rgba(0,0,0,0.12)\"\n />\n {host && (\n <g data-vector-symbol-host=\"\" opacity={0.3} pointerEvents=\"none\" transform={host.transform}>\n <VectorGradientDefs defs={host.defs} />\n <VectorFilterDefs filters={host.filters} />\n <VectorSceneNodes nodes={host.nodes} />\n </g>\n )}\n <g data-vector-scene=\"\" transform={scene.transform}>\n <VectorSceneNodes nodes={scene.nodes} />\n </g>\n {overlay.frames.length > 0 && (\n <g data-vector-frame-labels=\"\">\n {overlay.frames.map((f) => (\n <text\n key={f.id}\n data-vector-frame-label={f.id}\n x={f.x}\n y={f.y - 6}\n fontSize={11}\n fontWeight={f.selected ? 600 : 400}\n fill={f.selected ? accentColor : '#737373'}\n style={{ fontFamily: 'system-ui, sans-serif', cursor: 'default', userSelect: 'none' }}\n onPointerDown={(e) => {\n // A frame's name selects it (clicking inside a frame may pick its contents).\n e.stopPropagation();\n controller.select([f.id]);\n }}\n >\n {f.name}\n </text>\n ))}\n </g>\n )}\n <g data-vector-overlay=\"\" pointerEvents=\"none\" fill=\"none\">\n {overlay.outlines.map((o) => (\n <path key={o.id} d={o.d} stroke={accentColor} strokeWidth={o.selected ? 1 : 1.5} opacity={o.selected ? 1 : 0.7} />\n ))}\n {overlay.penPreview && <path d={overlay.penPreview} stroke={accentColor} strokeDasharray=\"4 3\" />}\n {box && (\n <g data-vector-selection=\"\" data-free-distort={box.freeDistort || undefined} transform={box.transform || undefined}>\n <rect x={box.x} y={box.y} width={box.width} height={box.height} stroke={accentColor} />\n <line x1={box.x + box.width / 2} y1={box.y} x2={box.x + box.width / 2} y2={box.y - 24} stroke={accentColor} />\n {box.handles.map((h) =>\n h.handle === 'rotate' ? (\n <circle key={h.handle} data-handle={h.handle} cx={h.x} cy={h.y} r={hs / 2 + 1} fill={THEME.handleFill} stroke={accentColor} />\n ) : (\n <rect key={h.handle} data-handle={h.handle} x={h.x - hs / 2} y={h.y - hs / 2} width={hs} height={hs} fill={THEME.handleFill} stroke={accentColor} />\n ),\n )}\n </g>\n )}\n {overlay.distort && (\n <g data-vector-distort={overlay.distort.mode}>\n <path d={overlay.distort.d} stroke={accentColor} />\n {overlay.distort.corners.map((c, i) => (\n <rect key={i} x={c.x - hs / 2} y={c.y - hs / 2} width={hs} height={hs} fill={THEME.handleFill} stroke={accentColor} />\n ))}\n </g>\n )}\n {overlay.envelope && (\n <g data-vector-envelope-mesh={overlay.envelope.nodeId}>\n <path data-vector-envelope-grid=\"\" d={overlay.envelope.grid} stroke={accentColor} strokeOpacity={0.8} />\n {overlay.envelope.handles.map((h) => (\n <g key={h.index} data-vector-envelope-handle={h.index}>\n <line x1={h.anchorX} y1={h.anchorY} x2={h.x} y2={h.y} stroke={accentColor} strokeOpacity={0.6} />\n <circle cx={h.x} cy={h.y} r={THEME.handleRadius + (h.hovered || h.active ? 1 : 0)} fill={h.active ? accentColor : THEME.handleFill} stroke={accentColor} />\n </g>\n ))}\n {overlay.envelope.anchors.map((a) => {\n const size = as + (a.hovered || a.active ? 2 : 0);\n return <rect key={a.index} data-vector-envelope-anchor={a.index} x={a.x - size / 2} y={a.y - size / 2} width={size} height={size} fill={a.active ? accentColor : THEME.handleFill} stroke={accentColor} />;\n })}\n </g>\n )}\n {overlay.handles.map((h) => (\n <g key={`${h.ref.nodeId}:${h.ref.subpath}:${h.ref.index}:${h.ref.handle}`} data-vector-handle={h.ref.handle}>\n <line x1={h.anchorX} y1={h.anchorY} x2={h.x} y2={h.y} stroke={accentColor} />\n <circle cx={h.x} cy={h.y} r={THEME.handleRadius + (h.hovered ? 1 : 0)} fill={THEME.handleFill} stroke={accentColor} />\n </g>\n ))}\n {overlay.anchors.map((a) => {\n const size = as + (a.hovered ? 2 : 0);\n const fill = a.selected ? accentColor : THEME.handleFill;\n const key = `${a.ref.nodeId}:${a.ref.subpath}:${a.ref.index}`;\n return a.type === 'corner' ? (\n <rect key={key} data-vector-anchor={a.ref.index} x={a.x - size / 2} y={a.y - size / 2} width={size} height={size} fill={fill} stroke={accentColor} />\n ) : (\n <circle key={key} data-vector-anchor={a.ref.index} cx={a.x} cy={a.y} r={size / 2} fill={fill} stroke={accentColor} />\n );\n })}\n {overlay.cornerWidgets.map((w) => (\n <g key={`corner:${w.ref.nodeId}:${w.ref.subpath}:${w.ref.index}`} data-vector-corner-widget={w.ref.index} data-corner-kind={w.kind}>\n <circle cx={w.x} cy={w.y} r={THEME.cornerWidgetRadius + (w.hovered ? 1 : 0)} fill={THEME.handleFill} stroke={accentColor} />\n <circle cx={w.x} cy={w.y} r={1.5} fill={accentColor} />\n </g>\n ))}\n {overlay.masks.map((m) => (\n <path\n key={`mask:${m.id}`}\n data-vector-mask-indicator={m.id}\n data-mask-type={m.type}\n data-inverted={m.invert || undefined}\n d={m.d}\n fill=\"none\"\n stroke={THEME.mask}\n strokeWidth={m.editing ? 1.5 : 1}\n strokeDasharray={m.editing ? undefined : THEME.maskDash}\n opacity={m.enabled ? 1 : 0.5}\n />\n ))}\n {overlay.blend.spines.map((sp) => (\n <g key={`blend:${sp.id}`} data-vector-blend-spine={sp.id} data-replaced={sp.replaced || undefined}>\n <path d={sp.d} fill=\"none\" stroke={accentColor} strokeDasharray=\"4 3\" />\n {sp.keys.map((k, i) => (\n <circle key={i} cx={k.x} cy={k.y} r={THEME.handleRadius} fill={THEME.handleFill} stroke={accentColor} />\n ))}\n </g>\n ))}\n {overlay.blend.start && (\n <g data-vector-blend-start=\"\">\n <path d={overlay.blend.start.d} fill=\"none\" stroke={accentColor} strokeWidth={2} />\n {overlay.blend.start.anchor && <circle cx={overlay.blend.start.anchor.x} cy={overlay.blend.start.anchor.y} r={THEME.handleRadius + 1} fill={accentColor} />}\n </g>\n )}\n {overlay.blend.anchors.map((a, i) => (\n <rect\n key={`blend-anchor:${i}`}\n data-vector-blend-anchor={i}\n x={a.x - as / 2}\n y={a.y - as / 2}\n width={as}\n height={as}\n fill={a.hovered ? accentColor : THEME.handleFill}\n stroke={accentColor}\n />\n ))}\n {overlay.gradient && <VectorGradientAnnotator annotator={overlay.gradient} accentColor={accentColor} />}\n {overlay.widthSpot && (\n <g data-vector-width-spot=\"\">\n <line x1={overlay.widthSpot.left.x} y1={overlay.widthSpot.left.y} x2={overlay.widthSpot.right.x} y2={overlay.widthSpot.right.y} stroke={accentColor} strokeDasharray=\"3 2\" />\n <path d={vectorDiamondPath(overlay.widthSpot.x, overlay.widthSpot.y)} fill=\"none\" stroke={accentColor} />\n </g>\n )}\n {overlay.widthPoints.map((w) => (\n <g key={`width:${w.ref.nodeId}:${w.ref.subpath}:${w.ref.index}`} data-vector-width-point={w.ref.index} data-selected={w.selected || undefined}>\n <line x1={w.left.x} y1={w.left.y} x2={w.right.x} y2={w.right.y} stroke={accentColor} />\n <path d={vectorDiamondPath(w.x, w.y)} fill={w.selected || w.active ? accentColor : THEME.handleFill} stroke={accentColor} strokeWidth={w.hovered === 'center' ? 2 : 1} />\n {(['left', 'right'] as const).map((side) => (\n <circle key={side} data-vector-width-side={side} cx={w[side].x} cy={w[side].y} r={THEME.handleRadius + (w.hovered === side ? 1 : 0)} fill={THEME.handleFill} stroke={accentColor} />\n ))}\n </g>\n ))}\n {state.tool === 'pen' && overlay.anchors.some((a) => a.closes && a.hovered) && (\n <circle cx={overlay.anchors.find((a) => a.closes)!.x} cy={overlay.anchors.find((a) => a.closes)!.y} r={as} stroke={accentColor} />\n )}\n {overlay.builder && (\n <g data-vector-builder={overlay.builder.mode}>\n {overlay.builder.faces.map((d, i) => (\n <path\n key={`f${i}`}\n data-vector-builder-face=\"\"\n d={d}\n fill={overlay.builder!.mode === 'erase' ? THEME.builderEraseFill : THEME.builderFill}\n fillRule=\"nonzero\"\n stroke={overlay.builder!.mode === 'erase' ? THEME.builderErase : accentColor}\n strokeWidth={1}\n />\n ))}\n {overlay.builder.hatches.map((d, i) =>\n d ? (\n <path\n key={`h${i}`}\n data-vector-builder-hatch=\"\"\n d={d}\n fill=\"none\"\n stroke={overlay.builder!.mode === 'erase' ? THEME.builderErase : accentColor}\n strokeOpacity={THEME.builderHatchOpacity}\n strokeWidth={1}\n />\n ) : null\n )}\n {overlay.builder.lines.map((d, i) => (\n <path key={`l${i}`} data-vector-builder-line=\"\" d={d} fill=\"none\" stroke={THEME.builderErase} strokeWidth={3} strokeLinecap=\"round\" />\n ))}\n {overlay.builder.trail && <path data-vector-builder-trail=\"\" d={overlay.builder.trail} fill=\"none\" stroke={overlay.builder.mode === 'erase' ? THEME.builderErase : accentColor} strokeWidth={1} />}\n </g>\n )}\n {overlay.toolStroke && (\n <path\n data-vector-tool-stroke={overlay.toolStroke.tool}\n d={overlay.toolStroke.d}\n stroke={overlay.toolStroke.tool === 'eraser' ? THEME.eraserFill : accentColor}\n strokeWidth={overlay.toolStroke.tool === 'eraser' ? overlay.toolStroke.width : 1}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeDasharray={overlay.toolStroke.tool === 'knife' ? '5 3' : undefined}\n />\n )}\n {overlay.pencilString && (\n <line\n data-vector-pencil-string=\"\"\n x1={overlay.pencilString.x1}\n y1={overlay.pencilString.y1}\n x2={overlay.pencilString.x2}\n y2={overlay.pencilString.y2}\n stroke={accentColor}\n strokeDasharray=\"2 2\"\n />\n )}\n {overlay.cutPoint && <circle data-vector-cut-point=\"\" cx={overlay.cutPoint.x} cy={overlay.cutPoint.y} r={THEME.handleRadius + 1} fill={THEME.handleFill} stroke={accentColor} />}\n {overlay.text && (\n <g data-vector-text-edit={overlay.text.nodeId} data-editing={overlay.text.editing || undefined}>\n <path d={overlay.text.frame} stroke={accentColor} strokeDasharray={overlay.text.editing ? '3 2' : undefined} opacity={0.8} />\n {overlay.text.selection.map((d, i) => (\n <path key={i} data-vector-text-selection=\"\" d={d} fill={accentColor} fillOpacity={0.25} stroke=\"none\" />\n ))}\n {overlay.text.caret && (\n <line data-vector-text-caret=\"\" x1={overlay.text.caret.x1} y1={overlay.text.caret.y1} x2={overlay.text.caret.x2} y2={overlay.text.caret.y2} stroke={accentColor} strokeWidth={1.5} />\n )}\n {overlay.text.overflow && (\n <g data-vector-text-overflow=\"\" transform={`translate(${overlay.text.overflow.x} ${overlay.text.overflow.y})`}>\n <rect x={-5} y={-5} width={10} height={10} fill={THEME.handleFill} stroke=\"#dc2626\" />\n <path d=\"M-3 0H3M0 -3V3\" stroke=\"#dc2626\" />\n </g>\n )}\n </g>\n )}\n {overlay.shading.map((sh) => (\n <g key={`shading:${sh.nodeId}`} data-vector-shading={sh.kind}>\n {sh.lines.map((d, i) => (\n <path key={i} d={d} stroke={accentColor} strokeWidth={1} opacity={0.7} />\n ))}\n {sh.points.map((p) => (\n <circle key={p.index} data-vector-shading-point={p.index} data-selected={p.selected || undefined} cx={p.x} cy={p.y} r={p.selected ? 6 : 4.5} fill={p.color} stroke={p.selected ? accentColor : '#ffffff'} strokeWidth={p.selected ? 2 : 1.5} />\n ))}\n </g>\n ))}\n {overlay.symmetry.map((sy) => (\n <g key={`sym:${sy.nodeId}`} data-vector-symmetry-axes={sy.nodeId} stroke={accentColor} strokeDasharray={sy.drawing ? undefined : '6 4'} opacity={sy.drawing ? 0.9 : 0.6}>\n {sy.lines.map((l, i) => (\n <line key={i} x1={l.x1} y1={l.y1} x2={l.x2} y2={l.y2} />\n ))}\n </g>\n ))}\n {overlay.trackingPoints.map((t, i) => (\n <path key={`track:${i}`} data-vector-tracking-point=\"\" d={`M${t.x - 5} ${t.y}H${t.x + 5}M${t.x} ${t.y - 5}V${t.y + 5}`} stroke={guideColor} strokeWidth={1.5} />\n ))}\n {overlay.typedEntry && (\n <g data-vector-typed-entry=\"\" transform={`translate(${overlay.typedEntry.x + 14} ${overlay.typedEntry.y + 18})`}>\n <rect x={-3} y={-12} width={overlay.typedEntry.text.length * 7 + 8} height={17} rx={3} fill={THEME.handleFill} stroke={accentColor} />\n <text x={1} y={1} fontSize={11} fill={accentColor} style={{ fontFamily: 'ui-monospace, monospace' }}>\n {overlay.typedEntry.text}\n </text>\n </g>\n )}\n {overlay.connectorSites.map((s) => (\n <circle\n key={`site:${s.nodeId}:${s.side}`}\n data-vector-connection-site={s.side}\n data-active={s.active || undefined}\n cx={s.x}\n cy={s.y}\n r={s.active ? 5 : 3.5}\n fill={s.active ? accentColor : THEME.handleFill}\n stroke={accentColor}\n />\n ))}\n {overlay.constraints.map((c) => (\n <g key={`constraint:${c.id}`} data-vector-constraint-glyph={c.kind} data-satisfied={c.satisfied ? 'true' : 'false'}>\n {c.dimension && <line x1={c.dimension.x1} y1={c.dimension.y1} x2={c.dimension.x2} y2={c.dimension.y2} stroke={c.satisfied ? THEME.guide : '#dc2626'} strokeDasharray=\"2 2\" />}\n <text x={c.x} y={c.y} fontSize={10} textAnchor=\"middle\" fill={c.satisfied ? accentColor : '#dc2626'} stroke=\"#ffffff\" strokeWidth={3} paintOrder=\"stroke\" style={{ fontFamily: 'system-ui, sans-serif' }}>\n {c.label}\n </text>\n </g>\n ))}\n {overlay.textBox && (\n <rect data-vector-text-box=\"\" x={overlay.textBox.x} y={overlay.textBox.y} width={overlay.textBox.width} height={overlay.textBox.height} stroke={accentColor} strokeDasharray=\"3 2\" />\n )}\n {overlay.marquee && (\n <rect\n data-vector-marquee=\"\"\n x={overlay.marquee.x}\n y={overlay.marquee.y}\n width={overlay.marquee.width}\n height={overlay.marquee.height}\n fill={THEME.marqueeFill}\n stroke={accentColor}\n strokeDasharray=\"3 2\"\n />\n )}\n {overlay.guides.lines.length > 0 && (\n <g data-vector-guides=\"\" stroke={guideColor}>\n {overlay.guides.lines.map((l, i) => (\n <line key={i} data-vector-guide={l.kind} x1={l.x1} y1={l.y1} x2={l.x2} y2={l.y2} strokeDasharray={l.kind === 'construction' ? '4 3' : undefined} />\n ))}\n </g>\n )}\n {overlay.guides.labels.map((l, i) => (\n <text\n key={i}\n data-vector-guide-label={l.kind}\n x={l.x + 6}\n y={l.y - 6}\n fontSize={10}\n fill={guideColor}\n stroke=\"#ffffff\"\n strokeWidth={3}\n paintOrder=\"stroke\"\n style={{ fontFamily: 'system-ui, sans-serif' }}\n >\n {l.text}\n </text>\n ))}\n {overlay.status && (\n <text data-vector-status=\"\" x={8} y=\"100%\" dy={-8} fontSize={11} fill={accentColor} style={{ fontFamily: 'system-ui, sans-serif' }}>\n {overlay.status}\n </text>\n )}\n </g>\n {state.textEdit && overlay.text && (\n // A hidden textarea at the caret takes typing and composed (IME) text.\n <foreignObject x={overlay.text.caret?.x1 ?? 0} y={overlay.text.caret?.y1 ?? 0} width={1} height={1} style={{ overflow: 'visible' }}>\n <textarea\n ref={textRef}\n data-testid=\"vector-type-input\"\n aria-label=\"Text\"\n autoCapitalize=\"off\"\n autoCorrect=\"off\"\n spellCheck={false}\n style={{ position: 'absolute', width: 1, height: 1, padding: 0, border: 0, opacity: 0, resize: 'none', overflow: 'hidden' }}\n onPointerDown={(e) => e.stopPropagation()}\n onInput={(e) => {\n const el = e.currentTarget;\n if ((e.nativeEvent as InputEvent).isComposing) return;\n if (el.value) controller.textInput(el.value);\n el.value = '';\n }}\n onCompositionEnd={(e) => {\n const el = e.currentTarget;\n if (el.value) controller.textInput(el.value);\n el.value = '';\n }}\n onKeyDown={(e) => {\n e.stopPropagation();\n if (e.nativeEvent.isComposing) return;\n // Characters come through `input`; editing keys and shortcuts go to the controller.\n if (e.key.length === 1 && !e.metaKey && !e.ctrlKey) return;\n if (controller.keyDown(toVectorKeyInput(e))) e.preventDefault();\n if (!controller.getState().textEdit) svgRef.current?.focus({ preventScroll: true });\n }}\n onKeyUp={(e) => e.stopPropagation()}\n onCopy={(e) => {\n const text = controller.getSelectedText();\n if (text) {\n e.clipboardData.setData('text/plain', text);\n e.preventDefault();\n }\n e.stopPropagation();\n }}\n onCut={(e) => {\n const text = controller.cutText();\n if (text) {\n e.clipboardData.setData('text/plain', text);\n e.preventDefault();\n }\n e.stopPropagation();\n }}\n onPaste={(e) => {\n const text = e.clipboardData.getData('text/plain');\n if (text) controller.textInput(text);\n e.preventDefault();\n e.stopPropagation();\n }}\n />\n </foreignObject>\n )}\n {state.symbolEdit && (\n // Isolation mode: which symbol, and the way out (Escape with nothing selected works too).\n <foreignObject data-vector-symbol-edit={state.symbolEdit.symbolId} x={8} y={8} width={320} height={32} style={{ overflow: 'visible' }}>\n <div\n style={{ display: 'inline-flex', alignItems: 'center', gap: 8, padding: '4px 8px', borderRadius: 6, background: 'rgba(15,23,42,0.85)', color: '#fff', font: '12px system-ui, sans-serif' }}\n onPointerDown={(e) => e.stopPropagation()}\n onDoubleClick={(e) => e.stopPropagation()}\n onKeyDown={(e) => e.stopPropagation()}\n >\n <span>Symbol: {state.symbolEdit.name}</span>\n <button type=\"button\" aria-label=\"Exit symbol\" style={{ border: '1px solid rgba(255,255,255,0.4)', borderRadius: 4, padding: '0 6px', background: 'transparent', color: '#fff', cursor: 'pointer' }} onClick={() => controller.exitSymbolEdit()}>\n Done\n </button>\n </div>\n </foreignObject>\n )}\n {edit && editAt && (\n // Width Point Edit (double-click with the width tool), beside the point.\n <foreignObject data-vector-width-point-edit=\"\" x={editAt.x + 12} y={editAt.y + 12} width={180} height={140} style={{ overflow: 'visible' }}>\n <VectorWidthPointEditor key={`${edit.nodeId}:${edit.index}:${edit.t}`} controller={controller} edit={edit} accentColor={accentColor} />\n </foreignObject>\n )}\n </svg>\n );\n}\n","import React, { useRef, useState } from 'react';\nimport { VECTOR_OVERLAY_THEME as THEME, type VectorEditorController, type VectorWidthPointEdit } from '@pixerate/editor/vector';\n\nexport interface VectorWidthPointEditorProps {\n controller: VectorEditorController;\n /** The point being edited (`state.widthPointEdit`). */\n edit: VectorWidthPointEdit;\n /** Accent colour of the Apply button (default sky blue). */\n accentColor?: string;\n className?: string;\n style?: React.CSSProperties;\n}\n\nconst round = (v: number, digits: number) => String(Math.round(v * 10 ** digits) / 10 ** digits);\n\nconst fieldStyle: React.CSSProperties = { display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: 6 };\nconst inputStyle: React.CSSProperties = { width: 72, font: 'inherit', padding: '1px 4px' };\n\n/**\n * Width Point Edit: the position (percent along the path) and the left / right side widths\n * (document units) of the width point a width-tool double-click opened. Apply (or Enter) sets\n * them with `commitWidthPointEdit`; Cancel or Escape closes it. `<VectorCanvas>` shows it next\n * to the point; use it on its own to place it elsewhere.\n */\nexport function VectorWidthPointEditor({ controller, edit, accentColor = THEME.accent, className, style }: VectorWidthPointEditorProps) {\n const [position, setPosition] = useState(() => round(edit.t * 100, 2));\n const [left, setLeft] = useState(() => round(edit.left, 3));\n const [right, setRight] = useState(() => round(edit.right, 3));\n const formRef = useRef<HTMLFormElement | null>(null);\n // Hand the keyboard back to the canvas around it.\n const refocus = () => (formRef.current?.closest('svg') as SVGSVGElement | null)?.focus?.({ preventScroll: true });\n const close = () => {\n refocus();\n controller.closeWidthPointEdit();\n };\n const num = (v: string) => (v.trim() !== '' && Number.isFinite(Number(v)) ? Number(v) : undefined);\n const apply = () => {\n const t = num(position);\n refocus();\n controller.commitWidthPointEdit({ t: t === undefined ? undefined : Math.min(Math.max(t, 0), 100) / 100, left: num(left), right: num(right) });\n };\n const stop = (e: React.SyntheticEvent) => e.stopPropagation();\n return (\n <form\n ref={formRef}\n data-vector-width-point-editor=\"\"\n aria-label=\"Width point\"\n className={className}\n style={{\n display: 'grid',\n gap: 4,\n padding: 8,\n background: '#ffffff',\n border: '1px solid rgba(0,0,0,0.15)',\n borderRadius: 6,\n boxShadow: '0 2px 8px rgba(0,0,0,0.15)',\n font: '12px system-ui, sans-serif',\n color: '#18181b',\n ...style,\n }}\n // Keep the canvas from treating clicks, keys and clipboard use in here as editing gestures.\n onPointerDown={stop}\n onPointerMove={stop}\n onPointerUp={stop}\n onDoubleClick={stop}\n onCopy={stop}\n onCut={stop}\n onPaste={stop}\n onKeyDown={(e) => {\n e.stopPropagation();\n if (e.key === 'Escape') {\n e.preventDefault();\n close();\n }\n }}\n onSubmit={(e) => {\n e.preventDefault();\n apply();\n }}\n >\n <label style={fieldStyle}>\n Position %\n <input aria-label=\"Width point position\" type=\"number\" min={0} max={100} step=\"any\" value={position} onChange={(e) => setPosition(e.target.value)} style={inputStyle} autoFocus />\n </label>\n <label style={fieldStyle}>\n Left\n <input aria-label=\"Width point left side\" type=\"number\" min={0} step=\"any\" value={left} onChange={(e) => setLeft(e.target.value)} style={inputStyle} />\n </label>\n <label style={fieldStyle}>\n Right\n <input aria-label=\"Width point right side\" type=\"number\" min={0} step=\"any\" value={right} onChange={(e) => setRight(e.target.value)} style={inputStyle} />\n </label>\n <div style={{ display: 'flex', justifyContent: 'flex-end', gap: 4, marginTop: 2 }}>\n <button type=\"button\" onClick={close}>\n Cancel\n </button>\n <button type=\"submit\" style={{ background: accentColor, color: '#ffffff', border: 'none', borderRadius: 4, padding: '2px 8px' }}>\n {edit.index === null ? 'Add' : 'Apply'}\n </button>\n </div>\n </form>\n );\n}\n","import React from 'react';\nimport {\n VECTOR_TOOLS,\n VECTOR_TOOL_GLYPHS,\n VECTOR_TOOL_SHORTCUTS,\n VECTOR_EDIT_TOGGLES,\n VECTOR_PATH_ACTIONS,\n VECTOR_PATHFINDER_ACTIONS,\n VECTOR_FILL_GAP,\n VECTOR_ARROWHEADS,\n VECTOR_ARROWHEAD_LABELS,\n VECTOR_CORNER_KINDS,\n VECTOR_CORNER_KIND_LABELS,\n VECTOR_STROKE_ALIGN_LABELS,\n VECTOR_WIDTH_PRESETS,\n VECTOR_BLEND_SPACINGS,\n VECTOR_BLEND_SPACING_LABELS,\n applyVectorBlendOptions,\n getVectorBlendControls,\n getVectorSelectionStyle,\n isVectorMaskGroup,\n widthProfilePreset,\n widthProfilePresetId,\n vectorPaintToHex,\n vectorToolLabel,\n type VectorArrowhead,\n type VectorBlendSpacing,\n type VectorCornerKind,\n type VectorEditorController,\n type VectorStrokeAlign,\n type VectorTool,\n type VectorWidthPreset,\n vectorPolarAngles,\n vectorPolarIncrementOf\n} from '@pixerate/editor/vector';\nimport { useVectorEditorState } from './useVectorEditor';\nimport { VectorEffectsPanel } from './VectorEffectsPanel';\nimport { VectorAppearancePanel } from './VectorAppearancePanel';\nimport { VectorEnvelopePanel } from './VectorEnvelopePanel';\nimport { VectorMaskPanel } from './VectorMaskPanel';\nimport { VectorTextPanel } from './VectorTextPanel';\nimport { VectorSymbolsPanel } from './VectorSymbolsPanel';\nimport { VectorConstraintsPanel } from './VectorConstraintsPanel';\nimport { VectorFramePanel } from './VectorFramePanel';\nimport { VectorConnectorPanel } from './VectorConnectorPanel';\nimport { VectorShadingPanel } from './VectorShadingPanel';\nimport { VectorTracePanel } from './VectorTracePanel';\nimport { VectorSymmetryPanel } from './VectorSymmetryPanel';\nimport { VectorLensPanel } from './VectorLensPanel';\nimport { VectorGradientEditor } from './VectorGradientEditor';\n\nconst VECTOR_SNAP_TITLE = 'Snap to objects';\nconst modKeyLabel = () => (typeof navigator !== 'undefined' && /Mac|iPhone|iPad/.test(navigator.platform ?? '') ? '⌘' : 'Ctrl');\n\nconst buttonClass =\n 'inline-flex h-8 min-w-8 items-center justify-center rounded-md border border-border bg-background px-2 text-xs font-medium text-foreground hover:bg-muted disabled:cursor-not-allowed disabled:opacity-40 aria-pressed:bg-primary aria-pressed:text-primary-foreground';\n\nexport interface VectorToolbarProps {\n controller: VectorEditorController;\n /** Tools to show (default: all). */\n tools?: readonly VectorTool[];\n /** Undo / redo buttons (default `true`). */\n showHistory?: boolean;\n /** Boolean, Pathfinder, group, arrange and align buttons (default `true`). */\n showArrange?: boolean;\n /** The snapping toggle (default `true`). */\n showSnap?: boolean;\n /**\n * Path editing: Join, Average, Cut at Points, Remove Redundant Points, Smooth, the Keep\n * Shape / Curvature / Shapes toggles, and the pencil smoothing and eraser size inputs while\n * those tools are active (default `true`).\n */\n showPathEdit?: boolean;\n /**\n * Blend: Make Blend, spacing (steps, distance or smooth colour), steps / distance, orient to\n * spine, Replace Spine, Expand and Release (default `true`).\n */\n showBlend?: boolean;\n /** The Free Distort toggle of the selection box (default `true`). */\n showDistort?: boolean;\n className?: string;\n}\n\n/** Tool picker plus undo, snapping, boolean operations, grouping, stacking and alignment. */\nexport function VectorToolbar({\n controller,\n tools = VECTOR_TOOLS,\n showHistory = true,\n showArrange = true,\n showSnap = true,\n showPathEdit = true,\n showBlend = true,\n showDistort = true,\n className,\n}: VectorToolbarProps) {\n const state = useVectorEditorState(controller);\n const count = state.selection.length;\n const points = state.tool === 'direct' ? state.selectedAnchors.length : 0;\n const editing = state.editing;\n const groupSelected = state.selection.some((id) => controller.getNode(id)?.type === 'group');\n const maskSelected = state.selection.some((id) => isVectorMaskGroup(controller.getNode(id)));\n // Live booleans keep the operands editable; a lone live group or its operands take the operation too.\n const [live, setLive] = React.useState(false);\n const booleanDisabled = live ? count < 1 : count < 2;\n const act = (label: string, title: string, run: () => unknown, disabled = false) => (\n <button key={label} type=\"button\" className={buttonClass} title={title} aria-label={title} disabled={disabled} onClick={() => void run()}>\n {label}\n </button>\n );\n return (\n <div role=\"toolbar\" aria-label=\"Vector tools\" className={`flex flex-wrap items-center gap-1 ${className ?? ''}`}>\n <div className=\"flex items-center gap-1\" role=\"group\" aria-label=\"Tools\">\n {tools.map((tool) => (\n <button\n key={tool}\n type=\"button\"\n data-vector-tool={tool}\n className={buttonClass}\n aria-pressed={state.tool === tool}\n title={`${vectorToolLabel(tool)} (${VECTOR_TOOL_SHORTCUTS[tool]})`}\n aria-label={vectorToolLabel(tool)}\n onClick={() => controller.setTool(tool)}\n >\n {VECTOR_TOOL_GLYPHS[tool]}\n </button>\n ))}\n </div>\n {showHistory && (\n <div className=\"ml-1 flex items-center gap-1\" role=\"group\" aria-label=\"History\">\n {act('↶', state.canUndo ? `Undo ${state.undoLabel}` : 'Undo', () => controller.undo(), !state.canUndo)}\n {act('↷', state.canRedo ? `Redo ${state.redoLabel}` : 'Redo', () => controller.redo(), !state.canRedo)}\n </div>\n )}\n {showSnap && (\n <div className=\"ml-1 flex items-center gap-1\" role=\"group\" aria-label=\"Snapping\">\n <button\n type=\"button\"\n data-vector-snap=\"\"\n className={buttonClass}\n aria-pressed={state.snap.objects}\n title={`${VECTOR_SNAP_TITLE} (hold ${modKeyLabel()} to bypass)`}\n aria-label={VECTOR_SNAP_TITLE}\n onClick={() => controller.toggleSnapping()}\n >\n Snap\n </button>\n <select\n data-vector-polar=\"\"\n aria-label=\"Polar tracking increment\"\n title=\"Polar tracking: the angles drawn points snap to from where they leave\"\n className=\"h-8 rounded-md border border-border bg-background px-1 text-xs\"\n value={String(vectorPolarIncrementOf(state.snap.angles) ?? '')}\n onChange={(e) => controller.setSnap({ angles: vectorPolarAngles(Number(e.target.value)) })}\n >\n {vectorPolarIncrementOf(state.snap.angles) === null && <option value=\"\">Custom</option>}\n {[90, 45, 30, 15].map((n) => (\n <option key={n} value={n}>\n {n}°\n </option>\n ))}\n </select>\n </div>\n )}\n {showPathEdit && (\n <div className=\"ml-1 flex items-center gap-1\" role=\"group\" aria-label=\"Path editing\">\n {VECTOR_PATH_ACTIONS.map((a) => (\n <button\n key={a.id}\n type=\"button\"\n data-vector-path-action={a.id}\n className={buttonClass}\n title={a.shortcut ? `${a.title} (${modKeyLabel()}+${a.shortcut})` : a.title}\n aria-label={a.title}\n disabled={!a.enabled(count, points)}\n onClick={() => void a.run(controller)}\n >\n {a.label}\n </button>\n ))}\n {VECTOR_EDIT_TOGGLES.map((t) => (\n <button\n key={t.key}\n type=\"button\"\n data-vector-edit={t.key}\n className={buttonClass}\n aria-pressed={editing[t.key]}\n title={t.title}\n aria-label={t.title}\n onClick={() => controller.setEditing({ [t.key]: !editing[t.key] })}\n >\n {t.label}\n </button>\n ))}\n {state.tool === 'pencil' && (\n <label className=\"flex items-center gap-1 text-xs text-foreground\">\n Smoothing\n <input\n type=\"range\"\n min={0}\n max={1}\n step={0.05}\n aria-label=\"Pencil smoothing\"\n className=\"h-4 w-20 accent-primary\"\n value={editing.pencilSmoothing}\n onChange={(e) => controller.setEditing({ pencilSmoothing: parseFloat(e.target.value) })}\n />\n </label>\n )}\n {state.tool === 'eraser' && (\n <label className=\"flex items-center gap-1 text-xs text-foreground\">\n Size\n <input\n type=\"number\"\n min={0.5}\n step={1}\n aria-label=\"Eraser size\"\n className=\"h-7 w-16 rounded border border-border bg-background px-1.5 text-xs\"\n value={editing.eraserSize}\n onChange={(e) => {\n const n = parseFloat(e.target.value);\n if (Number.isFinite(n) && n > 0) controller.setEditing({ eraserSize: n });\n }}\n />\n </label>\n )}\n {state.tool === 'paintBucket' && (\n <button\n type=\"button\"\n data-vector-fill-gap=\"\"\n className={buttonClass}\n aria-pressed={editing.fillGap > 0}\n title=\"Close small gaps between path ends when filling\"\n aria-label=\"Close gaps\"\n onClick={() => controller.setEditing({ fillGap: editing.fillGap > 0 ? 0 : VECTOR_FILL_GAP })}\n >\n Gaps\n </button>\n )}\n </div>\n )}\n {showDistort && (\n <div className=\"ml-1 flex items-center gap-1\" role=\"group\" aria-label=\"Distort\">\n <button\n type=\"button\"\n data-vector-free-distort=\"\"\n className={buttonClass}\n aria-pressed={state.freeDistort}\n title={`Free Distort: drag a corner of the selection box to distort in perspective (Shift+Alt+${modKeyLabel()}: symmetric perspective; ${modKeyLabel()}-drag a side to skew)`}\n aria-label=\"Free Distort\"\n onClick={() => controller.setFreeDistort(!state.freeDistort)}\n >\n Distort\n </button>\n </div>\n )}\n {showBlend && <VectorBlendControls controller={controller} />}\n {showArrange && (\n <>\n <div className=\"ml-1 flex items-center gap-1\" role=\"group\" aria-label=\"Combine\">\n <button\n type=\"button\"\n data-vector-live-boolean=\"\"\n className={buttonClass}\n aria-pressed={live}\n title=\"Live booleans: keep the shapes editable\"\n aria-label=\"Live booleans\"\n onClick={() => setLive(!live)}\n >\n Live\n </button>\n {act('∪', 'Union', () => controller.booleanOp('union', { live }), booleanDisabled)}\n {act('−', 'Subtract', () => controller.booleanOp('subtract', { live }), booleanDisabled)}\n {act('∩', 'Intersect', () => controller.booleanOp('intersect', { live }), booleanDisabled)}\n {act('⊻', 'Exclude', () => controller.booleanOp('exclude', { live }), booleanDisabled)}\n {act('G', 'Group', () => controller.group(), count < 1)}\n {act('U', 'Ungroup', () => controller.ungroup(), !groupSelected)}\n {act('◐', `Make Clipping Mask (${modKeyLabel()}+7)`, () => controller.makeMask('clip'), count < 2)}\n {act('◑', `Release Mask (${modKeyLabel()}+Alt+7)`, () => controller.releaseMask(), !maskSelected)}\n </div>\n <div className=\"ml-1 flex items-center gap-1\" role=\"group\" aria-label=\"Pathfinder\">\n {VECTOR_PATHFINDER_ACTIONS.map((a) => (\n <button\n key={a.id}\n type=\"button\"\n data-vector-pathfinder={a.id}\n className={buttonClass}\n title={a.title}\n aria-label={a.title}\n disabled={count < a.min}\n onClick={() => void controller.pathfinder(a.id)}\n >\n {a.label}\n </button>\n ))}\n </div>\n <div className=\"ml-1 flex items-center gap-1\" role=\"group\" aria-label=\"Arrange\">\n {act('⇈', 'Bring to Front', () => controller.arrange('front'), count < 1)}\n {act('⇊', 'Send to Back', () => controller.arrange('back'), count < 1)}\n {act('⇤', 'Align Left', () => controller.align('left'), count < 1)}\n {act('↔', 'Align Center', () => controller.align('center'), count < 1)}\n {act('⇥', 'Align Right', () => controller.align('right'), count < 1)}\n {act('⤒', 'Align Top', () => controller.align('top'), count < 1)}\n {act('↕', 'Align Middle', () => controller.align('middle'), count < 1)}\n {act('⤓', 'Align Bottom', () => controller.align('bottom'), count < 1)}\n </div>\n </>\n )}\n </div>\n );\n}\n\n/** Blend buttons and options: they edit the selected blends and the options new blends get. */\nfunction VectorBlendControls({ controller }: { controller: VectorEditorController }) {\n const state = useVectorEditorState(controller);\n const blend = getVectorBlendControls(state);\n const o = blend.options;\n const selected = blend.ids.length > 0;\n return (\n <div className=\"ml-1 flex items-center gap-1\" role=\"group\" aria-label=\"Blend\" data-vector-blend-controls=\"\">\n <button type=\"button\" data-vector-blend-action=\"make\" className={buttonClass} title=\"Make Blend\" aria-label=\"Make Blend\" disabled={!blend.canBlend} onClick={() => controller.blend()}>\n ⧓\n </button>\n <select\n aria-label=\"Blend spacing\"\n className=\"h-7 rounded border border-border bg-background px-1 text-xs\"\n value={o.spacing}\n onChange={(e) => applyVectorBlendOptions(controller, { spacing: e.target.value as VectorBlendSpacing })}\n >\n {VECTOR_BLEND_SPACINGS.map((sp) => (\n <option key={sp} value={sp}>\n {VECTOR_BLEND_SPACING_LABELS[sp]}\n </option>\n ))}\n </select>\n {o.spacing !== 'smoothColor' && (\n <input\n type=\"number\"\n min={o.spacing === 'steps' ? 1 : 0.5}\n step={1}\n aria-label={o.spacing === 'steps' ? 'Blend steps' : 'Blend distance'}\n className=\"h-7 w-16 rounded border border-border bg-background px-1.5 text-xs\"\n value={o.spacing === 'steps' ? o.steps : o.distance}\n onChange={(e) => {\n const n = parseFloat(e.target.value);\n if (!Number.isFinite(n) || n <= 0) return;\n applyVectorBlendOptions(controller, o.spacing === 'steps' ? { steps: n } : { distance: n });\n }}\n />\n )}\n <button\n type=\"button\"\n data-vector-blend-action=\"orient\"\n className={buttonClass}\n aria-pressed={o.orientToSpine}\n title=\"Orient steps to the spine\"\n aria-label=\"Orient to spine\"\n onClick={() => applyVectorBlendOptions(controller, { orientToSpine: !o.orientToSpine })}\n >\n ⤿\n </button>\n <button\n type=\"button\"\n data-vector-blend-action=\"spine\"\n className={buttonClass}\n title=\"Replace Spine (select a blend and a path)\"\n aria-label=\"Replace Spine\"\n disabled={!blend.canReplaceSpine}\n onClick={() => controller.replaceBlendSpine()}\n >\n ⌇\n </button>\n <button type=\"button\" data-vector-blend-action=\"expand\" className={buttonClass} title=\"Expand Blend\" aria-label=\"Expand Blend\" disabled={!selected} onClick={() => controller.expandBlend()}>\n ⧉\n </button>\n <button type=\"button\" data-vector-blend-action=\"release\" className={buttonClass} title=\"Release Blend\" aria-label=\"Release Blend\" disabled={!selected} onClick={() => controller.releaseBlend()}>\n ⧄\n </button>\n </div>\n );\n}\n\nexport interface VectorStylePanelProps {\n controller: VectorEditorController;\n className?: string;\n}\n\nconst selectClass = 'h-7 min-w-0 flex-1 rounded border border-border bg-background px-1 text-xs';\nconst numberClass = 'h-7 w-16 rounded border border-border bg-background px-1.5 text-xs';\n\n/**\n * Fill, stroke and their gradients (`VectorGradientEditor`), stroke width, alignment and width profile, arrowheads, live corner radius, opacity, path effects (`VectorEffectsPanel`) and envelope (`VectorEnvelopePanel`) of the\n * selection (corners of the selected points with the direct tool); with nothing selected it\n * edits the defaults for new shapes.\n */\nexport function VectorStylePanel({ controller, className }: VectorStylePanelProps) {\n const state = useVectorEditorState(controller);\n const style = getVectorSelectionStyle(state);\n const d = state.defaults;\n const source = style ?? {\n fill: d.fill ?? null,\n stroke: d.stroke ?? null,\n strokeWidth: d.strokeWidth ?? 1,\n opacity: 1,\n strokeAlign: d.strokeAlign ?? 'center',\n startArrow: d.startArrow ?? null,\n endArrow: d.endArrow ?? null,\n arrowAlign: d.arrowAlign ?? 'extend',\n startArrowScale: d.startArrowScale ?? 1,\n endArrowScale: d.endArrowScale ?? 1,\n widthProfile: widthProfilePresetId(d.strokeWidthProfile),\n cornerRadius: d.cornerRadius,\n cornerKind: d.cornerKind ?? 'round',\n cornerSmoothing: 0,\n corners: 1,\n hasOpenPath: true,\n };\n const setCorners = (patch: { radius?: number; kind?: VectorCornerKind }) => {\n if (!style) controller.setDefaults({ ...(patch.radius !== undefined ? { cornerRadius: patch.radius } : {}), ...(patch.kind ? { cornerKind: patch.kind } : {}) });\n else if (patch.radius !== undefined) controller.setCornerRadius(patch.radius);\n else if (patch.kind) controller.setCornerKind(patch.kind);\n };\n const setProfile = (id: VectorWidthPreset) => {\n if (style) controller.setWidthProfile(id);\n else controller.setDefaults({ strokeWidthProfile: widthProfilePreset(id)?.length ? widthProfilePreset(id) : null });\n };\n const mixed = (key: keyof NonNullable<typeof style>['mixed']) => (style?.mixed[key] ? <span className=\"text-[11px] text-muted-foreground\">Mixed</span> : null);\n const arrowRow = (end: 'start' | 'end', label: string) => {\n const key = end === 'start' ? 'startArrow' : 'endArrow';\n const scaleKey = end === 'start' ? 'startArrowScale' : 'endArrowScale';\n return (\n <div className=\"flex items-center gap-2\" data-vector-style={key}>\n <span className=\"w-16 text-xs text-foreground\">{label}</span>\n <select aria-label={`${label} arrowhead`} className={selectClass} value={source[key] ?? ''} onChange={(e) => apply({ [key]: (e.target.value || null) as VectorArrowhead | null })}>\n <option value=\"\">None</option>\n {VECTOR_ARROWHEADS.map((h) => (\n <option key={h} value={h}>\n {VECTOR_ARROWHEAD_LABELS[h]}\n </option>\n ))}\n </select>\n <input\n type=\"number\"\n min={0.1}\n step={0.25}\n aria-label={`${label} arrowhead scale`}\n title=\"Scale (× stroke width)\"\n className={numberClass}\n value={source[scaleKey]}\n onChange={(e) => {\n const n = parseFloat(e.target.value);\n if (Number.isFinite(n) && n > 0) apply({ [scaleKey]: n });\n }}\n />\n </div>\n );\n };\n const apply = (patch: Record<string, unknown>) => {\n if (style) controller.setStyle(patch);\n else controller.setDefaults(patch);\n };\n const paintRow = (key: 'fill' | 'stroke', label: string) => {\n const paint = source[key];\n const hex = vectorPaintToHex(paint);\n const on = paint !== null && paint !== 'none';\n return (\n <div className=\"flex items-center gap-2\" data-vector-style={key}>\n <label className=\"flex w-16 items-center gap-1.5 text-xs text-foreground\">\n <input type=\"checkbox\" checked={on} aria-label={`${label} on`} onChange={(e) => apply({ [key]: e.target.checked ? (hex ?? '#000000') : null })} />\n {label}\n </label>\n <input\n type=\"color\"\n aria-label={`${label} colour`}\n className=\"h-7 w-10 cursor-pointer rounded border border-border bg-background disabled:opacity-40\"\n disabled={!on}\n value={hex ?? '#000000'}\n onChange={(e) => apply({ [key]: e.target.value })}\n />\n {on && !hex && <span className=\"truncate text-[11px] text-muted-foreground\">{typeof paint === 'string' ? paint : 'Gradient'}</span>}\n {style?.mixed[key] && <span className=\"text-[11px] text-muted-foreground\">Mixed</span>}\n </div>\n );\n };\n return (\n <div className={`space-y-2 ${className ?? ''}`} aria-label={style ? 'Selection style' : 'New shape style'}>\n <p className=\"text-[11px] font-medium uppercase tracking-wide text-muted-foreground\">{style ? 'Selection' : 'New shapes'}</p>\n {paintRow('fill', 'Fill')}\n {paintRow('stroke', 'Stroke')}\n {style && <VectorGradientEditor controller={controller} />}\n <label className=\"flex items-center gap-2 text-xs text-foreground\">\n <span className=\"w-16\">Width</span>\n <input\n type=\"number\"\n min={0}\n step={0.5}\n aria-label=\"Stroke width\"\n className=\"h-7 w-20 rounded border border-border bg-background px-1.5 text-xs\"\n value={source.strokeWidth}\n onChange={(e) => {\n const n = parseFloat(e.target.value);\n if (Number.isFinite(n) && n >= 0) apply({ strokeWidth: n });\n }}\n />\n </label>\n <label className=\"flex items-center gap-2 text-xs text-foreground\" data-vector-style=\"strokeAlign\">\n <span className=\"w-16\">Align</span>\n <select aria-label=\"Stroke alignment\" className={selectClass} value={source.strokeAlign} onChange={(e) => apply({ strokeAlign: e.target.value as VectorStrokeAlign })}>\n {(Object.keys(VECTOR_STROKE_ALIGN_LABELS) as VectorStrokeAlign[]).map((a) => (\n <option key={a} value={a}>\n {VECTOR_STROKE_ALIGN_LABELS[a]}\n </option>\n ))}\n </select>\n {mixed('strokeAlign')}\n </label>\n <div className=\"flex items-center gap-2 text-xs text-foreground\" data-vector-style=\"widthProfile\">\n <span className=\"w-16\">Profile</span>\n <select\n aria-label=\"Width profile\"\n className={selectClass}\n value={source.widthProfile}\n onChange={(e) => {\n if (e.target.value !== 'custom') setProfile(e.target.value as VectorWidthPreset);\n }}\n >\n {VECTOR_WIDTH_PRESETS.map((p) => (\n <option key={p.id} value={p.id}>\n {p.label}\n </option>\n ))}\n {source.widthProfile === 'custom' && (\n <option value=\"custom\" disabled>\n Custom\n </option>\n )}\n </select>\n <button\n type=\"button\"\n className={buttonClass}\n title=\"Reset to uniform width\"\n aria-label=\"Reset to uniform width\"\n disabled={source.widthProfile === 'uniform' && !style?.mixed.widthProfile}\n onClick={() => setProfile('uniform')}\n >\n ═\n </button>\n {mixed('widthProfile')}\n </div>\n {source.hasOpenPath && (\n <>\n {arrowRow('start', 'Start')}\n {arrowRow('end', 'End')}\n {(source.startArrow || source.endArrow) && (\n <label className=\"flex items-center gap-2 text-xs text-foreground\" data-vector-style=\"arrowAlign\">\n <span className=\"w-16\">Heads</span>\n <select aria-label=\"Arrowhead alignment\" className={selectClass} value={source.arrowAlign} onChange={(e) => apply({ arrowAlign: e.target.value })}>\n <option value=\"extend\">Tip past end</option>\n <option value=\"tip\">Tip at end</option>\n </select>\n </label>\n )}\n </>\n )}\n {source.corners > 0 && (\n <div className=\"flex items-center gap-2\" data-vector-style=\"corners\">\n <span className=\"w-16 text-xs text-foreground\">Corners</span>\n <input\n type=\"number\"\n min={0}\n step={1}\n aria-label=\"Corner radius\"\n className={numberClass}\n value={Math.round(source.cornerRadius * 100) / 100}\n onChange={(e) => {\n const n = parseFloat(e.target.value);\n if (Number.isFinite(n) && n >= 0) setCorners({ radius: n });\n }}\n />\n <select aria-label=\"Corner kind\" className={selectClass} value={source.cornerKind} onChange={(e) => setCorners({ kind: e.target.value as VectorCornerKind })}>\n {VECTOR_CORNER_KINDS.map((k) => (\n <option key={k} value={k}>\n {VECTOR_CORNER_KIND_LABELS[k]}\n </option>\n ))}\n </select>\n {mixed('cornerRadius')}\n </div>\n )}\n {style && source.corners > 0 && source.cornerKind === 'round' && source.cornerRadius > 0 && (\n <label className=\"flex items-center gap-2 text-xs text-foreground\" data-vector-style=\"corner-smoothing\" title=\"Corner smoothing: squircle corners that ease into the curve (0.6 is iOS-like)\">\n <span className=\"w-16\">Smoothing</span>\n <input\n type=\"range\"\n min={0}\n max={1}\n step={0.05}\n aria-label=\"Corner smoothing\"\n className=\"h-4 flex-1 accent-primary\"\n value={source.cornerSmoothing}\n onChange={(e) => controller.setCornerSmoothing(parseFloat(e.target.value), { merge: 'corner-smoothing' })}\n onPointerUp={() => controller.endMergedEdit()}\n />\n </label>\n )}\n {style && (\n <label className=\"flex items-center gap-2 text-xs text-foreground\">\n <span className=\"w-16\">Opacity</span>\n <input\n type=\"range\"\n min={0}\n max={1}\n step={0.05}\n aria-label=\"Opacity\"\n className=\"h-4 flex-1 accent-primary\"\n value={source.opacity}\n onChange={(e) => apply({ opacity: parseFloat(e.target.value) })}\n />\n </label>\n )}\n <VectorTextPanel controller={controller} />\n {style && <VectorAppearancePanel controller={controller} />}\n {style && <VectorEffectsPanel controller={controller} />}\n {style && <VectorEnvelopePanel controller={controller} />}\n {style && <VectorMaskPanel controller={controller} />}\n <VectorFramePanel controller={controller} />\n <VectorConnectorPanel controller={controller} />\n <VectorShadingPanel controller={controller} />\n <VectorSymmetryPanel controller={controller} />\n <VectorLensPanel controller={controller} />\n <VectorTracePanel controller={controller} />\n <VectorConstraintsPanel controller={controller} />\n <VectorSymbolsPanel controller={controller} />\n </div>\n );\n}\n","import React from 'react';\nimport {\n VECTOR_EFFECT_MENU,\n getVectorEffectsPanel,\n vectorPaintToHex,\n type VectorEditorController,\n type VectorEffectParamSpec,\n type VectorEffectsPanelItem,\n type VectorEffectType,\n} from '@pixerate/editor/vector';\nimport { useVectorEditorState } from './useVectorEditor';\n\nconst buttonClass =\n 'inline-flex h-7 min-w-7 items-center justify-center rounded-md border border-border bg-background px-1.5 text-xs font-medium text-foreground hover:bg-muted disabled:cursor-not-allowed disabled:opacity-40';\nconst numberClass = 'h-7 w-16 rounded border border-border bg-background px-1.5 text-xs';\nconst selectClass = 'h-7 min-w-0 flex-1 rounded border border-border bg-background px-1 text-xs';\n/** Parameter names sit on their own line in a narrow panel, the controls below. */\nconst labelClass = 'w-full truncate text-[11px] text-muted-foreground';\n\nexport interface VectorEffectsPanelProps {\n controller: VectorEditorController;\n className?: string;\n}\n\n/**\n * The live path effects of the selection: add effects (to every selected node), and for one\n * selected node list its stack (applied top to bottom) to turn on and off, reorder, remove and\n * edit. Slider drags and typing are one undo step each. Expand Appearance bakes the effects and\n * live booleans into plain paths.\n */\nexport function VectorEffectsPanel({ controller, className }: VectorEffectsPanelProps) {\n const state = useVectorEditorState(controller);\n const panel = getVectorEffectsPanel(state);\n if (!panel) return null;\n const nodeId = panel.nodeId;\n const end = () => controller.endMergedEdit();\n const set = (e: VectorEffectsPanelItem, key: string, value: unknown, merge: boolean) => {\n if (nodeId) controller.updateEffect(nodeId, e.id, { params: { [key]: value } }, { merge });\n };\n const number = (e: VectorEffectsPanelItem, spec: VectorEffectParamSpec & { kind: 'number' }) => {\n const value = Number(e.params[spec.key] ?? 0);\n const label = `${e.label} ${spec.label}`;\n const onChange = (ev: React.ChangeEvent<HTMLInputElement>) => {\n const n = parseFloat(ev.target.value);\n if (Number.isFinite(n)) set(e, spec.key, n, true);\n };\n return (\n <label key={spec.key} className=\"flex flex-wrap items-center gap-x-2 gap-y-0.5 text-xs text-foreground\" data-vector-effect-param={spec.key}>\n <span className={labelClass}>{spec.label}</span>\n {spec.slider && (\n <input\n type=\"range\"\n min={spec.min}\n max={spec.max}\n step={spec.step}\n aria-label={`${label} slider`}\n className=\"h-4 min-w-0 flex-1 accent-primary\"\n value={value}\n onChange={onChange}\n onPointerUp={end}\n onKeyUp={end}\n onBlur={end}\n />\n )}\n <input\n type=\"number\"\n min={spec.min}\n max={spec.max}\n step={spec.step}\n aria-label={label}\n className={numberClass}\n value={Math.round(value * 1000) / 1000}\n onChange={onChange}\n onBlur={end}\n />\n </label>\n );\n };\n const vec2 = (e: VectorEffectsPanelItem, spec: VectorEffectParamSpec) => {\n const v = (e.params[spec.key] as { x: number; y: number } | undefined) ?? { x: 0, y: 0 };\n const field = (axis: 'x' | 'y') => (\n <input\n type=\"number\"\n step={spec.kind === 'vec2' ? spec.step : 1}\n aria-label={`${e.label} ${spec.label} ${axis}`}\n className={numberClass}\n value={Math.round(v[axis] * 1000) / 1000}\n onChange={(ev) => {\n const n = parseFloat(ev.target.value);\n if (Number.isFinite(n)) set(e, spec.key, { ...v, [axis]: n }, true);\n }}\n onBlur={end}\n />\n );\n return (\n <div key={spec.key} className=\"flex flex-wrap items-center gap-x-2 gap-y-0.5 text-xs text-foreground\" data-vector-effect-param={spec.key}>\n <span className={labelClass}>{spec.label}</span>\n {field('x')}\n {field('y')}\n </div>\n );\n };\n const param = (e: VectorEffectsPanelItem, spec: VectorEffectParamSpec) => {\n if (spec.kind === 'number') return number(e, spec);\n if (spec.kind === 'vec2') return vec2(e, spec);\n if (spec.kind === 'boolean')\n return (\n <label key={spec.key} className=\"flex items-center gap-2 text-xs text-foreground\" data-vector-effect-param={spec.key}>\n <span className=\"min-w-0 flex-1 truncate\">{spec.label}</span>\n <input type=\"checkbox\" aria-label={`${e.label} ${spec.label}`} checked={!!e.params[spec.key]} onChange={(ev) => set(e, spec.key, ev.target.checked, false)} />\n </label>\n );\n if (spec.kind === 'color') {\n // A colour, or none (the checkbox): none keeps the shape's own colour.\n const c = e.params[spec.key] as string | null;\n return (\n <div key={spec.key} className=\"flex items-center gap-2 text-xs text-foreground\" data-vector-effect-param={spec.key}>\n <span className={labelClass}>{spec.label}</span>\n <input type=\"checkbox\" aria-label={`${e.label} ${spec.label} on`} checked={c !== null} onChange={(ev) => set(e, spec.key, ev.target.checked ? '#ffffff' : null, false)} />\n <input type=\"color\" aria-label={`${e.label} ${spec.label}`} className=\"h-6 w-8 cursor-pointer rounded border border-border bg-background disabled:opacity-40\" disabled={c === null} value={vectorPaintToHex(c ?? '#ffffff') ?? '#ffffff'} onChange={(ev) => set(e, spec.key, ev.target.value, true)} onBlur={end} />\n </div>\n );\n }\n if (spec.kind !== 'select') return null;\n return (\n <label key={spec.key} className=\"flex flex-wrap items-center gap-x-2 gap-y-0.5 text-xs text-foreground\" data-vector-effect-param={spec.key}>\n <span className={labelClass}>{spec.label}</span>\n <select aria-label={`${e.label} ${spec.label}`} className={selectClass} value={String(e.params[spec.key] ?? '')} onChange={(ev) => set(e, spec.key, ev.target.value, false)}>\n {spec.options.map((o) => (\n <option key={o.value} value={o.value}>\n {o.label}\n </option>\n ))}\n </select>\n </label>\n );\n };\n return (\n <div className={`space-y-2 ${className ?? ''}`} data-vector-effects=\"\" aria-label=\"Effects\">\n <div className=\"flex items-center gap-2\">\n <span className=\"w-16 text-[11px] font-medium uppercase tracking-wide text-muted-foreground\">Effects</span>\n <select\n aria-label=\"Add effect\"\n className={selectClass}\n value=\"\"\n onChange={(ev) => {\n if (ev.target.value) controller.addEffect(ev.target.value as VectorEffectType);\n }}\n >\n <option value=\"\">Add effect…</option>\n {VECTOR_EFFECT_MENU.map((m) => (\n <option key={m.type} value={m.type}>\n {m.label}\n </option>\n ))}\n </select>\n <button type=\"button\" className={buttonClass} title=\"Expand Appearance\" aria-label=\"Expand Appearance\" disabled={!panel.expandable} onClick={() => controller.expandAppearance()}>\n Expand\n </button>\n </div>\n {panel.count > 1 && <p className=\"text-[11px] text-muted-foreground\">Select one object to edit its effects.</p>}\n {nodeId &&\n panel.effects.map((e, i) => (\n <div key={e.id} className=\"space-y-1 rounded border border-border p-1.5\" data-vector-effect={e.id} data-vector-effect-type={e.type}>\n <div className=\"flex items-center gap-1\">\n <label className=\"flex min-w-0 flex-1 items-center gap-1.5 text-xs font-medium text-foreground\">\n <input type=\"checkbox\" aria-label={`${e.label} on`} checked={e.enabled} onChange={(ev) => controller.updateEffect(nodeId, e.id, { enabled: ev.target.checked })} />\n <span className=\"truncate\">{e.label}</span>\n </label>\n <button type=\"button\" className={buttonClass} title=\"Move up\" aria-label={`Move ${e.label} up`} disabled={i === 0} onClick={() => controller.moveEffect(nodeId, e.id, i - 1)}>\n ↑\n </button>\n <button\n type=\"button\"\n className={buttonClass}\n title=\"Move down\"\n aria-label={`Move ${e.label} down`}\n disabled={i === panel.effects.length - 1}\n onClick={() => controller.moveEffect(nodeId, e.id, i + 1)}\n >\n ↓\n </button>\n <button type=\"button\" className={buttonClass} title=\"Remove\" aria-label={`Remove ${e.label}`} onClick={() => controller.removeEffect(nodeId, e.id)}>\n ×\n </button>\n </div>\n {e.specs.map((spec) => param(e, spec))}\n </div>\n ))}\n </div>\n );\n}\n","import React from 'react';\nimport {\n VECTOR_BLEND_MODE_MENU,\n VECTOR_FILTER_MENU,\n VECTOR_STROKE_ALIGN_LABELS,\n getVectorAppearancePanel,\n type VectorAppearancePanelLayer,\n type VectorBlendMode,\n type VectorEditorController,\n type VectorFilterParamSpec,\n type VectorFilterType,\n type VectorFiltersPanelItem,\n type VectorStrokeAlign,\n} from '@pixerate/editor/vector';\nimport { useVectorEditorState } from './useVectorEditor';\n\nconst buttonClass =\n 'inline-flex h-7 min-w-7 items-center justify-center rounded-md border border-border bg-background px-1.5 text-xs font-medium text-foreground hover:bg-muted disabled:cursor-not-allowed disabled:opacity-40';\nconst numberClass = 'h-7 w-14 rounded border border-border bg-background px-1.5 text-xs';\nconst selectClass = 'h-7 min-w-0 flex-1 rounded border border-border bg-background px-1 text-xs';\nconst headingClass = 'text-[11px] font-medium uppercase tracking-wide text-muted-foreground';\nconst labelClass = 'w-full truncate text-[11px] text-muted-foreground';\n\nexport interface VectorAppearancePanelProps {\n controller: VectorEditorController;\n className?: string;\n}\n\n/**\n * The appearance of the selection: its fill and stroke stacks (listed top first; add, remove,\n * reorder, show / hide, paint, opacity and blend mode per layer, width and alignment per\n * stroke), the node blend mode, and for one selected node its filters (drop and inner shadows,\n * glows, blurs, feather). The pencil on a layer points the gradient editor and tool at it.\n * Slider drags and typing are one undo step each.\n */\nexport function VectorAppearancePanel({ controller, className }: VectorAppearancePanelProps) {\n const state = useVectorEditorState(controller);\n const panel = getVectorAppearancePanel(state);\n if (!panel) return null;\n const end = () => controller.endMergedEdit();\n const ids = panel.pathIds;\n const update = (l: VectorAppearancePanelLayer, patch: Record<string, unknown>, merge = false) => controller.updatePaintLayer(l.kind, l.index, patch, { ids, merge });\n\n const layerRow = (l: VectorAppearancePanelLayer, count: number) => {\n const name = `${l.kind === 'fill' ? 'Fill' : 'Stroke'} ${l.index + 1}`;\n if (l.unknownKind)\n return (\n <div key={`${l.kind}-${l.index}`} className=\"text-[11px] text-muted-foreground\" data-vector-layer={`${l.kind}-${l.index}`}>\n {name}: {l.unknownKind} (not drawn by this version)\n </div>\n );\n return (\n <div key={`${l.kind}-${l.index}`} className=\"space-y-1 rounded border border-border p-1\" data-vector-layer={`${l.kind}-${l.index}`} data-vector-layer-editing={l.editing ? '' : undefined}>\n <div className=\"flex items-center gap-1\">\n <input type=\"checkbox\" aria-label={`${name} visible`} title=\"Show\" checked={l.visible} onChange={(e) => update(l, { visible: e.target.checked })} />\n {l.gradient ? (\n <button\n type=\"button\"\n aria-label={`${name} gradient`}\n title=\"Edit this gradient\"\n className=\"h-7 w-10 rounded border border-border\"\n style={{ background: l.swatch }}\n onClick={() => controller.setGradientTarget(l.kind, l.index)}\n />\n ) : (\n <input\n type=\"color\"\n aria-label={`${name} colour`}\n className=\"h-7 w-10 cursor-pointer rounded border border-border bg-background\"\n value={l.color ?? '#000000'}\n onChange={(e) => update(l, { paint: e.target.value }, true)}\n onBlur={end}\n />\n )}\n <input\n type=\"number\"\n min={0}\n max={100}\n step={5}\n aria-label={`${name} opacity`}\n title=\"Opacity %\"\n className={numberClass}\n value={Math.round(l.opacity * 100)}\n onChange={(e) => {\n const n = parseFloat(e.target.value);\n if (Number.isFinite(n)) update(l, { opacity: Math.min(100, Math.max(0, n)) / 100 }, true);\n }}\n onBlur={end}\n />\n <select aria-label={`${name} blend mode`} className={selectClass} value={l.blendMode} onChange={(e) => update(l, { blendMode: e.target.value })}>\n {VECTOR_BLEND_MODE_MENU.map((m) => (\n <option key={m.mode} value={m.mode}>\n {m.label}\n </option>\n ))}\n </select>\n </div>\n {l.kind === 'stroke' && (\n <div className=\"flex items-center gap-1\">\n <input\n type=\"number\"\n min={0}\n step={0.5}\n aria-label={`${name} width`}\n title=\"Width\"\n className={numberClass}\n value={l.strokeWidth ?? 1}\n onChange={(e) => {\n const n = parseFloat(e.target.value);\n if (Number.isFinite(n) && n >= 0) update(l, { strokeWidth: n }, true);\n }}\n onBlur={end}\n />\n <select aria-label={`${name} alignment`} className={selectClass} value={l.strokeAlign ?? 'center'} onChange={(e) => update(l, { strokeAlign: e.target.value as VectorStrokeAlign })}>\n {(Object.keys(VECTOR_STROKE_ALIGN_LABELS) as VectorStrokeAlign[]).map((a) => (\n <option key={a} value={a}>\n {VECTOR_STROKE_ALIGN_LABELS[a]}\n </option>\n ))}\n </select>\n </div>\n )}\n <div className=\"flex items-center gap-1\">\n <span className=\"flex-1\" />\n <button type=\"button\" className={buttonClass} title=\"Edit gradient\" aria-label={`Edit ${name} gradient`} aria-pressed={l.editing} onClick={() => controller.setGradientTarget(l.kind, l.index)}>\n ✎\n </button>\n <button type=\"button\" className={buttonClass} title=\"Move up\" aria-label={`Move ${name} up`} disabled={l.index === count - 1} onClick={() => controller.movePaintLayer(l.kind, l.index, l.index + 1, { ids })}>\n ↑\n </button>\n <button type=\"button\" className={buttonClass} title=\"Move down\" aria-label={`Move ${name} down`} disabled={l.index === 0} onClick={() => controller.movePaintLayer(l.kind, l.index, l.index - 1, { ids })}>\n ↓\n </button>\n <button type=\"button\" className={buttonClass} title=\"Remove\" aria-label={`Remove ${name}`} onClick={() => controller.removePaintLayer(l.kind, l.index, { ids })}>\n ×\n </button>\n </div>\n </div>\n );\n };\n\n const stack = (kind: 'fill' | 'stroke', layers: VectorAppearancePanelLayer[], mixed: boolean) => (\n <div className=\"space-y-1\" data-vector-stack={kind}>\n <div className=\"flex items-center gap-2\">\n <span className={`flex-1 ${headingClass}`}>{kind === 'fill' ? 'Fills' : 'Strokes'}</span>\n {mixed && <span className=\"text-[11px] text-muted-foreground\">Mixed</span>}\n <button\n type=\"button\"\n className={buttonClass}\n title={kind === 'fill' ? 'Add fill' : 'Add stroke'}\n aria-label={kind === 'fill' ? 'Add fill' : 'Add stroke'}\n disabled={!ids.length}\n onClick={() => controller.addPaintLayer(kind, {}, { ids })}\n >\n +\n </button>\n </div>\n {/* Top layer first, as it draws. */}\n {[...layers].reverse().map((l) => layerRow(l, layers.length))}\n </div>\n );\n\n const filterNode = panel.filterNodeId;\n const setFilter = (f: VectorFiltersPanelItem, key: string, value: unknown, merge: boolean) => {\n if (filterNode) controller.updateFilter(filterNode, f.id, { params: { [key]: value } }, { merge });\n };\n const filterParam = (f: VectorFiltersPanelItem, spec: VectorFilterParamSpec) => {\n const label = `${f.label} ${spec.label}`;\n if (spec.kind === 'color')\n return (\n <label key={spec.key} className=\"flex items-center gap-2 text-xs text-foreground\" data-vector-filter-param={spec.key}>\n <span className=\"w-14 truncate text-[11px] text-muted-foreground\">{spec.label}</span>\n <input\n type=\"color\"\n aria-label={label}\n className=\"h-7 w-10 cursor-pointer rounded border border-border bg-background\"\n value={/^#[0-9a-f]{6}$/i.test(String(f.params[spec.key])) ? String(f.params[spec.key]) : '#000000'}\n onChange={(e) => setFilter(f, spec.key, e.target.value, true)}\n onBlur={end}\n />\n </label>\n );\n if (spec.kind !== 'number') return null;\n const value = Number(f.params[spec.key] ?? 0);\n const onChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const n = parseFloat(e.target.value);\n if (Number.isFinite(n)) setFilter(f, spec.key, n, true);\n };\n return (\n <label key={spec.key} className=\"flex flex-wrap items-center gap-x-2 gap-y-0.5 text-xs text-foreground\" data-vector-filter-param={spec.key}>\n <span className={labelClass}>{spec.label}</span>\n {spec.slider && (\n <input\n type=\"range\"\n min={spec.min}\n max={spec.max}\n step={spec.step}\n aria-label={`${label} slider`}\n className=\"h-4 min-w-0 flex-1 accent-primary\"\n value={value}\n onChange={onChange}\n onPointerUp={end}\n onKeyUp={end}\n onBlur={end}\n />\n )}\n <input type=\"number\" min={spec.min} max={spec.max} step={spec.step} aria-label={label} className={numberClass} value={Math.round(value * 1000) / 1000} onChange={onChange} onBlur={end} />\n </label>\n );\n };\n\n return (\n <div className={`space-y-2 ${className ?? ''}`} data-vector-appearance=\"\" aria-label=\"Appearance\">\n {ids.length > 0 && stack('stroke', panel.strokes, panel.mixed.strokes)}\n {ids.length > 0 && stack('fill', panel.fills, panel.mixed.fills)}\n <label className=\"flex items-center gap-2 text-xs text-foreground\" data-vector-style=\"blendMode\">\n <span className=\"w-16\">Blend</span>\n <select aria-label=\"Blend mode\" className={selectClass} value={panel.blendMode} onChange={(e) => controller.setBlendMode(e.target.value as VectorBlendMode, { ids: panel.nodeIds })}>\n {VECTOR_BLEND_MODE_MENU.map((m) => (\n <option key={m.mode} value={m.mode}>\n {m.label}\n </option>\n ))}\n </select>\n {panel.mixed.blendMode && <span className=\"text-[11px] text-muted-foreground\">Mixed</span>}\n </label>\n <div className=\"space-y-2\" data-vector-filters=\"\">\n <div className=\"flex items-center gap-2\">\n <span className={`w-16 ${headingClass}`}>Filters</span>\n <select\n aria-label=\"Add filter\"\n className={selectClass}\n value=\"\"\n onChange={(e) => {\n if (e.target.value) controller.addFilter(e.target.value as VectorFilterType, { ids: panel.nodeIds });\n }}\n >\n <option value=\"\">Add filter…</option>\n {VECTOR_FILTER_MENU.map((m) => (\n <option key={m.type} value={m.type}>\n {m.label}\n </option>\n ))}\n </select>\n </div>\n {!filterNode && <p className=\"text-[11px] text-muted-foreground\">Select one object to edit its filters.</p>}\n {filterNode &&\n panel.filters.map((f, i) => (\n <div key={f.id} className=\"space-y-1 rounded border border-border p-1.5\" data-vector-filter={f.id} data-vector-filter-type={f.type}>\n <div className=\"flex items-center gap-1\">\n <label className=\"flex min-w-0 flex-1 items-center gap-1.5 text-xs font-medium text-foreground\">\n <input type=\"checkbox\" aria-label={`${f.label} on`} checked={f.enabled} onChange={(e) => controller.updateFilter(filterNode, f.id, { enabled: e.target.checked })} />\n <span className=\"truncate\">{f.label}</span>\n </label>\n <button type=\"button\" className={buttonClass} title=\"Move up\" aria-label={`Move ${f.label} up`} disabled={i === 0} onClick={() => controller.moveFilter(filterNode, f.id, i - 1)}>\n ↑\n </button>\n <button type=\"button\" className={buttonClass} title=\"Move down\" aria-label={`Move ${f.label} down`} disabled={i === panel.filters.length - 1} onClick={() => controller.moveFilter(filterNode, f.id, i + 1)}>\n ↓\n </button>\n <button type=\"button\" className={buttonClass} title=\"Remove\" aria-label={`Remove ${f.label}`} onClick={() => controller.removeFilter(filterNode, f.id)}>\n ×\n </button>\n </div>\n {f.specs.map((spec) => filterParam(f, spec))}\n </div>\n ))}\n </div>\n </div>\n );\n}\n","import React from 'react';\nimport { VECTOR_ENVELOPE_STYLE_OPTIONS, getVectorEnvelopePanel, type VectorEditorController, type VectorEnvelopeParams } from '@pixerate/editor/vector';\nimport { useVectorEditorState } from './useVectorEditor';\n\nconst buttonClass =\n 'inline-flex h-7 min-w-7 items-center justify-center rounded-md border border-border bg-background px-1.5 text-xs font-medium text-foreground hover:bg-muted disabled:cursor-not-allowed disabled:opacity-40';\nconst numberClass = 'h-7 w-14 rounded border border-border bg-background px-1.5 text-xs';\nconst selectClass = 'h-7 min-w-0 flex-1 rounded border border-border bg-background px-1 text-xs';\nconst labelClass = 'w-full truncate text-[11px] text-muted-foreground';\n\nconst SLIDERS: { key: 'bend' | 'horizontal' | 'vertical'; label: string }[] = [\n { key: 'bend', label: 'Bend %' },\n { key: 'horizontal', label: 'Horizontal distortion %' },\n { key: 'vertical', label: 'Vertical distortion %' },\n];\n\nexport interface VectorEnvelopePanelProps {\n controller: VectorEditorController;\n className?: string;\n}\n\n/**\n * Envelope distortion of the selection: Make with Warp, Mesh or Top Object, and for one selected\n * object with an envelope its warp preset, bend, horizontal and vertical distortion, orientation and\n * mesh rows and columns, plus Release and Expand. Edit the mesh on the canvas with the Envelope\n * tool. Slider drags are one undo step each.\n */\nexport function VectorEnvelopePanel({ controller, className }: VectorEnvelopePanelProps) {\n const state = useVectorEditorState(controller);\n const panel = getVectorEnvelopePanel(state);\n // The mesh size Make with Mesh uses (an envelope's own size once it has one).\n const [size, setSize] = React.useState({ rows: 2, columns: 2 });\n if (!panel) return null;\n const env = panel.envelope;\n const ids = panel.nodeId ? [panel.nodeId] : undefined;\n const end = () => controller.endMergedEdit();\n const set = (patch: Partial<VectorEnvelopeParams>, merge = false) => controller.envelope(patch, { ids, merge });\n const rows = env?.params.rows ?? size.rows;\n const columns = env?.params.columns ?? size.columns;\n const setCount = (key: 'rows' | 'columns', raw: string) => {\n const n = Math.round(parseFloat(raw));\n if (!Number.isFinite(n) || n < 1 || n > 16) return;\n if (env) set({ [key]: n });\n else setSize({ ...size, [key]: n });\n };\n return (\n <div className={`space-y-2 ${className ?? ''}`} data-vector-envelope=\"\" aria-label=\"Envelope\">\n <div className=\"flex flex-wrap items-center gap-1\">\n <span className=\"w-16 text-[11px] font-medium uppercase tracking-wide text-muted-foreground\">Envelope</span>\n <button type=\"button\" data-vector-envelope-action=\"warp\" className={buttonClass} title=\"Make with Warp\" aria-label=\"Make with Warp\" disabled={!panel.canMake || !!env} onClick={() => set({ style: 'arc', bend: 50 })}>\n Warp\n </button>\n <button\n type=\"button\"\n data-vector-envelope-action=\"mesh\"\n className={buttonClass}\n title=\"Make with Mesh\"\n aria-label=\"Make with Mesh\"\n disabled={!panel.canMake || !!env}\n onClick={() => set({ style: 'mesh', rows: size.rows, columns: size.columns })}\n >\n Mesh\n </button>\n <button\n type=\"button\"\n data-vector-envelope-action=\"top\"\n className={buttonClass}\n title=\"Make with Top Object\"\n aria-label=\"Make with Top Object\"\n disabled={!panel.canMakeWithTopObject}\n onClick={() => controller.makeEnvelopeWithTopObject({ rows: size.rows, columns: size.columns })}\n >\n Top\n </button>\n <button type=\"button\" data-vector-envelope-action=\"release\" className={buttonClass} title=\"Release Envelope\" aria-label=\"Release Envelope\" disabled={!panel.canRelease} onClick={() => controller.releaseEnvelope()}>\n Release\n </button>\n <button type=\"button\" data-vector-envelope-action=\"expand\" className={buttonClass} title=\"Expand Envelope\" aria-label=\"Expand Envelope\" disabled={!panel.canRelease} onClick={() => controller.expandAppearance()}>\n Expand\n </button>\n </div>\n {env && (\n <label className=\"flex flex-wrap items-center gap-x-2 gap-y-0.5 text-xs text-foreground\" data-vector-envelope-param=\"style\">\n <span className={labelClass}>Warp</span>\n <select aria-label=\"Envelope warp\" className={selectClass} value={env.params.style} onChange={(e) => set({ style: e.target.value as VectorEnvelopeParams['style'] })}>\n {VECTOR_ENVELOPE_STYLE_OPTIONS.map((o) => (\n <option key={o.value} value={o.value}>\n {o.label}\n </option>\n ))}\n </select>\n </label>\n )}\n {env &&\n env.params.style !== 'mesh' &&\n SLIDERS.map((s) => {\n const value = env.params[s.key];\n const onChange = (ev: React.ChangeEvent<HTMLInputElement>) => {\n const n = parseFloat(ev.target.value);\n if (Number.isFinite(n)) set({ [s.key]: n }, true);\n };\n return (\n <label key={s.key} className=\"flex flex-wrap items-center gap-x-2 gap-y-0.5 text-xs text-foreground\" data-vector-envelope-param={s.key}>\n <span className={labelClass}>{s.label}</span>\n <input\n type=\"range\"\n min={-100}\n max={100}\n step={1}\n aria-label={`Envelope ${s.label} slider`}\n className=\"h-4 min-w-0 flex-1 accent-primary\"\n value={value}\n onChange={onChange}\n onPointerUp={end}\n onKeyUp={end}\n onBlur={end}\n />\n <input type=\"number\" min={-100} max={100} step={1} aria-label={`Envelope ${s.label}`} className={numberClass} value={value} onChange={onChange} onBlur={end} />\n </label>\n );\n })}\n {env && env.params.style !== 'mesh' && (\n <label className=\"flex flex-wrap items-center gap-x-2 gap-y-0.5 text-xs text-foreground\" data-vector-envelope-param=\"orientation\">\n <span className={labelClass}>Orientation</span>\n <select aria-label=\"Envelope orientation\" className={selectClass} value={env.params.orientation} onChange={(e) => set({ orientation: e.target.value as 'horizontal' | 'vertical' })}>\n <option value=\"horizontal\">Horizontal</option>\n <option value=\"vertical\">Vertical</option>\n </select>\n </label>\n )}\n <div className=\"flex items-center gap-2 text-xs text-foreground\" data-vector-envelope-param=\"mesh\">\n <span className=\"min-w-0 flex-1 truncate text-[11px] text-muted-foreground\">Mesh rows × columns</span>\n <input type=\"number\" min={1} max={16} step={1} aria-label=\"Envelope mesh rows\" className={numberClass} value={rows} onChange={(e) => setCount('rows', e.target.value)} />\n <input type=\"number\" min={1} max={16} step={1} aria-label=\"Envelope mesh columns\" className={numberClass} value={columns} onChange={(e) => setCount('columns', e.target.value)} />\n </div>\n {panel.count > 1 && !panel.canMakeWithTopObject && <p className=\"text-[11px] text-muted-foreground\">Select one object to edit its envelope.</p>}\n {env && <p className=\"text-[11px] text-muted-foreground\">Edit the mesh with the Envelope tool (U).</p>}\n </div>\n );\n}\n","import React from 'react';\nimport { VECTOR_MASK_TYPE_OPTIONS, getVectorMaskPanel, type VectorEditorController, type VectorMaskType } from '@pixerate/editor/vector';\nimport { useVectorEditorState } from './useVectorEditor';\n\nconst buttonClass =\n 'inline-flex h-7 min-w-7 items-center justify-center rounded-md border border-border bg-background px-1.5 text-xs font-medium text-foreground hover:bg-muted disabled:cursor-not-allowed disabled:opacity-40 aria-pressed:bg-primary aria-pressed:text-primary-foreground';\nconst selectClass = 'h-7 min-w-0 flex-1 rounded border border-border bg-background px-1 text-xs';\n\nexport interface VectorMaskPanelProps {\n controller: VectorEditorController;\n className?: string;\n}\n\n/**\n * Masks of the selection: Make Clipping Mask, Make Opacity Mask (the topmost selected object\n * masks the others) and Release; for a mask group (or something inside one) its type, Invert, a\n * switch that turns the mask off by hiding it, and Edit Mask / Edit Contents, which select the mask\n * (a path opens for anchor editing) or what it masks. Each change is one undo step.\n */\nexport function VectorMaskPanel({ controller, className }: VectorMaskPanelProps) {\n const state = useVectorEditorState(controller);\n const panel = getVectorMaskPanel(state);\n if (!panel) return null;\n const g = panel.group;\n const ids = g ? [g.id] : undefined;\n return (\n <div className={`space-y-2 ${className ?? ''}`} data-vector-mask-panel=\"\" aria-label=\"Mask\">\n <div className=\"flex flex-wrap items-center gap-1\">\n <span className=\"w-16 text-[11px] font-medium uppercase tracking-wide text-muted-foreground\">Mask</span>\n <button\n type=\"button\"\n data-vector-mask-action=\"clip\"\n className={buttonClass}\n title={panel.makeHint ?? 'Make Clipping Mask: the topmost object clips the others'}\n aria-label=\"Make Clipping Mask\"\n disabled={!panel.canMake}\n onClick={() => controller.makeMask('clip')}\n >\n Clip\n </button>\n <button\n type=\"button\"\n data-vector-mask-action=\"opacity\"\n className={buttonClass}\n title={panel.makeHint ?? 'Make Opacity Mask: the topmost object fades the others by its brightness'}\n aria-label=\"Make Opacity Mask\"\n disabled={!panel.canMake}\n onClick={() => controller.makeMask('luminance')}\n >\n Opacity\n </button>\n <button\n type=\"button\"\n data-vector-mask-action=\"release\"\n className={buttonClass}\n title=\"Release: the mask goes back on top and draws as itself\"\n aria-label=\"Release Mask\"\n disabled={!g}\n onClick={() => controller.releaseMask({ ids })}\n >\n Release\n </button>\n </div>\n {g && (\n <div className=\"space-y-2\" data-vector-mask-group={g.id} data-mask-type={g.type}>\n <div className=\"flex items-center gap-1\">\n <select\n aria-label=\"Mask type\"\n className={selectClass}\n value={g.type}\n title={VECTOR_MASK_TYPE_OPTIONS.find((o) => o.value === g.type)?.title}\n onChange={(e) => controller.setMaskOptions({ type: e.target.value as VectorMaskType }, { ids })}\n >\n {VECTOR_MASK_TYPE_OPTIONS.map((o) => (\n <option key={o.value} value={o.value} title={o.title}>\n {o.label}\n </option>\n ))}\n </select>\n <label className=\"flex items-center gap-1 text-xs text-foreground\" title=\"Show the contents where the mask hides them\">\n <input type=\"checkbox\" aria-label=\"Invert mask\" checked={g.invert} onChange={(e) => controller.setMaskOptions({ invert: e.target.checked }, { ids })} />\n Invert\n </label>\n </div>\n <div className=\"flex flex-wrap items-center gap-1\">\n <button\n type=\"button\"\n data-vector-mask-action=\"edit-mask\"\n className={buttonClass}\n aria-pressed={g.editing === 'mask'}\n title=\"Edit Mask: select the mask (a path opens for anchor editing)\"\n aria-label=\"Edit Mask\"\n onClick={() => controller.editMask({ id: g.id })}\n >\n Edit mask\n </button>\n <button\n type=\"button\"\n data-vector-mask-action=\"edit-contents\"\n className={buttonClass}\n aria-pressed={g.editing === 'contents'}\n title=\"Edit Contents: select what the mask masks\"\n aria-label=\"Edit Contents\"\n disabled={!g.contents.length}\n onClick={() => controller.editMaskContents({ id: g.id })}\n >\n Contents\n </button>\n <button\n type=\"button\"\n data-vector-mask-action=\"toggle\"\n className={buttonClass}\n aria-pressed={g.enabled}\n title={g.enabled ? 'Turn the mask off (hide it): the contents draw whole' : 'Turn the mask on'}\n aria-label=\"Mask on\"\n onClick={() => controller.setMaskOptions({ enabled: !g.enabled }, { ids })}\n >\n {g.enabled ? 'On' : 'Off'}\n </button>\n </div>\n </div>\n )}\n </div>\n );\n}\n","import React, { useId } from 'react';\nimport {\n VECTOR_FONT_WEIGHTS,\n VECTOR_TEXT_ALIGN_OPTIONS,\n applyVectorParagraphStyle,\n applyVectorTextStyle,\n getVectorTextPanel,\n type VectorEditorController,\n type VectorTextAlign,\n} from '@pixerate/editor/vector';\nimport { useVectorEditorState } from './useVectorEditor';\n\nconst buttonClass =\n 'inline-flex h-7 min-w-7 items-center justify-center rounded-md border border-border bg-background px-1.5 text-xs font-medium text-foreground hover:bg-muted disabled:cursor-not-allowed disabled:opacity-40 aria-pressed:bg-primary aria-pressed:text-primary-foreground';\nconst inputClass = 'h-7 min-w-0 flex-1 rounded border border-border bg-background px-1 text-xs';\nconst labelClass = 'w-16 text-[11px] font-medium uppercase tracking-wide text-muted-foreground';\n\nexport interface VectorTextPanelProps {\n controller: VectorEditorController;\n className?: string;\n}\n\nconst num = (v: string) => {\n const n = parseFloat(v);\n return Number.isFinite(n) ? n : null;\n};\n\n/**\n * Character and paragraph style of text: family, weight, size, italic, underline, strike-through,\n * tracking, leading, alignment and point / area text. It edits the selected characters while text\n * is being edited, else the selected text, else the defaults for new text. Type on a Path turns a\n * selected path into path text, and Create Outlines turns text into paths (with an outline\n * shaper). Each change is one undo step.\n */\nexport function VectorTextPanel({ controller, className }: VectorTextPanelProps) {\n const state = useVectorEditorState(controller);\n const listId = `vector-fonts-${useId().replace(/:/g, '')}`;\n const panel = getVectorTextPanel(state);\n if (!panel) return null;\n const f = panel.font;\n const style = (patch: Record<string, unknown>, merge?: string) => applyVectorTextStyle(controller, patch, merge ? { merge } : {});\n const where = panel.target === 'range' ? 'Selected characters' : panel.target === 'nodes' ? 'Selected text' : 'New text';\n return (\n <div className={`space-y-2 ${className ?? ''}`} data-vector-text-panel={panel.target} aria-label=\"Text\">\n <div className=\"flex items-center gap-1\">\n <span className={labelClass}>Text</span>\n <span className=\"text-[11px] text-muted-foreground\">{where}</span>\n </div>\n <div className=\"flex items-center gap-1\">\n <input\n aria-label=\"Font family\"\n className={inputClass}\n list={listId}\n placeholder=\"Mixed\"\n defaultValue={f.fontFamily ?? ''}\n key={`family:${f.fontFamily}`}\n onKeyDown={(e) => {\n if (e.key === 'Enter') (e.target as HTMLInputElement).blur();\n }}\n onBlur={(e) => {\n const v = e.target.value.trim();\n if (v && v !== f.fontFamily) style({ fontFamily: v });\n }}\n />\n <datalist id={listId}>\n {panel.families.map((fam) => (\n <option key={fam} value={fam} />\n ))}\n </datalist>\n </div>\n <div className=\"flex items-center gap-1\">\n <select aria-label=\"Font weight\" className={inputClass} value={f.fontWeight ?? ''} onChange={(e) => style({ fontWeight: Number(e.target.value) })}>\n {f.fontWeight === null && <option value=\"\">Mixed</option>}\n {VECTOR_FONT_WEIGHTS.map((w) => (\n <option key={w.value} value={w.value}>\n {w.label}\n </option>\n ))}\n {f.fontWeight !== null && !VECTOR_FONT_WEIGHTS.some((w) => w.value === f.fontWeight) && <option value={f.fontWeight}>{f.fontWeight}</option>}\n </select>\n <input\n type=\"number\"\n aria-label=\"Font size\"\n title=\"Font size\"\n className={`${inputClass} w-14 flex-none`}\n min={0.5}\n step={1}\n placeholder=\"—\"\n value={f.fontSize === null ? '' : Math.round(f.fontSize * 100) / 100}\n onChange={(e) => {\n const v = num(e.target.value);\n if (v !== null && v >= 0.5) style({ fontSize: v }, 'text-size');\n }}\n onBlur={() => controller.endMergedEdit()}\n />\n </div>\n <div className=\"flex flex-wrap items-center gap-1\">\n <button type=\"button\" className={buttonClass} aria-label=\"Bold\" aria-pressed={(f.fontWeight ?? 0) >= 600} onClick={() => style({ fontWeight: (f.fontWeight ?? 400) >= 600 ? 400 : 700 })}>\n <b>B</b>\n </button>\n <button type=\"button\" className={buttonClass} aria-label=\"Italic\" aria-pressed={f.italic === true} onClick={() => style({ italic: !f.italic })}>\n <i>I</i>\n </button>\n <button type=\"button\" className={buttonClass} aria-label=\"Underline\" aria-pressed={f.underline === true} onClick={() => style({ underline: !f.underline })}>\n <u>U</u>\n </button>\n <button type=\"button\" className={buttonClass} aria-label=\"Strike through\" aria-pressed={f.strikethrough === true} onClick={() => style({ strikethrough: !f.strikethrough })}>\n <s>S</s>\n </button>\n </div>\n <div className=\"flex items-center gap-1\">\n <label className=\"flex flex-1 items-center gap-1 text-xs text-foreground\" title=\"Tracking (1/1000 em)\">\n <span className=\"text-[11px] text-muted-foreground\">VA</span>\n <input\n type=\"number\"\n aria-label=\"Tracking\"\n className={inputClass}\n step={10}\n placeholder=\"—\"\n value={f.tracking ?? ''}\n onChange={(e) => style({ tracking: num(e.target.value) ?? 0 }, 'text-tracking')}\n onBlur={() => controller.endMergedEdit()}\n />\n </label>\n <label className=\"flex flex-1 items-center gap-1 text-xs text-foreground\" title=\"Leading (empty: auto)\">\n <span className=\"text-[11px] text-muted-foreground\">↕</span>\n <input\n type=\"number\"\n aria-label=\"Leading\"\n className={inputClass}\n min={0}\n step={1}\n placeholder=\"Auto\"\n value={f.leading ?? ''}\n onChange={(e) => style({ leading: num(e.target.value) }, 'text-leading')}\n onBlur={() => controller.endMergedEdit()}\n />\n </label>\n </div>\n <div className=\"flex flex-wrap items-center gap-1\" role=\"group\" aria-label=\"Alignment\">\n {VECTOR_TEXT_ALIGN_OPTIONS.map((o) => (\n <button\n key={o.value}\n type=\"button\"\n className={buttonClass}\n aria-label={`Align ${o.label}`}\n aria-pressed={panel.align === o.value}\n onClick={() => applyVectorParagraphStyle(controller, { align: o.value as VectorTextAlign })}\n >\n {o.label}\n </button>\n ))}\n </div>\n {panel.target !== 'defaults' && panel.ids.length === 1 && (\n <div className=\"flex flex-wrap items-center gap-1\">\n <button\n type=\"button\"\n className={buttonClass}\n aria-pressed={panel.frame === 'point'}\n title=\"Point text: no wrapping\"\n onClick={() => controller.setTextFrame(panel.ids[0], { kind: 'point' })}\n >\n Point\n </button>\n <button\n type=\"button\"\n className={buttonClass}\n aria-pressed={panel.frame === 'area'}\n title=\"Area text: wraps in a box\"\n onClick={() => controller.setTextFrame(panel.ids[0], { kind: 'area' })}\n >\n Area\n </button>\n </div>\n )}\n <div className=\"flex flex-wrap items-center gap-1\">\n <button\n type=\"button\"\n className={buttonClass}\n data-vector-text-action=\"type-on-path\"\n disabled={!panel.pathId}\n title={panel.pathId ? 'Type on a Path: set text along the selected path' : 'Select a path to set text along it'}\n onClick={() => {\n const r = controller.typeOnPath(panel.pathId!, { text: 'Text on a path' });\n if (r.ok && r.id) controller.editText(r.id, { anchor: 0, focus: 'Text on a path'.length });\n }}\n >\n Type on path\n </button>\n <button\n type=\"button\"\n className={buttonClass}\n data-vector-text-action=\"create-outlines\"\n disabled={panel.target !== 'nodes' || !panel.outlines}\n title={panel.outlines ? 'Create Outlines: turn the text into paths' : 'Create Outlines needs a font with outlines (load one)'}\n onClick={() => controller.createOutlines({ ids: panel.ids })}\n >\n Create outlines\n </button>\n </div>\n </div>\n );\n}\n","import React, { useId, useState } from 'react';\nimport { getVectorSymbolsPanel, vectorPaintToHex, type VectorEditorController } from '@pixerate/editor/vector';\nimport { useVectorEditorState } from './useVectorEditor';\nimport { VectorFilterDefs, VectorGradientDefs, VectorSceneNodes } from './VectorCanvas';\n\nconst buttonClass =\n 'inline-flex h-7 min-w-7 items-center justify-center rounded-md border border-border bg-background px-1.5 text-xs font-medium text-foreground hover:bg-muted disabled:cursor-not-allowed disabled:opacity-40 aria-pressed:bg-primary aria-pressed:text-primary-foreground';\nconst selectClass = 'h-7 min-w-0 flex-1 rounded border border-border bg-background px-1 text-xs';\nconst labelClass = 'w-16 text-[11px] font-medium uppercase tracking-wide text-muted-foreground';\n\nexport interface VectorSymbolsPanelProps {\n controller: VectorEditorController;\n className?: string;\n}\n\n/**\n * Symbols of the document with previews: New Symbol from the selection, Place, Edit (isolation\n * mode) and Delete per symbol; for a selected instance, Replace, Scale strokes, a fill tint and\n * Detach. Each change is one undo step.\n */\nexport function VectorSymbolsPanel({ controller, className }: VectorSymbolsPanelProps) {\n const state = useVectorEditorState(controller);\n const uid = useId().replace(/:/g, '');\n const panel = getVectorSymbolsPanel(state, { idPrefix: `vsym${uid}-` });\n const [error, setError] = useState<string | null>(null);\n const report = (r: { ok: boolean; message?: string }) => setError(r.ok ? null : (r.message ?? null));\n const inst = panel.instance;\n return (\n <div className={`space-y-2 ${className ?? ''}`} data-vector-symbols-panel=\"\" aria-label=\"Symbols\">\n <div className=\"flex items-center gap-1\">\n <span className={labelClass}>Symbols</span>\n <button type=\"button\" className={buttonClass} data-vector-symbol-action=\"make\" disabled={!panel.canMake} title=\"New Symbol from the selection (F8)\" onClick={() => report(controller.makeSymbol())}>\n New\n </button>\n {panel.editing && (\n <button type=\"button\" className={buttonClass} data-vector-symbol-action=\"exit\" title=\"Leave the symbol (Escape)\" onClick={() => controller.exitSymbolEdit()}>\n Done\n </button>\n )}\n </div>\n {panel.symbols.length > 0 && (\n <ul className=\"space-y-1\">\n {panel.symbols.map((s) => (\n <li key={s.id} data-vector-symbol={s.id} data-editing={s.editing || undefined} className=\"flex items-center gap-1\">\n <svg viewBox={s.viewBox} width={28} height={28} className=\"shrink-0 rounded border border-border bg-background\" aria-hidden=\"true\">\n <VectorGradientDefs defs={s.scene.defs} />\n <VectorFilterDefs filters={s.scene.filters} />\n <VectorSceneNodes nodes={s.scene.nodes} />\n </svg>\n <span className=\"min-w-0 flex-1 truncate text-xs text-foreground\" title={`${s.name} · ${s.instances} instance${s.instances === 1 ? '' : 's'}`}>\n {s.name} <span className=\"text-muted-foreground\">· {s.instances}</span>\n </span>\n <button type=\"button\" className={buttonClass} aria-label={`Place ${s.name}`} title=\"Place an instance\" onClick={() => report(controller.placeSymbol(s.id))}>\n +\n </button>\n <button type=\"button\" className={buttonClass} aria-label={`Edit ${s.name}`} aria-pressed={s.editing} title=\"Edit Symbol (isolation mode)\" onClick={() => report(controller.editSymbol(s.id))}>\n ✎\n </button>\n <button type=\"button\" className={buttonClass} aria-label={`Delete ${s.name}`} title=\"Delete the symbol (its instances become groups)\" onClick={() => report(controller.deleteSymbol(s.id, { detach: true }))}>\n ×\n </button>\n </li>\n ))}\n </ul>\n )}\n {inst && (\n <div className=\"space-y-1\" data-vector-instance={inst.id}>\n <div className=\"flex items-center gap-1\">\n <select aria-label=\"Instance symbol\" className={selectClass} value={inst.symbolId} onChange={(e) => report(controller.replaceSymbol(e.target.value, { ids: [inst.id] }))}>\n {panel.symbols.map((s) => (\n <option key={s.id} value={s.id}>\n {s.name}\n </option>\n ))}\n </select>\n <button type=\"button\" className={buttonClass} title=\"Break Link to Symbol: a plain group of its art\" onClick={() => report(controller.detachInstances({ ids: [inst.id] }))}>\n Detach\n </button>\n </div>\n <div className=\"flex items-center gap-2\">\n <label className=\"flex items-center gap-1 text-xs text-foreground\">\n <input type=\"checkbox\" aria-label=\"Scale strokes\" checked={inst.scaleStrokes} onChange={(e) => report(controller.setInstanceOptions({ scaleStrokes: e.target.checked }, { ids: [inst.id] }))} />\n Scale strokes\n </label>\n <label className=\"flex items-center gap-1 text-xs text-foreground\" title=\"Paint every fill of the art in this instance\">\n Tint\n <input\n type=\"color\"\n aria-label=\"Instance fill\"\n className=\"h-6 w-8 rounded border border-border\"\n value={vectorPaintToHex(inst.fill ?? undefined) ?? '#000000'}\n onChange={(e) => report(controller.setInstanceOptions({ fill: e.target.value }, { ids: [inst.id] }))}\n />\n </label>\n {inst.fill !== null && (\n <button type=\"button\" className={buttonClass} aria-label=\"Clear tint\" onClick={() => report(controller.setInstanceOptions({ fill: null }, { ids: [inst.id] }))}>\n ×\n </button>\n )}\n </div>\n </div>\n )}\n {error && <p className=\"text-[11px] text-destructive\">{error}</p>}\n </div>\n );\n}\n","import React, { useState } from 'react';\nimport { getVectorConstraintPanel, type VectorConstraintAction, type VectorEditorController } from '@pixerate/editor/vector';\nimport { useVectorEditorState } from './useVectorEditor';\n\nconst buttonClass =\n 'inline-flex h-7 min-w-7 items-center justify-center rounded-md border border-border bg-background px-1.5 text-xs font-medium text-foreground hover:bg-muted disabled:cursor-not-allowed disabled:opacity-40';\nconst inputClass = 'h-7 min-w-0 flex-1 rounded border border-border bg-background px-1 text-xs';\nconst labelClass = 'w-16 text-[11px] font-medium uppercase tracking-wide text-muted-foreground';\n\nexport interface VectorConstraintsPanelProps {\n controller: VectorEditorController;\n className?: string;\n}\n\n/**\n * Constraints: the degrees of freedom left, the constraints the selection allows (pick anchors with\n * the direct tool, or round paths), Auto Constrain, the constraints of the selection with their\n * values, and the named parameters. Each change is one undo step.\n */\nexport function VectorConstraintsPanel({ controller, className }: VectorConstraintsPanelProps) {\n const state = useVectorEditorState(controller);\n const panel = getVectorConstraintPanel(state);\n const [error, setError] = useState<string | null>(null);\n const [param, setParam] = useState({ name: '', value: '' });\n const report = (r: { ok: boolean; message?: string }) => setError(r.ok ? null : (r.message ?? null));\n const add = (a: VectorConstraintAction) => report(controller.addConstraint({ kind: a.kind, refs: a.refs }));\n if (!panel.actions.length && !panel.constraints.length && !state.document.constraints?.length && state.tool !== 'direct') return null;\n return (\n <div className={`space-y-2 ${className ?? ''}`} data-vector-constraints-panel=\"\" data-dof-status={panel.dof.status} aria-label=\"Constraints\">\n <div className=\"flex items-center gap-1\">\n <span className={labelClass}>Constraints</span>\n <span className=\"flex-1 truncate text-[11px] text-muted-foreground\" data-vector-dof=\"\">\n {panel.dof.message}\n </span>\n <button type=\"button\" className={buttonClass} title=\"Auto Constrain: add what the selection (or the drawing) nearly satisfies\" onClick={() => report(controller.autoConstrain())}>\n Auto\n </button>\n </div>\n {panel.actions.length > 0 && (\n <div className=\"flex flex-wrap gap-1\" role=\"group\" aria-label=\"Add constraint\">\n {panel.actions.map((a) => (\n <button key={a.kind} type=\"button\" className={buttonClass} data-vector-constraint-action={a.kind} title={`Add ${a.label}`} onClick={() => add(a)}>\n {a.label}\n </button>\n ))}\n </div>\n )}\n {panel.constraints.length > 0 && (\n <ul className=\"space-y-1\">\n {panel.constraints.map((c) => (\n <li key={c.id} data-vector-constraint={c.id} data-satisfied={c.satisfied && !c.conflict ? 'true' : 'false'} className=\"flex items-center gap-1 text-xs text-foreground\">\n <span className={`min-w-0 flex-1 truncate ${c.conflict || !c.satisfied ? 'text-destructive' : ''}`}>\n {c.label}\n {c.name ? ` ${c.name}` : ''}\n </span>\n {c.value !== undefined && (\n <input\n aria-label={`Value of ${c.name ?? c.id}`}\n className={`${inputClass} w-16 flex-none`}\n defaultValue={c.value}\n key={`${c.id}:${c.value}`}\n onKeyDown={(e) => {\n if (e.key === 'Enter') (e.target as HTMLInputElement).blur();\n }}\n onBlur={(e) => {\n if (e.target.value.trim() !== c.value) report(controller.setConstraintValue(c.id, e.target.value));\n }}\n />\n )}\n <button type=\"button\" className={buttonClass} aria-label={`Remove ${c.label} constraint`} onClick={() => report(controller.removeConstraints([c.id]))}>\n ×\n </button>\n </li>\n ))}\n </ul>\n )}\n <div className=\"space-y-1\" aria-label=\"Parameters\">\n {panel.parameters.map((p) => (\n <div key={p.name} className=\"flex items-center gap-1 text-xs\">\n <span className=\"w-12 truncate font-mono\">{p.name}</span>\n <input\n aria-label={`Parameter ${p.name}`}\n className={inputClass}\n defaultValue={p.value}\n key={`${p.name}:${p.value}`}\n onKeyDown={(e) => {\n if (e.key === 'Enter') (e.target as HTMLInputElement).blur();\n }}\n onBlur={(e) => {\n if (e.target.value.trim() !== p.value) report(controller.setConstraintValue(p.name, e.target.value));\n }}\n />\n <span className=\"w-10 text-right text-muted-foreground\">{p.result === null ? '!' : Math.round(p.result * 100) / 100}</span>\n </div>\n ))}\n <form\n className=\"flex items-center gap-1\"\n onSubmit={(e) => {\n e.preventDefault();\n if (!param.name.trim()) return;\n const r = controller.setConstraintValue(param.name.trim(), param.value);\n report(r);\n if (r.ok) setParam({ name: '', value: '' });\n }}\n >\n <input aria-label=\"New parameter name\" placeholder=\"name\" className={`${inputClass} w-12 flex-none`} value={param.name} onChange={(e) => setParam({ ...param, name: e.target.value })} />\n <input aria-label=\"New parameter value\" placeholder=\"value\" className={inputClass} value={param.value} onChange={(e) => setParam({ ...param, value: e.target.value })} />\n <button type=\"submit\" className={buttonClass} aria-label=\"Add parameter\">\n +\n </button>\n </form>\n </div>\n {error && <p className=\"text-[11px] text-destructive\">{error}</p>}\n </div>\n );\n}\n","import React from 'react';\nimport {\n VECTOR_HORIZONTAL_RESIZING,\n VECTOR_HORIZONTAL_RESIZING_LABELS,\n VECTOR_VERTICAL_RESIZING,\n VECTOR_VERTICAL_RESIZING_LABELS,\n getVectorFramePanel,\n vectorPaintToHex,\n type VectorEditorController,\n type VectorHorizontalResizing,\n type VectorVerticalResizing\n} from '@pixerate/editor/vector';\nimport { useVectorEditorState } from './useVectorEditor';\n\nconst buttonClass =\n 'inline-flex h-7 min-w-7 items-center justify-center rounded-md border border-border bg-background px-1.5 text-xs font-medium text-foreground hover:bg-muted disabled:cursor-not-allowed disabled:opacity-40';\nconst selectClass = 'h-7 min-w-0 flex-1 rounded border border-border bg-background px-1 text-xs';\nconst numberClass = 'h-7 w-16 rounded border border-border bg-background px-1.5 text-xs';\n\nexport interface VectorFramePanelProps {\n controller: VectorEditorController;\n className?: string;\n}\n\n/**\n * Frames (artboards): Frame Selection; for a selected frame its position, size (its children\n * follow their constraints), background and clipping; for objects inside a frame their resizing\n * constraints. Each change is one undo step (sizes apply on Enter or blur).\n */\nexport function VectorFramePanel({ controller, className }: VectorFramePanelProps) {\n const state = useVectorEditorState(controller);\n const panel = getVectorFramePanel(state);\n const f = panel.frame;\n const ids = f ? [f.id] : undefined;\n const fillHex = f ? vectorPaintToHex(f.frame.fill ?? null) : null;\n const number = (key: 'x' | 'y' | 'width' | 'height', label: string) => (\n <label className=\"flex items-center gap-1 text-xs text-foreground\">\n <span className=\"w-4 text-muted-foreground\">{label}</span>\n {/* Applied on Enter or blur: each resize lays the children out again, so the digits typed on the way must not. */}\n <input\n key={`${f!.id}:${f!.frame[key]}`}\n type=\"number\"\n step=\"1\"\n min={key === 'width' || key === 'height' ? 1 : undefined}\n aria-label={`Frame ${key}`}\n className={numberClass}\n defaultValue={Math.round(f!.frame[key] * 100) / 100}\n onKeyDown={(e) => {\n if (e.key === 'Enter') e.currentTarget.blur();\n }}\n onBlur={(e) => {\n const n = parseFloat(e.target.value);\n if (Number.isFinite(n) && n !== Math.round(f!.frame[key] * 100) / 100 && (key === 'x' || key === 'y' || n > 0)) controller.setFrame({ [key]: n }, { ids });\n }}\n />\n </label>\n );\n return (\n <div className={`space-y-2 ${className ?? ''}`} data-vector-frame-panel=\"\" aria-label=\"Frame\">\n <div className=\"flex flex-wrap items-center gap-1\">\n <span className=\"w-16 text-[11px] font-medium uppercase tracking-wide text-muted-foreground\">Frame</span>\n <button\n type=\"button\"\n data-vector-frame-action=\"frame-selection\"\n className={buttonClass}\n title=\"Frame Selection: put the selection in a frame fitted to it\"\n aria-label=\"Frame Selection\"\n disabled={!state.selection.length}\n onClick={() => controller.frameSelection()}\n >\n Frame selection\n </button>\n </div>\n {f && (\n <div className=\"space-y-2\" data-vector-frame={f.id}>\n <div className=\"grid grid-cols-2 gap-1\">\n {number('x', 'X')}\n {number('y', 'Y')}\n {number('width', 'W')}\n {number('height', 'H')}\n </div>\n <div className=\"flex items-center gap-2\">\n <label className=\"flex w-16 items-center gap-1.5 text-xs text-foreground\">\n <input\n type=\"checkbox\"\n aria-label=\"Frame fill on\"\n checked={f.frame.fill !== undefined && f.frame.fill !== null}\n onChange={(e) => controller.setFrame({ fill: e.target.checked ? (fillHex ?? '#ffffff') : null }, { ids })}\n />\n Fill\n </label>\n <input\n type=\"color\"\n aria-label=\"Frame fill colour\"\n className=\"h-7 w-10 cursor-pointer rounded border border-border bg-background disabled:opacity-40\"\n disabled={f.frame.fill === undefined || f.frame.fill === null}\n value={fillHex ?? '#ffffff'}\n onChange={(e) => controller.setFrame({ fill: e.target.value }, { ids, merge: 'frame-fill' })}\n />\n <label className=\"flex items-center gap-1 text-xs text-foreground\" title=\"Hide what lies outside the frame\">\n <input type=\"checkbox\" aria-label=\"Clip content\" checked={f.frame.clip !== false} onChange={(e) => controller.setFrame({ clip: e.target.checked }, { ids })} />\n Clip\n </label>\n </div>\n </div>\n )}\n {panel.resizing && (\n <div className=\"space-y-1\" data-vector-resizing=\"\">\n <label className=\"flex items-center gap-2 text-xs text-foreground\">\n <span className=\"w-16\">Horizontal</span>\n <select\n aria-label=\"Horizontal constraint\"\n className={selectClass}\n value={panel.resizing.horizontal}\n onChange={(e) => controller.setResizing({ horizontal: e.target.value as VectorHorizontalResizing }, { ids: panel.resizing!.ids })}\n >\n {panel.resizing.horizontal === 'mixed' && (\n <option value=\"mixed\" disabled>\n Mixed\n </option>\n )}\n {VECTOR_HORIZONTAL_RESIZING.map((h) => (\n <option key={h} value={h}>\n {VECTOR_HORIZONTAL_RESIZING_LABELS[h]}\n </option>\n ))}\n </select>\n </label>\n <label className=\"flex items-center gap-2 text-xs text-foreground\">\n <span className=\"w-16\">Vertical</span>\n <select\n aria-label=\"Vertical constraint\"\n className={selectClass}\n value={panel.resizing.vertical}\n onChange={(e) => controller.setResizing({ vertical: e.target.value as VectorVerticalResizing }, { ids: panel.resizing!.ids })}\n >\n {panel.resizing.vertical === 'mixed' && (\n <option value=\"mixed\" disabled>\n Mixed\n </option>\n )}\n {VECTOR_VERTICAL_RESIZING.map((v) => (\n <option key={v} value={v}>\n {VECTOR_VERTICAL_RESIZING_LABELS[v]}\n </option>\n ))}\n </select>\n </label>\n </div>\n )}\n </div>\n );\n}\n","import React from 'react';\nimport {\n VECTOR_CONNECTOR_ROUTES,\n VECTOR_CONNECTOR_ROUTE_LABELS,\n VECTOR_CONNECTOR_SIDES,\n VECTOR_CONNECTOR_SIDE_LABELS,\n getVectorConnectorPanel,\n type VectorConnectorEnd,\n type VectorConnectorRoute,\n type VectorConnectorSide,\n type VectorEditorController\n} from '@pixerate/editor/vector';\nimport { useVectorEditorState } from './useVectorEditor';\n\nconst buttonClass =\n 'inline-flex h-7 min-w-7 items-center justify-center rounded-md border border-border bg-background px-1.5 text-xs font-medium text-foreground hover:bg-muted disabled:cursor-not-allowed disabled:opacity-40';\nconst selectClass = 'h-7 min-w-0 flex-1 rounded border border-border bg-background px-1 text-xs';\nconst numberClass = 'h-7 w-16 rounded border border-border bg-background px-1.5 text-xs';\n\nexport interface VectorConnectorPanelProps {\n controller: VectorEditorController;\n className?: string;\n}\n\n/**\n * The selected connector: its route (straight, elbow, curved), the elbow corner radius, and for\n * each glued end the side it meets (Auto: the side facing the other end) and Unglue. Each change is\n * one undo step.\n */\nexport function VectorConnectorPanel({ controller, className }: VectorConnectorPanelProps) {\n const state = useVectorEditorState(controller);\n const panel = getVectorConnectorPanel(state);\n if (!panel) return null;\n const ids = [panel.id];\n const end = (key: 'start' | 'end', label: string, e: VectorConnectorEnd | null) => (\n <div className=\"flex items-center gap-1\" data-vector-connector-end={key}>\n <span className=\"w-16 text-xs text-foreground\">{label}</span>\n {e ? (\n <>\n <select\n aria-label={`${label} side`}\n className={selectClass}\n value={e.side ?? 'auto'}\n onChange={(ev) => controller.setConnector({ [key]: { nodeId: e.nodeId, side: ev.target.value as VectorConnectorSide } }, { ids })}\n >\n {VECTOR_CONNECTOR_SIDES.map((s) => (\n <option key={s} value={s}>\n {VECTOR_CONNECTOR_SIDE_LABELS[s]}\n </option>\n ))}\n </select>\n <button type=\"button\" className={buttonClass} title=\"Unglue: the end stays where it is\" aria-label={`Unglue ${label.toLowerCase()}`} onClick={() => controller.setConnector({ [key]: null }, { ids })}>\n Unglue\n </button>\n </>\n ) : (\n <span className=\"text-[11px] text-muted-foreground\">Free</span>\n )}\n </div>\n );\n return (\n <div className={`space-y-2 ${className ?? ''}`} data-vector-connector-panel={panel.id} aria-label=\"Connector\">\n <div className=\"flex items-center gap-1\">\n <span className=\"w-16 text-[11px] font-medium uppercase tracking-wide text-muted-foreground\">Connector</span>\n <select aria-label=\"Connector route\" className={selectClass} value={panel.route} onChange={(e) => controller.setConnector({ route: e.target.value as VectorConnectorRoute }, { ids })}>\n {VECTOR_CONNECTOR_ROUTES.map((r) => (\n <option key={r} value={r}>\n {VECTOR_CONNECTOR_ROUTE_LABELS[r]}\n </option>\n ))}\n </select>\n {panel.route === 'elbow' && (\n <input\n type=\"number\"\n min=\"0\"\n step=\"1\"\n aria-label=\"Elbow radius\"\n title=\"Corner radius of the bends\"\n className={numberClass}\n value={panel.radius}\n onChange={(e) => {\n const n = parseFloat(e.target.value);\n if (Number.isFinite(n) && n >= 0) controller.setConnector({ radius: n }, { ids });\n }}\n />\n )}\n </div>\n {end('start', 'Start', panel.start)}\n {end('end', 'End', panel.end)}\n </div>\n );\n}\n","import React, { useState } from 'react';\nimport { isVectorFreeformGradient, isVectorMeshGradient, vectorPaintToHex, type VectorEditorController, type VectorPathNode } from '@pixerate/editor/vector';\nimport { useVectorEditorState } from './useVectorEditor';\n\nconst buttonClass =\n 'inline-flex h-7 min-w-7 items-center justify-center rounded-md border border-border bg-background px-1.5 text-xs font-medium text-foreground hover:bg-muted disabled:cursor-not-allowed disabled:opacity-40';\nconst numberClass = 'h-7 w-12 rounded border border-border bg-background px-1.5 text-xs';\n\nexport interface VectorShadingPanelProps {\n controller: VectorEditorController;\n className?: string;\n}\n\n/**\n * Gradient meshes and freeform gradients of the selected path: make a rows × columns mesh or a\n * freeform gradient, and edit the point picked with the Gradient tool (colour, opacity, and a\n * freeform point's spread, or remove it). Each change is one undo step.\n */\nexport function VectorShadingPanel({ controller, className }: VectorShadingPanelProps) {\n const state = useVectorEditorState(controller);\n const [rows, setRows] = useState(2);\n const [columns, setColumns] = useState(2);\n const path = state.selection.map((id) => controller.getNode(id)).find((n): n is VectorPathNode => n?.type === 'path');\n if (!path) return null;\n const fill = path.fill;\n const sel = state.shadingPoint?.nodeId === path.id ? state.shadingPoint : null;\n const mesh = isVectorMeshGradient(fill) ? fill : null;\n const free = isVectorFreeformGradient(fill) ? fill : null;\n const color = sel ? (mesh ? mesh.colors[sel.index] : free?.points[sel.index]?.color) : undefined;\n const opacity = sel ? (mesh ? (mesh.opacities?.[sel.index] ?? 1) : (free?.points[sel.index]?.opacity ?? 1)) : 1;\n const spread = sel && free ? (free.points[sel.index]?.spread ?? 0) : 0;\n const edit = (patch: { color?: string; opacity?: number; spread?: number }, merge?: string) => {\n if (!sel) return;\n if (mesh) controller.setMeshPoint(path.id, sel.index, patch, merge ? { merge } : {});\n else controller.setFreeformPoint(path.id, sel.index, patch, merge ? { merge } : {});\n };\n return (\n <div className={`space-y-2 ${className ?? ''}`} data-vector-shading-panel={path.id} aria-label=\"Mesh and freeform gradient\">\n <div className=\"flex flex-wrap items-center gap-1\">\n <span className=\"w-16 text-[11px] font-medium uppercase tracking-wide text-muted-foreground\">Shading</span>\n <input type=\"number\" min={1} max={32} aria-label=\"Mesh rows\" title=\"Mesh rows\" className={numberClass} value={rows} onChange={(e) => setRows(Math.max(1, Math.min(32, parseInt(e.target.value, 10) || 1)))} />\n <span className=\"text-xs text-muted-foreground\">×</span>\n <input type=\"number\" min={1} max={32} aria-label=\"Mesh columns\" title=\"Mesh columns\" className={numberClass} value={columns} onChange={(e) => setColumns(Math.max(1, Math.min(32, parseInt(e.target.value, 10) || 1)))} />\n <button type=\"button\" className={buttonClass} data-vector-shading-action=\"mesh\" title=\"Create Gradient Mesh: smooth patches whose points blend colours (edit them with the Gradient tool)\" onClick={() => controller.setMeshGradient({ rows, columns }, { ids: [path.id] })}>\n Mesh\n </button>\n <button type=\"button\" className={buttonClass} data-vector-shading-action=\"freeform\" title=\"Freeform Gradient: colour points blended across the shape (click inside with the Gradient tool to add one)\" onClick={() => controller.setFreeformGradient({}, { ids: [path.id] })}>\n Freeform\n </button>\n </div>\n {(mesh || free) && !sel && <p className=\"text-[11px] text-muted-foreground\">Gradient tool (G): drag points; {free ? 'click inside to add one, Alt-click to remove.' : 'pick one to colour it.'}</p>}\n {sel && (\n <div className=\"flex flex-wrap items-center gap-2\" data-vector-shading-point={sel.index}>\n <span className=\"w-16 text-xs text-foreground\">Point {sel.index}</span>\n <input type=\"color\" aria-label=\"Point colour\" className=\"h-7 w-10 cursor-pointer rounded border border-border bg-background\" value={vectorPaintToHex(color ?? '#000000') ?? '#000000'} onChange={(e) => edit({ color: e.target.value }, 'shading-color')} />\n <input type=\"range\" min={0} max={1} step={0.05} aria-label=\"Point opacity\" title=\"Opacity\" className=\"h-4 w-20 accent-primary\" value={opacity} onChange={(e) => edit({ opacity: parseFloat(e.target.value) }, 'shading-opacity')} />\n {free && (\n <>\n <input type=\"range\" min={0} max={1} step={0.05} aria-label=\"Point spread\" title=\"Spread: pure colour round the point\" className=\"h-4 w-20 accent-primary\" value={spread} onChange={(e) => edit({ spread: parseFloat(e.target.value) }, 'shading-spread')} />\n <button type=\"button\" className={buttonClass} aria-label=\"Remove point\" onClick={() => controller.removeFreeformPoint(path.id, sel.index)}>\n Remove\n </button>\n </>\n )}\n </div>\n )}\n </div>\n );\n}\n","import React, { useRef, useState } from 'react';\nimport type { VectorEditorController } from '@pixerate/editor/vector';\n\nconst buttonClass =\n 'inline-flex h-7 min-w-7 items-center justify-center rounded-md border border-border bg-background px-1.5 text-xs font-medium text-foreground hover:bg-muted disabled:cursor-not-allowed disabled:opacity-40';\nconst selectClass = 'h-7 min-w-0 flex-1 rounded border border-border bg-background px-1 text-xs';\nconst numberClass = 'h-7 w-12 rounded border border-border bg-background px-1.5 text-xs';\n\nexport interface VectorTracePanelProps {\n controller: VectorEditorController;\n className?: string;\n}\n\n/** Decodes an image file in the browser into RGBA pixels (at most `max` pixels, scaled down to fit). */\nasync function filePixels(file: File, max = 1_000_000): Promise<{ width: number; height: number; data: Uint8ClampedArray }> {\n const bitmap = await createImageBitmap(file);\n const k = Math.min(1, Math.sqrt(max / (bitmap.width * bitmap.height)));\n const width = Math.max(1, Math.round(bitmap.width * k));\n const height = Math.max(1, Math.round(bitmap.height * k));\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext('2d')!;\n ctx.drawImage(bitmap, 0, 0, width, height);\n return { width, height, data: ctx.getImageData(0, 0, width, height).data };\n}\n\n/**\n * Image Trace: pick an image file and trace it into paths, in one colour (dark areas) or a stacked\n * path per colour. The traced group goes on the artboard at its width. One undo step.\n */\nexport function VectorTracePanel({ controller, className }: VectorTracePanelProps) {\n const input = useRef<HTMLInputElement>(null);\n const [mode, setMode] = useState<'threshold' | 'color'>('threshold');\n const [colors, setColors] = useState(6);\n const [message, setMessage] = useState<string | null>(null);\n const trace = async (file: File) => {\n try {\n const pixels = await filePixels(file);\n const doc = controller.getState().document;\n const width = Math.min(doc.width, pixels.width);\n const r = controller.traceImage(pixels, { mode, colors, width, name: file.name.replace(/\\.[^.]+$/, '') || 'Image Trace' });\n setMessage(r.ok ? null : r.message);\n } catch {\n setMessage('That file could not be read as an image.');\n }\n };\n return (\n <div className={`space-y-1 ${className ?? ''}`} data-vector-trace-panel=\"\" aria-label=\"Image trace\">\n <div className=\"flex items-center gap-1\">\n <span className=\"w-16 text-[11px] font-medium uppercase tracking-wide text-muted-foreground\">Trace</span>\n <select aria-label=\"Trace mode\" className={selectClass} value={mode} onChange={(e) => setMode(e.target.value as 'threshold' | 'color')}>\n <option value=\"threshold\">Black &amp; white</option>\n <option value=\"color\">Colours</option>\n </select>\n {mode === 'color' && (\n <input type=\"number\" min={2} max={32} aria-label=\"Trace colours\" title=\"Colours\" className={numberClass} value={colors} onChange={(e) => setColors(Math.max(2, Math.min(32, parseInt(e.target.value, 10) || 2)))} />\n )}\n <button type=\"button\" className={buttonClass} data-vector-trace-action=\"\" title=\"Image Trace: pick an image to turn into paths\" onClick={() => input.current?.click()}>\n Image…\n </button>\n <input\n ref={input}\n type=\"file\"\n accept=\"image/*\"\n hidden\n onChange={(e) => {\n const file = e.target.files?.[0];\n e.target.value = '';\n if (file) void trace(file);\n }}\n />\n </div>\n {message && <p className=\"text-[11px] text-red-600\">{message}</p>}\n </div>\n );\n}\n","import React from 'react';\nimport { VECTOR_SYMMETRY_MODES, VECTOR_SYMMETRY_MODE_LABELS, isVectorSymmetryGroup, type VectorEditorController, type VectorSymmetryMode } from '@pixerate/editor/vector';\nimport { useVectorEditorState } from './useVectorEditor';\n\nconst buttonClass =\n 'inline-flex h-7 min-w-7 items-center justify-center rounded-md border border-border bg-background px-1.5 text-xs font-medium text-foreground hover:bg-muted disabled:cursor-not-allowed disabled:opacity-40 aria-pressed:bg-primary aria-pressed:text-primary-foreground';\nconst selectClass = 'h-7 min-w-0 flex-1 rounded border border-border bg-background px-1 text-xs';\nconst numberClass = 'h-7 w-12 rounded border border-border bg-background px-1.5 text-xs';\n\nexport interface VectorSymmetryPanelProps {\n controller: VectorEditorController;\n className?: string;\n}\n\n/**\n * Live symmetry: make a symmetry group from the selection (or an empty one to draw into), and for\n * a selected symmetry group its mode, radial copies and mirroring, drawing inside it, and release\n * (keeping the copies with Expand). Each change is one undo step.\n */\nexport function VectorSymmetryPanel({ controller, className }: VectorSymmetryPanelProps) {\n const state = useVectorEditorState(controller);\n const group = state.selection.map((id) => controller.getNode(id)).find(isVectorSymmetryGroup) ?? null;\n const s = group?.symmetry;\n const ids = group ? [group.id] : undefined;\n const drawing = !!group && state.symmetryTarget === group.id;\n return (\n <div className={`space-y-2 ${className ?? ''}`} data-vector-symmetry-panel=\"\" aria-label=\"Symmetry\">\n <div className=\"flex flex-wrap items-center gap-1\">\n <span className=\"w-16 text-[11px] font-medium uppercase tracking-wide text-muted-foreground\">Symmetry</span>\n {!group && (\n <button type=\"button\" className={buttonClass} data-vector-symmetry-action=\"make\" title=\"Make Symmetry: the selection (or nothing yet) mirrored live across a vertical axis\" onClick={() => controller.makeSymmetry({ mode: 'vertical' })}>\n Mirror\n </button>\n )}\n {!group && (\n <button type=\"button\" className={buttonClass} data-vector-symmetry-action=\"radial\" title=\"Make Symmetry: the selection repeated round its centre\" onClick={() => controller.makeSymmetry({ mode: 'radial', copies: 6 })}>\n Radial\n </button>\n )}\n {group && s && (\n <>\n <select aria-label=\"Symmetry mode\" className={selectClass} value={s.mode} onChange={(e) => controller.setSymmetry({ mode: e.target.value as VectorSymmetryMode }, { ids })}>\n {VECTOR_SYMMETRY_MODES.map((m) => (\n <option key={m} value={m}>\n {VECTOR_SYMMETRY_MODE_LABELS[m]}\n </option>\n ))}\n </select>\n {s.mode === 'radial' && (\n <>\n <input type=\"number\" min={2} max={64} aria-label=\"Symmetry copies\" title=\"Copies round the circle\" className={numberClass} value={s.copies ?? 6} onChange={(e) => controller.setSymmetry({ copies: Math.max(2, Math.min(64, parseInt(e.target.value, 10) || 2)) }, { ids })} />\n <label className=\"flex items-center gap-1 text-xs text-foreground\" title=\"Mirror each copy too (kaleidoscope)\">\n <input type=\"checkbox\" aria-label=\"Mirror copies\" checked={!!s.mirror} onChange={(e) => controller.setSymmetry({ mirror: e.target.checked }, { ids })} />\n Mirror\n </label>\n </>\n )}\n </>\n )}\n </div>\n {group && (\n <div className=\"flex flex-wrap items-center gap-1\">\n <span className=\"w-16\" />\n <button type=\"button\" className={buttonClass} aria-pressed={drawing} data-vector-symmetry-action=\"draw\" title=\"Draw inside: new pen, pencil, shape and text art goes into the group, mirrored as you draw (Escape stops)\" onClick={() => (drawing ? controller.exitSymmetry() : controller.enterSymmetry(group.id))}>\n Draw inside\n </button>\n <button type=\"button\" className={buttonClass} title=\"Expand: keep the copies as real objects\" onClick={() => controller.releaseSymmetry({ ids, expand: true })}>\n Expand\n </button>\n <button type=\"button\" className={buttonClass} title=\"Release: stop repeating (the copies go)\" onClick={() => controller.releaseSymmetry({ ids })}>\n Release\n </button>\n </div>\n )}\n </div>\n );\n}\n","import React from 'react';\nimport { VECTOR_LENS_LABELS, VECTOR_LENS_SPECS, VECTOR_LENS_TYPES, type VectorEditorController, type VectorLensType, type VectorPathNode } from '@pixerate/editor/vector';\nimport { useVectorEditorState } from './useVectorEditor';\n\nconst selectClass = 'h-7 min-w-0 flex-1 rounded border border-border bg-background px-1 text-xs';\nconst numberClass = 'h-7 w-16 rounded border border-border bg-background px-1.5 text-xs';\n\nexport interface VectorLensPanelProps {\n controller: VectorEditorController;\n className?: string;\n}\n\n/**\n * Lens: for a selected closed path, what it does to what is below it (none, magnify, fish eye,\n * brighten, invert, tinted grayscale, colour add, colour limit, heat map, wireframe,\n * transparency), its amount and colour. Each change is one undo step.\n */\nexport function VectorLensPanel({ controller, className }: VectorLensPanelProps) {\n const state = useVectorEditorState(controller);\n const path = state.selection\n .map((id) => controller.getNode(id))\n .find((n): n is VectorPathNode => n?.type === 'path' && n.subpaths.some((sp) => sp.closed) && !n.connector);\n if (!path) return null;\n const lens = path.lens ?? null;\n const spec = lens ? VECTOR_LENS_SPECS[lens.type] : null;\n const ids = [path.id];\n return (\n <div className={`space-y-2 ${className ?? ''}`} data-vector-lens-panel=\"\" aria-label=\"Lens\">\n <div className=\"flex flex-wrap items-center gap-1\">\n <span className=\"w-16 text-[11px] font-medium uppercase tracking-wide text-muted-foreground\">Lens</span>\n <select\n aria-label=\"Lens type\"\n className={selectClass}\n value={lens?.type ?? ''}\n onChange={(e) => (e.target.value ? controller.setLens({ type: e.target.value as VectorLensType }, { ids }) : controller.setLens(null, { ids }))}\n >\n <option value=\"\">None</option>\n {VECTOR_LENS_TYPES.map((t) => (\n <option key={t} value={t}>\n {VECTOR_LENS_LABELS[t]}\n </option>\n ))}\n </select>\n </div>\n {lens && spec && (\n <div className=\"flex flex-wrap items-center gap-1\">\n <span className=\"w-16\" />\n <input\n type=\"number\"\n aria-label=\"Lens amount\"\n title={`Amount: ${spec.unit} (${spec.min} to ${spec.max})`}\n className={numberClass}\n min={spec.min}\n max={spec.max}\n step={lens.type === 'magnify' ? 0.1 : 1}\n value={lens.amount}\n onChange={(e) => {\n const v = parseFloat(e.target.value);\n if (Number.isFinite(v)) controller.setLens({ amount: Math.min(spec.max, Math.max(spec.min, v)) }, { ids, merge: `lens-amount-${path.id}` });\n }}\n />\n {spec.color !== null && (\n <input type=\"color\" aria-label=\"Lens colour\" title=\"Lens colour\" className=\"h-7 w-9 rounded border border-border bg-background\" value={lens.color ?? spec.color} onChange={(e) => controller.setLens({ color: e.target.value }, { ids, merge: `lens-color-${path.id}` })} />\n )}\n </div>\n )}\n </div>\n );\n}\n","import React from 'react';\nimport {\n VECTOR_GRADIENT_TYPES,\n VECTOR_GRADIENT_SPREADS,\n VECTOR_GRADIENT_INTERPOLATIONS,\n VECTOR_STROKE_GRADIENT_MODES,\n VECTOR_GRADIENT_TYPE_LABELS,\n VECTOR_GRADIENT_SPREAD_LABELS,\n VECTOR_GRADIENT_INTERPOLATION_LABELS,\n VECTOR_STROKE_GRADIENT_MODE_LABELS,\n getVectorGradientEditor,\n vectorPaintToHex,\n type VectorEditorController,\n type VectorGradientInterpolation,\n type VectorGradientSpread,\n type VectorGradientType,\n type VectorStrokeGradientMode,\n} from '@pixerate/editor/vector';\nimport { useVectorEditorState } from './useVectorEditor';\n\nexport interface VectorGradientEditorProps {\n controller: VectorEditorController;\n className?: string;\n}\n\nconst selectClass = 'h-7 min-w-0 flex-1 rounded border border-border bg-background px-1 text-xs';\nconst numberClass = 'h-7 w-14 rounded border border-border bg-background px-1.5 text-xs';\nconst buttonClass =\n 'inline-flex h-7 min-w-7 items-center justify-center rounded border border-border bg-background px-1.5 text-xs text-foreground hover:bg-muted disabled:cursor-not-allowed disabled:opacity-40 aria-pressed:bg-primary aria-pressed:text-primary-foreground';\nconst percent = (v: number) => Math.round(v * 1000) / 10;\n\n/**\n * Gradient editor for the selection's fill or stroke: style (or solid), the stop ramp (click it\n * to add a stop, pick a stop to edit its colour, opacity, position and midpoint), interpolation\n * space, smoothness, spread, how it lies on a stroke, and reverse.\n */\nexport function VectorGradientEditor({ controller, className }: VectorGradientEditorProps) {\n const state = useVectorEditorState(controller);\n const ed = getVectorGradientEditor(state);\n if (!ed) return null;\n const g = ed.gradient;\n const sel = ed.selected;\n const end = () => controller.endMergedEdit();\n const setType = (value: string) => {\n if (value === 'solid') {\n const first = ed.stops[0];\n controller.setStyle({ [ed.target]: vectorPaintToHex(first?.color) ?? first?.color ?? '#000000' }, undefined, { label: 'Solid Colour' });\n } else controller.setGradient({ type: value as VectorGradientType });\n };\n return (\n <div className={`space-y-1.5 ${className ?? ''}`} data-vector-gradient-editor={ed.target} aria-label=\"Gradient\">\n <div className=\"flex items-center gap-1.5\">\n <span className=\"w-16 text-xs text-foreground\">Gradient</span>\n {(['fill', 'stroke'] as const).map((t) => (\n <button key={t} type=\"button\" className={buttonClass} aria-pressed={ed.target === t} onClick={() => controller.setGradientTarget(t)}>\n {t === 'fill' ? 'Fill' : 'Stroke'}\n </button>\n ))}\n {ed.mixed && <span className=\"text-[11px] text-muted-foreground\">Mixed</span>}\n </div>\n <div className=\"flex items-center gap-1.5\">\n <span className=\"w-16 text-xs text-foreground\">Type</span>\n <select aria-label=\"Gradient type\" className={selectClass} value={ed.type ?? 'solid'} onChange={(e) => setType(e.target.value)}>\n <option value=\"solid\">Solid</option>\n {VECTOR_GRADIENT_TYPES.map((t) => (\n <option key={t} value={t}>\n {VECTOR_GRADIENT_TYPE_LABELS[t]}\n </option>\n ))}\n </select>\n <button type=\"button\" className={buttonClass} aria-label=\"Reverse gradient\" title=\"Reverse gradient\" disabled={!g} onClick={() => controller.reverseGradient()}>\n ⇄\n </button>\n </div>\n {g && (\n <>\n <div className=\"relative h-8\" data-vector-gradient-ramp=\"\">\n <div\n role=\"button\"\n tabIndex={-1}\n aria-label=\"Add gradient stop\"\n className=\"absolute inset-x-1.5 top-0 h-4 cursor-copy rounded border border-border\"\n style={{ backgroundImage: `${ed.preview}, repeating-conic-gradient(#ddd 0% 25%, #fff 0% 50%)`, backgroundSize: 'auto, 8px 8px' }}\n onClick={(e) => {\n const r = e.currentTarget.getBoundingClientRect();\n controller.addGradientStop(r.width > 0 ? Math.min(1, Math.max(0, (e.clientX - r.left) / r.width)) : 0.5);\n }}\n />\n {ed.stops.map((s) => (\n <button\n key={s.index}\n type=\"button\"\n data-vector-gradient-stop={s.index}\n aria-label={`Gradient stop ${s.index + 1} at ${percent(s.offset)}%`}\n aria-pressed={s.selected}\n className=\"absolute top-4 h-3.5 w-3 -translate-x-1/2 rounded-sm border border-border aria-pressed:ring-2 aria-pressed:ring-primary\"\n style={{ left: `calc(6px + (100% - 12px) * ${s.offset})`, background: s.color, opacity: 0.4 + 0.6 * (s.opacity ?? 1) }}\n onClick={() => controller.selectGradientStop(s.selected ? null : s.index)}\n />\n ))}\n </div>\n {sel && (\n <div className=\"flex flex-wrap items-center gap-1.5\" data-vector-gradient-selected-stop={sel.index}>\n <input\n type=\"color\"\n aria-label=\"Stop colour\"\n className=\"h-7 w-9 cursor-pointer rounded border border-border bg-background\"\n value={vectorPaintToHex(sel.color) ?? '#000000'}\n onChange={(e) => controller.setGradientStop(sel.index, { color: e.target.value }, { merge: `gradient-stop-color-${sel.index}` })}\n onBlur={end}\n />\n <label className=\"flex items-center gap-1 text-[11px] text-muted-foreground\">\n Opacity\n <input\n type=\"number\"\n min={0}\n max={100}\n step={5}\n aria-label=\"Stop opacity\"\n className={numberClass}\n value={percent(sel.opacity ?? 1)}\n onChange={(e) => {\n const n = parseFloat(e.target.value);\n if (Number.isFinite(n)) controller.setGradientStop(sel.index, { opacity: n / 100 });\n }}\n />\n </label>\n <label className=\"flex items-center gap-1 text-[11px] text-muted-foreground\">\n At\n <input\n type=\"number\"\n min={0}\n max={100}\n step={1}\n aria-label=\"Stop position\"\n className={numberClass}\n value={percent(sel.offset)}\n onChange={(e) => {\n const n = parseFloat(e.target.value);\n if (Number.isFinite(n)) controller.setGradientStop(sel.index, { offset: n / 100 });\n }}\n />\n </label>\n {!sel.last && (\n <label className=\"flex items-center gap-1 text-[11px] text-muted-foreground\">\n Midpoint\n <input\n type=\"number\"\n min={5}\n max={95}\n step={1}\n aria-label=\"Stop midpoint\"\n className={numberClass}\n value={percent(sel.midpoint ?? 0.5)}\n onChange={(e) => {\n const n = parseFloat(e.target.value);\n if (Number.isFinite(n)) controller.setGradientStop(sel.index, { midpoint: n / 100 });\n }}\n />\n </label>\n )}\n <button type=\"button\" className={buttonClass} aria-label=\"Delete stop\" title=\"Delete stop\" disabled={ed.stops.length <= 2} onClick={() => controller.removeGradientStop(sel.index)}>\n ✕\n </button>\n </div>\n )}\n <label className=\"flex items-center gap-1.5 text-xs text-foreground\">\n <span className=\"w-16\">Colours</span>\n <select aria-label=\"Gradient interpolation\" className={selectClass} value={ed.interpolation} onChange={(e) => controller.setGradient({ interpolation: e.target.value as VectorGradientInterpolation })}>\n {VECTOR_GRADIENT_INTERPOLATIONS.map((i) => (\n <option key={i} value={i}>\n {VECTOR_GRADIENT_INTERPOLATION_LABELS[i]}\n </option>\n ))}\n </select>\n </label>\n <label className=\"flex items-center gap-1.5 text-xs text-foreground\">\n <span className=\"w-16\">Smooth</span>\n <input\n type=\"range\"\n min={0}\n max={1}\n step={0.05}\n aria-label=\"Gradient smoothness\"\n className=\"h-4 flex-1 accent-primary\"\n value={ed.smoothness}\n onChange={(e) => controller.setGradient({ smoothness: parseFloat(e.target.value) }, { merge: 'gradient-smoothness' })}\n onPointerUp={end}\n onBlur={end}\n />\n </label>\n <label className=\"flex items-center gap-1.5 text-xs text-foreground\">\n <span className=\"w-16\">Spread</span>\n <select aria-label=\"Gradient spread\" className={selectClass} value={ed.spread} onChange={(e) => controller.setGradient({ spread: e.target.value as VectorGradientSpread })}>\n {VECTOR_GRADIENT_SPREADS.map((sp) => (\n <option key={sp} value={sp}>\n {VECTOR_GRADIENT_SPREAD_LABELS[sp]}\n </option>\n ))}\n </select>\n </label>\n {ed.target === 'stroke' && (\n <label className=\"flex items-center gap-1.5 text-xs text-foreground\">\n <span className=\"w-16\">On stroke</span>\n <select aria-label=\"Gradient on stroke\" className={selectClass} value={ed.strokeMode} onChange={(e) => controller.setGradient({ strokeMode: e.target.value as VectorStrokeGradientMode })}>\n {VECTOR_STROKE_GRADIENT_MODES.map((m) => (\n <option key={m} value={m}>\n {VECTOR_STROKE_GRADIENT_MODE_LABELS[m]}\n </option>\n ))}\n </select>\n </label>\n )}\n </>\n )}\n </div>\n );\n}\n","import React, { useState, useSyncExternalStore } from 'react';\nimport type { VectorEditorController, VectorGroupNode } from '@pixerate/editor/vector';\nimport { EffectParameters, EffectsBrowser, useEffectDescription } from '../effects';\nimport { useVectorEditorState } from './useVectorEditor';\n\nexport interface VectorProviderEffectsPanelProps {\n controller: VectorEditorController;\n className?: string;\n}\n\nconst btn = 'rounded border border-border px-1.5 py-0.5 text-[11px] disabled:opacity-40';\n\nfunction Controls({ controller, group }: { controller: VectorEditorController; group: VectorGroupNode }) {\n const provider = controller.effectsProvider;\n const tag = group.providerEffect!;\n const { description, error } = useEffectDescription(provider, tag.effect);\n const [message, setMessage] = useState<string | null>(null);\n const run = (work: Promise<unknown>) => void work.then(() => setMessage(null), (e: unknown) => setMessage(e instanceof Error ? e.message : String(e)));\n if (!provider) return <p className=\"text-[11px] text-muted-foreground\">No effects provider: the shapes are kept as they are.</p>;\n if (error) return <p className=\"text-[11px] text-amber-500\">{error}</p>;\n if (!description) return <p className=\"text-[11px] text-muted-foreground\">Loading…</p>;\n return (\n <>\n <EffectParameters\n description={description}\n values={tag.values}\n onChange={(k, v) => run(controller.updateVectorEffect(group.id, { [k]: v as never }))}\n onReset={(k) => run(controller.updateVectorEffect(group.id, { [k]: null }))}\n onPreset={(v) => run(controller.updateVectorEffect(group.id, v as never))}\n />\n {message && <p role=\"alert\" className=\"text-[11px] text-destructive\">{message}</p>}\n </>\n );\n}\n\n/**\n * Provider vector effects in a drawing: add one (its picture at rest becomes a selected group of\n * editable shapes), draw it again with new values, or detach it to keep the shapes. Motion is\n * applied in the animation editor.\n */\nexport function VectorProviderEffectsPanel({ controller, className = '' }: VectorProviderEffectsPanelProps) {\n const state = useVectorEditorState(controller);\n const provider = useSyncExternalStore(\n (cb) => controller.effects.subscribe(cb),\n () => controller.effects.provider,\n () => controller.effects.provider,\n );\n const [browse, setBrowse] = useState(false);\n const [message, setMessage] = useState<string | null>(null);\n void state;\n const groups = controller.vectorEffectGroups();\n const selected = groups.filter((g) => state.selection.includes(g.id));\n const run = (work: () => unknown) => {\n setMessage(null);\n Promise.resolve().then(work).catch((e: unknown) => setMessage(e instanceof Error ? e.message : String(e)));\n };\n return (\n <section className={`flex flex-col gap-2 text-xs ${className}`} aria-label=\"Vector effects\" data-vector-provider-effects=\"\">\n <div className=\"flex items-center gap-1\">\n <span className=\"flex-1 font-semibold\">Effects</span>\n <button type=\"button\" className={btn} disabled={!provider} aria-pressed={browse} onClick={() => setBrowse(!browse)}>\n Add effect…\n </button>\n </div>\n {!provider && <p className=\"text-[11px] text-muted-foreground\">No effects provider is registered. Effect groups are kept as shapes.</p>}\n {browse && <EffectsBrowser provider={provider} kinds={['vector']} title=\"Vector effects\" onPick={(e) => (setBrowse(false), run(() => controller.addVectorEffect(e.id)))} />}\n {selected.map((g) => (\n <div key={g.id} className=\"space-y-1 rounded border border-border p-1\" data-vector-effect-group={g.id}>\n <div className=\"flex items-center gap-1\">\n <span className=\"min-w-0 flex-1 truncate font-medium\">{g.providerEffect!.name ?? g.providerEffect!.effect}</span>\n <button type=\"button\" className={btn} title=\"Keep the shapes as a plain group\" onClick={() => run(() => controller.detachVectorEffect(g.id))}>\n Detach\n </button>\n </div>\n <Controls controller={controller} group={g} />\n </div>\n ))}\n {groups.length > 0 && !selected.length && <p className=\"text-[11px] text-muted-foreground\">Select an effect group ({groups.length} in the drawing) to change it.</p>}\n {message && <p role=\"alert\" className=\"text-[11px] text-destructive\">{message}</p>}\n </section>\n );\n}\n","import React from 'react';\nimport type { VectorEditorController, VectorTool } from '@pixerate/editor/vector';\nimport { VectorCanvas, type VectorCanvasProps } from './VectorCanvas';\nimport { VectorStylePanel, VectorToolbar } from './VectorToolbar';\nimport type { EffectProvider } from '@pixerate/editor/effects';\nimport { useEffects } from '../effects';\nimport { VectorProviderEffectsPanel } from './VectorProviderEffectsPanel';\n\nexport interface VectorEditorProps {\n controller: VectorEditorController;\n /** Tools in the toolbar (default: all). */\n tools?: readonly VectorTool[];\n /** The style sidebar (default `true`). */\n showStylePanel?: boolean;\n /** Canvas height (default 520px). */\n height?: number | string;\n canvasProps?: Omit<VectorCanvasProps, 'controller'>;\n /**\n * An effects provider (see `@pixerate/editor/effects`), registered with the controller while\n * mounted: provider vector effects as groups, with an Effects section under the style panel.\n * Optional: without one the editor is as before.\n */\n effects?: EffectProvider | null;\n className?: string;\n}\n\n/** Toolbar, canvas and style panel for a `VectorEditorController`. */\nexport function VectorEditor({ controller, tools, showStylePanel = true, height = 520, canvasProps, effects, className }: VectorEditorProps) {\n useEffects(controller, effects);\n const effectsShown = !!effects || controller.vectorEffectGroups().length > 0;\n return (\n <div className={`flex flex-col gap-2 ${className ?? ''}`} data-vector-editor=\"\">\n <VectorToolbar controller={controller} tools={tools} />\n <div className=\"flex min-h-0 flex-col gap-2 md:flex-row\">\n <div className=\"relative min-h-[320px] flex-1 overflow-hidden rounded-md border border-border bg-muted/40\" style={{ height }}>\n <VectorCanvas controller={controller} {...canvasProps} />\n </div>\n {showStylePanel && (\n <div className=\"flex w-full shrink-0 flex-col gap-2 md:w-56\">\n <VectorStylePanel controller={controller} className=\"rounded-md border border-border p-3\" />\n {effectsShown && <VectorProviderEffectsPanel controller={controller} className=\"rounded-md border border-border p-3\" />}\n </div>\n )}\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":["React","useEffect","useRef","useState","THEME","useRef","num","jsx","jsxs","THEME","React","VectorSceneNode","useRef","useState","useEffect","text","size","React","VECTOR_STROKE_ALIGN_LABELS","vectorPaintToHex","jsx","jsxs","jsx","jsxs","buttonClass","numberClass","selectClass","labelClass","React","jsx","jsxs","buttonClass","numberClass","selectClass","labelClass","React","jsx","jsxs","buttonClass","selectClass","useId","jsx","jsxs","buttonClass","labelClass","useId","useId","useState","vectorPaintToHex","jsx","jsxs","buttonClass","selectClass","labelClass","useId","useState","vectorPaintToHex","useState","jsx","jsxs","buttonClass","inputClass","labelClass","useState","vectorPaintToHex","jsx","jsxs","buttonClass","selectClass","numberClass","vectorPaintToHex","Fragment","jsx","jsxs","buttonClass","selectClass","numberClass","useState","vectorPaintToHex","Fragment","jsx","jsxs","buttonClass","numberClass","useState","vectorPaintToHex","useRef","useState","jsx","jsxs","buttonClass","selectClass","numberClass","Fragment","jsx","jsxs","buttonClass","selectClass","numberClass","jsx","jsxs","selectClass","numberClass","vectorPaintToHex","Fragment","jsx","jsxs","selectClass","numberClass","buttonClass","vectorPaintToHex","Fragment","jsx","jsxs","buttonClass","React","selectClass","numberClass","vectorPaintToHex","VECTOR_STROKE_ALIGN_LABELS","useState","useSyncExternalStore","Fragment","jsx","jsxs","useState","useSyncExternalStore","jsx","jsxs"]}
1
+ {"version":3,"sources":["../../src/vector/useVectorEditor.ts","../../src/vector/VectorCanvas.tsx","../../src/vector/VectorWidthPointEditor.tsx","../../src/vector/VectorToolbar.tsx","../../src/vector/VectorEffectsPanel.tsx","../../src/vector/VectorAppearancePanel.tsx","../../src/vector/VectorEnvelopePanel.tsx","../../src/vector/VectorMaskPanel.tsx","../../src/vector/VectorTextPanel.tsx","../../src/vector/VectorSymbolsPanel.tsx","../../src/vector/VectorConstraintsPanel.tsx","../../src/vector/VectorFramePanel.tsx","../../src/vector/VectorPagesPanel.tsx","../../src/vector/VectorConnectorPanel.tsx","../../src/vector/VectorShadingPanel.tsx","../../src/vector/VectorTracePanel.tsx","../../src/vector/VectorSymmetryPanel.tsx","../../src/vector/VectorPerspectivePanel.tsx","../../src/vector/VectorLensPanel.tsx","../../src/vector/VectorGradientEditor.tsx","../../src/vector/VectorProviderEffectsPanel.tsx","../../src/vector/VectorEditor.tsx"],"sourcesContent":["import { useEffect, useMemo, useRef, useSyncExternalStore } from 'react';\nimport {\n VectorEditorController,\n createVectorCommands,\n createVectorEffectsToolProvider,\n type VectorEffectsToolProviderOptions,\n type VectorCommandOptions,\n type VectorEditorOptions,\n type VectorEditorState,\n type VectorTool,\n} from '@pixerate/editor/vector';\nimport type { ToolRegistry } from '@pixerate/editor/tools';\n\n/** A `VectorEditorController` created once for the component's lifetime (destroyed on unmount). */\nexport function useVectorEditorController(options: VectorEditorOptions = {}): VectorEditorController {\n const ref = useRef<VectorEditorController | null>(null);\n if (!ref.current) ref.current = new VectorEditorController(options);\n const controller = ref.current;\n useEffect(() => () => controller.destroy(), [controller]);\n return controller;\n}\n\n/** The controller's state (re-renders on every change). */\nexport function useVectorEditorState(controller: VectorEditorController): VectorEditorState {\n return useSyncExternalStore(controller.subscribe, controller.getState, controller.getState);\n}\n\nexport interface UseVectorEditorResult {\n controller: VectorEditorController;\n state: VectorEditorState;\n setTool: (tool: VectorTool) => void;\n undo: () => void;\n redo: () => void;\n deleteSelection: () => void;\n toSvg: () => string;\n}\n\n/**\n * Subscribes to a vector editor controller and exposes its state with bound actions. Pass\n * options instead of a controller to create one for the component's lifetime.\n */\nexport function useVectorEditor(controllerOrOptions: VectorEditorController | VectorEditorOptions = {}): UseVectorEditorResult {\n const own = useRef<VectorEditorController | null>(null);\n let controller: VectorEditorController;\n if (controllerOrOptions instanceof VectorEditorController) controller = controllerOrOptions;\n else {\n if (!own.current) own.current = new VectorEditorController(controllerOrOptions);\n controller = own.current;\n }\n const state = useVectorEditorState(controller);\n const actions = useMemo(\n () => ({\n setTool: (tool: VectorTool) => controller.setTool(tool),\n undo: () => void controller.undo(),\n redo: () => void controller.redo(),\n deleteSelection: () => void controller.deleteSelection(),\n toSvg: () => controller.toSvg(),\n }),\n [controller],\n );\n return { controller, state, ...actions };\n}\n\n/** Anything with `register(specs) → unregister` (a `CommandRegistry`). */\nexport interface VectorCommandTarget {\n register(specs: any): () => void;\n}\n\n/**\n * Registers the controller's palette / agent commands (`vector.addShape`, `vector.boolean`, …)\n * in `registry` while mounted, so `createCommandToolProvider` exposes them to agents.\n */\nexport function useVectorCommands(\n registry: VectorCommandTarget | null | undefined,\n controller: VectorEditorController,\n options: VectorCommandOptions = {},\n): void {\n const { prefix, group, scope } = options;\n useEffect(() => {\n if (!registry) return;\n return registry.register(createVectorCommands(controller, { prefix, group, scope }));\n }, [registry, controller, prefix, group, scope]);\n}\n\n/**\n * Registers the vector editor's provider-effect tools (`search_effects`, `apply_effect`, …) in\n * `registry` while mounted. They work once an effects provider is registered (see `useEffects`).\n */\nexport function useVectorEffectsTools(\n registry: ToolRegistry | null | undefined,\n controller: VectorEditorController,\n options: VectorEffectsToolProviderOptions = {},\n): void {\n const { id, namespace, readOnly } = options;\n useEffect(() => {\n if (!registry) return;\n return registry.register(createVectorEffectsToolProvider(controller, { id, namespace, readOnly }));\n }, [registry, controller, id, namespace, readOnly]);\n}\n","import React, { useEffect, useId, useRef, useState } from 'react';\nimport {\n VECTOR_OVERLAY_THEME as THEME,\n getVectorOverlayRenderData,\n getVectorSceneRenderData,\n getVectorSymbolEditBackground,\n isVectorTextTarget,\n toVectorKeyInput,\n toVectorPointerInput,\n vectorDiamondPath,\n type VectorEditorController,\n type VectorRenderNode,\n type VectorRenderMask,\n type VectorRenderPath,\n type VectorRenderPaintLayer,\n type VectorRenderFilter,\n type VectorFilterPrimitive,\n type SvgGradientDef,\n type VectorPaintDef,\n type VectorRenderGradientAnnotator,\n type VectorRenderText,\n} from '@pixerate/editor/vector';\nimport { useVectorEditorState } from './useVectorEditor';\nimport { VectorWidthPointEditor } from './VectorWidthPointEditor';\n\nexport interface VectorCanvasProps {\n controller: VectorEditorController;\n /** Fit the artboard into the canvas when it first gets a size (default `true`). */\n fitOnMount?: boolean;\n /** Draw a checkerboard behind a transparent artboard (default `true`). */\n checkerboard?: boolean;\n /** Overlay accent colour (default sky blue). */\n accentColor?: string;\n /** Smart guide colour (default magenta). */\n guideColor?: string;\n className?: string;\n style?: React.CSSProperties;\n /** Accessible label (default \"Vector canvas\"). */\n 'aria-label'?: string;\n}\n\nfunction GradientElement({ def }: { def: SvgGradientDef }) {\n const stops = def.stops.map((s, i) => <stop key={i} offset={s.offset} stopColor={s.stopColor} stopOpacity={s.stopOpacity} />);\n return def.type === 'radial' ? (\n <radialGradient id={def.id} {...(def.attrs as any)}>\n {stops}\n </radialGradient>\n ) : (\n <linearGradient id={def.id} {...(def.attrs as any)}>\n {stops}\n </linearGradient>\n );\n}\n\n/**\n * Renders paint servers: `<linearGradient>` / `<radialGradient>` descriptors and patterns of\n * gradient tiles (conic, diamond and stroke-mode gradients).\n */\nexport function VectorGradientDefs({ defs }: { defs: readonly VectorPaintDef[] }) {\n if (!defs.length) return null;\n return (\n <defs>\n {defs.map((def) =>\n def.type === 'pattern' ? (\n <pattern key={def.id} id={def.id} {...(def.attrs as any)}>\n {def.gradients.map((g) => (\n <GradientElement key={g.id} def={g} />\n ))}\n {def.tiles.map((t, i) => (\n <path key={i} d={t.d} fill={t.fill} />\n ))}\n </pattern>\n ) : (\n <GradientElement key={def.id} def={def} />\n )\n )}\n </defs>\n );\n}\n\n/** The gradient tool's annotator (screen space): extent, bar, handles, stop chips and midpoints. */\nexport function VectorGradientAnnotator({ annotator: g, accentColor = THEME.accent }: { annotator: VectorRenderGradientAnnotator; accentColor?: string }) {\n const r = THEME.handleRadius + 1.5;\n const ring = (p: { x: number; y: number; hovered: boolean }, part: string, size = r) => (\n <circle data-vector-gradient-handle={part} cx={p.x} cy={p.y} r={size + (p.hovered ? 1 : 0)} fill={THEME.handleFill} stroke={accentColor} strokeWidth={p.hovered ? 2 : 1} />\n );\n return (\n <g data-vector-gradient-annotator={g.type}>\n {g.extent && <path data-vector-gradient-extent=\"\" d={g.extent} fill=\"none\" stroke={accentColor} strokeDasharray=\"4 3\" />}\n <line x1={g.start.x} y1={g.start.y} x2={g.end.x} y2={g.end.y} stroke=\"#ffffff\" strokeWidth={3} />\n <line data-vector-gradient-bar=\"\" x1={g.start.x} y1={g.start.y} x2={g.end.x} y2={g.end.y} stroke={accentColor} />\n {g.aspect && <line x1={g.start.x} y1={g.start.y} x2={g.aspect.x} y2={g.aspect.y} stroke={accentColor} strokeDasharray=\"2 2\" />}\n {ring(g.start, 'start')}\n <rect\n data-vector-gradient-handle={g.end.handle}\n x={g.end.x - r}\n y={g.end.y - r}\n width={2 * r}\n height={2 * r}\n fill={THEME.handleFill}\n stroke={accentColor}\n strokeWidth={g.end.hovered ? 2 : 1}\n />\n {g.aspect && ring(g.aspect, 'aspect', THEME.handleRadius)}\n {g.focal && (\n <g data-vector-gradient-handle=\"focal\">\n <circle cx={g.focal.x} cy={g.focal.y} r={THEME.handleRadius - 1 + (g.focal.hovered ? 1 : 0)} fill={accentColor} stroke={THEME.handleFill} />\n </g>\n )}\n {g.midpoints.map((m) => (\n <path key={m.index} data-vector-gradient-midpoint={m.index} d={vectorDiamondPath(m.x, m.y, 4 + (m.hovered ? 1 : 0))} fill={THEME.handleFill} stroke={accentColor} />\n ))}\n {g.stops.map((s) => (\n <g key={s.index} data-vector-gradient-stop={s.index} data-selected={s.selected || undefined} opacity={g.removing && s.selected ? 0.35 : 1}>\n <line x1={s.barX} y1={s.barY} x2={s.x} y2={s.y} stroke={accentColor} />\n <rect x={s.x - 5} y={s.y - 5} width={10} height={10} rx={2} fill={s.color} fillOpacity={s.opacity} stroke={s.selected ? accentColor : '#ffffff'} strokeWidth={s.selected || s.hovered ? 2 : 1} />\n <rect x={s.x - 6.5} y={s.y - 6.5} width={13} height={13} rx={3} fill=\"none\" stroke={s.selected ? '#ffffff' : accentColor} />\n </g>\n ))}\n </g>\n );\n}\n\n/** SVG `<filter>` elements for `getVectorSceneRenderData(...).filters` (shadows, glows, blurs, feather). */\nexport function VectorFilterDefs({ filters }: { filters: readonly VectorRenderFilter[] }) {\n if (!filters.length) return null;\n // React wants presentation attributes camel-cased (`flood-color` → `floodColor`).\n const props = (attrs: VectorFilterPrimitive['attrs']) => Object.fromEntries(Object.entries(attrs).map(([k, v]) => [k.replace(/-([a-z])/g, (_, c: string) => c.toUpperCase()), v]));\n const primitive = (p: VectorFilterPrimitive, key: number): React.ReactNode =>\n React.createElement(p.tag, { key, ...props(p.attrs) }, p.children?.map(primitive));\n return (\n <defs>\n {filters.map((f) => (\n <filter key={f.id} id={f.id} filterUnits=\"userSpaceOnUse\" x={f.x} y={f.y} width={f.width} height={f.height} colorInterpolationFilters=\"sRGB\">\n {f.primitives.map(primitive)}\n </filter>\n ))}\n </defs>\n );\n}\n\nconst blendStyle = (blendMode: string | undefined): React.CSSProperties | undefined => (blendMode ? { mixBlendMode: blendMode as React.CSSProperties['mixBlendMode'] } : undefined);\n\n/**\n * Text drawn as SVG text: one `<text>` per paint layer, every span a `<tspan>` placed character by\n * character (the layout is the editor's, not the browser's).\n */\nexport function VectorTextElement({ node }: { node: VectorRenderText }) {\n return (\n <g data-vector-id={node.id} data-vector-text=\"\" transform={node.transform} opacity={node.opacity < 1 ? node.opacity : undefined} filter={node.filter} style={blendStyle(node.blendMode)}>\n {node.layers.map((layer, i) => (\n <text\n key={i}\n data-vector-layer={layer.kind}\n xmlSpace=\"preserve\"\n fill={layer.fill}\n stroke={layer.stroke}\n strokeWidth={layer.stroke === 'none' ? undefined : layer.strokeWidth}\n strokeLinejoin={layer.strokeLinejoin as any}\n strokeDasharray={layer.strokeDasharray}\n opacity={layer.opacity < 1 ? layer.opacity : undefined}\n style={{ whiteSpace: 'pre', ...blendStyle(layer.blendMode) }}\n >\n {node.spans.map((sp, k) => (\n <tspan\n key={k}\n x={sp.x}\n y={sp.y}\n rotate={sp.rotate}\n fontFamily={sp.fontFamily}\n fontSize={sp.fontSize}\n fontWeight={sp.fontWeight}\n fontStyle={sp.fontStyle}\n textDecoration={sp.textDecoration}\n fill={layer.runFills && sp.fill ? sp.fill : undefined}\n >\n {sp.text}\n </tspan>\n ))}\n </text>\n ))}\n </g>\n );\n}\n\n/** Renders scene nodes (paths, text and groups) from `getVectorSceneRenderData`. */\nexport function VectorSceneNodes({ nodes }: { nodes: readonly VectorRenderNode[] }) {\n return (\n <>\n {nodes.map((node) => (\n <VectorSceneNode key={node.id} node={node} />\n ))}\n </>\n );\n}\n\n/**\n * One scene node. Memoised on the node object: the scene data hands back the same object for a\n * node an edit did not touch, so only changed nodes re-render.\n */\nconst VectorSceneNode = React.memo(function VectorSceneNode({ node }: { node: VectorRenderNode }) {\n if (node.kind === 'text') return <VectorTextElement node={node} />;\n if (node.kind === 'group')\n return (\n <g data-vector-id={node.id} data-vector-mask={node.mask?.type} transform={node.transform} opacity={node.opacity < 1 ? node.opacity : undefined} filter={node.filter} style={blendStyle(node.blendMode)}>\n {node.mask ? <VectorMaskedNodes mask={node.mask} nodes={node.children} /> : <VectorSceneNodes nodes={node.children} />}\n </g>\n );\n if (node.layers)\n return (\n // Fill and stroke stacks: each layer in order, bottom to top.\n <g data-vector-id={node.id} transform={node.transform} opacity={node.opacity < 1 ? node.opacity : undefined} filter={node.filter} style={blendStyle(node.blendMode)}>\n {node.layers.map((layer) => (\n <VectorPaintPath key={`${layer.kind}-${layer.index}`} paint={layer} d={node.d} fillRule={node.fillRule} layer={`${layer.kind}-${layer.index}`} />\n ))}\n </g>\n );\n return <VectorPaintPath paint={node} d={node.d} fillRule={node.fillRule} id={node.id} transform={node.transform} filter={node.filter} blendMode={node.blendMode} />;\n});\n\n/**\n * A mask group's contents under its mask: the `<clipPath>` (clip) or `<mask>` (alpha, luminance;\n * the mask drawn inside, through the inverting filter when inverted), and an inner `<g>` that\n * references it. The group's own transform, opacity, blend mode and filter are on the outer `<g>`.\n */\nexport function VectorMaskedNodes({ mask, nodes }: { mask: VectorRenderMask; nodes: readonly VectorRenderNode[] }) {\n const b = mask.bounds;\n return (\n <>\n <defs>\n {mask.clip ? (\n <clipPath id={mask.id}>\n {mask.clip.map((c, i) => (\n <path key={i} d={c.d} clipRule={c.clipRule} />\n ))}\n </clipPath>\n ) : (\n b && (\n <mask id={mask.id} maskUnits=\"userSpaceOnUse\" x={b.x} y={b.y} width={b.width} height={b.height} style={mask.type === 'alpha' ? { maskType: 'alpha' } : undefined}>\n {mask.filter ? (\n <g filter={mask.filter}>\n <VectorSceneNodes nodes={mask.nodes ?? []} />\n </g>\n ) : (\n <VectorSceneNodes nodes={mask.nodes ?? []} />\n )}\n </mask>\n )\n )}\n </defs>\n <g data-vector-masked=\"\" clipPath={mask.clip ? `url(#${mask.id})` : undefined} mask={mask.clip ? undefined : `url(#${mask.id})`}>\n <VectorSceneNodes nodes={nodes} />\n </g>\n </>\n );\n}\n\n/**\n * One paint of a path: a node's fill and stroke, or one layer of its stacks. A stroke aligned\n * inside / outside (double width, clipped or masked by the shape) or with arrowheads draws in\n * parts inside a group.\n */\nfunction VectorPaintPath({\n paint,\n d,\n fillRule,\n id,\n transform,\n filter,\n blendMode,\n layer,\n}: {\n paint: VectorRenderPaintLayer | VectorRenderPath;\n d: string;\n fillRule: 'nonzero' | 'evenodd';\n id?: string;\n transform?: string;\n filter?: string;\n blendMode?: string;\n layer?: string;\n}) {\n const opacity = paint.opacity < 1 ? paint.opacity : undefined;\n // A node's blend mode is passed in; a layer carries its own.\n const style = blendStyle(blendMode ?? (layer ? paint.blendMode : undefined));\n const sp = paint.strokeParts;\n if (!sp)\n return (\n <path\n data-vector-id={id}\n data-vector-layer={layer}\n transform={transform}\n d={d}\n fill={paint.fill}\n fillRule={fillRule}\n stroke={paint.stroke}\n strokeWidth={paint.stroke === 'none' ? undefined : paint.strokeWidth}\n strokeLinecap={paint.strokeLinecap as any}\n strokeLinejoin={paint.strokeLinejoin as any}\n strokeDasharray={paint.strokeDasharray}\n opacity={opacity}\n filter={filter}\n style={style}\n />\n );\n const clip = sp.clip;\n const b = clip?.bounds;\n return (\n <g data-vector-id={id} data-vector-layer={layer} data-vector-stroke-align={sp.align} transform={transform} opacity={opacity} filter={filter} style={style}>\n {clip && b && (\n <defs>\n {clip.kind === 'clip' ? (\n <clipPath id={clip.id}>\n <path d={d} clipRule={fillRule} />\n </clipPath>\n ) : (\n <mask id={clip.id} maskUnits=\"userSpaceOnUse\" x={b.x} y={b.y} width={b.width} height={b.height}>\n <rect x={b.x} y={b.y} width={b.width} height={b.height} fill=\"#fff\" />\n <path d={d} fill=\"#000\" fillRule={fillRule} />\n </mask>\n )}\n </defs>\n )}\n <path data-vector-part=\"fill\" d={d} fill={paint.fill} fillRule={fillRule} stroke=\"none\" />\n {sp.outline !== undefined ? (\n // A variable-width stroke: its outline, filled.\n <path\n data-vector-part=\"stroke-outline\"\n d={sp.outline}\n fill={paint.stroke}\n clipPath={clip?.kind === 'clip' ? `url(#${clip.id})` : undefined}\n mask={clip?.kind === 'mask' ? `url(#${clip.id})` : undefined}\n />\n ) : (\n <path\n data-vector-part=\"stroke\"\n d={sp.d}\n fill=\"none\"\n stroke={paint.stroke}\n strokeWidth={sp.width}\n strokeLinecap={paint.strokeLinecap as any}\n strokeLinejoin={paint.strokeLinejoin as any}\n strokeDasharray={paint.strokeDasharray}\n clipPath={clip?.kind === 'clip' ? `url(#${clip.id})` : undefined}\n mask={clip?.kind === 'mask' ? `url(#${clip.id})` : undefined}\n />\n )}\n {sp.heads.map((head, i) => (\n <path key={i} data-vector-part=\"head\" d={head} fill={paint.stroke} />\n ))}\n </g>\n );\n}\n\n/**\n * An SVG canvas for a `VectorEditorController`: draws the document and the editing overlay\n * and forwards pointer, wheel, keyboard and clipboard events. Focus it to use shortcuts.\n */\nexport function VectorCanvas({\n controller,\n fitOnMount = true,\n checkerboard = true,\n accentColor = THEME.accent,\n guideColor = THEME.guide,\n className,\n style,\n 'aria-label': ariaLabel = 'Vector canvas',\n}: VectorCanvasProps) {\n const state = useVectorEditorState(controller);\n const svgRef = useRef<SVGSVGElement | null>(null);\n const textRef = useRef<HTMLTextAreaElement | null>(null);\n const editingText = state.textEdit?.nodeId ?? null;\n const fitted = useRef(!fitOnMount);\n const uid = useId().replace(/:/g, '');\n // The canvas size, so the scene leaves out what is off screen and simplifies what is tiny.\n const [size, setSize] = useState<{ width: number; height: number } | null>(null);\n const scene = getVectorSceneRenderData(state, { idPrefix: `ve${uid}-`, ...(size ? { viewportSize: size } : {}) });\n const overlay = getVectorOverlayRenderData(state);\n // Isolation mode: the rest of the document, dimmed behind the symbol's art.\n const host = getVectorSymbolEditBackground(state, { idPrefix: `ve${uid}-host-` });\n\n useEffect(() => {\n const el = svgRef.current;\n if (!el || fitted.current) return;\n const fit = () => {\n const rect = el.getBoundingClientRect();\n if (fitted.current || rect.width <= 0 || rect.height <= 0) return;\n fitted.current = true;\n controller.zoomToFit({ width: rect.width, height: rect.height });\n };\n fit();\n if (fitted.current || typeof ResizeObserver === 'undefined') return;\n const observer = new ResizeObserver(fit);\n observer.observe(el);\n return () => observer.disconnect();\n }, [controller]);\n\n useEffect(() => {\n const el = svgRef.current;\n if (!el || typeof ResizeObserver === 'undefined') return;\n const measure = () => {\n const r = el.getBoundingClientRect();\n if (r.width > 0 && r.height > 0) setSize((s) => (s && s.width === r.width && s.height === r.height ? s : { width: r.width, height: r.height }));\n };\n measure();\n const observer = new ResizeObserver(measure);\n observer.observe(el);\n return () => observer.disconnect();\n }, []);\n\n // Typing goes into a hidden textarea while text is edited (focused after the click that started it).\n useEffect(() => {\n if (!editingText) return;\n const t = setTimeout(() => textRef.current?.focus({ preventScroll: true }), 0);\n return () => clearTimeout(t);\n }, [editingText]);\n\n // Wheel needs a non-passive listener to stop page scroll / browser zoom.\n useEffect(() => {\n const el = svgRef.current;\n if (!el) return;\n const onWheel = (e: WheelEvent) => {\n e.preventDefault();\n controller.wheel(local(e), { x: e.deltaX, y: e.deltaY }, toVectorPointerInput(e));\n };\n el.addEventListener('wheel', onWheel, { passive: false });\n return () => el.removeEventListener('wheel', onWheel);\n }, [controller]);\n\n const local = (e: { clientX: number; clientY: number }) => {\n const rect = svgRef.current?.getBoundingClientRect();\n return { x: e.clientX - (rect?.left ?? 0), y: e.clientY - (rect?.top ?? 0) };\n };\n\n const clipboard = (kind: 'copy' | 'cut' | 'paste') => (event: React.ClipboardEvent) => {\n const native = (event && 'nativeEvent' in event ? event.nativeEvent : event) as ClipboardEvent;\n const data = native?.clipboardData;\n if (kind === 'paste') {\n const text = data?.getData('text/plain') ?? '';\n const pasted = text ? controller.paste(text) : controller.paste();\n if (pasted.length) event.preventDefault?.();\n return;\n }\n const text = kind === 'cut' ? controller.cut() : controller.copy();\n if (text && data) {\n data.setData('text/plain', text);\n event.preventDefault?.();\n }\n };\n\n const hs = THEME.transformHandleSize;\n const as = THEME.anchorSize;\n const box = overlay.selectionBox;\n const edit = state.widthPointEdit;\n const editAt = edit && { x: edit.point.x * state.viewport.zoom + state.viewport.x, y: edit.point.y * state.viewport.zoom + state.viewport.y };\n\n return (\n <svg\n ref={svgRef}\n role=\"application\"\n aria-label={ariaLabel}\n tabIndex={0}\n data-tool={state.tool}\n className={className}\n style={{ display: 'block', width: '100%', height: '100%', outline: 'none', touchAction: 'none', userSelect: 'none', cursor: state.cursor, ...style }}\n onPointerDown={(e) => {\n svgRef.current?.focus({ preventScroll: true });\n (e.currentTarget as Element).setPointerCapture?.(e.pointerId);\n controller.pointerDown(local(e), toVectorPointerInput(e));\n }}\n onPointerMove={(e) => controller.pointerMove(local(e), toVectorPointerInput(e))}\n onPointerUp={(e) => {\n (e.currentTarget as Element).releasePointerCapture?.(e.pointerId);\n controller.pointerUp(local(e), toVectorPointerInput(e));\n }}\n onPointerCancel={() => controller.cancelDrag()}\n onPointerLeave={() => controller.pointerLeave()}\n onDoubleClick={(e) => controller.doubleClick(local(e))}\n onKeyDown={(e) => {\n if (isVectorTextTarget(e.target)) return;\n if (controller.keyDown(toVectorKeyInput(e))) e.preventDefault();\n }}\n onKeyUp={(e) => controller.keyUp(toVectorKeyInput(e))}\n onCopy={clipboard('copy')}\n onCut={clipboard('cut')}\n onPaste={clipboard('paste')}\n >\n {checkerboard && (\n <defs>\n <pattern id={`ve${uid}-checker`} width={16} height={16} patternUnits=\"userSpaceOnUse\">\n <rect width={16} height={16} fill=\"#ffffff\" />\n <rect width={8} height={8} fill=\"#e5e7eb\" />\n <rect x={8} y={8} width={8} height={8} fill=\"#e5e7eb\" />\n </pattern>\n </defs>\n )}\n <VectorGradientDefs defs={scene.defs} />\n <VectorFilterDefs filters={scene.filters} />\n <rect\n data-vector-artboard=\"\"\n x={overlay.artboard.x}\n y={overlay.artboard.y}\n width={overlay.artboard.width}\n height={overlay.artboard.height}\n fill={scene.background ?? (checkerboard ? `url(#ve${uid}-checker)` : '#ffffff')}\n stroke=\"rgba(0,0,0,0.12)\"\n />\n {host && (\n <g data-vector-symbol-host=\"\" opacity={0.3} pointerEvents=\"none\" transform={host.transform}>\n <VectorGradientDefs defs={host.defs} />\n <VectorFilterDefs filters={host.filters} />\n <VectorSceneNodes nodes={host.nodes} />\n </g>\n )}\n <g data-vector-scene=\"\" transform={scene.transform}>\n <VectorSceneNodes nodes={scene.nodes} />\n </g>\n {overlay.frames.length > 0 && (\n <g data-vector-frame-labels=\"\">\n {overlay.frames.map((f) => (\n <text\n key={f.id}\n data-vector-frame-label={f.id}\n x={f.x}\n y={f.y - 6}\n fontSize={11}\n fontWeight={f.selected ? 600 : 400}\n fill={f.selected ? accentColor : '#737373'}\n style={{ fontFamily: 'system-ui, sans-serif', cursor: 'default', userSelect: 'none' }}\n onPointerDown={(e) => {\n // A frame's name selects it (clicking inside a frame may pick its contents).\n e.stopPropagation();\n controller.select([f.id]);\n }}\n >\n {f.name}\n </text>\n ))}\n </g>\n )}\n <g data-vector-overlay=\"\" pointerEvents=\"none\" fill=\"none\">\n {overlay.outlines.map((o) => (\n <path key={o.id} d={o.d} stroke={accentColor} strokeWidth={o.selected ? 1 : 1.5} opacity={o.selected ? 1 : 0.7} />\n ))}\n {overlay.penPreview && <path d={overlay.penPreview} stroke={accentColor} strokeDasharray=\"4 3\" />}\n {box && (\n <g data-vector-selection=\"\" data-free-distort={box.freeDistort || undefined} transform={box.transform || undefined}>\n <rect x={box.x} y={box.y} width={box.width} height={box.height} stroke={accentColor} />\n <line x1={box.x + box.width / 2} y1={box.y} x2={box.x + box.width / 2} y2={box.y - 24} stroke={accentColor} />\n {box.handles.map((h) =>\n h.handle === 'rotate' ? (\n <circle key={h.handle} data-handle={h.handle} cx={h.x} cy={h.y} r={hs / 2 + 1} fill={THEME.handleFill} stroke={accentColor} />\n ) : (\n <rect key={h.handle} data-handle={h.handle} x={h.x - hs / 2} y={h.y - hs / 2} width={hs} height={hs} fill={THEME.handleFill} stroke={accentColor} />\n ),\n )}\n </g>\n )}\n {overlay.distort && (\n <g data-vector-distort={overlay.distort.mode}>\n <path d={overlay.distort.d} stroke={accentColor} />\n {overlay.distort.corners.map((c, i) => (\n <rect key={i} x={c.x - hs / 2} y={c.y - hs / 2} width={hs} height={hs} fill={THEME.handleFill} stroke={accentColor} />\n ))}\n </g>\n )}\n {overlay.envelope && (\n <g data-vector-envelope-mesh={overlay.envelope.nodeId}>\n <path data-vector-envelope-grid=\"\" d={overlay.envelope.grid} stroke={accentColor} strokeOpacity={0.8} />\n {overlay.envelope.handles.map((h) => (\n <g key={h.index} data-vector-envelope-handle={h.index}>\n <line x1={h.anchorX} y1={h.anchorY} x2={h.x} y2={h.y} stroke={accentColor} strokeOpacity={0.6} />\n <circle cx={h.x} cy={h.y} r={THEME.handleRadius + (h.hovered || h.active ? 1 : 0)} fill={h.active ? accentColor : THEME.handleFill} stroke={accentColor} />\n </g>\n ))}\n {overlay.envelope.anchors.map((a) => {\n const size = as + (a.hovered || a.active ? 2 : 0);\n return <rect key={a.index} data-vector-envelope-anchor={a.index} x={a.x - size / 2} y={a.y - size / 2} width={size} height={size} fill={a.active ? accentColor : THEME.handleFill} stroke={accentColor} />;\n })}\n </g>\n )}\n {overlay.handles.map((h) => (\n <g key={`${h.ref.nodeId}:${h.ref.subpath}:${h.ref.index}:${h.ref.handle}`} data-vector-handle={h.ref.handle}>\n <line x1={h.anchorX} y1={h.anchorY} x2={h.x} y2={h.y} stroke={accentColor} />\n <circle cx={h.x} cy={h.y} r={THEME.handleRadius + (h.hovered ? 1 : 0)} fill={THEME.handleFill} stroke={accentColor} />\n </g>\n ))}\n {overlay.anchors.map((a) => {\n const size = as + (a.hovered ? 2 : 0);\n const fill = a.selected ? accentColor : THEME.handleFill;\n const key = `${a.ref.nodeId}:${a.ref.subpath}:${a.ref.index}`;\n return a.type === 'corner' ? (\n <rect key={key} data-vector-anchor={a.ref.index} x={a.x - size / 2} y={a.y - size / 2} width={size} height={size} fill={fill} stroke={accentColor} />\n ) : (\n <circle key={key} data-vector-anchor={a.ref.index} cx={a.x} cy={a.y} r={size / 2} fill={fill} stroke={accentColor} />\n );\n })}\n {overlay.cornerWidgets.map((w) => (\n <g key={`corner:${w.ref.nodeId}:${w.ref.subpath}:${w.ref.index}`} data-vector-corner-widget={w.ref.index} data-corner-kind={w.kind}>\n <circle cx={w.x} cy={w.y} r={THEME.cornerWidgetRadius + (w.hovered ? 1 : 0)} fill={THEME.handleFill} stroke={accentColor} />\n <circle cx={w.x} cy={w.y} r={1.5} fill={accentColor} />\n </g>\n ))}\n {overlay.masks.map((m) => (\n <path\n key={`mask:${m.id}`}\n data-vector-mask-indicator={m.id}\n data-mask-type={m.type}\n data-inverted={m.invert || undefined}\n d={m.d}\n fill=\"none\"\n stroke={THEME.mask}\n strokeWidth={m.editing ? 1.5 : 1}\n strokeDasharray={m.editing ? undefined : THEME.maskDash}\n opacity={m.enabled ? 1 : 0.5}\n />\n ))}\n {overlay.blend.spines.map((sp) => (\n <g key={`blend:${sp.id}`} data-vector-blend-spine={sp.id} data-replaced={sp.replaced || undefined}>\n <path d={sp.d} fill=\"none\" stroke={accentColor} strokeDasharray=\"4 3\" />\n {sp.keys.map((k, i) => (\n <circle key={i} cx={k.x} cy={k.y} r={THEME.handleRadius} fill={THEME.handleFill} stroke={accentColor} />\n ))}\n </g>\n ))}\n {overlay.blend.start && (\n <g data-vector-blend-start=\"\">\n <path d={overlay.blend.start.d} fill=\"none\" stroke={accentColor} strokeWidth={2} />\n {overlay.blend.start.anchor && <circle cx={overlay.blend.start.anchor.x} cy={overlay.blend.start.anchor.y} r={THEME.handleRadius + 1} fill={accentColor} />}\n </g>\n )}\n {overlay.blend.anchors.map((a, i) => (\n <rect\n key={`blend-anchor:${i}`}\n data-vector-blend-anchor={i}\n x={a.x - as / 2}\n y={a.y - as / 2}\n width={as}\n height={as}\n fill={a.hovered ? accentColor : THEME.handleFill}\n stroke={accentColor}\n />\n ))}\n {overlay.gradient && <VectorGradientAnnotator annotator={overlay.gradient} accentColor={accentColor} />}\n {overlay.widthSpot && (\n <g data-vector-width-spot=\"\">\n <line x1={overlay.widthSpot.left.x} y1={overlay.widthSpot.left.y} x2={overlay.widthSpot.right.x} y2={overlay.widthSpot.right.y} stroke={accentColor} strokeDasharray=\"3 2\" />\n <path d={vectorDiamondPath(overlay.widthSpot.x, overlay.widthSpot.y)} fill=\"none\" stroke={accentColor} />\n </g>\n )}\n {overlay.widthPoints.map((w) => (\n <g key={`width:${w.ref.nodeId}:${w.ref.subpath}:${w.ref.index}`} data-vector-width-point={w.ref.index} data-selected={w.selected || undefined}>\n <line x1={w.left.x} y1={w.left.y} x2={w.right.x} y2={w.right.y} stroke={accentColor} />\n <path d={vectorDiamondPath(w.x, w.y)} fill={w.selected || w.active ? accentColor : THEME.handleFill} stroke={accentColor} strokeWidth={w.hovered === 'center' ? 2 : 1} />\n {(['left', 'right'] as const).map((side) => (\n <circle key={side} data-vector-width-side={side} cx={w[side].x} cy={w[side].y} r={THEME.handleRadius + (w.hovered === side ? 1 : 0)} fill={THEME.handleFill} stroke={accentColor} />\n ))}\n </g>\n ))}\n {state.tool === 'pen' && overlay.anchors.some((a) => a.closes && a.hovered) && (\n <circle cx={overlay.anchors.find((a) => a.closes)!.x} cy={overlay.anchors.find((a) => a.closes)!.y} r={as} stroke={accentColor} />\n )}\n {overlay.builder && (\n <g data-vector-builder={overlay.builder.mode}>\n {overlay.builder.faces.map((d, i) => (\n <path\n key={`f${i}`}\n data-vector-builder-face=\"\"\n d={d}\n fill={overlay.builder!.mode === 'erase' ? THEME.builderEraseFill : THEME.builderFill}\n fillRule=\"nonzero\"\n stroke={overlay.builder!.mode === 'erase' ? THEME.builderErase : accentColor}\n strokeWidth={1}\n />\n ))}\n {overlay.builder.hatches.map((d, i) =>\n d ? (\n <path\n key={`h${i}`}\n data-vector-builder-hatch=\"\"\n d={d}\n fill=\"none\"\n stroke={overlay.builder!.mode === 'erase' ? THEME.builderErase : accentColor}\n strokeOpacity={THEME.builderHatchOpacity}\n strokeWidth={1}\n />\n ) : null\n )}\n {overlay.builder.lines.map((d, i) => (\n <path key={`l${i}`} data-vector-builder-line=\"\" d={d} fill=\"none\" stroke={THEME.builderErase} strokeWidth={3} strokeLinecap=\"round\" />\n ))}\n {overlay.builder.trail && <path data-vector-builder-trail=\"\" d={overlay.builder.trail} fill=\"none\" stroke={overlay.builder.mode === 'erase' ? THEME.builderErase : accentColor} strokeWidth={1} />}\n </g>\n )}\n {overlay.toolStroke && (\n <path\n data-vector-tool-stroke={overlay.toolStroke.tool}\n d={overlay.toolStroke.d}\n stroke={overlay.toolStroke.tool === 'eraser' ? THEME.eraserFill : accentColor}\n strokeWidth={overlay.toolStroke.tool === 'eraser' ? overlay.toolStroke.width : 1}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeDasharray={overlay.toolStroke.tool === 'knife' ? '5 3' : undefined}\n />\n )}\n {overlay.pencilString && (\n <line\n data-vector-pencil-string=\"\"\n x1={overlay.pencilString.x1}\n y1={overlay.pencilString.y1}\n x2={overlay.pencilString.x2}\n y2={overlay.pencilString.y2}\n stroke={accentColor}\n strokeDasharray=\"2 2\"\n />\n )}\n {overlay.cutPoint && <circle data-vector-cut-point=\"\" cx={overlay.cutPoint.x} cy={overlay.cutPoint.y} r={THEME.handleRadius + 1} fill={THEME.handleFill} stroke={accentColor} />}\n {overlay.text && (\n <g data-vector-text-edit={overlay.text.nodeId} data-editing={overlay.text.editing || undefined}>\n <path d={overlay.text.frame} stroke={accentColor} strokeDasharray={overlay.text.editing ? '3 2' : undefined} opacity={0.8} />\n {overlay.text.selection.map((d, i) => (\n <path key={i} data-vector-text-selection=\"\" d={d} fill={accentColor} fillOpacity={0.25} stroke=\"none\" />\n ))}\n {overlay.text.caret && (\n <line data-vector-text-caret=\"\" x1={overlay.text.caret.x1} y1={overlay.text.caret.y1} x2={overlay.text.caret.x2} y2={overlay.text.caret.y2} stroke={accentColor} strokeWidth={1.5} />\n )}\n {overlay.text.overflow && (\n <g data-vector-text-overflow=\"\" transform={`translate(${overlay.text.overflow.x} ${overlay.text.overflow.y})`}>\n <rect x={-5} y={-5} width={10} height={10} fill={THEME.handleFill} stroke=\"#dc2626\" />\n <path d=\"M-3 0H3M0 -3V3\" stroke=\"#dc2626\" />\n </g>\n )}\n </g>\n )}\n {overlay.shading.map((sh) => (\n <g key={`shading:${sh.nodeId}`} data-vector-shading={sh.kind}>\n {sh.lines.map((d, i) => (\n <path key={i} d={d} stroke={accentColor} strokeWidth={1} opacity={0.7} />\n ))}\n {sh.points.map((p) => (\n <circle key={p.index} data-vector-shading-point={p.index} data-selected={p.selected || undefined} cx={p.x} cy={p.y} r={p.selected ? 6 : 4.5} fill={p.color} stroke={p.selected ? accentColor : '#ffffff'} strokeWidth={p.selected ? 2 : 1.5} />\n ))}\n </g>\n ))}\n {overlay.perspective && (\n <g data-vector-perspective-grid=\"\" fill=\"none\" pointerEvents=\"none\">\n {overlay.perspective.planes.map((pl) => (\n <path key={pl.plane} data-vector-perspective-plane={pl.plane} data-active={pl.active || undefined} d={pl.d} stroke={pl.active ? accentColor : guideColor} strokeWidth={pl.active ? 1 : 0.75} opacity={pl.active ? 0.55 : 0.25} />\n ))}\n {overlay.perspective.vanishingPoints.map((v, i) => (\n <circle key={i} data-vector-vanishing-point={i} cx={v.x} cy={v.y} r={4} stroke={accentColor} strokeWidth={1.5} />\n ))}\n <circle data-vector-perspective-origin=\"\" cx={overlay.perspective.origin.x} cy={overlay.perspective.origin.y} r={3} fill={accentColor} />\n </g>\n )}\n {overlay.symmetry.map((sy) => (\n <g key={`sym:${sy.nodeId}`} data-vector-symmetry-axes={sy.nodeId} stroke={accentColor} strokeDasharray={sy.drawing ? undefined : '6 4'} opacity={sy.drawing ? 0.9 : 0.6}>\n {sy.lines.map((l, i) => (\n <line key={i} x1={l.x1} y1={l.y1} x2={l.x2} y2={l.y2} />\n ))}\n </g>\n ))}\n {overlay.trackingPoints.map((t, i) => (\n <path key={`track:${i}`} data-vector-tracking-point=\"\" d={`M${t.x - 5} ${t.y}H${t.x + 5}M${t.x} ${t.y - 5}V${t.y + 5}`} stroke={guideColor} strokeWidth={1.5} />\n ))}\n {overlay.typedEntry && (\n <g data-vector-typed-entry=\"\" transform={`translate(${overlay.typedEntry.x + 14} ${overlay.typedEntry.y + 18})`}>\n <rect x={-3} y={-12} width={overlay.typedEntry.text.length * 7 + 8} height={17} rx={3} fill={THEME.handleFill} stroke={accentColor} />\n <text x={1} y={1} fontSize={11} fill={accentColor} style={{ fontFamily: 'ui-monospace, monospace' }}>\n {overlay.typedEntry.text}\n </text>\n </g>\n )}\n {overlay.connectorSites.map((s) => (\n <circle\n key={`site:${s.nodeId}:${s.side}`}\n data-vector-connection-site={s.side}\n data-active={s.active || undefined}\n cx={s.x}\n cy={s.y}\n r={s.active ? 5 : 3.5}\n fill={s.active ? accentColor : THEME.handleFill}\n stroke={accentColor}\n />\n ))}\n {overlay.constraints.map((c) => (\n <g key={`constraint:${c.id}`} data-vector-constraint-glyph={c.kind} data-satisfied={c.satisfied ? 'true' : 'false'}>\n {c.dimension && <line x1={c.dimension.x1} y1={c.dimension.y1} x2={c.dimension.x2} y2={c.dimension.y2} stroke={c.satisfied ? THEME.guide : '#dc2626'} strokeDasharray=\"2 2\" />}\n <text x={c.x} y={c.y} fontSize={10} textAnchor=\"middle\" fill={c.satisfied ? accentColor : '#dc2626'} stroke=\"#ffffff\" strokeWidth={3} paintOrder=\"stroke\" style={{ fontFamily: 'system-ui, sans-serif' }}>\n {c.label}\n </text>\n </g>\n ))}\n {overlay.textBox && (\n <rect data-vector-text-box=\"\" x={overlay.textBox.x} y={overlay.textBox.y} width={overlay.textBox.width} height={overlay.textBox.height} stroke={accentColor} strokeDasharray=\"3 2\" />\n )}\n {overlay.marquee && (\n <rect\n data-vector-marquee=\"\"\n x={overlay.marquee.x}\n y={overlay.marquee.y}\n width={overlay.marquee.width}\n height={overlay.marquee.height}\n fill={THEME.marqueeFill}\n stroke={accentColor}\n strokeDasharray=\"3 2\"\n />\n )}\n {overlay.guides.lines.length > 0 && (\n <g data-vector-guides=\"\" stroke={guideColor}>\n {overlay.guides.lines.map((l, i) => (\n <line key={i} data-vector-guide={l.kind} x1={l.x1} y1={l.y1} x2={l.x2} y2={l.y2} strokeDasharray={l.kind === 'construction' ? '4 3' : undefined} />\n ))}\n </g>\n )}\n {overlay.guides.labels.map((l, i) => (\n <text\n key={i}\n data-vector-guide-label={l.kind}\n x={l.x + 6}\n y={l.y - 6}\n fontSize={10}\n fill={guideColor}\n stroke=\"#ffffff\"\n strokeWidth={3}\n paintOrder=\"stroke\"\n style={{ fontFamily: 'system-ui, sans-serif' }}\n >\n {l.text}\n </text>\n ))}\n {overlay.status && (\n <text data-vector-status=\"\" x={8} y=\"100%\" dy={-8} fontSize={11} fill={accentColor} style={{ fontFamily: 'system-ui, sans-serif' }}>\n {overlay.status}\n </text>\n )}\n </g>\n {state.textEdit && overlay.text && (\n // A hidden textarea at the caret takes typing and composed (IME) text.\n <foreignObject x={overlay.text.caret?.x1 ?? 0} y={overlay.text.caret?.y1 ?? 0} width={1} height={1} style={{ overflow: 'visible' }}>\n <textarea\n ref={textRef}\n data-testid=\"vector-type-input\"\n aria-label=\"Text\"\n autoCapitalize=\"off\"\n autoCorrect=\"off\"\n spellCheck={false}\n style={{ position: 'absolute', width: 1, height: 1, padding: 0, border: 0, opacity: 0, resize: 'none', overflow: 'hidden' }}\n onPointerDown={(e) => e.stopPropagation()}\n onInput={(e) => {\n const el = e.currentTarget;\n if ((e.nativeEvent as InputEvent).isComposing) return;\n if (el.value) controller.textInput(el.value);\n el.value = '';\n }}\n onCompositionEnd={(e) => {\n const el = e.currentTarget;\n if (el.value) controller.textInput(el.value);\n el.value = '';\n }}\n onKeyDown={(e) => {\n e.stopPropagation();\n if (e.nativeEvent.isComposing) return;\n // Characters come through `input`; editing keys and shortcuts go to the controller.\n if (e.key.length === 1 && !e.metaKey && !e.ctrlKey) return;\n if (controller.keyDown(toVectorKeyInput(e))) e.preventDefault();\n if (!controller.getState().textEdit) svgRef.current?.focus({ preventScroll: true });\n }}\n onKeyUp={(e) => e.stopPropagation()}\n onCopy={(e) => {\n const text = controller.getSelectedText();\n if (text) {\n e.clipboardData.setData('text/plain', text);\n e.preventDefault();\n }\n e.stopPropagation();\n }}\n onCut={(e) => {\n const text = controller.cutText();\n if (text) {\n e.clipboardData.setData('text/plain', text);\n e.preventDefault();\n }\n e.stopPropagation();\n }}\n onPaste={(e) => {\n const text = e.clipboardData.getData('text/plain');\n if (text) controller.textInput(text);\n e.preventDefault();\n e.stopPropagation();\n }}\n />\n </foreignObject>\n )}\n {state.symbolEdit && (\n // Isolation mode: which symbol, and the way out (Escape with nothing selected works too).\n <foreignObject data-vector-symbol-edit={state.symbolEdit.symbolId} x={8} y={8} width={320} height={32} style={{ overflow: 'visible' }}>\n <div\n style={{ display: 'inline-flex', alignItems: 'center', gap: 8, padding: '4px 8px', borderRadius: 6, background: 'rgba(15,23,42,0.85)', color: '#fff', font: '12px system-ui, sans-serif' }}\n onPointerDown={(e) => e.stopPropagation()}\n onDoubleClick={(e) => e.stopPropagation()}\n onKeyDown={(e) => e.stopPropagation()}\n >\n <span>Symbol: {state.symbolEdit.name}</span>\n <button type=\"button\" aria-label=\"Exit symbol\" style={{ border: '1px solid rgba(255,255,255,0.4)', borderRadius: 4, padding: '0 6px', background: 'transparent', color: '#fff', cursor: 'pointer' }} onClick={() => controller.exitSymbolEdit()}>\n Done\n </button>\n </div>\n </foreignObject>\n )}\n {edit && editAt && (\n // Width Point Edit (double-click with the width tool), beside the point.\n <foreignObject data-vector-width-point-edit=\"\" x={editAt.x + 12} y={editAt.y + 12} width={180} height={140} style={{ overflow: 'visible' }}>\n <VectorWidthPointEditor key={`${edit.nodeId}:${edit.index}:${edit.t}`} controller={controller} edit={edit} accentColor={accentColor} />\n </foreignObject>\n )}\n </svg>\n );\n}\n","import React, { useRef, useState } from 'react';\nimport { VECTOR_OVERLAY_THEME as THEME, type VectorEditorController, type VectorWidthPointEdit } from '@pixerate/editor/vector';\n\nexport interface VectorWidthPointEditorProps {\n controller: VectorEditorController;\n /** The point being edited (`state.widthPointEdit`). */\n edit: VectorWidthPointEdit;\n /** Accent colour of the Apply button (default sky blue). */\n accentColor?: string;\n className?: string;\n style?: React.CSSProperties;\n}\n\nconst round = (v: number, digits: number) => String(Math.round(v * 10 ** digits) / 10 ** digits);\n\nconst fieldStyle: React.CSSProperties = { display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: 6 };\nconst inputStyle: React.CSSProperties = { width: 72, font: 'inherit', padding: '1px 4px' };\n\n/**\n * Width Point Edit: the position (percent along the path) and the left / right side widths\n * (document units) of the width point a width-tool double-click opened. Apply (or Enter) sets\n * them with `commitWidthPointEdit`; Cancel or Escape closes it. `<VectorCanvas>` shows it next\n * to the point; use it on its own to place it elsewhere.\n */\nexport function VectorWidthPointEditor({ controller, edit, accentColor = THEME.accent, className, style }: VectorWidthPointEditorProps) {\n const [position, setPosition] = useState(() => round(edit.t * 100, 2));\n const [left, setLeft] = useState(() => round(edit.left, 3));\n const [right, setRight] = useState(() => round(edit.right, 3));\n const formRef = useRef<HTMLFormElement | null>(null);\n // Hand the keyboard back to the canvas around it.\n const refocus = () => (formRef.current?.closest('svg') as SVGSVGElement | null)?.focus?.({ preventScroll: true });\n const close = () => {\n refocus();\n controller.closeWidthPointEdit();\n };\n const num = (v: string) => (v.trim() !== '' && Number.isFinite(Number(v)) ? Number(v) : undefined);\n const apply = () => {\n const t = num(position);\n refocus();\n controller.commitWidthPointEdit({ t: t === undefined ? undefined : Math.min(Math.max(t, 0), 100) / 100, left: num(left), right: num(right) });\n };\n const stop = (e: React.SyntheticEvent) => e.stopPropagation();\n return (\n <form\n ref={formRef}\n data-vector-width-point-editor=\"\"\n aria-label=\"Width point\"\n className={className}\n style={{\n display: 'grid',\n gap: 4,\n padding: 8,\n background: '#ffffff',\n border: '1px solid rgba(0,0,0,0.15)',\n borderRadius: 6,\n boxShadow: '0 2px 8px rgba(0,0,0,0.15)',\n font: '12px system-ui, sans-serif',\n color: '#18181b',\n ...style,\n }}\n // Keep the canvas from treating clicks, keys and clipboard use in here as editing gestures.\n onPointerDown={stop}\n onPointerMove={stop}\n onPointerUp={stop}\n onDoubleClick={stop}\n onCopy={stop}\n onCut={stop}\n onPaste={stop}\n onKeyDown={(e) => {\n e.stopPropagation();\n if (e.key === 'Escape') {\n e.preventDefault();\n close();\n }\n }}\n onSubmit={(e) => {\n e.preventDefault();\n apply();\n }}\n >\n <label style={fieldStyle}>\n Position %\n <input aria-label=\"Width point position\" type=\"number\" min={0} max={100} step=\"any\" value={position} onChange={(e) => setPosition(e.target.value)} style={inputStyle} autoFocus />\n </label>\n <label style={fieldStyle}>\n Left\n <input aria-label=\"Width point left side\" type=\"number\" min={0} step=\"any\" value={left} onChange={(e) => setLeft(e.target.value)} style={inputStyle} />\n </label>\n <label style={fieldStyle}>\n Right\n <input aria-label=\"Width point right side\" type=\"number\" min={0} step=\"any\" value={right} onChange={(e) => setRight(e.target.value)} style={inputStyle} />\n </label>\n <div style={{ display: 'flex', justifyContent: 'flex-end', gap: 4, marginTop: 2 }}>\n <button type=\"button\" onClick={close}>\n Cancel\n </button>\n <button type=\"submit\" style={{ background: accentColor, color: '#ffffff', border: 'none', borderRadius: 4, padding: '2px 8px' }}>\n {edit.index === null ? 'Add' : 'Apply'}\n </button>\n </div>\n </form>\n );\n}\n","import React from 'react';\nimport {\n VECTOR_TOOLS,\n VECTOR_TOOL_GLYPHS,\n VECTOR_TOOL_SHORTCUTS,\n VECTOR_EDIT_TOGGLES,\n VECTOR_PATH_ACTIONS,\n VECTOR_PATHFINDER_ACTIONS,\n VECTOR_FILL_GAP,\n VECTOR_ARROWHEADS,\n VECTOR_ARROWHEAD_LABELS,\n VECTOR_CORNER_KINDS,\n VECTOR_CORNER_KIND_LABELS,\n VECTOR_STROKE_ALIGN_LABELS,\n VECTOR_WIDTH_PRESETS,\n VECTOR_BLEND_SPACINGS,\n VECTOR_BLEND_SPACING_LABELS,\n applyVectorBlendOptions,\n getVectorBlendControls,\n getVectorSelectionStyle,\n isVectorMaskGroup,\n widthProfilePreset,\n widthProfilePresetId,\n vectorPaintToHex,\n vectorToolLabel,\n type VectorArrowhead,\n type VectorBlendSpacing,\n type VectorCornerKind,\n type VectorEditorController,\n type VectorStrokeAlign,\n type VectorTool,\n type VectorWidthPreset,\n vectorPolarAngles,\n vectorPolarIncrementOf\n} from '@pixerate/editor/vector';\nimport { useVectorEditorState } from './useVectorEditor';\nimport { VectorEffectsPanel } from './VectorEffectsPanel';\nimport { VectorAppearancePanel } from './VectorAppearancePanel';\nimport { VectorEnvelopePanel } from './VectorEnvelopePanel';\nimport { VectorMaskPanel } from './VectorMaskPanel';\nimport { VectorTextPanel } from './VectorTextPanel';\nimport { VectorSymbolsPanel } from './VectorSymbolsPanel';\nimport { VectorConstraintsPanel } from './VectorConstraintsPanel';\nimport { VectorFramePanel } from './VectorFramePanel';\nimport { VectorPagesPanel } from './VectorPagesPanel';\nimport { VectorConnectorPanel } from './VectorConnectorPanel';\nimport { VectorShadingPanel } from './VectorShadingPanel';\nimport { VectorTracePanel } from './VectorTracePanel';\nimport { VectorSymmetryPanel } from './VectorSymmetryPanel';\nimport { VectorPerspectivePanel } from './VectorPerspectivePanel';\nimport { VectorLensPanel } from './VectorLensPanel';\nimport { VectorGradientEditor } from './VectorGradientEditor';\n\nconst VECTOR_SNAP_TITLE = 'Snap to objects';\nconst modKeyLabel = () => (typeof navigator !== 'undefined' && /Mac|iPhone|iPad/.test(navigator.platform ?? '') ? '⌘' : 'Ctrl');\n\nconst buttonClass =\n 'inline-flex h-8 min-w-8 items-center justify-center rounded-md border border-border bg-background px-2 text-xs font-medium text-foreground hover:bg-muted disabled:cursor-not-allowed disabled:opacity-40 aria-pressed:bg-primary aria-pressed:text-primary-foreground';\n\nexport interface VectorToolbarProps {\n controller: VectorEditorController;\n /** Tools to show (default: all). */\n tools?: readonly VectorTool[];\n /** Undo / redo buttons (default `true`). */\n showHistory?: boolean;\n /** Boolean, Pathfinder, group, arrange and align buttons (default `true`). */\n showArrange?: boolean;\n /** The snapping toggle (default `true`). */\n showSnap?: boolean;\n /**\n * Path editing: Join, Average, Cut at Points, Remove Redundant Points, Smooth, the Keep\n * Shape / Curvature / Shapes toggles, and the pencil smoothing and eraser size inputs while\n * those tools are active (default `true`).\n */\n showPathEdit?: boolean;\n /**\n * Blend: Make Blend, spacing (steps, distance or smooth colour), steps / distance, orient to\n * spine, Replace Spine, Expand and Release (default `true`).\n */\n showBlend?: boolean;\n /** The Free Distort toggle of the selection box (default `true`). */\n showDistort?: boolean;\n className?: string;\n}\n\n/** Tool picker plus undo, snapping, boolean operations, grouping, stacking and alignment. */\nexport function VectorToolbar({\n controller,\n tools = VECTOR_TOOLS,\n showHistory = true,\n showArrange = true,\n showSnap = true,\n showPathEdit = true,\n showBlend = true,\n showDistort = true,\n className,\n}: VectorToolbarProps) {\n const state = useVectorEditorState(controller);\n const count = state.selection.length;\n const points = state.tool === 'direct' ? state.selectedAnchors.length : 0;\n const editing = state.editing;\n const groupSelected = state.selection.some((id) => controller.getNode(id)?.type === 'group');\n const maskSelected = state.selection.some((id) => isVectorMaskGroup(controller.getNode(id)));\n // Live booleans keep the operands editable; a lone live group or its operands take the operation too.\n const [live, setLive] = React.useState(false);\n const booleanDisabled = live ? count < 1 : count < 2;\n const act = (label: string, title: string, run: () => unknown, disabled = false) => (\n <button key={label} type=\"button\" className={buttonClass} title={title} aria-label={title} disabled={disabled} onClick={() => void run()}>\n {label}\n </button>\n );\n return (\n <div role=\"toolbar\" aria-label=\"Vector tools\" className={`flex flex-wrap items-center gap-1 ${className ?? ''}`}>\n <div className=\"flex items-center gap-1\" role=\"group\" aria-label=\"Tools\">\n {tools.map((tool) => (\n <button\n key={tool}\n type=\"button\"\n data-vector-tool={tool}\n className={buttonClass}\n aria-pressed={state.tool === tool}\n title={`${vectorToolLabel(tool)} (${VECTOR_TOOL_SHORTCUTS[tool]})`}\n aria-label={vectorToolLabel(tool)}\n onClick={() => controller.setTool(tool)}\n >\n {VECTOR_TOOL_GLYPHS[tool]}\n </button>\n ))}\n </div>\n {showHistory && (\n <div className=\"ml-1 flex items-center gap-1\" role=\"group\" aria-label=\"History\">\n {act('↶', state.canUndo ? `Undo ${state.undoLabel}` : 'Undo', () => controller.undo(), !state.canUndo)}\n {act('↷', state.canRedo ? `Redo ${state.redoLabel}` : 'Redo', () => controller.redo(), !state.canRedo)}\n </div>\n )}\n {showSnap && (\n <div className=\"ml-1 flex items-center gap-1\" role=\"group\" aria-label=\"Snapping\">\n <button\n type=\"button\"\n data-vector-snap=\"\"\n className={buttonClass}\n aria-pressed={state.snap.objects}\n title={`${VECTOR_SNAP_TITLE} (hold ${modKeyLabel()} to bypass)`}\n aria-label={VECTOR_SNAP_TITLE}\n onClick={() => controller.toggleSnapping()}\n >\n Snap\n </button>\n <select\n data-vector-polar=\"\"\n aria-label=\"Polar tracking increment\"\n title=\"Polar tracking: the angles drawn points snap to from where they leave\"\n className=\"h-8 rounded-md border border-border bg-background px-1 text-xs\"\n value={String(vectorPolarIncrementOf(state.snap.angles) ?? '')}\n onChange={(e) => controller.setSnap({ angles: vectorPolarAngles(Number(e.target.value)) })}\n >\n {vectorPolarIncrementOf(state.snap.angles) === null && <option value=\"\">Custom</option>}\n {[90, 45, 30, 15].map((n) => (\n <option key={n} value={n}>\n {n}°\n </option>\n ))}\n </select>\n </div>\n )}\n {showPathEdit && (\n <div className=\"ml-1 flex items-center gap-1\" role=\"group\" aria-label=\"Path editing\">\n {VECTOR_PATH_ACTIONS.map((a) => (\n <button\n key={a.id}\n type=\"button\"\n data-vector-path-action={a.id}\n className={buttonClass}\n title={a.shortcut ? `${a.title} (${modKeyLabel()}+${a.shortcut})` : a.title}\n aria-label={a.title}\n disabled={!a.enabled(count, points)}\n onClick={() => void a.run(controller)}\n >\n {a.label}\n </button>\n ))}\n {VECTOR_EDIT_TOGGLES.map((t) => (\n <button\n key={t.key}\n type=\"button\"\n data-vector-edit={t.key}\n className={buttonClass}\n aria-pressed={editing[t.key]}\n title={t.title}\n aria-label={t.title}\n onClick={() => controller.setEditing({ [t.key]: !editing[t.key] })}\n >\n {t.label}\n </button>\n ))}\n {state.tool === 'pencil' && (\n <label className=\"flex items-center gap-1 text-xs text-foreground\">\n Smoothing\n <input\n type=\"range\"\n min={0}\n max={1}\n step={0.05}\n aria-label=\"Pencil smoothing\"\n className=\"h-4 w-20 accent-primary\"\n value={editing.pencilSmoothing}\n onChange={(e) => controller.setEditing({ pencilSmoothing: parseFloat(e.target.value) })}\n />\n </label>\n )}\n {state.tool === 'eraser' && (\n <label className=\"flex items-center gap-1 text-xs text-foreground\">\n Size\n <input\n type=\"number\"\n min={0.5}\n step={1}\n aria-label=\"Eraser size\"\n className=\"h-7 w-16 rounded border border-border bg-background px-1.5 text-xs\"\n value={editing.eraserSize}\n onChange={(e) => {\n const n = parseFloat(e.target.value);\n if (Number.isFinite(n) && n > 0) controller.setEditing({ eraserSize: n });\n }}\n />\n </label>\n )}\n {state.tool === 'paintBucket' && (\n <button\n type=\"button\"\n data-vector-fill-gap=\"\"\n className={buttonClass}\n aria-pressed={editing.fillGap > 0}\n title=\"Close small gaps between path ends when filling\"\n aria-label=\"Close gaps\"\n onClick={() => controller.setEditing({ fillGap: editing.fillGap > 0 ? 0 : VECTOR_FILL_GAP })}\n >\n Gaps\n </button>\n )}\n </div>\n )}\n {showDistort && (\n <div className=\"ml-1 flex items-center gap-1\" role=\"group\" aria-label=\"Distort\">\n <button\n type=\"button\"\n data-vector-free-distort=\"\"\n className={buttonClass}\n aria-pressed={state.freeDistort}\n title={`Free Distort: drag a corner of the selection box to distort in perspective (Shift+Alt+${modKeyLabel()}: symmetric perspective; ${modKeyLabel()}-drag a side to skew)`}\n aria-label=\"Free Distort\"\n onClick={() => controller.setFreeDistort(!state.freeDistort)}\n >\n Distort\n </button>\n </div>\n )}\n {showBlend && <VectorBlendControls controller={controller} />}\n {showArrange && (\n <>\n <div className=\"ml-1 flex items-center gap-1\" role=\"group\" aria-label=\"Combine\">\n <button\n type=\"button\"\n data-vector-live-boolean=\"\"\n className={buttonClass}\n aria-pressed={live}\n title=\"Live booleans: keep the shapes editable\"\n aria-label=\"Live booleans\"\n onClick={() => setLive(!live)}\n >\n Live\n </button>\n {act('∪', 'Union', () => controller.booleanOp('union', { live }), booleanDisabled)}\n {act('−', 'Subtract', () => controller.booleanOp('subtract', { live }), booleanDisabled)}\n {act('∩', 'Intersect', () => controller.booleanOp('intersect', { live }), booleanDisabled)}\n {act('⊻', 'Exclude', () => controller.booleanOp('exclude', { live }), booleanDisabled)}\n {act('G', 'Group', () => controller.group(), count < 1)}\n {act('U', 'Ungroup', () => controller.ungroup(), !groupSelected)}\n {act('◐', `Make Clipping Mask (${modKeyLabel()}+7)`, () => controller.makeMask('clip'), count < 2)}\n {act('◑', `Release Mask (${modKeyLabel()}+Alt+7)`, () => controller.releaseMask(), !maskSelected)}\n </div>\n <div className=\"ml-1 flex items-center gap-1\" role=\"group\" aria-label=\"Pathfinder\">\n {VECTOR_PATHFINDER_ACTIONS.map((a) => (\n <button\n key={a.id}\n type=\"button\"\n data-vector-pathfinder={a.id}\n className={buttonClass}\n title={a.title}\n aria-label={a.title}\n disabled={count < a.min}\n onClick={() => void controller.pathfinder(a.id)}\n >\n {a.label}\n </button>\n ))}\n </div>\n <div className=\"ml-1 flex items-center gap-1\" role=\"group\" aria-label=\"Arrange\">\n {act('⇈', 'Bring to Front', () => controller.arrange('front'), count < 1)}\n {act('⇊', 'Send to Back', () => controller.arrange('back'), count < 1)}\n {act('⇤', 'Align Left', () => controller.align('left'), count < 1)}\n {act('↔', 'Align Center', () => controller.align('center'), count < 1)}\n {act('⇥', 'Align Right', () => controller.align('right'), count < 1)}\n {act('⤒', 'Align Top', () => controller.align('top'), count < 1)}\n {act('↕', 'Align Middle', () => controller.align('middle'), count < 1)}\n {act('⤓', 'Align Bottom', () => controller.align('bottom'), count < 1)}\n </div>\n </>\n )}\n </div>\n );\n}\n\n/** Blend buttons and options: they edit the selected blends and the options new blends get. */\nfunction VectorBlendControls({ controller }: { controller: VectorEditorController }) {\n const state = useVectorEditorState(controller);\n const blend = getVectorBlendControls(state);\n const o = blend.options;\n const selected = blend.ids.length > 0;\n return (\n <div className=\"ml-1 flex items-center gap-1\" role=\"group\" aria-label=\"Blend\" data-vector-blend-controls=\"\">\n <button type=\"button\" data-vector-blend-action=\"make\" className={buttonClass} title=\"Make Blend\" aria-label=\"Make Blend\" disabled={!blend.canBlend} onClick={() => controller.blend()}>\n ⧓\n </button>\n <select\n aria-label=\"Blend spacing\"\n className=\"h-7 rounded border border-border bg-background px-1 text-xs\"\n value={o.spacing}\n onChange={(e) => applyVectorBlendOptions(controller, { spacing: e.target.value as VectorBlendSpacing })}\n >\n {VECTOR_BLEND_SPACINGS.map((sp) => (\n <option key={sp} value={sp}>\n {VECTOR_BLEND_SPACING_LABELS[sp]}\n </option>\n ))}\n </select>\n {o.spacing !== 'smoothColor' && (\n <input\n type=\"number\"\n min={o.spacing === 'steps' ? 1 : 0.5}\n step={1}\n aria-label={o.spacing === 'steps' ? 'Blend steps' : 'Blend distance'}\n className=\"h-7 w-16 rounded border border-border bg-background px-1.5 text-xs\"\n value={o.spacing === 'steps' ? o.steps : o.distance}\n onChange={(e) => {\n const n = parseFloat(e.target.value);\n if (!Number.isFinite(n) || n <= 0) return;\n applyVectorBlendOptions(controller, o.spacing === 'steps' ? { steps: n } : { distance: n });\n }}\n />\n )}\n <button\n type=\"button\"\n data-vector-blend-action=\"orient\"\n className={buttonClass}\n aria-pressed={o.orientToSpine}\n title=\"Orient steps to the spine\"\n aria-label=\"Orient to spine\"\n onClick={() => applyVectorBlendOptions(controller, { orientToSpine: !o.orientToSpine })}\n >\n ⤿\n </button>\n <button\n type=\"button\"\n data-vector-blend-action=\"spine\"\n className={buttonClass}\n title=\"Replace Spine (select a blend and a path)\"\n aria-label=\"Replace Spine\"\n disabled={!blend.canReplaceSpine}\n onClick={() => controller.replaceBlendSpine()}\n >\n ⌇\n </button>\n <button type=\"button\" data-vector-blend-action=\"expand\" className={buttonClass} title=\"Expand Blend\" aria-label=\"Expand Blend\" disabled={!selected} onClick={() => controller.expandBlend()}>\n ⧉\n </button>\n <button type=\"button\" data-vector-blend-action=\"release\" className={buttonClass} title=\"Release Blend\" aria-label=\"Release Blend\" disabled={!selected} onClick={() => controller.releaseBlend()}>\n ⧄\n </button>\n </div>\n );\n}\n\nexport interface VectorStylePanelProps {\n controller: VectorEditorController;\n className?: string;\n}\n\nconst selectClass = 'h-7 min-w-0 flex-1 rounded border border-border bg-background px-1 text-xs';\nconst numberClass = 'h-7 w-16 rounded border border-border bg-background px-1.5 text-xs';\n\n/**\n * Fill, stroke and their gradients (`VectorGradientEditor`), stroke width, alignment and width profile, arrowheads, live corner radius, opacity, path effects (`VectorEffectsPanel`) and envelope (`VectorEnvelopePanel`) of the\n * selection (corners of the selected points with the direct tool); with nothing selected it\n * edits the defaults for new shapes.\n */\nexport function VectorStylePanel({ controller, className }: VectorStylePanelProps) {\n const state = useVectorEditorState(controller);\n const style = getVectorSelectionStyle(state);\n const d = state.defaults;\n const source = style ?? {\n fill: d.fill ?? null,\n stroke: d.stroke ?? null,\n strokeWidth: d.strokeWidth ?? 1,\n opacity: 1,\n strokeAlign: d.strokeAlign ?? 'center',\n startArrow: d.startArrow ?? null,\n endArrow: d.endArrow ?? null,\n arrowAlign: d.arrowAlign ?? 'extend',\n startArrowScale: d.startArrowScale ?? 1,\n endArrowScale: d.endArrowScale ?? 1,\n widthProfile: widthProfilePresetId(d.strokeWidthProfile),\n cornerRadius: d.cornerRadius,\n cornerKind: d.cornerKind ?? 'round',\n cornerSmoothing: 0,\n corners: 1,\n hasOpenPath: true,\n };\n const setCorners = (patch: { radius?: number; kind?: VectorCornerKind }) => {\n if (!style) controller.setDefaults({ ...(patch.radius !== undefined ? { cornerRadius: patch.radius } : {}), ...(patch.kind ? { cornerKind: patch.kind } : {}) });\n else if (patch.radius !== undefined) controller.setCornerRadius(patch.radius);\n else if (patch.kind) controller.setCornerKind(patch.kind);\n };\n const setProfile = (id: VectorWidthPreset) => {\n if (style) controller.setWidthProfile(id);\n else controller.setDefaults({ strokeWidthProfile: widthProfilePreset(id)?.length ? widthProfilePreset(id) : null });\n };\n const mixed = (key: keyof NonNullable<typeof style>['mixed']) => (style?.mixed[key] ? <span className=\"text-[11px] text-muted-foreground\">Mixed</span> : null);\n const arrowRow = (end: 'start' | 'end', label: string) => {\n const key = end === 'start' ? 'startArrow' : 'endArrow';\n const scaleKey = end === 'start' ? 'startArrowScale' : 'endArrowScale';\n return (\n <div className=\"flex items-center gap-2\" data-vector-style={key}>\n <span className=\"w-16 text-xs text-foreground\">{label}</span>\n <select aria-label={`${label} arrowhead`} className={selectClass} value={source[key] ?? ''} onChange={(e) => apply({ [key]: (e.target.value || null) as VectorArrowhead | null })}>\n <option value=\"\">None</option>\n {VECTOR_ARROWHEADS.map((h) => (\n <option key={h} value={h}>\n {VECTOR_ARROWHEAD_LABELS[h]}\n </option>\n ))}\n </select>\n <input\n type=\"number\"\n min={0.1}\n step={0.25}\n aria-label={`${label} arrowhead scale`}\n title=\"Scale (× stroke width)\"\n className={numberClass}\n value={source[scaleKey]}\n onChange={(e) => {\n const n = parseFloat(e.target.value);\n if (Number.isFinite(n) && n > 0) apply({ [scaleKey]: n });\n }}\n />\n </div>\n );\n };\n const apply = (patch: Record<string, unknown>) => {\n if (style) controller.setStyle(patch);\n else controller.setDefaults(patch);\n };\n const paintRow = (key: 'fill' | 'stroke', label: string) => {\n const paint = source[key];\n const hex = vectorPaintToHex(paint);\n const on = paint !== null && paint !== 'none';\n return (\n <div className=\"flex items-center gap-2\" data-vector-style={key}>\n <label className=\"flex w-16 items-center gap-1.5 text-xs text-foreground\">\n <input type=\"checkbox\" checked={on} aria-label={`${label} on`} onChange={(e) => apply({ [key]: e.target.checked ? (hex ?? '#000000') : null })} />\n {label}\n </label>\n <input\n type=\"color\"\n aria-label={`${label} colour`}\n className=\"h-7 w-10 cursor-pointer rounded border border-border bg-background disabled:opacity-40\"\n disabled={!on}\n value={hex ?? '#000000'}\n onChange={(e) => apply({ [key]: e.target.value })}\n />\n {on && !hex && <span className=\"truncate text-[11px] text-muted-foreground\">{typeof paint === 'string' ? paint : 'Gradient'}</span>}\n {style?.mixed[key] && <span className=\"text-[11px] text-muted-foreground\">Mixed</span>}\n </div>\n );\n };\n return (\n <div className={`space-y-2 ${className ?? ''}`} aria-label={style ? 'Selection style' : 'New shape style'}>\n <p className=\"text-[11px] font-medium uppercase tracking-wide text-muted-foreground\">{style ? 'Selection' : 'New shapes'}</p>\n {paintRow('fill', 'Fill')}\n {paintRow('stroke', 'Stroke')}\n {style && <VectorGradientEditor controller={controller} />}\n <label className=\"flex items-center gap-2 text-xs text-foreground\">\n <span className=\"w-16\">Width</span>\n <input\n type=\"number\"\n min={0}\n step={0.5}\n aria-label=\"Stroke width\"\n className=\"h-7 w-20 rounded border border-border bg-background px-1.5 text-xs\"\n value={source.strokeWidth}\n onChange={(e) => {\n const n = parseFloat(e.target.value);\n if (Number.isFinite(n) && n >= 0) apply({ strokeWidth: n });\n }}\n />\n </label>\n <label className=\"flex items-center gap-2 text-xs text-foreground\" data-vector-style=\"strokeAlign\">\n <span className=\"w-16\">Align</span>\n <select aria-label=\"Stroke alignment\" className={selectClass} value={source.strokeAlign} onChange={(e) => apply({ strokeAlign: e.target.value as VectorStrokeAlign })}>\n {(Object.keys(VECTOR_STROKE_ALIGN_LABELS) as VectorStrokeAlign[]).map((a) => (\n <option key={a} value={a}>\n {VECTOR_STROKE_ALIGN_LABELS[a]}\n </option>\n ))}\n </select>\n {mixed('strokeAlign')}\n </label>\n <div className=\"flex items-center gap-2 text-xs text-foreground\" data-vector-style=\"widthProfile\">\n <span className=\"w-16\">Profile</span>\n <select\n aria-label=\"Width profile\"\n className={selectClass}\n value={source.widthProfile}\n onChange={(e) => {\n if (e.target.value !== 'custom') setProfile(e.target.value as VectorWidthPreset);\n }}\n >\n {VECTOR_WIDTH_PRESETS.map((p) => (\n <option key={p.id} value={p.id}>\n {p.label}\n </option>\n ))}\n {source.widthProfile === 'custom' && (\n <option value=\"custom\" disabled>\n Custom\n </option>\n )}\n </select>\n <button\n type=\"button\"\n className={buttonClass}\n title=\"Reset to uniform width\"\n aria-label=\"Reset to uniform width\"\n disabled={source.widthProfile === 'uniform' && !style?.mixed.widthProfile}\n onClick={() => setProfile('uniform')}\n >\n ═\n </button>\n {mixed('widthProfile')}\n </div>\n {source.hasOpenPath && (\n <>\n {arrowRow('start', 'Start')}\n {arrowRow('end', 'End')}\n {(source.startArrow || source.endArrow) && (\n <label className=\"flex items-center gap-2 text-xs text-foreground\" data-vector-style=\"arrowAlign\">\n <span className=\"w-16\">Heads</span>\n <select aria-label=\"Arrowhead alignment\" className={selectClass} value={source.arrowAlign} onChange={(e) => apply({ arrowAlign: e.target.value })}>\n <option value=\"extend\">Tip past end</option>\n <option value=\"tip\">Tip at end</option>\n </select>\n </label>\n )}\n </>\n )}\n {source.corners > 0 && (\n <div className=\"flex items-center gap-2\" data-vector-style=\"corners\">\n <span className=\"w-16 text-xs text-foreground\">Corners</span>\n <input\n type=\"number\"\n min={0}\n step={1}\n aria-label=\"Corner radius\"\n className={numberClass}\n value={Math.round(source.cornerRadius * 100) / 100}\n onChange={(e) => {\n const n = parseFloat(e.target.value);\n if (Number.isFinite(n) && n >= 0) setCorners({ radius: n });\n }}\n />\n <select aria-label=\"Corner kind\" className={selectClass} value={source.cornerKind} onChange={(e) => setCorners({ kind: e.target.value as VectorCornerKind })}>\n {VECTOR_CORNER_KINDS.map((k) => (\n <option key={k} value={k}>\n {VECTOR_CORNER_KIND_LABELS[k]}\n </option>\n ))}\n </select>\n {mixed('cornerRadius')}\n </div>\n )}\n {style && source.corners > 0 && source.cornerKind === 'round' && source.cornerRadius > 0 && (\n <label className=\"flex items-center gap-2 text-xs text-foreground\" data-vector-style=\"corner-smoothing\" title=\"Corner smoothing: squircle corners that ease into the curve (0.6 is iOS-like)\">\n <span className=\"w-16\">Smoothing</span>\n <input\n type=\"range\"\n min={0}\n max={1}\n step={0.05}\n aria-label=\"Corner smoothing\"\n className=\"h-4 flex-1 accent-primary\"\n value={source.cornerSmoothing}\n onChange={(e) => controller.setCornerSmoothing(parseFloat(e.target.value), { merge: 'corner-smoothing' })}\n onPointerUp={() => controller.endMergedEdit()}\n />\n </label>\n )}\n {style && (\n <label className=\"flex items-center gap-2 text-xs text-foreground\">\n <span className=\"w-16\">Opacity</span>\n <input\n type=\"range\"\n min={0}\n max={1}\n step={0.05}\n aria-label=\"Opacity\"\n className=\"h-4 flex-1 accent-primary\"\n value={source.opacity}\n onChange={(e) => apply({ opacity: parseFloat(e.target.value) })}\n />\n </label>\n )}\n <VectorTextPanel controller={controller} />\n {style && <VectorAppearancePanel controller={controller} />}\n {style && <VectorEffectsPanel controller={controller} />}\n {style && <VectorEnvelopePanel controller={controller} />}\n {style && <VectorMaskPanel controller={controller} />}\n <VectorFramePanel controller={controller} />\n <VectorPagesPanel controller={controller} />\n <VectorConnectorPanel controller={controller} />\n <VectorShadingPanel controller={controller} />\n <VectorSymmetryPanel controller={controller} />\n <VectorPerspectivePanel controller={controller} />\n <VectorLensPanel controller={controller} />\n <VectorTracePanel controller={controller} />\n <VectorConstraintsPanel controller={controller} />\n <VectorSymbolsPanel controller={controller} />\n </div>\n );\n}\n","import React from 'react';\nimport {\n VECTOR_EFFECT_MENU,\n getVectorEffectsPanel,\n vectorPaintToHex,\n type VectorEditorController,\n type VectorEffectParamSpec,\n type VectorEffectsPanelItem,\n type VectorEffectType,\n} from '@pixerate/editor/vector';\nimport { useVectorEditorState } from './useVectorEditor';\n\nconst buttonClass =\n 'inline-flex h-7 min-w-7 items-center justify-center rounded-md border border-border bg-background px-1.5 text-xs font-medium text-foreground hover:bg-muted disabled:cursor-not-allowed disabled:opacity-40';\nconst numberClass = 'h-7 w-16 rounded border border-border bg-background px-1.5 text-xs';\nconst selectClass = 'h-7 min-w-0 flex-1 rounded border border-border bg-background px-1 text-xs';\n/** Parameter names sit on their own line in a narrow panel, the controls below. */\nconst labelClass = 'w-full truncate text-[11px] text-muted-foreground';\n\nexport interface VectorEffectsPanelProps {\n controller: VectorEditorController;\n className?: string;\n}\n\n/**\n * The live path effects of the selection: add effects (to every selected node), and for one\n * selected node list its stack (applied top to bottom) to turn on and off, reorder, remove and\n * edit. Slider drags and typing are one undo step each. Expand Appearance bakes the effects and\n * live booleans into plain paths.\n */\nexport function VectorEffectsPanel({ controller, className }: VectorEffectsPanelProps) {\n const state = useVectorEditorState(controller);\n const panel = getVectorEffectsPanel(state);\n if (!panel) return null;\n const nodeId = panel.nodeId;\n const end = () => controller.endMergedEdit();\n const set = (e: VectorEffectsPanelItem, key: string, value: unknown, merge: boolean) => {\n if (nodeId) controller.updateEffect(nodeId, e.id, { params: { [key]: value } }, { merge });\n };\n const number = (e: VectorEffectsPanelItem, spec: VectorEffectParamSpec & { kind: 'number' }) => {\n const value = Number(e.params[spec.key] ?? 0);\n const label = `${e.label} ${spec.label}`;\n const onChange = (ev: React.ChangeEvent<HTMLInputElement>) => {\n const n = parseFloat(ev.target.value);\n if (Number.isFinite(n)) set(e, spec.key, n, true);\n };\n return (\n <label key={spec.key} className=\"flex flex-wrap items-center gap-x-2 gap-y-0.5 text-xs text-foreground\" data-vector-effect-param={spec.key}>\n <span className={labelClass}>{spec.label}</span>\n {spec.slider && (\n <input\n type=\"range\"\n min={spec.min}\n max={spec.max}\n step={spec.step}\n aria-label={`${label} slider`}\n className=\"h-4 min-w-0 flex-1 accent-primary\"\n value={value}\n onChange={onChange}\n onPointerUp={end}\n onKeyUp={end}\n onBlur={end}\n />\n )}\n <input\n type=\"number\"\n min={spec.min}\n max={spec.max}\n step={spec.step}\n aria-label={label}\n className={numberClass}\n value={Math.round(value * 1000) / 1000}\n onChange={onChange}\n onBlur={end}\n />\n </label>\n );\n };\n const vec2 = (e: VectorEffectsPanelItem, spec: VectorEffectParamSpec) => {\n const v = (e.params[spec.key] as { x: number; y: number } | undefined) ?? { x: 0, y: 0 };\n const field = (axis: 'x' | 'y') => (\n <input\n type=\"number\"\n step={spec.kind === 'vec2' ? spec.step : 1}\n aria-label={`${e.label} ${spec.label} ${axis}`}\n className={numberClass}\n value={Math.round(v[axis] * 1000) / 1000}\n onChange={(ev) => {\n const n = parseFloat(ev.target.value);\n if (Number.isFinite(n)) set(e, spec.key, { ...v, [axis]: n }, true);\n }}\n onBlur={end}\n />\n );\n return (\n <div key={spec.key} className=\"flex flex-wrap items-center gap-x-2 gap-y-0.5 text-xs text-foreground\" data-vector-effect-param={spec.key}>\n <span className={labelClass}>{spec.label}</span>\n {field('x')}\n {field('y')}\n </div>\n );\n };\n const param = (e: VectorEffectsPanelItem, spec: VectorEffectParamSpec) => {\n if (spec.kind === 'number') return number(e, spec);\n if (spec.kind === 'vec2') return vec2(e, spec);\n if (spec.kind === 'boolean')\n return (\n <label key={spec.key} className=\"flex items-center gap-2 text-xs text-foreground\" data-vector-effect-param={spec.key}>\n <span className=\"min-w-0 flex-1 truncate\">{spec.label}</span>\n <input type=\"checkbox\" aria-label={`${e.label} ${spec.label}`} checked={!!e.params[spec.key]} onChange={(ev) => set(e, spec.key, ev.target.checked, false)} />\n </label>\n );\n if (spec.kind === 'color') {\n // A colour, or none (the checkbox): none keeps the shape's own colour.\n const c = e.params[spec.key] as string | null;\n return (\n <div key={spec.key} className=\"flex items-center gap-2 text-xs text-foreground\" data-vector-effect-param={spec.key}>\n <span className={labelClass}>{spec.label}</span>\n <input type=\"checkbox\" aria-label={`${e.label} ${spec.label} on`} checked={c !== null} onChange={(ev) => set(e, spec.key, ev.target.checked ? '#ffffff' : null, false)} />\n <input type=\"color\" aria-label={`${e.label} ${spec.label}`} className=\"h-6 w-8 cursor-pointer rounded border border-border bg-background disabled:opacity-40\" disabled={c === null} value={vectorPaintToHex(c ?? '#ffffff') ?? '#ffffff'} onChange={(ev) => set(e, spec.key, ev.target.value, true)} onBlur={end} />\n </div>\n );\n }\n if (spec.kind !== 'select') return null;\n return (\n <label key={spec.key} className=\"flex flex-wrap items-center gap-x-2 gap-y-0.5 text-xs text-foreground\" data-vector-effect-param={spec.key}>\n <span className={labelClass}>{spec.label}</span>\n <select aria-label={`${e.label} ${spec.label}`} className={selectClass} value={String(e.params[spec.key] ?? '')} onChange={(ev) => set(e, spec.key, ev.target.value, false)}>\n {spec.options.map((o) => (\n <option key={o.value} value={o.value}>\n {o.label}\n </option>\n ))}\n </select>\n </label>\n );\n };\n return (\n <div className={`space-y-2 ${className ?? ''}`} data-vector-effects=\"\" aria-label=\"Effects\">\n <div className=\"flex items-center gap-2\">\n <span className=\"w-16 text-[11px] font-medium uppercase tracking-wide text-muted-foreground\">Effects</span>\n <select\n aria-label=\"Add effect\"\n className={selectClass}\n value=\"\"\n onChange={(ev) => {\n if (ev.target.value) controller.addEffect(ev.target.value as VectorEffectType);\n }}\n >\n <option value=\"\">Add effect…</option>\n {VECTOR_EFFECT_MENU.map((m) => (\n <option key={m.type} value={m.type}>\n {m.label}\n </option>\n ))}\n </select>\n <button type=\"button\" className={buttonClass} title=\"Expand Appearance\" aria-label=\"Expand Appearance\" disabled={!panel.expandable} onClick={() => controller.expandAppearance()}>\n Expand\n </button>\n </div>\n {panel.count > 1 && <p className=\"text-[11px] text-muted-foreground\">Select one object to edit its effects.</p>}\n {nodeId &&\n panel.effects.map((e, i) => (\n <div key={e.id} className=\"space-y-1 rounded border border-border p-1.5\" data-vector-effect={e.id} data-vector-effect-type={e.type}>\n <div className=\"flex items-center gap-1\">\n <label className=\"flex min-w-0 flex-1 items-center gap-1.5 text-xs font-medium text-foreground\">\n <input type=\"checkbox\" aria-label={`${e.label} on`} checked={e.enabled} onChange={(ev) => controller.updateEffect(nodeId, e.id, { enabled: ev.target.checked })} />\n <span className=\"truncate\">{e.label}</span>\n </label>\n <button type=\"button\" className={buttonClass} title=\"Move up\" aria-label={`Move ${e.label} up`} disabled={i === 0} onClick={() => controller.moveEffect(nodeId, e.id, i - 1)}>\n ↑\n </button>\n <button\n type=\"button\"\n className={buttonClass}\n title=\"Move down\"\n aria-label={`Move ${e.label} down`}\n disabled={i === panel.effects.length - 1}\n onClick={() => controller.moveEffect(nodeId, e.id, i + 1)}\n >\n ↓\n </button>\n <button type=\"button\" className={buttonClass} title=\"Remove\" aria-label={`Remove ${e.label}`} onClick={() => controller.removeEffect(nodeId, e.id)}>\n ×\n </button>\n </div>\n {e.specs.map((spec) => param(e, spec))}\n </div>\n ))}\n </div>\n );\n}\n","import React from 'react';\nimport {\n VECTOR_BLEND_MODE_MENU,\n VECTOR_FILTER_MENU,\n VECTOR_STROKE_ALIGN_LABELS,\n getVectorAppearancePanel,\n type VectorAppearancePanelLayer,\n type VectorBlendMode,\n type VectorEditorController,\n type VectorFilterParamSpec,\n type VectorFilterType,\n type VectorFiltersPanelItem,\n type VectorStrokeAlign,\n} from '@pixerate/editor/vector';\nimport { useVectorEditorState } from './useVectorEditor';\n\nconst buttonClass =\n 'inline-flex h-7 min-w-7 items-center justify-center rounded-md border border-border bg-background px-1.5 text-xs font-medium text-foreground hover:bg-muted disabled:cursor-not-allowed disabled:opacity-40';\nconst numberClass = 'h-7 w-14 rounded border border-border bg-background px-1.5 text-xs';\nconst selectClass = 'h-7 min-w-0 flex-1 rounded border border-border bg-background px-1 text-xs';\nconst headingClass = 'text-[11px] font-medium uppercase tracking-wide text-muted-foreground';\nconst labelClass = 'w-full truncate text-[11px] text-muted-foreground';\n\nexport interface VectorAppearancePanelProps {\n controller: VectorEditorController;\n className?: string;\n}\n\n/**\n * The appearance of the selection: its fill and stroke stacks (listed top first; add, remove,\n * reorder, show / hide, paint, opacity and blend mode per layer, width and alignment per\n * stroke), the node blend mode, and for one selected node its filters (drop and inner shadows,\n * glows, blurs, feather). The pencil on a layer points the gradient editor and tool at it.\n * Slider drags and typing are one undo step each.\n */\nexport function VectorAppearancePanel({ controller, className }: VectorAppearancePanelProps) {\n const state = useVectorEditorState(controller);\n const panel = getVectorAppearancePanel(state);\n if (!panel) return null;\n const end = () => controller.endMergedEdit();\n const ids = panel.pathIds;\n const update = (l: VectorAppearancePanelLayer, patch: Record<string, unknown>, merge = false) => controller.updatePaintLayer(l.kind, l.index, patch, { ids, merge });\n\n const layerRow = (l: VectorAppearancePanelLayer, count: number) => {\n const name = `${l.kind === 'fill' ? 'Fill' : 'Stroke'} ${l.index + 1}`;\n if (l.unknownKind)\n return (\n <div key={`${l.kind}-${l.index}`} className=\"text-[11px] text-muted-foreground\" data-vector-layer={`${l.kind}-${l.index}`}>\n {name}: {l.unknownKind} (not drawn by this version)\n </div>\n );\n return (\n <div key={`${l.kind}-${l.index}`} className=\"space-y-1 rounded border border-border p-1\" data-vector-layer={`${l.kind}-${l.index}`} data-vector-layer-editing={l.editing ? '' : undefined}>\n <div className=\"flex items-center gap-1\">\n <input type=\"checkbox\" aria-label={`${name} visible`} title=\"Show\" checked={l.visible} onChange={(e) => update(l, { visible: e.target.checked })} />\n {l.gradient ? (\n <button\n type=\"button\"\n aria-label={`${name} gradient`}\n title=\"Edit this gradient\"\n className=\"h-7 w-10 rounded border border-border\"\n style={{ background: l.swatch }}\n onClick={() => controller.setGradientTarget(l.kind, l.index)}\n />\n ) : (\n <input\n type=\"color\"\n aria-label={`${name} colour`}\n className=\"h-7 w-10 cursor-pointer rounded border border-border bg-background\"\n value={l.color ?? '#000000'}\n onChange={(e) => update(l, { paint: e.target.value }, true)}\n onBlur={end}\n />\n )}\n <input\n type=\"number\"\n min={0}\n max={100}\n step={5}\n aria-label={`${name} opacity`}\n title=\"Opacity %\"\n className={numberClass}\n value={Math.round(l.opacity * 100)}\n onChange={(e) => {\n const n = parseFloat(e.target.value);\n if (Number.isFinite(n)) update(l, { opacity: Math.min(100, Math.max(0, n)) / 100 }, true);\n }}\n onBlur={end}\n />\n <select aria-label={`${name} blend mode`} className={selectClass} value={l.blendMode} onChange={(e) => update(l, { blendMode: e.target.value })}>\n {VECTOR_BLEND_MODE_MENU.map((m) => (\n <option key={m.mode} value={m.mode}>\n {m.label}\n </option>\n ))}\n </select>\n </div>\n {l.kind === 'stroke' && (\n <div className=\"flex items-center gap-1\">\n <input\n type=\"number\"\n min={0}\n step={0.5}\n aria-label={`${name} width`}\n title=\"Width\"\n className={numberClass}\n value={l.strokeWidth ?? 1}\n onChange={(e) => {\n const n = parseFloat(e.target.value);\n if (Number.isFinite(n) && n >= 0) update(l, { strokeWidth: n }, true);\n }}\n onBlur={end}\n />\n <select aria-label={`${name} alignment`} className={selectClass} value={l.strokeAlign ?? 'center'} onChange={(e) => update(l, { strokeAlign: e.target.value as VectorStrokeAlign })}>\n {(Object.keys(VECTOR_STROKE_ALIGN_LABELS) as VectorStrokeAlign[]).map((a) => (\n <option key={a} value={a}>\n {VECTOR_STROKE_ALIGN_LABELS[a]}\n </option>\n ))}\n </select>\n </div>\n )}\n <div className=\"flex items-center gap-1\">\n <span className=\"flex-1\" />\n <button type=\"button\" className={buttonClass} title=\"Edit gradient\" aria-label={`Edit ${name} gradient`} aria-pressed={l.editing} onClick={() => controller.setGradientTarget(l.kind, l.index)}>\n ✎\n </button>\n <button type=\"button\" className={buttonClass} title=\"Move up\" aria-label={`Move ${name} up`} disabled={l.index === count - 1} onClick={() => controller.movePaintLayer(l.kind, l.index, l.index + 1, { ids })}>\n ↑\n </button>\n <button type=\"button\" className={buttonClass} title=\"Move down\" aria-label={`Move ${name} down`} disabled={l.index === 0} onClick={() => controller.movePaintLayer(l.kind, l.index, l.index - 1, { ids })}>\n ↓\n </button>\n <button type=\"button\" className={buttonClass} title=\"Remove\" aria-label={`Remove ${name}`} onClick={() => controller.removePaintLayer(l.kind, l.index, { ids })}>\n ×\n </button>\n </div>\n </div>\n );\n };\n\n const stack = (kind: 'fill' | 'stroke', layers: VectorAppearancePanelLayer[], mixed: boolean) => (\n <div className=\"space-y-1\" data-vector-stack={kind}>\n <div className=\"flex items-center gap-2\">\n <span className={`flex-1 ${headingClass}`}>{kind === 'fill' ? 'Fills' : 'Strokes'}</span>\n {mixed && <span className=\"text-[11px] text-muted-foreground\">Mixed</span>}\n <button\n type=\"button\"\n className={buttonClass}\n title={kind === 'fill' ? 'Add fill' : 'Add stroke'}\n aria-label={kind === 'fill' ? 'Add fill' : 'Add stroke'}\n disabled={!ids.length}\n onClick={() => controller.addPaintLayer(kind, {}, { ids })}\n >\n +\n </button>\n </div>\n {/* Top layer first, as it draws. */}\n {[...layers].reverse().map((l) => layerRow(l, layers.length))}\n </div>\n );\n\n const filterNode = panel.filterNodeId;\n const setFilter = (f: VectorFiltersPanelItem, key: string, value: unknown, merge: boolean) => {\n if (filterNode) controller.updateFilter(filterNode, f.id, { params: { [key]: value } }, { merge });\n };\n const filterParam = (f: VectorFiltersPanelItem, spec: VectorFilterParamSpec) => {\n const label = `${f.label} ${spec.label}`;\n if (spec.kind === 'color')\n return (\n <label key={spec.key} className=\"flex items-center gap-2 text-xs text-foreground\" data-vector-filter-param={spec.key}>\n <span className=\"w-14 truncate text-[11px] text-muted-foreground\">{spec.label}</span>\n <input\n type=\"color\"\n aria-label={label}\n className=\"h-7 w-10 cursor-pointer rounded border border-border bg-background\"\n value={/^#[0-9a-f]{6}$/i.test(String(f.params[spec.key])) ? String(f.params[spec.key]) : '#000000'}\n onChange={(e) => setFilter(f, spec.key, e.target.value, true)}\n onBlur={end}\n />\n </label>\n );\n if (spec.kind !== 'number') return null;\n const value = Number(f.params[spec.key] ?? 0);\n const onChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const n = parseFloat(e.target.value);\n if (Number.isFinite(n)) setFilter(f, spec.key, n, true);\n };\n return (\n <label key={spec.key} className=\"flex flex-wrap items-center gap-x-2 gap-y-0.5 text-xs text-foreground\" data-vector-filter-param={spec.key}>\n <span className={labelClass}>{spec.label}</span>\n {spec.slider && (\n <input\n type=\"range\"\n min={spec.min}\n max={spec.max}\n step={spec.step}\n aria-label={`${label} slider`}\n className=\"h-4 min-w-0 flex-1 accent-primary\"\n value={value}\n onChange={onChange}\n onPointerUp={end}\n onKeyUp={end}\n onBlur={end}\n />\n )}\n <input type=\"number\" min={spec.min} max={spec.max} step={spec.step} aria-label={label} className={numberClass} value={Math.round(value * 1000) / 1000} onChange={onChange} onBlur={end} />\n </label>\n );\n };\n\n return (\n <div className={`space-y-2 ${className ?? ''}`} data-vector-appearance=\"\" aria-label=\"Appearance\">\n {ids.length > 0 && stack('stroke', panel.strokes, panel.mixed.strokes)}\n {ids.length > 0 && stack('fill', panel.fills, panel.mixed.fills)}\n <label className=\"flex items-center gap-2 text-xs text-foreground\" data-vector-style=\"blendMode\">\n <span className=\"w-16\">Blend</span>\n <select aria-label=\"Blend mode\" className={selectClass} value={panel.blendMode} onChange={(e) => controller.setBlendMode(e.target.value as VectorBlendMode, { ids: panel.nodeIds })}>\n {VECTOR_BLEND_MODE_MENU.map((m) => (\n <option key={m.mode} value={m.mode}>\n {m.label}\n </option>\n ))}\n </select>\n {panel.mixed.blendMode && <span className=\"text-[11px] text-muted-foreground\">Mixed</span>}\n </label>\n <div className=\"space-y-2\" data-vector-filters=\"\">\n <div className=\"flex items-center gap-2\">\n <span className={`w-16 ${headingClass}`}>Filters</span>\n <select\n aria-label=\"Add filter\"\n className={selectClass}\n value=\"\"\n onChange={(e) => {\n if (e.target.value) controller.addFilter(e.target.value as VectorFilterType, { ids: panel.nodeIds });\n }}\n >\n <option value=\"\">Add filter…</option>\n {VECTOR_FILTER_MENU.map((m) => (\n <option key={m.type} value={m.type}>\n {m.label}\n </option>\n ))}\n </select>\n </div>\n {!filterNode && <p className=\"text-[11px] text-muted-foreground\">Select one object to edit its filters.</p>}\n {filterNode &&\n panel.filters.map((f, i) => (\n <div key={f.id} className=\"space-y-1 rounded border border-border p-1.5\" data-vector-filter={f.id} data-vector-filter-type={f.type}>\n <div className=\"flex items-center gap-1\">\n <label className=\"flex min-w-0 flex-1 items-center gap-1.5 text-xs font-medium text-foreground\">\n <input type=\"checkbox\" aria-label={`${f.label} on`} checked={f.enabled} onChange={(e) => controller.updateFilter(filterNode, f.id, { enabled: e.target.checked })} />\n <span className=\"truncate\">{f.label}</span>\n </label>\n <button type=\"button\" className={buttonClass} title=\"Move up\" aria-label={`Move ${f.label} up`} disabled={i === 0} onClick={() => controller.moveFilter(filterNode, f.id, i - 1)}>\n ↑\n </button>\n <button type=\"button\" className={buttonClass} title=\"Move down\" aria-label={`Move ${f.label} down`} disabled={i === panel.filters.length - 1} onClick={() => controller.moveFilter(filterNode, f.id, i + 1)}>\n ↓\n </button>\n <button type=\"button\" className={buttonClass} title=\"Remove\" aria-label={`Remove ${f.label}`} onClick={() => controller.removeFilter(filterNode, f.id)}>\n ×\n </button>\n </div>\n {f.specs.map((spec) => filterParam(f, spec))}\n </div>\n ))}\n </div>\n </div>\n );\n}\n","import React from 'react';\nimport { VECTOR_ENVELOPE_STYLE_OPTIONS, getVectorEnvelopePanel, type VectorEditorController, type VectorEnvelopeParams } from '@pixerate/editor/vector';\nimport { useVectorEditorState } from './useVectorEditor';\n\nconst buttonClass =\n 'inline-flex h-7 min-w-7 items-center justify-center rounded-md border border-border bg-background px-1.5 text-xs font-medium text-foreground hover:bg-muted disabled:cursor-not-allowed disabled:opacity-40';\nconst numberClass = 'h-7 w-14 rounded border border-border bg-background px-1.5 text-xs';\nconst selectClass = 'h-7 min-w-0 flex-1 rounded border border-border bg-background px-1 text-xs';\nconst labelClass = 'w-full truncate text-[11px] text-muted-foreground';\n\nconst SLIDERS: { key: 'bend' | 'horizontal' | 'vertical'; label: string }[] = [\n { key: 'bend', label: 'Bend %' },\n { key: 'horizontal', label: 'Horizontal distortion %' },\n { key: 'vertical', label: 'Vertical distortion %' },\n];\n\nexport interface VectorEnvelopePanelProps {\n controller: VectorEditorController;\n className?: string;\n}\n\n/**\n * Envelope distortion of the selection: Make with Warp, Mesh or Top Object, and for one selected\n * object with an envelope its warp preset, bend, horizontal and vertical distortion, orientation and\n * mesh rows and columns, plus Release and Expand. Edit the mesh on the canvas with the Envelope\n * tool. Slider drags are one undo step each.\n */\nexport function VectorEnvelopePanel({ controller, className }: VectorEnvelopePanelProps) {\n const state = useVectorEditorState(controller);\n const panel = getVectorEnvelopePanel(state);\n // The mesh size Make with Mesh uses (an envelope's own size once it has one).\n const [size, setSize] = React.useState({ rows: 2, columns: 2 });\n if (!panel) return null;\n const env = panel.envelope;\n const ids = panel.nodeId ? [panel.nodeId] : undefined;\n const end = () => controller.endMergedEdit();\n const set = (patch: Partial<VectorEnvelopeParams>, merge = false) => controller.envelope(patch, { ids, merge });\n const rows = env?.params.rows ?? size.rows;\n const columns = env?.params.columns ?? size.columns;\n const setCount = (key: 'rows' | 'columns', raw: string) => {\n const n = Math.round(parseFloat(raw));\n if (!Number.isFinite(n) || n < 1 || n > 16) return;\n if (env) set({ [key]: n });\n else setSize({ ...size, [key]: n });\n };\n return (\n <div className={`space-y-2 ${className ?? ''}`} data-vector-envelope=\"\" aria-label=\"Envelope\">\n <div className=\"flex flex-wrap items-center gap-1\">\n <span className=\"w-16 text-[11px] font-medium uppercase tracking-wide text-muted-foreground\">Envelope</span>\n <button type=\"button\" data-vector-envelope-action=\"warp\" className={buttonClass} title=\"Make with Warp\" aria-label=\"Make with Warp\" disabled={!panel.canMake || !!env} onClick={() => set({ style: 'arc', bend: 50 })}>\n Warp\n </button>\n <button\n type=\"button\"\n data-vector-envelope-action=\"mesh\"\n className={buttonClass}\n title=\"Make with Mesh\"\n aria-label=\"Make with Mesh\"\n disabled={!panel.canMake || !!env}\n onClick={() => set({ style: 'mesh', rows: size.rows, columns: size.columns })}\n >\n Mesh\n </button>\n <button\n type=\"button\"\n data-vector-envelope-action=\"top\"\n className={buttonClass}\n title=\"Make with Top Object\"\n aria-label=\"Make with Top Object\"\n disabled={!panel.canMakeWithTopObject}\n onClick={() => controller.makeEnvelopeWithTopObject({ rows: size.rows, columns: size.columns })}\n >\n Top\n </button>\n <button type=\"button\" data-vector-envelope-action=\"release\" className={buttonClass} title=\"Release Envelope\" aria-label=\"Release Envelope\" disabled={!panel.canRelease} onClick={() => controller.releaseEnvelope()}>\n Release\n </button>\n <button type=\"button\" data-vector-envelope-action=\"expand\" className={buttonClass} title=\"Expand Envelope\" aria-label=\"Expand Envelope\" disabled={!panel.canRelease} onClick={() => controller.expandAppearance()}>\n Expand\n </button>\n </div>\n {env && (\n <label className=\"flex flex-wrap items-center gap-x-2 gap-y-0.5 text-xs text-foreground\" data-vector-envelope-param=\"style\">\n <span className={labelClass}>Warp</span>\n <select aria-label=\"Envelope warp\" className={selectClass} value={env.params.style} onChange={(e) => set({ style: e.target.value as VectorEnvelopeParams['style'] })}>\n {VECTOR_ENVELOPE_STYLE_OPTIONS.map((o) => (\n <option key={o.value} value={o.value}>\n {o.label}\n </option>\n ))}\n </select>\n </label>\n )}\n {env &&\n env.params.style !== 'mesh' &&\n SLIDERS.map((s) => {\n const value = env.params[s.key];\n const onChange = (ev: React.ChangeEvent<HTMLInputElement>) => {\n const n = parseFloat(ev.target.value);\n if (Number.isFinite(n)) set({ [s.key]: n }, true);\n };\n return (\n <label key={s.key} className=\"flex flex-wrap items-center gap-x-2 gap-y-0.5 text-xs text-foreground\" data-vector-envelope-param={s.key}>\n <span className={labelClass}>{s.label}</span>\n <input\n type=\"range\"\n min={-100}\n max={100}\n step={1}\n aria-label={`Envelope ${s.label} slider`}\n className=\"h-4 min-w-0 flex-1 accent-primary\"\n value={value}\n onChange={onChange}\n onPointerUp={end}\n onKeyUp={end}\n onBlur={end}\n />\n <input type=\"number\" min={-100} max={100} step={1} aria-label={`Envelope ${s.label}`} className={numberClass} value={value} onChange={onChange} onBlur={end} />\n </label>\n );\n })}\n {env && env.params.style !== 'mesh' && (\n <label className=\"flex flex-wrap items-center gap-x-2 gap-y-0.5 text-xs text-foreground\" data-vector-envelope-param=\"orientation\">\n <span className={labelClass}>Orientation</span>\n <select aria-label=\"Envelope orientation\" className={selectClass} value={env.params.orientation} onChange={(e) => set({ orientation: e.target.value as 'horizontal' | 'vertical' })}>\n <option value=\"horizontal\">Horizontal</option>\n <option value=\"vertical\">Vertical</option>\n </select>\n </label>\n )}\n <div className=\"flex items-center gap-2 text-xs text-foreground\" data-vector-envelope-param=\"mesh\">\n <span className=\"min-w-0 flex-1 truncate text-[11px] text-muted-foreground\">Mesh rows × columns</span>\n <input type=\"number\" min={1} max={16} step={1} aria-label=\"Envelope mesh rows\" className={numberClass} value={rows} onChange={(e) => setCount('rows', e.target.value)} />\n <input type=\"number\" min={1} max={16} step={1} aria-label=\"Envelope mesh columns\" className={numberClass} value={columns} onChange={(e) => setCount('columns', e.target.value)} />\n </div>\n {panel.count > 1 && !panel.canMakeWithTopObject && <p className=\"text-[11px] text-muted-foreground\">Select one object to edit its envelope.</p>}\n {env && <p className=\"text-[11px] text-muted-foreground\">Edit the mesh with the Envelope tool (U).</p>}\n </div>\n );\n}\n","import React from 'react';\nimport { VECTOR_MASK_TYPE_OPTIONS, getVectorMaskPanel, type VectorEditorController, type VectorMaskType } from '@pixerate/editor/vector';\nimport { useVectorEditorState } from './useVectorEditor';\n\nconst buttonClass =\n 'inline-flex h-7 min-w-7 items-center justify-center rounded-md border border-border bg-background px-1.5 text-xs font-medium text-foreground hover:bg-muted disabled:cursor-not-allowed disabled:opacity-40 aria-pressed:bg-primary aria-pressed:text-primary-foreground';\nconst selectClass = 'h-7 min-w-0 flex-1 rounded border border-border bg-background px-1 text-xs';\n\nexport interface VectorMaskPanelProps {\n controller: VectorEditorController;\n className?: string;\n}\n\n/**\n * Masks of the selection: Make Clipping Mask, Make Opacity Mask (the topmost selected object\n * masks the others) and Release; for a mask group (or something inside one) its type, Invert, a\n * switch that turns the mask off by hiding it, and Edit Mask / Edit Contents, which select the mask\n * (a path opens for anchor editing) or what it masks. Each change is one undo step.\n */\nexport function VectorMaskPanel({ controller, className }: VectorMaskPanelProps) {\n const state = useVectorEditorState(controller);\n const panel = getVectorMaskPanel(state);\n if (!panel) return null;\n const g = panel.group;\n const ids = g ? [g.id] : undefined;\n return (\n <div className={`space-y-2 ${className ?? ''}`} data-vector-mask-panel=\"\" aria-label=\"Mask\">\n <div className=\"flex flex-wrap items-center gap-1\">\n <span className=\"w-16 text-[11px] font-medium uppercase tracking-wide text-muted-foreground\">Mask</span>\n <button\n type=\"button\"\n data-vector-mask-action=\"clip\"\n className={buttonClass}\n title={panel.makeHint ?? 'Make Clipping Mask: the topmost object clips the others'}\n aria-label=\"Make Clipping Mask\"\n disabled={!panel.canMake}\n onClick={() => controller.makeMask('clip')}\n >\n Clip\n </button>\n <button\n type=\"button\"\n data-vector-mask-action=\"opacity\"\n className={buttonClass}\n title={panel.makeHint ?? 'Make Opacity Mask: the topmost object fades the others by its brightness'}\n aria-label=\"Make Opacity Mask\"\n disabled={!panel.canMake}\n onClick={() => controller.makeMask('luminance')}\n >\n Opacity\n </button>\n <button\n type=\"button\"\n data-vector-mask-action=\"release\"\n className={buttonClass}\n title=\"Release: the mask goes back on top and draws as itself\"\n aria-label=\"Release Mask\"\n disabled={!g}\n onClick={() => controller.releaseMask({ ids })}\n >\n Release\n </button>\n </div>\n {g && (\n <div className=\"space-y-2\" data-vector-mask-group={g.id} data-mask-type={g.type}>\n <div className=\"flex items-center gap-1\">\n <select\n aria-label=\"Mask type\"\n className={selectClass}\n value={g.type}\n title={VECTOR_MASK_TYPE_OPTIONS.find((o) => o.value === g.type)?.title}\n onChange={(e) => controller.setMaskOptions({ type: e.target.value as VectorMaskType }, { ids })}\n >\n {VECTOR_MASK_TYPE_OPTIONS.map((o) => (\n <option key={o.value} value={o.value} title={o.title}>\n {o.label}\n </option>\n ))}\n </select>\n <label className=\"flex items-center gap-1 text-xs text-foreground\" title=\"Show the contents where the mask hides them\">\n <input type=\"checkbox\" aria-label=\"Invert mask\" checked={g.invert} onChange={(e) => controller.setMaskOptions({ invert: e.target.checked }, { ids })} />\n Invert\n </label>\n </div>\n <div className=\"flex flex-wrap items-center gap-1\">\n <button\n type=\"button\"\n data-vector-mask-action=\"edit-mask\"\n className={buttonClass}\n aria-pressed={g.editing === 'mask'}\n title=\"Edit Mask: select the mask (a path opens for anchor editing)\"\n aria-label=\"Edit Mask\"\n onClick={() => controller.editMask({ id: g.id })}\n >\n Edit mask\n </button>\n <button\n type=\"button\"\n data-vector-mask-action=\"edit-contents\"\n className={buttonClass}\n aria-pressed={g.editing === 'contents'}\n title=\"Edit Contents: select what the mask masks\"\n aria-label=\"Edit Contents\"\n disabled={!g.contents.length}\n onClick={() => controller.editMaskContents({ id: g.id })}\n >\n Contents\n </button>\n <button\n type=\"button\"\n data-vector-mask-action=\"toggle\"\n className={buttonClass}\n aria-pressed={g.enabled}\n title={g.enabled ? 'Turn the mask off (hide it): the contents draw whole' : 'Turn the mask on'}\n aria-label=\"Mask on\"\n onClick={() => controller.setMaskOptions({ enabled: !g.enabled }, { ids })}\n >\n {g.enabled ? 'On' : 'Off'}\n </button>\n </div>\n </div>\n )}\n </div>\n );\n}\n","import React, { useId } from 'react';\nimport {\n VECTOR_FONT_WEIGHTS,\n VECTOR_TEXT_ALIGN_OPTIONS,\n applyVectorParagraphStyle,\n applyVectorTextStyle,\n getVectorTextPanel,\n type VectorEditorController,\n type VectorTextAlign,\n} from '@pixerate/editor/vector';\nimport { useVectorEditorState } from './useVectorEditor';\n\nconst buttonClass =\n 'inline-flex h-7 min-w-7 items-center justify-center rounded-md border border-border bg-background px-1.5 text-xs font-medium text-foreground hover:bg-muted disabled:cursor-not-allowed disabled:opacity-40 aria-pressed:bg-primary aria-pressed:text-primary-foreground';\nconst inputClass = 'h-7 min-w-0 flex-1 rounded border border-border bg-background px-1 text-xs';\nconst labelClass = 'w-16 text-[11px] font-medium uppercase tracking-wide text-muted-foreground';\n\nexport interface VectorTextPanelProps {\n controller: VectorEditorController;\n className?: string;\n}\n\nconst num = (v: string) => {\n const n = parseFloat(v);\n return Number.isFinite(n) ? n : null;\n};\n\n/**\n * Character and paragraph style of text: family, weight, size, italic, underline, strike-through,\n * tracking, leading, alignment and point / area text. It edits the selected characters while text\n * is being edited, else the selected text, else the defaults for new text. Type on a Path turns a\n * selected path into path text, and Create Outlines turns text into paths (with an outline\n * shaper). Each change is one undo step.\n */\nexport function VectorTextPanel({ controller, className }: VectorTextPanelProps) {\n const state = useVectorEditorState(controller);\n const listId = `vector-fonts-${useId().replace(/:/g, '')}`;\n const panel = getVectorTextPanel(state);\n if (!panel) return null;\n const f = panel.font;\n const style = (patch: Record<string, unknown>, merge?: string) => applyVectorTextStyle(controller, patch, merge ? { merge } : {});\n const where = panel.target === 'range' ? 'Selected characters' : panel.target === 'nodes' ? 'Selected text' : 'New text';\n return (\n <div className={`space-y-2 ${className ?? ''}`} data-vector-text-panel={panel.target} aria-label=\"Text\">\n <div className=\"flex items-center gap-1\">\n <span className={labelClass}>Text</span>\n <span className=\"text-[11px] text-muted-foreground\">{where}</span>\n </div>\n <div className=\"flex items-center gap-1\">\n <input\n aria-label=\"Font family\"\n className={inputClass}\n list={listId}\n placeholder=\"Mixed\"\n defaultValue={f.fontFamily ?? ''}\n key={`family:${f.fontFamily}`}\n onKeyDown={(e) => {\n if (e.key === 'Enter') (e.target as HTMLInputElement).blur();\n }}\n onBlur={(e) => {\n const v = e.target.value.trim();\n if (v && v !== f.fontFamily) style({ fontFamily: v });\n }}\n />\n <datalist id={listId}>\n {panel.families.map((fam) => (\n <option key={fam} value={fam} />\n ))}\n </datalist>\n </div>\n <div className=\"flex items-center gap-1\">\n <select aria-label=\"Font weight\" className={inputClass} value={f.fontWeight ?? ''} onChange={(e) => style({ fontWeight: Number(e.target.value) })}>\n {f.fontWeight === null && <option value=\"\">Mixed</option>}\n {VECTOR_FONT_WEIGHTS.map((w) => (\n <option key={w.value} value={w.value}>\n {w.label}\n </option>\n ))}\n {f.fontWeight !== null && !VECTOR_FONT_WEIGHTS.some((w) => w.value === f.fontWeight) && <option value={f.fontWeight}>{f.fontWeight}</option>}\n </select>\n <input\n type=\"number\"\n aria-label=\"Font size\"\n title=\"Font size\"\n className={`${inputClass} w-14 flex-none`}\n min={0.5}\n step={1}\n placeholder=\"—\"\n value={f.fontSize === null ? '' : Math.round(f.fontSize * 100) / 100}\n onChange={(e) => {\n const v = num(e.target.value);\n if (v !== null && v >= 0.5) style({ fontSize: v }, 'text-size');\n }}\n onBlur={() => controller.endMergedEdit()}\n />\n </div>\n <div className=\"flex flex-wrap items-center gap-1\">\n <button type=\"button\" className={buttonClass} aria-label=\"Bold\" aria-pressed={(f.fontWeight ?? 0) >= 600} onClick={() => style({ fontWeight: (f.fontWeight ?? 400) >= 600 ? 400 : 700 })}>\n <b>B</b>\n </button>\n <button type=\"button\" className={buttonClass} aria-label=\"Italic\" aria-pressed={f.italic === true} onClick={() => style({ italic: !f.italic })}>\n <i>I</i>\n </button>\n <button type=\"button\" className={buttonClass} aria-label=\"Underline\" aria-pressed={f.underline === true} onClick={() => style({ underline: !f.underline })}>\n <u>U</u>\n </button>\n <button type=\"button\" className={buttonClass} aria-label=\"Strike through\" aria-pressed={f.strikethrough === true} onClick={() => style({ strikethrough: !f.strikethrough })}>\n <s>S</s>\n </button>\n </div>\n <div className=\"flex items-center gap-1\">\n <label className=\"flex flex-1 items-center gap-1 text-xs text-foreground\" title=\"Tracking (1/1000 em)\">\n <span className=\"text-[11px] text-muted-foreground\">VA</span>\n <input\n type=\"number\"\n aria-label=\"Tracking\"\n className={inputClass}\n step={10}\n placeholder=\"—\"\n value={f.tracking ?? ''}\n onChange={(e) => style({ tracking: num(e.target.value) ?? 0 }, 'text-tracking')}\n onBlur={() => controller.endMergedEdit()}\n />\n </label>\n <label className=\"flex flex-1 items-center gap-1 text-xs text-foreground\" title=\"Leading (empty: auto)\">\n <span className=\"text-[11px] text-muted-foreground\">↕</span>\n <input\n type=\"number\"\n aria-label=\"Leading\"\n className={inputClass}\n min={0}\n step={1}\n placeholder=\"Auto\"\n value={f.leading ?? ''}\n onChange={(e) => style({ leading: num(e.target.value) }, 'text-leading')}\n onBlur={() => controller.endMergedEdit()}\n />\n </label>\n </div>\n <div className=\"flex flex-wrap items-center gap-1\" role=\"group\" aria-label=\"Alignment\">\n {VECTOR_TEXT_ALIGN_OPTIONS.map((o) => (\n <button\n key={o.value}\n type=\"button\"\n className={buttonClass}\n aria-label={`Align ${o.label}`}\n aria-pressed={panel.align === o.value}\n onClick={() => applyVectorParagraphStyle(controller, { align: o.value as VectorTextAlign })}\n >\n {o.label}\n </button>\n ))}\n </div>\n {panel.target !== 'defaults' && panel.ids.length === 1 && (\n <div className=\"flex flex-wrap items-center gap-1\">\n <button\n type=\"button\"\n className={buttonClass}\n aria-pressed={panel.frame === 'point'}\n title=\"Point text: no wrapping\"\n onClick={() => controller.setTextFrame(panel.ids[0], { kind: 'point' })}\n >\n Point\n </button>\n <button\n type=\"button\"\n className={buttonClass}\n aria-pressed={panel.frame === 'area'}\n title=\"Area text: wraps in a box\"\n onClick={() => controller.setTextFrame(panel.ids[0], { kind: 'area' })}\n >\n Area\n </button>\n </div>\n )}\n <div className=\"flex flex-wrap items-center gap-1\">\n <button\n type=\"button\"\n className={buttonClass}\n data-vector-text-action=\"type-on-path\"\n disabled={!panel.pathId}\n title={panel.pathId ? 'Type on a Path: set text along the selected path' : 'Select a path to set text along it'}\n onClick={() => {\n const r = controller.typeOnPath(panel.pathId!, { text: 'Text on a path' });\n if (r.ok && r.id) controller.editText(r.id, { anchor: 0, focus: 'Text on a path'.length });\n }}\n >\n Type on path\n </button>\n <button\n type=\"button\"\n className={buttonClass}\n data-vector-text-action=\"create-outlines\"\n disabled={panel.target !== 'nodes' || !panel.outlines}\n title={panel.outlines ? 'Create Outlines: turn the text into paths' : 'Create Outlines needs a font with outlines (load one)'}\n onClick={() => controller.createOutlines({ ids: panel.ids })}\n >\n Create outlines\n </button>\n </div>\n </div>\n );\n}\n","import React, { useId, useState } from 'react';\nimport { getVectorSymbolsPanel, vectorPaintToHex, type VectorEditorController } from '@pixerate/editor/vector';\nimport { useVectorEditorState } from './useVectorEditor';\nimport { VectorFilterDefs, VectorGradientDefs, VectorSceneNodes } from './VectorCanvas';\n\nconst buttonClass =\n 'inline-flex h-7 min-w-7 items-center justify-center rounded-md border border-border bg-background px-1.5 text-xs font-medium text-foreground hover:bg-muted disabled:cursor-not-allowed disabled:opacity-40 aria-pressed:bg-primary aria-pressed:text-primary-foreground';\nconst selectClass = 'h-7 min-w-0 flex-1 rounded border border-border bg-background px-1 text-xs';\nconst labelClass = 'w-16 text-[11px] font-medium uppercase tracking-wide text-muted-foreground';\n\nexport interface VectorSymbolsPanelProps {\n controller: VectorEditorController;\n className?: string;\n}\n\n/**\n * Symbols of the document with previews: New Symbol from the selection, Place, Edit (isolation\n * mode) and Delete per symbol; for a selected instance, Replace, Scale strokes, a fill tint and\n * Detach. Each change is one undo step.\n */\nexport function VectorSymbolsPanel({ controller, className }: VectorSymbolsPanelProps) {\n const state = useVectorEditorState(controller);\n const uid = useId().replace(/:/g, '');\n const panel = getVectorSymbolsPanel(state, { idPrefix: `vsym${uid}-` });\n const [error, setError] = useState<string | null>(null);\n const report = (r: { ok: boolean; message?: string }) => setError(r.ok ? null : (r.message ?? null));\n const inst = panel.instance;\n return (\n <div className={`space-y-2 ${className ?? ''}`} data-vector-symbols-panel=\"\" aria-label=\"Symbols\">\n <div className=\"flex items-center gap-1\">\n <span className={labelClass}>Symbols</span>\n <button type=\"button\" className={buttonClass} data-vector-symbol-action=\"make\" disabled={!panel.canMake} title=\"New Symbol from the selection (F8)\" onClick={() => report(controller.makeSymbol())}>\n New\n </button>\n {panel.editing && (\n <button type=\"button\" className={buttonClass} data-vector-symbol-action=\"exit\" title=\"Leave the symbol (Escape)\" onClick={() => controller.exitSymbolEdit()}>\n Done\n </button>\n )}\n </div>\n {panel.symbols.length > 0 && (\n <ul className=\"space-y-1\">\n {panel.symbols.map((s) => (\n <li key={s.id} data-vector-symbol={s.id} data-editing={s.editing || undefined} className=\"flex items-center gap-1\">\n <svg viewBox={s.viewBox} width={28} height={28} className=\"shrink-0 rounded border border-border bg-background\" aria-hidden=\"true\">\n <VectorGradientDefs defs={s.scene.defs} />\n <VectorFilterDefs filters={s.scene.filters} />\n <VectorSceneNodes nodes={s.scene.nodes} />\n </svg>\n <span className=\"min-w-0 flex-1 truncate text-xs text-foreground\" title={`${s.name} · ${s.instances} instance${s.instances === 1 ? '' : 's'}`}>\n {s.name} <span className=\"text-muted-foreground\">· {s.instances}</span>\n </span>\n <button type=\"button\" className={buttonClass} aria-label={`Place ${s.name}`} title=\"Place an instance\" onClick={() => report(controller.placeSymbol(s.id))}>\n +\n </button>\n <button type=\"button\" className={buttonClass} aria-label={`Edit ${s.name}`} aria-pressed={s.editing} title=\"Edit Symbol (isolation mode)\" onClick={() => report(controller.editSymbol(s.id))}>\n ✎\n </button>\n <button type=\"button\" className={buttonClass} aria-label={`Delete ${s.name}`} title=\"Delete the symbol (its instances become groups)\" onClick={() => report(controller.deleteSymbol(s.id, { detach: true }))}>\n ×\n </button>\n </li>\n ))}\n </ul>\n )}\n {inst && (\n <div className=\"space-y-1\" data-vector-instance={inst.id}>\n <div className=\"flex items-center gap-1\">\n <select aria-label=\"Instance symbol\" className={selectClass} value={inst.symbolId} onChange={(e) => report(controller.replaceSymbol(e.target.value, { ids: [inst.id] }))}>\n {panel.symbols.map((s) => (\n <option key={s.id} value={s.id}>\n {s.name}\n </option>\n ))}\n </select>\n <button type=\"button\" className={buttonClass} title=\"Break Link to Symbol: a plain group of its art\" onClick={() => report(controller.detachInstances({ ids: [inst.id] }))}>\n Detach\n </button>\n </div>\n <div className=\"flex items-center gap-2\">\n <label className=\"flex items-center gap-1 text-xs text-foreground\">\n <input type=\"checkbox\" aria-label=\"Scale strokes\" checked={inst.scaleStrokes} onChange={(e) => report(controller.setInstanceOptions({ scaleStrokes: e.target.checked }, { ids: [inst.id] }))} />\n Scale strokes\n </label>\n <label className=\"flex items-center gap-1 text-xs text-foreground\" title=\"Paint every fill of the art in this instance\">\n Tint\n <input\n type=\"color\"\n aria-label=\"Instance fill\"\n className=\"h-6 w-8 rounded border border-border\"\n value={vectorPaintToHex(inst.fill ?? undefined) ?? '#000000'}\n onChange={(e) => report(controller.setInstanceOptions({ fill: e.target.value }, { ids: [inst.id] }))}\n />\n </label>\n {inst.fill !== null && (\n <button type=\"button\" className={buttonClass} aria-label=\"Clear tint\" onClick={() => report(controller.setInstanceOptions({ fill: null }, { ids: [inst.id] }))}>\n ×\n </button>\n )}\n </div>\n </div>\n )}\n {error && <p className=\"text-[11px] text-destructive\">{error}</p>}\n </div>\n );\n}\n","import React, { useState } from 'react';\nimport { getVectorConstraintPanel, type VectorConstraintAction, type VectorEditorController } from '@pixerate/editor/vector';\nimport { useVectorEditorState } from './useVectorEditor';\n\nconst buttonClass =\n 'inline-flex h-7 min-w-7 items-center justify-center rounded-md border border-border bg-background px-1.5 text-xs font-medium text-foreground hover:bg-muted disabled:cursor-not-allowed disabled:opacity-40';\nconst inputClass = 'h-7 min-w-0 flex-1 rounded border border-border bg-background px-1 text-xs';\nconst labelClass = 'w-16 text-[11px] font-medium uppercase tracking-wide text-muted-foreground';\n\nexport interface VectorConstraintsPanelProps {\n controller: VectorEditorController;\n className?: string;\n}\n\n/**\n * Constraints: the degrees of freedom left, the constraints the selection allows (pick anchors with\n * the direct tool, or round paths), Auto Constrain, the constraints of the selection with their\n * values, and the named parameters. Each change is one undo step.\n */\nexport function VectorConstraintsPanel({ controller, className }: VectorConstraintsPanelProps) {\n const state = useVectorEditorState(controller);\n const panel = getVectorConstraintPanel(state);\n const [error, setError] = useState<string | null>(null);\n const [param, setParam] = useState({ name: '', value: '' });\n const report = (r: { ok: boolean; message?: string }) => setError(r.ok ? null : (r.message ?? null));\n const add = (a: VectorConstraintAction) => report(controller.addConstraint({ kind: a.kind, refs: a.refs }));\n if (!panel.actions.length && !panel.constraints.length && !state.document.constraints?.length && state.tool !== 'direct') return null;\n return (\n <div className={`space-y-2 ${className ?? ''}`} data-vector-constraints-panel=\"\" data-dof-status={panel.dof.status} aria-label=\"Constraints\">\n <div className=\"flex items-center gap-1\">\n <span className={labelClass}>Constraints</span>\n <span className=\"flex-1 truncate text-[11px] text-muted-foreground\" data-vector-dof=\"\">\n {panel.dof.message}\n </span>\n <button type=\"button\" className={buttonClass} title=\"Auto Constrain: add what the selection (or the drawing) nearly satisfies\" onClick={() => report(controller.autoConstrain())}>\n Auto\n </button>\n </div>\n {panel.actions.length > 0 && (\n <div className=\"flex flex-wrap gap-1\" role=\"group\" aria-label=\"Add constraint\">\n {panel.actions.map((a) => (\n <button key={a.kind} type=\"button\" className={buttonClass} data-vector-constraint-action={a.kind} title={`Add ${a.label}`} onClick={() => add(a)}>\n {a.label}\n </button>\n ))}\n </div>\n )}\n {panel.constraints.length > 0 && (\n <ul className=\"space-y-1\">\n {panel.constraints.map((c) => (\n <li key={c.id} data-vector-constraint={c.id} data-satisfied={c.satisfied && !c.conflict ? 'true' : 'false'} className=\"flex items-center gap-1 text-xs text-foreground\">\n <span className={`min-w-0 flex-1 truncate ${c.conflict || !c.satisfied ? 'text-destructive' : ''}`}>\n {c.label}\n {c.name ? ` ${c.name}` : ''}\n </span>\n {c.value !== undefined && (\n <input\n aria-label={`Value of ${c.name ?? c.id}`}\n className={`${inputClass} w-16 flex-none`}\n defaultValue={c.value}\n key={`${c.id}:${c.value}`}\n onKeyDown={(e) => {\n if (e.key === 'Enter') (e.target as HTMLInputElement).blur();\n }}\n onBlur={(e) => {\n if (e.target.value.trim() !== c.value) report(controller.setConstraintValue(c.id, e.target.value));\n }}\n />\n )}\n <button type=\"button\" className={buttonClass} aria-label={`Remove ${c.label} constraint`} onClick={() => report(controller.removeConstraints([c.id]))}>\n ×\n </button>\n </li>\n ))}\n </ul>\n )}\n <div className=\"space-y-1\" aria-label=\"Parameters\">\n {panel.parameters.map((p) => (\n <div key={p.name} className=\"flex items-center gap-1 text-xs\">\n <span className=\"w-12 truncate font-mono\">{p.name}</span>\n <input\n aria-label={`Parameter ${p.name}`}\n className={inputClass}\n defaultValue={p.value}\n key={`${p.name}:${p.value}`}\n onKeyDown={(e) => {\n if (e.key === 'Enter') (e.target as HTMLInputElement).blur();\n }}\n onBlur={(e) => {\n if (e.target.value.trim() !== p.value) report(controller.setConstraintValue(p.name, e.target.value));\n }}\n />\n <span className=\"w-10 text-right text-muted-foreground\">{p.result === null ? '!' : Math.round(p.result * 100) / 100}</span>\n </div>\n ))}\n <form\n className=\"flex items-center gap-1\"\n onSubmit={(e) => {\n e.preventDefault();\n if (!param.name.trim()) return;\n const r = controller.setConstraintValue(param.name.trim(), param.value);\n report(r);\n if (r.ok) setParam({ name: '', value: '' });\n }}\n >\n <input aria-label=\"New parameter name\" placeholder=\"name\" className={`${inputClass} w-12 flex-none`} value={param.name} onChange={(e) => setParam({ ...param, name: e.target.value })} />\n <input aria-label=\"New parameter value\" placeholder=\"value\" className={inputClass} value={param.value} onChange={(e) => setParam({ ...param, value: e.target.value })} />\n <button type=\"submit\" className={buttonClass} aria-label=\"Add parameter\">\n +\n </button>\n </form>\n </div>\n {error && <p className=\"text-[11px] text-destructive\">{error}</p>}\n </div>\n );\n}\n","import React from 'react';\nimport {\n VECTOR_HORIZONTAL_RESIZING,\n VECTOR_HORIZONTAL_RESIZING_LABELS,\n VECTOR_VERTICAL_RESIZING,\n VECTOR_VERTICAL_RESIZING_LABELS,\n getVectorFramePanel,\n vectorPaintToHex,\n type VectorEditorController,\n type VectorHorizontalResizing,\n type VectorVerticalResizing\n} from '@pixerate/editor/vector';\nimport { useVectorEditorState } from './useVectorEditor';\n\nconst buttonClass =\n 'inline-flex h-7 min-w-7 items-center justify-center rounded-md border border-border bg-background px-1.5 text-xs font-medium text-foreground hover:bg-muted disabled:cursor-not-allowed disabled:opacity-40';\nconst selectClass = 'h-7 min-w-0 flex-1 rounded border border-border bg-background px-1 text-xs';\nconst numberClass = 'h-7 w-16 rounded border border-border bg-background px-1.5 text-xs';\n\nexport interface VectorFramePanelProps {\n controller: VectorEditorController;\n className?: string;\n}\n\n/**\n * Frames (artboards): Frame Selection; for a selected frame its position, size (its children\n * follow their constraints), background and clipping; for objects inside a frame their resizing\n * constraints. Each change is one undo step (sizes apply on Enter or blur).\n */\nexport function VectorFramePanel({ controller, className }: VectorFramePanelProps) {\n const state = useVectorEditorState(controller);\n const panel = getVectorFramePanel(state);\n const f = panel.frame;\n const ids = f ? [f.id] : undefined;\n const fillHex = f ? vectorPaintToHex(f.frame.fill ?? null) : null;\n const number = (key: 'x' | 'y' | 'width' | 'height', label: string) => (\n <label className=\"flex items-center gap-1 text-xs text-foreground\">\n <span className=\"w-4 text-muted-foreground\">{label}</span>\n {/* Applied on Enter or blur: each resize lays the children out again, so the digits typed on the way must not. */}\n <input\n key={`${f!.id}:${f!.frame[key]}`}\n type=\"number\"\n step=\"1\"\n min={key === 'width' || key === 'height' ? 1 : undefined}\n aria-label={`Frame ${key}`}\n className={numberClass}\n defaultValue={Math.round(f!.frame[key] * 100) / 100}\n onKeyDown={(e) => {\n if (e.key === 'Enter') e.currentTarget.blur();\n }}\n onBlur={(e) => {\n const n = parseFloat(e.target.value);\n if (Number.isFinite(n) && n !== Math.round(f!.frame[key] * 100) / 100 && (key === 'x' || key === 'y' || n > 0)) controller.setFrame({ [key]: n }, { ids });\n }}\n />\n </label>\n );\n return (\n <div className={`space-y-2 ${className ?? ''}`} data-vector-frame-panel=\"\" aria-label=\"Frame\">\n <div className=\"flex flex-wrap items-center gap-1\">\n <span className=\"w-16 text-[11px] font-medium uppercase tracking-wide text-muted-foreground\">Frame</span>\n <button\n type=\"button\"\n data-vector-frame-action=\"frame-selection\"\n className={buttonClass}\n title=\"Frame Selection: put the selection in a frame fitted to it\"\n aria-label=\"Frame Selection\"\n disabled={!state.selection.length}\n onClick={() => controller.frameSelection()}\n >\n Frame selection\n </button>\n </div>\n {f && (\n <div className=\"space-y-2\" data-vector-frame={f.id}>\n <div className=\"grid grid-cols-2 gap-1\">\n {number('x', 'X')}\n {number('y', 'Y')}\n {number('width', 'W')}\n {number('height', 'H')}\n </div>\n <div className=\"flex items-center gap-2\">\n <label className=\"flex w-16 items-center gap-1.5 text-xs text-foreground\">\n <input\n type=\"checkbox\"\n aria-label=\"Frame fill on\"\n checked={f.frame.fill !== undefined && f.frame.fill !== null}\n onChange={(e) => controller.setFrame({ fill: e.target.checked ? (fillHex ?? '#ffffff') : null }, { ids })}\n />\n Fill\n </label>\n <input\n type=\"color\"\n aria-label=\"Frame fill colour\"\n className=\"h-7 w-10 cursor-pointer rounded border border-border bg-background disabled:opacity-40\"\n disabled={f.frame.fill === undefined || f.frame.fill === null}\n value={fillHex ?? '#ffffff'}\n onChange={(e) => controller.setFrame({ fill: e.target.value }, { ids, merge: 'frame-fill' })}\n />\n <label className=\"flex items-center gap-1 text-xs text-foreground\" title=\"Hide what lies outside the frame\">\n <input type=\"checkbox\" aria-label=\"Clip content\" checked={f.frame.clip !== false} onChange={(e) => controller.setFrame({ clip: e.target.checked }, { ids })} />\n Clip\n </label>\n </div>\n </div>\n )}\n {panel.resizing && (\n <div className=\"space-y-1\" data-vector-resizing=\"\">\n <label className=\"flex items-center gap-2 text-xs text-foreground\">\n <span className=\"w-16\">Horizontal</span>\n <select\n aria-label=\"Horizontal constraint\"\n className={selectClass}\n value={panel.resizing.horizontal}\n onChange={(e) => controller.setResizing({ horizontal: e.target.value as VectorHorizontalResizing }, { ids: panel.resizing!.ids })}\n >\n {panel.resizing.horizontal === 'mixed' && (\n <option value=\"mixed\" disabled>\n Mixed\n </option>\n )}\n {VECTOR_HORIZONTAL_RESIZING.map((h) => (\n <option key={h} value={h}>\n {VECTOR_HORIZONTAL_RESIZING_LABELS[h]}\n </option>\n ))}\n </select>\n </label>\n <label className=\"flex items-center gap-2 text-xs text-foreground\">\n <span className=\"w-16\">Vertical</span>\n <select\n aria-label=\"Vertical constraint\"\n className={selectClass}\n value={panel.resizing.vertical}\n onChange={(e) => controller.setResizing({ vertical: e.target.value as VectorVerticalResizing }, { ids: panel.resizing!.ids })}\n >\n {panel.resizing.vertical === 'mixed' && (\n <option value=\"mixed\" disabled>\n Mixed\n </option>\n )}\n {VECTOR_VERTICAL_RESIZING.map((v) => (\n <option key={v} value={v}>\n {VECTOR_VERTICAL_RESIZING_LABELS[v]}\n </option>\n ))}\n </select>\n </label>\n </div>\n )}\n </div>\n );\n}\n","import React from 'react';\nimport { isVectorFrame, vectorMasterPages, vectorPages, type VectorEditorController } from '@pixerate/editor/vector';\nimport { useVectorEditorState } from './useVectorEditor';\n\nconst buttonClass =\n 'inline-flex h-7 min-w-7 items-center justify-center rounded-md border border-border bg-background px-1.5 text-xs font-medium text-foreground hover:bg-muted disabled:cursor-not-allowed disabled:opacity-40 aria-[current=true]:bg-primary aria-[current=true]:text-primary-foreground';\nconst selectClass = 'h-7 min-w-0 flex-1 rounded border border-border bg-background px-1 text-xs';\n\nexport interface VectorPagesPanelProps {\n controller: VectorEditorController;\n className?: string;\n}\n\n/**\n * Pages: the document's pages (top-level frames) to go to, adding pages and master pages, and the\n * master page the selected page uses. Adding and applying are one undo step each.\n */\nexport function VectorPagesPanel({ controller, className }: VectorPagesPanelProps) {\n const state = useVectorEditorState(controller);\n const pages = vectorPages(state.document);\n const masters = vectorMasterPages(state.document);\n const selected = state.selection.map((id) => state.document.nodes.find((n) => n.id === id)).find((n) => isVectorFrame(n));\n const page = selected && !selected.frame.master ? selected : null;\n return (\n <div className={`space-y-2 ${className ?? ''}`} data-vector-pages-panel=\"\" aria-label=\"Pages\">\n <div className=\"flex flex-wrap items-center gap-1\">\n <span className=\"w-16 text-[11px] font-medium uppercase tracking-wide text-muted-foreground\">Pages</span>\n {pages.map((p, i) => (\n <button key={p.id} type=\"button\" className={buttonClass} aria-current={state.selection.includes(p.id)} data-vector-page={p.id} title={`Go to ${p.name ?? `page ${i + 1}`}`} onClick={() => controller.goToPage(p.id)}>\n {i + 1}\n </button>\n ))}\n {masters.map((m) => (\n <button key={m.id} type=\"button\" className={buttonClass} aria-current={state.selection.includes(m.id)} data-vector-master-page={m.id} title={`Go to master page ${m.name ?? ''}`} onClick={() => controller.goToPage(m.id)}>\n {m.name ?? 'Master'}\n </button>\n ))}\n <button type=\"button\" className={buttonClass} data-vector-pages-action=\"add\" title=\"Add a page after the last\" onClick={() => controller.addPage()}>\n + Page\n </button>\n <button type=\"button\" className={buttonClass} data-vector-pages-action=\"master\" title=\"Add a master page used by every page (headers, footers, {page} numbers)\" onClick={() => controller.addMasterPage({ assignTo: 'all' })}>\n + Master\n </button>\n </div>\n {page && masters.length > 0 && (\n <div className=\"flex flex-wrap items-center gap-1\">\n <span className=\"w-16\" />\n <select aria-label=\"Master page\" className={selectClass} value={page.frame.masterId ?? ''} onChange={(e) => controller.setPageMaster(e.target.value || null, { ids: [page.id] })}>\n <option value=\"\">No master</option>\n {masters.map((m) => (\n <option key={m.id} value={m.id}>\n {m.name ?? 'Master'}\n </option>\n ))}\n </select>\n </div>\n )}\n </div>\n );\n}\n","import React from 'react';\nimport {\n VECTOR_CONNECTOR_ROUTES,\n VECTOR_CONNECTOR_ROUTE_LABELS,\n VECTOR_CONNECTOR_SIDES,\n VECTOR_CONNECTOR_SIDE_LABELS,\n getVectorConnectorPanel,\n type VectorConnectorEnd,\n type VectorConnectorRoute,\n type VectorConnectorSide,\n type VectorEditorController\n} from '@pixerate/editor/vector';\nimport { useVectorEditorState } from './useVectorEditor';\n\nconst buttonClass =\n 'inline-flex h-7 min-w-7 items-center justify-center rounded-md border border-border bg-background px-1.5 text-xs font-medium text-foreground hover:bg-muted disabled:cursor-not-allowed disabled:opacity-40';\nconst selectClass = 'h-7 min-w-0 flex-1 rounded border border-border bg-background px-1 text-xs';\nconst numberClass = 'h-7 w-16 rounded border border-border bg-background px-1.5 text-xs';\n\nexport interface VectorConnectorPanelProps {\n controller: VectorEditorController;\n className?: string;\n}\n\n/**\n * The selected connector: its route (straight, elbow, curved), the elbow corner radius, and for\n * each glued end the side it meets (Auto: the side facing the other end) and Unglue. Each change is\n * one undo step.\n */\nexport function VectorConnectorPanel({ controller, className }: VectorConnectorPanelProps) {\n const state = useVectorEditorState(controller);\n const panel = getVectorConnectorPanel(state);\n if (!panel) return null;\n const ids = [panel.id];\n const end = (key: 'start' | 'end', label: string, e: VectorConnectorEnd | null) => (\n <div className=\"flex items-center gap-1\" data-vector-connector-end={key}>\n <span className=\"w-16 text-xs text-foreground\">{label}</span>\n {e ? (\n <>\n <select\n aria-label={`${label} side`}\n className={selectClass}\n value={e.side ?? 'auto'}\n onChange={(ev) => controller.setConnector({ [key]: { nodeId: e.nodeId, side: ev.target.value as VectorConnectorSide } }, { ids })}\n >\n {VECTOR_CONNECTOR_SIDES.map((s) => (\n <option key={s} value={s}>\n {VECTOR_CONNECTOR_SIDE_LABELS[s]}\n </option>\n ))}\n </select>\n <button type=\"button\" className={buttonClass} title=\"Unglue: the end stays where it is\" aria-label={`Unglue ${label.toLowerCase()}`} onClick={() => controller.setConnector({ [key]: null }, { ids })}>\n Unglue\n </button>\n </>\n ) : (\n <span className=\"text-[11px] text-muted-foreground\">Free</span>\n )}\n </div>\n );\n return (\n <div className={`space-y-2 ${className ?? ''}`} data-vector-connector-panel={panel.id} aria-label=\"Connector\">\n <div className=\"flex items-center gap-1\">\n <span className=\"w-16 text-[11px] font-medium uppercase tracking-wide text-muted-foreground\">Connector</span>\n <select aria-label=\"Connector route\" className={selectClass} value={panel.route} onChange={(e) => controller.setConnector({ route: e.target.value as VectorConnectorRoute }, { ids })}>\n {VECTOR_CONNECTOR_ROUTES.map((r) => (\n <option key={r} value={r}>\n {VECTOR_CONNECTOR_ROUTE_LABELS[r]}\n </option>\n ))}\n </select>\n {panel.route === 'elbow' && (\n <input\n type=\"number\"\n min=\"0\"\n step=\"1\"\n aria-label=\"Elbow radius\"\n title=\"Corner radius of the bends\"\n className={numberClass}\n value={panel.radius}\n onChange={(e) => {\n const n = parseFloat(e.target.value);\n if (Number.isFinite(n) && n >= 0) controller.setConnector({ radius: n }, { ids });\n }}\n />\n )}\n </div>\n {end('start', 'Start', panel.start)}\n {end('end', 'End', panel.end)}\n </div>\n );\n}\n","import React, { useState } from 'react';\nimport { isVectorFreeformGradient, isVectorMeshGradient, vectorPaintToHex, type VectorEditorController, type VectorPathNode } from '@pixerate/editor/vector';\nimport { useVectorEditorState } from './useVectorEditor';\n\nconst buttonClass =\n 'inline-flex h-7 min-w-7 items-center justify-center rounded-md border border-border bg-background px-1.5 text-xs font-medium text-foreground hover:bg-muted disabled:cursor-not-allowed disabled:opacity-40';\nconst numberClass = 'h-7 w-12 rounded border border-border bg-background px-1.5 text-xs';\n\nexport interface VectorShadingPanelProps {\n controller: VectorEditorController;\n className?: string;\n}\n\n/**\n * Gradient meshes and freeform gradients of the selected path: make a rows × columns mesh or a\n * freeform gradient, and edit the point picked with the Gradient tool (colour, opacity, and a\n * freeform point's spread, or remove it). Each change is one undo step.\n */\nexport function VectorShadingPanel({ controller, className }: VectorShadingPanelProps) {\n const state = useVectorEditorState(controller);\n const [rows, setRows] = useState(2);\n const [columns, setColumns] = useState(2);\n const path = state.selection.map((id) => controller.getNode(id)).find((n): n is VectorPathNode => n?.type === 'path');\n if (!path) return null;\n const fill = path.fill;\n const sel = state.shadingPoint?.nodeId === path.id ? state.shadingPoint : null;\n const mesh = isVectorMeshGradient(fill) ? fill : null;\n const free = isVectorFreeformGradient(fill) ? fill : null;\n const color = sel ? (mesh ? mesh.colors[sel.index] : free?.points[sel.index]?.color) : undefined;\n const opacity = sel ? (mesh ? (mesh.opacities?.[sel.index] ?? 1) : (free?.points[sel.index]?.opacity ?? 1)) : 1;\n const spread = sel && free ? (free.points[sel.index]?.spread ?? 0) : 0;\n const edit = (patch: { color?: string; opacity?: number; spread?: number }, merge?: string) => {\n if (!sel) return;\n if (mesh) controller.setMeshPoint(path.id, sel.index, patch, merge ? { merge } : {});\n else controller.setFreeformPoint(path.id, sel.index, patch, merge ? { merge } : {});\n };\n return (\n <div className={`space-y-2 ${className ?? ''}`} data-vector-shading-panel={path.id} aria-label=\"Mesh and freeform gradient\">\n <div className=\"flex flex-wrap items-center gap-1\">\n <span className=\"w-16 text-[11px] font-medium uppercase tracking-wide text-muted-foreground\">Shading</span>\n <input type=\"number\" min={1} max={32} aria-label=\"Mesh rows\" title=\"Mesh rows\" className={numberClass} value={rows} onChange={(e) => setRows(Math.max(1, Math.min(32, parseInt(e.target.value, 10) || 1)))} />\n <span className=\"text-xs text-muted-foreground\">×</span>\n <input type=\"number\" min={1} max={32} aria-label=\"Mesh columns\" title=\"Mesh columns\" className={numberClass} value={columns} onChange={(e) => setColumns(Math.max(1, Math.min(32, parseInt(e.target.value, 10) || 1)))} />\n <button type=\"button\" className={buttonClass} data-vector-shading-action=\"mesh\" title=\"Create Gradient Mesh: smooth patches whose points blend colours (edit them with the Gradient tool)\" onClick={() => controller.setMeshGradient({ rows, columns }, { ids: [path.id] })}>\n Mesh\n </button>\n <button type=\"button\" className={buttonClass} data-vector-shading-action=\"freeform\" title=\"Freeform Gradient: colour points blended across the shape (click inside with the Gradient tool to add one)\" onClick={() => controller.setFreeformGradient({}, { ids: [path.id] })}>\n Freeform\n </button>\n </div>\n {(mesh || free) && !sel && <p className=\"text-[11px] text-muted-foreground\">Gradient tool (G): drag points; {free ? 'click inside to add one, Alt-click to remove.' : 'pick one to colour it.'}</p>}\n {sel && (\n <div className=\"flex flex-wrap items-center gap-2\" data-vector-shading-point={sel.index}>\n <span className=\"w-16 text-xs text-foreground\">Point {sel.index}</span>\n <input type=\"color\" aria-label=\"Point colour\" className=\"h-7 w-10 cursor-pointer rounded border border-border bg-background\" value={vectorPaintToHex(color ?? '#000000') ?? '#000000'} onChange={(e) => edit({ color: e.target.value }, 'shading-color')} />\n <input type=\"range\" min={0} max={1} step={0.05} aria-label=\"Point opacity\" title=\"Opacity\" className=\"h-4 w-20 accent-primary\" value={opacity} onChange={(e) => edit({ opacity: parseFloat(e.target.value) }, 'shading-opacity')} />\n {free && (\n <>\n <input type=\"range\" min={0} max={1} step={0.05} aria-label=\"Point spread\" title=\"Spread: pure colour round the point\" className=\"h-4 w-20 accent-primary\" value={spread} onChange={(e) => edit({ spread: parseFloat(e.target.value) }, 'shading-spread')} />\n <button type=\"button\" className={buttonClass} aria-label=\"Remove point\" onClick={() => controller.removeFreeformPoint(path.id, sel.index)}>\n Remove\n </button>\n </>\n )}\n </div>\n )}\n </div>\n );\n}\n","import React, { useRef, useState } from 'react';\nimport type { VectorEditorController } from '@pixerate/editor/vector';\n\nconst buttonClass =\n 'inline-flex h-7 min-w-7 items-center justify-center rounded-md border border-border bg-background px-1.5 text-xs font-medium text-foreground hover:bg-muted disabled:cursor-not-allowed disabled:opacity-40';\nconst selectClass = 'h-7 min-w-0 flex-1 rounded border border-border bg-background px-1 text-xs';\nconst numberClass = 'h-7 w-12 rounded border border-border bg-background px-1.5 text-xs';\n\nexport interface VectorTracePanelProps {\n controller: VectorEditorController;\n className?: string;\n}\n\n/** Decodes an image file in the browser into RGBA pixels (at most `max` pixels, scaled down to fit). */\nasync function filePixels(file: File, max = 1_000_000): Promise<{ width: number; height: number; data: Uint8ClampedArray }> {\n const bitmap = await createImageBitmap(file);\n const k = Math.min(1, Math.sqrt(max / (bitmap.width * bitmap.height)));\n const width = Math.max(1, Math.round(bitmap.width * k));\n const height = Math.max(1, Math.round(bitmap.height * k));\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext('2d')!;\n ctx.drawImage(bitmap, 0, 0, width, height);\n return { width, height, data: ctx.getImageData(0, 0, width, height).data };\n}\n\n/**\n * Image Trace: pick an image file and trace it into paths, in one colour (dark areas) or a stacked\n * path per colour. The traced group goes on the artboard at its width. One undo step.\n */\nexport function VectorTracePanel({ controller, className }: VectorTracePanelProps) {\n const input = useRef<HTMLInputElement>(null);\n const [mode, setMode] = useState<'threshold' | 'color'>('threshold');\n const [colors, setColors] = useState(6);\n const [message, setMessage] = useState<string | null>(null);\n const trace = async (file: File) => {\n try {\n const pixels = await filePixels(file);\n const doc = controller.getState().document;\n const width = Math.min(doc.width, pixels.width);\n const r = controller.traceImage(pixels, { mode, colors, width, name: file.name.replace(/\\.[^.]+$/, '') || 'Image Trace' });\n setMessage(r.ok ? null : r.message);\n } catch {\n setMessage('That file could not be read as an image.');\n }\n };\n return (\n <div className={`space-y-1 ${className ?? ''}`} data-vector-trace-panel=\"\" aria-label=\"Image trace\">\n <div className=\"flex items-center gap-1\">\n <span className=\"w-16 text-[11px] font-medium uppercase tracking-wide text-muted-foreground\">Trace</span>\n <select aria-label=\"Trace mode\" className={selectClass} value={mode} onChange={(e) => setMode(e.target.value as 'threshold' | 'color')}>\n <option value=\"threshold\">Black &amp; white</option>\n <option value=\"color\">Colours</option>\n </select>\n {mode === 'color' && (\n <input type=\"number\" min={2} max={32} aria-label=\"Trace colours\" title=\"Colours\" className={numberClass} value={colors} onChange={(e) => setColors(Math.max(2, Math.min(32, parseInt(e.target.value, 10) || 2)))} />\n )}\n <button type=\"button\" className={buttonClass} data-vector-trace-action=\"\" title=\"Image Trace: pick an image to turn into paths\" onClick={() => input.current?.click()}>\n Image…\n </button>\n <input\n ref={input}\n type=\"file\"\n accept=\"image/*\"\n hidden\n onChange={(e) => {\n const file = e.target.files?.[0];\n e.target.value = '';\n if (file) void trace(file);\n }}\n />\n </div>\n {message && <p className=\"text-[11px] text-red-600\">{message}</p>}\n </div>\n );\n}\n","import React from 'react';\nimport { VECTOR_SYMMETRY_MODES, VECTOR_SYMMETRY_MODE_LABELS, isVectorSymmetryGroup, type VectorEditorController, type VectorSymmetryMode } from '@pixerate/editor/vector';\nimport { useVectorEditorState } from './useVectorEditor';\n\nconst buttonClass =\n 'inline-flex h-7 min-w-7 items-center justify-center rounded-md border border-border bg-background px-1.5 text-xs font-medium text-foreground hover:bg-muted disabled:cursor-not-allowed disabled:opacity-40 aria-pressed:bg-primary aria-pressed:text-primary-foreground';\nconst selectClass = 'h-7 min-w-0 flex-1 rounded border border-border bg-background px-1 text-xs';\nconst numberClass = 'h-7 w-12 rounded border border-border bg-background px-1.5 text-xs';\n\nexport interface VectorSymmetryPanelProps {\n controller: VectorEditorController;\n className?: string;\n}\n\n/**\n * Live symmetry: make a symmetry group from the selection (or an empty one to draw into), and for\n * a selected symmetry group its mode, radial copies and mirroring, drawing inside it, and release\n * (keeping the copies with Expand). Each change is one undo step.\n */\nexport function VectorSymmetryPanel({ controller, className }: VectorSymmetryPanelProps) {\n const state = useVectorEditorState(controller);\n const group = state.selection.map((id) => controller.getNode(id)).find(isVectorSymmetryGroup) ?? null;\n const s = group?.symmetry;\n const ids = group ? [group.id] : undefined;\n const drawing = !!group && state.symmetryTarget === group.id;\n return (\n <div className={`space-y-2 ${className ?? ''}`} data-vector-symmetry-panel=\"\" aria-label=\"Symmetry\">\n <div className=\"flex flex-wrap items-center gap-1\">\n <span className=\"w-16 text-[11px] font-medium uppercase tracking-wide text-muted-foreground\">Symmetry</span>\n {!group && (\n <button type=\"button\" className={buttonClass} data-vector-symmetry-action=\"make\" title=\"Make Symmetry: the selection (or nothing yet) mirrored live across a vertical axis\" onClick={() => controller.makeSymmetry({ mode: 'vertical' })}>\n Mirror\n </button>\n )}\n {!group && (\n <button type=\"button\" className={buttonClass} data-vector-symmetry-action=\"radial\" title=\"Make Symmetry: the selection repeated round its centre\" onClick={() => controller.makeSymmetry({ mode: 'radial', copies: 6 })}>\n Radial\n </button>\n )}\n {group && s && (\n <>\n <select aria-label=\"Symmetry mode\" className={selectClass} value={s.mode} onChange={(e) => controller.setSymmetry({ mode: e.target.value as VectorSymmetryMode }, { ids })}>\n {VECTOR_SYMMETRY_MODES.map((m) => (\n <option key={m} value={m}>\n {VECTOR_SYMMETRY_MODE_LABELS[m]}\n </option>\n ))}\n </select>\n {s.mode === 'radial' && (\n <>\n <input type=\"number\" min={2} max={64} aria-label=\"Symmetry copies\" title=\"Copies round the circle\" className={numberClass} value={s.copies ?? 6} onChange={(e) => controller.setSymmetry({ copies: Math.max(2, Math.min(64, parseInt(e.target.value, 10) || 2)) }, { ids })} />\n <label className=\"flex items-center gap-1 text-xs text-foreground\" title=\"Mirror each copy too (kaleidoscope)\">\n <input type=\"checkbox\" aria-label=\"Mirror copies\" checked={!!s.mirror} onChange={(e) => controller.setSymmetry({ mirror: e.target.checked }, { ids })} />\n Mirror\n </label>\n </>\n )}\n </>\n )}\n </div>\n {group && (\n <div className=\"flex flex-wrap items-center gap-1\">\n <span className=\"w-16\" />\n <button type=\"button\" className={buttonClass} aria-pressed={drawing} data-vector-symmetry-action=\"draw\" title=\"Draw inside: new pen, pencil, shape and text art goes into the group, mirrored as you draw (Escape stops)\" onClick={() => (drawing ? controller.exitSymmetry() : controller.enterSymmetry(group.id))}>\n Draw inside\n </button>\n <button type=\"button\" className={buttonClass} title=\"Expand: keep the copies as real objects\" onClick={() => controller.releaseSymmetry({ ids, expand: true })}>\n Expand\n </button>\n <button type=\"button\" className={buttonClass} title=\"Release: stop repeating (the copies go)\" onClick={() => controller.releaseSymmetry({ ids })}>\n Release\n </button>\n </div>\n )}\n </div>\n );\n}\n","import React from 'react';\nimport { vectorPerspectivePlanes, vectorPerspectivePreset, type VectorEditorController, type VectorPerspectivePlane } from '@pixerate/editor/vector';\nimport { useVectorEditorState } from './useVectorEditor';\n\nconst buttonClass =\n 'inline-flex h-7 min-w-7 items-center justify-center rounded-md border border-border bg-background px-1.5 text-xs font-medium text-foreground hover:bg-muted disabled:cursor-not-allowed disabled:opacity-40 aria-pressed:bg-primary aria-pressed:text-primary-foreground';\nconst selectClass = 'h-7 min-w-0 flex-1 rounded border border-border bg-background px-1 text-xs';\nconst PLANE_LABELS: Record<VectorPerspectivePlane, string> = { floor: 'Floor', left: 'Left wall', right: 'Right wall', side: 'Side wall', front: 'Front' };\n\nexport interface VectorPerspectivePanelProps {\n controller: VectorEditorController;\n className?: string;\n}\n\n/**\n * Perspective drawing: add a 1-, 2- or 3-point grid, pick the plane new shapes are drawn on, lay\n * the selection onto it, show or hide the grid, or remove it. Grid changes and attaching are one\n * undo step each.\n */\nexport function VectorPerspectivePanel({ controller, className }: VectorPerspectivePanelProps) {\n const state = useVectorEditorState(controller);\n const grid = state.document.perspective ?? null;\n const planes = grid ? vectorPerspectivePlanes(grid) : [];\n const [attachTo, setAttachTo] = React.useState<VectorPerspectivePlane | ''>('');\n const target = (state.perspectivePlane ?? attachTo) || planes[0];\n const add = (n: 1 | 2 | 3) => controller.setPerspective(vectorPerspectivePreset(n, state.document.width, state.document.height));\n return (\n <div className={`space-y-2 ${className ?? ''}`} data-vector-perspective-panel=\"\" aria-label=\"Perspective\">\n <div className=\"flex flex-wrap items-center gap-1\">\n <span className=\"w-16 text-[11px] font-medium uppercase tracking-wide text-muted-foreground\">Perspective</span>\n {([1, 2, 3] as const).map((n) => (\n <button key={n} type=\"button\" className={buttonClass} aria-pressed={grid?.vanishingPoints.length === n} data-vector-perspective-preset={n} title={`A ${n}-point perspective grid for the page`} onClick={() => add(n)}>\n {n}-pt\n </button>\n ))}\n </div>\n {grid && (\n <div className=\"flex flex-wrap items-center gap-1\">\n <span className=\"w-16\" />\n <select aria-label=\"Draw on plane\" title=\"New rectangles, ellipses, polygons and stars are drawn on this plane\" className={selectClass} value={state.perspectivePlane ?? ''} onChange={(e) => controller.setPerspectivePlane((e.target.value || null) as VectorPerspectivePlane | null)}>\n <option value=\"\">Draw flat</option>\n {planes.map((p) => (\n <option key={p} value={p}>\n Draw on {PLANE_LABELS[p].toLowerCase()}\n </option>\n ))}\n </select>\n </div>\n )}\n {grid && (\n <div className=\"flex flex-wrap items-center gap-1\">\n <span className=\"w-16\" />\n {!state.perspectivePlane && (\n <select aria-label=\"Attach to plane\" className=\"h-7 w-24 rounded border border-border bg-background px-1 text-xs\" value={attachTo || planes[0]} onChange={(e) => setAttachTo(e.target.value as VectorPerspectivePlane)}>\n {planes.map((p) => (\n <option key={p} value={p}>\n {PLANE_LABELS[p]}\n </option>\n ))}\n </select>\n )}\n <button type=\"button\" className={buttonClass} disabled={!state.selection.length} title=\"Lay the selection onto the plane (read flat from the grid's origin)\" onClick={() => controller.attachToPerspective(target)}>\n Attach\n </button>\n <label className=\"flex items-center gap-1 text-xs text-foreground\" title=\"Show the grid on the canvas\">\n <input type=\"checkbox\" aria-label=\"Show perspective grid\" checked={grid.visible !== false} onChange={(e) => controller.setPerspective({ ...grid, visible: e.target.checked })} />\n Show\n </label>\n <button type=\"button\" className={buttonClass} title=\"Remove the grid (art on it stays)\" onClick={() => controller.setPerspective(null)}>\n Remove\n </button>\n </div>\n )}\n </div>\n );\n}\n","import React from 'react';\nimport { VECTOR_LENS_LABELS, VECTOR_LENS_SPECS, VECTOR_LENS_TYPES, type VectorEditorController, type VectorLensType, type VectorPathNode } from '@pixerate/editor/vector';\nimport { useVectorEditorState } from './useVectorEditor';\n\nconst selectClass = 'h-7 min-w-0 flex-1 rounded border border-border bg-background px-1 text-xs';\nconst numberClass = 'h-7 w-16 rounded border border-border bg-background px-1.5 text-xs';\n\nexport interface VectorLensPanelProps {\n controller: VectorEditorController;\n className?: string;\n}\n\n/**\n * Lens: for a selected closed path, what it does to what is below it (none, magnify, fish eye,\n * brighten, invert, tinted grayscale, colour add, colour limit, heat map, wireframe,\n * transparency), its amount and colour. Each change is one undo step.\n */\nexport function VectorLensPanel({ controller, className }: VectorLensPanelProps) {\n const state = useVectorEditorState(controller);\n const path = state.selection\n .map((id) => controller.getNode(id))\n .find((n): n is VectorPathNode => n?.type === 'path' && n.subpaths.some((sp) => sp.closed) && !n.connector);\n if (!path) return null;\n const lens = path.lens ?? null;\n const spec = lens ? VECTOR_LENS_SPECS[lens.type] : null;\n const ids = [path.id];\n return (\n <div className={`space-y-2 ${className ?? ''}`} data-vector-lens-panel=\"\" aria-label=\"Lens\">\n <div className=\"flex flex-wrap items-center gap-1\">\n <span className=\"w-16 text-[11px] font-medium uppercase tracking-wide text-muted-foreground\">Lens</span>\n <select\n aria-label=\"Lens type\"\n className={selectClass}\n value={lens?.type ?? ''}\n onChange={(e) => (e.target.value ? controller.setLens({ type: e.target.value as VectorLensType }, { ids }) : controller.setLens(null, { ids }))}\n >\n <option value=\"\">None</option>\n {VECTOR_LENS_TYPES.map((t) => (\n <option key={t} value={t}>\n {VECTOR_LENS_LABELS[t]}\n </option>\n ))}\n </select>\n </div>\n {lens && spec && (\n <div className=\"flex flex-wrap items-center gap-1\">\n <span className=\"w-16\" />\n <input\n type=\"number\"\n aria-label=\"Lens amount\"\n title={`Amount: ${spec.unit} (${spec.min} to ${spec.max})`}\n className={numberClass}\n min={spec.min}\n max={spec.max}\n step={lens.type === 'magnify' ? 0.1 : 1}\n value={lens.amount}\n onChange={(e) => {\n const v = parseFloat(e.target.value);\n if (Number.isFinite(v)) controller.setLens({ amount: Math.min(spec.max, Math.max(spec.min, v)) }, { ids, merge: `lens-amount-${path.id}` });\n }}\n />\n {spec.color !== null && (\n <input type=\"color\" aria-label=\"Lens colour\" title=\"Lens colour\" className=\"h-7 w-9 rounded border border-border bg-background\" value={lens.color ?? spec.color} onChange={(e) => controller.setLens({ color: e.target.value }, { ids, merge: `lens-color-${path.id}` })} />\n )}\n </div>\n )}\n </div>\n );\n}\n","import React from 'react';\nimport {\n VECTOR_GRADIENT_TYPES,\n VECTOR_GRADIENT_SPREADS,\n VECTOR_GRADIENT_INTERPOLATIONS,\n VECTOR_STROKE_GRADIENT_MODES,\n VECTOR_GRADIENT_TYPE_LABELS,\n VECTOR_GRADIENT_SPREAD_LABELS,\n VECTOR_GRADIENT_INTERPOLATION_LABELS,\n VECTOR_STROKE_GRADIENT_MODE_LABELS,\n getVectorGradientEditor,\n vectorPaintToHex,\n type VectorEditorController,\n type VectorGradientInterpolation,\n type VectorGradientSpread,\n type VectorGradientType,\n type VectorStrokeGradientMode,\n} from '@pixerate/editor/vector';\nimport { useVectorEditorState } from './useVectorEditor';\n\nexport interface VectorGradientEditorProps {\n controller: VectorEditorController;\n className?: string;\n}\n\nconst selectClass = 'h-7 min-w-0 flex-1 rounded border border-border bg-background px-1 text-xs';\nconst numberClass = 'h-7 w-14 rounded border border-border bg-background px-1.5 text-xs';\nconst buttonClass =\n 'inline-flex h-7 min-w-7 items-center justify-center rounded border border-border bg-background px-1.5 text-xs text-foreground hover:bg-muted disabled:cursor-not-allowed disabled:opacity-40 aria-pressed:bg-primary aria-pressed:text-primary-foreground';\nconst percent = (v: number) => Math.round(v * 1000) / 10;\n\n/**\n * Gradient editor for the selection's fill or stroke: style (or solid), the stop ramp (click it\n * to add a stop, pick a stop to edit its colour, opacity, position and midpoint), interpolation\n * space, smoothness, spread, how it lies on a stroke, and reverse.\n */\nexport function VectorGradientEditor({ controller, className }: VectorGradientEditorProps) {\n const state = useVectorEditorState(controller);\n const ed = getVectorGradientEditor(state);\n if (!ed) return null;\n const g = ed.gradient;\n const sel = ed.selected;\n const end = () => controller.endMergedEdit();\n const setType = (value: string) => {\n if (value === 'solid') {\n const first = ed.stops[0];\n controller.setStyle({ [ed.target]: vectorPaintToHex(first?.color) ?? first?.color ?? '#000000' }, undefined, { label: 'Solid Colour' });\n } else controller.setGradient({ type: value as VectorGradientType });\n };\n return (\n <div className={`space-y-1.5 ${className ?? ''}`} data-vector-gradient-editor={ed.target} aria-label=\"Gradient\">\n <div className=\"flex items-center gap-1.5\">\n <span className=\"w-16 text-xs text-foreground\">Gradient</span>\n {(['fill', 'stroke'] as const).map((t) => (\n <button key={t} type=\"button\" className={buttonClass} aria-pressed={ed.target === t} onClick={() => controller.setGradientTarget(t)}>\n {t === 'fill' ? 'Fill' : 'Stroke'}\n </button>\n ))}\n {ed.mixed && <span className=\"text-[11px] text-muted-foreground\">Mixed</span>}\n </div>\n <div className=\"flex items-center gap-1.5\">\n <span className=\"w-16 text-xs text-foreground\">Type</span>\n <select aria-label=\"Gradient type\" className={selectClass} value={ed.type ?? 'solid'} onChange={(e) => setType(e.target.value)}>\n <option value=\"solid\">Solid</option>\n {VECTOR_GRADIENT_TYPES.map((t) => (\n <option key={t} value={t}>\n {VECTOR_GRADIENT_TYPE_LABELS[t]}\n </option>\n ))}\n </select>\n <button type=\"button\" className={buttonClass} aria-label=\"Reverse gradient\" title=\"Reverse gradient\" disabled={!g} onClick={() => controller.reverseGradient()}>\n ⇄\n </button>\n </div>\n {g && (\n <>\n <div className=\"relative h-8\" data-vector-gradient-ramp=\"\">\n <div\n role=\"button\"\n tabIndex={-1}\n aria-label=\"Add gradient stop\"\n className=\"absolute inset-x-1.5 top-0 h-4 cursor-copy rounded border border-border\"\n style={{ backgroundImage: `${ed.preview}, repeating-conic-gradient(#ddd 0% 25%, #fff 0% 50%)`, backgroundSize: 'auto, 8px 8px' }}\n onClick={(e) => {\n const r = e.currentTarget.getBoundingClientRect();\n controller.addGradientStop(r.width > 0 ? Math.min(1, Math.max(0, (e.clientX - r.left) / r.width)) : 0.5);\n }}\n />\n {ed.stops.map((s) => (\n <button\n key={s.index}\n type=\"button\"\n data-vector-gradient-stop={s.index}\n aria-label={`Gradient stop ${s.index + 1} at ${percent(s.offset)}%`}\n aria-pressed={s.selected}\n className=\"absolute top-4 h-3.5 w-3 -translate-x-1/2 rounded-sm border border-border aria-pressed:ring-2 aria-pressed:ring-primary\"\n style={{ left: `calc(6px + (100% - 12px) * ${s.offset})`, background: s.color, opacity: 0.4 + 0.6 * (s.opacity ?? 1) }}\n onClick={() => controller.selectGradientStop(s.selected ? null : s.index)}\n />\n ))}\n </div>\n {sel && (\n <div className=\"flex flex-wrap items-center gap-1.5\" data-vector-gradient-selected-stop={sel.index}>\n <input\n type=\"color\"\n aria-label=\"Stop colour\"\n className=\"h-7 w-9 cursor-pointer rounded border border-border bg-background\"\n value={vectorPaintToHex(sel.color) ?? '#000000'}\n onChange={(e) => controller.setGradientStop(sel.index, { color: e.target.value }, { merge: `gradient-stop-color-${sel.index}` })}\n onBlur={end}\n />\n <label className=\"flex items-center gap-1 text-[11px] text-muted-foreground\">\n Opacity\n <input\n type=\"number\"\n min={0}\n max={100}\n step={5}\n aria-label=\"Stop opacity\"\n className={numberClass}\n value={percent(sel.opacity ?? 1)}\n onChange={(e) => {\n const n = parseFloat(e.target.value);\n if (Number.isFinite(n)) controller.setGradientStop(sel.index, { opacity: n / 100 });\n }}\n />\n </label>\n <label className=\"flex items-center gap-1 text-[11px] text-muted-foreground\">\n At\n <input\n type=\"number\"\n min={0}\n max={100}\n step={1}\n aria-label=\"Stop position\"\n className={numberClass}\n value={percent(sel.offset)}\n onChange={(e) => {\n const n = parseFloat(e.target.value);\n if (Number.isFinite(n)) controller.setGradientStop(sel.index, { offset: n / 100 });\n }}\n />\n </label>\n {!sel.last && (\n <label className=\"flex items-center gap-1 text-[11px] text-muted-foreground\">\n Midpoint\n <input\n type=\"number\"\n min={5}\n max={95}\n step={1}\n aria-label=\"Stop midpoint\"\n className={numberClass}\n value={percent(sel.midpoint ?? 0.5)}\n onChange={(e) => {\n const n = parseFloat(e.target.value);\n if (Number.isFinite(n)) controller.setGradientStop(sel.index, { midpoint: n / 100 });\n }}\n />\n </label>\n )}\n <button type=\"button\" className={buttonClass} aria-label=\"Delete stop\" title=\"Delete stop\" disabled={ed.stops.length <= 2} onClick={() => controller.removeGradientStop(sel.index)}>\n ✕\n </button>\n </div>\n )}\n <label className=\"flex items-center gap-1.5 text-xs text-foreground\">\n <span className=\"w-16\">Colours</span>\n <select aria-label=\"Gradient interpolation\" className={selectClass} value={ed.interpolation} onChange={(e) => controller.setGradient({ interpolation: e.target.value as VectorGradientInterpolation })}>\n {VECTOR_GRADIENT_INTERPOLATIONS.map((i) => (\n <option key={i} value={i}>\n {VECTOR_GRADIENT_INTERPOLATION_LABELS[i]}\n </option>\n ))}\n </select>\n </label>\n <label className=\"flex items-center gap-1.5 text-xs text-foreground\">\n <span className=\"w-16\">Smooth</span>\n <input\n type=\"range\"\n min={0}\n max={1}\n step={0.05}\n aria-label=\"Gradient smoothness\"\n className=\"h-4 flex-1 accent-primary\"\n value={ed.smoothness}\n onChange={(e) => controller.setGradient({ smoothness: parseFloat(e.target.value) }, { merge: 'gradient-smoothness' })}\n onPointerUp={end}\n onBlur={end}\n />\n </label>\n <label className=\"flex items-center gap-1.5 text-xs text-foreground\">\n <span className=\"w-16\">Spread</span>\n <select aria-label=\"Gradient spread\" className={selectClass} value={ed.spread} onChange={(e) => controller.setGradient({ spread: e.target.value as VectorGradientSpread })}>\n {VECTOR_GRADIENT_SPREADS.map((sp) => (\n <option key={sp} value={sp}>\n {VECTOR_GRADIENT_SPREAD_LABELS[sp]}\n </option>\n ))}\n </select>\n </label>\n {ed.target === 'stroke' && (\n <label className=\"flex items-center gap-1.5 text-xs text-foreground\">\n <span className=\"w-16\">On stroke</span>\n <select aria-label=\"Gradient on stroke\" className={selectClass} value={ed.strokeMode} onChange={(e) => controller.setGradient({ strokeMode: e.target.value as VectorStrokeGradientMode })}>\n {VECTOR_STROKE_GRADIENT_MODES.map((m) => (\n <option key={m} value={m}>\n {VECTOR_STROKE_GRADIENT_MODE_LABELS[m]}\n </option>\n ))}\n </select>\n </label>\n )}\n </>\n )}\n </div>\n );\n}\n","import React, { useState, useSyncExternalStore } from 'react';\nimport type { VectorEditorController, VectorGroupNode } from '@pixerate/editor/vector';\nimport { EffectParameters, EffectsBrowser, useEffectDescription } from '../effects';\nimport { useVectorEditorState } from './useVectorEditor';\n\nexport interface VectorProviderEffectsPanelProps {\n controller: VectorEditorController;\n className?: string;\n}\n\nconst btn = 'rounded border border-border px-1.5 py-0.5 text-[11px] disabled:opacity-40';\n\nfunction Controls({ controller, group }: { controller: VectorEditorController; group: VectorGroupNode }) {\n const provider = controller.effectsProvider;\n const tag = group.providerEffect!;\n const { description, error } = useEffectDescription(provider, tag.effect);\n const [message, setMessage] = useState<string | null>(null);\n const run = (work: Promise<unknown>) => void work.then(() => setMessage(null), (e: unknown) => setMessage(e instanceof Error ? e.message : String(e)));\n if (!provider) return <p className=\"text-[11px] text-muted-foreground\">No effects provider: the shapes are kept as they are.</p>;\n if (error) return <p className=\"text-[11px] text-amber-500\">{error}</p>;\n if (!description) return <p className=\"text-[11px] text-muted-foreground\">Loading…</p>;\n return (\n <>\n <EffectParameters\n description={description}\n values={tag.values}\n onChange={(k, v) => run(controller.updateVectorEffect(group.id, { [k]: v as never }))}\n onReset={(k) => run(controller.updateVectorEffect(group.id, { [k]: null }))}\n onPreset={(v) => run(controller.updateVectorEffect(group.id, v as never))}\n />\n {message && <p role=\"alert\" className=\"text-[11px] text-destructive\">{message}</p>}\n </>\n );\n}\n\n/**\n * Provider vector effects in a drawing: add one (its picture at rest becomes a selected group of\n * editable shapes), draw it again with new values, or detach it to keep the shapes. Motion is\n * applied in the animation editor.\n */\nexport function VectorProviderEffectsPanel({ controller, className = '' }: VectorProviderEffectsPanelProps) {\n const state = useVectorEditorState(controller);\n const provider = useSyncExternalStore(\n (cb) => controller.effects.subscribe(cb),\n () => controller.effects.provider,\n () => controller.effects.provider,\n );\n const [browse, setBrowse] = useState(false);\n const [message, setMessage] = useState<string | null>(null);\n void state;\n const groups = controller.vectorEffectGroups();\n const selected = groups.filter((g) => state.selection.includes(g.id));\n const run = (work: () => unknown) => {\n setMessage(null);\n Promise.resolve().then(work).catch((e: unknown) => setMessage(e instanceof Error ? e.message : String(e)));\n };\n return (\n <section className={`flex flex-col gap-2 text-xs ${className}`} aria-label=\"Vector effects\" data-vector-provider-effects=\"\">\n <div className=\"flex items-center gap-1\">\n <span className=\"flex-1 font-semibold\">Effects</span>\n <button type=\"button\" className={btn} disabled={!provider} aria-pressed={browse} onClick={() => setBrowse(!browse)}>\n Add effect…\n </button>\n </div>\n {!provider && <p className=\"text-[11px] text-muted-foreground\">No effects provider is registered. Effect groups are kept as shapes.</p>}\n {browse && <EffectsBrowser provider={provider} kinds={['vector']} title=\"Vector effects\" onPick={(e) => (setBrowse(false), run(() => controller.addVectorEffect(e.id)))} />}\n {selected.map((g) => (\n <div key={g.id} className=\"space-y-1 rounded border border-border p-1\" data-vector-effect-group={g.id}>\n <div className=\"flex items-center gap-1\">\n <span className=\"min-w-0 flex-1 truncate font-medium\">{g.providerEffect!.name ?? g.providerEffect!.effect}</span>\n <button type=\"button\" className={btn} title=\"Keep the shapes as a plain group\" onClick={() => run(() => controller.detachVectorEffect(g.id))}>\n Detach\n </button>\n </div>\n <Controls controller={controller} group={g} />\n </div>\n ))}\n {groups.length > 0 && !selected.length && <p className=\"text-[11px] text-muted-foreground\">Select an effect group ({groups.length} in the drawing) to change it.</p>}\n {message && <p role=\"alert\" className=\"text-[11px] text-destructive\">{message}</p>}\n </section>\n );\n}\n","import React from 'react';\nimport type { VectorEditorController, VectorTool } from '@pixerate/editor/vector';\nimport { VectorCanvas, type VectorCanvasProps } from './VectorCanvas';\nimport { VectorStylePanel, VectorToolbar } from './VectorToolbar';\nimport type { EffectProvider } from '@pixerate/editor/effects';\nimport { useEffects } from '../effects';\nimport { VectorProviderEffectsPanel } from './VectorProviderEffectsPanel';\n\nexport interface VectorEditorProps {\n controller: VectorEditorController;\n /** Tools in the toolbar (default: all). */\n tools?: readonly VectorTool[];\n /** The style sidebar (default `true`). */\n showStylePanel?: boolean;\n /** Canvas height (default 520px). */\n height?: number | string;\n canvasProps?: Omit<VectorCanvasProps, 'controller'>;\n /**\n * An effects provider (see `@pixerate/editor/effects`), registered with the controller while\n * mounted: provider vector effects as groups, with an Effects section under the style panel.\n * Optional: without one the editor is as before.\n */\n effects?: EffectProvider | null;\n className?: string;\n}\n\n/** Toolbar, canvas and style panel for a `VectorEditorController`. */\nexport function VectorEditor({ controller, tools, showStylePanel = true, height = 520, canvasProps, effects, className }: VectorEditorProps) {\n useEffects(controller, effects);\n const effectsShown = !!effects || controller.vectorEffectGroups().length > 0;\n return (\n <div className={`flex flex-col gap-2 ${className ?? ''}`} data-vector-editor=\"\">\n <VectorToolbar controller={controller} tools={tools} />\n <div className=\"flex min-h-0 flex-col gap-2 md:flex-row\">\n <div className=\"relative min-h-[320px] flex-1 overflow-hidden rounded-md border border-border bg-muted/40\" style={{ height }}>\n <VectorCanvas controller={controller} {...canvasProps} />\n </div>\n {showStylePanel && (\n <div className=\"flex w-full shrink-0 flex-col gap-2 md:w-56\">\n <VectorStylePanel controller={controller} className=\"rounded-md border border-border p-3\" />\n {effectsShown && <VectorProviderEffectsPanel controller={controller} className=\"rounded-md border border-border p-3\" />}\n </div>\n )}\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":["React","useEffect","useRef","useState","THEME","useRef","num","jsx","jsxs","THEME","React","VectorSceneNode","useRef","useState","useEffect","text","size","React","VECTOR_STROKE_ALIGN_LABELS","vectorPaintToHex","jsx","jsxs","jsx","jsxs","buttonClass","numberClass","selectClass","labelClass","React","jsx","jsxs","buttonClass","numberClass","selectClass","labelClass","React","jsx","jsxs","buttonClass","selectClass","useId","jsx","jsxs","buttonClass","labelClass","useId","useId","useState","vectorPaintToHex","jsx","jsxs","buttonClass","selectClass","labelClass","useId","useState","vectorPaintToHex","useState","jsx","jsxs","buttonClass","inputClass","labelClass","useState","vectorPaintToHex","jsx","jsxs","buttonClass","selectClass","numberClass","vectorPaintToHex","jsx","jsxs","buttonClass","selectClass","Fragment","jsx","jsxs","buttonClass","selectClass","numberClass","useState","vectorPaintToHex","Fragment","jsx","jsxs","buttonClass","numberClass","useState","vectorPaintToHex","useRef","useState","jsx","jsxs","buttonClass","selectClass","numberClass","Fragment","jsx","jsxs","buttonClass","selectClass","numberClass","React","jsx","jsxs","buttonClass","selectClass","React","jsx","jsxs","selectClass","numberClass","vectorPaintToHex","Fragment","jsx","jsxs","selectClass","numberClass","buttonClass","vectorPaintToHex","Fragment","jsx","jsxs","buttonClass","React","selectClass","numberClass","vectorPaintToHex","VECTOR_STROKE_ALIGN_LABELS","useState","useSyncExternalStore","Fragment","jsx","jsxs","useState","useSyncExternalStore","jsx","jsxs"]}