@particle-academy/fancy-3d-three 0.1.1 → 0.2.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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/painters.ts","../src/primitives.ts","../src/layouts.ts","../src/index.ts"],"names":["material","mesh","THREE2","THREE3"],"mappings":"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","file":"index.js","sourcesContent":["import type { WidgetSpec } from \"@particle-academy/fancy-3d\";\n\nexport const TEX_SCALE = 2; // retina-ish texture sharpness\n\n/** Scale factor against the painters' design-time canvas (240px tall). All\n * widget painters multiply their padding / font sizes by this so the layout\n * looks the same at any pixel resolution. */\nfunction unitOf(_w: number, h: number): number {\n return h / 240;\n}\n\nfunction paintCardBg(ctx: CanvasRenderingContext2D, w: number, h: number, selected: boolean) {\n const u = unitOf(w, h);\n ctx.fillStyle = \"#0f172a\";\n roundRect(ctx, 0, 0, w, h, 14 * u);\n ctx.fill();\n ctx.strokeStyle = selected ? \"#6366f1\" : \"#1e293b\";\n ctx.lineWidth = (selected ? 4 : 2) * u;\n ctx.stroke();\n}\n\nfunction roundRect(ctx: CanvasRenderingContext2D, x: number, y: number, w: number, h: number, r: number) {\n ctx.beginPath();\n ctx.moveTo(x + r, y);\n ctx.arcTo(x + w, y, x + w, y + h, r);\n ctx.arcTo(x + w, y + h, x, y + h, r);\n ctx.arcTo(x, y + h, x, y, r);\n ctx.arcTo(x, y, x + w, y, r);\n ctx.closePath();\n}\n\nfunction paintLabel(ctx: CanvasRenderingContext2D, text: string, x: number, y: number) {\n ctx.fillStyle = \"#94a3b8\";\n ctx.font = \"600 22px ui-sans-serif, system-ui, sans-serif\";\n ctx.textBaseline = \"top\";\n ctx.fillText(text.toUpperCase(), x, y);\n}\n\nfunction paintSparkline(ctx: CanvasRenderingContext2D, values: number[], x: number, y: number, w: number, h: number, variant: \"line\" | \"bar\" | \"area\", color: string) {\n const max = Math.max(...values, 1);\n const min = Math.min(...values, 0);\n const range = max - min || 1;\n const step = w / Math.max(values.length - 1, 1);\n\n if (variant === \"bar\") {\n const bw = w / values.length - 4;\n ctx.fillStyle = color;\n values.forEach((v, i) => {\n const bh = ((v - min) / range) * h;\n ctx.fillRect(x + i * (bw + 4), y + h - bh, bw, Math.max(bh, 1));\n });\n return;\n }\n\n ctx.beginPath();\n values.forEach((v, i) => {\n const px = x + i * step;\n const py = y + h - ((v - min) / range) * h;\n if (i === 0) ctx.moveTo(px, py);\n else ctx.lineTo(px, py);\n });\n\n if (variant === \"area\") {\n ctx.lineTo(x + w, y + h);\n ctx.lineTo(x, y + h);\n ctx.closePath();\n ctx.fillStyle = color + \"44\";\n ctx.fill();\n ctx.beginPath();\n values.forEach((v, i) => {\n const px = x + i * step;\n const py = y + h - ((v - min) / range) * h;\n if (i === 0) ctx.moveTo(px, py);\n else ctx.lineTo(px, py);\n });\n }\n\n ctx.strokeStyle = color;\n ctx.lineWidth = 3;\n ctx.stroke();\n}\nexport function paintWidget(ctx: CanvasRenderingContext2D, spec: WidgetSpec, w: number, h: number, selected: boolean) {\n paintCardBg(ctx, w, h, selected);\n const pad = 20;\n\n switch (spec.kind) {\n case \"kpi\": {\n paintLabel(ctx, spec.label, pad, pad);\n ctx.fillStyle = \"#f1f5f9\";\n ctx.font = \"700 56px ui-sans-serif, system-ui, sans-serif\";\n ctx.fillText(spec.value, pad, pad + 32);\n if (spec.delta) {\n ctx.fillStyle = spec.trend === \"up\" ? \"#10b981\" : spec.trend === \"down\" ? \"#f43f5e\" : \"#94a3b8\";\n ctx.font = \"600 22px ui-sans-serif, system-ui, sans-serif\";\n ctx.fillText(spec.delta, pad, pad + 92);\n }\n break;\n }\n case \"chart\": {\n paintLabel(ctx, spec.title, pad, pad);\n paintSparkline(ctx, spec.series, pad, pad + 36, w - pad * 2, h - pad * 2 - 36, spec.variant, spec.color ?? \"#6366f1\");\n break;\n }\n case \"kanban\": {\n const colW = (w - pad * 2 - (spec.columns.length - 1) * 10) / spec.columns.length;\n spec.columns.forEach((col, i) => {\n const cx = pad + i * (colW + 10);\n ctx.fillStyle = \"#1e293b\";\n roundRect(ctx, cx, pad, colW, h - pad * 2, 8);\n ctx.fill();\n paintLabel(ctx, col.title, cx + 8, pad + 10);\n col.cards.forEach((c, j) => {\n ctx.fillStyle = \"#0f172a\";\n roundRect(ctx, cx + 8, pad + 44 + j * 38, colW - 16, 30, 6);\n ctx.fill();\n ctx.fillStyle = \"#cbd5e1\";\n ctx.font = \"500 20px ui-sans-serif, system-ui, sans-serif\";\n ctx.fillText(c, cx + 16, pad + 50 + j * 38);\n });\n });\n break;\n }\n case \"table\": {\n paintLabel(ctx, spec.title, pad, pad);\n ctx.fillStyle = \"#94a3b8\";\n ctx.font = \"600 18px ui-sans-serif, system-ui, sans-serif\";\n const colW = (w - pad * 2) / spec.columns.length;\n spec.columns.forEach((c, i) => ctx.fillText(c, pad + i * colW, pad + 38));\n ctx.fillStyle = \"#cbd5e1\";\n ctx.font = \"400 18px ui-sans-serif, system-ui, sans-serif\";\n spec.rows.forEach((row, ri) => {\n row.forEach((cell, ci) => ctx.fillText(String(cell), pad + ci * colW, pad + 70 + ri * 28));\n });\n break;\n }\n case \"profile\": {\n ctx.fillStyle = \"#6366f1\";\n ctx.beginPath();\n ctx.arc(pad + 30, pad + 30, 28, 0, Math.PI * 2);\n ctx.fill();\n ctx.fillStyle = \"#fff\";\n ctx.font = \"700 24px ui-sans-serif, system-ui, sans-serif\";\n ctx.textAlign = \"center\";\n ctx.fillText(spec.initials, pad + 30, pad + 22);\n ctx.textAlign = \"left\";\n ctx.fillStyle = \"#f1f5f9\";\n ctx.font = \"600 24px ui-sans-serif, system-ui, sans-serif\";\n ctx.fillText(spec.name, pad + 76, pad + 12);\n ctx.fillStyle = \"#94a3b8\";\n ctx.font = \"400 20px ui-sans-serif, system-ui, sans-serif\";\n ctx.fillText(spec.role, pad + 76, pad + 40);\n if (spec.status) {\n ctx.fillStyle = spec.status === \"online\" ? \"#10b981\" : spec.status === \"away\" ? \"#f59e0b\" : \"#64748b\";\n ctx.beginPath();\n ctx.arc(pad + 50, pad + 50, 6, 0, Math.PI * 2);\n ctx.fill();\n }\n break;\n }\n case \"callout\": {\n const tone = spec.tone === \"danger\" ? \"#f43f5e\" : spec.tone === \"warning\" ? \"#f59e0b\" : spec.tone === \"success\" ? \"#10b981\" : \"#3b82f6\";\n ctx.fillStyle = tone + \"22\";\n roundRect(ctx, 4, 4, w - 8, h - 8, 12);\n ctx.fill();\n ctx.fillStyle = tone;\n ctx.fillRect(12, 12, 4, h - 24);\n ctx.fillStyle = \"#f1f5f9\";\n ctx.font = \"600 22px ui-sans-serif, system-ui, sans-serif\";\n ctx.fillText(spec.title, 28, pad);\n ctx.fillStyle = \"#cbd5e1\";\n ctx.font = \"400 18px ui-sans-serif, system-ui, sans-serif\";\n wrapText(ctx, spec.body, 28, pad + 32, w - 40, 22);\n break;\n }\n case \"form\": {\n paintLabel(ctx, spec.title, pad, pad);\n spec.fields.forEach((f, i) => {\n const y = pad + 40 + i * 44;\n ctx.fillStyle = \"#cbd5e1\";\n ctx.font = \"500 18px ui-sans-serif, system-ui, sans-serif\";\n ctx.fillText(f.label, pad, y);\n ctx.fillStyle = \"#1e293b\";\n roundRect(ctx, w - pad - 100, y - 4, 100, 28, 6);\n ctx.fill();\n if (f.type === \"switch\") {\n ctx.fillStyle = \"#6366f1\";\n roundRect(ctx, w - pad - 60, y - 4, 60, 28, 14);\n ctx.fill();\n ctx.fillStyle = \"#fff\";\n ctx.beginPath();\n ctx.arc(w - pad - 18, y + 10, 10, 0, Math.PI * 2);\n ctx.fill();\n }\n });\n break;\n }\n case \"action\": {\n paintLabel(ctx, spec.title, pad, pad);\n let bx = pad;\n const by = pad + 40;\n spec.buttons.forEach((b) => {\n const tw = ctx.measureText(b.label).width + 24;\n ctx.fillStyle = b.variant === \"primary\" ? \"#6366f1\" : b.variant === \"ghost\" ? \"transparent\" : \"#1e293b\";\n if (b.variant !== \"ghost\") {\n roundRect(ctx, bx, by, tw, 36, 8);\n ctx.fill();\n }\n ctx.fillStyle = b.variant === \"primary\" ? \"#fff\" : \"#cbd5e1\";\n ctx.font = \"600 18px ui-sans-serif, system-ui, sans-serif\";\n ctx.fillText(b.label, bx + 12, by + 9);\n bx += tw + 8;\n });\n break;\n }\n case \"timeline\": {\n paintLabel(ctx, spec.title, pad, pad);\n spec.events.forEach((e, i) => {\n const y = pad + 40 + i * 32;\n ctx.fillStyle = \"#6366f1\";\n ctx.beginPath();\n ctx.arc(pad + 4, y + 10, 4, 0, Math.PI * 2);\n ctx.fill();\n ctx.strokeStyle = \"#1e293b\";\n if (i < spec.events.length - 1) {\n ctx.beginPath();\n ctx.moveTo(pad + 4, y + 14);\n ctx.lineTo(pad + 4, y + 32);\n ctx.stroke();\n }\n ctx.fillStyle = \"#94a3b8\";\n ctx.font = \"500 14px ui-monospace, monospace\";\n ctx.fillText(e.at, pad + 16, y);\n ctx.fillStyle = \"#cbd5e1\";\n ctx.font = \"400 18px ui-sans-serif, system-ui, sans-serif\";\n ctx.fillText(e.label, pad + 60, y);\n });\n break;\n }\n case \"code\": {\n paintLabel(ctx, spec.title, pad, pad);\n ctx.fillStyle = \"#020617\";\n roundRect(ctx, pad, pad + 36, w - pad * 2, h - pad * 2 - 36, 8);\n ctx.fill();\n ctx.fillStyle = \"#a5b4fc\";\n ctx.font = \"400 16px ui-monospace, monospace\";\n const lines = spec.code.split(\"\\n\");\n lines.forEach((ln, i) => ctx.fillText(ln, pad + 14, pad + 56 + i * 22));\n break;\n }\n case \"image\": {\n ctx.fillStyle = \"#1e293b\";\n roundRect(ctx, pad, pad, w - pad * 2, h - pad * 2, 8);\n ctx.fill();\n ctx.fillStyle = \"#64748b\";\n ctx.font = \"400 18px ui-sans-serif, system-ui, sans-serif\";\n ctx.textAlign = \"center\";\n ctx.fillText(spec.alt, w / 2, h / 2);\n ctx.textAlign = \"left\";\n break;\n }\n case \"text\": {\n ctx.fillStyle = \"#f1f5f9\";\n ctx.font = \"700 26px ui-sans-serif, system-ui, sans-serif\";\n ctx.fillText(spec.heading, pad, pad);\n ctx.fillStyle = \"#cbd5e1\";\n ctx.font = \"400 18px ui-sans-serif, system-ui, sans-serif\";\n wrapText(ctx, spec.body, pad, pad + 38, w - pad * 2, 22);\n break;\n }\n case \"screen\": {\n const bezel = spec.bezel ?? \"#0b0f17\";\n const t = spec.bezelThickness ?? 14;\n const on = spec.on ?? true;\n const brightness = spec.brightness ?? (on ? 1 : 0.06);\n const bg = spec.background ?? \"#020617\";\n\n // Outer bezel\n ctx.fillStyle = bezel;\n roundRect(ctx, 0, 0, w, h, 18);\n ctx.fill();\n // Inner screen area\n const sx = t;\n const sy = t;\n const sw = w - t * 2;\n const sh = h - t * 2;\n ctx.save();\n ctx.fillStyle = bg;\n roundRect(ctx, sx, sy, sw, sh, 8);\n ctx.fill();\n ctx.beginPath();\n roundRect(ctx, sx, sy, sw, sh, 8);\n ctx.clip();\n ctx.translate(sx, sy);\n // Apply brightness as global alpha multiplier\n ctx.globalAlpha = brightness;\n const c = spec.content;\n if (c.type === \"label\") {\n ctx.fillStyle = \"#e2e8f0\";\n ctx.font = \"700 32px ui-sans-serif, system-ui, sans-serif\";\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n ctx.fillText(c.title, sw / 2, sh / 2 - (c.subtitle ? 16 : 0));\n if (c.subtitle) {\n ctx.fillStyle = \"#94a3b8\";\n ctx.font = \"400 18px ui-sans-serif, system-ui, sans-serif\";\n ctx.fillText(c.subtitle, sw / 2, sh / 2 + 18);\n }\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"alphabetic\";\n } else if (c.type === \"paint\") {\n c.paint(ctx, sw, sh);\n } else if (c.type === \"image\") {\n // Image content is best painted by the consumer via \"paint\" — labels\n // serve as a fallback so the screen still has identifiable content.\n ctx.fillStyle = \"#475569\";\n ctx.font = \"500 16px ui-sans-serif, system-ui, sans-serif\";\n ctx.textAlign = \"center\";\n ctx.fillText(c.alt ?? \"image\", sw / 2, sh / 2);\n ctx.textAlign = \"left\";\n }\n ctx.globalAlpha = 1;\n ctx.restore();\n // Power LED\n ctx.fillStyle = on ? \"#10b981\" : \"#475569\";\n ctx.beginPath();\n ctx.arc(w - t - 6, h - t - 6, 4, 0, Math.PI * 2);\n ctx.fill();\n // Subtle glass reflection\n const grad = ctx.createLinearGradient(sx, sy, sx, sy + sh);\n grad.addColorStop(0, \"rgba(255,255,255,0.08)\");\n grad.addColorStop(0.4, \"rgba(255,255,255,0)\");\n ctx.fillStyle = grad;\n ctx.beginPath();\n roundRect(ctx, sx, sy, sw, sh, 8);\n ctx.fill();\n break;\n }\n case \"demoPage\": {\n const u = unitOf(w, h);\n const padX = w * 0.06;\n const headerH = h * 0.22;\n const titleY = headerH + h * 0.12;\n const titleSize = h * 0.16;\n const descY = titleY + titleSize * 0.6;\n const descSize = h * 0.072;\n const descLine = descSize * 1.4;\n const chipSize = h * 0.052;\n const pathSize = h * 0.052;\n const ctaSize = h * 0.075;\n const ctaH = ctaSize * 2;\n\n // Accent header bar — slightly overlaps card top to visually anchor\n ctx.fillStyle = spec.accent;\n roundRect(ctx, 0, 0, w, headerH, 14 * u);\n ctx.fill();\n // Squared bottom on the accent bar (cancel rounded bottom corners)\n ctx.fillRect(0, headerH - 14 * u, w, 14 * u);\n\n // Category chip\n ctx.fillStyle = \"rgba(255,255,255,0.22)\";\n const chipText = spec.category.toUpperCase();\n ctx.font = `700 ${chipSize}px ui-sans-serif, system-ui, sans-serif`;\n ctx.textBaseline = \"top\";\n const chipPad = chipSize * 0.7;\n const chipW = ctx.measureText(chipText).width + chipPad * 2;\n const chipH = chipSize * 1.85;\n const chipY = (headerH - chipH) / 2;\n roundRect(ctx, padX, chipY, chipW, chipH, chipH / 2);\n ctx.fill();\n ctx.fillStyle = \"#fff\";\n ctx.fillText(chipText, padX + chipPad, chipY + (chipH - chipSize) / 2);\n\n // Path on right\n ctx.fillStyle = \"rgba(255,255,255,0.9)\";\n ctx.font = `500 ${pathSize}px ui-monospace, monospace`;\n const pathW = ctx.measureText(spec.path).width;\n ctx.fillText(spec.path, w - padX - pathW, chipY + (chipH - chipSize) / 2);\n\n // Title\n ctx.fillStyle = \"#f8fafc\";\n ctx.font = `800 ${titleSize}px ui-sans-serif, system-ui, sans-serif`;\n ctx.fillText(spec.name, padX, titleY);\n\n // Description (wrapped, clipped before reaching the CTA)\n ctx.fillStyle = \"#94a3b8\";\n ctx.font = `400 ${descSize}px ui-sans-serif, system-ui, sans-serif`;\n const ctaY = h - padX - ctaH;\n wrapText(ctx, spec.description, padX, descY, w - padX * 2, descLine, ctaY - descLine);\n\n // CTA at bottom\n ctx.fillStyle = spec.accent;\n const ctaText = \"Open demo →\";\n ctx.font = `600 ${ctaSize}px ui-sans-serif, system-ui, sans-serif`;\n const ctaTextPad = ctaSize * 0.9;\n const ctaW = ctx.measureText(ctaText).width + ctaTextPad * 2;\n roundRect(ctx, padX, ctaY, ctaW, ctaH, ctaH * 0.25);\n ctx.fill();\n ctx.fillStyle = \"#0f172a\";\n ctx.fillText(ctaText, padX + ctaTextPad, ctaY + (ctaH - ctaSize) / 2);\n ctx.textBaseline = \"alphabetic\";\n break;\n }\n }\n}\n\nfunction wrapText(\n ctx: CanvasRenderingContext2D,\n text: string,\n x: number,\n y: number,\n maxW: number,\n lineH: number,\n maxY?: number\n) {\n const words = text.split(\" \");\n let line = \"\";\n let yy = y;\n for (const word of words) {\n const test = line ? `${line} ${word}` : word;\n if (ctx.measureText(test).width > maxW && line) {\n if (maxY !== undefined && yy > maxY) return;\n ctx.fillText(line, x, yy);\n line = word;\n yy += lineH;\n } else {\n line = test;\n }\n }\n if (line && (maxY === undefined || yy <= maxY)) ctx.fillText(line, x, yy);\n}\n","/**\n * 3D shape primitives for `@particle-academy/fancy-3d` — three.js edition.\n *\n * A primitive is a three.js mesh that can host UI content on its surface —\n * either a flat color, a freeform 2D paint callback, or a `WidgetSpec`\n * rendered through the same painters as the three.js adapter.\n *\n * Every primitive returns a three.js `Mesh` (or a `Group` for composites),\n * ready to position in your scene. Pass `scene` to also add it for you.\n *\n * Mirrors `@particle-academy/fancy-3d-babylon`'s primitive API: same function\n * names, same option shapes. Differences from the Babylon adapter are minor and\n * idiomatic to three (e.g. `doubleSided?: boolean` instead of a `sideOrientation`\n * enum; `scene` is optional since three meshes exist independent of a scene).\n */\nimport * as THREE from \"three\";\nimport { DecalGeometry } from \"three/examples/jsm/geometries/DecalGeometry.js\";\nimport type { WidgetSpec } from \"@particle-academy/fancy-3d\";\nimport { TEX_SCALE, paintWidget } from \"./painters\";\n\nexport type PaintFn = (ctx: CanvasRenderingContext2D, width: number, height: number) => void;\n\nexport type SurfaceContent =\n | { type: \"color\"; color: string }\n | { type: \"paint\"; paint: PaintFn; pixelWidth?: number; pixelHeight?: number; transparent?: boolean }\n | { type: \"widget\"; widget: WidgetSpec; pixelWidth?: number; pixelHeight?: number; selected?: boolean };\n\nconst DEFAULT_DENSITY = 120;\nconst MAX_TEXTURE_AXIS = 1024;\n\nfunction autoPixelSize(worldWidth: number, worldHeight: number, density = DEFAULT_DENSITY) {\n let w = Math.max(96, Math.round(worldWidth * density));\n let h = Math.max(96, Math.round(worldHeight * density));\n const scale = Math.min(1, MAX_TEXTURE_AXIS / Math.max(w, h));\n if (scale < 1) {\n w = Math.round(w * scale);\n h = Math.round(h * scale);\n }\n return { w, h };\n}\n\n/** Draw onto a fresh retina canvas and wrap it in a three CanvasTexture. */\nfunction canvasTexture(w: number, h: number, draw: (ctx: CanvasRenderingContext2D) => void): THREE.CanvasTexture {\n const canvas = document.createElement(\"canvas\");\n canvas.width = Math.max(1, Math.round(w * TEX_SCALE));\n canvas.height = Math.max(1, Math.round(h * TEX_SCALE));\n const ctx = canvas.getContext(\"2d\") as CanvasRenderingContext2D;\n ctx.scale(TEX_SCALE, TEX_SCALE);\n draw(ctx);\n const tex = new THREE.CanvasTexture(canvas);\n tex.colorSpace = THREE.SRGBColorSpace;\n tex.anisotropy = 4;\n tex.needsUpdate = true;\n return tex;\n}\n\ninterface Surface {\n material: THREE.Material;\n texture: THREE.CanvasTexture | null;\n}\n\n/**\n * Resolve a SurfaceContent to a three material (+ optional texture). UI surfaces\n * (paint/widget) use an unlit `MeshBasicMaterial` so text stays readable\n * regardless of scene lighting — matching the Babylon adapter's self-emissive\n * panels. Flat colors use a lit `MeshStandardMaterial` so structure reads form.\n */\nfunction buildSurface(surface: SurfaceContent, autoSize?: { worldWidth: number; worldHeight: number }): Surface {\n if (surface.type === \"color\") {\n const color = new THREE.Color(surface.color);\n const material = new THREE.MeshStandardMaterial({\n color,\n emissive: color.clone().multiplyScalar(0.15),\n roughness: 0.7,\n metalness: 0.0,\n });\n return { material, texture: null };\n }\n\n let w = surface.pixelWidth;\n let h = surface.pixelHeight;\n if ((w == null || h == null) && autoSize) {\n const auto = autoPixelSize(autoSize.worldWidth, autoSize.worldHeight);\n w = w ?? auto.w;\n h = h ?? auto.h;\n }\n w = w ?? 512;\n h = h ?? 512;\n\n const transparent = surface.type === \"widget\" || (surface.type === \"paint\" && !!surface.transparent);\n const texture = canvasTexture(w, h, (ctx) => {\n if (surface.type === \"paint\") surface.paint(ctx, w!, h!);\n else paintWidget(ctx, surface.widget, w!, h!, surface.selected ?? false);\n });\n const material = new THREE.MeshBasicMaterial({ map: texture, transparent, toneMapped: false });\n return { material, texture };\n}\n\n/** Add to a scene/group if one was supplied (parity with Babylon's auto-add). */\nfunction attach<T extends THREE.Object3D>(obj: T, scene?: THREE.Object3D): T {\n if (scene) scene.add(obj);\n return obj;\n}\n\n/* ------------------------------------------------------------------ */\n/* Panel — flat 2D plane with one surface */\n/* ------------------------------------------------------------------ */\n\nexport interface PanelOpts {\n scene?: THREE.Object3D;\n name?: string;\n width: number;\n height: number;\n surface: SurfaceContent;\n /** Render both faces (e.g. for self-luminous screens). */\n doubleSided?: boolean;\n}\n\nexport function createPanel(opts: PanelOpts): THREE.Mesh {\n const geo = new THREE.PlaneGeometry(opts.width, opts.height);\n const { material } = buildSurface(opts.surface, { worldWidth: opts.width, worldHeight: opts.height });\n if (opts.doubleSided) material.side = THREE.DoubleSide;\n const mesh = new THREE.Mesh(geo, material);\n mesh.name = opts.name ?? \"panel\";\n return attach(mesh, opts.scene);\n}\n\n/* ------------------------------------------------------------------ */\n/* Billboard — panel that can be set to always face the camera */\n/* ------------------------------------------------------------------ */\n\nexport interface BillboardOpts extends PanelOpts {\n /** When true, the mesh is flagged to always face the camera. `<Stage>` honors\n * the flag each frame; outside a Stage, call `mesh.lookAt(camera.position)`. */\n faceCamera?: boolean;\n}\n\nexport function createBillboard(opts: BillboardOpts): THREE.Mesh {\n const m = createPanel({ ...opts, scene: undefined, name: opts.name ?? \"billboard\" });\n if (opts.faceCamera) m.userData.faceCamera = true;\n return attach(m, opts.scene);\n}\n\n/* ------------------------------------------------------------------ */\n/* Building — rectangular box with optional facade texture */\n/* ------------------------------------------------------------------ */\n\nexport interface BuildingOpts {\n scene?: THREE.Object3D;\n name?: string;\n width: number;\n height: number;\n depth: number;\n /** Surface applied to all 6 faces (cheap path). */\n surface?: SurfaceContent;\n /** Per-face surfaces; missing faces use `surface` or a default grey. */\n faces?: Partial<Record<BoxFace, SurfaceContent>>;\n}\n\nexport type BoxFace = \"front\" | \"back\" | \"right\" | \"left\" | \"top\" | \"bottom\";\n\n/** three BoxGeometry group order: +X, -X, +Y, -Y, +Z, -Z. */\nconst THREE_FACE_ORDER: BoxFace[] = [\"right\", \"left\", \"top\", \"bottom\", \"front\", \"back\"];\n\nexport function createBuilding(opts: BuildingOpts): THREE.Mesh {\n const geo = new THREE.BoxGeometry(opts.width, opts.height, opts.depth);\n\n if (opts.surface && !opts.faces) {\n const { material } = buildSurface(opts.surface, { worldWidth: opts.width, worldHeight: opts.height });\n const mesh = new THREE.Mesh(geo, material);\n mesh.name = opts.name ?? \"building\";\n return attach(mesh, opts.scene);\n }\n\n // Per-face: three exposes 6 geometry groups, one per face — assign a material\n // array in +X,-X,+Y,-Y,+Z,-Z order.\n const materials = THREE_FACE_ORDER.map((face) => {\n const surface = opts.faces?.[face] ?? opts.surface ?? { type: \"color\" as const, color: \"#475569\" };\n const isSide = face === \"front\" || face === \"back\";\n return buildSurface(surface, { worldWidth: isSide ? opts.width : opts.depth, worldHeight: opts.height }).material;\n });\n const mesh = new THREE.Mesh(geo, materials);\n mesh.name = opts.name ?? \"building\";\n return attach(mesh, opts.scene);\n}\n\n/* ------------------------------------------------------------------ */\n/* Pillar — alias for a tall narrow building */\n/* ------------------------------------------------------------------ */\n\nexport interface PillarOpts {\n scene?: THREE.Object3D;\n name?: string;\n thickness: number;\n height: number;\n surface?: SurfaceContent;\n}\n\nexport function createPillar(opts: PillarOpts): THREE.Mesh {\n return createBuilding({\n scene: opts.scene,\n name: opts.name ?? \"pillar\",\n width: opts.thickness,\n depth: opts.thickness,\n height: opts.height,\n surface: opts.surface,\n });\n}\n\n/* ------------------------------------------------------------------ */\n/* Cylinder — tube with content wrapping the side */\n/* ------------------------------------------------------------------ */\n\nexport interface CylinderOpts {\n scene?: THREE.Object3D;\n name?: string;\n radius: number;\n height: number;\n surface: SurfaceContent;\n tessellation?: number;\n}\n\nexport function createCylinder(opts: CylinderOpts): THREE.Mesh {\n const geo = new THREE.CylinderGeometry(opts.radius, opts.radius, opts.height, opts.tessellation ?? 48, 1, false);\n const { material } = buildSurface(opts.surface, { worldWidth: opts.radius * 2 * Math.PI, worldHeight: opts.height });\n const mesh = new THREE.Mesh(geo, material);\n mesh.name = opts.name ?? \"cylinder\";\n return attach(mesh, opts.scene);\n}\n\n/* ------------------------------------------------------------------ */\n/* CurvedPanel — a partial cylindrical sheet (like a wraparound ad) */\n/* ------------------------------------------------------------------ */\n\nexport interface CurvedPanelOpts {\n scene?: THREE.Object3D;\n name?: string;\n width: number; // arc length\n height: number;\n arc: number; // radians spanned\n surface: SurfaceContent;\n tessellation?: number;\n}\n\nexport function createCurvedPanel(opts: CurvedPanelOpts): THREE.Mesh {\n const radius = opts.width / opts.arc;\n const segments = Math.max(8, opts.tessellation ?? 48);\n // Open-ended partial cylinder, centered on the +Z axis (thetaStart offsets the\n // arc so it's symmetric about the camera's default forward direction).\n const geo = new THREE.CylinderGeometry(\n radius,\n radius,\n opts.height,\n segments,\n 1,\n true,\n Math.PI / 2 - opts.arc / 2,\n opts.arc,\n );\n const { material } = buildSurface(opts.surface, { worldWidth: opts.width, worldHeight: opts.height });\n material.side = THREE.DoubleSide;\n const mesh = new THREE.Mesh(geo, material);\n mesh.name = opts.name ?? \"curved-panel\";\n return attach(mesh, opts.scene);\n}\n\n/* ------------------------------------------------------------------ */\n/* Sphere — full sphere with equirectangular surface */\n/* ------------------------------------------------------------------ */\n\nexport interface SphereOpts {\n scene?: THREE.Object3D;\n name?: string;\n diameter: number;\n surface: SurfaceContent;\n segments?: number;\n}\n\nexport function createSphere(opts: SphereOpts): THREE.Mesh {\n const geo = new THREE.SphereGeometry(opts.diameter / 2, opts.segments ?? 32, opts.segments ?? 32);\n const { material } = buildSurface(opts.surface, { worldWidth: opts.diameter * Math.PI, worldHeight: (opts.diameter * Math.PI) / 2 });\n const mesh = new THREE.Mesh(geo, material);\n mesh.name = opts.name ?? \"sphere\";\n return attach(mesh, opts.scene);\n}\n\n/* ------------------------------------------------------------------ */\n/* Disc — flat disc/circle */\n/* ------------------------------------------------------------------ */\n\nexport interface DiscOpts {\n scene?: THREE.Object3D;\n name?: string;\n radius: number;\n surface: SurfaceContent;\n tessellation?: number;\n}\n\nexport function createDisc(opts: DiscOpts): THREE.Mesh {\n const geo = new THREE.CircleGeometry(opts.radius, opts.tessellation ?? 64);\n const { material } = buildSurface(opts.surface, { worldWidth: opts.radius * 2, worldHeight: opts.radius * 2 });\n const mesh = new THREE.Mesh(geo, material);\n mesh.name = opts.name ?? \"disc\";\n return attach(mesh, opts.scene);\n}\n\n/* ------------------------------------------------------------------ */\n/* Card3D — an extruded panel (gives panels physical depth) */\n/* ------------------------------------------------------------------ */\n\nexport interface Card3DOpts {\n scene?: THREE.Object3D;\n name?: string;\n width: number;\n height: number;\n /** Extrusion depth. Defaults to a thin 0.06 — like real foam-board signage. */\n depth?: number;\n /** Surface for the front face (the visible UI). */\n front: SurfaceContent;\n /** Surface for the side and back faces. Defaults to a dark color. */\n edge?: SurfaceContent;\n}\n\nexport function createCard3D(opts: Card3DOpts): THREE.Mesh {\n const edge = opts.edge ?? { type: \"color\" as const, color: \"#0b0f17\" };\n return createBuilding({\n scene: opts.scene,\n name: opts.name ?? \"card3d\",\n width: opts.width,\n height: opts.height,\n depth: opts.depth ?? 0.06,\n faces: { front: opts.front, back: edge, top: edge, bottom: edge, left: edge, right: edge },\n });\n}\n\n/* ------------------------------------------------------------------ */\n/* Sign — a panel mounted on a post */\n/* ------------------------------------------------------------------ */\n\nexport interface SignOpts {\n scene?: THREE.Object3D;\n name?: string;\n width: number;\n height: number;\n postHeight?: number;\n postThickness?: number;\n surface: SurfaceContent;\n postColor?: string;\n}\n\nexport interface SignResult {\n root: THREE.Group;\n panel: THREE.Mesh;\n post: THREE.Mesh;\n}\n\nexport function createSign(opts: SignOpts): SignResult {\n const name = opts.name ?? \"sign\";\n const postHeight = opts.postHeight ?? 1.4;\n const postThickness = opts.postThickness ?? 0.12;\n const postColor = opts.postColor ?? \"#1f2937\";\n\n const root = new THREE.Group();\n root.name = `${name}-root`;\n\n const panel = createBillboard({ name: `${name}-panel`, width: opts.width, height: opts.height, surface: opts.surface });\n panel.position.set(0, postHeight + opts.height / 2, 0);\n root.add(panel);\n\n const post = new THREE.Mesh(\n new THREE.BoxGeometry(postThickness, postHeight, postThickness),\n new THREE.MeshStandardMaterial({ color: new THREE.Color(postColor), roughness: 0.6 }),\n );\n post.name = `${name}-post`;\n post.position.set(0, postHeight / 2, 0);\n root.add(post);\n\n attach(root, opts.scene);\n return { root, panel, post };\n}\n\n/* ------------------------------------------------------------------ */\n/* Monitor — a 3D display: extruded bezel + recessed screen face */\n/* ------------------------------------------------------------------ */\n\nexport interface MonitorOpts {\n scene?: THREE.Object3D;\n name?: string;\n width: number;\n height: number;\n /** Front-to-back depth of the display chassis. Defaults to 0.18. */\n depth?: number;\n /** Bezel color. Defaults to near-black. */\n bezel?: string;\n /** Screen surface — color, paint, or widget. */\n screen: SurfaceContent;\n /** Optional kickstand height — when set, the monitor sits on a base. */\n standHeight?: number;\n}\n\nexport interface MonitorResult {\n root: THREE.Group;\n body: THREE.Mesh;\n screen: THREE.Mesh;\n stand?: THREE.Mesh;\n}\n\nexport function createMonitor(opts: MonitorOpts): MonitorResult {\n const name = opts.name ?? \"monitor\";\n const depth = opts.depth ?? 0.18;\n const bezelColor = new THREE.Color(opts.bezel ?? \"#0b0f17\");\n const bodyMat = new THREE.MeshStandardMaterial({ color: bezelColor, roughness: 0.5, metalness: 0.1 });\n\n const root = new THREE.Group();\n root.name = `${name}-root`;\n\n const body = new THREE.Mesh(new THREE.BoxGeometry(opts.width, opts.height, depth), bodyMat);\n body.name = `${name}-body`;\n root.add(body);\n\n // Screen face — a plane on the +Z front of the bezel (PlaneGeometry faces +Z\n // by default, which is where the default camera sits, so no flip needed).\n const screenInset = 0.04;\n const screen = createPanel({\n name: `${name}-screen`,\n width: opts.width - screenInset * 2,\n height: opts.height - screenInset * 2,\n surface: opts.screen,\n });\n screen.position.set(0, 0, depth / 2 + 0.005);\n root.add(screen);\n\n let stand: THREE.Mesh | undefined;\n if (opts.standHeight && opts.standHeight > 0) {\n stand = new THREE.Mesh(new THREE.BoxGeometry(opts.width * 0.3, opts.standHeight, depth * 1.5), bodyMat);\n stand.name = `${name}-stand`;\n stand.position.set(0, -opts.height / 2 - opts.standHeight / 2, 0);\n root.add(stand);\n }\n\n attach(root, opts.scene);\n return { root, body, screen, stand };\n}\n\n/* ------------------------------------------------------------------ */\n/* Decal — project a 2D pattern onto another mesh's surface */\n/* ------------------------------------------------------------------ */\n\nexport interface DecalOpts {\n scene?: THREE.Object3D;\n name?: string;\n /** The mesh to project the decal onto. */\n target: THREE.Mesh;\n /** World-space position the projector sits at. */\n position: THREE.Vector3;\n /** Direction the projector points. Defaults to -Z. */\n normal?: THREE.Vector3;\n /** Size of the decal box. */\n size: { width: number; height: number; depth?: number };\n /** Rotation around the projection axis (radians). */\n angle?: number;\n /** Surface to project. */\n surface: SurfaceContent;\n}\n\nexport function createDecal(opts: DecalOpts): THREE.Mesh {\n const name = opts.name ?? \"decal\";\n const normal = (opts.normal ?? new THREE.Vector3(0, 0, -1)).clone().normalize();\n\n // Orientation: align the decal projector's forward (+Z) to the normal, plus a\n // roll of `angle` around that axis.\n const quat = new THREE.Quaternion().setFromUnitVectors(new THREE.Vector3(0, 0, 1), normal);\n if (opts.angle) quat.multiply(new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0, 0, 1), opts.angle));\n const orientation = new THREE.Euler().setFromQuaternion(quat);\n const size = new THREE.Vector3(opts.size.width, opts.size.height, opts.size.depth ?? 1);\n\n const geo = new DecalGeometry(opts.target, opts.position, orientation, size);\n const { material } = buildSurface(opts.surface, { worldWidth: opts.size.width, worldHeight: opts.size.height });\n // Decals sit on top of the target — offset to avoid z-fighting + show the\n // target through transparent borders.\n (material as THREE.MeshBasicMaterial).transparent = true;\n material.polygonOffset = true;\n material.polygonOffsetFactor = -4;\n material.depthWrite = false;\n const mesh = new THREE.Mesh(geo, material);\n mesh.name = name;\n return attach(mesh, opts.scene);\n}\n\n/* ------------------------------------------------------------------ */\n/* Helper: paint a widget onto a fresh CanvasTexture (escape hatch) */\n/* ------------------------------------------------------------------ */\n\nexport function createWidgetTexture(\n name: string,\n widget: WidgetSpec,\n pixelWidth: number,\n pixelHeight: number,\n selected = false,\n): THREE.CanvasTexture {\n const tex = canvasTexture(pixelWidth, pixelHeight, (ctx) => paintWidget(ctx, widget, pixelWidth, pixelHeight, selected));\n tex.name = name;\n return tex;\n}\n","/**\n * Layout helpers — map 2D scene-node positions onto 3D arrangements (three.js).\n *\n * All layout functions take the same shape: a SceneNode, the Object3D that was\n * built for it, the scene's bounds, and layout-specific options. They mutate\n * `obj.position` (and sometimes `obj.rotation.y`) in place.\n *\n * Pair with `sceneBounds(scene)` from the package root to compute the bounds.\n * Mirrors `@particle-academy/fancy-3d-babylon`'s layout API.\n */\nimport * as THREE from \"three\";\nimport type { SceneNode } from \"@particle-academy/fancy-3d\";\n\ninterface Bounds {\n minX: number;\n maxX: number;\n minY: number;\n maxY: number;\n}\n\nfunction sizeOf(node: SceneNode): { w: number; h: number } {\n return { w: node.size?.w ?? 200, h: node.size?.h ?? 120 };\n}\n\nfunction normalizedCenter(node: SceneNode, bounds: Bounds) {\n const { w, h } = sizeOf(node);\n const cx = (node.position.x + w / 2 - bounds.minX) / Math.max(1, bounds.maxX - bounds.minX);\n const cy = (node.position.y + h / 2 - bounds.minY) / Math.max(1, bounds.maxY - bounds.minY);\n return { cx, cy };\n}\n\n/* ------------------------------------------------------------------ */\n/* Grid — flat XY grid in front of the camera */\n/* ------------------------------------------------------------------ */\n\nexport interface GridLayoutOpts {\n /** Pixel-to-world unit ratio. Defaults to 1/120. */\n scale?: number;\n /** World-space center of the grid. Defaults to (0, 0, 0). */\n origin?: THREE.Vector3;\n}\n\nexport function placeOnGrid(node: SceneNode, obj: THREE.Object3D, bounds: Bounds, opts: GridLayoutOpts = {}) {\n const scale = opts.scale ?? 1 / 120;\n const origin = opts.origin ?? new THREE.Vector3(0, 0, 0);\n const { w, h } = sizeOf(node);\n const cx = node.position.x + w / 2 - (bounds.minX + bounds.maxX) / 2;\n const cy = node.position.y + h / 2 - (bounds.minY + bounds.maxY) / 2;\n obj.position.set(origin.x + cx * scale, origin.y - cy * scale, origin.z);\n}\n\n/* ------------------------------------------------------------------ */\n/* Wall — gallery layout against a vertical plane */\n/* ------------------------------------------------------------------ */\n\nexport interface WallLayoutOpts {\n z?: number;\n spreadX?: number;\n spreadY?: number;\n centerY?: number;\n}\n\nexport function placeOnWall(node: SceneNode, obj: THREE.Object3D, bounds: Bounds, opts: WallLayoutOpts = {}) {\n const spreadX = opts.spreadX ?? 10;\n const spreadY = opts.spreadY ?? 4;\n const centerY = opts.centerY ?? 1.5;\n const z = opts.z ?? 0;\n const { cx, cy } = normalizedCenter(node, bounds);\n obj.position.set((cx - 0.5) * spreadX, centerY + (0.5 - cy) * spreadY, z);\n obj.rotation.y = 0;\n}\n\n/* ------------------------------------------------------------------ */\n/* Arc — partial cylinder */\n/* ------------------------------------------------------------------ */\n\nexport interface ArcLayoutOpts {\n radius?: number;\n arc?: number;\n height?: number;\n baseY?: number;\n}\n\nexport function placeOnArc(node: SceneNode, obj: THREE.Object3D, bounds: Bounds, opts: ArcLayoutOpts = {}) {\n const radius = opts.radius ?? 6;\n const arc = opts.arc ?? Math.PI * 0.9;\n const height = opts.height ?? 6;\n const baseY = opts.baseY ?? 0;\n const { cx, cy } = normalizedCenter(node, bounds);\n const angle = (cx - 0.5) * arc;\n obj.position.set(Math.sin(angle) * radius, baseY + (0.5 - cy) * height, Math.cos(angle) * radius);\n obj.rotation.y = angle;\n}\n\n/* ------------------------------------------------------------------ */\n/* Path — distribute along a sequence of waypoints */\n/* ------------------------------------------------------------------ */\n\nexport interface PathLayoutOpts {\n waypoints: THREE.Vector3[];\n faceForward?: boolean;\n byIndex?: boolean;\n nodeCount?: number;\n}\n\nfunction lerpPath(waypoints: THREE.Vector3[], t: number): { pos: THREE.Vector3; tangent: THREE.Vector3 } {\n if (waypoints.length === 0) return { pos: new THREE.Vector3(0, 0, 0), tangent: new THREE.Vector3(0, 0, 1) };\n if (waypoints.length === 1) return { pos: waypoints[0].clone(), tangent: new THREE.Vector3(0, 0, 1) };\n const segments = waypoints.length - 1;\n const scaled = Math.max(0, Math.min(1, t)) * segments;\n const i = Math.min(segments - 1, Math.floor(scaled));\n const local = scaled - i;\n const a = waypoints[i];\n const b = waypoints[i + 1];\n const pos = a.clone().lerp(b, local);\n const tangent = b.clone().sub(a).normalize();\n return { pos, tangent };\n}\n\nexport function placeOnPath(node: SceneNode, obj: THREE.Object3D, bounds: Bounds, opts: PathLayoutOpts) {\n const faceForward = opts.faceForward ?? true;\n let t: number;\n if (opts.byIndex) {\n const total = opts.nodeCount ?? Math.max(1, bounds.maxX - bounds.minX);\n const idx = node.position.x;\n t = total > 1 ? idx / (total - 1) : 0.5;\n } else {\n const { cx } = normalizedCenter(node, bounds);\n t = cx;\n }\n const { pos, tangent } = lerpPath(opts.waypoints, t);\n obj.position.copy(pos);\n if (faceForward) obj.rotation.y = Math.atan2(tangent.x, tangent.z);\n}\n\n/* ------------------------------------------------------------------ */\n/* Sphere — wrap nodes onto a sphere surface */\n/* ------------------------------------------------------------------ */\n\nexport interface SphereLayoutOpts {\n radius?: number;\n center?: THREE.Vector3;\n latSpan?: number;\n lonSpan?: number;\n}\n\nexport function placeOnSphere(node: SceneNode, obj: THREE.Object3D, bounds: Bounds, opts: SphereLayoutOpts = {}) {\n const radius = opts.radius ?? 5;\n const center = opts.center ?? new THREE.Vector3(0, 0, 0);\n const latSpan = opts.latSpan ?? Math.PI * 0.7;\n const lonSpan = opts.lonSpan ?? Math.PI * 2;\n const { cx, cy } = normalizedCenter(node, bounds);\n const lon = (cx - 0.5) * lonSpan;\n const lat = (0.5 - cy) * latSpan;\n const x = radius * Math.cos(lat) * Math.sin(lon);\n const y = radius * Math.sin(lat);\n const z = radius * Math.cos(lat) * Math.cos(lon);\n obj.position.set(center.x + x, center.y + y, center.z + z);\n obj.rotation.y = lon;\n}\n","/**\n * three.js adapter for `@particle-academy/fancy-3d`.\n *\n * Each widget kind paints onto a 2D HTMLCanvasElement that becomes a three\n * `CanvasTexture`, applied to a plane mesh sized to the widget's pixel rect.\n * The same `Scene` data renders recognizably across the DOM, Babylon, and\n * three.js adapters.\n *\n * `three` is a peer dependency — only consumers building 3D scenes install it.\n *\n * import { renderScene } from \"@particle-academy/fancy-3d\";\n * import { createThreeAdapter, placeOnArc, sceneBounds } from \"@particle-academy/fancy-3d-three\";\n */\nimport * as THREE from \"three\";\nimport type {\n AdapterContext,\n Scene,\n SceneNode,\n WidgetAdapter,\n WidgetSpec,\n} from \"@particle-academy/fancy-3d\";\n\nimport { TEX_SCALE, paintWidget } from \"./painters\";\nexport { TEX_SCALE, paintWidget } from \"./painters\";\n\nconst WORLD_SCALE = 1 / 180; // pixels → world units\n\n/* ------------------------------------------------------------------ */\n/* Adapter */\n/* ------------------------------------------------------------------ */\n\nexport interface ThreeAdapterDeps {\n /** The three Scene meshes are added to. */\n scene3D: THREE.Scene;\n /** Pixel size for the widget (the scene node's `size` field). */\n sizeFor(spec: WidgetSpec): { w: number; h: number };\n}\n\nexport function createThreeAdapter(deps: ThreeAdapterDeps): WidgetAdapter<THREE.Object3D> {\n return {\n render(spec: WidgetSpec, ctx: AdapterContext): THREE.Object3D {\n const { w, h } = deps.sizeFor(spec);\n const canvas = document.createElement(\"canvas\");\n canvas.width = Math.max(1, Math.round(w * TEX_SCALE));\n canvas.height = Math.max(1, Math.round(h * TEX_SCALE));\n const c = canvas.getContext(\"2d\") as CanvasRenderingContext2D;\n c.scale(TEX_SCALE, TEX_SCALE);\n paintWidget(c, spec, w, h, ctx.selected);\n\n const tex = new THREE.CanvasTexture(canvas);\n tex.colorSpace = THREE.SRGBColorSpace;\n tex.anisotropy = 4;\n tex.needsUpdate = true;\n\n const mat = new THREE.MeshBasicMaterial({ map: tex, transparent: true, toneMapped: false });\n const geo = new THREE.PlaneGeometry(w * WORLD_SCALE, h * WORLD_SCALE);\n const plane = new THREE.Mesh(geo, mat);\n plane.name = `node-${ctx.nodeId}`;\n plane.userData = { nodeId: ctx.nodeId, kind: spec.kind };\n deps.scene3D.add(plane);\n return plane;\n },\n };\n}\n\n/* ------------------------------------------------------------------ */\n/* Layout helpers */\n/* ------------------------------------------------------------------ */\n\n/**\n * \"3D Desktop\" layout — wraps the scene's 2D positions onto a partial cylinder\n * facing the camera. DOM `x` becomes angle around the cylinder, DOM `y` becomes\n * height.\n */\nexport function placeOnCylinder(\n node: SceneNode,\n obj: THREE.Object3D,\n bounds: { minX: number; maxX: number; minY: number; maxY: number },\n opts: { radius?: number; arc?: number } = {},\n) {\n const radius = opts.radius ?? 6;\n const arc = opts.arc ?? Math.PI * 0.9; // ~160°\n const rangeX = bounds.maxX - bounds.minX || 1;\n const rangeY = bounds.maxY - bounds.minY || 1;\n const cx = (node.position.x + (node.size?.w ?? 200) / 2 - bounds.minX) / rangeX;\n const cy = (node.position.y + (node.size?.h ?? 120) / 2 - bounds.minY) / rangeY;\n const angle = (cx - 0.5) * arc;\n const height = (0.5 - cy) * 6;\n obj.position.set(Math.sin(angle) * radius, height, Math.cos(angle) * radius);\n // Rotate around Y so the plane's front (+Z normal) points outward toward the\n // orbiting camera.\n obj.rotation.set(0, angle, 0);\n}\n\nexport function sceneBounds(scene: Scene) {\n const xs = scene.nodes.map((n) => n.position.x);\n const ys = scene.nodes.map((n) => n.position.y);\n const xe = scene.nodes.map((n) => n.position.x + (n.size?.w ?? 200));\n const ye = scene.nodes.map((n) => n.position.y + (n.size?.h ?? 120));\n return {\n minX: Math.min(...xs),\n maxX: Math.max(...xe),\n minY: Math.min(...ys),\n maxY: Math.max(...ye),\n };\n}\n\nexport * from \"./primitives\";\nexport * from \"./layouts\";\n"]}
1
+ {"version":3,"sources":["../src/painters.ts","../src/primitives.ts","../src/layouts.ts","../src/index.ts"],"names":["material","mesh","THREE2","THREE3"],"mappings":"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","file":"index.js","sourcesContent":["import type { WidgetSpec } from \"@particle-academy/fancy-3d\";\n\nexport const TEX_SCALE = 2; // retina-ish texture sharpness\n\n/** Scale factor against the painters' design-time canvas (240px tall). All\n * widget painters multiply their padding / font sizes by this so the layout\n * looks the same at any pixel resolution. */\nfunction unitOf(_w: number, h: number): number {\n return h / 240;\n}\n\nfunction paintCardBg(ctx: CanvasRenderingContext2D, w: number, h: number, selected: boolean) {\n const u = unitOf(w, h);\n ctx.fillStyle = \"#0f172a\";\n roundRect(ctx, 0, 0, w, h, 14 * u);\n ctx.fill();\n ctx.strokeStyle = selected ? \"#6366f1\" : \"#1e293b\";\n ctx.lineWidth = (selected ? 4 : 2) * u;\n ctx.stroke();\n}\n\nfunction roundRect(ctx: CanvasRenderingContext2D, x: number, y: number, w: number, h: number, r: number) {\n ctx.beginPath();\n ctx.moveTo(x + r, y);\n ctx.arcTo(x + w, y, x + w, y + h, r);\n ctx.arcTo(x + w, y + h, x, y + h, r);\n ctx.arcTo(x, y + h, x, y, r);\n ctx.arcTo(x, y, x + w, y, r);\n ctx.closePath();\n}\n\nfunction paintLabel(ctx: CanvasRenderingContext2D, text: string, x: number, y: number) {\n ctx.fillStyle = \"#94a3b8\";\n ctx.font = \"600 22px ui-sans-serif, system-ui, sans-serif\";\n ctx.textBaseline = \"top\";\n ctx.fillText(text.toUpperCase(), x, y);\n}\n\nfunction paintSparkline(ctx: CanvasRenderingContext2D, values: number[], x: number, y: number, w: number, h: number, variant: \"line\" | \"bar\" | \"area\", color: string) {\n const max = Math.max(...values, 1);\n const min = Math.min(...values, 0);\n const range = max - min || 1;\n const step = w / Math.max(values.length - 1, 1);\n\n if (variant === \"bar\") {\n const bw = w / values.length - 4;\n ctx.fillStyle = color;\n values.forEach((v, i) => {\n const bh = ((v - min) / range) * h;\n ctx.fillRect(x + i * (bw + 4), y + h - bh, bw, Math.max(bh, 1));\n });\n return;\n }\n\n ctx.beginPath();\n values.forEach((v, i) => {\n const px = x + i * step;\n const py = y + h - ((v - min) / range) * h;\n if (i === 0) ctx.moveTo(px, py);\n else ctx.lineTo(px, py);\n });\n\n if (variant === \"area\") {\n ctx.lineTo(x + w, y + h);\n ctx.lineTo(x, y + h);\n ctx.closePath();\n ctx.fillStyle = color + \"44\";\n ctx.fill();\n ctx.beginPath();\n values.forEach((v, i) => {\n const px = x + i * step;\n const py = y + h - ((v - min) / range) * h;\n if (i === 0) ctx.moveTo(px, py);\n else ctx.lineTo(px, py);\n });\n }\n\n ctx.strokeStyle = color;\n ctx.lineWidth = 3;\n ctx.stroke();\n}\nexport function paintWidget(ctx: CanvasRenderingContext2D, spec: WidgetSpec, w: number, h: number, selected: boolean) {\n paintCardBg(ctx, w, h, selected);\n const pad = 20;\n\n switch (spec.kind) {\n case \"kpi\": {\n paintLabel(ctx, spec.label, pad, pad);\n ctx.fillStyle = \"#f1f5f9\";\n ctx.font = \"700 56px ui-sans-serif, system-ui, sans-serif\";\n ctx.fillText(spec.value, pad, pad + 32);\n if (spec.delta) {\n ctx.fillStyle = spec.trend === \"up\" ? \"#10b981\" : spec.trend === \"down\" ? \"#f43f5e\" : \"#94a3b8\";\n ctx.font = \"600 22px ui-sans-serif, system-ui, sans-serif\";\n ctx.fillText(spec.delta, pad, pad + 92);\n }\n break;\n }\n case \"chart\": {\n paintLabel(ctx, spec.title, pad, pad);\n paintSparkline(ctx, spec.series, pad, pad + 36, w - pad * 2, h - pad * 2 - 36, spec.variant, spec.color ?? \"#6366f1\");\n break;\n }\n case \"kanban\": {\n const colW = (w - pad * 2 - (spec.columns.length - 1) * 10) / spec.columns.length;\n spec.columns.forEach((col, i) => {\n const cx = pad + i * (colW + 10);\n ctx.fillStyle = \"#1e293b\";\n roundRect(ctx, cx, pad, colW, h - pad * 2, 8);\n ctx.fill();\n paintLabel(ctx, col.title, cx + 8, pad + 10);\n col.cards.forEach((c, j) => {\n ctx.fillStyle = \"#0f172a\";\n roundRect(ctx, cx + 8, pad + 44 + j * 38, colW - 16, 30, 6);\n ctx.fill();\n ctx.fillStyle = \"#cbd5e1\";\n ctx.font = \"500 20px ui-sans-serif, system-ui, sans-serif\";\n ctx.fillText(c, cx + 16, pad + 50 + j * 38);\n });\n });\n break;\n }\n case \"table\": {\n paintLabel(ctx, spec.title, pad, pad);\n ctx.fillStyle = \"#94a3b8\";\n ctx.font = \"600 18px ui-sans-serif, system-ui, sans-serif\";\n const colW = (w - pad * 2) / spec.columns.length;\n spec.columns.forEach((c, i) => ctx.fillText(c, pad + i * colW, pad + 38));\n ctx.fillStyle = \"#cbd5e1\";\n ctx.font = \"400 18px ui-sans-serif, system-ui, sans-serif\";\n spec.rows.forEach((row, ri) => {\n row.forEach((cell, ci) => ctx.fillText(String(cell), pad + ci * colW, pad + 70 + ri * 28));\n });\n break;\n }\n case \"profile\": {\n ctx.fillStyle = \"#6366f1\";\n ctx.beginPath();\n ctx.arc(pad + 30, pad + 30, 28, 0, Math.PI * 2);\n ctx.fill();\n ctx.fillStyle = \"#fff\";\n ctx.font = \"700 24px ui-sans-serif, system-ui, sans-serif\";\n ctx.textAlign = \"center\";\n ctx.fillText(spec.initials, pad + 30, pad + 22);\n ctx.textAlign = \"left\";\n ctx.fillStyle = \"#f1f5f9\";\n ctx.font = \"600 24px ui-sans-serif, system-ui, sans-serif\";\n ctx.fillText(spec.name, pad + 76, pad + 12);\n ctx.fillStyle = \"#94a3b8\";\n ctx.font = \"400 20px ui-sans-serif, system-ui, sans-serif\";\n ctx.fillText(spec.role, pad + 76, pad + 40);\n if (spec.status) {\n ctx.fillStyle = spec.status === \"online\" ? \"#10b981\" : spec.status === \"away\" ? \"#f59e0b\" : \"#64748b\";\n ctx.beginPath();\n ctx.arc(pad + 50, pad + 50, 6, 0, Math.PI * 2);\n ctx.fill();\n }\n break;\n }\n case \"callout\": {\n const tone = spec.tone === \"danger\" ? \"#f43f5e\" : spec.tone === \"warning\" ? \"#f59e0b\" : spec.tone === \"success\" ? \"#10b981\" : \"#3b82f6\";\n ctx.fillStyle = tone + \"22\";\n roundRect(ctx, 4, 4, w - 8, h - 8, 12);\n ctx.fill();\n ctx.fillStyle = tone;\n ctx.fillRect(12, 12, 4, h - 24);\n ctx.fillStyle = \"#f1f5f9\";\n ctx.font = \"600 22px ui-sans-serif, system-ui, sans-serif\";\n ctx.fillText(spec.title, 28, pad);\n ctx.fillStyle = \"#cbd5e1\";\n ctx.font = \"400 18px ui-sans-serif, system-ui, sans-serif\";\n wrapText(ctx, spec.body, 28, pad + 32, w - 40, 22);\n break;\n }\n case \"form\": {\n paintLabel(ctx, spec.title, pad, pad);\n spec.fields.forEach((f, i) => {\n const y = pad + 40 + i * 44;\n ctx.fillStyle = \"#cbd5e1\";\n ctx.font = \"500 18px ui-sans-serif, system-ui, sans-serif\";\n ctx.fillText(f.label, pad, y);\n ctx.fillStyle = \"#1e293b\";\n roundRect(ctx, w - pad - 100, y - 4, 100, 28, 6);\n ctx.fill();\n if (f.type === \"switch\") {\n ctx.fillStyle = \"#6366f1\";\n roundRect(ctx, w - pad - 60, y - 4, 60, 28, 14);\n ctx.fill();\n ctx.fillStyle = \"#fff\";\n ctx.beginPath();\n ctx.arc(w - pad - 18, y + 10, 10, 0, Math.PI * 2);\n ctx.fill();\n }\n });\n break;\n }\n case \"action\": {\n paintLabel(ctx, spec.title, pad, pad);\n let bx = pad;\n const by = pad + 40;\n spec.buttons.forEach((b) => {\n const tw = ctx.measureText(b.label).width + 24;\n ctx.fillStyle = b.variant === \"primary\" ? \"#6366f1\" : b.variant === \"ghost\" ? \"transparent\" : \"#1e293b\";\n if (b.variant !== \"ghost\") {\n roundRect(ctx, bx, by, tw, 36, 8);\n ctx.fill();\n }\n ctx.fillStyle = b.variant === \"primary\" ? \"#fff\" : \"#cbd5e1\";\n ctx.font = \"600 18px ui-sans-serif, system-ui, sans-serif\";\n ctx.fillText(b.label, bx + 12, by + 9);\n bx += tw + 8;\n });\n break;\n }\n case \"timeline\": {\n paintLabel(ctx, spec.title, pad, pad);\n spec.events.forEach((e, i) => {\n const y = pad + 40 + i * 32;\n ctx.fillStyle = \"#6366f1\";\n ctx.beginPath();\n ctx.arc(pad + 4, y + 10, 4, 0, Math.PI * 2);\n ctx.fill();\n ctx.strokeStyle = \"#1e293b\";\n if (i < spec.events.length - 1) {\n ctx.beginPath();\n ctx.moveTo(pad + 4, y + 14);\n ctx.lineTo(pad + 4, y + 32);\n ctx.stroke();\n }\n ctx.fillStyle = \"#94a3b8\";\n ctx.font = \"500 14px ui-monospace, monospace\";\n ctx.fillText(e.at, pad + 16, y);\n ctx.fillStyle = \"#cbd5e1\";\n ctx.font = \"400 18px ui-sans-serif, system-ui, sans-serif\";\n ctx.fillText(e.label, pad + 60, y);\n });\n break;\n }\n case \"code\": {\n paintLabel(ctx, spec.title, pad, pad);\n ctx.fillStyle = \"#020617\";\n roundRect(ctx, pad, pad + 36, w - pad * 2, h - pad * 2 - 36, 8);\n ctx.fill();\n ctx.fillStyle = \"#a5b4fc\";\n ctx.font = \"400 16px ui-monospace, monospace\";\n const lines = spec.code.split(\"\\n\");\n lines.forEach((ln, i) => ctx.fillText(ln, pad + 14, pad + 56 + i * 22));\n break;\n }\n case \"image\": {\n ctx.fillStyle = \"#1e293b\";\n roundRect(ctx, pad, pad, w - pad * 2, h - pad * 2, 8);\n ctx.fill();\n ctx.fillStyle = \"#64748b\";\n ctx.font = \"400 18px ui-sans-serif, system-ui, sans-serif\";\n ctx.textAlign = \"center\";\n ctx.fillText(spec.alt, w / 2, h / 2);\n ctx.textAlign = \"left\";\n break;\n }\n case \"text\": {\n ctx.fillStyle = \"#f1f5f9\";\n ctx.font = \"700 26px ui-sans-serif, system-ui, sans-serif\";\n ctx.fillText(spec.heading, pad, pad);\n ctx.fillStyle = \"#cbd5e1\";\n ctx.font = \"400 18px ui-sans-serif, system-ui, sans-serif\";\n wrapText(ctx, spec.body, pad, pad + 38, w - pad * 2, 22);\n break;\n }\n case \"screen\": {\n const bezel = spec.bezel ?? \"#0b0f17\";\n const t = spec.bezelThickness ?? 14;\n const on = spec.on ?? true;\n const brightness = spec.brightness ?? (on ? 1 : 0.06);\n const bg = spec.background ?? \"#020617\";\n\n // Outer bezel\n ctx.fillStyle = bezel;\n roundRect(ctx, 0, 0, w, h, 18);\n ctx.fill();\n // Inner screen area\n const sx = t;\n const sy = t;\n const sw = w - t * 2;\n const sh = h - t * 2;\n ctx.save();\n ctx.fillStyle = bg;\n roundRect(ctx, sx, sy, sw, sh, 8);\n ctx.fill();\n ctx.beginPath();\n roundRect(ctx, sx, sy, sw, sh, 8);\n ctx.clip();\n ctx.translate(sx, sy);\n // Apply brightness as global alpha multiplier\n ctx.globalAlpha = brightness;\n const c = spec.content;\n if (c.type === \"label\") {\n ctx.fillStyle = \"#e2e8f0\";\n ctx.font = \"700 32px ui-sans-serif, system-ui, sans-serif\";\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n ctx.fillText(c.title, sw / 2, sh / 2 - (c.subtitle ? 16 : 0));\n if (c.subtitle) {\n ctx.fillStyle = \"#94a3b8\";\n ctx.font = \"400 18px ui-sans-serif, system-ui, sans-serif\";\n ctx.fillText(c.subtitle, sw / 2, sh / 2 + 18);\n }\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"alphabetic\";\n } else if (c.type === \"paint\") {\n c.paint(ctx, sw, sh);\n } else if (c.type === \"image\") {\n // Image content is best painted by the consumer via \"paint\" — labels\n // serve as a fallback so the screen still has identifiable content.\n ctx.fillStyle = \"#475569\";\n ctx.font = \"500 16px ui-sans-serif, system-ui, sans-serif\";\n ctx.textAlign = \"center\";\n ctx.fillText(c.alt ?? \"image\", sw / 2, sh / 2);\n ctx.textAlign = \"left\";\n }\n ctx.globalAlpha = 1;\n ctx.restore();\n // Power LED\n ctx.fillStyle = on ? \"#10b981\" : \"#475569\";\n ctx.beginPath();\n ctx.arc(w - t - 6, h - t - 6, 4, 0, Math.PI * 2);\n ctx.fill();\n // Subtle glass reflection\n const grad = ctx.createLinearGradient(sx, sy, sx, sy + sh);\n grad.addColorStop(0, \"rgba(255,255,255,0.08)\");\n grad.addColorStop(0.4, \"rgba(255,255,255,0)\");\n ctx.fillStyle = grad;\n ctx.beginPath();\n roundRect(ctx, sx, sy, sw, sh, 8);\n ctx.fill();\n break;\n }\n case \"demoPage\": {\n const u = unitOf(w, h);\n const padX = w * 0.06;\n const headerH = h * 0.22;\n const titleY = headerH + h * 0.12;\n const titleSize = h * 0.16;\n const descY = titleY + titleSize * 0.6;\n const descSize = h * 0.072;\n const descLine = descSize * 1.4;\n const chipSize = h * 0.052;\n const pathSize = h * 0.052;\n const ctaSize = h * 0.075;\n const ctaH = ctaSize * 2;\n\n // Accent header bar — slightly overlaps card top to visually anchor\n ctx.fillStyle = spec.accent;\n roundRect(ctx, 0, 0, w, headerH, 14 * u);\n ctx.fill();\n // Squared bottom on the accent bar (cancel rounded bottom corners)\n ctx.fillRect(0, headerH - 14 * u, w, 14 * u);\n\n // Category chip\n ctx.fillStyle = \"rgba(255,255,255,0.22)\";\n const chipText = spec.category.toUpperCase();\n ctx.font = `700 ${chipSize}px ui-sans-serif, system-ui, sans-serif`;\n ctx.textBaseline = \"top\";\n const chipPad = chipSize * 0.7;\n const chipW = ctx.measureText(chipText).width + chipPad * 2;\n const chipH = chipSize * 1.85;\n const chipY = (headerH - chipH) / 2;\n roundRect(ctx, padX, chipY, chipW, chipH, chipH / 2);\n ctx.fill();\n ctx.fillStyle = \"#fff\";\n ctx.fillText(chipText, padX + chipPad, chipY + (chipH - chipSize) / 2);\n\n // Path on right\n ctx.fillStyle = \"rgba(255,255,255,0.9)\";\n ctx.font = `500 ${pathSize}px ui-monospace, monospace`;\n const pathW = ctx.measureText(spec.path).width;\n ctx.fillText(spec.path, w - padX - pathW, chipY + (chipH - chipSize) / 2);\n\n // Title\n ctx.fillStyle = \"#f8fafc\";\n ctx.font = `800 ${titleSize}px ui-sans-serif, system-ui, sans-serif`;\n ctx.fillText(spec.name, padX, titleY);\n\n // Description (wrapped, clipped before reaching the CTA)\n ctx.fillStyle = \"#94a3b8\";\n ctx.font = `400 ${descSize}px ui-sans-serif, system-ui, sans-serif`;\n const ctaY = h - padX - ctaH;\n wrapText(ctx, spec.description, padX, descY, w - padX * 2, descLine, ctaY - descLine);\n\n // CTA at bottom\n ctx.fillStyle = spec.accent;\n const ctaText = \"Open demo →\";\n ctx.font = `600 ${ctaSize}px ui-sans-serif, system-ui, sans-serif`;\n const ctaTextPad = ctaSize * 0.9;\n const ctaW = ctx.measureText(ctaText).width + ctaTextPad * 2;\n roundRect(ctx, padX, ctaY, ctaW, ctaH, ctaH * 0.25);\n ctx.fill();\n ctx.fillStyle = \"#0f172a\";\n ctx.fillText(ctaText, padX + ctaTextPad, ctaY + (ctaH - ctaSize) / 2);\n ctx.textBaseline = \"alphabetic\";\n break;\n }\n }\n}\n\nfunction wrapText(\n ctx: CanvasRenderingContext2D,\n text: string,\n x: number,\n y: number,\n maxW: number,\n lineH: number,\n maxY?: number\n) {\n const words = text.split(\" \");\n let line = \"\";\n let yy = y;\n for (const word of words) {\n const test = line ? `${line} ${word}` : word;\n if (ctx.measureText(test).width > maxW && line) {\n if (maxY !== undefined && yy > maxY) return;\n ctx.fillText(line, x, yy);\n line = word;\n yy += lineH;\n } else {\n line = test;\n }\n }\n if (line && (maxY === undefined || yy <= maxY)) ctx.fillText(line, x, yy);\n}\n","/**\n * 3D shape primitives for `@particle-academy/fancy-3d` — three.js edition.\n *\n * A primitive is a three.js mesh that can host UI content on its surface —\n * either a flat color, a freeform 2D paint callback, or a `WidgetSpec`\n * rendered through the same painters as the three.js adapter.\n *\n * Every primitive returns a three.js `Mesh` (or a `Group` for composites),\n * ready to position in your scene. Pass `scene` to also add it for you.\n *\n * Mirrors `@particle-academy/fancy-3d-babylon`'s primitive API: same function\n * names, same option shapes. Differences from the Babylon adapter are minor and\n * idiomatic to three (e.g. `doubleSided?: boolean` instead of a `sideOrientation`\n * enum; `scene` is optional since three meshes exist independent of a scene).\n */\nimport * as THREE from \"three\";\nimport { DecalGeometry } from \"three/examples/jsm/geometries/DecalGeometry.js\";\nimport type { WidgetSpec } from \"@particle-academy/fancy-3d\";\nimport { TEX_SCALE, paintWidget } from \"./painters\";\n\nexport type PaintFn = (ctx: CanvasRenderingContext2D, width: number, height: number) => void;\n\nexport type SurfaceContent =\n | { type: \"color\"; color: string }\n | { type: \"paint\"; paint: PaintFn; pixelWidth?: number; pixelHeight?: number; transparent?: boolean }\n | { type: \"widget\"; widget: WidgetSpec; pixelWidth?: number; pixelHeight?: number; selected?: boolean };\n\nconst DEFAULT_DENSITY = 120;\nconst MAX_TEXTURE_AXIS = 1024;\n\nfunction autoPixelSize(worldWidth: number, worldHeight: number, density = DEFAULT_DENSITY) {\n let w = Math.max(96, Math.round(worldWidth * density));\n let h = Math.max(96, Math.round(worldHeight * density));\n const scale = Math.min(1, MAX_TEXTURE_AXIS / Math.max(w, h));\n if (scale < 1) {\n w = Math.round(w * scale);\n h = Math.round(h * scale);\n }\n return { w, h };\n}\n\n/** Draw onto a fresh retina canvas and wrap it in a three CanvasTexture. */\nfunction canvasTexture(w: number, h: number, draw: (ctx: CanvasRenderingContext2D) => void): THREE.CanvasTexture {\n const canvas = document.createElement(\"canvas\");\n canvas.width = Math.max(1, Math.round(w * TEX_SCALE));\n canvas.height = Math.max(1, Math.round(h * TEX_SCALE));\n const ctx = canvas.getContext(\"2d\") as CanvasRenderingContext2D;\n ctx.scale(TEX_SCALE, TEX_SCALE);\n draw(ctx);\n const tex = new THREE.CanvasTexture(canvas);\n tex.colorSpace = THREE.SRGBColorSpace;\n tex.anisotropy = 4;\n tex.needsUpdate = true;\n return tex;\n}\n\ninterface Surface {\n material: THREE.Material;\n texture: THREE.CanvasTexture | null;\n}\n\n/**\n * Resolve a SurfaceContent to a three material (+ optional texture). UI surfaces\n * (paint/widget) use an unlit `MeshBasicMaterial` so text stays readable\n * regardless of scene lighting — matching the Babylon adapter's self-emissive\n * panels. Flat colors use a lit `MeshStandardMaterial` so structure reads form.\n */\nfunction buildSurface(surface: SurfaceContent, autoSize?: { worldWidth: number; worldHeight: number }): Surface {\n if (surface.type === \"color\") {\n const color = new THREE.Color(surface.color);\n const material = new THREE.MeshStandardMaterial({\n color,\n emissive: color.clone().multiplyScalar(0.15),\n roughness: 0.7,\n metalness: 0.0,\n });\n return { material, texture: null };\n }\n\n let w = surface.pixelWidth;\n let h = surface.pixelHeight;\n if ((w == null || h == null) && autoSize) {\n const auto = autoPixelSize(autoSize.worldWidth, autoSize.worldHeight);\n w = w ?? auto.w;\n h = h ?? auto.h;\n }\n w = w ?? 512;\n h = h ?? 512;\n\n const transparent = surface.type === \"widget\" || (surface.type === \"paint\" && !!surface.transparent);\n const texture = canvasTexture(w, h, (ctx) => {\n if (surface.type === \"paint\") surface.paint(ctx, w!, h!);\n else paintWidget(ctx, surface.widget, w!, h!, surface.selected ?? false);\n });\n const material = new THREE.MeshBasicMaterial({ map: texture, transparent, toneMapped: false });\n return { material, texture };\n}\n\n/** Add to a scene/group if one was supplied (parity with Babylon's auto-add). */\nfunction attach<T extends THREE.Object3D>(obj: T, scene?: THREE.Object3D): T {\n if (scene) scene.add(obj);\n return obj;\n}\n\n/* ------------------------------------------------------------------ */\n/* Panel — flat 2D plane with one surface */\n/* ------------------------------------------------------------------ */\n\nexport interface PanelOpts {\n scene?: THREE.Object3D;\n name?: string;\n width: number;\n height: number;\n surface: SurfaceContent;\n /** Render both faces (e.g. for self-luminous screens). */\n doubleSided?: boolean;\n}\n\nexport function createPanel(opts: PanelOpts): THREE.Mesh {\n const geo = new THREE.PlaneGeometry(opts.width, opts.height);\n const { material } = buildSurface(opts.surface, { worldWidth: opts.width, worldHeight: opts.height });\n if (opts.doubleSided) material.side = THREE.DoubleSide;\n const mesh = new THREE.Mesh(geo, material);\n mesh.name = opts.name ?? \"panel\";\n return attach(mesh, opts.scene);\n}\n\n/* ------------------------------------------------------------------ */\n/* Billboard — panel that can be set to always face the camera */\n/* ------------------------------------------------------------------ */\n\nexport interface BillboardOpts extends PanelOpts {\n /** When true, the mesh is flagged to always face the camera. `<Stage>` honors\n * the flag each frame; outside a Stage, call `mesh.lookAt(camera.position)`. */\n faceCamera?: boolean;\n}\n\nexport function createBillboard(opts: BillboardOpts): THREE.Mesh {\n const m = createPanel({ ...opts, scene: undefined, name: opts.name ?? \"billboard\" });\n if (opts.faceCamera) m.userData.faceCamera = true;\n return attach(m, opts.scene);\n}\n\n/* ------------------------------------------------------------------ */\n/* Building — rectangular box with optional facade texture */\n/* ------------------------------------------------------------------ */\n\nexport interface BuildingOpts {\n scene?: THREE.Object3D;\n name?: string;\n width: number;\n height: number;\n depth: number;\n /** Surface applied to all 6 faces (cheap path). */\n surface?: SurfaceContent;\n /** Per-face surfaces; missing faces use `surface` or a default grey. */\n faces?: Partial<Record<BoxFace, SurfaceContent>>;\n}\n\nexport type BoxFace = \"front\" | \"back\" | \"right\" | \"left\" | \"top\" | \"bottom\";\n\n/** three BoxGeometry group order: +X, -X, +Y, -Y, +Z, -Z. */\nconst THREE_FACE_ORDER: BoxFace[] = [\"right\", \"left\", \"top\", \"bottom\", \"front\", \"back\"];\n\nexport function createBuilding(opts: BuildingOpts): THREE.Mesh {\n const geo = new THREE.BoxGeometry(opts.width, opts.height, opts.depth);\n\n if (opts.surface && !opts.faces) {\n const { material } = buildSurface(opts.surface, { worldWidth: opts.width, worldHeight: opts.height });\n const mesh = new THREE.Mesh(geo, material);\n mesh.name = opts.name ?? \"building\";\n return attach(mesh, opts.scene);\n }\n\n // Per-face: three exposes 6 geometry groups, one per face — assign a material\n // array in +X,-X,+Y,-Y,+Z,-Z order.\n const materials = THREE_FACE_ORDER.map((face) => {\n const surface = opts.faces?.[face] ?? opts.surface ?? { type: \"color\" as const, color: \"#475569\" };\n const isSide = face === \"front\" || face === \"back\";\n return buildSurface(surface, { worldWidth: isSide ? opts.width : opts.depth, worldHeight: opts.height }).material;\n });\n const mesh = new THREE.Mesh(geo, materials);\n mesh.name = opts.name ?? \"building\";\n return attach(mesh, opts.scene);\n}\n\n/* ------------------------------------------------------------------ */\n/* Pillar — alias for a tall narrow building */\n/* ------------------------------------------------------------------ */\n\nexport interface PillarOpts {\n scene?: THREE.Object3D;\n name?: string;\n thickness: number;\n height: number;\n surface?: SurfaceContent;\n}\n\nexport function createPillar(opts: PillarOpts): THREE.Mesh {\n return createBuilding({\n scene: opts.scene,\n name: opts.name ?? \"pillar\",\n width: opts.thickness,\n depth: opts.thickness,\n height: opts.height,\n surface: opts.surface,\n });\n}\n\n/* ------------------------------------------------------------------ */\n/* Cylinder — tube with content wrapping the side */\n/* ------------------------------------------------------------------ */\n\nexport interface CylinderOpts {\n scene?: THREE.Object3D;\n name?: string;\n radius: number;\n height: number;\n surface: SurfaceContent;\n tessellation?: number;\n}\n\nexport function createCylinder(opts: CylinderOpts): THREE.Mesh {\n const geo = new THREE.CylinderGeometry(opts.radius, opts.radius, opts.height, opts.tessellation ?? 48, 1, false);\n const { material } = buildSurface(opts.surface, { worldWidth: opts.radius * 2 * Math.PI, worldHeight: opts.height });\n const mesh = new THREE.Mesh(geo, material);\n mesh.name = opts.name ?? \"cylinder\";\n return attach(mesh, opts.scene);\n}\n\n/* ------------------------------------------------------------------ */\n/* CurvedPanel — a partial cylindrical sheet (like a wraparound ad) */\n/* ------------------------------------------------------------------ */\n\nexport interface CurvedPanelOpts {\n scene?: THREE.Object3D;\n name?: string;\n width: number; // arc length\n height: number;\n arc: number; // radians spanned\n surface: SurfaceContent;\n tessellation?: number;\n}\n\nexport function createCurvedPanel(opts: CurvedPanelOpts): THREE.Mesh {\n const radius = opts.width / opts.arc;\n const segments = Math.max(8, opts.tessellation ?? 48);\n // Open-ended partial cylinder, centered on the +Z axis (thetaStart offsets the\n // arc so it's symmetric about the camera's default forward direction).\n const geo = new THREE.CylinderGeometry(\n radius,\n radius,\n opts.height,\n segments,\n 1,\n true,\n Math.PI / 2 - opts.arc / 2,\n opts.arc,\n );\n const { material } = buildSurface(opts.surface, { worldWidth: opts.width, worldHeight: opts.height });\n material.side = THREE.DoubleSide;\n const mesh = new THREE.Mesh(geo, material);\n mesh.name = opts.name ?? \"curved-panel\";\n return attach(mesh, opts.scene);\n}\n\n/* ------------------------------------------------------------------ */\n/* Sphere — full sphere with equirectangular surface */\n/* ------------------------------------------------------------------ */\n\nexport interface SphereOpts {\n scene?: THREE.Object3D;\n name?: string;\n diameter: number;\n surface: SurfaceContent;\n segments?: number;\n}\n\nexport function createSphere(opts: SphereOpts): THREE.Mesh {\n const geo = new THREE.SphereGeometry(opts.diameter / 2, opts.segments ?? 32, opts.segments ?? 32);\n const { material } = buildSurface(opts.surface, { worldWidth: opts.diameter * Math.PI, worldHeight: (opts.diameter * Math.PI) / 2 });\n const mesh = new THREE.Mesh(geo, material);\n mesh.name = opts.name ?? \"sphere\";\n return attach(mesh, opts.scene);\n}\n\n/* ------------------------------------------------------------------ */\n/* Disc — flat disc/circle */\n/* ------------------------------------------------------------------ */\n\nexport interface DiscOpts {\n scene?: THREE.Object3D;\n name?: string;\n radius: number;\n surface: SurfaceContent;\n tessellation?: number;\n}\n\nexport function createDisc(opts: DiscOpts): THREE.Mesh {\n const geo = new THREE.CircleGeometry(opts.radius, opts.tessellation ?? 64);\n const { material } = buildSurface(opts.surface, { worldWidth: opts.radius * 2, worldHeight: opts.radius * 2 });\n const mesh = new THREE.Mesh(geo, material);\n mesh.name = opts.name ?? \"disc\";\n return attach(mesh, opts.scene);\n}\n\n/* ------------------------------------------------------------------ */\n/* Card3D — an extruded panel (gives panels physical depth) */\n/* ------------------------------------------------------------------ */\n\nexport interface Card3DOpts {\n scene?: THREE.Object3D;\n name?: string;\n width: number;\n height: number;\n /** Extrusion depth. Defaults to a thin 0.06 — like real foam-board signage. */\n depth?: number;\n /** Surface for the front face (the visible UI). */\n front: SurfaceContent;\n /** Surface for the side and back faces. Defaults to a dark color. */\n edge?: SurfaceContent;\n}\n\nexport function createCard3D(opts: Card3DOpts): THREE.Mesh {\n const edge = opts.edge ?? { type: \"color\" as const, color: \"#0b0f17\" };\n return createBuilding({\n scene: opts.scene,\n name: opts.name ?? \"card3d\",\n width: opts.width,\n height: opts.height,\n depth: opts.depth ?? 0.06,\n faces: { front: opts.front, back: edge, top: edge, bottom: edge, left: edge, right: edge },\n });\n}\n\n/* ------------------------------------------------------------------ */\n/* Sign — a panel mounted on a post */\n/* ------------------------------------------------------------------ */\n\nexport interface SignOpts {\n scene?: THREE.Object3D;\n name?: string;\n width: number;\n height: number;\n postHeight?: number;\n postThickness?: number;\n surface: SurfaceContent;\n postColor?: string;\n}\n\nexport interface SignResult {\n root: THREE.Group;\n panel: THREE.Mesh;\n post: THREE.Mesh;\n}\n\nexport function createSign(opts: SignOpts): SignResult {\n const name = opts.name ?? \"sign\";\n const postHeight = opts.postHeight ?? 1.4;\n const postThickness = opts.postThickness ?? 0.12;\n const postColor = opts.postColor ?? \"#1f2937\";\n\n const root = new THREE.Group();\n root.name = `${name}-root`;\n\n const panel = createBillboard({ name: `${name}-panel`, width: opts.width, height: opts.height, surface: opts.surface });\n panel.position.set(0, postHeight + opts.height / 2, 0);\n root.add(panel);\n\n const post = new THREE.Mesh(\n new THREE.BoxGeometry(postThickness, postHeight, postThickness),\n new THREE.MeshStandardMaterial({ color: new THREE.Color(postColor), roughness: 0.6 }),\n );\n post.name = `${name}-post`;\n post.position.set(0, postHeight / 2, 0);\n root.add(post);\n\n attach(root, opts.scene);\n return { root, panel, post };\n}\n\n/* ------------------------------------------------------------------ */\n/* Monitor — a 3D display: extruded bezel + recessed screen face */\n/* ------------------------------------------------------------------ */\n\nexport interface MonitorOpts {\n scene?: THREE.Object3D;\n name?: string;\n width: number;\n height: number;\n /** Front-to-back depth of the display chassis. Defaults to 0.18. */\n depth?: number;\n /** Bezel color. Defaults to near-black. */\n bezel?: string;\n /** Screen surface — color, paint, or widget. */\n screen: SurfaceContent;\n /** Optional kickstand height — when set, the monitor sits on a base. */\n standHeight?: number;\n}\n\nexport interface MonitorResult {\n root: THREE.Group;\n body: THREE.Mesh;\n screen: THREE.Mesh;\n stand?: THREE.Mesh;\n}\n\nexport function createMonitor(opts: MonitorOpts): MonitorResult {\n const name = opts.name ?? \"monitor\";\n const depth = opts.depth ?? 0.18;\n const bezelColor = new THREE.Color(opts.bezel ?? \"#0b0f17\");\n const bodyMat = new THREE.MeshStandardMaterial({ color: bezelColor, roughness: 0.5, metalness: 0.1 });\n\n const root = new THREE.Group();\n root.name = `${name}-root`;\n\n const body = new THREE.Mesh(new THREE.BoxGeometry(opts.width, opts.height, depth), bodyMat);\n body.name = `${name}-body`;\n root.add(body);\n\n // Screen face — a plane on the +Z front of the bezel (PlaneGeometry faces +Z\n // by default, which is where the default camera sits, so no flip needed).\n const screenInset = 0.04;\n const screen = createPanel({\n name: `${name}-screen`,\n width: opts.width - screenInset * 2,\n height: opts.height - screenInset * 2,\n surface: opts.screen,\n });\n screen.position.set(0, 0, depth / 2 + 0.005);\n root.add(screen);\n\n let stand: THREE.Mesh | undefined;\n if (opts.standHeight && opts.standHeight > 0) {\n stand = new THREE.Mesh(new THREE.BoxGeometry(opts.width * 0.3, opts.standHeight, depth * 1.5), bodyMat);\n stand.name = `${name}-stand`;\n stand.position.set(0, -opts.height / 2 - opts.standHeight / 2, 0);\n root.add(stand);\n }\n\n attach(root, opts.scene);\n return { root, body, screen, stand };\n}\n\n/* ------------------------------------------------------------------ */\n/* Decal — project a 2D pattern onto another mesh's surface */\n/* ------------------------------------------------------------------ */\n\nexport interface DecalOpts {\n scene?: THREE.Object3D;\n name?: string;\n /** The mesh to project the decal onto. */\n target: THREE.Mesh;\n /** World-space position the projector sits at. */\n position: THREE.Vector3;\n /** Direction the projector points. Defaults to -Z. */\n normal?: THREE.Vector3;\n /** Size of the decal box. */\n size: { width: number; height: number; depth?: number };\n /** Rotation around the projection axis (radians). */\n angle?: number;\n /** Surface to project. */\n surface: SurfaceContent;\n}\n\nexport function createDecal(opts: DecalOpts): THREE.Mesh {\n const name = opts.name ?? \"decal\";\n const normal = (opts.normal ?? new THREE.Vector3(0, 0, -1)).clone().normalize();\n\n // Orientation: align the decal projector's forward (+Z) to the normal, plus a\n // roll of `angle` around that axis.\n const quat = new THREE.Quaternion().setFromUnitVectors(new THREE.Vector3(0, 0, 1), normal);\n if (opts.angle) quat.multiply(new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0, 0, 1), opts.angle));\n const orientation = new THREE.Euler().setFromQuaternion(quat);\n const size = new THREE.Vector3(opts.size.width, opts.size.height, opts.size.depth ?? 1);\n\n const geo = new DecalGeometry(opts.target, opts.position, orientation, size);\n const { material } = buildSurface(opts.surface, { worldWidth: opts.size.width, worldHeight: opts.size.height });\n // Decals sit on top of the target — offset to avoid z-fighting + show the\n // target through transparent borders.\n (material as THREE.MeshBasicMaterial).transparent = true;\n material.polygonOffset = true;\n material.polygonOffsetFactor = -4;\n material.depthWrite = false;\n const mesh = new THREE.Mesh(geo, material);\n mesh.name = name;\n return attach(mesh, opts.scene);\n}\n\n/* ------------------------------------------------------------------ */\n/* Helper: paint a widget onto a fresh CanvasTexture (escape hatch) */\n/* ------------------------------------------------------------------ */\n\nexport function createWidgetTexture(\n name: string,\n widget: WidgetSpec,\n pixelWidth: number,\n pixelHeight: number,\n selected = false,\n): THREE.CanvasTexture {\n const tex = canvasTexture(pixelWidth, pixelHeight, (ctx) => paintWidget(ctx, widget, pixelWidth, pixelHeight, selected));\n tex.name = name;\n return tex;\n}\n","/**\n * Layout helpers — map 2D scene-node positions onto 3D arrangements (three.js).\n *\n * All layout functions take the same shape: a SceneNode, the Object3D that was\n * built for it, the scene's bounds, and layout-specific options. They mutate\n * `obj.position` (and sometimes `obj.rotation.y`) in place.\n *\n * Pair with `sceneBounds(scene)` from the package root to compute the bounds.\n * Mirrors `@particle-academy/fancy-3d-babylon`'s layout API.\n */\nimport * as THREE from \"three\";\nimport type { SceneNode } from \"@particle-academy/fancy-3d\";\n\ninterface Bounds {\n minX: number;\n maxX: number;\n minY: number;\n maxY: number;\n}\n\nfunction sizeOf(node: SceneNode): { w: number; h: number } {\n return { w: node.size?.w ?? 200, h: node.size?.h ?? 120 };\n}\n\nfunction normalizedCenter(node: SceneNode, bounds: Bounds) {\n const { w, h } = sizeOf(node);\n const cx = (node.position.x + w / 2 - bounds.minX) / Math.max(1, bounds.maxX - bounds.minX);\n const cy = (node.position.y + h / 2 - bounds.minY) / Math.max(1, bounds.maxY - bounds.minY);\n return { cx, cy };\n}\n\n/* ------------------------------------------------------------------ */\n/* Grid — flat XY grid in front of the camera */\n/* ------------------------------------------------------------------ */\n\nexport interface GridLayoutOpts {\n /** Pixel-to-world unit ratio. Defaults to 1/120. */\n scale?: number;\n /** World-space center of the grid. Defaults to (0, 0, 0). */\n origin?: THREE.Vector3;\n}\n\nexport function placeOnGrid(node: SceneNode, obj: THREE.Object3D, bounds: Bounds, opts: GridLayoutOpts = {}) {\n const scale = opts.scale ?? 1 / 120;\n const origin = opts.origin ?? new THREE.Vector3(0, 0, 0);\n const { w, h } = sizeOf(node);\n const cx = node.position.x + w / 2 - (bounds.minX + bounds.maxX) / 2;\n const cy = node.position.y + h / 2 - (bounds.minY + bounds.maxY) / 2;\n obj.position.set(origin.x + cx * scale, origin.y - cy * scale, origin.z);\n}\n\n/* ------------------------------------------------------------------ */\n/* Wall — gallery layout against a vertical plane */\n/* ------------------------------------------------------------------ */\n\nexport interface WallLayoutOpts {\n z?: number;\n spreadX?: number;\n spreadY?: number;\n centerY?: number;\n}\n\nexport function placeOnWall(node: SceneNode, obj: THREE.Object3D, bounds: Bounds, opts: WallLayoutOpts = {}) {\n const spreadX = opts.spreadX ?? 10;\n const spreadY = opts.spreadY ?? 4;\n const centerY = opts.centerY ?? 1.5;\n const z = opts.z ?? 0;\n const { cx, cy } = normalizedCenter(node, bounds);\n obj.position.set((cx - 0.5) * spreadX, centerY + (0.5 - cy) * spreadY, z);\n obj.rotation.y = 0;\n}\n\n/* ------------------------------------------------------------------ */\n/* Arc — partial cylinder */\n/* ------------------------------------------------------------------ */\n\nexport interface ArcLayoutOpts {\n radius?: number;\n arc?: number;\n height?: number;\n baseY?: number;\n}\n\nexport function placeOnArc(node: SceneNode, obj: THREE.Object3D, bounds: Bounds, opts: ArcLayoutOpts = {}) {\n const radius = opts.radius ?? 6;\n const arc = opts.arc ?? Math.PI * 0.9;\n const height = opts.height ?? 6;\n const baseY = opts.baseY ?? 0;\n const { cx, cy } = normalizedCenter(node, bounds);\n const angle = (cx - 0.5) * arc;\n obj.position.set(Math.sin(angle) * radius, baseY + (0.5 - cy) * height, Math.cos(angle) * radius);\n obj.rotation.y = angle;\n}\n\n/* ------------------------------------------------------------------ */\n/* Path — distribute along a sequence of waypoints */\n/* ------------------------------------------------------------------ */\n\nexport interface PathLayoutOpts {\n waypoints: THREE.Vector3[];\n faceForward?: boolean;\n byIndex?: boolean;\n nodeCount?: number;\n}\n\nfunction lerpPath(waypoints: THREE.Vector3[], t: number): { pos: THREE.Vector3; tangent: THREE.Vector3 } {\n if (waypoints.length === 0) return { pos: new THREE.Vector3(0, 0, 0), tangent: new THREE.Vector3(0, 0, 1) };\n if (waypoints.length === 1) return { pos: waypoints[0].clone(), tangent: new THREE.Vector3(0, 0, 1) };\n const segments = waypoints.length - 1;\n const scaled = Math.max(0, Math.min(1, t)) * segments;\n const i = Math.min(segments - 1, Math.floor(scaled));\n const local = scaled - i;\n const a = waypoints[i];\n const b = waypoints[i + 1];\n const pos = a.clone().lerp(b, local);\n const tangent = b.clone().sub(a).normalize();\n return { pos, tangent };\n}\n\nexport function placeOnPath(node: SceneNode, obj: THREE.Object3D, bounds: Bounds, opts: PathLayoutOpts) {\n const faceForward = opts.faceForward ?? true;\n let t: number;\n if (opts.byIndex) {\n const total = opts.nodeCount ?? Math.max(1, bounds.maxX - bounds.minX);\n const idx = node.position.x;\n t = total > 1 ? idx / (total - 1) : 0.5;\n } else {\n const { cx } = normalizedCenter(node, bounds);\n t = cx;\n }\n const { pos, tangent } = lerpPath(opts.waypoints, t);\n obj.position.copy(pos);\n if (faceForward) obj.rotation.y = Math.atan2(tangent.x, tangent.z);\n}\n\n/* ------------------------------------------------------------------ */\n/* Sphere — wrap nodes onto a sphere surface */\n/* ------------------------------------------------------------------ */\n\nexport interface SphereLayoutOpts {\n radius?: number;\n center?: THREE.Vector3;\n latSpan?: number;\n lonSpan?: number;\n}\n\nexport function placeOnSphere(node: SceneNode, obj: THREE.Object3D, bounds: Bounds, opts: SphereLayoutOpts = {}) {\n const radius = opts.radius ?? 5;\n const center = opts.center ?? new THREE.Vector3(0, 0, 0);\n const latSpan = opts.latSpan ?? Math.PI * 0.7;\n const lonSpan = opts.lonSpan ?? Math.PI * 2;\n const { cx, cy } = normalizedCenter(node, bounds);\n const lon = (cx - 0.5) * lonSpan;\n const lat = (0.5 - cy) * latSpan;\n const x = radius * Math.cos(lat) * Math.sin(lon);\n const y = radius * Math.sin(lat);\n const z = radius * Math.cos(lat) * Math.cos(lon);\n obj.position.set(center.x + x, center.y + y, center.z + z);\n obj.rotation.y = lon;\n}\n","/**\n * three.js adapter for `@particle-academy/fancy-3d`.\n *\n * Each widget kind paints onto a 2D HTMLCanvasElement that becomes a three\n * `CanvasTexture`, applied to a plane mesh sized to the widget's pixel rect.\n * The same `Scene` data renders recognizably across the DOM, Babylon, and\n * three.js adapters.\n *\n * `three` is a peer dependency — only consumers building 3D scenes install it.\n *\n * import { renderScene } from \"@particle-academy/fancy-3d\";\n * import { createThreeAdapter, placeOnArc, sceneBounds } from \"@particle-academy/fancy-3d-three\";\n */\nimport * as THREE from \"three\";\nimport type {\n AdapterContext,\n Scene,\n SceneNode,\n WidgetAdapter,\n WidgetSpec,\n} from \"@particle-academy/fancy-3d\";\n\nimport { TEX_SCALE, paintWidget } from \"./painters\";\nexport { TEX_SCALE, paintWidget } from \"./painters\";\n\nconst WORLD_SCALE = 1 / 180; // pixels → world units\n\n/* ------------------------------------------------------------------ */\n/* Adapter */\n/* ------------------------------------------------------------------ */\n\nexport interface ThreeAdapterDeps {\n /** The three Scene meshes are added to. */\n scene3D: THREE.Scene;\n /** Pixel size for the widget (the scene node's `size` field). */\n sizeFor(spec: WidgetSpec): { w: number; h: number };\n}\n\nexport function createThreeAdapter(deps: ThreeAdapterDeps): WidgetAdapter<THREE.Object3D> {\n return {\n render(spec: WidgetSpec, ctx: AdapterContext): THREE.Object3D {\n const { w, h } = deps.sizeFor(spec);\n const canvas = document.createElement(\"canvas\");\n canvas.width = Math.max(1, Math.round(w * TEX_SCALE));\n canvas.height = Math.max(1, Math.round(h * TEX_SCALE));\n const c = canvas.getContext(\"2d\") as CanvasRenderingContext2D;\n c.scale(TEX_SCALE, TEX_SCALE);\n paintWidget(c, spec, w, h, ctx.selected);\n\n const tex = new THREE.CanvasTexture(canvas);\n tex.colorSpace = THREE.SRGBColorSpace;\n tex.anisotropy = 4;\n tex.needsUpdate = true;\n\n const mat = new THREE.MeshBasicMaterial({ map: tex, transparent: true, toneMapped: false });\n const geo = new THREE.PlaneGeometry(w * WORLD_SCALE, h * WORLD_SCALE);\n const plane = new THREE.Mesh(geo, mat);\n plane.name = `node-${ctx.nodeId}`;\n plane.userData = { nodeId: ctx.nodeId, kind: spec.kind };\n deps.scene3D.add(plane);\n return plane;\n },\n };\n}\n\n/* ------------------------------------------------------------------ */\n/* Layout helpers */\n/* ------------------------------------------------------------------ */\n\n/**\n * \"3D Desktop\" layout — wraps the scene's 2D positions onto a partial cylinder\n * facing the camera. DOM `x` becomes angle around the cylinder, DOM `y` becomes\n * height.\n */\nexport function placeOnCylinder(\n node: SceneNode,\n obj: THREE.Object3D,\n bounds: { minX: number; maxX: number; minY: number; maxY: number },\n opts: { radius?: number; arc?: number } = {},\n) {\n const radius = opts.radius ?? 6;\n const arc = opts.arc ?? Math.PI * 0.9; // ~160°\n const rangeX = bounds.maxX - bounds.minX || 1;\n const rangeY = bounds.maxY - bounds.minY || 1;\n const cx = (node.position.x + (node.size?.w ?? 200) / 2 - bounds.minX) / rangeX;\n const cy = (node.position.y + (node.size?.h ?? 120) / 2 - bounds.minY) / rangeY;\n const angle = (cx - 0.5) * arc;\n const height = (0.5 - cy) * 6;\n obj.position.set(Math.sin(angle) * radius, height, Math.cos(angle) * radius);\n // Rotate around Y so the plane's front (+Z normal) points outward toward the\n // orbiting camera.\n obj.rotation.set(0, angle, 0);\n}\n\nexport function sceneBounds(scene: Scene) {\n // An empty scene has no extent, and saying so is the only safe answer.\n // Math.min(...[]) is Infinity and Math.max(...[]) is -Infinity, so the\n // unguarded spread returned INVERTED INFINITE bounds. Every layout then\n // centres on (minX + maxX) / 2, which is NaN, and a NaN transform renders as\n // nothing — so an empty scene and a broken one looked identical.\n if (scene.nodes.length === 0) {\n return { minX: 0, maxX: 0, minY: 0, maxY: 0 };\n }\n\n const xs = scene.nodes.map((n) => n.position.x);\n const ys = scene.nodes.map((n) => n.position.y);\n const xe = scene.nodes.map((n) => n.position.x + (n.size?.w ?? 200));\n const ye = scene.nodes.map((n) => n.position.y + (n.size?.h ?? 120));\n return {\n minX: Math.min(...xs),\n maxX: Math.max(...xe),\n minY: Math.min(...ys),\n maxY: Math.max(...ye),\n };\n}\n\nexport * from \"./primitives\";\nexport * from \"./layouts\";\n"]}
package/dist/react.cjs CHANGED
@@ -79,6 +79,7 @@ function useStage() {
79
79
  if (!ctx) throw new Error("useStage() must be called inside <Stage>");
80
80
  return ctx;
81
81
  }
