@pixerate/editor-react 0.33.0 → 0.35.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/dist/chart/index.cjs +562 -0
- package/dist/chart/index.cjs.map +1 -0
- package/dist/chart/index.d.cts +118 -0
- package/dist/chart/index.d.ts +118 -0
- package/dist/chart/index.js +544 -0
- package/dist/chart/index.js.map +1 -0
- package/dist/vector/index.cjs +298 -155
- package/dist/vector/index.cjs.map +1 -1
- package/dist/vector/index.d.cts +17 -3
- package/dist/vector/index.d.ts +17 -3
- package/dist/vector/index.js +281 -139
- package/dist/vector/index.js.map +1 -1
- package/package.json +11 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/vector/index.ts","../../src/vector/useVectorEditor.ts","../../src/vector/VectorCanvas.tsx","../../src/vector/VectorWidthPointEditor.tsx","../../src/vector/VectorToolbar.tsx","../../src/vector/VectorEffectsPanel.tsx","../../src/vector/VectorGradientEditor.tsx","../../src/vector/VectorEditor.tsx"],"sourcesContent":["export * from './useVectorEditor';\nexport * from './VectorCanvas';\nexport * from './VectorWidthPointEditor';\nexport * from './VectorToolbar';\nexport * from './VectorEffectsPanel';\nexport * from './VectorEditor';\nexport * from './VectorGradientEditor';\n","import { useEffect, useMemo, useRef, useSyncExternalStore } from 'react';\nimport {\n VectorEditorController,\n createVectorCommands,\n type VectorCommandOptions,\n type VectorEditorOptions,\n type VectorEditorState,\n type VectorTool,\n} from '@pixerate/editor/vector';\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","import React, { useEffect, useId, useRef } from 'react';\nimport {\n VECTOR_OVERLAY_THEME as THEME,\n getVectorOverlayRenderData,\n getVectorSceneRenderData,\n isVectorTextTarget,\n toVectorKeyInput,\n toVectorPointerInput,\n vectorDiamondPath,\n type VectorEditorController,\n type VectorRenderNode,\n type VectorRenderPath,\n type SvgGradientDef,\n type VectorPaintDef,\n type VectorRenderGradientAnnotator,\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/** Renders scene nodes (paths and groups) from `getVectorSceneRenderData`. */\nexport function VectorSceneNodes({ nodes }: { nodes: readonly VectorRenderNode[] }) {\n return (\n <>\n {nodes.map((node) =>\n node.kind === 'group' ? (\n <g key={node.id} data-vector-id={node.id} transform={node.transform} opacity={node.opacity < 1 ? node.opacity : undefined}>\n <VectorSceneNodes nodes={node.children} />\n </g>\n ) : node.strokeParts ? (\n <VectorPartedPath key={node.id} node={node} />\n ) : (\n <path\n key={node.id}\n data-vector-id={node.id}\n transform={node.transform}\n d={node.d}\n fill={node.fill}\n fillRule={node.fillRule}\n stroke={node.stroke}\n strokeWidth={node.stroke === 'none' ? undefined : node.strokeWidth}\n strokeLinecap={node.strokeLinecap as any}\n strokeLinejoin={node.strokeLinejoin as any}\n strokeDasharray={node.strokeDasharray}\n opacity={node.opacity < 1 ? node.opacity : undefined}\n />\n ),\n )}\n </>\n );\n}\n\n/** A path whose stroke is aligned inside / outside (double width, clipped or masked by the shape) or has arrowheads. */\nfunction VectorPartedPath({ node }: { node: VectorRenderPath }) {\n const sp = node.strokeParts!;\n const clip = sp.clip;\n const b = clip?.bounds;\n return (\n <g data-vector-id={node.id} data-vector-stroke-align={sp.align} transform={node.transform} opacity={node.opacity < 1 ? node.opacity : undefined}>\n {clip && b && (\n <defs>\n {clip.kind === 'clip' ? (\n <clipPath id={clip.id}>\n <path d={node.d} clipRule={node.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={node.d} fill=\"#000\" fillRule={node.fillRule} />\n </mask>\n )}\n </defs>\n )}\n <path data-vector-part=\"fill\" d={node.d} fill={node.fill} fillRule={node.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={node.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={node.stroke}\n strokeWidth={sp.width}\n strokeLinecap={node.strokeLinecap as any}\n strokeLinejoin={node.strokeLinejoin as any}\n strokeDasharray={node.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={node.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 fitted = useRef(!fitOnMount);\n const uid = useId().replace(/:/g, '');\n const scene = getVectorSceneRenderData(state, { idPrefix: `ve${uid}-` });\n const overlay = getVectorOverlayRenderData(state);\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 // 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 <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 <g data-vector-scene=\"\" transform={scene.transform}>\n <VectorSceneNodes nodes={scene.nodes} />\n </g>\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=\"\" 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.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.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.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 {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 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} from '@pixerate/editor/vector';\nimport { useVectorEditorState } from './useVectorEditor';\nimport { VectorEffectsPanel } from './VectorEffectsPanel';\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 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 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 // 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 </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 {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 </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 and path effects (`VectorEffectsPanel`) 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 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 && (\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 {style && <VectorEffectsPanel controller={controller} />}\n </div>\n );\n}\n","import React from 'react';\nimport {\n VECTOR_EFFECT_MENU,\n getVectorEffectsPanel,\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 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_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 from 'react';\nimport type { VectorEditorController, VectorTool } from '@pixerate/editor/vector';\nimport { VectorCanvas, type VectorCanvasProps } from './VectorCanvas';\nimport { VectorStylePanel, VectorToolbar } from './VectorToolbar';\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 className?: string;\n}\n\n/** Toolbar, canvas and style panel for a `VectorEditorController`. */\nexport function VectorEditor({ controller, tools, showStylePanel = true, height = 520, canvasProps, className }: VectorEditorProps) {\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 && <VectorStylePanel controller={controller} className=\"w-full shrink-0 rounded-md border border-border p-3 md:w-56\" />}\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":["import_react","import_vector","import_react","import_vector","THEME","import_jsx_runtime","THEME","text","import_react","import_vector","import_vector","import_jsx_runtime","import_vector","import_jsx_runtime","selectClass","numberClass","buttonClass","import_jsx_runtime","buttonClass","React","selectClass","numberClass","import_jsx_runtime"]}
|
|
1
|
+
{"version":3,"sources":["../../src/vector/index.ts","../../src/vector/useVectorEditor.ts","../../src/vector/VectorCanvas.tsx","../../src/vector/VectorWidthPointEditor.tsx","../../src/vector/VectorToolbar.tsx","../../src/vector/VectorEffectsPanel.tsx","../../src/vector/VectorEnvelopePanel.tsx","../../src/vector/VectorGradientEditor.tsx","../../src/vector/VectorEditor.tsx"],"sourcesContent":["export * from './useVectorEditor';\nexport * from './VectorCanvas';\nexport * from './VectorWidthPointEditor';\nexport * from './VectorToolbar';\nexport * from './VectorEffectsPanel';\nexport * from './VectorEnvelopePanel';\nexport * from './VectorEditor';\nexport * from './VectorGradientEditor';\n","import { useEffect, useMemo, useRef, useSyncExternalStore } from 'react';\nimport {\n VectorEditorController,\n createVectorCommands,\n type VectorCommandOptions,\n type VectorEditorOptions,\n type VectorEditorState,\n type VectorTool,\n} from '@pixerate/editor/vector';\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","import React, { useEffect, useId, useRef } from 'react';\nimport {\n VECTOR_OVERLAY_THEME as THEME,\n getVectorOverlayRenderData,\n getVectorSceneRenderData,\n isVectorTextTarget,\n toVectorKeyInput,\n toVectorPointerInput,\n vectorDiamondPath,\n type VectorEditorController,\n type VectorRenderNode,\n type VectorRenderPath,\n type SvgGradientDef,\n type VectorPaintDef,\n type VectorRenderGradientAnnotator,\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/** Renders scene nodes (paths and groups) from `getVectorSceneRenderData`. */\nexport function VectorSceneNodes({ nodes }: { nodes: readonly VectorRenderNode[] }) {\n return (\n <>\n {nodes.map((node) =>\n node.kind === 'group' ? (\n <g key={node.id} data-vector-id={node.id} transform={node.transform} opacity={node.opacity < 1 ? node.opacity : undefined}>\n <VectorSceneNodes nodes={node.children} />\n </g>\n ) : node.strokeParts ? (\n <VectorPartedPath key={node.id} node={node} />\n ) : (\n <path\n key={node.id}\n data-vector-id={node.id}\n transform={node.transform}\n d={node.d}\n fill={node.fill}\n fillRule={node.fillRule}\n stroke={node.stroke}\n strokeWidth={node.stroke === 'none' ? undefined : node.strokeWidth}\n strokeLinecap={node.strokeLinecap as any}\n strokeLinejoin={node.strokeLinejoin as any}\n strokeDasharray={node.strokeDasharray}\n opacity={node.opacity < 1 ? node.opacity : undefined}\n />\n ),\n )}\n </>\n );\n}\n\n/** A path whose stroke is aligned inside / outside (double width, clipped or masked by the shape) or has arrowheads. */\nfunction VectorPartedPath({ node }: { node: VectorRenderPath }) {\n const sp = node.strokeParts!;\n const clip = sp.clip;\n const b = clip?.bounds;\n return (\n <g data-vector-id={node.id} data-vector-stroke-align={sp.align} transform={node.transform} opacity={node.opacity < 1 ? node.opacity : undefined}>\n {clip && b && (\n <defs>\n {clip.kind === 'clip' ? (\n <clipPath id={clip.id}>\n <path d={node.d} clipRule={node.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={node.d} fill=\"#000\" fillRule={node.fillRule} />\n </mask>\n )}\n </defs>\n )}\n <path data-vector-part=\"fill\" d={node.d} fill={node.fill} fillRule={node.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={node.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={node.stroke}\n strokeWidth={sp.width}\n strokeLinecap={node.strokeLinecap as any}\n strokeLinejoin={node.strokeLinejoin as any}\n strokeDasharray={node.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={node.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 fitted = useRef(!fitOnMount);\n const uid = useId().replace(/:/g, '');\n const scene = getVectorSceneRenderData(state, { idPrefix: `ve${uid}-` });\n const overlay = getVectorOverlayRenderData(state);\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 // 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 <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 <g data-vector-scene=\"\" transform={scene.transform}>\n <VectorSceneNodes nodes={scene.nodes} />\n </g>\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.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.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 {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 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} from '@pixerate/editor/vector';\nimport { useVectorEditorState } from './useVectorEditor';\nimport { VectorEffectsPanel } from './VectorEffectsPanel';\nimport { VectorEnvelopePanel } from './VectorEnvelopePanel';\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 // 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 </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 </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 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 && (\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 {style && <VectorEffectsPanel controller={controller} />}\n {style && <VectorEnvelopePanel controller={controller} />}\n </div>\n );\n}\n","import React from 'react';\nimport {\n VECTOR_EFFECT_MENU,\n getVectorEffectsPanel,\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 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 { 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 {\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 from 'react';\nimport type { VectorEditorController, VectorTool } from '@pixerate/editor/vector';\nimport { VectorCanvas, type VectorCanvasProps } from './VectorCanvas';\nimport { VectorStylePanel, VectorToolbar } from './VectorToolbar';\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 className?: string;\n}\n\n/** Toolbar, canvas and style panel for a `VectorEditorController`. */\nexport function VectorEditor({ controller, tools, showStylePanel = true, height = 520, canvasProps, className }: VectorEditorProps) {\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 && <VectorStylePanel controller={controller} className=\"w-full shrink-0 rounded-md border border-border p-3 md:w-56\" />}\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,mBAAiE;AACjE,oBAOO;AAGA,SAAS,0BAA0B,UAA+B,CAAC,GAA2B;AACnG,QAAM,UAAM,qBAAsC,IAAI;AACtD,MAAI,CAAC,IAAI,QAAS,KAAI,UAAU,IAAI,qCAAuB,OAAO;AAClE,QAAM,aAAa,IAAI;AACvB,8BAAU,MAAM,MAAM,WAAW,QAAQ,GAAG,CAAC,UAAU,CAAC;AACxD,SAAO;AACT;AAGO,SAAS,qBAAqB,YAAuD;AAC1F,aAAO,mCAAqB,WAAW,WAAW,WAAW,UAAU,WAAW,QAAQ;AAC5F;AAgBO,SAAS,gBAAgB,sBAAoE,CAAC,GAA0B;AAC7H,QAAM,UAAM,qBAAsC,IAAI;AACtD,MAAI;AACJ,MAAI,+BAA+B,qCAAwB,cAAa;AAAA,OACnE;AACH,QAAI,CAAC,IAAI,QAAS,KAAI,UAAU,IAAI,qCAAuB,mBAAmB;AAC9E,iBAAa,IAAI;AAAA,EACnB;AACA,QAAM,QAAQ,qBAAqB,UAAU;AAC7C,QAAM,cAAU;AAAA,IACd,OAAO;AAAA,MACL,SAAS,CAAC,SAAqB,WAAW,QAAQ,IAAI;AAAA,MACtD,MAAM,MAAM,KAAK,WAAW,KAAK;AAAA,MACjC,MAAM,MAAM,KAAK,WAAW,KAAK;AAAA,MACjC,iBAAiB,MAAM,KAAK,WAAW,gBAAgB;AAAA,MACvD,OAAO,MAAM,WAAW,MAAM;AAAA,IAChC;AAAA,IACA,CAAC,UAAU;AAAA,EACb;AACA,SAAO,EAAE,YAAY,OAAO,GAAG,QAAQ;AACzC;AAWO,SAAS,kBACd,UACA,YACA,UAAgC,CAAC,GAC3B;AACN,QAAM,EAAE,QAAQ,OAAO,MAAM,IAAI;AACjC,8BAAU,MAAM;AACd,QAAI,CAAC,SAAU;AACf,WAAO,SAAS,aAAS,oCAAqB,YAAY,EAAE,QAAQ,OAAO,MAAM,CAAC,CAAC;AAAA,EACrF,GAAG,CAAC,UAAU,YAAY,QAAQ,OAAO,KAAK,CAAC;AACjD;;;AC/EA,IAAAA,gBAAgD;AAChD,IAAAC,iBAcO;;;ACfP,IAAAC,gBAAwC;AACxC,IAAAC,iBAAsG;AA+EhG;AAnEN,IAAM,QAAQ,CAAC,GAAW,WAAmB,OAAO,KAAK,MAAM,IAAI,MAAM,MAAM,IAAI,MAAM,MAAM;AAE/F,IAAM,aAAkC,EAAE,SAAS,QAAQ,YAAY,UAAU,gBAAgB,iBAAiB,KAAK,EAAE;AACzH,IAAM,aAAkC,EAAE,OAAO,IAAI,MAAM,WAAW,SAAS,UAAU;AAQlF,SAAS,uBAAuB,EAAE,YAAY,MAAM,cAAc,eAAAC,qBAAM,QAAQ,WAAW,MAAM,GAAgC;AACtI,QAAM,CAAC,UAAU,WAAW,QAAI,wBAAS,MAAM,MAAM,KAAK,IAAI,KAAK,CAAC,CAAC;AACrE,QAAM,CAAC,MAAM,OAAO,QAAI,wBAAS,MAAM,MAAM,KAAK,MAAM,CAAC,CAAC;AAC1D,QAAM,CAAC,OAAO,QAAQ,QAAI,wBAAS,MAAM,MAAM,KAAK,OAAO,CAAC,CAAC;AAC7D,QAAM,cAAU,sBAA+B,IAAI;AAEnD,QAAM,UAAU,MAAO,QAAQ,SAAS,QAAQ,KAAK,GAA4B,QAAQ,EAAE,eAAe,KAAK,CAAC;AAChH,QAAM,QAAQ,MAAM;AAClB,YAAQ;AACR,eAAW,oBAAoB;AAAA,EACjC;AACA,QAAM,MAAM,CAAC,MAAe,EAAE,KAAK,MAAM,MAAM,OAAO,SAAS,OAAO,CAAC,CAAC,IAAI,OAAO,CAAC,IAAI;AACxF,QAAM,QAAQ,MAAM;AAClB,UAAM,IAAI,IAAI,QAAQ;AACtB,YAAQ;AACR,eAAW,qBAAqB,EAAE,GAAG,MAAM,SAAY,SAAY,KAAK,IAAI,KAAK,IAAI,GAAG,CAAC,GAAG,GAAG,IAAI,KAAK,MAAM,IAAI,IAAI,GAAG,OAAO,IAAI,KAAK,EAAE,CAAC;AAAA,EAC9I;AACA,QAAM,OAAO,CAAC,MAA4B,EAAE,gBAAgB;AAC5D,SACE;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,kCAA+B;AAAA,MAC/B,cAAW;AAAA,MACX;AAAA,MACA,OAAO;AAAA,QACL,SAAS;AAAA,QACT,KAAK;AAAA,QACL,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,QAAQ;AAAA,QACR,cAAc;AAAA,QACd,WAAW;AAAA,QACX,MAAM;AAAA,QACN,OAAO;AAAA,QACP,GAAG;AAAA,MACL;AAAA,MAEA,eAAe;AAAA,MACf,eAAe;AAAA,MACf,aAAa;AAAA,MACb,eAAe;AAAA,MACf,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,SAAS;AAAA,MACT,WAAW,CAAC,MAAM;AAChB,UAAE,gBAAgB;AAClB,YAAI,EAAE,QAAQ,UAAU;AACtB,YAAE,eAAe;AACjB,gBAAM;AAAA,QACR;AAAA,MACF;AAAA,MACA,UAAU,CAAC,MAAM;AACf,UAAE,eAAe;AACjB,cAAM;AAAA,MACR;AAAA,MAEA;AAAA,qDAAC,WAAM,OAAO,YAAY;AAAA;AAAA,UAExB,4CAAC,WAAM,cAAW,wBAAuB,MAAK,UAAS,KAAK,GAAG,KAAK,KAAK,MAAK,OAAM,OAAO,UAAU,UAAU,CAAC,MAAM,YAAY,EAAE,OAAO,KAAK,GAAG,OAAO,YAAY,WAAS,MAAC;AAAA,WAClL;AAAA,QACA,6CAAC,WAAM,OAAO,YAAY;AAAA;AAAA,UAExB,4CAAC,WAAM,cAAW,yBAAwB,MAAK,UAAS,KAAK,GAAG,MAAK,OAAM,OAAO,MAAM,UAAU,CAAC,MAAM,QAAQ,EAAE,OAAO,KAAK,GAAG,OAAO,YAAY;AAAA,WACvJ;AAAA,QACA,6CAAC,WAAM,OAAO,YAAY;AAAA;AAAA,UAExB,4CAAC,WAAM,cAAW,0BAAyB,MAAK,UAAS,KAAK,GAAG,MAAK,OAAM,OAAO,OAAO,UAAU,CAAC,MAAM,SAAS,EAAE,OAAO,KAAK,GAAG,OAAO,YAAY;AAAA,WAC1J;AAAA,QACA,6CAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,gBAAgB,YAAY,KAAK,GAAG,WAAW,EAAE,GAC9E;AAAA,sDAAC,YAAO,MAAK,UAAS,SAAS,OAAO,oBAEtC;AAAA,UACA,4CAAC,YAAO,MAAK,UAAS,OAAO,EAAE,YAAY,aAAa,OAAO,WAAW,QAAQ,QAAQ,cAAc,GAAG,SAAS,UAAU,GAC3H,eAAK,UAAU,OAAO,QAAQ,SACjC;AAAA,WACF;AAAA;AAAA;AAAA,EACF;AAEJ;;;ADlEwC,IAAAC,sBAAA;AADxC,SAAS,gBAAgB,EAAE,IAAI,GAA4B;AACzD,QAAM,QAAQ,IAAI,MAAM,IAAI,CAAC,GAAG,MAAM,6CAAC,UAAa,QAAQ,EAAE,QAAQ,WAAW,EAAE,WAAW,aAAa,EAAE,eAA5D,CAAyE,CAAE;AAC5H,SAAO,IAAI,SAAS,WAClB,6CAAC,oBAAe,IAAI,IAAI,IAAK,GAAI,IAAI,OAClC,iBACH,IAEA,6CAAC,oBAAe,IAAI,IAAI,IAAK,GAAI,IAAI,OAClC,iBACH;AAEJ;AAMO,SAAS,mBAAmB,EAAE,KAAK,GAAwC;AAChF,MAAI,CAAC,KAAK,OAAQ,QAAO;AACzB,SACE,6CAAC,UACE,eAAK;AAAA,IAAI,CAAC,QACT,IAAI,SAAS,YACX,8CAAC,aAAqB,IAAI,IAAI,IAAK,GAAI,IAAI,OACxC;AAAA,UAAI,UAAU,IAAI,CAAC,MAClB,6CAAC,mBAA2B,KAAK,KAAX,EAAE,EAAY,CACrC;AAAA,MACA,IAAI,MAAM,IAAI,CAAC,GAAG,MACjB,6CAAC,UAAa,GAAG,EAAE,GAAG,MAAM,EAAE,QAAnB,CAAyB,CACrC;AAAA,SANW,IAAI,EAOlB,IAEA,6CAAC,mBAA6B,OAAR,IAAI,EAAc;AAAA,EAE5C,GACF;AAEJ;AAGO,SAAS,wBAAwB,EAAE,WAAW,GAAG,cAAc,eAAAC,qBAAM,OAAO,GAAuE;AACxJ,QAAM,IAAI,eAAAA,qBAAM,eAAe;AAC/B,QAAM,OAAO,CAAC,GAA+C,MAAc,OAAO,MAChF,6CAAC,YAAO,+BAA6B,MAAM,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,GAAG,QAAQ,EAAE,UAAU,IAAI,IAAI,MAAM,eAAAA,qBAAM,YAAY,QAAQ,aAAa,aAAa,EAAE,UAAU,IAAI,GAAG;AAE3K,SACE,8CAAC,OAAE,kCAAgC,EAAE,MAClC;AAAA,MAAE,UAAU,6CAAC,UAAK,+BAA4B,IAAG,GAAG,EAAE,QAAQ,MAAK,QAAO,QAAQ,aAAa,iBAAgB,OAAM;AAAA,IACtH,6CAAC,UAAK,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG,QAAO,WAAU,aAAa,GAAG;AAAA,IAC/F,6CAAC,UAAK,4BAAyB,IAAG,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG,QAAQ,aAAa;AAAA,IAC9G,EAAE,UAAU,6CAAC,UAAK,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,OAAO,GAAG,IAAI,EAAE,OAAO,GAAG,QAAQ,aAAa,iBAAgB,OAAM;AAAA,IAC3H,KAAK,EAAE,OAAO,OAAO;AAAA,IACtB;AAAA,MAAC;AAAA;AAAA,QACC,+BAA6B,EAAE,IAAI;AAAA,QACnC,GAAG,EAAE,IAAI,IAAI;AAAA,QACb,GAAG,EAAE,IAAI,IAAI;AAAA,QACb,OAAO,IAAI;AAAA,QACX,QAAQ,IAAI;AAAA,QACZ,MAAM,eAAAA,qBAAM;AAAA,QACZ,QAAQ;AAAA,QACR,aAAa,EAAE,IAAI,UAAU,IAAI;AAAA;AAAA,IACnC;AAAA,IACC,EAAE,UAAU,KAAK,EAAE,QAAQ,UAAU,eAAAA,qBAAM,YAAY;AAAA,IACvD,EAAE,SACD,6CAAC,OAAE,+BAA4B,SAC7B,uDAAC,YAAO,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,MAAM,GAAG,GAAG,eAAAA,qBAAM,eAAe,KAAK,EAAE,MAAM,UAAU,IAAI,IAAI,MAAM,aAAa,QAAQ,eAAAA,qBAAM,YAAY,GAC5I;AAAA,IAED,EAAE,UAAU,IAAI,CAAC,MAChB,6CAAC,UAAmB,iCAA+B,EAAE,OAAO,OAAG,kCAAkB,EAAE,GAAG,EAAE,GAAG,KAAK,EAAE,UAAU,IAAI,EAAE,GAAG,MAAM,eAAAA,qBAAM,YAAY,QAAQ,eAA1I,EAAE,KAAqJ,CACnK;AAAA,IACA,EAAE,MAAM,IAAI,CAAC,MACZ,8CAAC,OAAgB,6BAA2B,EAAE,OAAO,iBAAe,EAAE,YAAY,QAAW,SAAS,EAAE,YAAY,EAAE,WAAW,OAAO,GACtI;AAAA,mDAAC,UAAK,IAAI,EAAE,MAAM,IAAI,EAAE,MAAM,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,QAAQ,aAAa;AAAA,MACrE,6CAAC,UAAK,GAAG,EAAE,IAAI,GAAG,GAAG,EAAE,IAAI,GAAG,OAAO,IAAI,QAAQ,IAAI,IAAI,GAAG,MAAM,EAAE,OAAO,aAAa,EAAE,SAAS,QAAQ,EAAE,WAAW,cAAc,WAAW,aAAa,EAAE,YAAY,EAAE,UAAU,IAAI,GAAG;AAAA,MAC/L,6CAAC,UAAK,GAAG,EAAE,IAAI,KAAK,GAAG,EAAE,IAAI,KAAK,OAAO,IAAI,QAAQ,IAAI,IAAI,GAAG,MAAK,QAAO,QAAQ,EAAE,WAAW,YAAY,aAAa;AAAA,SAHpH,EAAE,KAIV,CACD;AAAA,KACH;AAEJ;AAGO,SAAS,iBAAiB,EAAE,MAAM,GAA2C;AAClF,SACE,6EACG,gBAAM;AAAA,IAAI,CAAC,SACV,KAAK,SAAS,UACZ,6CAAC,OAAgB,kBAAgB,KAAK,IAAI,WAAW,KAAK,WAAW,SAAS,KAAK,UAAU,IAAI,KAAK,UAAU,QAC9G,uDAAC,oBAAiB,OAAO,KAAK,UAAU,KADlC,KAAK,EAEb,IACE,KAAK,cACP,6CAAC,oBAA+B,QAAT,KAAK,EAAgB,IAE5C;AAAA,MAAC;AAAA;AAAA,QAEC,kBAAgB,KAAK;AAAA,QACrB,WAAW,KAAK;AAAA,QAChB,GAAG,KAAK;AAAA,QACR,MAAM,KAAK;AAAA,QACX,UAAU,KAAK;AAAA,QACf,QAAQ,KAAK;AAAA,QACb,aAAa,KAAK,WAAW,SAAS,SAAY,KAAK;AAAA,QACvD,eAAe,KAAK;AAAA,QACpB,gBAAgB,KAAK;AAAA,QACrB,iBAAiB,KAAK;AAAA,QACtB,SAAS,KAAK,UAAU,IAAI,KAAK,UAAU;AAAA;AAAA,MAXtC,KAAK;AAAA,IAYZ;AAAA,EAEJ,GACF;AAEJ;AAGA,SAAS,iBAAiB,EAAE,KAAK,GAA+B;AAC9D,QAAM,KAAK,KAAK;AAChB,QAAM,OAAO,GAAG;AAChB,QAAM,IAAI,MAAM;AAChB,SACE,8CAAC,OAAE,kBAAgB,KAAK,IAAI,4BAA0B,GAAG,OAAO,WAAW,KAAK,WAAW,SAAS,KAAK,UAAU,IAAI,KAAK,UAAU,QACnI;AAAA,YAAQ,KACP,6CAAC,UACE,eAAK,SAAS,SACb,6CAAC,cAAS,IAAI,KAAK,IACjB,uDAAC,UAAK,GAAG,KAAK,GAAG,UAAU,KAAK,UAAU,GAC5C,IAEA,8CAAC,UAAK,IAAI,KAAK,IAAI,WAAU,kBAAiB,GAAG,EAAE,GAAG,GAAG,EAAE,GAAG,OAAO,EAAE,OAAO,QAAQ,EAAE,QACtF;AAAA,mDAAC,UAAK,GAAG,EAAE,GAAG,GAAG,EAAE,GAAG,OAAO,EAAE,OAAO,QAAQ,EAAE,QAAQ,MAAK,QAAO;AAAA,MACpE,6CAAC,UAAK,GAAG,KAAK,GAAG,MAAK,QAAO,UAAU,KAAK,UAAU;AAAA,OACxD,GAEJ;AAAA,IAEF,6CAAC,UAAK,oBAAiB,QAAO,GAAG,KAAK,GAAG,MAAM,KAAK,MAAM,UAAU,KAAK,UAAU,QAAO,QAAO;AAAA,IAChG,GAAG,YAAY;AAAA;AAAA,MAEd;AAAA,QAAC;AAAA;AAAA,UACC,oBAAiB;AAAA,UACjB,GAAG,GAAG;AAAA,UACN,MAAM,KAAK;AAAA,UACX,UAAU,MAAM,SAAS,SAAS,QAAQ,KAAK,EAAE,MAAM;AAAA,UACvD,MAAM,MAAM,SAAS,SAAS,QAAQ,KAAK,EAAE,MAAM;AAAA;AAAA,MACrD;AAAA,QAEA;AAAA,MAAC;AAAA;AAAA,QACC,oBAAiB;AAAA,QACjB,GAAG,GAAG;AAAA,QACN,MAAK;AAAA,QACL,QAAQ,KAAK;AAAA,QACb,aAAa,GAAG;AAAA,QAChB,eAAe,KAAK;AAAA,QACpB,gBAAgB,KAAK;AAAA,QACrB,iBAAiB,KAAK;AAAA,QACtB,UAAU,MAAM,SAAS,SAAS,QAAQ,KAAK,EAAE,MAAM;AAAA,QACvD,MAAM,MAAM,SAAS,SAAS,QAAQ,KAAK,EAAE,MAAM;AAAA;AAAA,IACrD;AAAA,IAED,GAAG,MAAM,IAAI,CAAC,MAAM,MACnB,6CAAC,UAAa,oBAAiB,QAAO,GAAG,MAAM,MAAM,KAAK,UAA/C,CAAuD,CACnE;AAAA,KACH;AAEJ;AAMO,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA,aAAa;AAAA,EACb,eAAe;AAAA,EACf,cAAc,eAAAA,qBAAM;AAAA,EACpB,aAAa,eAAAA,qBAAM;AAAA,EACnB;AAAA,EACA;AAAA,EACA,cAAc,YAAY;AAC5B,GAAsB;AACpB,QAAM,QAAQ,qBAAqB,UAAU;AAC7C,QAAM,aAAS,sBAA6B,IAAI;AAChD,QAAM,aAAS,sBAAO,CAAC,UAAU;AACjC,QAAM,UAAM,qBAAM,EAAE,QAAQ,MAAM,EAAE;AACpC,QAAM,YAAQ,yCAAyB,OAAO,EAAE,UAAU,KAAK,GAAG,IAAI,CAAC;AACvE,QAAM,cAAU,2CAA2B,KAAK;AAEhD,+BAAU,MAAM;AACd,UAAM,KAAK,OAAO;AAClB,QAAI,CAAC,MAAM,OAAO,QAAS;AAC3B,UAAM,MAAM,MAAM;AAChB,YAAM,OAAO,GAAG,sBAAsB;AACtC,UAAI,OAAO,WAAW,KAAK,SAAS,KAAK,KAAK,UAAU,EAAG;AAC3D,aAAO,UAAU;AACjB,iBAAW,UAAU,EAAE,OAAO,KAAK,OAAO,QAAQ,KAAK,OAAO,CAAC;AAAA,IACjE;AACA,QAAI;AACJ,QAAI,OAAO,WAAW,OAAO,mBAAmB,YAAa;AAC7D,UAAM,WAAW,IAAI,eAAe,GAAG;AACvC,aAAS,QAAQ,EAAE;AACnB,WAAO,MAAM,SAAS,WAAW;AAAA,EACnC,GAAG,CAAC,UAAU,CAAC;AAGf,+BAAU,MAAM;AACd,UAAM,KAAK,OAAO;AAClB,QAAI,CAAC,GAAI;AACT,UAAM,UAAU,CAAC,MAAkB;AACjC,QAAE,eAAe;AACjB,iBAAW,MAAM,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,GAAG,EAAE,OAAO,OAAG,qCAAqB,CAAC,CAAC;AAAA,IAClF;AACA,OAAG,iBAAiB,SAAS,SAAS,EAAE,SAAS,MAAM,CAAC;AACxD,WAAO,MAAM,GAAG,oBAAoB,SAAS,OAAO;AAAA,EACtD,GAAG,CAAC,UAAU,CAAC;AAEf,QAAM,QAAQ,CAAC,MAA4C;AACzD,UAAM,OAAO,OAAO,SAAS,sBAAsB;AACnD,WAAO,EAAE,GAAG,EAAE,WAAW,MAAM,QAAQ,IAAI,GAAG,EAAE,WAAW,MAAM,OAAO,GAAG;AAAA,EAC7E;AAEA,QAAM,YAAY,CAAC,SAAmC,CAAC,UAAgC;AACrF,UAAM,SAAU,SAAS,iBAAiB,QAAQ,MAAM,cAAc;AACtE,UAAM,OAAO,QAAQ;AACrB,QAAI,SAAS,SAAS;AACpB,YAAMC,QAAO,MAAM,QAAQ,YAAY,KAAK;AAC5C,YAAM,SAASA,QAAO,WAAW,MAAMA,KAAI,IAAI,WAAW,MAAM;AAChE,UAAI,OAAO,OAAQ,OAAM,iBAAiB;AAC1C;AAAA,IACF;AACA,UAAM,OAAO,SAAS,QAAQ,WAAW,IAAI,IAAI,WAAW,KAAK;AACjE,QAAI,QAAQ,MAAM;AAChB,WAAK,QAAQ,cAAc,IAAI;AAC/B,YAAM,iBAAiB;AAAA,IACzB;AAAA,EACF;AAEA,QAAM,KAAK,eAAAD,qBAAM;AACjB,QAAM,KAAK,eAAAA,qBAAM;AACjB,QAAM,MAAM,QAAQ;AACpB,QAAM,OAAO,MAAM;AACnB,QAAM,SAAS,QAAQ,EAAE,GAAG,KAAK,MAAM,IAAI,MAAM,SAAS,OAAO,MAAM,SAAS,GAAG,GAAG,KAAK,MAAM,IAAI,MAAM,SAAS,OAAO,MAAM,SAAS,EAAE;AAE5I,SACE;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,MAAK;AAAA,MACL,cAAY;AAAA,MACZ,UAAU;AAAA,MACV,aAAW,MAAM;AAAA,MACjB;AAAA,MACA,OAAO,EAAE,SAAS,SAAS,OAAO,QAAQ,QAAQ,QAAQ,SAAS,QAAQ,aAAa,QAAQ,YAAY,QAAQ,QAAQ,MAAM,QAAQ,GAAG,MAAM;AAAA,MACnJ,eAAe,CAAC,MAAM;AACpB,eAAO,SAAS,MAAM,EAAE,eAAe,KAAK,CAAC;AAC7C,QAAC,EAAE,cAA0B,oBAAoB,EAAE,SAAS;AAC5D,mBAAW,YAAY,MAAM,CAAC,OAAG,qCAAqB,CAAC,CAAC;AAAA,MAC1D;AAAA,MACA,eAAe,CAAC,MAAM,WAAW,YAAY,MAAM,CAAC,OAAG,qCAAqB,CAAC,CAAC;AAAA,MAC9E,aAAa,CAAC,MAAM;AAClB,QAAC,EAAE,cAA0B,wBAAwB,EAAE,SAAS;AAChE,mBAAW,UAAU,MAAM,CAAC,OAAG,qCAAqB,CAAC,CAAC;AAAA,MACxD;AAAA,MACA,iBAAiB,MAAM,WAAW,WAAW;AAAA,MAC7C,gBAAgB,MAAM,WAAW,aAAa;AAAA,MAC9C,eAAe,CAAC,MAAM,WAAW,YAAY,MAAM,CAAC,CAAC;AAAA,MACrD,WAAW,CAAC,MAAM;AAChB,gBAAI,mCAAmB,EAAE,MAAM,EAAG;AAClC,YAAI,WAAW,YAAQ,iCAAiB,CAAC,CAAC,EAAG,GAAE,eAAe;AAAA,MAChE;AAAA,MACA,SAAS,CAAC,MAAM,WAAW,UAAM,iCAAiB,CAAC,CAAC;AAAA,MACpD,QAAQ,UAAU,MAAM;AAAA,MACxB,OAAO,UAAU,KAAK;AAAA,MACtB,SAAS,UAAU,OAAO;AAAA,MAEzB;AAAA,wBACC,6CAAC,UACC,wDAAC,aAAQ,IAAI,KAAK,GAAG,YAAY,OAAO,IAAI,QAAQ,IAAI,cAAa,kBACnE;AAAA,uDAAC,UAAK,OAAO,IAAI,QAAQ,IAAI,MAAK,WAAU;AAAA,UAC5C,6CAAC,UAAK,OAAO,GAAG,QAAQ,GAAG,MAAK,WAAU;AAAA,UAC1C,6CAAC,UAAK,GAAG,GAAG,GAAG,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAK,WAAU;AAAA,WACxD,GACF;AAAA,QAEF,6CAAC,sBAAmB,MAAM,MAAM,MAAM;AAAA,QACtC;AAAA,UAAC;AAAA;AAAA,YACC,wBAAqB;AAAA,YACrB,GAAG,QAAQ,SAAS;AAAA,YACpB,GAAG,QAAQ,SAAS;AAAA,YACpB,OAAO,QAAQ,SAAS;AAAA,YACxB,QAAQ,QAAQ,SAAS;AAAA,YACzB,MAAM,MAAM,eAAe,eAAe,UAAU,GAAG,cAAc;AAAA,YACrE,QAAO;AAAA;AAAA,QACT;AAAA,QACA,6CAAC,OAAE,qBAAkB,IAAG,WAAW,MAAM,WACvC,uDAAC,oBAAiB,OAAO,MAAM,OAAO,GACxC;AAAA,QACA,8CAAC,OAAE,uBAAoB,IAAG,eAAc,QAAO,MAAK,QACjD;AAAA,kBAAQ,SAAS,IAAI,CAAC,MACrB,6CAAC,UAAgB,GAAG,EAAE,GAAG,QAAQ,aAAa,aAAa,EAAE,WAAW,IAAI,KAAK,SAAS,EAAE,WAAW,IAAI,OAAhG,EAAE,EAAmG,CACjH;AAAA,UACA,QAAQ,cAAc,6CAAC,UAAK,GAAG,QAAQ,YAAY,QAAQ,aAAa,iBAAgB,OAAM;AAAA,UAC9F,OACC,8CAAC,OAAE,yBAAsB,IAAG,qBAAmB,IAAI,eAAe,QAAW,WAAW,IAAI,aAAa,QACvG;AAAA,yDAAC,UAAK,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,OAAO,IAAI,OAAO,QAAQ,IAAI,QAAQ,QAAQ,aAAa;AAAA,YACrF,6CAAC,UAAK,IAAI,IAAI,IAAI,IAAI,QAAQ,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,QAAQ,GAAG,IAAI,IAAI,IAAI,IAAI,QAAQ,aAAa;AAAA,YAC3G,IAAI,QAAQ;AAAA,cAAI,CAAC,MAChB,EAAE,WAAW,WACX,6CAAC,YAAsB,eAAa,EAAE,QAAQ,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,GAAG,KAAK,IAAI,GAAG,MAAM,eAAAA,qBAAM,YAAY,QAAQ,eAAlG,EAAE,MAA6G,IAE5H,6CAAC,UAAoB,eAAa,EAAE,QAAQ,GAAG,EAAE,IAAI,KAAK,GAAG,GAAG,EAAE,IAAI,KAAK,GAAG,OAAO,IAAI,QAAQ,IAAI,MAAM,eAAAA,qBAAM,YAAY,QAAQ,eAA1H,EAAE,MAAqI;AAAA,YAEtJ;AAAA,aACF;AAAA,UAED,QAAQ,WACP,8CAAC,OAAE,uBAAqB,QAAQ,QAAQ,MACtC;AAAA,yDAAC,UAAK,GAAG,QAAQ,QAAQ,GAAG,QAAQ,aAAa;AAAA,YAChD,QAAQ,QAAQ,QAAQ,IAAI,CAAC,GAAG,MAC/B,6CAAC,UAAa,GAAG,EAAE,IAAI,KAAK,GAAG,GAAG,EAAE,IAAI,KAAK,GAAG,OAAO,IAAI,QAAQ,IAAI,MAAM,eAAAA,qBAAM,YAAY,QAAQ,eAA5F,CAAyG,CACrH;AAAA,aACH;AAAA,UAED,QAAQ,YACP,8CAAC,OAAE,6BAA2B,QAAQ,SAAS,QAC7C;AAAA,yDAAC,UAAK,6BAA0B,IAAG,GAAG,QAAQ,SAAS,MAAM,QAAQ,aAAa,eAAe,KAAK;AAAA,YACrG,QAAQ,SAAS,QAAQ,IAAI,CAAC,MAC7B,8CAAC,OAAgB,+BAA6B,EAAE,OAC9C;AAAA,2DAAC,UAAK,IAAI,EAAE,SAAS,IAAI,EAAE,SAAS,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,QAAQ,aAAa,eAAe,KAAK;AAAA,cAC/F,6CAAC,YAAO,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,GAAG,eAAAA,qBAAM,gBAAgB,EAAE,WAAW,EAAE,SAAS,IAAI,IAAI,MAAM,EAAE,SAAS,cAAc,eAAAA,qBAAM,YAAY,QAAQ,aAAa;AAAA,iBAFnJ,EAAE,KAGV,CACD;AAAA,YACA,QAAQ,SAAS,QAAQ,IAAI,CAAC,MAAM;AACnC,oBAAM,OAAO,MAAM,EAAE,WAAW,EAAE,SAAS,IAAI;AAC/C,qBAAO,6CAAC,UAAmB,+BAA6B,EAAE,OAAO,GAAG,EAAE,IAAI,OAAO,GAAG,GAAG,EAAE,IAAI,OAAO,GAAG,OAAO,MAAM,QAAQ,MAAM,MAAM,EAAE,SAAS,cAAc,eAAAA,qBAAM,YAAY,QAAQ,eAAzK,EAAE,KAAoL;AAAA,YAC1M,CAAC;AAAA,aACH;AAAA,UAED,QAAQ,QAAQ,IAAI,CAAC,MACpB,8CAAC,OAA0E,sBAAoB,EAAE,IAAI,QACnG;AAAA,yDAAC,UAAK,IAAI,EAAE,SAAS,IAAI,EAAE,SAAS,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,QAAQ,aAAa;AAAA,YAC3E,6CAAC,YAAO,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,GAAG,eAAAA,qBAAM,gBAAgB,EAAE,UAAU,IAAI,IAAI,MAAM,eAAAA,qBAAM,YAAY,QAAQ,aAAa;AAAA,eAF9G,GAAG,EAAE,IAAI,MAAM,IAAI,EAAE,IAAI,OAAO,IAAI,EAAE,IAAI,KAAK,IAAI,EAAE,IAAI,MAAM,EAGvE,CACD;AAAA,UACA,QAAQ,QAAQ,IAAI,CAAC,MAAM;AAC1B,kBAAM,OAAO,MAAM,EAAE,UAAU,IAAI;AACnC,kBAAM,OAAO,EAAE,WAAW,cAAc,eAAAA,qBAAM;AAC9C,kBAAM,MAAM,GAAG,EAAE,IAAI,MAAM,IAAI,EAAE,IAAI,OAAO,IAAI,EAAE,IAAI,KAAK;AAC3D,mBAAO,EAAE,SAAS,WAChB,6CAAC,UAAe,sBAAoB,EAAE,IAAI,OAAO,GAAG,EAAE,IAAI,OAAO,GAAG,GAAG,EAAE,IAAI,OAAO,GAAG,OAAO,MAAM,QAAQ,MAAM,MAAY,QAAQ,eAA3H,GAAwI,IAEnJ,6CAAC,YAAiB,sBAAoB,EAAE,IAAI,OAAO,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,GAAG,OAAO,GAAG,MAAY,QAAQ,eAAzF,GAAsG;AAAA,UAEvH,CAAC;AAAA,UACA,QAAQ,cAAc,IAAI,CAAC,MAC1B,8CAAC,OAAiE,6BAA2B,EAAE,IAAI,OAAO,oBAAkB,EAAE,MAC5H;AAAA,yDAAC,YAAO,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,GAAG,eAAAA,qBAAM,sBAAsB,EAAE,UAAU,IAAI,IAAI,MAAM,eAAAA,qBAAM,YAAY,QAAQ,aAAa;AAAA,YAC1H,6CAAC,YAAO,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,GAAG,KAAK,MAAM,aAAa;AAAA,eAF/C,UAAU,EAAE,IAAI,MAAM,IAAI,EAAE,IAAI,OAAO,IAAI,EAAE,IAAI,KAAK,EAG9D,CACD;AAAA,UACA,QAAQ,MAAM,OAAO,IAAI,CAAC,OACzB,8CAAC,OAAyB,2BAAyB,GAAG,IAAI,iBAAe,GAAG,YAAY,QACtF;AAAA,yDAAC,UAAK,GAAG,GAAG,GAAG,MAAK,QAAO,QAAQ,aAAa,iBAAgB,OAAM;AAAA,YACrE,GAAG,KAAK,IAAI,CAAC,GAAG,MACf,6CAAC,YAAe,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,GAAG,eAAAA,qBAAM,cAAc,MAAM,eAAAA,qBAAM,YAAY,QAAQ,eAA5E,CAAyF,CACvG;AAAA,eAJK,SAAS,GAAG,EAAE,EAKtB,CACD;AAAA,UACA,QAAQ,MAAM,SACb,8CAAC,OAAE,2BAAwB,IACzB;AAAA,yDAAC,UAAK,GAAG,QAAQ,MAAM,MAAM,GAAG,MAAK,QAAO,QAAQ,aAAa,aAAa,GAAG;AAAA,YAChF,QAAQ,MAAM,MAAM,UAAU,6CAAC,YAAO,IAAI,QAAQ,MAAM,MAAM,OAAO,GAAG,IAAI,QAAQ,MAAM,MAAM,OAAO,GAAG,GAAG,eAAAA,qBAAM,eAAe,GAAG,MAAM,aAAa;AAAA,aAC3J;AAAA,UAED,QAAQ,MAAM,QAAQ,IAAI,CAAC,GAAG,MAC7B;AAAA,YAAC;AAAA;AAAA,cAEC,4BAA0B;AAAA,cAC1B,GAAG,EAAE,IAAI,KAAK;AAAA,cACd,GAAG,EAAE,IAAI,KAAK;AAAA,cACd,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,MAAM,EAAE,UAAU,cAAc,eAAAA,qBAAM;AAAA,cACtC,QAAQ;AAAA;AAAA,YAPH,gBAAgB,CAAC;AAAA,UAQxB,CACD;AAAA,UACA,QAAQ,YAAY,6CAAC,2BAAwB,WAAW,QAAQ,UAAU,aAA0B;AAAA,UACpG,QAAQ,aACP,8CAAC,OAAE,0BAAuB,IACxB;AAAA,yDAAC,UAAK,IAAI,QAAQ,UAAU,KAAK,GAAG,IAAI,QAAQ,UAAU,KAAK,GAAG,IAAI,QAAQ,UAAU,MAAM,GAAG,IAAI,QAAQ,UAAU,MAAM,GAAG,QAAQ,aAAa,iBAAgB,OAAM;AAAA,YAC3K,6CAAC,UAAK,OAAG,kCAAkB,QAAQ,UAAU,GAAG,QAAQ,UAAU,CAAC,GAAG,MAAK,QAAO,QAAQ,aAAa;AAAA,aACzG;AAAA,UAED,QAAQ,YAAY,IAAI,CAAC,MACxB,8CAAC,OAAgE,2BAAyB,EAAE,IAAI,OAAO,iBAAe,EAAE,YAAY,QAClI;AAAA,yDAAC,UAAK,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,MAAM,GAAG,QAAQ,aAAa;AAAA,YACrF,6CAAC,UAAK,OAAG,kCAAkB,EAAE,GAAG,EAAE,CAAC,GAAG,MAAM,EAAE,YAAY,EAAE,SAAS,cAAc,eAAAA,qBAAM,YAAY,QAAQ,aAAa,aAAa,EAAE,YAAY,WAAW,IAAI,GAAG;AAAA,YACrK,CAAC,QAAQ,OAAO,EAAY,IAAI,CAAC,SACjC,6CAAC,YAAkB,0BAAwB,MAAM,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,GAAG,GAAG,eAAAA,qBAAM,gBAAgB,EAAE,YAAY,OAAO,IAAI,IAAI,MAAM,eAAAA,qBAAM,YAAY,QAAQ,eAAxJ,IAAqK,CACnL;AAAA,eALK,SAAS,EAAE,IAAI,MAAM,IAAI,EAAE,IAAI,OAAO,IAAI,EAAE,IAAI,KAAK,EAM7D,CACD;AAAA,UACA,MAAM,SAAS,SAAS,QAAQ,QAAQ,KAAK,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,KACxE,6CAAC,YAAO,IAAI,QAAQ,QAAQ,KAAK,CAAC,MAAM,EAAE,MAAM,EAAG,GAAG,IAAI,QAAQ,QAAQ,KAAK,CAAC,MAAM,EAAE,MAAM,EAAG,GAAG,GAAG,IAAI,QAAQ,aAAa;AAAA,UAEjI,QAAQ,WACP,8CAAC,OAAE,uBAAqB,QAAQ,QAAQ,MACrC;AAAA,oBAAQ,QAAQ,MAAM,IAAI,CAAC,GAAG,MAC7B;AAAA,cAAC;AAAA;AAAA,gBAEC,4BAAyB;AAAA,gBACzB;AAAA,gBACA,MAAM,QAAQ,QAAS,SAAS,UAAU,eAAAA,qBAAM,mBAAmB,eAAAA,qBAAM;AAAA,gBACzE,UAAS;AAAA,gBACT,QAAQ,QAAQ,QAAS,SAAS,UAAU,eAAAA,qBAAM,eAAe;AAAA,gBACjE,aAAa;AAAA;AAAA,cANR,IAAI,CAAC;AAAA,YAOZ,CACD;AAAA,YACA,QAAQ,QAAQ,QAAQ;AAAA,cAAI,CAAC,GAAG,MAC/B,IACE;AAAA,gBAAC;AAAA;AAAA,kBAEC,6BAA0B;AAAA,kBAC1B;AAAA,kBACA,MAAK;AAAA,kBACL,QAAQ,QAAQ,QAAS,SAAS,UAAU,eAAAA,qBAAM,eAAe;AAAA,kBACjE,eAAe,eAAAA,qBAAM;AAAA,kBACrB,aAAa;AAAA;AAAA,gBANR,IAAI,CAAC;AAAA,cAOZ,IACE;AAAA,YACN;AAAA,YACC,QAAQ,QAAQ,MAAM,IAAI,CAAC,GAAG,MAC7B,6CAAC,UAAmB,4BAAyB,IAAG,GAAM,MAAK,QAAO,QAAQ,eAAAA,qBAAM,cAAc,aAAa,GAAG,eAAc,WAAjH,IAAI,CAAC,EAAoH,CACrI;AAAA,YACA,QAAQ,QAAQ,SAAS,6CAAC,UAAK,6BAA0B,IAAG,GAAG,QAAQ,QAAQ,OAAO,MAAK,QAAO,QAAQ,QAAQ,QAAQ,SAAS,UAAU,eAAAA,qBAAM,eAAe,aAAa,aAAa,GAAG;AAAA,aAClM;AAAA,UAED,QAAQ,cACP;AAAA,YAAC;AAAA;AAAA,cACC,2BAAyB,QAAQ,WAAW;AAAA,cAC5C,GAAG,QAAQ,WAAW;AAAA,cACtB,QAAQ,QAAQ,WAAW,SAAS,WAAW,eAAAA,qBAAM,aAAa;AAAA,cAClE,aAAa,QAAQ,WAAW,SAAS,WAAW,QAAQ,WAAW,QAAQ;AAAA,cAC/E,eAAc;AAAA,cACd,gBAAe;AAAA,cACf,iBAAiB,QAAQ,WAAW,SAAS,UAAU,QAAQ;AAAA;AAAA,UACjE;AAAA,UAED,QAAQ,gBACP;AAAA,YAAC;AAAA;AAAA,cACC,6BAA0B;AAAA,cAC1B,IAAI,QAAQ,aAAa;AAAA,cACzB,IAAI,QAAQ,aAAa;AAAA,cACzB,IAAI,QAAQ,aAAa;AAAA,cACzB,IAAI,QAAQ,aAAa;AAAA,cACzB,QAAQ;AAAA,cACR,iBAAgB;AAAA;AAAA,UAClB;AAAA,UAED,QAAQ,YAAY,6CAAC,YAAO,yBAAsB,IAAG,IAAI,QAAQ,SAAS,GAAG,IAAI,QAAQ,SAAS,GAAG,GAAG,eAAAA,qBAAM,eAAe,GAAG,MAAM,eAAAA,qBAAM,YAAY,QAAQ,aAAa;AAAA,UAC7K,QAAQ,WACP;AAAA,YAAC;AAAA;AAAA,cACC,uBAAoB;AAAA,cACpB,GAAG,QAAQ,QAAQ;AAAA,cACnB,GAAG,QAAQ,QAAQ;AAAA,cACnB,OAAO,QAAQ,QAAQ;AAAA,cACvB,QAAQ,QAAQ,QAAQ;AAAA,cACxB,MAAM,eAAAA,qBAAM;AAAA,cACZ,QAAQ;AAAA,cACR,iBAAgB;AAAA;AAAA,UAClB;AAAA,UAED,QAAQ,OAAO,MAAM,SAAS,KAC7B,6CAAC,OAAE,sBAAmB,IAAG,QAAQ,YAC9B,kBAAQ,OAAO,MAAM,IAAI,CAAC,GAAG,MAC5B,6CAAC,UAAa,qBAAmB,EAAE,MAAM,IAAI,EAAE,IAAI,IAAI,EAAE,IAAI,IAAI,EAAE,IAAI,IAAI,EAAE,IAAI,iBAAiB,EAAE,SAAS,iBAAiB,QAAQ,UAA3H,CAAsI,CAClJ,GACH;AAAA,UAED,QAAQ,OAAO,OAAO,IAAI,CAAC,GAAG,MAC7B;AAAA,YAAC;AAAA;AAAA,cAEC,2BAAyB,EAAE;AAAA,cAC3B,GAAG,EAAE,IAAI;AAAA,cACT,GAAG,EAAE,IAAI;AAAA,cACT,UAAU;AAAA,cACV,MAAM;AAAA,cACN,QAAO;AAAA,cACP,aAAa;AAAA,cACb,YAAW;AAAA,cACX,OAAO,EAAE,YAAY,wBAAwB;AAAA,cAE5C,YAAE;AAAA;AAAA,YAXE;AAAA,UAYP,CACD;AAAA,UACA,QAAQ,UACP,6CAAC,UAAK,sBAAmB,IAAG,GAAG,GAAG,GAAE,QAAO,IAAI,IAAI,UAAU,IAAI,MAAM,aAAa,OAAO,EAAE,YAAY,wBAAwB,GAC9H,kBAAQ,QACX;AAAA,WAEJ;AAAA,QACC,QAAQ;AAAA,QAEP,6CAAC,mBAAc,gCAA6B,IAAG,GAAG,OAAO,IAAI,IAAI,GAAG,OAAO,IAAI,IAAI,OAAO,KAAK,QAAQ,KAAK,OAAO,EAAE,UAAU,UAAU,GACvI,uDAAC,0BAAsE,YAAwB,MAAY,eAA9E,GAAG,KAAK,MAAM,IAAI,KAAK,KAAK,IAAI,KAAK,CAAC,EAAkE,GACvI;AAAA;AAAA;AAAA,EAEJ;AAEJ;;;AE9hBA,IAAAE,gBAAkB;AAClB,IAAAC,iBA8BO;;;AC9BP,IAAAC,iBAOO;AAsCD,IAAAC,sBAAA;AAnCN,IAAM,cACJ;AACF,IAAM,cAAc;AACpB,IAAM,cAAc;AAEpB,IAAM,aAAa;AAaZ,SAAS,mBAAmB,EAAE,YAAY,UAAU,GAA4B;AACrF,QAAM,QAAQ,qBAAqB,UAAU;AAC7C,QAAM,YAAQ,sCAAsB,KAAK;AACzC,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,SAAS,MAAM;AACrB,QAAM,MAAM,MAAM,WAAW,cAAc;AAC3C,QAAM,MAAM,CAAC,GAA2B,KAAa,OAAgB,UAAmB;AACtF,QAAI,OAAQ,YAAW,aAAa,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,GAAG,GAAG,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC;AAAA,EAC3F;AACA,QAAM,SAAS,CAAC,GAA2B,SAAqD;AAC9F,UAAM,QAAQ,OAAO,EAAE,OAAO,KAAK,GAAG,KAAK,CAAC;AAC5C,UAAM,QAAQ,GAAG,EAAE,KAAK,IAAI,KAAK,KAAK;AACtC,UAAM,WAAW,CAAC,OAA4C;AAC5D,YAAM,IAAI,WAAW,GAAG,OAAO,KAAK;AACpC,UAAI,OAAO,SAAS,CAAC,EAAG,KAAI,GAAG,KAAK,KAAK,GAAG,IAAI;AAAA,IAClD;AACA,WACE,8CAAC,WAAqB,WAAU,yEAAwE,4BAA0B,KAAK,KACrI;AAAA,mDAAC,UAAK,WAAW,YAAa,eAAK,OAAM;AAAA,MACxC,KAAK,UACJ;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,KAAK,KAAK;AAAA,UACV,KAAK,KAAK;AAAA,UACV,MAAM,KAAK;AAAA,UACX,cAAY,GAAG,KAAK;AAAA,UACpB,WAAU;AAAA,UACV;AAAA,UACA;AAAA,UACA,aAAa;AAAA,UACb,SAAS;AAAA,UACT,QAAQ;AAAA;AAAA,MACV;AAAA,MAEF;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,KAAK,KAAK;AAAA,UACV,KAAK,KAAK;AAAA,UACV,MAAM,KAAK;AAAA,UACX,cAAY;AAAA,UACZ,WAAW;AAAA,UACX,OAAO,KAAK,MAAM,QAAQ,GAAI,IAAI;AAAA,UAClC;AAAA,UACA,QAAQ;AAAA;AAAA,MACV;AAAA,SA3BU,KAAK,GA4BjB;AAAA,EAEJ;AACA,QAAM,OAAO,CAAC,GAA2B,SAAgC;AACvE,UAAM,IAAK,EAAE,OAAO,KAAK,GAAG,KAA8C,EAAE,GAAG,GAAG,GAAG,EAAE;AACvF,UAAM,QAAQ,CAAC,SACb;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,MAAM,KAAK,SAAS,SAAS,KAAK,OAAO;AAAA,QACzC,cAAY,GAAG,EAAE,KAAK,IAAI,KAAK,KAAK,IAAI,IAAI;AAAA,QAC5C,WAAW;AAAA,QACX,OAAO,KAAK,MAAM,EAAE,IAAI,IAAI,GAAI,IAAI;AAAA,QACpC,UAAU,CAAC,OAAO;AAChB,gBAAM,IAAI,WAAW,GAAG,OAAO,KAAK;AACpC,cAAI,OAAO,SAAS,CAAC,EAAG,KAAI,GAAG,KAAK,KAAK,EAAE,GAAG,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,IAAI;AAAA,QACpE;AAAA,QACA,QAAQ;AAAA;AAAA,IACV;AAEF,WACE,8CAAC,SAAmB,WAAU,yEAAwE,4BAA0B,KAAK,KACnI;AAAA,mDAAC,UAAK,WAAW,YAAa,eAAK,OAAM;AAAA,MACxC,MAAM,GAAG;AAAA,MACT,MAAM,GAAG;AAAA,SAHF,KAAK,GAIf;AAAA,EAEJ;AACA,QAAM,QAAQ,CAAC,GAA2B,SAAgC;AACxE,QAAI,KAAK,SAAS,SAAU,QAAO,OAAO,GAAG,IAAI;AACjD,QAAI,KAAK,SAAS,OAAQ,QAAO,KAAK,GAAG,IAAI;AAC7C,QAAI,KAAK,SAAS;AAChB,aACE,8CAAC,WAAqB,WAAU,mDAAkD,4BAA0B,KAAK,KAC/G;AAAA,qDAAC,UAAK,WAAU,2BAA2B,eAAK,OAAM;AAAA,QACtD,6CAAC,WAAM,MAAK,YAAW,cAAY,GAAG,EAAE,KAAK,IAAI,KAAK,KAAK,IAAI,SAAS,CAAC,CAAC,EAAE,OAAO,KAAK,GAAG,GAAG,UAAU,CAAC,OAAO,IAAI,GAAG,KAAK,KAAK,GAAG,OAAO,SAAS,KAAK,GAAG;AAAA,WAFlJ,KAAK,GAGjB;AAEJ,WACE,8CAAC,WAAqB,WAAU,yEAAwE,4BAA0B,KAAK,KACrI;AAAA,mDAAC,UAAK,WAAW,YAAa,eAAK,OAAM;AAAA,MACzC,6CAAC,YAAO,cAAY,GAAG,EAAE,KAAK,IAAI,KAAK,KAAK,IAAI,WAAW,aAAa,OAAO,OAAO,EAAE,OAAO,KAAK,GAAG,KAAK,EAAE,GAAG,UAAU,CAAC,OAAO,IAAI,GAAG,KAAK,KAAK,GAAG,OAAO,OAAO,KAAK,GACvK,eAAK,QAAQ,IAAI,CAAC,MACjB,6CAAC,YAAqB,OAAO,EAAE,OAC5B,YAAE,SADQ,EAAE,KAEf,CACD,GACH;AAAA,SARU,KAAK,GASjB;AAAA,EAEJ;AACA,SACE,8CAAC,SAAI,WAAW,aAAa,aAAa,EAAE,IAAI,uBAAoB,IAAG,cAAW,WAChF;AAAA,kDAAC,SAAI,WAAU,2BACb;AAAA,mDAAC,UAAK,WAAU,8EAA6E,qBAAO;AAAA,MACpG;AAAA,QAAC;AAAA;AAAA,UACC,cAAW;AAAA,UACX,WAAW;AAAA,UACX,OAAM;AAAA,UACN,UAAU,CAAC,OAAO;AAChB,gBAAI,GAAG,OAAO,MAAO,YAAW,UAAU,GAAG,OAAO,KAAyB;AAAA,UAC/E;AAAA,UAEA;AAAA,yDAAC,YAAO,OAAM,IAAG,8BAAW;AAAA,YAC3B,kCAAmB,IAAI,CAAC,MACvB,6CAAC,YAAoB,OAAO,EAAE,MAC3B,YAAE,SADQ,EAAE,IAEf,CACD;AAAA;AAAA;AAAA,MACH;AAAA,MACA,6CAAC,YAAO,MAAK,UAAS,WAAW,aAAa,OAAM,qBAAoB,cAAW,qBAAoB,UAAU,CAAC,MAAM,YAAY,SAAS,MAAM,WAAW,iBAAiB,GAAG,oBAElL;AAAA,OACF;AAAA,IACC,MAAM,QAAQ,KAAK,6CAAC,OAAE,WAAU,qCAAoC,oDAAsC;AAAA,IAC1G,UACC,MAAM,QAAQ,IAAI,CAAC,GAAG,MACpB,8CAAC,SAAe,WAAU,gDAA+C,sBAAoB,EAAE,IAAI,2BAAyB,EAAE,MAC5H;AAAA,oDAAC,SAAI,WAAU,2BACb;AAAA,sDAAC,WAAM,WAAU,gFACf;AAAA,uDAAC,WAAM,MAAK,YAAW,cAAY,GAAG,EAAE,KAAK,OAAO,SAAS,EAAE,SAAS,UAAU,CAAC,OAAO,WAAW,aAAa,QAAQ,EAAE,IAAI,EAAE,SAAS,GAAG,OAAO,QAAQ,CAAC,GAAG;AAAA,UACjK,6CAAC,UAAK,WAAU,YAAY,YAAE,OAAM;AAAA,WACtC;AAAA,QACA,6CAAC,YAAO,MAAK,UAAS,WAAW,aAAa,OAAM,WAAU,cAAY,QAAQ,EAAE,KAAK,OAAO,UAAU,MAAM,GAAG,SAAS,MAAM,WAAW,WAAW,QAAQ,EAAE,IAAI,IAAI,CAAC,GAAG,oBAE9K;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAW;AAAA,YACX,OAAM;AAAA,YACN,cAAY,QAAQ,EAAE,KAAK;AAAA,YAC3B,UAAU,MAAM,MAAM,QAAQ,SAAS;AAAA,YACvC,SAAS,MAAM,WAAW,WAAW,QAAQ,EAAE,IAAI,IAAI,CAAC;AAAA,YACzD;AAAA;AAAA,QAED;AAAA,QACA,6CAAC,YAAO,MAAK,UAAS,WAAW,aAAa,OAAM,UAAS,cAAY,UAAU,EAAE,KAAK,IAAI,SAAS,MAAM,WAAW,aAAa,QAAQ,EAAE,EAAE,GAAG,kBAEpJ;AAAA,SACF;AAAA,MACC,EAAE,MAAM,IAAI,CAAC,SAAS,MAAM,GAAG,IAAI,CAAC;AAAA,SAvB7B,EAAE,EAwBZ,CACD;AAAA,KACL;AAEJ;;;AClLA,IAAAC,gBAAkB;AAClB,IAAAC,iBAA8H;AA8CxH,IAAAC,sBAAA;AA3CN,IAAMC,eACJ;AACF,IAAMC,eAAc;AACpB,IAAMC,eAAc;AACpB,IAAMC,cAAa;AAEnB,IAAM,UAAwE;AAAA,EAC5E,EAAE,KAAK,QAAQ,OAAO,SAAS;AAAA,EAC/B,EAAE,KAAK,cAAc,OAAO,0BAA0B;AAAA,EACtD,EAAE,KAAK,YAAY,OAAO,wBAAwB;AACpD;AAaO,SAAS,oBAAoB,EAAE,YAAY,UAAU,GAA6B;AACvF,QAAM,QAAQ,qBAAqB,UAAU;AAC7C,QAAM,YAAQ,uCAAuB,KAAK;AAE1C,QAAM,CAAC,MAAM,OAAO,IAAI,cAAAC,QAAM,SAAS,EAAE,MAAM,GAAG,SAAS,EAAE,CAAC;AAC9D,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,MAAM,MAAM;AAClB,QAAM,MAAM,MAAM,SAAS,CAAC,MAAM,MAAM,IAAI;AAC5C,QAAM,MAAM,MAAM,WAAW,cAAc;AAC3C,QAAM,MAAM,CAAC,OAAsC,QAAQ,UAAU,WAAW,SAAS,OAAO,EAAE,KAAK,MAAM,CAAC;AAC9G,QAAM,OAAO,KAAK,OAAO,QAAQ,KAAK;AACtC,QAAM,UAAU,KAAK,OAAO,WAAW,KAAK;AAC5C,QAAM,WAAW,CAAC,KAAyB,QAAgB;AACzD,UAAM,IAAI,KAAK,MAAM,WAAW,GAAG,CAAC;AACpC,QAAI,CAAC,OAAO,SAAS,CAAC,KAAK,IAAI,KAAK,IAAI,GAAI;AAC5C,QAAI,IAAK,KAAI,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC;AAAA,QACpB,SAAQ,EAAE,GAAG,MAAM,CAAC,GAAG,GAAG,EAAE,CAAC;AAAA,EACpC;AACA,SACE,8CAAC,SAAI,WAAW,aAAa,aAAa,EAAE,IAAI,wBAAqB,IAAG,cAAW,YACjF;AAAA,kDAAC,SAAI,WAAU,qCACb;AAAA,mDAAC,UAAK,WAAU,8EAA6E,sBAAQ;AAAA,MACrG,6CAAC,YAAO,MAAK,UAAS,+BAA4B,QAAO,WAAWJ,cAAa,OAAM,kBAAiB,cAAW,kBAAiB,UAAU,CAAC,MAAM,WAAW,CAAC,CAAC,KAAK,SAAS,MAAM,IAAI,EAAE,OAAO,OAAO,MAAM,GAAG,CAAC,GAAG,kBAEvN;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,+BAA4B;AAAA,UAC5B,WAAWA;AAAA,UACX,OAAM;AAAA,UACN,cAAW;AAAA,UACX,UAAU,CAAC,MAAM,WAAW,CAAC,CAAC;AAAA,UAC9B,SAAS,MAAM,IAAI,EAAE,OAAO,QAAQ,MAAM,KAAK,MAAM,SAAS,KAAK,QAAQ,CAAC;AAAA,UAC7E;AAAA;AAAA,MAED;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,+BAA4B;AAAA,UAC5B,WAAWA;AAAA,UACX,OAAM;AAAA,UACN,cAAW;AAAA,UACX,UAAU,CAAC,MAAM;AAAA,UACjB,SAAS,MAAM,WAAW,0BAA0B,EAAE,MAAM,KAAK,MAAM,SAAS,KAAK,QAAQ,CAAC;AAAA,UAC/F;AAAA;AAAA,MAED;AAAA,MACA,6CAAC,YAAO,MAAK,UAAS,+BAA4B,WAAU,WAAWA,cAAa,OAAM,oBAAmB,cAAW,oBAAmB,UAAU,CAAC,MAAM,YAAY,SAAS,MAAM,WAAW,gBAAgB,GAAG,qBAErN;AAAA,MACA,6CAAC,YAAO,MAAK,UAAS,+BAA4B,UAAS,WAAWA,cAAa,OAAM,mBAAkB,cAAW,mBAAkB,UAAU,CAAC,MAAM,YAAY,SAAS,MAAM,WAAW,iBAAiB,GAAG,oBAEnN;AAAA,OACF;AAAA,IACC,OACC,8CAAC,WAAM,WAAU,yEAAwE,8BAA2B,SAClH;AAAA,mDAAC,UAAK,WAAWG,aAAY,kBAAI;AAAA,MACjC,6CAAC,YAAO,cAAW,iBAAgB,WAAWD,cAAa,OAAO,IAAI,OAAO,OAAO,UAAU,CAAC,MAAM,IAAI,EAAE,OAAO,EAAE,OAAO,MAAuC,CAAC,GAChK,uDAA8B,IAAI,CAAC,MAClC,6CAAC,YAAqB,OAAO,EAAE,OAC5B,YAAE,SADQ,EAAE,KAEf,CACD,GACH;AAAA,OACF;AAAA,IAED,OACC,IAAI,OAAO,UAAU,UACrB,QAAQ,IAAI,CAAC,MAAM;AACjB,YAAM,QAAQ,IAAI,OAAO,EAAE,GAAG;AAC9B,YAAM,WAAW,CAAC,OAA4C;AAC5D,cAAM,IAAI,WAAW,GAAG,OAAO,KAAK;AACpC,YAAI,OAAO,SAAS,CAAC,EAAG,KAAI,EAAE,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI;AAAA,MAClD;AACA,aACE,8CAAC,WAAkB,WAAU,yEAAwE,8BAA4B,EAAE,KACjI;AAAA,qDAAC,UAAK,WAAWC,aAAa,YAAE,OAAM;AAAA,QACtC;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,KAAK;AAAA,YACL,KAAK;AAAA,YACL,MAAM;AAAA,YACN,cAAY,YAAY,EAAE,KAAK;AAAA,YAC/B,WAAU;AAAA,YACV;AAAA,YACA;AAAA,YACA,aAAa;AAAA,YACb,SAAS;AAAA,YACT,QAAQ;AAAA;AAAA,QACV;AAAA,QACA,6CAAC,WAAM,MAAK,UAAS,KAAK,MAAM,KAAK,KAAK,MAAM,GAAG,cAAY,YAAY,EAAE,KAAK,IAAI,WAAWF,cAAa,OAAc,UAAoB,QAAQ,KAAK;AAAA,WAfnJ,EAAE,GAgBd;AAAA,IAEJ,CAAC;AAAA,IACF,OAAO,IAAI,OAAO,UAAU,UAC3B,8CAAC,WAAM,WAAU,yEAAwE,8BAA2B,eAClH;AAAA,mDAAC,UAAK,WAAWE,aAAY,yBAAW;AAAA,MACxC,8CAAC,YAAO,cAAW,wBAAuB,WAAWD,cAAa,OAAO,IAAI,OAAO,aAAa,UAAU,CAAC,MAAM,IAAI,EAAE,aAAa,EAAE,OAAO,MAAmC,CAAC,GAChL;AAAA,qDAAC,YAAO,OAAM,cAAa,wBAAU;AAAA,QACrC,6CAAC,YAAO,OAAM,YAAW,sBAAQ;AAAA,SACnC;AAAA,OACF;AAAA,IAEF,8CAAC,SAAI,WAAU,mDAAkD,8BAA2B,QAC1F;AAAA,mDAAC,UAAK,WAAU,6DAA4D,oCAAmB;AAAA,MAC/F,6CAAC,WAAM,MAAK,UAAS,KAAK,GAAG,KAAK,IAAI,MAAM,GAAG,cAAW,sBAAqB,WAAWD,cAAa,OAAO,MAAM,UAAU,CAAC,MAAM,SAAS,QAAQ,EAAE,OAAO,KAAK,GAAG;AAAA,MACvK,6CAAC,WAAM,MAAK,UAAS,KAAK,GAAG,KAAK,IAAI,MAAM,GAAG,cAAW,yBAAwB,WAAWA,cAAa,OAAO,SAAS,UAAU,CAAC,MAAM,SAAS,WAAW,EAAE,OAAO,KAAK,GAAG;AAAA,OAClL;AAAA,IACC,MAAM,QAAQ,KAAK,CAAC,MAAM,wBAAwB,6CAAC,OAAE,WAAU,qCAAoC,qDAAuC;AAAA,IAC1I,OAAO,6CAAC,OAAE,WAAU,qCAAoC,uDAAyC;AAAA,KACpG;AAEJ;;;AC1IA,IAAAI,iBAgBO;AAkCD,IAAAC,sBAAA;AA1BN,IAAMC,eAAc;AACpB,IAAMC,eAAc;AACpB,IAAMC,eACJ;AACF,IAAM,UAAU,CAAC,MAAc,KAAK,MAAM,IAAI,GAAI,IAAI;AAO/C,SAAS,qBAAqB,EAAE,YAAY,UAAU,GAA8B;AACzF,QAAM,QAAQ,qBAAqB,UAAU;AAC7C,QAAM,SAAK,wCAAwB,KAAK;AACxC,MAAI,CAAC,GAAI,QAAO;AAChB,QAAM,IAAI,GAAG;AACb,QAAM,MAAM,GAAG;AACf,QAAM,MAAM,MAAM,WAAW,cAAc;AAC3C,QAAM,UAAU,CAAC,UAAkB;AACjC,QAAI,UAAU,SAAS;AACrB,YAAM,QAAQ,GAAG,MAAM,CAAC;AACxB,iBAAW,SAAS,EAAE,CAAC,GAAG,MAAM,OAAG,iCAAiB,OAAO,KAAK,KAAK,OAAO,SAAS,UAAU,GAAG,QAAW,EAAE,OAAO,eAAe,CAAC;AAAA,IACxI,MAAO,YAAW,YAAY,EAAE,MAAM,MAA4B,CAAC;AAAA,EACrE;AACA,SACE,8CAAC,SAAI,WAAW,eAAe,aAAa,EAAE,IAAI,+BAA6B,GAAG,QAAQ,cAAW,YACnG;AAAA,kDAAC,SAAI,WAAU,6BACb;AAAA,mDAAC,UAAK,WAAU,gCAA+B,sBAAQ;AAAA,MACrD,CAAC,QAAQ,QAAQ,EAAY,IAAI,CAAC,MAClC,6CAAC,YAAe,MAAK,UAAS,WAAWA,cAAa,gBAAc,GAAG,WAAW,GAAG,SAAS,MAAM,WAAW,kBAAkB,CAAC,GAC/H,gBAAM,SAAS,SAAS,YADd,CAEb,CACD;AAAA,MACA,GAAG,SAAS,6CAAC,UAAK,WAAU,qCAAoC,mBAAK;AAAA,OACxE;AAAA,IACA,8CAAC,SAAI,WAAU,6BACb;AAAA,mDAAC,UAAK,WAAU,gCAA+B,kBAAI;AAAA,MACnD,8CAAC,YAAO,cAAW,iBAAgB,WAAWF,cAAa,OAAO,GAAG,QAAQ,SAAS,UAAU,CAAC,MAAM,QAAQ,EAAE,OAAO,KAAK,GAC3H;AAAA,qDAAC,YAAO,OAAM,SAAQ,mBAAK;AAAA,QAC1B,qCAAsB,IAAI,CAAC,MAC1B,6CAAC,YAAe,OAAO,GACpB,qDAA4B,CAAC,KADnB,CAEb,CACD;AAAA,SACH;AAAA,MACA,6CAAC,YAAO,MAAK,UAAS,WAAWE,cAAa,cAAW,oBAAmB,OAAM,oBAAmB,UAAU,CAAC,GAAG,SAAS,MAAM,WAAW,gBAAgB,GAAG,oBAEhK;AAAA,OACF;AAAA,IACC,KACC,8EACE;AAAA,oDAAC,SAAI,WAAU,gBAAe,6BAA0B,IACtD;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,UAAU;AAAA,YACV,cAAW;AAAA,YACX,WAAU;AAAA,YACV,OAAO,EAAE,iBAAiB,GAAG,GAAG,OAAO,wDAAwD,gBAAgB,gBAAgB;AAAA,YAC/H,SAAS,CAAC,MAAM;AACd,oBAAM,IAAI,EAAE,cAAc,sBAAsB;AAChD,yBAAW,gBAAgB,EAAE,QAAQ,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,CAAC,IAAI,GAAG;AAAA,YACzG;AAAA;AAAA,QACF;AAAA,QACC,GAAG,MAAM,IAAI,CAAC,MACb;AAAA,UAAC;AAAA;AAAA,YAEC,MAAK;AAAA,YACL,6BAA2B,EAAE;AAAA,YAC7B,cAAY,iBAAiB,EAAE,QAAQ,CAAC,OAAO,QAAQ,EAAE,MAAM,CAAC;AAAA,YAChE,gBAAc,EAAE;AAAA,YAChB,WAAU;AAAA,YACV,OAAO,EAAE,MAAM,8BAA8B,EAAE,MAAM,KAAK,YAAY,EAAE,OAAO,SAAS,MAAM,OAAO,EAAE,WAAW,GAAG;AAAA,YACrH,SAAS,MAAM,WAAW,mBAAmB,EAAE,WAAW,OAAO,EAAE,KAAK;AAAA;AAAA,UAPnE,EAAE;AAAA,QAQT,CACD;AAAA,SACH;AAAA,MACC,OACC,8CAAC,SAAI,WAAU,uCAAsC,sCAAoC,IAAI,OAC3F;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,cAAW;AAAA,YACX,WAAU;AAAA,YACV,WAAO,iCAAiB,IAAI,KAAK,KAAK;AAAA,YACtC,UAAU,CAAC,MAAM,WAAW,gBAAgB,IAAI,OAAO,EAAE,OAAO,EAAE,OAAO,MAAM,GAAG,EAAE,OAAO,uBAAuB,IAAI,KAAK,GAAG,CAAC;AAAA,YAC/H,QAAQ;AAAA;AAAA,QACV;AAAA,QACA,8CAAC,WAAM,WAAU,6DAA4D;AAAA;AAAA,UAE3E;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,KAAK;AAAA,cACL,KAAK;AAAA,cACL,MAAM;AAAA,cACN,cAAW;AAAA,cACX,WAAWD;AAAA,cACX,OAAO,QAAQ,IAAI,WAAW,CAAC;AAAA,cAC/B,UAAU,CAAC,MAAM;AACf,sBAAM,IAAI,WAAW,EAAE,OAAO,KAAK;AACnC,oBAAI,OAAO,SAAS,CAAC,EAAG,YAAW,gBAAgB,IAAI,OAAO,EAAE,SAAS,IAAI,IAAI,CAAC;AAAA,cACpF;AAAA;AAAA,UACF;AAAA,WACF;AAAA,QACA,8CAAC,WAAM,WAAU,6DAA4D;AAAA;AAAA,UAE3E;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,KAAK;AAAA,cACL,KAAK;AAAA,cACL,MAAM;AAAA,cACN,cAAW;AAAA,cACX,WAAWA;AAAA,cACX,OAAO,QAAQ,IAAI,MAAM;AAAA,cACzB,UAAU,CAAC,MAAM;AACf,sBAAM,IAAI,WAAW,EAAE,OAAO,KAAK;AACnC,oBAAI,OAAO,SAAS,CAAC,EAAG,YAAW,gBAAgB,IAAI,OAAO,EAAE,QAAQ,IAAI,IAAI,CAAC;AAAA,cACnF;AAAA;AAAA,UACF;AAAA,WACF;AAAA,QACC,CAAC,IAAI,QACJ,8CAAC,WAAM,WAAU,6DAA4D;AAAA;AAAA,UAE3E;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,KAAK;AAAA,cACL,KAAK;AAAA,cACL,MAAM;AAAA,cACN,cAAW;AAAA,cACX,WAAWA;AAAA,cACX,OAAO,QAAQ,IAAI,YAAY,GAAG;AAAA,cAClC,UAAU,CAAC,MAAM;AACf,sBAAM,IAAI,WAAW,EAAE,OAAO,KAAK;AACnC,oBAAI,OAAO,SAAS,CAAC,EAAG,YAAW,gBAAgB,IAAI,OAAO,EAAE,UAAU,IAAI,IAAI,CAAC;AAAA,cACrF;AAAA;AAAA,UACF;AAAA,WACF;AAAA,QAEF,6CAAC,YAAO,MAAK,UAAS,WAAWC,cAAa,cAAW,eAAc,OAAM,eAAc,UAAU,GAAG,MAAM,UAAU,GAAG,SAAS,MAAM,WAAW,mBAAmB,IAAI,KAAK,GAAG,oBAEpL;AAAA,SACF;AAAA,MAEF,8CAAC,WAAM,WAAU,qDACf;AAAA,qDAAC,UAAK,WAAU,QAAO,qBAAO;AAAA,QAC9B,6CAAC,YAAO,cAAW,0BAAyB,WAAWF,cAAa,OAAO,GAAG,eAAe,UAAU,CAAC,MAAM,WAAW,YAAY,EAAE,eAAe,EAAE,OAAO,MAAqC,CAAC,GAClM,wDAA+B,IAAI,CAAC,MACnC,6CAAC,YAAe,OAAO,GACpB,8DAAqC,CAAC,KAD5B,CAEb,CACD,GACH;AAAA,SACF;AAAA,MACA,8CAAC,WAAM,WAAU,qDACf;AAAA,qDAAC,UAAK,WAAU,QAAO,oBAAM;AAAA,QAC7B;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,KAAK;AAAA,YACL,KAAK;AAAA,YACL,MAAM;AAAA,YACN,cAAW;AAAA,YACX,WAAU;AAAA,YACV,OAAO,GAAG;AAAA,YACV,UAAU,CAAC,MAAM,WAAW,YAAY,EAAE,YAAY,WAAW,EAAE,OAAO,KAAK,EAAE,GAAG,EAAE,OAAO,sBAAsB,CAAC;AAAA,YACpH,aAAa;AAAA,YACb,QAAQ;AAAA;AAAA,QACV;AAAA,SACF;AAAA,MACA,8CAAC,WAAM,WAAU,qDACf;AAAA,qDAAC,UAAK,WAAU,QAAO,oBAAM;AAAA,QAC7B,6CAAC,YAAO,cAAW,mBAAkB,WAAWA,cAAa,OAAO,GAAG,QAAQ,UAAU,CAAC,MAAM,WAAW,YAAY,EAAE,QAAQ,EAAE,OAAO,MAA8B,CAAC,GACtK,iDAAwB,IAAI,CAAC,OAC5B,6CAAC,YAAgB,OAAO,IACrB,uDAA8B,EAAE,KADtB,EAEb,CACD,GACH;AAAA,SACF;AAAA,MACC,GAAG,WAAW,YACb,8CAAC,WAAM,WAAU,qDACf;AAAA,qDAAC,UAAK,WAAU,QAAO,uBAAS;AAAA,QAChC,6CAAC,YAAO,cAAW,sBAAqB,WAAWA,cAAa,OAAO,GAAG,YAAY,UAAU,CAAC,MAAM,WAAW,YAAY,EAAE,YAAY,EAAE,OAAO,MAAkC,CAAC,GACrL,sDAA6B,IAAI,CAAC,MACjC,6CAAC,YAAe,OAAO,GACpB,4DAAmC,CAAC,KAD1B,CAEb,CACD,GACH;AAAA,SACF;AAAA,OAEJ;AAAA,KAEJ;AAEJ;;;AH/HI,IAAAG,sBAAA;AArDJ,IAAM,oBAAoB;AAC1B,IAAM,cAAc,MAAO,OAAO,cAAc,eAAe,kBAAkB,KAAK,UAAU,YAAY,EAAE,IAAI,WAAM;AAExH,IAAMC,eACJ;AA6BK,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,cAAc;AAAA,EACd,WAAW;AAAA,EACX,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,cAAc;AAAA,EACd;AACF,GAAuB;AACrB,QAAM,QAAQ,qBAAqB,UAAU;AAC7C,QAAM,QAAQ,MAAM,UAAU;AAC9B,QAAM,SAAS,MAAM,SAAS,WAAW,MAAM,gBAAgB,SAAS;AACxE,QAAM,UAAU,MAAM;AACtB,QAAM,gBAAgB,MAAM,UAAU,KAAK,CAAC,OAAO,WAAW,QAAQ,EAAE,GAAG,SAAS,OAAO;AAE3F,QAAM,CAAC,MAAM,OAAO,IAAI,cAAAC,QAAM,SAAS,KAAK;AAC5C,QAAM,kBAAkB,OAAO,QAAQ,IAAI,QAAQ;AACnD,QAAM,MAAM,CAAC,OAAe,OAAe,KAAoB,WAAW,UACxE,6CAAC,YAAmB,MAAK,UAAS,WAAWD,cAAa,OAAc,cAAY,OAAO,UAAoB,SAAS,MAAM,KAAK,IAAI,GACpI,mBADU,KAEb;AAEF,SACE,8CAAC,SAAI,MAAK,WAAU,cAAW,gBAAe,WAAW,qCAAqC,aAAa,EAAE,IAC3G;AAAA,iDAAC,SAAI,WAAU,2BAA0B,MAAK,SAAQ,cAAW,SAC9D,gBAAM,IAAI,CAAC,SACV;AAAA,MAAC;AAAA;AAAA,QAEC,MAAK;AAAA,QACL,oBAAkB;AAAA,QAClB,WAAWA;AAAA,QACX,gBAAc,MAAM,SAAS;AAAA,QAC7B,OAAO,OAAG,gCAAgB,IAAI,CAAC,KAAK,qCAAsB,IAAI,CAAC;AAAA,QAC/D,kBAAY,gCAAgB,IAAI;AAAA,QAChC,SAAS,MAAM,WAAW,QAAQ,IAAI;AAAA,QAErC,4CAAmB,IAAI;AAAA;AAAA,MATnB;AAAA,IAUP,CACD,GACH;AAAA,IACC,eACC,8CAAC,SAAI,WAAU,gCAA+B,MAAK,SAAQ,cAAW,WACnE;AAAA,UAAI,UAAK,MAAM,UAAU,QAAQ,MAAM,SAAS,KAAK,QAAQ,MAAM,WAAW,KAAK,GAAG,CAAC,MAAM,OAAO;AAAA,MACpG,IAAI,UAAK,MAAM,UAAU,QAAQ,MAAM,SAAS,KAAK,QAAQ,MAAM,WAAW,KAAK,GAAG,CAAC,MAAM,OAAO;AAAA,OACvG;AAAA,IAED,YACC,6CAAC,SAAI,WAAU,gCAA+B,MAAK,SAAQ,cAAW,YACpE;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,oBAAiB;AAAA,QACjB,WAAWA;AAAA,QACX,gBAAc,MAAM,KAAK;AAAA,QACzB,OAAO,GAAG,iBAAiB,UAAU,YAAY,CAAC;AAAA,QAClD,cAAY;AAAA,QACZ,SAAS,MAAM,WAAW,eAAe;AAAA,QAC1C;AAAA;AAAA,IAED,GACF;AAAA,IAED,gBACC,8CAAC,SAAI,WAAU,gCAA+B,MAAK,SAAQ,cAAW,gBACnE;AAAA,yCAAoB,IAAI,CAAC,MACxB;AAAA,QAAC;AAAA;AAAA,UAEC,MAAK;AAAA,UACL,2BAAyB,EAAE;AAAA,UAC3B,WAAWA;AAAA,UACX,OAAO,EAAE,WAAW,GAAG,EAAE,KAAK,KAAK,YAAY,CAAC,IAAI,EAAE,QAAQ,MAAM,EAAE;AAAA,UACtE,cAAY,EAAE;AAAA,UACd,UAAU,CAAC,EAAE,QAAQ,OAAO,MAAM;AAAA,UAClC,SAAS,MAAM,KAAK,EAAE,IAAI,UAAU;AAAA,UAEnC,YAAE;AAAA;AAAA,QATE,EAAE;AAAA,MAUT,CACD;AAAA,MACA,mCAAoB,IAAI,CAAC,MACxB;AAAA,QAAC;AAAA;AAAA,UAEC,MAAK;AAAA,UACL,oBAAkB,EAAE;AAAA,UACpB,WAAWA;AAAA,UACX,gBAAc,QAAQ,EAAE,GAAG;AAAA,UAC3B,OAAO,EAAE;AAAA,UACT,cAAY,EAAE;AAAA,UACd,SAAS,MAAM,WAAW,WAAW,EAAE,CAAC,EAAE,GAAG,GAAG,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC;AAAA,UAEhE,YAAE;AAAA;AAAA,QATE,EAAE;AAAA,MAUT,CACD;AAAA,MACA,MAAM,SAAS,YACd,8CAAC,WAAM,WAAU,mDAAkD;AAAA;AAAA,QAEjE;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,KAAK;AAAA,YACL,KAAK;AAAA,YACL,MAAM;AAAA,YACN,cAAW;AAAA,YACX,WAAU;AAAA,YACV,OAAO,QAAQ;AAAA,YACf,UAAU,CAAC,MAAM,WAAW,WAAW,EAAE,iBAAiB,WAAW,EAAE,OAAO,KAAK,EAAE,CAAC;AAAA;AAAA,QACxF;AAAA,SACF;AAAA,MAED,MAAM,SAAS,YACd,8CAAC,WAAM,WAAU,mDAAkD;AAAA;AAAA,QAEjE;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,KAAK;AAAA,YACL,MAAM;AAAA,YACN,cAAW;AAAA,YACX,WAAU;AAAA,YACV,OAAO,QAAQ;AAAA,YACf,UAAU,CAAC,MAAM;AACf,oBAAM,IAAI,WAAW,EAAE,OAAO,KAAK;AACnC,kBAAI,OAAO,SAAS,CAAC,KAAK,IAAI,EAAG,YAAW,WAAW,EAAE,YAAY,EAAE,CAAC;AAAA,YAC1E;AAAA;AAAA,QACF;AAAA,SACF;AAAA,MAED,MAAM,SAAS,iBACd;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,wBAAqB;AAAA,UACrB,WAAWA;AAAA,UACX,gBAAc,QAAQ,UAAU;AAAA,UAChC,OAAM;AAAA,UACN,cAAW;AAAA,UACX,SAAS,MAAM,WAAW,WAAW,EAAE,SAAS,QAAQ,UAAU,IAAI,IAAI,+BAAgB,CAAC;AAAA,UAC5F;AAAA;AAAA,MAED;AAAA,OAEJ;AAAA,IAED,eACC,6CAAC,SAAI,WAAU,gCAA+B,MAAK,SAAQ,cAAW,WACpE;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,4BAAyB;AAAA,QACzB,WAAWA;AAAA,QACX,gBAAc,MAAM;AAAA,QACpB,OAAO,yFAAyF,YAAY,CAAC,4BAA4B,YAAY,CAAC;AAAA,QACtJ,cAAW;AAAA,QACX,SAAS,MAAM,WAAW,eAAe,CAAC,MAAM,WAAW;AAAA,QAC5D;AAAA;AAAA,IAED,GACF;AAAA,IAED,aAAa,6CAAC,uBAAoB,YAAwB;AAAA,IAC1D,eACC,8EACE;AAAA,oDAAC,SAAI,WAAU,gCAA+B,MAAK,SAAQ,cAAW,WACpE;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,4BAAyB;AAAA,YACzB,WAAWA;AAAA,YACX,gBAAc;AAAA,YACd,OAAM;AAAA,YACN,cAAW;AAAA,YACX,SAAS,MAAM,QAAQ,CAAC,IAAI;AAAA,YAC7B;AAAA;AAAA,QAED;AAAA,QACC,IAAI,UAAK,SAAS,MAAM,WAAW,UAAU,SAAS,EAAE,KAAK,CAAC,GAAG,eAAe;AAAA,QAChF,IAAI,UAAK,YAAY,MAAM,WAAW,UAAU,YAAY,EAAE,KAAK,CAAC,GAAG,eAAe;AAAA,QACtF,IAAI,UAAK,aAAa,MAAM,WAAW,UAAU,aAAa,EAAE,KAAK,CAAC,GAAG,eAAe;AAAA,QACxF,IAAI,UAAK,WAAW,MAAM,WAAW,UAAU,WAAW,EAAE,KAAK,CAAC,GAAG,eAAe;AAAA,QACpF,IAAI,KAAK,SAAS,MAAM,WAAW,MAAM,GAAG,QAAQ,CAAC;AAAA,QACrD,IAAI,KAAK,WAAW,MAAM,WAAW,QAAQ,GAAG,CAAC,aAAa;AAAA,SACjE;AAAA,MACA,6CAAC,SAAI,WAAU,gCAA+B,MAAK,SAAQ,cAAW,cACnE,mDAA0B,IAAI,CAAC,MAC9B;AAAA,QAAC;AAAA;AAAA,UAEC,MAAK;AAAA,UACL,0BAAwB,EAAE;AAAA,UAC1B,WAAWA;AAAA,UACX,OAAO,EAAE;AAAA,UACT,cAAY,EAAE;AAAA,UACd,UAAU,QAAQ,EAAE;AAAA,UACpB,SAAS,MAAM,KAAK,WAAW,WAAW,EAAE,EAAE;AAAA,UAE7C,YAAE;AAAA;AAAA,QATE,EAAE;AAAA,MAUT,CACD,GACH;AAAA,MACA,8CAAC,SAAI,WAAU,gCAA+B,MAAK,SAAQ,cAAW,WACnE;AAAA,YAAI,UAAK,kBAAkB,MAAM,WAAW,QAAQ,OAAO,GAAG,QAAQ,CAAC;AAAA,QACvE,IAAI,UAAK,gBAAgB,MAAM,WAAW,QAAQ,MAAM,GAAG,QAAQ,CAAC;AAAA,QACpE,IAAI,UAAK,cAAc,MAAM,WAAW,MAAM,MAAM,GAAG,QAAQ,CAAC;AAAA,QAChE,IAAI,UAAK,gBAAgB,MAAM,WAAW,MAAM,QAAQ,GAAG,QAAQ,CAAC;AAAA,QACpE,IAAI,UAAK,eAAe,MAAM,WAAW,MAAM,OAAO,GAAG,QAAQ,CAAC;AAAA,QAClE,IAAI,UAAK,aAAa,MAAM,WAAW,MAAM,KAAK,GAAG,QAAQ,CAAC;AAAA,QAC9D,IAAI,UAAK,gBAAgB,MAAM,WAAW,MAAM,QAAQ,GAAG,QAAQ,CAAC;AAAA,QACpE,IAAI,UAAK,gBAAgB,MAAM,WAAW,MAAM,QAAQ,GAAG,QAAQ,CAAC;AAAA,SACvE;AAAA,OACF;AAAA,KAEJ;AAEJ;AAGA,SAAS,oBAAoB,EAAE,WAAW,GAA2C;AACnF,QAAM,QAAQ,qBAAqB,UAAU;AAC7C,QAAM,YAAQ,uCAAuB,KAAK;AAC1C,QAAM,IAAI,MAAM;AAChB,QAAM,WAAW,MAAM,IAAI,SAAS;AACpC,SACE,8CAAC,SAAI,WAAU,gCAA+B,MAAK,SAAQ,cAAW,SAAQ,8BAA2B,IACvG;AAAA,iDAAC,YAAO,MAAK,UAAS,4BAAyB,QAAO,WAAWA,cAAa,OAAM,cAAa,cAAW,cAAa,UAAU,CAAC,MAAM,UAAU,SAAS,MAAM,WAAW,MAAM,GAAG,oBAEvL;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,cAAW;AAAA,QACX,WAAU;AAAA,QACV,OAAO,EAAE;AAAA,QACT,UAAU,CAAC,UAAM,wCAAwB,YAAY,EAAE,SAAS,EAAE,OAAO,MAA4B,CAAC;AAAA,QAErG,+CAAsB,IAAI,CAAC,OAC1B,6CAAC,YAAgB,OAAO,IACrB,qDAA4B,EAAE,KADpB,EAEb,CACD;AAAA;AAAA,IACH;AAAA,IACC,EAAE,YAAY,iBACb;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,KAAK,EAAE,YAAY,UAAU,IAAI;AAAA,QACjC,MAAM;AAAA,QACN,cAAY,EAAE,YAAY,UAAU,gBAAgB;AAAA,QACpD,WAAU;AAAA,QACV,OAAO,EAAE,YAAY,UAAU,EAAE,QAAQ,EAAE;AAAA,QAC3C,UAAU,CAAC,MAAM;AACf,gBAAM,IAAI,WAAW,EAAE,OAAO,KAAK;AACnC,cAAI,CAAC,OAAO,SAAS,CAAC,KAAK,KAAK,EAAG;AACnC,sDAAwB,YAAY,EAAE,YAAY,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;AAAA,QAC5F;AAAA;AAAA,IACF;AAAA,IAEF;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,4BAAyB;AAAA,QACzB,WAAWA;AAAA,QACX,gBAAc,EAAE;AAAA,QAChB,OAAM;AAAA,QACN,cAAW;AAAA,QACX,SAAS,UAAM,wCAAwB,YAAY,EAAE,eAAe,CAAC,EAAE,cAAc,CAAC;AAAA,QACvF;AAAA;AAAA,IAED;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,4BAAyB;AAAA,QACzB,WAAWA;AAAA,QACX,OAAM;AAAA,QACN,cAAW;AAAA,QACX,UAAU,CAAC,MAAM;AAAA,QACjB,SAAS,MAAM,WAAW,kBAAkB;AAAA,QAC7C;AAAA;AAAA,IAED;AAAA,IACA,6CAAC,YAAO,MAAK,UAAS,4BAAyB,UAAS,WAAWA,cAAa,OAAM,gBAAe,cAAW,gBAAe,UAAU,CAAC,UAAU,SAAS,MAAM,WAAW,YAAY,GAAG,oBAE7L;AAAA,IACA,6CAAC,YAAO,MAAK,UAAS,4BAAyB,WAAU,WAAWA,cAAa,OAAM,iBAAgB,cAAW,iBAAgB,UAAU,CAAC,UAAU,SAAS,MAAM,WAAW,aAAa,GAAG,oBAEjM;AAAA,KACF;AAEJ;AAOA,IAAME,eAAc;AACpB,IAAMC,eAAc;AAOb,SAAS,iBAAiB,EAAE,YAAY,UAAU,GAA0B;AACjF,QAAM,QAAQ,qBAAqB,UAAU;AAC7C,QAAM,YAAQ,wCAAwB,KAAK;AAC3C,QAAM,IAAI,MAAM;AAChB,QAAM,SAAS,SAAS;AAAA,IACtB,MAAM,EAAE,QAAQ;AAAA,IAChB,QAAQ,EAAE,UAAU;AAAA,IACpB,aAAa,EAAE,eAAe;AAAA,IAC9B,SAAS;AAAA,IACT,aAAa,EAAE,eAAe;AAAA,IAC9B,YAAY,EAAE,cAAc;AAAA,IAC5B,UAAU,EAAE,YAAY;AAAA,IACxB,YAAY,EAAE,cAAc;AAAA,IAC5B,iBAAiB,EAAE,mBAAmB;AAAA,IACtC,eAAe,EAAE,iBAAiB;AAAA,IAClC,kBAAc,qCAAqB,EAAE,kBAAkB;AAAA,IACvD,cAAc,EAAE;AAAA,IAChB,YAAY,EAAE,cAAc;AAAA,IAC5B,SAAS;AAAA,IACT,aAAa;AAAA,EACf;AACA,QAAM,aAAa,CAAC,UAAwD;AAC1E,QAAI,CAAC,MAAO,YAAW,YAAY,EAAE,GAAI,MAAM,WAAW,SAAY,EAAE,cAAc,MAAM,OAAO,IAAI,CAAC,GAAI,GAAI,MAAM,OAAO,EAAE,YAAY,MAAM,KAAK,IAAI,CAAC,EAAG,CAAC;AAAA,aACtJ,MAAM,WAAW,OAAW,YAAW,gBAAgB,MAAM,MAAM;AAAA,aACnE,MAAM,KAAM,YAAW,cAAc,MAAM,IAAI;AAAA,EAC1D;AACA,QAAM,aAAa,CAAC,OAA0B;AAC5C,QAAI,MAAO,YAAW,gBAAgB,EAAE;AAAA,QACnC,YAAW,YAAY,EAAE,wBAAoB,mCAAmB,EAAE,GAAG,aAAS,mCAAmB,EAAE,IAAI,KAAK,CAAC;AAAA,EACpH;AACA,QAAM,QAAQ,CAAC,QAAmD,OAAO,MAAM,GAAG,IAAI,6CAAC,UAAK,WAAU,qCAAoC,mBAAK,IAAU;AACzJ,QAAM,WAAW,CAAC,KAAsB,UAAkB;AACxD,UAAM,MAAM,QAAQ,UAAU,eAAe;AAC7C,UAAM,WAAW,QAAQ,UAAU,oBAAoB;AACvD,WACE,8CAAC,SAAI,WAAU,2BAA0B,qBAAmB,KAC1D;AAAA,mDAAC,UAAK,WAAU,gCAAgC,iBAAM;AAAA,MACtD,8CAAC,YAAO,cAAY,GAAG,KAAK,cAAc,WAAWD,cAAa,OAAO,OAAO,GAAG,KAAK,IAAI,UAAU,CAAC,MAAM,MAAM,EAAE,CAAC,GAAG,GAAI,EAAE,OAAO,SAAS,KAAgC,CAAC,GAC9K;AAAA,qDAAC,YAAO,OAAM,IAAG,kBAAI;AAAA,QACpB,iCAAkB,IAAI,CAAC,MACtB,6CAAC,YAAe,OAAO,GACpB,iDAAwB,CAAC,KADf,CAEb,CACD;AAAA,SACH;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,KAAK;AAAA,UACL,MAAM;AAAA,UACN,cAAY,GAAG,KAAK;AAAA,UACpB,OAAM;AAAA,UACN,WAAWC;AAAA,UACX,OAAO,OAAO,QAAQ;AAAA,UACtB,UAAU,CAAC,MAAM;AACf,kBAAM,IAAI,WAAW,EAAE,OAAO,KAAK;AACnC,gBAAI,OAAO,SAAS,CAAC,KAAK,IAAI,EAAG,OAAM,EAAE,CAAC,QAAQ,GAAG,EAAE,CAAC;AAAA,UAC1D;AAAA;AAAA,MACF;AAAA,OACF;AAAA,EAEJ;AACA,QAAM,QAAQ,CAAC,UAAmC;AAChD,QAAI,MAAO,YAAW,SAAS,KAAK;AAAA,QAC/B,YAAW,YAAY,KAAK;AAAA,EACnC;AACA,QAAM,WAAW,CAAC,KAAwB,UAAkB;AAC1D,UAAM,QAAQ,OAAO,GAAG;AACxB,UAAM,UAAM,iCAAiB,KAAK;AAClC,UAAM,KAAK,UAAU,QAAQ,UAAU;AACvC,WACE,8CAAC,SAAI,WAAU,2BAA0B,qBAAmB,KAC1D;AAAA,oDAAC,WAAM,WAAU,0DACf;AAAA,qDAAC,WAAM,MAAK,YAAW,SAAS,IAAI,cAAY,GAAG,KAAK,OAAO,UAAU,CAAC,MAAM,MAAM,EAAE,CAAC,GAAG,GAAG,EAAE,OAAO,UAAW,OAAO,YAAa,KAAK,CAAC,GAAG;AAAA,QAC/I;AAAA,SACH;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,cAAY,GAAG,KAAK;AAAA,UACpB,WAAU;AAAA,UACV,UAAU,CAAC;AAAA,UACX,OAAO,OAAO;AAAA,UACd,UAAU,CAAC,MAAM,MAAM,EAAE,CAAC,GAAG,GAAG,EAAE,OAAO,MAAM,CAAC;AAAA;AAAA,MAClD;AAAA,MACC,MAAM,CAAC,OAAO,6CAAC,UAAK,WAAU,8CAA8C,iBAAO,UAAU,WAAW,QAAQ,YAAW;AAAA,MAC3H,OAAO,MAAM,GAAG,KAAK,6CAAC,UAAK,WAAU,qCAAoC,mBAAK;AAAA,OACjF;AAAA,EAEJ;AACA,SACE,8CAAC,SAAI,WAAW,aAAa,aAAa,EAAE,IAAI,cAAY,QAAQ,oBAAoB,mBACtF;AAAA,iDAAC,OAAE,WAAU,yEAAyE,kBAAQ,cAAc,cAAa;AAAA,IACxH,SAAS,QAAQ,MAAM;AAAA,IACvB,SAAS,UAAU,QAAQ;AAAA,IAC3B,SAAS,6CAAC,wBAAqB,YAAwB;AAAA,IACxD,8CAAC,WAAM,WAAU,mDACf;AAAA,mDAAC,UAAK,WAAU,QAAO,mBAAK;AAAA,MAC5B;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,KAAK;AAAA,UACL,MAAM;AAAA,UACN,cAAW;AAAA,UACX,WAAU;AAAA,UACV,OAAO,OAAO;AAAA,UACd,UAAU,CAAC,MAAM;AACf,kBAAM,IAAI,WAAW,EAAE,OAAO,KAAK;AACnC,gBAAI,OAAO,SAAS,CAAC,KAAK,KAAK,EAAG,OAAM,EAAE,aAAa,EAAE,CAAC;AAAA,UAC5D;AAAA;AAAA,MACF;AAAA,OACF;AAAA,IACA,8CAAC,WAAM,WAAU,mDAAkD,qBAAkB,eACnF;AAAA,mDAAC,UAAK,WAAU,QAAO,mBAAK;AAAA,MAC5B,6CAAC,YAAO,cAAW,oBAAmB,WAAWD,cAAa,OAAO,OAAO,aAAa,UAAU,CAAC,MAAM,MAAM,EAAE,aAAa,EAAE,OAAO,MAA2B,CAAC,GAChK,iBAAO,KAAK,yCAA0B,EAA0B,IAAI,CAAC,MACrE,6CAAC,YAAe,OAAO,GACpB,oDAA2B,CAAC,KADlB,CAEb,CACD,GACH;AAAA,MACC,MAAM,aAAa;AAAA,OACtB;AAAA,IACA,8CAAC,SAAI,WAAU,mDAAkD,qBAAkB,gBACjF;AAAA,mDAAC,UAAK,WAAU,QAAO,qBAAO;AAAA,MAC9B;AAAA,QAAC;AAAA;AAAA,UACC,cAAW;AAAA,UACX,WAAWA;AAAA,UACX,OAAO,OAAO;AAAA,UACd,UAAU,CAAC,MAAM;AACf,gBAAI,EAAE,OAAO,UAAU,SAAU,YAAW,EAAE,OAAO,KAA0B;AAAA,UACjF;AAAA,UAEC;AAAA,gDAAqB,IAAI,CAAC,MACzB,6CAAC,YAAkB,OAAO,EAAE,IACzB,YAAE,SADQ,EAAE,EAEf,CACD;AAAA,YACA,OAAO,iBAAiB,YACvB,6CAAC,YAAO,OAAM,UAAS,UAAQ,MAAC,oBAEhC;AAAA;AAAA;AAAA,MAEJ;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAWF;AAAA,UACX,OAAM;AAAA,UACN,cAAW;AAAA,UACX,UAAU,OAAO,iBAAiB,aAAa,CAAC,OAAO,MAAM;AAAA,UAC7D,SAAS,MAAM,WAAW,SAAS;AAAA,UACpC;AAAA;AAAA,MAED;AAAA,MACC,MAAM,cAAc;AAAA,OACvB;AAAA,IACC,OAAO,eACN,8EACG;AAAA,eAAS,SAAS,OAAO;AAAA,MACzB,SAAS,OAAO,KAAK;AAAA,OACpB,OAAO,cAAc,OAAO,aAC5B,8CAAC,WAAM,WAAU,mDAAkD,qBAAkB,cACnF;AAAA,qDAAC,UAAK,WAAU,QAAO,mBAAK;AAAA,QAC5B,8CAAC,YAAO,cAAW,uBAAsB,WAAWE,cAAa,OAAO,OAAO,YAAY,UAAU,CAAC,MAAM,MAAM,EAAE,YAAY,EAAE,OAAO,MAAM,CAAC,GAC9I;AAAA,uDAAC,YAAO,OAAM,UAAS,0BAAY;AAAA,UACnC,6CAAC,YAAO,OAAM,OAAM,wBAAU;AAAA,WAChC;AAAA,SACF;AAAA,OAEJ;AAAA,IAED,OAAO,UAAU,KAChB,8CAAC,SAAI,WAAU,2BAA0B,qBAAkB,WACzD;AAAA,mDAAC,UAAK,WAAU,gCAA+B,qBAAO;AAAA,MACtD;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,KAAK;AAAA,UACL,MAAM;AAAA,UACN,cAAW;AAAA,UACX,WAAWC;AAAA,UACX,OAAO,KAAK,MAAM,OAAO,eAAe,GAAG,IAAI;AAAA,UAC/C,UAAU,CAAC,MAAM;AACf,kBAAM,IAAI,WAAW,EAAE,OAAO,KAAK;AACnC,gBAAI,OAAO,SAAS,CAAC,KAAK,KAAK,EAAG,YAAW,EAAE,QAAQ,EAAE,CAAC;AAAA,UAC5D;AAAA;AAAA,MACF;AAAA,MACA,6CAAC,YAAO,cAAW,eAAc,WAAWD,cAAa,OAAO,OAAO,YAAY,UAAU,CAAC,MAAM,WAAW,EAAE,MAAM,EAAE,OAAO,MAA0B,CAAC,GACxJ,6CAAoB,IAAI,CAAC,MACxB,6CAAC,YAAe,OAAO,GACpB,mDAA0B,CAAC,KADjB,CAEb,CACD,GACH;AAAA,MACC,MAAM,cAAc;AAAA,OACvB;AAAA,IAED,SACC,8CAAC,WAAM,WAAU,mDACf;AAAA,mDAAC,UAAK,WAAU,QAAO,qBAAO;AAAA,MAC9B;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,KAAK;AAAA,UACL,KAAK;AAAA,UACL,MAAM;AAAA,UACN,cAAW;AAAA,UACX,WAAU;AAAA,UACV,OAAO,OAAO;AAAA,UACd,UAAU,CAAC,MAAM,MAAM,EAAE,SAAS,WAAW,EAAE,OAAO,KAAK,EAAE,CAAC;AAAA;AAAA,MAChE;AAAA,OACF;AAAA,IAED,SAAS,6CAAC,sBAAmB,YAAwB;AAAA,IACrD,SAAS,6CAAC,uBAAoB,YAAwB;AAAA,KACzD;AAEJ;;;AIziBM,IAAAE,sBAAA;AAHC,SAAS,aAAa,EAAE,YAAY,OAAO,iBAAiB,MAAM,SAAS,KAAK,aAAa,UAAU,GAAsB;AAClI,SACE,8CAAC,SAAI,WAAW,uBAAuB,aAAa,EAAE,IAAI,sBAAmB,IAC3E;AAAA,iDAAC,iBAAc,YAAwB,OAAc;AAAA,IACrD,8CAAC,SAAI,WAAU,2CACb;AAAA,mDAAC,SAAI,WAAU,6FAA4F,OAAO,EAAE,OAAO,GACzH,uDAAC,gBAAa,YAAyB,GAAG,aAAa,GACzD;AAAA,MACC,kBAAkB,6CAAC,oBAAiB,YAAwB,WAAU,+DAA8D;AAAA,OACvI;AAAA,KACF;AAEJ;","names":["import_react","import_vector","import_react","import_vector","THEME","import_jsx_runtime","THEME","text","import_react","import_vector","import_vector","import_jsx_runtime","import_react","import_vector","import_jsx_runtime","buttonClass","numberClass","selectClass","labelClass","React","import_vector","import_jsx_runtime","selectClass","numberClass","buttonClass","import_jsx_runtime","buttonClass","React","selectClass","numberClass","import_jsx_runtime"]}
|