@usetheo/ui 0.1.0-next.0 → 0.1.0-next.1
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/CHANGELOG.md +14 -0
- package/README.md +116 -9
- package/dist/index.d.ts +1 -1
- package/dist/index.js.map +1 -1
- package/dist/plugin-Atb0VKtr.d.ts +172 -0
- package/dist/slide/index.d.ts +212 -0
- package/dist/slide/index.js +714 -0
- package/dist/slide/index.js.map +1 -0
- package/dist/slide/plugins/emoji/index.d.ts +29 -0
- package/dist/slide/plugins/emoji/index.js +157 -0
- package/dist/slide/plugins/emoji/index.js.map +1 -0
- package/dist/slide/plugins/math/index.d.ts +13 -0
- package/dist/slide/plugins/math/index.js +145 -0
- package/dist/slide/plugins/math/index.js.map +1 -0
- package/dist/slide/plugins/mermaid/index.d.ts +55 -0
- package/dist/slide/plugins/mermaid/index.js +218 -0
- package/dist/slide/plugins/mermaid/index.js.map +1 -0
- package/dist/slide/plugins/shiki/index.d.ts +18 -0
- package/dist/slide/plugins/shiki/index.js +87 -0
- package/dist/slide/plugins/shiki/index.js.map +1 -0
- package/dist/slide/themes/default.css +256 -0
- package/dist/slide/themes/layouts.css +143 -0
- package/dist/slide/themes/violet-forge.css +256 -0
- package/dist/slide-deck/index.css +52 -0
- package/dist/slide-deck/index.css.map +1 -0
- package/dist/slide-deck/index.d.ts +377 -0
- package/dist/slide-deck/index.js +1797 -0
- package/dist/slide-deck/index.js.map +1 -0
- package/dist/whiteboard/index.d.ts +258 -0
- package/dist/whiteboard/index.js +738 -0
- package/dist/whiteboard/index.js.map +1 -0
- package/package.json +141 -9
- package/registry/r/agent-composer.json +4 -4
- package/registry/r/agent-editor.json +9 -9
- package/registry/r/agent-error-card.json +2 -2
- package/registry/r/agent-event.json +4 -4
- package/registry/r/agent-handoff.json +2 -2
- package/registry/r/agent-profile.json +2 -2
- package/registry/r/agent-starting-state.json +2 -2
- package/registry/r/agent-stream.json +9 -9
- package/registry/r/agent-streaming.json +2 -2
- package/registry/r/agent-timeline.json +4 -4
- package/registry/r/approval-card.json +4 -4
- package/registry/r/artifact-preview.json +2 -2
- package/registry/r/attachment-chip.json +4 -4
- package/registry/r/audit-log-entry.json +3 -3
- package/registry/r/auto-compact-notice.json +2 -2
- package/registry/r/avatar.json +2 -2
- package/registry/r/badge.json +2 -2
- package/registry/r/browser-controls.json +2 -2
- package/registry/r/build-log-stream.json +2 -2
- package/registry/r/button.json +2 -2
- package/registry/r/capability-indicator.json +3 -3
- package/registry/r/card.json +2 -2
- package/registry/r/chat-composer.json +3 -3
- package/registry/r/chat-message.json +3 -3
- package/registry/r/chat-thread.json +2 -2
- package/registry/r/checkbox.json +2 -2
- package/registry/r/command-palette.json +4 -4
- package/registry/r/context-card.json +3 -3
- package/registry/r/context-window-bar.json +2 -2
- package/registry/r/cost-meter.json +2 -2
- package/registry/r/created-files-card.json +3 -3
- package/registry/r/cron-job-card.json +2 -2
- package/registry/r/cron-jobs-list.json +3 -3
- package/registry/r/deployment-row.json +3 -3
- package/registry/r/dialog.json +2 -2
- package/registry/r/diff-viewer.json +2 -2
- package/registry/r/domain-config.json +6 -6
- package/registry/r/empty-state.json +3 -3
- package/registry/r/env-var-editor.json +5 -5
- package/registry/r/folder-context-card.json +3 -3
- package/registry/r/folder-selector.json +2 -2
- package/registry/r/form-field.json +2 -2
- package/registry/r/hook-config.json +2 -2
- package/registry/r/hook-event-log.json +2 -2
- package/registry/r/input.json +2 -2
- package/registry/r/intent-selector.json +3 -3
- package/registry/r/label.json +2 -2
- package/registry/r/lane-board.json +2 -2
- package/registry/r/login-split.json +2 -2
- package/registry/r/mcp-server-card.json +2 -2
- package/registry/r/mcp-server-list.json +3 -3
- package/registry/r/memory-editor.json +3 -3
- package/registry/r/mention-menu.json +3 -3
- package/registry/r/metrics-panel.json +2 -2
- package/registry/r/model-card.json +3 -3
- package/registry/r/model-selector.json +2 -2
- package/registry/r/permission-matrix.json +2 -2
- package/registry/r/permission-modal.json +4 -4
- package/registry/r/preview-env-card.json +5 -5
- package/registry/r/preview-panel.json +3 -3
- package/registry/r/progress-checklist.json +3 -3
- package/registry/r/project-card.json +5 -5
- package/registry/r/project-switcher.json +2 -2
- package/registry/r/quick-action-chips.json +3 -3
- package/registry/r/radio-group.json +2 -2
- package/registry/r/recent-folders-list.json +2 -2
- package/registry/r/rollback-ui.json +4 -4
- package/registry/r/rule-card.json +3 -3
- package/registry/r/rule-editor.json +10 -10
- package/registry/r/rule-types.json +1 -1
- package/registry/r/run-stats.json +2 -2
- package/registry/r/running-tasks-panel.json +2 -2
- package/registry/r/scroll-area.json +2 -2
- package/registry/r/select.json +2 -2
- package/registry/r/session-list-item.json +2 -2
- package/registry/r/session-timeline.json +2 -2
- package/registry/r/sheet.json +2 -2
- package/registry/r/sidebar.json +2 -2
- package/registry/r/skeleton.json +2 -2
- package/registry/r/skill-card.json +4 -4
- package/registry/r/skill-editor.json +10 -10
- package/registry/r/skills-list.json +3 -3
- package/registry/r/social-auth-row.json +3 -3
- package/registry/r/steps-rail.json +2 -2
- package/registry/r/sub-agent-dispatch.json +2 -2
- package/registry/r/switch.json +2 -2
- package/registry/r/system-prompt-editor.json +2 -2
- package/registry/r/tabs.json +2 -2
- package/registry/r/task-header.json +4 -4
- package/registry/r/task-plan.json +2 -2
- package/registry/r/terminal-panel.json +2 -2
- package/registry/r/textarea.json +2 -2
- package/registry/r/theme-provider.json +2 -2
- package/registry/r/theme-script.json +1 -1
- package/registry/r/theo-ui-provider.json +2 -2
- package/registry/r/toast.json +2 -2
- package/registry/r/token-usage-chart.json +2 -2
- package/registry/r/tool-call-card.json +3 -3
- package/registry/r/tool-call.json +2 -2
- package/registry/r/tool-result.json +2 -2
- package/registry/r/tools-list.json +3 -3
- package/registry/r/tooltip.json +2 -2
- package/registry/r/topnav.json +2 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/primitives/whiteboard/seed.ts","../../src/components/primitives/whiteboard/render/freedraw.tsx","../../src/components/primitives/whiteboard/render/rough-paths.ts","../../src/components/primitives/whiteboard/render/style.ts","../../src/components/primitives/whiteboard/render/line.tsx","../../src/components/primitives/whiteboard/render/shape.tsx","../../src/components/primitives/whiteboard/render/text.tsx","../../src/components/primitives/whiteboard/render/scene.tsx","../../src/components/primitives/whiteboard/schema.ts","../../src/components/primitives/whiteboard/validate.ts","../../src/components/primitives/whiteboard/viewport/use-pointer-pan.ts","../../src/components/primitives/whiteboard/viewport/use-viewport.ts","../../src/components/primitives/whiteboard/whiteboard.tsx"],"names":["strokeStyle","jsx","jsxs","align","fontFamily","z","useCallback","useMemo","useEffect","useRef"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Deterministic seed derivation for rough.js — see ADR D9.\n *\n * rough.js uses pseudo-randomness to produce the hand-drawn look. Without a\n * stable seed every render shifts the strokes slightly, breaking snapshot\n * tests, causing SSR hydration mismatches, and visible jitter when the parent\n * re-renders. FNV-1a 32-bit gives us a fast, dependency-free hash.\n */\n\nconst FNV_OFFSET_BASIS_32 = 0x811c9dc5;\nconst FNV_PRIME_32 = 0x01000193;\n\n/** FNV-1a 32-bit hash. Returns a signed 32-bit integer. */\nexport function fnv1a32(input: string): number {\n let hash = FNV_OFFSET_BASIS_32;\n for (let i = 0; i < input.length; i++) {\n hash ^= input.charCodeAt(i);\n // Multiply by the FNV prime, but keep within 32-bit unsigned range.\n hash = Math.imul(hash, FNV_PRIME_32);\n }\n // Cast to signed 32-bit via `| 0`.\n return hash | 0;\n}\n\ninterface SeedableShape {\n type: string;\n x: number;\n y: number;\n w?: number;\n h?: number;\n label?: string;\n seed?: number;\n}\n\n/** Return the element's explicit `seed` or derive a stable one from its props. */\nexport function deriveSeed(el: SeedableShape): number {\n if (typeof el.seed === \"number\" && Number.isFinite(el.seed)) {\n return el.seed | 0;\n }\n // Compose a key from the dimensions that visually define the shape. Other\n // fields (colors, opacity) don't change the underlying rough.js geometry.\n const key = `${el.type}|${el.x}|${el.y}|${el.w ?? \"\"}|${el.h ?? \"\"}|${el.label ?? \"\"}`;\n return fnv1a32(key);\n}\n","import { getStroke } from \"perfect-freehand\";\nimport type { FreedrawElement } from \"../schema.js\";\n\nconst DEFAULT_STROKE_OPTIONS = {\n size: 8,\n thinning: 0.5,\n smoothing: 0.5,\n streamline: 0.5,\n};\n\nfunction fmt(n: number | undefined): string {\n return typeof n === \"number\" && Number.isFinite(n) ? n.toFixed(2) : \"0\";\n}\n\nfunction svgPathFromStroke(points: number[][]): string {\n if (points.length === 0) return \"\";\n const first = points[0] ?? [];\n let d = `M ${fmt(first[0])} ${fmt(first[1])}`;\n for (let i = 1; i < points.length; i++) {\n const p = points[i] ?? [];\n d += ` L ${fmt(p[0])} ${fmt(p[1])}`;\n }\n d += \" Z\";\n return d;\n}\n\nexport function renderFreedraw(el: FreedrawElement): React.ReactNode {\n const size = (el.strokeWidth ?? 1.5) * 5;\n const inputPoints = el.points.map(([x, y, pressure]) => {\n const tx = el.x + x;\n const ty = el.y + y;\n return pressure === undefined ? [tx, ty] : [tx, ty, pressure];\n });\n const stroke = getStroke(inputPoints, {\n ...DEFAULT_STROKE_OPTIONS,\n size,\n });\n const d = svgPathFromStroke(stroke as number[][]);\n return (\n <g opacity={el.opacity ?? 1}>\n <path d={d} fill={el.stroke ?? \"currentColor\"} stroke=\"none\" />\n </g>\n );\n}\n","/**\n * Thin adapter over `roughjs` — converts a `Drawable` into the array of\n * `<path>` descriptors we render in SVG. The actual `rough.generator()`\n * instance is created once per scene and reused across elements.\n */\nimport type { Drawable, Options } from \"roughjs/bin/core.js\";\nimport type { RoughGenerator } from \"roughjs/bin/generator.js\";\n\nexport interface RoughPath {\n d: string;\n stroke: string;\n strokeWidth: number;\n fill?: string;\n}\n\nexport type RoughOptions = Options;\n\n/** Convert a rough.js Drawable into renderable SVG path descriptors. */\nexport function toRoughPaths(generator: RoughGenerator, drawable: Drawable): RoughPath[] {\n const paths = generator.toPaths(drawable);\n return paths.map((p) => ({\n d: p.d,\n stroke: p.stroke,\n strokeWidth: p.strokeWidth,\n fill: p.fill,\n }));\n}\n","/**\n * Maps a `WhiteboardElement` style props onto rough.js `Options`.\n */\nimport type { Options } from \"roughjs/bin/core.js\";\n\ninterface StyleSource {\n stroke?: string;\n strokeWidth?: number;\n strokeStyle?: \"solid\" | \"dashed\" | \"dotted\";\n fill?: string;\n fillStyle?: \"hachure\" | \"solid\" | \"cross-hatch\" | \"zigzag\";\n opacity?: number;\n roughness?: number;\n}\n\nconst DEFAULT_STROKE = \"currentColor\";\n\nexport function buildOptions(src: StyleSource, seed: number): Options {\n const o: Options = {\n seed,\n stroke: src.stroke ?? DEFAULT_STROKE,\n strokeWidth: src.strokeWidth ?? 1.5,\n roughness: src.roughness ?? 1.2,\n };\n if (src.strokeStyle === \"dashed\") o.strokeLineDash = [10, 6];\n else if (src.strokeStyle === \"dotted\") o.strokeLineDash = [2, 4];\n if (src.fill) o.fill = src.fill;\n if (src.fillStyle) o.fillStyle = src.fillStyle;\n return o;\n}\n\n/**\n * SVG `stroke-dasharray` value for a logical strokeStyle. rough.js's\n * `RoughGenerator.toPaths()` does NOT propagate `strokeLineDash` into the\n * returned `PathInfo` — only the canvas / direct-SVG backends apply it. We\n * must set the attribute ourselves on the rendered `<path>`. Returns\n * `undefined` for `solid` and any unknown value.\n */\nexport function strokeDashArray(\n strokeStyle: StyleSource[\"strokeStyle\"],\n strokeWidth: number,\n): string | undefined {\n if (strokeStyle === \"dashed\") {\n const dash = Math.max(8, strokeWidth * 6);\n const gap = Math.max(5, strokeWidth * 4);\n return `${dash} ${gap}`;\n }\n if (strokeStyle === \"dotted\") {\n // 1×strokeWidth dot, ~2×strokeWidth gap. Round end caps make these look\n // like dots instead of squares.\n return `${strokeWidth} ${strokeWidth * 2.5}`;\n }\n return undefined;\n}\n\nexport { DEFAULT_STROKE };\n","import type { RoughGenerator } from \"roughjs/bin/generator.js\";\nimport type { ArrowElement, LineElement } from \"../schema.js\";\nimport { toRoughPaths } from \"./rough-paths.js\";\nimport { buildOptions, strokeDashArray } from \"./style.js\";\n\nconst HEAD_BASE_PX = 12;\nconst HEAD_ANGLE_RAD = Math.PI / 7; // ~25°\n\ninterface HeadGeom {\n apexX: number;\n apexY: number;\n leftX: number;\n leftY: number;\n rightX: number;\n rightY: number;\n}\n\nfunction arrowHeadGeometry(\n fromX: number,\n fromY: number,\n toX: number,\n toY: number,\n strokeWidth: number,\n): HeadGeom | null {\n const dx = toX - fromX;\n const dy = toY - fromY;\n const dist = Math.sqrt(dx * dx + dy * dy);\n if (dist === 0) return null;\n const angle = Math.atan2(dy, dx);\n // EC-7: clamp head length so it never exceeds 40% of the segment.\n const headLen = Math.min(HEAD_BASE_PX + strokeWidth * 2, dist * 0.4);\n const leftX = toX - headLen * Math.cos(angle - HEAD_ANGLE_RAD);\n const leftY = toY - headLen * Math.sin(angle - HEAD_ANGLE_RAD);\n const rightX = toX - headLen * Math.cos(angle + HEAD_ANGLE_RAD);\n const rightY = toY - headLen * Math.sin(angle + HEAD_ANGLE_RAD);\n return { apexX: toX, apexY: toY, leftX, leftY, rightX, rightY };\n}\n\nfunction lineBody(\n gen: RoughGenerator,\n el: LineElement | ArrowElement,\n seed: number,\n): React.ReactNode[] {\n const opts = buildOptions(el, seed);\n const drawable = gen.line(el.x, el.y, el.to[0], el.to[1], opts);\n const dash = strokeDashArray(el.strokeStyle, el.strokeWidth ?? 1.5);\n return toRoughPaths(gen, drawable).map((p, i) => (\n <path\n // biome-ignore lint/suspicious/noArrayIndexKey: stable rough.js path order\n key={`body-${i}`}\n d={p.d}\n stroke={p.stroke}\n strokeWidth={p.strokeWidth}\n fill=\"none\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeDasharray={dash}\n />\n ));\n}\n\nfunction arrowHead(\n gen: RoughGenerator,\n fromX: number,\n fromY: number,\n toX: number,\n toY: number,\n seed: number,\n el: ArrowElement,\n side: \"start\" | \"end\",\n): React.ReactNode[] {\n const geom = arrowHeadGeometry(fromX, fromY, toX, toY, el.strokeWidth ?? 1.5);\n if (!geom) return [];\n const opts = buildOptions(el, seed);\n // Two short rough-drawn segments forming the V.\n const leftDrawable = gen.line(geom.apexX, geom.apexY, geom.leftX, geom.leftY, opts);\n const rightDrawable = gen.line(geom.apexX, geom.apexY, geom.rightX, geom.rightY, opts);\n const leftPaths = toRoughPaths(gen, leftDrawable);\n const rightPaths = toRoughPaths(gen, rightDrawable);\n const nodes: React.ReactNode[] = [];\n for (const [i, p] of leftPaths.entries()) {\n nodes.push(\n <path\n key={`${side}-l-${i}`}\n d={p.d}\n stroke={p.stroke}\n strokeWidth={p.strokeWidth}\n fill=\"none\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n data-line-part=\"arrowhead\"\n />,\n );\n }\n for (const [i, p] of rightPaths.entries()) {\n nodes.push(\n <path\n key={`${side}-r-${i}`}\n d={p.d}\n stroke={p.stroke}\n strokeWidth={p.strokeWidth}\n fill=\"none\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n data-line-part=\"arrowhead\"\n />,\n );\n }\n return nodes;\n}\n\nexport function renderLine(gen: RoughGenerator, el: LineElement): React.ReactNode {\n return <g opacity={el.opacity ?? 1}>{lineBody(gen, el, el.seed ?? 0)}</g>;\n}\n\nexport function renderArrow(gen: RoughGenerator, el: ArrowElement): React.ReactNode {\n const seed = el.seed ?? 0;\n const nodes: React.ReactNode[] = [...lineBody(gen, el, seed)];\n if (el.headEnd !== false) {\n nodes.push(...arrowHead(gen, el.x, el.y, el.to[0], el.to[1], seed + 1, el, \"end\"));\n }\n if (el.headStart) {\n nodes.push(...arrowHead(gen, el.to[0], el.to[1], el.x, el.y, seed + 2, el, \"start\"));\n }\n let label: React.ReactNode = null;\n if (el.label) {\n const midX = (el.x + el.to[0]) / 2;\n const midY = (el.y + el.to[1]) / 2;\n // Offset perpendicular to the line so label doesn't sit on the stroke.\n const dx = el.to[0] - el.x;\n const dy = el.to[1] - el.y;\n const dist = Math.sqrt(dx * dx + dy * dy) || 1;\n const nx = -dy / dist;\n const ny = dx / dist;\n const offset = 12;\n label = (\n <text\n x={midX + nx * offset}\n y={midY + ny * offset}\n textAnchor=\"middle\"\n dominantBaseline=\"central\"\n fontSize={14}\n fontFamily=\"ui-sans-serif, system-ui, sans-serif\"\n fill={el.stroke ?? \"currentColor\"}\n style={{ pointerEvents: \"none\" }}\n >\n {el.label}\n </text>\n );\n }\n return (\n <g opacity={el.opacity ?? 1}>\n {nodes}\n {label}\n </g>\n );\n}\n","import type { RoughGenerator } from \"roughjs/bin/generator.js\";\nimport type { DiamondElement, EllipseElement, RectElement } from \"../schema.js\";\nimport { toRoughPaths } from \"./rough-paths.js\";\nimport { buildOptions, strokeDashArray } from \"./style.js\";\n\ninterface LabelProps {\n cx: number;\n cy: number;\n label: string;\n stroke?: string;\n}\n\nfunction Label({ cx, cy, label, stroke }: LabelProps) {\n return (\n <text\n x={cx}\n y={cy}\n textAnchor=\"middle\"\n dominantBaseline=\"central\"\n fontSize={16}\n fontFamily=\"ui-sans-serif, system-ui, sans-serif\"\n fill={stroke ?? \"currentColor\"}\n style={{ pointerEvents: \"none\" }}\n >\n {label}\n </text>\n );\n}\n\nfunction pathsToReactNodes(\n paths: ReturnType<typeof toRoughPaths>,\n keyPrefix: string,\n outlineStroke: string,\n dashArray?: string,\n): React.ReactNode[] {\n return paths.map((p, i) => {\n // Apply stroke-dasharray only to paths whose stroke matches the outline\n // color — this avoids dashing hachure/cross-hatch fill lines (which are\n // stroked in the fill color, not the outline color) when a shape mixes\n // fillStyle with strokeStyle.\n const isOutline = p.stroke === outlineStroke;\n return (\n <path\n // biome-ignore lint/suspicious/noArrayIndexKey: rough.js path order is stable for a given (geometry, seed) tuple — index is the most precise key.\n key={`${keyPrefix}-${i}`}\n d={p.d}\n stroke={p.stroke}\n strokeWidth={p.strokeWidth}\n fill={p.fill ?? \"none\"}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeDasharray={isOutline ? dashArray : undefined}\n />\n );\n });\n}\n\nexport function renderRect(gen: RoughGenerator, el: RectElement): React.ReactNode {\n const opts = buildOptions(el, el.seed ?? 0);\n const drawable = gen.rectangle(el.x, el.y, el.w, el.h, opts);\n const paths = toRoughPaths(gen, drawable);\n const dash = strokeDashArray(el.strokeStyle, el.strokeWidth ?? 1.5);\n return (\n <g opacity={el.opacity ?? 1}>\n {pathsToReactNodes(paths, \"rect\", opts.stroke as string, dash)}\n {el.label ? (\n <Label cx={el.x + el.w / 2} cy={el.y + el.h / 2} label={el.label} stroke={el.stroke} />\n ) : null}\n </g>\n );\n}\n\nexport function renderEllipse(gen: RoughGenerator, el: EllipseElement): React.ReactNode {\n const opts = buildOptions(el, el.seed ?? 0);\n // rough.js ellipse takes center + width + height.\n const drawable = gen.ellipse(el.x + el.w / 2, el.y + el.h / 2, el.w, el.h, opts);\n const paths = toRoughPaths(gen, drawable);\n const dash = strokeDashArray(el.strokeStyle, el.strokeWidth ?? 1.5);\n return (\n <g opacity={el.opacity ?? 1}>\n {pathsToReactNodes(paths, \"ellipse\", opts.stroke as string, dash)}\n {el.label ? (\n <Label cx={el.x + el.w / 2} cy={el.y + el.h / 2} label={el.label} stroke={el.stroke} />\n ) : null}\n </g>\n );\n}\n\nexport function renderDiamond(gen: RoughGenerator, el: DiamondElement): React.ReactNode {\n const opts = buildOptions(el, el.seed ?? 0);\n const cx = el.x + el.w / 2;\n const cy = el.y + el.h / 2;\n const points: [number, number][] = [\n [cx, el.y], // top\n [el.x + el.w, cy], // right\n [cx, el.y + el.h], // bottom\n [el.x, cy], // left\n ];\n const drawable = gen.polygon(points, opts);\n const paths = toRoughPaths(gen, drawable);\n const dash = strokeDashArray(el.strokeStyle, el.strokeWidth ?? 1.5);\n return (\n <g opacity={el.opacity ?? 1}>\n {pathsToReactNodes(paths, \"diamond\", opts.stroke as string, dash)}\n {el.label ? <Label cx={cx} cy={cy} label={el.label} stroke={el.stroke} /> : null}\n </g>\n );\n}\n","import type { TextElement } from \"../schema.js\";\n\nconst FONT_STACKS: Record<NonNullable<TextElement[\"fontFamily\"]>, string> = {\n sans: \"ui-sans-serif, system-ui, sans-serif\",\n serif: \"ui-serif, Georgia, serif\",\n mono: \"ui-monospace, SFMono-Regular, Menlo, monospace\",\n hand: '\"Virgil\", \"Caveat\", \"Comic Sans MS\", cursive',\n};\n\nfunction textAnchor(align: TextElement[\"align\"]): \"start\" | \"middle\" | \"end\" {\n if (align === \"center\") return \"middle\";\n if (align === \"right\") return \"end\";\n return \"start\";\n}\n\nexport function renderText(el: TextElement): React.ReactNode {\n const fontSize = el.fontSize ?? 18;\n const fontFamily = FONT_STACKS[el.fontFamily ?? \"hand\"];\n const anchor = textAnchor(el.align);\n const lines = el.text.split(\"\\n\");\n // dy: first tspan at 0, subsequent at fontSize * 1.2 line-height.\n return (\n <g opacity={el.opacity ?? 1}>\n <text\n x={el.x}\n y={el.y}\n textAnchor={anchor}\n dominantBaseline=\"hanging\"\n fontSize={fontSize}\n fontFamily={fontFamily}\n fill={el.stroke ?? \"currentColor\"}\n >\n {lines.map((line, i) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: text is split deterministically on '\\n' so the line index is the most stable key.\n <tspan key={i} x={el.x} dy={i === 0 ? 0 : fontSize * 1.2}>\n {line}\n </tspan>\n ))}\n </text>\n </g>\n );\n}\n","import type { RoughGenerator } from \"roughjs/bin/generator.js\";\nimport type { WhiteboardElement, WhiteboardScene } from \"../schema.js\";\nimport { deriveSeed } from \"../seed.js\";\nimport { renderFreedraw } from \"./freedraw.js\";\nimport { renderArrow, renderLine } from \"./line.js\";\nimport { renderDiamond, renderEllipse, renderRect } from \"./shape.js\";\nimport { renderText } from \"./text.js\";\n\nfunction elementWithSeed<T extends WhiteboardElement>(el: T): T {\n if (typeof el.seed === \"number\") return el;\n return { ...el, seed: deriveSeed(el) } as T;\n}\n\nfunction renderElement(el: WhiteboardElement, gen: RoughGenerator): React.ReactNode {\n switch (el.type) {\n case \"rect\":\n return renderRect(gen, elementWithSeed(el));\n case \"ellipse\":\n return renderEllipse(gen, elementWithSeed(el));\n case \"diamond\":\n return renderDiamond(gen, elementWithSeed(el));\n case \"line\":\n return renderLine(gen, elementWithSeed(el));\n case \"arrow\":\n return renderArrow(gen, elementWithSeed(el));\n case \"text\":\n return renderText(elementWithSeed(el));\n case \"freedraw\":\n return renderFreedraw(elementWithSeed(el));\n }\n}\n\nexport function renderScene(scene: WhiteboardScene, gen: RoughGenerator): React.ReactNode {\n return (\n <>\n {scene.elements.map((el, i) => (\n <g\n key={el.id ?? `__idx-${i}`}\n data-element-id={el.id ?? String(i)}\n data-element-type={el.type}\n >\n {renderElement(el, gen)}\n </g>\n ))}\n </>\n );\n}\n","/**\n * Zod schema for the Whiteboard JSON v1 (`WhiteboardScene`).\n *\n * Design goals (see RFC 0001 §4 and ADR D4 in the plan):\n * - LLM-friendly: minimal fields per element.\n * - Discriminated union by `type` for exhaustive typing in TS.\n * - Defensive against LLM mistakes:\n * - EC-3: `.finite()` everywhere — rejects NaN / Infinity.\n * - EC-4: `.max()` on dimensions to cap absurd values from the model.\n */\nimport { z } from \"zod\";\n\nconst finiteNumber = z.number().finite();\nconst finitePositive = finiteNumber.positive();\n\nconst strokeStyle = z.enum([\"solid\", \"dashed\", \"dotted\"]);\nconst fillStyle = z.enum([\"hachure\", \"solid\", \"cross-hatch\", \"zigzag\"]);\nconst align = z.enum([\"left\", \"center\", \"right\"]);\nconst fontFamily = z.enum([\"sans\", \"serif\", \"mono\", \"hand\"]);\nconst roundness = z.enum([\"sharp\", \"round\"]);\n\nconst baseElement = z.object({\n id: z.string().max(120).optional(),\n x: finiteNumber,\n y: finiteNumber,\n stroke: z.string().max(64).optional(),\n strokeWidth: finitePositive.max(50).optional(),\n strokeStyle: strokeStyle.optional(),\n fill: z.string().max(64).optional(),\n fillStyle: fillStyle.optional(),\n opacity: finiteNumber.min(0).max(1).optional(),\n roughness: finiteNumber.min(0).max(3).optional(),\n seed: z.number().int().finite().optional(),\n});\n\nconst dim = finitePositive.max(20000);\nconst labelText = z.string().max(500);\n\nconst rectElement = baseElement.extend({\n type: z.literal(\"rect\"),\n w: dim,\n h: dim,\n label: labelText.optional(),\n roundness: roundness.optional(),\n});\n\nconst ellipseElement = baseElement.extend({\n type: z.literal(\"ellipse\"),\n w: dim,\n h: dim,\n label: labelText.optional(),\n});\n\nconst diamondElement = baseElement.extend({\n type: z.literal(\"diamond\"),\n w: dim,\n h: dim,\n label: labelText.optional(),\n});\n\nconst point2 = z.tuple([finiteNumber, finiteNumber]);\n\nconst lineElement = baseElement.extend({\n type: z.literal(\"line\"),\n to: point2,\n});\n\nconst arrowElement = baseElement.extend({\n type: z.literal(\"arrow\"),\n to: point2,\n label: labelText.optional(),\n headStart: z.boolean().optional(),\n headEnd: z.boolean().default(true),\n});\n\nconst textElement = baseElement.extend({\n type: z.literal(\"text\"),\n text: z.string().max(5000),\n fontSize: finitePositive.max(500).optional(),\n align: align.optional(),\n fontFamily: fontFamily.optional(),\n});\n\nconst freedrawPoint = z.tuple([finiteNumber, finiteNumber, finiteNumber.optional()]);\n\nconst freedrawElement = baseElement.extend({\n type: z.literal(\"freedraw\"),\n points: z.array(freedrawPoint).min(2).max(5000),\n});\n\nexport const whiteboardElement = z.discriminatedUnion(\"type\", [\n rectElement,\n ellipseElement,\n diamondElement,\n lineElement,\n arrowElement,\n textElement,\n freedrawElement,\n]);\n\nexport const whiteboardScene = z.object({\n version: z.literal(1),\n width: dim, // EC-4: clamped 1..20000\n height: dim, // EC-4: clamped 1..20000\n background: z.string().max(64).optional(),\n elements: z.array(whiteboardElement).max(5000),\n});\n\n// Internal \"parsed\" types (defaults applied) — used inside the renderer.\nexport type WhiteboardElement = z.output<typeof whiteboardElement>;\nexport type WhiteboardScene = z.output<typeof whiteboardScene>;\nexport type RectElement = z.output<typeof rectElement>;\nexport type EllipseElement = z.output<typeof ellipseElement>;\nexport type DiamondElement = z.output<typeof diamondElement>;\nexport type LineElement = z.output<typeof lineElement>;\nexport type ArrowElement = z.output<typeof arrowElement>;\nexport type TextElement = z.output<typeof textElement>;\nexport type FreedrawElement = z.output<typeof freedrawElement>;\n\n// Public \"input\" types (defaults optional) — used by consumers passing data.\nexport type WhiteboardElementInput = z.input<typeof whiteboardElement>;\nexport type WhiteboardSceneInput = z.input<typeof whiteboardScene>;\n","/**\n * Public validator for `WhiteboardScene` JSON. Wraps Zod and converts errors\n * into a structured shape that an LLM can consume to self-correct.\n *\n * Returns `{ ok: true, scene }` on success or `{ ok: false, errors }` with\n * each error carrying `{ path, message, code, got? }`. See RFC 0001 §4.\n */\nimport { type WhiteboardScene, whiteboardScene } from \"./schema.js\";\n\nexport interface ValidationError {\n /** Dot-joined Zod path, e.g. \"elements.2.type\" or \"width\". */\n path: string;\n /** Human-readable explanation (passes through Zod's message). */\n message: string;\n /** Zod issue code: `invalid_type`, `too_small`, `invalid_literal`, ... */\n code: string;\n /** Actual value received at `path`. Populated for type mismatches, discriminator mismatches, and any issue where Zod's `received` is absent but the value can be recovered by walking the original input along `path`. */\n got?: unknown;\n}\n\nexport type ValidationResult =\n | { ok: true; scene: WhiteboardScene }\n | { ok: false; errors: ValidationError[] };\n\ninterface ZodLikeIssue {\n path: ReadonlyArray<string | number>;\n message: string;\n code: string;\n received?: unknown;\n}\n\n/** Walk `input` following the issue path and return the offending value. */\nfunction valueAtPath(input: unknown, path: ReadonlyArray<string | number>): unknown {\n let cursor: unknown = input;\n for (const segment of path) {\n if (cursor === null || typeof cursor !== \"object\") return undefined;\n cursor = (cursor as Record<string | number, unknown>)[segment];\n }\n return cursor;\n}\n\nfunction formatIssue(issue: ZodLikeIssue, input: unknown): ValidationError {\n const error: ValidationError = {\n path: issue.path.join(\".\"),\n message: issue.message,\n code: issue.code,\n };\n // Populate `got` from the issue when Zod provides it (invalid_type), or by\n // walking the original input along the path (invalid_union / invalid_value).\n // LLM auto-correction benefits from seeing what was actually emitted.\n if (\"received\" in issue && issue.received !== undefined) {\n error.got = issue.received;\n } else if (issue.path.length > 0) {\n const value = valueAtPath(input, issue.path);\n if (value !== undefined) error.got = value;\n }\n return error;\n}\n\nexport function validateScene(input: unknown): ValidationResult {\n const result = whiteboardScene.safeParse(input);\n if (result.success) {\n return { ok: true, scene: result.data };\n }\n const errors = result.error.issues.map((issue) =>\n formatIssue(issue as unknown as ZodLikeIssue, input),\n );\n return { ok: false, errors };\n}\n","import { useCallback, useEffect, useRef } from \"react\";\nimport type { ViewportControls } from \"./use-viewport.js\";\n\ninterface DragState {\n pointerId: number;\n lastX: number;\n lastY: number;\n}\n\n/** Attaches pan + zoom listeners to an SVG element. */\nexport function usePointerPan(\n ref: React.RefObject<SVGSVGElement | null>,\n viewport: ViewportControls,\n size: { width: number; height: number },\n): {\n onPointerDown: (e: React.PointerEvent<SVGSVGElement>) => void;\n onPointerMove: (e: React.PointerEvent<SVGSVGElement>) => void;\n onPointerUp: (e: React.PointerEvent<SVGSVGElement>) => void;\n onPointerCancel: (e: React.PointerEvent<SVGSVGElement>) => void;\n} {\n const dragRef = useRef<DragState | null>(null);\n const spaceHeldRef = useRef(false);\n\n // EC-2: wheel events on React's JSX onWheel are passive — `preventDefault`\n // does nothing, which causes the page to scroll while the user tries to\n // zoom. We must attach the wheel handler imperatively with `{passive:false}`.\n useEffect(() => {\n const el = ref.current;\n if (!el) return;\n const handler = (e: WheelEvent) => {\n e.preventDefault();\n const rect = el.getBoundingClientRect();\n const localX = e.clientX - rect.left;\n const localY = e.clientY - rect.top;\n // Map screen-px → viewBox coords by ratio of rect to size.\n const scaleX = size.width / rect.width;\n const scaleY = size.height / rect.height;\n viewport.zoomAt(localX * scaleX, localY * scaleY, -e.deltaY * 0.001, size);\n };\n el.addEventListener(\"wheel\", handler, { passive: false });\n return () => el.removeEventListener(\"wheel\", handler);\n }, [ref, viewport, size]);\n\n // Track Space key for pan-with-any-button (Excalidraw \"hand\" mode).\n useEffect(() => {\n const down = (e: KeyboardEvent) => {\n if (e.code === \"Space\") spaceHeldRef.current = true;\n };\n const up = (e: KeyboardEvent) => {\n if (e.code === \"Space\") spaceHeldRef.current = false;\n };\n window.addEventListener(\"keydown\", down);\n window.addEventListener(\"keyup\", up);\n return () => {\n window.removeEventListener(\"keydown\", down);\n window.removeEventListener(\"keyup\", up);\n };\n }, []);\n\n const onPointerDown = useCallback((e: React.PointerEvent<SVGSVGElement>) => {\n // EC-10: only start drag when the down event is on our SVG, not on a\n // child rendered via portal/etc. event.currentTarget guarantees this.\n if (e.target instanceof Element && !e.currentTarget.contains(e.target)) return;\n // Left button (0) or middle (1) or Space-held pan.\n const isMouseButton = e.button === 0 || e.button === 1;\n if (!isMouseButton && e.pointerType === \"mouse\") return;\n if (e.pointerType === \"mouse\" && e.button !== 1 && !spaceHeldRef.current && e.button !== 0) {\n return;\n }\n dragRef.current = { pointerId: e.pointerId, lastX: e.clientX, lastY: e.clientY };\n e.currentTarget.setPointerCapture(e.pointerId);\n }, []);\n\n const onPointerMove = useCallback(\n (e: React.PointerEvent<SVGSVGElement>) => {\n const drag = dragRef.current;\n if (!drag || drag.pointerId !== e.pointerId) return;\n const dx = e.clientX - drag.lastX;\n const dy = e.clientY - drag.lastY;\n drag.lastX = e.clientX;\n drag.lastY = e.clientY;\n const el = ref.current;\n if (!el) return;\n const rect = el.getBoundingClientRect();\n const scaleX = size.width / rect.width;\n const scaleY = size.height / rect.height;\n viewport.pan(dx * scaleX, dy * scaleY);\n },\n [ref, viewport, size],\n );\n\n const releaseDrag = useCallback((e: React.PointerEvent<SVGSVGElement>) => {\n const drag = dragRef.current;\n if (!drag || drag.pointerId !== e.pointerId) return;\n try {\n e.currentTarget.releasePointerCapture(e.pointerId);\n } catch {\n // Already released — ignore.\n }\n dragRef.current = null;\n }, []);\n\n return {\n onPointerDown,\n onPointerMove,\n onPointerUp: releaseDrag,\n onPointerCancel: releaseDrag,\n };\n}\n","/**\n * Viewport state and helpers — pan via (x, y) and zoom via a scalar.\n *\n * Coordinate system:\n * - World space: where elements are defined (the JSON `x`, `y` etc.).\n * - Screen space: the rendered SVG bounding box on the page.\n * - viewBox: `${x} ${y} ${width/zoom} ${height/zoom}`. Increasing zoom\n * SHRINKS the viewBox dimensions, magnifying the rendered content.\n *\n * `zoomAt(screenX, screenY, delta, viewportSize)` keeps the world point under\n * the cursor stable while zooming (see test for invariant).\n */\nimport { useCallback, useMemo, useState } from \"react\";\n\nexport const MIN_ZOOM = 0.1;\nexport const MAX_ZOOM = 8;\n\nexport interface ViewportState {\n x: number;\n y: number;\n zoom: number;\n}\n\nexport interface ViewportSize {\n width: number;\n height: number;\n}\n\nexport interface ViewportBounds {\n minX: number;\n minY: number;\n maxX: number;\n maxY: number;\n}\n\nexport interface UseViewportOptions {\n width: number;\n height: number;\n initialZoom?: number;\n initialCenter?: [number, number];\n}\n\nexport interface ViewportControls {\n state: ViewportState;\n pan: (dx: number, dy: number) => void;\n setZoom: (zoom: number) => void;\n zoomAt: (screenX: number, screenY: number, delta: number, size: ViewportSize) => void;\n reset: () => void;\n fitTo: (bounds: ViewportBounds, size: ViewportSize) => void;\n viewBox: (size: ViewportSize) => string;\n}\n\nfunction clampZoom(z: number): number {\n if (!Number.isFinite(z)) return 1;\n return Math.min(MAX_ZOOM, Math.max(MIN_ZOOM, z));\n}\n\nexport function useViewport(opts: UseViewportOptions): ViewportControls {\n const initial: ViewportState = useMemo(() => {\n const zoom = clampZoom(opts.initialZoom ?? 1);\n if (opts.initialCenter) {\n // Position viewBox so initialCenter sits at the visual center.\n const [cx, cy] = opts.initialCenter;\n return {\n x: cx - opts.width / (2 * zoom),\n y: cy - opts.height / (2 * zoom),\n zoom,\n };\n }\n return { x: 0, y: 0, zoom };\n }, [opts.initialCenter, opts.initialZoom, opts.width, opts.height]);\n\n const [state, setState] = useState<ViewportState>(initial);\n\n const pan = useCallback((dx: number, dy: number) => {\n setState((prev) => ({ ...prev, x: prev.x - dx / prev.zoom, y: prev.y - dy / prev.zoom }));\n }, []);\n\n const setZoom = useCallback((zoom: number) => {\n setState((prev) => ({ ...prev, zoom: clampZoom(zoom) }));\n }, []);\n\n const zoomAt = useCallback(\n (screenX: number, screenY: number, delta: number, _size: ViewportSize) => {\n setState((prev) => {\n const oldZoom = prev.zoom;\n const newZoom = clampZoom(prev.zoom * Math.exp(delta));\n if (newZoom === oldZoom) return prev;\n // World coordinate currently under cursor.\n const worldX = prev.x + screenX / oldZoom;\n const worldY = prev.y + screenY / oldZoom;\n // After zoom, we want the same screen point to map to the same world point.\n // viewBox.x + (screenX / newZoom) === worldX → x = worldX - screenX/newZoom.\n return {\n x: worldX - screenX / newZoom,\n y: worldY - screenY / newZoom,\n zoom: newZoom,\n };\n });\n },\n [],\n );\n\n const reset = useCallback(() => setState(initial), [initial]);\n\n const fitTo = useCallback((bounds: ViewportBounds, size: ViewportSize) => {\n const bboxWidth = Math.max(1, bounds.maxX - bounds.minX);\n const bboxHeight = Math.max(1, bounds.maxY - bounds.minY);\n const zoomX = size.width / bboxWidth;\n const zoomY = size.height / bboxHeight;\n const zoom = clampZoom(Math.min(zoomX, zoomY));\n const cx = (bounds.minX + bounds.maxX) / 2;\n const cy = (bounds.minY + bounds.maxY) / 2;\n setState({\n x: cx - size.width / (2 * zoom),\n y: cy - size.height / (2 * zoom),\n zoom,\n });\n }, []);\n\n const viewBox = useCallback(\n (size: ViewportSize) =>\n `${state.x} ${state.y} ${size.width / state.zoom} ${size.height / state.zoom}`,\n [state],\n );\n\n return { state, pan, setZoom, zoomAt, reset, fitTo, viewBox };\n}\n","import { useEffect, useMemo, useRef } from \"react\";\n/**\n * `<Whiteboard>` — view-only primitive that turns a JSON scene into a\n * hand-drawn SVG. Lives in the isolated subpath `@usetheo/ui/whiteboard`.\n *\n * See RFC 0001 (`docs/rfcs/0001-whiteboard.md`) and the plan in\n * `.claude/knowledge-base/plans/whiteboard-view-primitive-plan.md`.\n */\nimport rough from \"roughjs\";\nimport type { RoughGenerator } from \"roughjs/bin/generator.js\";\nimport { renderScene } from \"./render/scene.js\";\nimport type { WhiteboardScene, WhiteboardSceneInput } from \"./schema.js\";\nimport { type ValidationError, validateScene } from \"./validate.js\";\nimport { usePointerPan } from \"./viewport/use-pointer-pan.js\";\nimport { useViewport } from \"./viewport/use-viewport.js\";\n\n/** Input type accepted by the component (defaults like `headEnd` are optional). */\nexport type WhiteboardData = WhiteboardSceneInput;\nexport type { ValidationError } from \"./validate.js\";\n\nexport interface WhiteboardProps {\n /** The scene to render. Validated with Zod on every change. */\n data: WhiteboardData | unknown;\n className?: string;\n /** Starting zoom level (clamped 0.1–8). Default 1. */\n initialZoom?: number;\n /** World coordinate centered in the viewport on first render. */\n initialCenter?: [number, number];\n /** When true, computes a bounding box of all elements and zooms to fit. */\n fitOnLoad?: boolean;\n /** Called once per validation failure with the list of errors (EC-6: in useEffect, not render). */\n onValidationError?: (errors: ValidationError[]) => void;\n /** Accessible label for the SVG (defaults to \"Whiteboard diagram\"). */\n \"aria-label\"?: string;\n}\n\nfunction computeBounds(scene: WhiteboardScene): {\n minX: number;\n minY: number;\n maxX: number;\n maxY: number;\n} | null {\n if (scene.elements.length === 0) return null;\n let minX = Number.POSITIVE_INFINITY;\n let minY = Number.POSITIVE_INFINITY;\n let maxX = Number.NEGATIVE_INFINITY;\n let maxY = Number.NEGATIVE_INFINITY;\n for (const el of scene.elements) {\n const x1 = el.x;\n const y1 = el.y;\n let x2 = el.x;\n let y2 = el.y;\n if (el.type === \"rect\" || el.type === \"ellipse\" || el.type === \"diamond\") {\n x2 = el.x + el.w;\n y2 = el.y + el.h;\n } else if (el.type === \"line\" || el.type === \"arrow\") {\n x2 = el.to[0];\n y2 = el.to[1];\n } else if (el.type === \"freedraw\") {\n for (const [px, py] of el.points) {\n const tx = el.x + px;\n const ty = el.y + py;\n if (tx < minX) minX = tx;\n if (ty < minY) minY = ty;\n if (tx > maxX) maxX = tx;\n if (ty > maxY) maxY = ty;\n }\n continue;\n }\n if (x1 < minX) minX = x1;\n if (y1 < minY) minY = y1;\n if (x2 < minX) minX = x2;\n if (y2 < minY) minY = y2;\n if (x1 > maxX) maxX = x1;\n if (y1 > maxY) maxY = y1;\n if (x2 > maxX) maxX = x2;\n if (y2 > maxY) maxY = y2;\n }\n if (!Number.isFinite(minX)) return null;\n return { minX, minY, maxX, maxY };\n}\n\nexport function Whiteboard({\n data,\n className,\n initialZoom,\n initialCenter,\n fitOnLoad,\n onValidationError,\n \"aria-label\": ariaLabel,\n}: WhiteboardProps) {\n const validation = useMemo(() => validateScene(data), [data]);\n const scene = validation.ok ? validation.scene : null;\n\n // EC-6: side effects only inside useEffect — never call user callbacks in render.\n useEffect(() => {\n if (!validation.ok && onValidationError) {\n onValidationError(validation.errors);\n }\n }, [validation, onValidationError]);\n\n // Stable rough.js generator across renders.\n const generator: RoughGenerator | null = useMemo(() => {\n if (typeof globalThis === \"undefined\") return null;\n try {\n return rough.generator();\n } catch {\n return null;\n }\n }, []);\n\n // Fallback dimensions for invalid scenes (still render a valid svg).\n const sceneWidth = scene?.width ?? 400;\n const sceneHeight = scene?.height ?? 300;\n const sceneBackground = scene?.background;\n\n const viewport = useViewport({\n width: sceneWidth,\n height: sceneHeight,\n initialZoom,\n initialCenter,\n });\n\n const svgRef = useRef<SVGSVGElement | null>(null);\n\n const fitTo = viewport.fitTo;\n // EC-14: fitOnLoad must run in useEffect (after mount), not during render.\n useEffect(() => {\n if (!fitOnLoad || !scene) return;\n const bounds = computeBounds(scene);\n if (!bounds) return;\n fitTo(bounds, { width: sceneWidth, height: sceneHeight });\n }, [fitOnLoad, scene, sceneWidth, sceneHeight, fitTo]);\n\n const handlers = usePointerPan(svgRef, viewport, {\n width: sceneWidth,\n height: sceneHeight,\n });\n\n const label = ariaLabel ?? \"Whiteboard diagram\";\n\n return (\n <svg\n ref={svgRef}\n viewBox={viewport.viewBox({ width: sceneWidth, height: sceneHeight })}\n width={sceneWidth}\n height={sceneHeight}\n className={className}\n role=\"img\"\n aria-label={label}\n xmlns=\"http://www.w3.org/2000/svg\"\n data-whiteboard-state={scene ? \"ok\" : \"invalid\"}\n style={{ touchAction: \"none\", userSelect: \"none\" }}\n {...handlers}\n >\n <title>{label}</title>\n {sceneBackground ? (\n <rect\n x={0}\n y={0}\n width={sceneWidth}\n height={sceneHeight}\n fill={sceneBackground}\n data-layer=\"background\"\n />\n ) : null}\n {scene && generator ? renderScene(scene, generator) : null}\n </svg>\n );\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@usetheo/ui",
|
|
3
|
-
"version": "0.1.0-next.
|
|
4
|
-
"description": "Theo UI — framework-agnostic React component library with the Violet Forge design system. Focused on AI-agent interfaces,
|
|
3
|
+
"version": "0.1.0-next.1",
|
|
4
|
+
"description": "Theo UI — framework-agnostic React component library with the Violet Forge design system. Focused on AI-agent interfaces, cloud dashboards, and developer-tooling surfaces.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"type": "module",
|
|
7
|
-
"sideEffects": [
|
|
7
|
+
"sideEffects": [
|
|
8
|
+
"**/*.css"
|
|
9
|
+
],
|
|
8
10
|
"exports": {
|
|
9
11
|
".": {
|
|
10
12
|
"types": "./dist/index.d.ts",
|
|
@@ -14,6 +16,8 @@
|
|
|
14
16
|
"./tokens.css": "./dist/tokens.css",
|
|
15
17
|
"./fonts.css": "./dist/fonts.css",
|
|
16
18
|
"./fonts-cdn.css": "./dist/fonts-cdn.css",
|
|
19
|
+
"./slide/themes/default.css": "./dist/slide/themes/default.css",
|
|
20
|
+
"./slide/themes/violet-forge.css": "./dist/slide/themes/violet-forge.css",
|
|
17
21
|
"./agent-composer": {
|
|
18
22
|
"types": "./dist/index.d.ts",
|
|
19
23
|
"import": "./dist/index.js"
|
|
@@ -409,9 +413,43 @@
|
|
|
409
413
|
"./topnav": {
|
|
410
414
|
"types": "./dist/index.d.ts",
|
|
411
415
|
"import": "./dist/index.js"
|
|
416
|
+
},
|
|
417
|
+
"./whiteboard": {
|
|
418
|
+
"types": "./dist/whiteboard/index.d.ts",
|
|
419
|
+
"import": "./dist/whiteboard/index.js"
|
|
420
|
+
},
|
|
421
|
+
"./slide": {
|
|
422
|
+
"types": "./dist/slide/index.d.ts",
|
|
423
|
+
"import": "./dist/slide/index.js"
|
|
424
|
+
},
|
|
425
|
+
"./slide/plugins/shiki": {
|
|
426
|
+
"types": "./dist/slide/plugins/shiki/index.d.ts",
|
|
427
|
+
"import": "./dist/slide/plugins/shiki/index.js"
|
|
428
|
+
},
|
|
429
|
+
"./slide/plugins/math": {
|
|
430
|
+
"types": "./dist/slide/plugins/math/index.d.ts",
|
|
431
|
+
"import": "./dist/slide/plugins/math/index.js"
|
|
432
|
+
},
|
|
433
|
+
"./slide/plugins/mermaid": {
|
|
434
|
+
"types": "./dist/slide/plugins/mermaid/index.d.ts",
|
|
435
|
+
"import": "./dist/slide/plugins/mermaid/index.js"
|
|
436
|
+
},
|
|
437
|
+
"./slide/plugins/emoji": {
|
|
438
|
+
"types": "./dist/slide/plugins/emoji/index.d.ts",
|
|
439
|
+
"import": "./dist/slide/plugins/emoji/index.js"
|
|
440
|
+
},
|
|
441
|
+
"./slide-deck": {
|
|
442
|
+
"types": "./dist/slide-deck/index.d.ts",
|
|
443
|
+
"import": "./dist/slide-deck/index.js"
|
|
412
444
|
}
|
|
413
445
|
},
|
|
414
|
-
"files": [
|
|
446
|
+
"files": [
|
|
447
|
+
"dist",
|
|
448
|
+
"registry/r",
|
|
449
|
+
"registry/index.json",
|
|
450
|
+
"LICENSE",
|
|
451
|
+
"CHANGELOG.md"
|
|
452
|
+
],
|
|
415
453
|
"scripts": {
|
|
416
454
|
"build": "tsup",
|
|
417
455
|
"dev": "ladle serve",
|
|
@@ -439,12 +477,86 @@
|
|
|
439
477
|
"quality:bundle": "tsx scripts/validate-bundle-size.ts",
|
|
440
478
|
"quality:bundle:update": "tsx scripts/validate-bundle-size.ts --update",
|
|
441
479
|
"quality:a11y": "vitest run src/test/ladle-axe.test.tsx",
|
|
442
|
-
"
|
|
480
|
+
"dogfood:whiteboard": "tsx scripts/dogfood-whiteboard.ts",
|
|
481
|
+
"dogfood:slide": "tsx scripts/dogfood-slide.ts",
|
|
482
|
+
"dogfood:slide-deck": "tsx scripts/dogfood-slide-deck.ts",
|
|
483
|
+
"dogfood:slide-rich": "tsx scripts/dogfood-slide-rich.ts",
|
|
484
|
+
"quality:gates": "pnpm format:check && pnpm lint:ci && pnpm typecheck && pnpm test && pnpm build && pnpm registry:build && pnpm registry:validate && pnpm quality:structure && pnpm quality:bundle && pnpm quality:a11y && pnpm ladle:build && pnpm dogfood:whiteboard && pnpm dogfood:slide && pnpm dogfood:slide-deck && pnpm dogfood:slide-rich",
|
|
443
485
|
"quality:gates:fast": "pnpm format:check && pnpm lint:ci && pnpm typecheck && pnpm registry:build && pnpm registry:validate && pnpm quality:structure"
|
|
444
486
|
},
|
|
445
487
|
"peerDependencies": {
|
|
488
|
+
"hast-util-from-html": "^2.0.0",
|
|
489
|
+
"hast-util-sanitize": "^5.0.0",
|
|
490
|
+
"hast-util-to-jsx-runtime": "^2.0.0",
|
|
491
|
+
"katex": "^0.16.0",
|
|
492
|
+
"mdast-util-from-markdown": "^2.0.0",
|
|
493
|
+
"mdast-util-gfm": "^3.0.0",
|
|
494
|
+
"mdast-util-math": "^3.0.0",
|
|
495
|
+
"mdast-util-to-hast": "^13.0.0",
|
|
496
|
+
"mermaid": "^11.0.0",
|
|
497
|
+
"micromark-extension-gfm": "^3.0.0",
|
|
498
|
+
"micromark-extension-math": "^3.0.0",
|
|
499
|
+
"perfect-freehand": "^1.2.0",
|
|
446
500
|
"react": ">=18.2.0 <20",
|
|
447
|
-
"react-dom": ">=18.2.0 <20"
|
|
501
|
+
"react-dom": ">=18.2.0 <20",
|
|
502
|
+
"roughjs": "^4.6.0",
|
|
503
|
+
"shiki": "^1.0.0",
|
|
504
|
+
"unist-util-visit": "^5.0.0",
|
|
505
|
+
"unist-util-visit-parents": "^6.0.0",
|
|
506
|
+
"yaml": "^2.0.0"
|
|
507
|
+
},
|
|
508
|
+
"peerDependenciesMeta": {
|
|
509
|
+
"roughjs": {
|
|
510
|
+
"optional": true
|
|
511
|
+
},
|
|
512
|
+
"perfect-freehand": {
|
|
513
|
+
"optional": true
|
|
514
|
+
},
|
|
515
|
+
"mdast-util-from-markdown": {
|
|
516
|
+
"optional": true
|
|
517
|
+
},
|
|
518
|
+
"mdast-util-gfm": {
|
|
519
|
+
"optional": true
|
|
520
|
+
},
|
|
521
|
+
"micromark-extension-gfm": {
|
|
522
|
+
"optional": true
|
|
523
|
+
},
|
|
524
|
+
"mdast-util-to-hast": {
|
|
525
|
+
"optional": true
|
|
526
|
+
},
|
|
527
|
+
"hast-util-sanitize": {
|
|
528
|
+
"optional": true
|
|
529
|
+
},
|
|
530
|
+
"hast-util-to-jsx-runtime": {
|
|
531
|
+
"optional": true
|
|
532
|
+
},
|
|
533
|
+
"hast-util-from-html": {
|
|
534
|
+
"optional": true
|
|
535
|
+
},
|
|
536
|
+
"unist-util-visit": {
|
|
537
|
+
"optional": true
|
|
538
|
+
},
|
|
539
|
+
"unist-util-visit-parents": {
|
|
540
|
+
"optional": true
|
|
541
|
+
},
|
|
542
|
+
"yaml": {
|
|
543
|
+
"optional": true
|
|
544
|
+
},
|
|
545
|
+
"shiki": {
|
|
546
|
+
"optional": true
|
|
547
|
+
},
|
|
548
|
+
"katex": {
|
|
549
|
+
"optional": true
|
|
550
|
+
},
|
|
551
|
+
"micromark-extension-math": {
|
|
552
|
+
"optional": true
|
|
553
|
+
},
|
|
554
|
+
"mdast-util-math": {
|
|
555
|
+
"optional": true
|
|
556
|
+
},
|
|
557
|
+
"mermaid": {
|
|
558
|
+
"optional": true
|
|
559
|
+
}
|
|
448
560
|
},
|
|
449
561
|
"dependencies": {
|
|
450
562
|
"@radix-ui/react-avatar": "^1.1.11",
|
|
@@ -465,7 +577,8 @@
|
|
|
465
577
|
"cmdk": "^1.1.1",
|
|
466
578
|
"lucide-react": "^0.471.0",
|
|
467
579
|
"tailwind-merge": "^2.5.5",
|
|
468
|
-
"tailwindcss-animate": "^1.0.7"
|
|
580
|
+
"tailwindcss-animate": "^1.0.7",
|
|
581
|
+
"zod": "^4.4.3"
|
|
469
582
|
},
|
|
470
583
|
"devDependencies": {
|
|
471
584
|
"@biomejs/biome": "^1.9.4",
|
|
@@ -474,29 +587,48 @@
|
|
|
474
587
|
"@testing-library/jest-dom": "^6.6.3",
|
|
475
588
|
"@testing-library/react": "^16.1.0",
|
|
476
589
|
"@testing-library/user-event": "^14.5.2",
|
|
590
|
+
"@types/hast": "^3.0.4",
|
|
591
|
+
"@types/mdast": "^4.0.4",
|
|
477
592
|
"@types/node": "^22.10.5",
|
|
478
593
|
"@types/react": "^18.3.18",
|
|
479
594
|
"@types/react-dom": "^18.3.5",
|
|
480
595
|
"@vitejs/plugin-react": "^4.7.0",
|
|
596
|
+
"@vitest/coverage-v8": "2.1.9",
|
|
481
597
|
"autoprefixer": "^10.4.20",
|
|
482
598
|
"geist": "^1.7.0",
|
|
483
599
|
"happy-dom": "^20.9.0",
|
|
600
|
+
"hast-util-from-html": "^2.0.3",
|
|
601
|
+
"hast-util-sanitize": "^5.0.2",
|
|
602
|
+
"hast-util-to-jsx-runtime": "^2.3.6",
|
|
603
|
+
"mdast-util-from-markdown": "^2.0.3",
|
|
604
|
+
"mdast-util-gfm": "^3.1.0",
|
|
605
|
+
"mdast-util-to-hast": "^13.2.1",
|
|
606
|
+
"micromark-extension-gfm": "^3.0.0",
|
|
607
|
+
"perfect-freehand": "1.2.3",
|
|
484
608
|
"postcss": "^8.5.14",
|
|
485
609
|
"react": "^18.3.1",
|
|
486
610
|
"react-dom": "^18.3.1",
|
|
611
|
+
"roughjs": "4.6.6",
|
|
487
612
|
"tailwindcss": "^3.4.17",
|
|
488
613
|
"tsup": "^8.3.5",
|
|
489
614
|
"tsx": "^4.19.2",
|
|
490
615
|
"typescript": "^5.7.3",
|
|
616
|
+
"unist-util-visit": "^5.0.0",
|
|
617
|
+
"unist-util-visit-parents": "^6.0.0",
|
|
491
618
|
"vite": "^5.4.21",
|
|
492
619
|
"vitest": "^2.1.8",
|
|
493
|
-
"vitest-axe": "^0.1.0"
|
|
620
|
+
"vitest-axe": "^0.1.0",
|
|
621
|
+
"yaml": "^2.9.0"
|
|
494
622
|
},
|
|
495
623
|
"engines": {
|
|
496
624
|
"node": ">=20"
|
|
497
625
|
},
|
|
498
626
|
"pnpm": {
|
|
499
|
-
"onlyBuiltDependencies": [
|
|
627
|
+
"onlyBuiltDependencies": [
|
|
628
|
+
"@biomejs/biome",
|
|
629
|
+
"@swc/core",
|
|
630
|
+
"esbuild"
|
|
631
|
+
],
|
|
500
632
|
"overrides": {
|
|
501
633
|
"postcss": ">=8.5.10"
|
|
502
634
|
}
|
|
@@ -6,10 +6,10 @@
|
|
|
6
6
|
"description": "ChatComposer + slash-command / @file / #memory triggers.",
|
|
7
7
|
"dependencies": [],
|
|
8
8
|
"registryDependencies": [
|
|
9
|
-
"chat-composer",
|
|
10
|
-
"cn",
|
|
11
|
-
"mention-menu",
|
|
12
|
-
"tailwind-preset"
|
|
9
|
+
"https://usetheodev.github.io/theo-ui/r/chat-composer.json",
|
|
10
|
+
"https://usetheodev.github.io/theo-ui/r/cn.json",
|
|
11
|
+
"https://usetheodev.github.io/theo-ui/r/mention-menu.json",
|
|
12
|
+
"https://usetheodev.github.io/theo-ui/r/tailwind-preset.json"
|
|
13
13
|
],
|
|
14
14
|
"files": [
|
|
15
15
|
{
|
|
@@ -6,15 +6,15 @@
|
|
|
6
6
|
"description": "Form for creating or editing an Agent persona.",
|
|
7
7
|
"dependencies": [],
|
|
8
8
|
"registryDependencies": [
|
|
9
|
-
"agent-profile",
|
|
10
|
-
"button",
|
|
11
|
-
"cn",
|
|
12
|
-
"form-field",
|
|
13
|
-
"input",
|
|
14
|
-
"mode-types",
|
|
15
|
-
"select",
|
|
16
|
-
"tailwind-preset",
|
|
17
|
-
"textarea"
|
|
9
|
+
"https://usetheodev.github.io/theo-ui/r/agent-profile.json",
|
|
10
|
+
"https://usetheodev.github.io/theo-ui/r/button.json",
|
|
11
|
+
"https://usetheodev.github.io/theo-ui/r/cn.json",
|
|
12
|
+
"https://usetheodev.github.io/theo-ui/r/form-field.json",
|
|
13
|
+
"https://usetheodev.github.io/theo-ui/r/input.json",
|
|
14
|
+
"https://usetheodev.github.io/theo-ui/r/mode-types.json",
|
|
15
|
+
"https://usetheodev.github.io/theo-ui/r/select.json",
|
|
16
|
+
"https://usetheodev.github.io/theo-ui/r/tailwind-preset.json",
|
|
17
|
+
"https://usetheodev.github.io/theo-ui/r/textarea.json"
|
|
18
18
|
],
|
|
19
19
|
"files": [
|
|
20
20
|
{
|
|
@@ -8,10 +8,10 @@
|
|
|
8
8
|
"lucide-react"
|
|
9
9
|
],
|
|
10
10
|
"registryDependencies": [
|
|
11
|
-
"agent-types",
|
|
12
|
-
"cn",
|
|
13
|
-
"tailwind-preset",
|
|
14
|
-
"types"
|
|
11
|
+
"https://usetheodev.github.io/theo-ui/r/agent-types.json",
|
|
12
|
+
"https://usetheodev.github.io/theo-ui/r/cn.json",
|
|
13
|
+
"https://usetheodev.github.io/theo-ui/r/tailwind-preset.json",
|
|
14
|
+
"https://usetheodev.github.io/theo-ui/r/types.json"
|
|
15
15
|
],
|
|
16
16
|
"files": [
|
|
17
17
|
{
|
|
@@ -6,15 +6,15 @@
|
|
|
6
6
|
"description": "The canonical conversation surface for a code agent.",
|
|
7
7
|
"dependencies": [],
|
|
8
8
|
"registryDependencies": [
|
|
9
|
-
"agent-error-card",
|
|
10
|
-
"agent-streaming",
|
|
11
|
-
"approval-card",
|
|
12
|
-
"chat-message",
|
|
13
|
-
"chat-types",
|
|
14
|
-
"cn",
|
|
15
|
-
"tailwind-preset",
|
|
16
|
-
"tool-call-card",
|
|
17
|
-
"types"
|
|
9
|
+
"https://usetheodev.github.io/theo-ui/r/agent-error-card.json",
|
|
10
|
+
"https://usetheodev.github.io/theo-ui/r/agent-streaming.json",
|
|
11
|
+
"https://usetheodev.github.io/theo-ui/r/approval-card.json",
|
|
12
|
+
"https://usetheodev.github.io/theo-ui/r/chat-message.json",
|
|
13
|
+
"https://usetheodev.github.io/theo-ui/r/chat-types.json",
|
|
14
|
+
"https://usetheodev.github.io/theo-ui/r/cn.json",
|
|
15
|
+
"https://usetheodev.github.io/theo-ui/r/tailwind-preset.json",
|
|
16
|
+
"https://usetheodev.github.io/theo-ui/r/tool-call-card.json",
|
|
17
|
+
"https://usetheodev.github.io/theo-ui/r/types.json"
|
|
18
18
|
],
|
|
19
19
|
"files": [
|
|
20
20
|
{
|
|
@@ -6,10 +6,10 @@
|
|
|
6
6
|
"description": "Vertical list of agent events.",
|
|
7
7
|
"dependencies": [],
|
|
8
8
|
"registryDependencies": [
|
|
9
|
-
"agent-event",
|
|
10
|
-
"agent-types",
|
|
11
|
-
"cn",
|
|
12
|
-
"tailwind-preset"
|
|
9
|
+
"https://usetheodev.github.io/theo-ui/r/agent-event.json",
|
|
10
|
+
"https://usetheodev.github.io/theo-ui/r/agent-types.json",
|
|
11
|
+
"https://usetheodev.github.io/theo-ui/r/cn.json",
|
|
12
|
+
"https://usetheodev.github.io/theo-ui/r/tailwind-preset.json"
|
|
13
13
|
],
|
|
14
14
|
"files": [
|
|
15
15
|
{
|
|
@@ -9,10 +9,10 @@
|
|
|
9
9
|
"lucide-react"
|
|
10
10
|
],
|
|
11
11
|
"registryDependencies": [
|
|
12
|
-
"button",
|
|
13
|
-
"cn",
|
|
14
|
-
"tailwind-preset",
|
|
15
|
-
"types"
|
|
12
|
+
"https://usetheodev.github.io/theo-ui/r/button.json",
|
|
13
|
+
"https://usetheodev.github.io/theo-ui/r/cn.json",
|
|
14
|
+
"https://usetheodev.github.io/theo-ui/r/tailwind-preset.json",
|
|
15
|
+
"https://usetheodev.github.io/theo-ui/r/types.json"
|
|
16
16
|
],
|
|
17
17
|
"files": [
|
|
18
18
|
{
|
|
@@ -8,10 +8,10 @@
|
|
|
8
8
|
"lucide-react"
|
|
9
9
|
],
|
|
10
10
|
"registryDependencies": [
|
|
11
|
-
"chat-types",
|
|
12
|
-
"cn",
|
|
13
|
-
"tailwind-preset",
|
|
14
|
-
"types"
|
|
11
|
+
"https://usetheodev.github.io/theo-ui/r/chat-types.json",
|
|
12
|
+
"https://usetheodev.github.io/theo-ui/r/cn.json",
|
|
13
|
+
"https://usetheodev.github.io/theo-ui/r/tailwind-preset.json",
|
|
14
|
+
"https://usetheodev.github.io/theo-ui/r/types.json"
|
|
15
15
|
],
|
|
16
16
|
"files": [
|
|
17
17
|
{
|
|
@@ -8,9 +8,9 @@
|
|
|
8
8
|
"lucide-react"
|
|
9
9
|
],
|
|
10
10
|
"registryDependencies": [
|
|
11
|
-
"cn",
|
|
12
|
-
"tailwind-preset",
|
|
13
|
-
"types"
|
|
11
|
+
"https://usetheodev.github.io/theo-ui/r/cn.json",
|
|
12
|
+
"https://usetheodev.github.io/theo-ui/r/tailwind-preset.json",
|
|
13
|
+
"https://usetheodev.github.io/theo-ui/r/types.json"
|
|
14
14
|
],
|
|
15
15
|
"files": [
|
|
16
16
|
{
|
package/registry/r/avatar.json
CHANGED