82
+ var STAGE_FOCUS_CSS = '[data-fancy-3d-canvas]:focus-visible { box-shadow: inset 0 0 0 2px var(--fancy-focus, var(--color-blue-500, #3b82f6)); } :where(.dark, [data-theme="dark"]) [data-fancy-3d-canvas]:focus-visible { box-shadow: inset 0 0 0 2px var(--fancy-focus-dark, var(--color-blue-400, #60a5fa)); }';
82
83
  function Stage({
83
84
  children,
84
85
  cameraRadius = 10,
@@ -183,7 +184,16 @@ function Stage({
183
184
  style: { position: "relative", overflow: "hidden", ...style },
184
185
  "data-fancy-3d-stage": "",
185
186
  children: [
186
- /* @__PURE__ */ jsxRuntime.jsx("canvas", { ref: canvasRef, style: { display: "block", width: "100%", height: "100%", outline: "none" }, tabIndex: 0 }),
187
+ /* @__PURE__ */ jsxRuntime.jsx("style", { "data-fancy-3d-stage-css": "", children: STAGE_FOCUS_CSS }),
188
+ /* @__PURE__ */ jsxRuntime.jsx(
189
+ "canvas",
190
+ {
191
+ ref: canvasRef,
192
+ style: { display: "block", width: "100%", height: "100%", outline: "none" },
193
+ tabIndex: 0,
194
+ "data-fancy-3d-canvas": ""
195
+ }
196
+ ),
187
197
  /* @__PURE__ */ jsxRuntime.jsx("div", { ref: overlayRef, style: { position: "absolute", inset: 0, pointerEvents: "none" }, "data-fancy-3d-overlay-root": "" }),
188
198
  stage && /* @__PURE__ */ jsxRuntime.jsx(StageContext.Provider, { value: stage, children })
189
199
  ]
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/react.tsx"],"names":["createContext","useContext","useRef","useState","useEffect","THREE","OrbitControls","jsxs","jsx","useLayoutEffect"],"mappings":"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","file":"react.cjs","sourcesContent":["/**\n * `<Stage>` and `<Monitor>` — declarative React API for fancy-3d (three.js).\n *\n * <Stage>\n * <Monitor position={[0, 2, 0]} width={4} height={2.5}>\n * <Card>...real react-fancy components...</Card>\n * </Monitor>\n * </Stage>\n *\n * `<Stage>` owns the three renderer + scene + camera (OrbitControls) + render\n * loop and exposes them via context. `<Monitor>` builds a bezel mesh, projects\n * its world-space corners to screen space each frame, and renders its children\n * into a positioned DOM overlay — real, interactive React, not a rasterized\n * snapshot. Mirrors `@particle-academy/fancy-3d-babylon`'s React API.\n */\nimport * as THREE from \"three\";\nimport { OrbitControls } from \"three/examples/jsm/controls/OrbitControls.js\";\nimport {\n createContext,\n useContext,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n type CSSProperties,\n type ReactNode,\n} from \"react\";\n\n/* ------------------------------------------------------------------ */\n/* 2D perspective transform — maps a unit rectangle to a 4-point quad */\n/* via a 3x3 homography, packed into a CSS matrix3d for transform. */\n/* ------------------------------------------------------------------ */\n\ntype Mat3 = [number, number, number, number, number, number, number, number, number];\n\nfunction adj3(m: Mat3): Mat3 {\n return [\n m[4] * m[8] - m[5] * m[7], m[2] * m[7] - m[1] * m[8], m[1] * m[5] - m[2] * m[4],\n m[5] * m[6] - m[3] * m[8], m[0] * m[8] - m[2] * m[6], m[2] * m[3] - m[0] * m[5],\n m[3] * m[7] - m[4] * m[6], m[1] * m[6] - m[0] * m[7], m[0] * m[4] - m[1] * m[3],\n ];\n}\n\nfunction multmm(a: Mat3, b: Mat3): Mat3 {\n const c: number[] = new Array(9);\n for (let i = 0; i < 3; i++) {\n for (let j = 0; j < 3; j++) {\n let cij = 0;\n for (let k = 0; k < 3; k++) cij += a[3 * i + k] * b[3 * k + j];\n c[3 * i + j] = cij;\n }\n }\n return c as Mat3;\n}\n\nfunction multmv(m: Mat3, v: [number, number, number]): [number, number, number] {\n return [\n m[0] * v[0] + m[1] * v[1] + m[2] * v[2],\n m[3] * v[0] + m[4] * v[1] + m[5] * v[2],\n m[6] * v[0] + m[7] * v[1] + m[8] * v[2],\n ];\n}\n\nfunction basisToPoints(x1: number, y1: number, x2: number, y2: number, x3: number, y3: number, x4: number, y4: number): Mat3 {\n const m: Mat3 = [x1, x2, x3, y1, y2, y3, 1, 1, 1];\n const v = multmv(adj3(m), [x4, y4, 1]);\n return multmm(m, [v[0], 0, 0, 0, v[1], 0, 0, 0, v[2]]);\n}\n\nfunction quadToQuad(\n w: number, h: number,\n x1: number, y1: number, x2: number, y2: number, x3: number, y3: number, x4: number, y4: number,\n): Mat3 {\n const s = basisToPoints(0, 0, w, 0, w, h, 0, h);\n const d = basisToPoints(x1, y1, x2, y2, x3, y3, x4, y4);\n const t = multmm(d, adj3(s));\n const n = t[8];\n for (let i = 0; i < 9; i++) t[i] /= n;\n return t;\n}\n\nfunction matrix3dString(t: Mat3): string {\n return `matrix3d(${t[0]}, ${t[3]}, 0, ${t[6]}, ${t[1]}, ${t[4]}, 0, ${t[7]}, 0, 0, 1, 0, ${t[2]}, ${t[5]}, 0, ${t[8]})`;\n}\n\n/* ------------------------------------------------------------------ */\n/* Stage context */\n/* ------------------------------------------------------------------ */\n\ninterface StageContextValue {\n renderer: THREE.WebGLRenderer;\n scene: THREE.Scene;\n camera: THREE.PerspectiveCamera;\n /** The HTML <canvas> the renderer draws into — its rect anchors overlays. */\n canvas: HTMLCanvasElement;\n /** Subscribe to per-frame ticks (after matrices update, before render). */\n onFrame(cb: () => void): () => void;\n /** The DOM container that screen overlays mount into. */\n overlayRoot: HTMLDivElement;\n}\n\nconst StageContext = createContext<StageContextValue | null>(null);\n\nexport function useStage(): StageContextValue {\n const ctx = useContext(StageContext);\n if (!ctx) throw new Error(\"useStage() must be called inside <Stage>\");\n return ctx;\n}\n\n/* ------------------------------------------------------------------ */\n/* Stage */\n/* ------------------------------------------------------------------ */\n\nexport interface StageProps {\n children?: ReactNode;\n /** Initial camera radius. Defaults to 10. */\n cameraRadius?: number;\n /** Initial camera target. Defaults to (0, 1.5, 0). */\n cameraTarget?: [number, number, number];\n /** Initial horizontal angle (radians). Defaults to π/2. */\n cameraAlpha?: number;\n /** Initial vertical angle from +Y (radians). Defaults to π/2.4. */\n cameraBeta?: number;\n /** Background clear color. Defaults to a near-black. */\n clearColor?: string;\n /** Disable the default lights / camera if you want to set your own. */\n bare?: boolean;\n /** Callback after the scene is created — set up custom cameras, lights, meshes. */\n onReady?: (scene: THREE.Scene, ctx: { camera: THREE.PerspectiveCamera; renderer: THREE.WebGLRenderer }) => void;\n className?: string;\n style?: CSSProperties;\n}\n\nexport function Stage({\n children,\n cameraRadius = 10,\n cameraTarget = [0, 1.5, 0],\n cameraAlpha = Math.PI / 2,\n cameraBeta = Math.PI / 2.4,\n clearColor = \"#06080f\",\n bare = false,\n onReady,\n className,\n style,\n}: StageProps) {\n const containerRef = useRef<HTMLDivElement | null>(null);\n const canvasRef = useRef<HTMLCanvasElement | null>(null);\n const overlayRef = useRef<HTMLDivElement | null>(null);\n const [stage, setStage] = useState<StageContextValue | null>(null);\n\n useEffect(() => {\n const canvas = canvasRef.current;\n const container = containerRef.current;\n const overlay = overlayRef.current;\n if (!canvas || !container || !overlay) return;\n\n const renderer = new THREE.WebGLRenderer({ canvas, antialias: true, alpha: true, preserveDrawingBuffer: true, stencil: true });\n renderer.setPixelRatio(window.devicePixelRatio || 1);\n renderer.setClearColor(new THREE.Color(clearColor), 1);\n\n const scene = new THREE.Scene();\n const camera = new THREE.PerspectiveCamera(50, 1, 0.1, 1000);\n const target = new THREE.Vector3(...cameraTarget);\n\n const controls = new OrbitControls(camera, canvas);\n controls.target.copy(target);\n controls.enableDamping = true;\n controls.dampingFactor = 0.08;\n\n if (!bare) {\n // Spherical → cartesian (Babylon ArcRotateCamera alpha/beta convention).\n camera.position.set(\n target.x + cameraRadius * Math.sin(cameraBeta) * Math.cos(cameraAlpha),\n target.y + cameraRadius * Math.cos(cameraBeta),\n target.z + cameraRadius * Math.sin(cameraBeta) * Math.sin(cameraAlpha),\n );\n controls.minDistance = 1;\n controls.maxDistance = 80;\n controls.maxPolarAngle = Math.PI / 2 - 0.05; // don't dip below the horizon\n\n const hemi = new THREE.HemisphereLight(0xb3c6ff, 0x1a1a2e, 0.9);\n scene.add(hemi);\n const dir = new THREE.DirectionalLight(0xffffff, 0.8);\n dir.position.set(-0.4, 1, 0.6).multiplyScalar(10);\n scene.add(dir);\n } else {\n camera.position.set(0, 0, cameraRadius);\n }\n camera.lookAt(target);\n controls.update();\n\n onReady?.(scene, { camera, renderer });\n\n const frameSubs = new Set<() => void>();\n let raf = 0;\n const loop = () => {\n raf = requestAnimationFrame(loop);\n controls.update();\n camera.updateMatrixWorld();\n camera.matrixWorldInverse.copy(camera.matrixWorld).invert();\n scene.traverse((o) => {\n if (o.userData && o.userData.faceCamera) o.lookAt(camera.position);\n });\n frameSubs.forEach((cb) => cb());\n renderer.render(scene, camera);\n };\n\n const resize = () => {\n const w = container.clientWidth || 1;\n const h = container.clientHeight || 1;\n renderer.setSize(w, h, false);\n camera.aspect = w / h;\n camera.updateProjectionMatrix();\n };\n resize();\n const ro = new ResizeObserver(resize);\n ro.observe(container);\n window.addEventListener(\"resize\", resize);\n loop();\n\n setStage({\n renderer,\n scene,\n camera,\n canvas,\n overlayRoot: overlay,\n onFrame(cb) {\n frameSubs.add(cb);\n return () => frameSubs.delete(cb);\n },\n });\n\n return () => {\n cancelAnimationFrame(raf);\n window.removeEventListener(\"resize\", resize);\n ro.disconnect();\n controls.dispose();\n renderer.dispose();\n setStage(null);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return (\n <div\n ref={containerRef}\n className={className}\n style={{ position: \"relative\", overflow: \"hidden\", ...style }}\n data-fancy-3d-stage=\"\"\n >\n <canvas ref={canvasRef} style={{ display: \"block\", width: \"100%\", height: \"100%\", outline: \"none\" }} tabIndex={0} />\n <div ref={overlayRef} style={{ position: \"absolute\", inset: 0, pointerEvents: \"none\" }} data-fancy-3d-overlay-root=\"\" />\n {stage && <StageContext.Provider value={stage}>{children}</StageContext.Provider>}\n </div>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Monitor — interactive mount point on a 3D mesh */\n/* ------------------------------------------------------------------ */\n\nexport interface MonitorProps {\n children?: ReactNode;\n /** World-space center of the screen. */\n position: [number, number, number];\n /** Mesh dimensions in world units. */\n width: number;\n height: number;\n /** Y-axis rotation in radians. */\n rotationY?: number;\n /** Bezel color. Defaults to a near-black frame. */\n bezel?: string;\n /** Bezel thickness in world units. Defaults to 0.06. */\n bezelThickness?: number;\n /** Background color visible behind the React content. */\n background?: string;\n /** Design-time pixel width for the children. Defaults to `width * 360`. */\n pixelWidth?: number;\n /** Design-time pixel height for the children. Defaults to `height * 360`. */\n pixelHeight?: number;\n /** Optional name on the mesh. */\n name?: string;\n}\n\nexport function Monitor({\n children,\n position,\n width,\n height,\n rotationY = 0,\n bezel = \"#0b0f17\",\n bezelThickness = 0.06,\n background = \"#0b1220\",\n pixelWidth,\n pixelHeight,\n name = \"screen\",\n}: MonitorProps) {\n const stage = useStage();\n const meshRef = useRef<THREE.Mesh | null>(null);\n const overlayRef = useRef<HTMLDivElement | null>(null);\n const innerSize = useRef({\n w: pixelWidth ?? Math.max(120, Math.round(width * 360)),\n h: pixelHeight ?? Math.max(80, Math.round(height * 360)),\n });\n\n // Build the bezel + projection-target pane.\n useEffect(() => {\n const { scene } = stage;\n const bezelMesh = new THREE.Mesh(\n new THREE.BoxGeometry(width + bezelThickness * 2, height + bezelThickness * 2, bezelThickness),\n new THREE.MeshStandardMaterial({ color: new THREE.Color(bezel), roughness: 0.5, metalness: 0.1 }),\n );\n bezelMesh.position.set(position[0], position[1], position[2]);\n bezelMesh.rotation.y = rotationY;\n scene.add(bezelMesh);\n\n const pane = new THREE.Mesh(\n new THREE.PlaneGeometry(width, height),\n new THREE.MeshBasicMaterial({ color: new THREE.Color(background), side: THREE.DoubleSide, toneMapped: false }),\n );\n pane.rotation.y = rotationY;\n // Offset the pane forward of the bezel's +Z front so the HTML overlay lines\n // up with the visible face.\n const forward = new THREE.Vector3(0, 0, 1).applyAxisAngle(new THREE.Vector3(0, 1, 0), rotationY).multiplyScalar(bezelThickness / 2 + 0.001);\n pane.position.set(position[0] + forward.x, position[1] + forward.y, position[2] + forward.z);\n pane.userData = { fancy3d: \"screen\", screenName: name };\n scene.add(pane);\n meshRef.current = pane;\n\n return () => {\n scene.remove(pane);\n scene.remove(bezelMesh);\n pane.geometry.dispose();\n (pane.material as THREE.Material).dispose();\n bezelMesh.geometry.dispose();\n (bezelMesh.material as THREE.Material).dispose();\n meshRef.current = null;\n };\n }, [stage, name, width, height, bezel, bezelThickness, background, position, rotationY]);\n\n // Each frame: project the four corners and apply the matrix3d transform.\n useEffect(() => {\n const unsub = stage.onFrame(() => {\n const mesh = meshRef.current;\n const overlay = overlayRef.current;\n if (!mesh || !overlay) return;\n const { camera, canvas } = stage;\n mesh.updateWorldMatrix(true, false);\n\n const cw = canvas.clientWidth;\n const ch = canvas.clientHeight;\n const halfW = width / 2;\n const halfH = height / 2;\n // Mesh-local corners: top-left, top-right, bottom-right, bottom-left.\n const local = [\n new THREE.Vector3(-halfW, halfH, 0),\n new THREE.Vector3(halfW, halfH, 0),\n new THREE.Vector3(halfW, -halfH, 0),\n new THREE.Vector3(-halfW, -halfH, 0),\n ];\n const world = local.map((v) => v.applyMatrix4(mesh.matrixWorld));\n\n // Behind-camera cull (view-space z >= 0 means behind, since the camera\n // looks down -Z).\n const inFront = world.every((c) => c.clone().applyMatrix4(camera.matrixWorldInverse).z < -0.001);\n // Edge-on cull — hide when nearly perpendicular (projected quad collapses).\n const right = world[1].clone().sub(world[0]);\n const up = world[0].clone().sub(world[3]);\n const normal = new THREE.Vector3().crossVectors(up, right).normalize();\n const center = world[0].clone().add(world[2]).multiplyScalar(0.5);\n const toCam = camera.position.clone().sub(center).normalize();\n const facing = Math.abs(normal.dot(toCam));\n\n if (!inFront || facing <= 0.05) {\n if (overlay.style.display !== \"none\") overlay.style.display = \"none\";\n return;\n }\n\n const projected = world.map((c) => {\n const ndc = c.clone().project(camera);\n return { x: (ndc.x * 0.5 + 0.5) * cw, y: (-ndc.y * 0.5 + 0.5) * ch, z: ndc.z };\n });\n\n // Depth-sort overlays: closer-to-camera (smaller NDC z) stacks above.\n const avgZ = (projected[0].z + projected[1].z + projected[2].z + projected[3].z) / 4;\n const depth01 = Math.max(0, Math.min(1, avgZ * 0.5 + 0.5));\n const zStr = String(Math.round((1 - depth01) * 100000));\n if (overlay.style.zIndex !== zStr) overlay.style.zIndex = zStr;\n\n const w0 = innerSize.current.w;\n const h0 = innerSize.current.h;\n const t = quadToQuad(\n w0, h0,\n projected[0].x, projected[0].y,\n projected[1].x, projected[1].y,\n projected[2].x, projected[2].y,\n projected[3].x, projected[3].y,\n );\n\n if (overlay.style.display !== \"block\") overlay.style.display = \"block\";\n overlay.style.transform = matrix3dString(t);\n });\n return unsub;\n }, [stage, width, height]);\n\n // Mount the overlay into the stage's overlay root.\n useLayoutEffect(() => {\n const el = overlayRef.current;\n if (!el) return;\n if (el.parentElement !== stage.overlayRoot) stage.overlayRoot.appendChild(el);\n return () => {\n if (el.parentElement === stage.overlayRoot) stage.overlayRoot.removeChild(el);\n };\n }, [stage]);\n\n return (\n <div\n ref={overlayRef}\n data-fancy-3d-screen={name}\n style={{\n position: \"absolute\",\n left: 0,\n top: 0,\n width: innerSize.current.w,\n height: innerSize.current.h,\n transformOrigin: \"0 0\",\n pointerEvents: \"auto\",\n overflow: \"hidden\",\n background,\n borderRadius: 4,\n display: \"none\",\n }}\n >\n {children}\n </div>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/react.tsx"],"names":["createContext","useContext","useRef","useState","useEffect","THREE","OrbitControls","jsxs","jsx","useLayoutEffect"],"mappings":"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","file":"react.cjs","sourcesContent":["/**\n * `<Stage>` and `<Monitor>` — declarative React API for fancy-3d (three.js).\n *\n * <Stage>\n * <Monitor position={[0, 2, 0]} width={4} height={2.5}>\n * <Card>...real react-fancy components...</Card>\n * </Monitor>\n * </Stage>\n *\n * `<Stage>` owns the three renderer + scene + camera (OrbitControls) + render\n * loop and exposes them via context. `<Monitor>` builds a bezel mesh, projects\n * its world-space corners to screen space each frame, and renders its children\n * into a positioned DOM overlay — real, interactive React, not a rasterized\n * snapshot. Mirrors `@particle-academy/fancy-3d-babylon`'s React API.\n */\nimport * as THREE from \"three\";\nimport { OrbitControls } from \"three/examples/jsm/controls/OrbitControls.js\";\nimport {\n createContext,\n useContext,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n type CSSProperties,\n type ReactNode,\n} from \"react\";\n\n/* ------------------------------------------------------------------ */\n/* 2D perspective transform — maps a unit rectangle to a 4-point quad */\n/* via a 3x3 homography, packed into a CSS matrix3d for transform. */\n/* ------------------------------------------------------------------ */\n\ntype Mat3 = [number, number, number, number, number, number, number, number, number];\n\nfunction adj3(m: Mat3): Mat3 {\n return [\n m[4] * m[8] - m[5] * m[7], m[2] * m[7] - m[1] * m[8], m[1] * m[5] - m[2] * m[4],\n m[5] * m[6] - m[3] * m[8], m[0] * m[8] - m[2] * m[6], m[2] * m[3] - m[0] * m[5],\n m[3] * m[7] - m[4] * m[6], m[1] * m[6] - m[0] * m[7], m[0] * m[4] - m[1] * m[3],\n ];\n}\n\nfunction multmm(a: Mat3, b: Mat3): Mat3 {\n const c: number[] = new Array(9);\n for (let i = 0; i < 3; i++) {\n for (let j = 0; j < 3; j++) {\n let cij = 0;\n for (let k = 0; k < 3; k++) cij += a[3 * i + k] * b[3 * k + j];\n c[3 * i + j] = cij;\n }\n }\n return c as Mat3;\n}\n\nfunction multmv(m: Mat3, v: [number, number, number]): [number, number, number] {\n return [\n m[0] * v[0] + m[1] * v[1] + m[2] * v[2],\n m[3] * v[0] + m[4] * v[1] + m[5] * v[2],\n m[6] * v[0] + m[7] * v[1] + m[8] * v[2],\n ];\n}\n\nfunction basisToPoints(x1: number, y1: number, x2: number, y2: number, x3: number, y3: number, x4: number, y4: number): Mat3 {\n const m: Mat3 = [x1, x2, x3, y1, y2, y3, 1, 1, 1];\n const v = multmv(adj3(m), [x4, y4, 1]);\n return multmm(m, [v[0], 0, 0, 0, v[1], 0, 0, 0, v[2]]);\n}\n\nfunction quadToQuad(\n w: number, h: number,\n x1: number, y1: number, x2: number, y2: number, x3: number, y3: number, x4: number, y4: number,\n): Mat3 {\n const s = basisToPoints(0, 0, w, 0, w, h, 0, h);\n const d = basisToPoints(x1, y1, x2, y2, x3, y3, x4, y4);\n const t = multmm(d, adj3(s));\n const n = t[8];\n for (let i = 0; i < 9; i++) t[i] /= n;\n return t;\n}\n\nfunction matrix3dString(t: Mat3): string {\n return `matrix3d(${t[0]}, ${t[3]}, 0, ${t[6]}, ${t[1]}, ${t[4]}, 0, ${t[7]}, 0, 0, 1, 0, ${t[2]}, ${t[5]}, 0, ${t[8]})`;\n}\n\n/* ------------------------------------------------------------------ */\n/* Stage context */\n/* ------------------------------------------------------------------ */\n\ninterface StageContextValue {\n renderer: THREE.WebGLRenderer;\n scene: THREE.Scene;\n camera: THREE.PerspectiveCamera;\n /** The HTML <canvas> the renderer draws into — its rect anchors overlays. */\n canvas: HTMLCanvasElement;\n /** Subscribe to per-frame ticks (after matrices update, before render). */\n onFrame(cb: () => void): () => void;\n /** The DOM container that screen overlays mount into. */\n overlayRoot: HTMLDivElement;\n}\n\nconst StageContext = createContext<StageContextValue | null>(null);\n\nexport function useStage(): StageContextValue {\n const ctx = useContext(StageContext);\n if (!ctx) throw new Error(\"useStage() must be called inside <Stage>\");\n return ctx;\n}\n\n/* ------------------------------------------------------------------ */\n/* Stage */\n/* ------------------------------------------------------------------ */\n\nexport interface StageProps {\n children?: ReactNode;\n /** Initial camera radius. Defaults to 10. */\n cameraRadius?: number;\n /** Initial camera target. Defaults to (0, 1.5, 0). */\n cameraTarget?: [number, number, number];\n /** Initial horizontal angle (radians). Defaults to π/2. */\n cameraAlpha?: number;\n /** Initial vertical angle from +Y (radians). Defaults to π/2.4. */\n cameraBeta?: number;\n /** Background clear color. Defaults to a near-black. */\n clearColor?: string;\n /** Disable the default lights / camera if you want to set your own. */\n bare?: boolean;\n /** Callback after the scene is created — set up custom cameras, lights, meshes. */\n onReady?: (scene: THREE.Scene, ctx: { camera: THREE.PerspectiveCamera; renderer: THREE.WebGLRenderer }) => void;\n className?: string;\n style?: CSSProperties;\n}\n\n/**\n * Keyboard focus ring for the Stage canvas. The canvas is focusable (the camera\n * controls listen on it) and carries an inline `outline: none`, which beats any\n * stylesheet outline — so the ring is a box-shadow, a separate property. Inset,\n * because the Stage container clips overflow. Shipped as a scoped `<style>`\n * rather than Tailwind classes: consumers are not guaranteed to scan this\n * package's dist, and a class nobody generates is a ring nobody sees.\n */\nconst STAGE_FOCUS_CSS =\n \"[data-fancy-3d-canvas]:focus-visible { box-shadow: inset 0 0 0 2px var(--fancy-focus, var(--color-blue-500, #3b82f6)); }\" +\n \" :where(.dark, [data-theme=\\\"dark\\\"]) [data-fancy-3d-canvas]:focus-visible { box-shadow: inset 0 0 0 2px var(--fancy-focus-dark, var(--color-blue-400, #60a5fa)); }\";\n\nexport function Stage({\n children,\n cameraRadius = 10,\n cameraTarget = [0, 1.5, 0],\n cameraAlpha = Math.PI / 2,\n cameraBeta = Math.PI / 2.4,\n clearColor = \"#06080f\",\n bare = false,\n onReady,\n className,\n style,\n}: StageProps) {\n const containerRef = useRef<HTMLDivElement | null>(null);\n const canvasRef = useRef<HTMLCanvasElement | null>(null);\n const overlayRef = useRef<HTMLDivElement | null>(null);\n const [stage, setStage] = useState<StageContextValue | null>(null);\n\n useEffect(() => {\n const canvas = canvasRef.current;\n const container = containerRef.current;\n const overlay = overlayRef.current;\n if (!canvas || !container || !overlay) return;\n\n const renderer = new THREE.WebGLRenderer({ canvas, antialias: true, alpha: true, preserveDrawingBuffer: true, stencil: true });\n renderer.setPixelRatio(window.devicePixelRatio || 1);\n renderer.setClearColor(new THREE.Color(clearColor), 1);\n\n const scene = new THREE.Scene();\n const camera = new THREE.PerspectiveCamera(50, 1, 0.1, 1000);\n const target = new THREE.Vector3(...cameraTarget);\n\n const controls = new OrbitControls(camera, canvas);\n controls.target.copy(target);\n controls.enableDamping = true;\n controls.dampingFactor = 0.08;\n\n if (!bare) {\n // Spherical → cartesian (Babylon ArcRotateCamera alpha/beta convention).\n camera.position.set(\n target.x + cameraRadius * Math.sin(cameraBeta) * Math.cos(cameraAlpha),\n target.y + cameraRadius * Math.cos(cameraBeta),\n target.z + cameraRadius * Math.sin(cameraBeta) * Math.sin(cameraAlpha),\n );\n controls.minDistance = 1;\n controls.maxDistance = 80;\n controls.maxPolarAngle = Math.PI / 2 - 0.05; // don't dip below the horizon\n\n const hemi = new THREE.HemisphereLight(0xb3c6ff, 0x1a1a2e, 0.9);\n scene.add(hemi);\n const dir = new THREE.DirectionalLight(0xffffff, 0.8);\n dir.position.set(-0.4, 1, 0.6).multiplyScalar(10);\n scene.add(dir);\n } else {\n camera.position.set(0, 0, cameraRadius);\n }\n camera.lookAt(target);\n controls.update();\n\n onReady?.(scene, { camera, renderer });\n\n const frameSubs = new Set<() => void>();\n let raf = 0;\n const loop = () => {\n raf = requestAnimationFrame(loop);\n controls.update();\n camera.updateMatrixWorld();\n camera.matrixWorldInverse.copy(camera.matrixWorld).invert();\n scene.traverse((o) => {\n if (o.userData && o.userData.faceCamera) o.lookAt(camera.position);\n });\n frameSubs.forEach((cb) => cb());\n renderer.render(scene, camera);\n };\n\n const resize = () => {\n const w = container.clientWidth || 1;\n const h = container.clientHeight || 1;\n renderer.setSize(w, h, false);\n camera.aspect = w / h;\n camera.updateProjectionMatrix();\n };\n resize();\n const ro = new ResizeObserver(resize);\n ro.observe(container);\n window.addEventListener(\"resize\", resize);\n loop();\n\n setStage({\n renderer,\n scene,\n camera,\n canvas,\n overlayRoot: overlay,\n onFrame(cb) {\n frameSubs.add(cb);\n return () => frameSubs.delete(cb);\n },\n });\n\n return () => {\n cancelAnimationFrame(raf);\n window.removeEventListener(\"resize\", resize);\n ro.disconnect();\n controls.dispose();\n renderer.dispose();\n setStage(null);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return (\n <div\n ref={containerRef}\n className={className}\n style={{ position: \"relative\", overflow: \"hidden\", ...style }}\n data-fancy-3d-stage=\"\"\n >\n <style data-fancy-3d-stage-css=\"\">{STAGE_FOCUS_CSS}</style>\n <canvas\n ref={canvasRef}\n style={{ display: \"block\", width: \"100%\", height: \"100%\", outline: \"none\" }}\n tabIndex={0}\n data-fancy-3d-canvas=\"\"\n />\n <div ref={overlayRef} style={{ position: \"absolute\", inset: 0, pointerEvents: \"none\" }} data-fancy-3d-overlay-root=\"\" />\n {stage && <StageContext.Provider value={stage}>{children}</StageContext.Provider>}\n </div>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Monitor — interactive mount point on a 3D mesh */\n/* ------------------------------------------------------------------ */\n\nexport interface MonitorProps {\n children?: ReactNode;\n /** World-space center of the screen. */\n position: [number, number, number];\n /** Mesh dimensions in world units. */\n width: number;\n height: number;\n /** Y-axis rotation in radians. */\n rotationY?: number;\n /** Bezel color. Defaults to a near-black frame. */\n bezel?: string;\n /** Bezel thickness in world units. Defaults to 0.06. */\n bezelThickness?: number;\n /** Background color visible behind the React content. */\n background?: string;\n /** Design-time pixel width for the children. Defaults to `width * 360`. */\n pixelWidth?: number;\n /** Design-time pixel height for the children. Defaults to `height * 360`. */\n pixelHeight?: number;\n /** Optional name on the mesh. */\n name?: string;\n}\n\nexport function Monitor({\n children,\n position,\n width,\n height,\n rotationY = 0,\n bezel = \"#0b0f17\",\n bezelThickness = 0.06,\n background = \"#0b1220\",\n pixelWidth,\n pixelHeight,\n name = \"screen\",\n}: MonitorProps) {\n const stage = useStage();\n const meshRef = useRef<THREE.Mesh | null>(null);\n const overlayRef = useRef<HTMLDivElement | null>(null);\n const innerSize = useRef({\n w: pixelWidth ?? Math.max(120, Math.round(width * 360)),\n h: pixelHeight ?? Math.max(80, Math.round(height * 360)),\n });\n\n // Build the bezel + projection-target pane.\n useEffect(() => {\n const { scene } = stage;\n const bezelMesh = new THREE.Mesh(\n new THREE.BoxGeometry(width + bezelThickness * 2, height + bezelThickness * 2, bezelThickness),\n new THREE.MeshStandardMaterial({ color: new THREE.Color(bezel), roughness: 0.5, metalness: 0.1 }),\n );\n bezelMesh.position.set(position[0], position[1], position[2]);\n bezelMesh.rotation.y = rotationY;\n scene.add(bezelMesh);\n\n const pane = new THREE.Mesh(\n new THREE.PlaneGeometry(width, height),\n new THREE.MeshBasicMaterial({ color: new THREE.Color(background), side: THREE.DoubleSide, toneMapped: false }),\n );\n pane.rotation.y = rotationY;\n // Offset the pane forward of the bezel's +Z front so the HTML overlay lines\n // up with the visible face.\n const forward = new THREE.Vector3(0, 0, 1).applyAxisAngle(new THREE.Vector3(0, 1, 0), rotationY).multiplyScalar(bezelThickness / 2 + 0.001);\n pane.position.set(position[0] + forward.x, position[1] + forward.y, position[2] + forward.z);\n pane.userData = { fancy3d: \"screen\", screenName: name };\n scene.add(pane);\n meshRef.current = pane;\n\n return () => {\n scene.remove(pane);\n scene.remove(bezelMesh);\n pane.geometry.dispose();\n (pane.material as THREE.Material).dispose();\n bezelMesh.geometry.dispose();\n (bezelMesh.material as THREE.Material).dispose();\n meshRef.current = null;\n };\n }, [stage, name, width, height, bezel, bezelThickness, background, position, rotationY]);\n\n // Each frame: project the four corners and apply the matrix3d transform.\n useEffect(() => {\n const unsub = stage.onFrame(() => {\n const mesh = meshRef.current;\n const overlay = overlayRef.current;\n if (!mesh || !overlay) return;\n const { camera, canvas } = stage;\n mesh.updateWorldMatrix(true, false);\n\n const cw = canvas.clientWidth;\n const ch = canvas.clientHeight;\n const halfW = width / 2;\n const halfH = height / 2;\n // Mesh-local corners: top-left, top-right, bottom-right, bottom-left.\n const local = [\n new THREE.Vector3(-halfW, halfH, 0),\n new THREE.Vector3(halfW, halfH, 0),\n new THREE.Vector3(halfW, -halfH, 0),\n new THREE.Vector3(-halfW, -halfH, 0),\n ];\n const world = local.map((v) => v.applyMatrix4(mesh.matrixWorld));\n\n // Behind-camera cull (view-space z >= 0 means behind, since the camera\n // looks down -Z).\n const inFront = world.every((c) => c.clone().applyMatrix4(camera.matrixWorldInverse).z < -0.001);\n // Edge-on cull — hide when nearly perpendicular (projected quad collapses).\n const right = world[1].clone().sub(world[0]);\n const up = world[0].clone().sub(world[3]);\n const normal = new THREE.Vector3().crossVectors(up, right).normalize();\n const center = world[0].clone().add(world[2]).multiplyScalar(0.5);\n const toCam = camera.position.clone().sub(center).normalize();\n const facing = Math.abs(normal.dot(toCam));\n\n if (!inFront || facing <= 0.05) {\n if (overlay.style.display !== \"none\") overlay.style.display = \"none\";\n return;\n }\n\n const projected = world.map((c) => {\n const ndc = c.clone().project(camera);\n return { x: (ndc.x * 0.5 + 0.5) * cw, y: (-ndc.y * 0.5 + 0.5) * ch, z: ndc.z };\n });\n\n // Depth-sort overlays: closer-to-camera (smaller NDC z) stacks above.\n const avgZ = (projected[0].z + projected[1].z + projected[2].z + projected[3].z) / 4;\n const depth01 = Math.max(0, Math.min(1, avgZ * 0.5 + 0.5));\n const zStr = String(Math.round((1 - depth01) * 100000));\n if (overlay.style.zIndex !== zStr) overlay.style.zIndex = zStr;\n\n const w0 = innerSize.current.w;\n const h0 = innerSize.current.h;\n const t = quadToQuad(\n w0, h0,\n projected[0].x, projected[0].y,\n projected[1].x, projected[1].y,\n projected[2].x, projected[2].y,\n projected[3].x, projected[3].y,\n );\n\n if (overlay.style.display !== \"block\") overlay.style.display = \"block\";\n overlay.style.transform = matrix3dString(t);\n });\n return unsub;\n }, [stage, width, height]);\n\n // Mount the overlay into the stage's overlay root.\n useLayoutEffect(() => {\n const el = overlayRef.current;\n if (!el) return;\n if (el.parentElement !== stage.overlayRoot) stage.overlayRoot.appendChild(el);\n return () => {\n if (el.parentElement === stage.overlayRoot) stage.overlayRoot.removeChild(el);\n };\n }, [stage]);\n\n return (\n <div\n ref={overlayRef}\n data-fancy-3d-screen={name}\n style={{\n position: \"absolute\",\n left: 0,\n top: 0,\n width: innerSize.current.w,\n height: innerSize.current.h,\n transformOrigin: \"0 0\",\n pointerEvents: \"auto\",\n overflow: \"hidden\",\n background,\n borderRadius: 4,\n display: \"none\",\n }}\n >\n {children}\n </div>\n );\n}\n"]}