onda-engine 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../cinema/src/props.ts","../../cinema/src/timing.ts","../../cinema/src/inspect/constants.ts","../../cinema/src/inspect/collisions.ts","../../cinema/src/inspect/density.ts","../../cinema/src/inspect/frames.ts","../../cinema/src/inspect/color.ts","../../cinema/src/inspect/resolve.ts","../../cinema/src/inspect/text.ts","../../cinema/src/inspect/legibility.ts","../../cinema/src/inspect/overflow.ts","../../cinema/src/inspect/reading.ts","../../cinema/src/inspect/index.ts","../../cinema/src/index.tsx"],"names":["nonAmbient","manifestEntry","secs"],"mappings":"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","file":"cinema.js","sourcesContent":["//! The Studio→engine PROP vocabulary — size-role tokens, prop-name aliases,\n//! placement coords, and the self-anchoring list. Extracted (verbatim) from the\n//! renderer in `index.tsx` so the inspector can resolve an entry's effective\n//! props/placement the SAME way `buildComposition` does, without importing the\n//! React renderer. Behavior is identical to the pre-extraction code.\n\n// Placement → fraction of the canvas the element's centre is moved to. Components\n// self-centre (their own `<AbsoluteFill justify=\"center\">`), so without this every\n// entry stacks dead-centre — a regression vs the Remotion path, which anchored by\n// `placement`. Shifting the centred element by the centre→target delta restores\n// regions; centre/thirds are exact, corners are approximate (true corner-anchoring\n// needs the laid-out element size — a follow-up once the bridge can measure).\nexport const PLACEMENT_COORDS: Record<string, [number, number]> = {\n center: [0.5, 0.5],\n top: [0.5, 0.1],\n bottom: [0.5, 0.9],\n left: [0.1, 0.5],\n right: [0.9, 0.5],\n 'top-left': [0.1, 0.1],\n 'top-right': [0.9, 0.1],\n 'bottom-left': [0.1, 0.9],\n 'bottom-right': [0.9, 0.9],\n 'upper-third': [0.5, 0.28],\n 'lower-third': [0.5, 0.72],\n}\n\n// Components that consume `placement` THEMSELVES (the shared placement contract\n// in @onda-engine/components, or their own legacy anchoring) — the bridge must NOT also\n// shift them, or placement applies twice and they fly off-canvas. Every\n// component migrated onto `usePlacement`/`PlacementShift` belongs here.\nexport const SELF_ANCHORING = new Set([\n 'LowerThird',\n 'Callout',\n 'BlurReveal',\n 'Button',\n 'Captions',\n 'ChapterCard',\n 'CountUp',\n 'EndCard',\n 'InputField',\n 'KineticText',\n 'MaskReveal',\n 'MatrixDecode',\n 'PricingCard',\n 'QuoteCard',\n 'SlotMachineRoll',\n 'StatCard',\n 'Terminal',\n 'TextAnimator',\n 'TitleCard',\n 'Typewriter',\n])\n\n/** Centre→anchor pixel offset for an entry's `placement` prop (string slug or\n * `{x,y}` fractions). Returns `[0,0]` for centre / unknown. */\nexport function placementOffset(\n props: Record<string, unknown> | undefined,\n w: number,\n h: number,\n): [number, number] {\n const p = props?.placement\n let fx = 0.5\n let fy = 0.5\n const coords = typeof p === 'string' ? PLACEMENT_COORDS[p] : undefined\n if (coords) [fx, fy] = coords\n else if (p && typeof p === 'object') {\n const o = p as { x?: unknown; y?: unknown }\n if (typeof o.x === 'number') fx = o.x\n if (typeof o.y === 'number') fy = o.y\n }\n return [(fx - 0.5) * w, (fy - 0.5) * h]\n}\n\n// ── Studio prop vocabulary → @onda-engine/components prop API ────────────────────────\n// ondajs/Studio components take a semantic SIZE ROLE (a fraction of the SMALLER\n// canvas dimension, resolved canvas-aware) under prop names like `size` /\n// `titleSize` / `numberSize`, with a px companion (`fontSize` / `titleFontSize`,\n// which wins when both are passed). The `@onda-engine/components` ports instead take\n// raw px under their own names (`fontSize`, `titleSize`, `valueSize`). Without a\n// translation, a real Studio payload's `size: \"hero\"` is either dropped (default\n// size) or — worse — fed into a component's arithmetic, yielding `NaN` → a `null`\n// in the scene JSON that the Rust f32 parser rejects (hard render failure).\n//\n// SIZE_ROLES + the resolve formula MUST match Studio's `resolveSize` exactly\n// (frontend/src/lib/onda/canvas.tsx) so bridged sizes equal Studio's pixels.\nexport const SIZE_ROLES: Record<string, number> = {\n hero: 0.15,\n heading: 0.09,\n subheading: 0.052,\n body: 0.03,\n caption: 0.02,\n}\nexport const roleToPx = (role: string, w: number, h: number): number =>\n Math.round((SIZE_ROLES[role] ?? 0) * Math.min(w, h))\n\n// Per-component prop map: Studio prop name → `@onda-engine/components` prop name. Role\n// sources (`…Size`/`size`) resolve through SIZE_ROLES; px sources\n// (`…FontSize`/`fontSize`) pass numbers through and WIN over a role for the same\n// target (matching Studio's \"px wins\" rule).\nexport const isPxSource = (name: string): boolean =>\n name === 'fontSize' || name.endsWith('FontSize')\nexport const PROP_ALIASES: Record<string, Record<string, string>> = {\n TitleCard: {\n titleSize: 'titleSize',\n titleFontSize: 'titleSize',\n subtitleSize: 'subtitleSize',\n subtitleFontSize: 'subtitleSize',\n },\n Highlight: { size: 'fontSize', fontSize: 'fontSize' },\n WordStagger: { size: 'fontSize', fontSize: 'fontSize' },\n Captions: { size: 'fontSize', fontSize: 'fontSize' },\n StatCard: {\n numberSize: 'valueSize',\n numberFontSize: 'valueSize',\n labelSize: 'labelSize',\n labelFontSize: 'labelSize',\n },\n}\n\n/** Translate a Studio entry's props to the `@onda-engine/components` prop API: resolve\n * size-role tokens to canvas-aware px, alias the differing prop names, and (as a\n * safety net) resolve any leftover role-token value in place so a stray token\n * can never reach a component's arithmetic and produce a NaN→null scene node. */\nexport function adaptProps(\n component: string,\n props: Record<string, unknown> | undefined,\n w: number,\n h: number,\n): Record<string, unknown> {\n const out: Record<string, unknown> = { ...(props ?? {}) }\n const aliases = PROP_ALIASES[component]\n if (aliases) {\n // For each target prop, a px source wins over a role source.\n const pxValue: Record<string, number> = {}\n const roleValue: Record<string, number> = {}\n for (const [src, target] of Object.entries(aliases)) {\n if (!(src in out)) continue\n const v = out[src]\n if (isPxSource(src)) {\n if (typeof v === 'number') pxValue[target] = v\n } else if (typeof v === 'string' && v in SIZE_ROLES) {\n roleValue[target] = roleToPx(v, w, h)\n } else if (typeof v === 'number') {\n roleValue[target] = v // already px under a role-named prop\n }\n if (src !== target) delete out[src] // drop the Studio-only name\n }\n for (const target of new Set([...Object.keys(roleValue), ...Object.keys(pxValue)])) {\n out[target] = pxValue[target] ?? roleValue[target]\n }\n }\n // Generic safety net: any remaining prop whose value is a bare role token.\n for (const k of Object.keys(out)) {\n const v = out[k]\n if (typeof v === 'string' && v in SIZE_ROLES) out[k] = roleToPx(v, w, h)\n }\n return out\n}\n","//! Time/frame math — mirrors Studio's `composition.ts` helpers so scene windows\n//! and audio offsets line up with what actually plays.\n\nimport type { CompositionPayload, Scene, TimeSpec } from './types.js'\n\n/** Parse a TimeSpec to seconds. `fps` is needed for frame specs (`\"90f\"`). */\nexport function timeSpecToSeconds(spec: TimeSpec | undefined, fps: number): number {\n if (spec == null) return 0\n if (typeof spec === 'number') return spec >= 0 ? spec : 0\n const s = spec.trim()\n if (s === '') return 0\n if (s.includes(':')) {\n const [m, sec] = s.split(':')\n return (Number(m) || 0) * 60 + (Number(sec) || 0)\n }\n if (s.endsWith('ms')) return (Number(s.slice(0, -2)) || 0) / 1000\n if (s.endsWith('f')) return (Number(s.slice(0, -1)) || 0) / fps\n if (s.endsWith('s')) return Number(s.slice(0, -1)) || 0\n return Number(s) || 0\n}\n\n/** A TimeSpec in frames. */\nexport function toFrames(spec: TimeSpec | undefined, fps: number): number {\n return Math.round(timeSpecToSeconds(spec, fps) * fps)\n}\n\n/** A scene's duration in seconds: explicit `for`, else derived from the\n * latest-ending entry, else a 3s fallback. */\nexport function sceneDurationSeconds(scene: Scene, fps: number): number {\n if (scene.for != null) return timeSpecToSeconds(scene.for, fps)\n let max = 0\n for (const track of scene.tracks) {\n for (const e of track.entries) {\n const end = timeSpecToSeconds(e.at, fps) + timeSpecToSeconds(e.for, fps)\n if (end > max) max = end\n }\n }\n return max > 0 ? max : 3\n}\n\n/** A scene's duration in frames. */\nexport function sceneDurationFrames(scene: Scene, fps: number): number {\n return Math.max(1, Math.round(sceneDurationSeconds(scene, fps) * fps))\n}\n\nconst DEFAULT_TRANSITION_FRAMES = 15\n\n/** Frames a scene's incoming transition overlaps the previous scene — clamped to\n * ≤ ⅓ of the shorter neighbor. */\nexport function transitionOverlapFrames(\n prev: Scene | undefined,\n scene: Scene,\n fps: number,\n): number {\n if (!prev || !scene.transition) return 0\n const requested = scene.transition.durationInFrames ?? DEFAULT_TRANSITION_FRAMES\n const shorter = Math.min(sceneDurationFrames(prev, fps), sceneDurationFrames(scene, fps))\n return Math.max(1, Math.min(requested, Math.floor(shorter / 3)))\n}\n\n/** A scene's resolved position on the composition timeline, in frames. */\nexport interface ScenePlacement {\n /** Absolute frame the scene starts (the start of its incoming overlap). */\n start: number\n /** Scene duration in frames. */\n durationInFrames: number\n /** Frames the scene's incoming transition overlaps the previous scene\n * (0 for the first scene / no transition). The transition window is\n * `[start, start + overlapIn)` in absolute frames. */\n overlapIn: number\n}\n\n/** Resolve every scene's absolute start + duration — the SAME placement\n * `buildComposition`'s `<TransitionSeries>` computes (a scene starts where the\n * previous one ends MINUS its incoming transition overlap). Shared by the\n * renderer (magic-move planning) and the inspector so the two can't drift. */\nexport function scenePlacements(scenes: Scene[], fps: number): ScenePlacement[] {\n const out: ScenePlacement[] = []\n let offset = 0\n scenes.forEach((scene, i) => {\n const overlapIn = i > 0 ? transitionOverlapFrames(scenes[i - 1], scene, fps) : 0\n offset -= overlapIn\n const durationInFrames = sceneDurationFrames(scene, fps)\n out.push({ start: offset, durationInFrames, overlapIn })\n offset += durationInFrames\n })\n return out\n}\n\n/** The composition's total length in frames (scene durations minus overlaps). */\nexport function totalFrames(payload: CompositionPayload, fps: number): number {\n let total = 0\n let prev: Scene | undefined\n for (const scene of payload.scenes) {\n total -= transitionOverlapFrames(prev, scene, fps)\n total += sceneDurationFrames(scene, fps)\n prev = scene\n }\n return Math.max(1, total)\n}\n","//! Inspector constants — every threshold the checks measure against, with its\n//! source. Research-backed values cite the standard/paper; the rest are marked\n//! PRODUCT DECISION (ours to tune, no external authority).\n\n// ── Contrast (WCAG 2.x SC 1.4.3 — Contrast (Minimum), Level AA) ───────────────\n// https://www.w3.org/WAI/WCAG22/Understanding/contrast-minimum\n// Text needs a contrast ratio ≥ 4.5:1 against what's behind it, except \"large\n// scale\" text which needs ≥ 3:1. Large scale = ≥18pt regular, or ≥14pt bold.\n// At the CSS reference 96dpi, 1pt = 4/3 px → 18pt = 24px, 14pt ≈ 18.67px.\n\n/** Minimum contrast ratio for body-size text (WCAG 2.x SC 1.4.3 AA). */\nexport const CONTRAST_MIN_BODY = 4.5\n/** Minimum contrast ratio for large text (WCAG 2.x SC 1.4.3 AA). */\nexport const CONTRAST_MIN_LARGE = 3\n/** \"Large text\" floor for regular weight: 18pt × (4/3 px/pt) = 24px. */\nexport const LARGE_TEXT_PX = 24\n/** \"Large text\" floor for bold (≥700) weight: 14pt × (4/3 px/pt) ≈ 18.67px. */\nexport const LARGE_TEXT_BOLD_PX = (14 * 4) / 3\n/** Font weight WCAG counts as bold. */\nexport const BOLD_WEIGHT = 700\n\n// ── Reading time ──────────────────────────────────────────────────────────────\n// The spec formula was `max(1.2s, 0.18s × words + 0.6s)` — 0.18 s/word ≈ 333 wpm,\n// FASTER than any research supports, so the per-word constant is adjusted:\n// - BBC Subtitle Guidelines: 160–180 wpm (0.33–0.375 s/word), minimum dwell\n// ~0.3 s/word — https://www.bbc.co.uk/accessibility/forproducts/guides/subtitles\n// (via https://www.clevercast.com/bbc-subtitling-guidelines/)\n// - Brysbaert 2019 meta-analysis (190 studies, n=18,573): adults silently read\n// non-fiction at ~238 wpm ≈ 0.252 s/word — J. Memory & Language 109, 104047.\n// - legibility.info \"Rules for text in videos\": dwell 1s per 13 characters.\n// On-screen graphic titles are short, predictable, and not competing with\n// dialogue (unlike subtitles), so we anchor on the Brysbaert mean rather than\n// the stricter BBC subtitle floor: 0.25 s/word (240 wpm). The 0.6s orientation\n// constant and 1.2s minimum are PRODUCT DECISIONS (the orientation beat covers\n// saccade + entrance animation; BBC's own example floor is 1.2s for 4 words).\n\n/** Seconds of display per word (240 wpm — Brysbaert 2019 silent-reading mean). */\nexport const READ_SECONDS_PER_WORD = 0.25\n/** Fixed orientation beat: find the text + ride out its entrance. PRODUCT DECISION. */\nexport const READ_ORIENTATION_SECONDS = 0.6\n/** Absolute floor for any readable text. PRODUCT DECISION (BBC-consistent). */\nexport const READ_MIN_SECONDS = 1.2\n\n/** Seconds a text of `wordCount` words must stay visible:\n * `max(1.2, 0.25 × words + 0.6)`. */\nexport function readingTimeSeconds(wordCount: number): number {\n return Math.max(READ_MIN_SECONDS, READ_SECONDS_PER_WORD * wordCount + READ_ORIENTATION_SECONDS)\n}\n\n// ── Formats + safe areas ──────────────────────────────────────────────────────\n\n/** The delivery formats the inspector knows safe areas for. */\nexport type FormatId = '16:9' | '9:16' | '1:1' | '4:5'\n\n/** Per-side safe-area inset as a FRACTION of the canvas axis. */\nexport interface SafeAreaPreset {\n top: number\n bottom: number\n left: number\n right: number\n}\n\n// px → fraction helpers against the canonical 1080×1920 social canvas.\nconst v1920 = (px: number): number => px / 1920\nconst h1080 = (px: number): number => px / 1080\n\n/** Safe-area presets per format.\n *\n * - `16:9` — EBU R95 / SMPTE ST 2046-1 GRAPHICS-safe for 16:9 TV: 5% vertical,\n * 10% horizontal (action-safe is 3.5%; graphics/title content uses the\n * stricter band) — https://tech.ebu.ch/publications/r095.\n * - `9:16` — the UNION of the three vertical-social UI overlays at 1080×1920,\n * so one preset clears TikTok + Instagram Reels + YouTube Shorts\n * (per-platform 2025/26 overlay guides — kreatli.com/guides/safe-zone-guide,\n * zeely.ai/blog/tiktok-safe-zones):\n * · TikTok: top ~140px (profile bar), bottom ~324px (caption/sound, ~370px\n * with an ad CTA), right ~164px (like/comment/share rail), left ~60px.\n * · Reels: top ~108–220px, bottom ~320–420px (caption + CTA), right ~120px.\n * · Shorts: top ~180px, bottom ~390px (channel + CTA), right ~120px.\n * Union: top 220 / bottom 420 / left 60 / right 164 px.\n * - `1:1`, `4:5` — feed placements; platforms overlay far less UI in-feed, but\n * Meta crops covers and overlays the caption/CTA strip at the bottom.\n * PRODUCT DECISION informed by the 9:16 research (no platform publishes\n * feed-overlay pixel specs). */\nexport const SAFE_AREAS: Record<FormatId, SafeAreaPreset> = {\n '16:9': { top: 0.05, bottom: 0.05, left: 0.1, right: 0.1 },\n '9:16': { top: v1920(220), bottom: v1920(420), left: h1080(60), right: h1080(164) },\n '1:1': { top: 0.05, bottom: 0.1, left: 0.06, right: 0.06 },\n '4:5': { top: 0.05, bottom: 0.12, left: 0.06, right: 0.06 },\n}\n\n/** Nearest known format for a canvas size (by aspect-ratio distance). */\nexport function inferFormat(width: number, height: number): FormatId {\n const ratio = width / height\n const known: [FormatId, number][] = [\n ['16:9', 16 / 9],\n ['9:16', 9 / 16],\n ['1:1', 1],\n ['4:5', 4 / 5],\n ]\n let best: FormatId = '16:9'\n let bestD = Number.POSITIVE_INFINITY\n for (const [id, r] of known) {\n const d = Math.abs(Math.log(ratio / r)) // log distance — symmetric in ratio space\n if (d < bestD) {\n bestD = d\n best = id\n }\n }\n return best\n}\n\n// ── Font-size floors ─────────────────────────────────────────────────────────\n// legibility.info \"Rules for text in videos\": for full-HD video in full-screen\n// on an average smartphone, body text needs a \"minimum font size of 40 to 60\n// pixels\" (titles ≥50% larger) — https://legibility.info/rules-for-text-in-videos.\n// Vertical/feed formats are phone-first → the 40px floor applies. 16:9 is\n// desktop/TV-first where the frame fills more of the visual field; 28px is a\n// PRODUCT DECISION anchored between WCAG's 24px large-text line and the mobile\n// floor. Floors are defined at a 1080 min-dimension and scale linearly.\n\n/** Minimum body font size in px AT a 1080 min-dimension canvas, per format. */\nexport const FONT_FLOOR_PX: Record<FormatId, number> = {\n '16:9': 28,\n '9:16': 40,\n '1:1': 40,\n '4:5': 40,\n}\n/** The min(width,height) the floors are defined at. */\nexport const FONT_FLOOR_REFERENCE_DIM = 1080\n\n/** The font floor in px for a format on an actual canvas. */\nexport function fontFloorPx(format: FormatId, width: number, height: number): number {\n return (FONT_FLOOR_PX[format] * Math.min(width, height)) / FONT_FLOOR_REFERENCE_DIM\n}\n\n// ── Motion timing ─────────────────────────────────────────────────────────────\n\n/** Two FOCAL entrances beginning within this window compete for one attention\n * slot. Backed by the attentional-blink literature: a second target appearing\n * 200–500ms after a first is frequently missed outright (Raymond, Shapiro &\n * Arnell 1992; review: Dux & Marois 2009, Atten Percept Psychophys 71:1683).\n * 250ms sits inside that window. */\nexport const FOCAL_COLLISION_WINDOW_SECONDS = 0.25\n\n/** Scene-transition duration budget. Material Design caps complex multi-element\n * transitions at 500–700ms and finds >400ms \"too slow\" for simple ones\n * (https://m2.material.io/design/motion/speed.html); film dissolves run longer,\n * so 0.6s — inside Material's complex band — is the PRODUCT DECISION budget. */\nexport const TRANSITION_BUDGET_SECONDS = 0.6\n\n// ── Density budgets (PRODUCT DECISIONS — see Miller-span/working-memory lore,\n// but no citable on-screen standard exists) ───────────────────────────────────\n\n/** Max non-ambient entries visible at once in a scene. */\nexport const DENSITY_MAX_NON_AMBIENT = 5\n/** Max FOCAL entries visible at once (one thing to look at). */\nexport const DENSITY_MAX_FOCAL = 1\n","//! `timing.collisions` — attention can't be in two places at once.\n//!\n//! Three measurements:\n//! 1. Two FOCAL entrances beginning within the 250ms attention window\n//! (attentional blink: a second target 200–500ms after a first is routinely\n//! missed — Raymond, Shapiro & Arnell 1992; see constants.ts).\n//! 2. An entrance whose settle (the `@onda-engine/components` settleTime registry —\n//! the same formulas the components run) outlives the entry's visible\n//! window: the move is cut off mid-flight.\n//! 3. A scene transition longer than the 0.6s budget.\n\nimport { manifestEntry, settleTime } from '@onda-engine/components'\nimport { FOCAL_COLLISION_WINDOW_SECONDS, TRANSITION_BUDGET_SECONDS } from './constants.js'\nimport type { Check, Violation } from './report.js'\n\nconst secs = (frames: number, fps: number): string =>\n `${(Math.round((frames / fps) * 100) / 100).toString()}s`\n\nexport const checkCollisions: Check = (ctx) => {\n const { resolved } = ctx\n const { fps } = resolved\n const violations: Violation[] = []\n\n // 1. Focal entrances within the collision window (absolute frames, so\n // cross-cut overlaps during a transition count too).\n const windowFrames = FOCAL_COLLISION_WINDOW_SECONDS * fps\n const focal = resolved.entries\n .filter((e) => e.role === 'focal' && e.visibleFrames > 0)\n .sort((a, b) => a.absStart - b.absStart)\n for (let i = 1; i < focal.length; i++) {\n const a = focal[i - 1]\n const b = focal[i]\n if (!a || !b) continue\n const gap = b.absStart - a.absStart\n if (gap <= windowFrames) {\n violations.push({\n check: 'timing.collisions',\n severity: 'warn',\n targetId: b.targetId,\n sceneId: b.sceneId,\n message: `focal entrances collide: \"${a.targetId}\" and \"${b.targetId}\" begin ${secs(gap, fps)} apart (≤${FOCAL_COLLISION_WINDOW_SECONDS}s — inside the attention window; stagger them or demote one to 'support')`,\n })\n }\n }\n\n // 2. Entrance settles after the cut.\n for (const entry of resolved.entries) {\n const settle = settleTime(entry.component, entry.adapted, fps)\n if (settle === null || entry.visibleFrames <= 0) continue\n if (settle > entry.visibleFrames) {\n const fitsViaClamp = manifestEntry(entry.component)?.props.some((p) => p.name === 'fitToClip')\n violations.push({\n check: 'timing.collisions',\n severity: 'warn',\n targetId: entry.targetId,\n sceneId: entry.sceneId,\n message: `${entry.component}'s entrance settles at ${secs(settle, fps)} but it is only on screen for ${secs(entry.visibleFrames, fps)} — the move is cut off mid-flight`,\n // Mechanical: the component's own envelope clamp, when it has one.\n fix: fitsViaClamp ? { prop: 'fitToClip', suggested: true } : undefined,\n })\n }\n }\n\n // 3. Transition budget.\n const budgetFrames = Math.round(TRANSITION_BUDGET_SECONDS * fps)\n for (const t of resolved.transitions) {\n if (t.durationInFrames > budgetFrames) {\n violations.push({\n check: 'timing.collisions',\n severity: 'warn',\n targetId: t.sceneId,\n sceneId: t.sceneId,\n message: `\"${t.type}\" transition into \"${t.sceneId}\" runs ${secs(t.durationInFrames, fps)} — over the ${TRANSITION_BUDGET_SECONDS}s budget (both scenes read as mush for the whole overlap)`,\n fix: { prop: 'transition.durationInFrames', suggested: budgetFrames },\n })\n }\n }\n\n return violations\n}\n","//! `density.score` — how much is on screen at once, per scene?\n//!\n//! An event sweep over entry visible windows finds each scene's PEAK count of\n//! concurrently visible non-ambient entries (and focal entries). Budgets:\n//! ≤5 non-ambient, ≤1 focal (see constants.ts — product decisions). The peaks\n//! are always reported on the InspectReport; violations fire over budget.\n\nimport { DENSITY_MAX_FOCAL, DENSITY_MAX_NON_AMBIENT } from './constants.js'\nimport type { Check, SceneDensity, Violation } from './report.js'\nimport type { ResolvedComposition } from './resolve.js'\n\n/** Sweep one scene's entries → its density peaks. */\nfunction sceneDensity(resolved: ResolvedComposition, sceneIndex: number): SceneDensity {\n const sceneId = resolved.scenes[sceneIndex]?.scene.id ?? `scene-${sceneIndex}`\n // Boundary events in scene-local frames: +1 at visible start, -1 at end.\n const events: { frame: number; nonAmbient: number; focal: number }[] = []\n for (const e of resolved.entries) {\n if (e.sceneIndex !== sceneIndex || e.visibleFrames <= 0) continue\n const nonAmbient = e.role === 'ambient' ? 0 : 1\n const focalDelta = e.role === 'focal' ? 1 : 0\n events.push({ frame: e.localStart, nonAmbient, focal: focalDelta })\n events.push({\n frame: e.localStart + e.visibleFrames,\n nonAmbient: -nonAmbient,\n focal: -focalDelta,\n })\n }\n // Ends sort before starts at the same frame (`[start, end)` windows don't touch).\n events.sort((a, b) => a.frame - b.frame || a.nonAmbient - b.nonAmbient)\n let nonAmbient = 0\n let focal = 0\n let peakNonAmbient = 0\n let peakFocal = 0\n let peakFrame = 0\n for (const ev of events) {\n nonAmbient += ev.nonAmbient\n focal += ev.focal\n if (nonAmbient > peakNonAmbient) {\n peakNonAmbient = nonAmbient\n peakFrame = ev.frame\n }\n if (focal > peakFocal) peakFocal = focal\n }\n return { sceneId, peakNonAmbient, peakFocal, peakFrame }\n}\n\n/** All scenes' density metrics (the report carries these regardless of budget). */\nexport function densityMetrics(resolved: ResolvedComposition): SceneDensity[] {\n return resolved.scenes.map((_, i) => sceneDensity(resolved, i))\n}\n\nexport const checkDensity: Check = (ctx) => {\n const violations: Violation[] = []\n for (const d of densityMetrics(ctx.resolved)) {\n if (d.peakNonAmbient > DENSITY_MAX_NON_AMBIENT) {\n violations.push({\n check: 'density.score',\n severity: 'warn',\n targetId: d.sceneId,\n sceneId: d.sceneId,\n message: `scene \"${d.sceneId}\" peaks at ${d.peakNonAmbient} concurrently visible non-ambient entries (frame ${d.peakFrame}, scene-local) — budget is ${DENSITY_MAX_NON_AMBIENT}; cut, stagger, or mark atmosphere 'ambient'`,\n })\n }\n if (d.peakFocal > DENSITY_MAX_FOCAL) {\n violations.push({\n check: 'density.score',\n severity: 'warn',\n targetId: d.sceneId,\n sceneId: d.sceneId,\n message: `scene \"${d.sceneId}\" shows ${d.peakFocal} focal entries at once — only ${DENSITY_MAX_FOCAL} thing can be THE thing; demote the rest to 'support'`,\n })\n }\n }\n return violations\n}\n","//! `frames.transitionCapture` — don't thumbnail a frame that's mid-transition.\n//!\n//! Given `opts.frames` (the indices a consumer intends to capture), flag any\n//! that land inside a transition's overlap window — those frames show two\n//! scenes blended. The fix is mechanical: the nearest frame outside the window.\n\nimport type { Check, Violation } from './report.js'\n\nexport const checkTransitionCapture: Check = (ctx) => {\n const frames = ctx.opts.frames\n if (!frames || frames.length === 0) return []\n const { resolved } = ctx\n const violations: Violation[] = []\n\n for (const f of frames) {\n const hit = resolved.transitions.find((t) => f >= t.start && f < t.start + t.durationInFrames)\n if (!hit) continue\n // Nearest frame outside the window, clamped to the composition.\n const before = hit.start - 1\n const after = hit.start + hit.durationInFrames\n const candidates = [before, after].filter((c) => c >= 0 && c < resolved.totalFrames)\n const suggested =\n candidates.length > 0\n ? candidates.reduce((best, c) => (Math.abs(c - f) < Math.abs(best - f) ? c : best))\n : f\n violations.push({\n check: 'frames.transitionCapture',\n severity: 'warn',\n targetId: hit.sceneId,\n sceneId: hit.sceneId,\n message: `frame ${f} lands inside the \"${hit.type}\" transition into \"${hit.sceneId}\" (frames ${hit.start}–${hit.start + hit.durationInFrames - 1}) — it captures two scenes blended`,\n fix: { prop: 'frames', suggested },\n })\n }\n return violations\n}\n","//! WCAG color math — hex parsing, relative luminance, contrast ratio.\n//!\n//! Formulas from WCAG 2.x: relative luminance per\n//! https://www.w3.org/WAI/GL/wiki/Relative_luminance (sRGB linearization), and\n//! contrast ratio `(L1 + 0.05) / (L2 + 0.05)` per\n//! https://www.w3.org/WAI/WCAG22/Understanding/contrast-minimum (SC 1.4.3).\n//! Engine colors are hex (`#rgb`, `#rrggbb`, `#rrggbbaa`) — anything else is\n//! \"unparseable\" and the caller treats the contrast as unverifiable.\n\n/** An sRGB color, channels 0..1. */\nexport interface Rgb {\n r: number\n g: number\n b: number\n /** Alpha 0..1 (1 when the hex had no alpha channel). */\n a: number\n}\n\n/** Parse `#rgb` / `#rrggbb` / `#rrggbbaa` (case-insensitive). Null otherwise. */\nexport function parseColor(value: unknown): Rgb | null {\n if (typeof value !== 'string') return null\n const s = value.trim()\n if (!s.startsWith('#')) return null\n const hex = s.slice(1)\n if (!/^[0-9a-fA-F]+$/.test(hex)) return null\n if (hex.length === 3) {\n const [r, g, b] = hex\n return {\n r: Number.parseInt(`${r}${r}`, 16) / 255,\n g: Number.parseInt(`${g}${g}`, 16) / 255,\n b: Number.parseInt(`${b}${b}`, 16) / 255,\n a: 1,\n }\n }\n if (hex.length === 6 || hex.length === 8) {\n return {\n r: Number.parseInt(hex.slice(0, 2), 16) / 255,\n g: Number.parseInt(hex.slice(2, 4), 16) / 255,\n b: Number.parseInt(hex.slice(4, 6), 16) / 255,\n a: hex.length === 8 ? Number.parseInt(hex.slice(6, 8), 16) / 255 : 1,\n }\n }\n return null\n}\n\n// sRGB channel → linear-light (the WCAG piecewise curve).\nconst linearize = (c: number): number => (c <= 0.04045 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4)\n\n/** WCAG relative luminance of an sRGB color (0 = black, 1 = white). */\nexport function relativeLuminance(c: Rgb): number {\n return 0.2126 * linearize(c.r) + 0.7152 * linearize(c.g) + 0.0722 * linearize(c.b)\n}\n\n/** WCAG contrast ratio between two colors — 1:1 (identical) to 21:1 (B/W). */\nexport function contrastRatio(a: Rgb, b: Rgb): number {\n const la = relativeLuminance(a)\n const lb = relativeLuminance(b)\n const [hi, lo] = la >= lb ? [la, lb] : [lb, la]\n return (hi + 0.05) / (lo + 0.05)\n}\n","//! Resolve a composition payload to the FRAME timeline the checks measure on —\n//! the same resolution `buildComposition` performs (shared `scenePlacements` +\n//! `toFrames` + `adaptProps`), minus the React tree. Every entry gets absolute\n//! start/visible frames, its effective (size-role-resolved) props, and its\n//! attention role.\n\nimport { adaptProps } from '../props.js'\nimport { scenePlacements, toFrames, totalFrames } from '../timing.js'\nimport type { CompositionPayload, Entry, EntryRole, LayerEntry, Scene } from '../types.js'\n\n/** A scene with its absolute timeline placement (frames). */\nexport interface ResolvedScene {\n scene: Scene\n index: number\n /** Absolute start frame (= the start of its incoming transition overlap). */\n start: number\n durationInFrames: number\n}\n\n/** One entry resolved onto the absolute timeline. */\nexport interface ResolvedEntry {\n /** `'scene'` = a track entry; `'layer'` = a composition-level layer entry. */\n kind: 'scene' | 'layer'\n component: string\n /** Raw payload props. */\n props: Record<string, unknown>\n /** Effective props after the Studio→engine translation (size roles → px,\n * prop-name aliases) — what the component actually receives. */\n adapted: Record<string, unknown>\n /** Attention role; absent = `'support'` (the contract on `Entry.role`). */\n role: EntryRole\n /** `entry.id` when present, else the payload path (stable + addressable). */\n targetId: string\n /** Payload path (`scenes[0].tracks[1].entries[2]`). */\n path: string\n sceneId?: string\n sceneIndex?: number\n trackIndex?: number\n entryIndex?: number\n /** Start frame: scene-local for scene entries, absolute for layer entries. */\n localStart: number\n /** Absolute start frame on the composition timeline. */\n absStart: number\n /** Requested duration in frames. */\n durationInFrames: number\n /** Frames actually on screen: duration clamped to the scene window (scene\n * entries) / composition end (layer entries). */\n visibleFrames: number\n /** Layer entries only: `true` = renders UNDER the scene spine (a background). */\n under?: boolean\n raw: Entry | LayerEntry\n}\n\n/** A transition's absolute capture window. */\nexport interface TransitionWindow {\n /** Index of the scene the transition leads INTO. */\n sceneIndex: number\n sceneId: string\n type: string\n /** Absolute first frame of the overlap. */\n start: number\n /** Effective overlap length in frames (after the ⅓-of-shorter-scene clamp). */\n durationInFrames: number\n}\n\n/** The payload resolved to frames — everything the checks consume. */\nexport interface ResolvedComposition {\n payload: CompositionPayload\n fps: number\n width: number\n height: number\n totalFrames: number\n scenes: ResolvedScene[]\n /** Scene (track) entries. */\n entries: ResolvedEntry[]\n /** Composition-level layer entries (absolute-timed). */\n layerEntries: ResolvedEntry[]\n transitions: TransitionWindow[]\n}\n\n/** Resolve `payload` the way `buildComposition` does (same helpers), producing\n * the measurable timeline model. Assumes a structurally valid payload — run\n * `validateComposition` first for structural diagnostics. */\nexport function resolveComposition(payload: CompositionPayload): ResolvedComposition {\n const fps = payload.fps > 0 ? payload.fps : 30\n const { width, height } = payload\n const scenesIn = payload.scenes ?? []\n const placements = scenePlacements(scenesIn, fps)\n const total = totalFrames(payload, fps)\n\n const scenes: ResolvedScene[] = scenesIn.map((scene, index) => ({\n scene,\n index,\n start: placements[index]?.start ?? 0,\n durationInFrames: placements[index]?.durationInFrames ?? 1,\n }))\n\n const transitions: TransitionWindow[] = []\n scenesIn.forEach((scene, i) => {\n const overlap = placements[i]?.overlapIn ?? 0\n if (i > 0 && scene.transition && overlap > 0) {\n transitions.push({\n sceneIndex: i,\n sceneId: scene.id,\n type: scene.transition.type,\n start: placements[i]?.start ?? 0,\n durationInFrames: overlap,\n })\n }\n })\n\n const entries: ResolvedEntry[] = []\n for (const { scene, index: si, start: sceneStart, durationInFrames: sceneDur } of scenes) {\n scene.tracks?.forEach((track, ti) => {\n track.entries.forEach((entry, ei) => {\n const path = `scenes[${si}].tracks[${ti}].entries[${ei}]`\n const localStart = toFrames(entry.at, fps)\n const dur = toFrames(entry.for, fps)\n const visibleEnd = Math.min(localStart + dur, sceneDur)\n entries.push({\n kind: 'scene',\n component: entry.component,\n props: entry.props ?? {},\n adapted: adaptProps(entry.component, entry.props, width, height),\n role: entry.role ?? 'support',\n targetId: entry.id ?? path,\n path,\n sceneId: scene.id,\n sceneIndex: si,\n trackIndex: ti,\n entryIndex: ei,\n localStart,\n absStart: sceneStart + localStart,\n durationInFrames: dur,\n visibleFrames: Math.max(0, visibleEnd - localStart),\n raw: entry,\n })\n })\n })\n }\n\n const layerEntries: ResolvedEntry[] = []\n payload.layers?.forEach((layer, li) => {\n layer.entries.forEach((entry, ei) => {\n const path = `layers[${li}].entries[${ei}]`\n const from = toFrames(entry.at ?? 0, fps)\n const dur = entry.for != null ? toFrames(entry.for, fps) : Math.max(1, total - from)\n layerEntries.push({\n kind: 'layer',\n component: entry.component,\n props: entry.props ?? {},\n adapted: adaptProps(entry.component, entry.props, width, height),\n role: 'support',\n targetId: entry.id ?? path,\n path,\n localStart: from,\n absStart: from,\n durationInFrames: dur,\n visibleFrames: Math.max(0, Math.min(from + dur, total) - from),\n under: Boolean(layer.under),\n raw: entry,\n })\n })\n })\n\n return {\n payload,\n fps,\n width,\n height,\n totalFrames: total,\n scenes,\n entries,\n layerEntries,\n transitions,\n }\n}\n\n/** Do two absolute frame windows `[aStart, aStart+aLen)` / `[bStart, bStart+bLen)`\n * overlap? */\nexport function windowsOverlap(\n aStart: number,\n aLen: number,\n bStart: number,\n bLen: number,\n): boolean {\n return aStart < bStart + bLen && bStart < aStart + aLen\n}\n","//! Text extraction — what does this entry SAY, at what size, in what color?\n//!\n//! Driven by the `@onda-engine/components` manifest (per-prop semantic roles), so the\n//! inspector knows each component's text props + defaults without hardcoding\n//! eighty dialects. A `TextBlock` is one string a viewer reads: content +\n//! resolved px font size + resolved color + the measurement options needed to\n//! reproduce the component's own metrics.\n\nimport { type ManifestEntry, type PropMeta, manifestEntry } from '@onda-engine/components'\nimport type { ResolvedEntry } from './resolve.js'\n\n/** Brand-resolved theme colors the blocks fall back to. */\nexport interface InspectTheme {\n text: string\n textMuted: string\n background: string\n}\n\n/** One readable string on an entry. */\nexport interface TextBlock {\n /** The prop carrying the string (`title`, `text`, …). */\n textProp: string\n content: string\n /** Resolved px font size (explicit > manifest default > 48). */\n fontSize: number\n /** The prop that carries the size — the mechanical `fix` target. */\n sizeProp?: string\n /** Resolved color string, when determinable. */\n color?: string\n /** True when the color came from an explicit prop (vs a theme fallback). */\n colorExplicit: boolean\n fontWeight: number\n fontFamily?: string\n letterSpacing?: number\n /** The component's own auto-fit contract, when it has one. */\n fit?: 'none' | 'frame'\n maxWidth?: number\n}\n\n/** Parse a PropMeta `default` literal (TS source text) to a JS value. */\nexport function parseDefault(literal: string | undefined): unknown {\n if (literal === undefined) return undefined\n const s = literal.trim()\n if (s === 'true') return true\n if (s === 'false') return false\n const n = Number(s)\n if (s !== '' && Number.isFinite(n)) return n\n if (\n (s.startsWith(\"'\") && s.endsWith(\"'\")) ||\n (s.startsWith('\"') && s.endsWith('\"')) ||\n (s.startsWith('`') && s.endsWith('`'))\n )\n return s.slice(1, -1)\n return undefined\n}\n\nconst wordsOf = (s: string): number => s.split(/\\s+/).filter(Boolean).length\n\n/** Total word count across an entry's text blocks. */\nexport function totalWords(blocks: TextBlock[]): number {\n return blocks.reduce((sum, b) => sum + wordsOf(b.content), 0)\n}\n\n// CSS letter-spacing → px ('-0.02em' scales by fontSize; '2px'/number pass).\nfunction letterSpacingPx(value: unknown, fontSize: number): number | undefined {\n if (typeof value === 'number') return value\n if (typeof value !== 'string') return undefined\n const n = Number.parseFloat(value.trim())\n if (!Number.isFinite(n)) return undefined\n return value.trim().endsWith('em') ? n * fontSize : n\n}\n\nfunction propValue(entry: ResolvedEntry, meta: PropMeta | undefined, name: string): unknown {\n const explicit = entry.adapted[name]\n if (explicit !== undefined) return explicit\n return parseDefault(meta?.default)\n}\n\n/** Components whose primary text WRAPS to multiple lines (their `maxWidth` is a\n * canvas fraction, not a px cap) — excluded from single-line overflow math. */\nexport const WRAPPING_COMPONENTS = new Set(['Captions'])\n\n/** `text`-role props that are NOT rendered prose: `charset` is the glyph POOL\n * a reel spins through (SlotMachineRoll / MatrixDecode), never laid out as a\n * line — measuring or \"reading\" it is a false positive. */\nconst NON_READABLE_TEXT_PROPS = new Set(['charset'])\n\n/** The size prop paired with a text prop: `titleSize` for `title`, else the\n * manifest's single `fontSize`-role prop, else none. */\nfunction sizePropFor(m: ManifestEntry, textProp: string): PropMeta | undefined {\n const sizeProps = m.props.filter((p) => p.role === 'fontSize')\n const prefixed = sizeProps.find(\n (p) => p.name === `${textProp}Size` || p.name === `${textProp}FontSize`,\n )\n if (prefixed) return prefixed\n if (textProp === 'text' || sizeProps.length === 1)\n return sizeProps.find((p) => p.name === 'fontSize') ?? sizeProps[0]\n return undefined\n}\n\n/** The color prop paired with a text prop: `titleColor` for `title`, else the\n * bare `color` prop for the primary `text`. */\nfunction colorPropFor(m: ManifestEntry, textProp: string): PropMeta | undefined {\n const colorProps = m.props.filter((p) => p.role === 'color')\n return (\n colorProps.find((p) => p.name === `${textProp}Color`) ??\n (textProp === 'text' || colorProps.length === 1\n ? colorProps.find((p) => p.name === 'color')\n : undefined)\n )\n}\n\n// A themed color prop whose doc names the muted token falls back to textMuted.\nconst MUTED_HINT = /textmuted|muted|dim\\b/i\n\n/** Extract the readable text blocks of an entry, with sizes/colors resolved\n * (explicit props win; manifest defaults and theme tokens fill the gaps).\n * Empty for unknown components or entries with no string text props. */\nexport function textBlocks(entry: ResolvedEntry, theme: InspectTheme): TextBlock[] {\n const m = manifestEntry(entry.component)\n if (!m) return []\n const blocks: TextBlock[] = []\n for (const p of m.props) {\n if (p.role !== 'text' || NON_READABLE_TEXT_PROPS.has(p.name)) continue\n const value = propValue(entry, p, p.name)\n if (typeof value !== 'string' || value.trim() === '') continue\n\n const sizeMeta = sizePropFor(m, p.name)\n const sizeValue = sizeMeta ? propValue(entry, sizeMeta, sizeMeta.name) : undefined\n const fontSize = typeof sizeValue === 'number' && sizeValue > 0 ? sizeValue : 48\n\n const colorMeta = colorPropFor(m, p.name)\n const explicitColor = colorMeta ? entry.adapted[colorMeta.name] : undefined\n let color: string | undefined\n let colorExplicit = false\n if (typeof explicitColor === 'string') {\n color = explicitColor\n colorExplicit = true\n } else if (colorMeta?.themeable) {\n color = MUTED_HINT.test(colorMeta.description) ? theme.textMuted : theme.text\n } else {\n color = theme.text\n }\n\n const weightMeta = m.props.find((q) => q.name === 'fontWeight')\n const weightValue = weightMeta ? propValue(entry, weightMeta, 'fontWeight') : undefined\n const familyValue = entry.adapted.fontFamily\n\n const fitValue = entry.adapted.fit\n const maxWidthValue = entry.adapted.maxWidth\n\n blocks.push({\n textProp: p.name,\n content: value,\n fontSize,\n sizeProp: sizeMeta?.name,\n color,\n colorExplicit,\n fontWeight: typeof weightValue === 'number' ? weightValue : 400,\n fontFamily: typeof familyValue === 'string' ? familyValue : undefined,\n letterSpacing: letterSpacingPx(entry.adapted.letterSpacing, fontSize),\n fit: fitValue === 'frame' || fitValue === 'none' ? fitValue : undefined,\n maxWidth: typeof maxWidthValue === 'number' ? maxWidthValue : undefined,\n })\n }\n return blocks\n}\n","//! `text.legibility` — is every readable string big enough and contrasty enough?\n//!\n//! Two measurements per text block:\n//! 1. Font size vs the per-format research floor (legibility.info: 40px body\n//! minimum for full-HD phone-first formats — see constants.ts).\n//! 2. WCAG 2.x contrast of the text color vs what's BEHIND its placement box,\n//! found by walking the z-order beneath the entry: solid fills and gradient\n//! stops are checked analytically (worst stop wins, translucent veils are\n//! alpha-composited); an image/video behind yields an `info` — contrast is\n//! unverifiable analytically.\n\nimport { manifestEntry } from '@onda-engine/components'\nimport type { Brand } from '../types.js'\nimport { type Rgb, contrastRatio, parseColor } from './color.js'\nimport {\n BOLD_WEIGHT,\n CONTRAST_MIN_BODY,\n CONTRAST_MIN_LARGE,\n LARGE_TEXT_BOLD_PX,\n LARGE_TEXT_PX,\n fontFloorPx,\n} from './constants.js'\nimport type { Check, Violation } from './report.js'\nimport type { ResolvedComposition, ResolvedEntry } from './resolve.js'\nimport { windowsOverlap } from './resolve.js'\nimport { parseDefault, textBlocks } from './text.js'\n\n/** Components that cover the whole frame for backdrop purposes. The manifest's\n * `occlusion`/`sceneRole` carry the signal; Scrim is metadata'd\n * `non_occluding` (it doesn't COMPETE for attention) but is literally a\n * full-frame veil, so it's force-included. */\nfunction isCovering(component: string): boolean {\n if (component === 'Scrim') return true\n const m = manifestEntry(component)\n return m?.occlusion === 'full_frame' || m?.sceneRole === 'background'\n}\n\n/** Does the entry place image/video pixels on screen? (Manifest `url`-role\n * prop or the Media category.) */\nfunction isMediaBearing(entry: ResolvedEntry): boolean {\n const m = manifestEntry(entry.component)\n if (!m) return false\n if (m.category === 'Media') return true\n return m.props.some(\n (p) => p.role === 'url' && (p.required || entry.adapted[p.name] !== undefined),\n )\n}\n\n/** The candidate fill colors of a covering entry: every `color`-role prop's\n * explicit value or manifest default (string or string[]). */\nfunction fillColors(entry: ResolvedEntry): Rgb[] {\n const m = manifestEntry(entry.component)\n if (!m) return []\n const out: Rgb[] = []\n for (const p of m.props) {\n if (p.role !== 'color') continue\n const value = entry.adapted[p.name] ?? parseDefault(p.default)\n const candidates = Array.isArray(value) ? value : [value]\n for (const c of candidates) {\n const parsed = parseColor(c)\n if (parsed) out.push(parsed)\n }\n }\n // Scrim's documented default is a white veil (schema carries no literal).\n if (out.length === 0 && entry.component === 'Scrim') {\n const white = parseColor('#ffffff')\n if (white) out.push(white)\n }\n return out\n}\n\n/** A covering entry's overall coverage opacity (its `opacity` prop, default 1). */\nfunction coverOpacity(entry: ResolvedEntry): number {\n const m = manifestEntry(entry.component)\n const meta = m?.props.find((p) => p.name === 'opacity')\n const v = entry.adapted.opacity ?? parseDefault(meta?.default)\n return typeof v === 'number' && v >= 0 && v <= 1 ? v : 1\n}\n\n/** Alpha-composite `top` (with extra `alpha`) over `under`. */\nfunction over(top: Rgb, alpha: number, under: Rgb): Rgb {\n const a = Math.max(0, Math.min(1, alpha * top.a))\n return {\n r: top.r * a + under.r * (1 - a),\n g: top.g * a + under.g * (1 - a),\n b: top.b * a + under.b * (1 - a),\n a: 1,\n }\n}\n\n/** What's behind `target` over its visible window: solid color(s), media, or\n * unknown. Walks the z-order beneath it (same-scene lower tracks / earlier\n * same-track entries, then `under` layers, then the composition background),\n * top-down, compositing translucent veils. */\nexport function backdropFor(\n target: ResolvedEntry,\n resolved: ResolvedComposition,\n): { kind: 'colors'; colors: Rgb[] } | { kind: 'media' } | { kind: 'unknown' } {\n // Beneath-the-target candidates, BOTTOM-up in z.\n const beneath: ResolvedEntry[] = []\n const overlapsTarget = (e: ResolvedEntry): boolean =>\n windowsOverlap(e.absStart, e.visibleFrames, target.absStart, target.visibleFrames)\n for (const e of resolved.layerEntries) {\n if (e.under && overlapsTarget(e)) beneath.push(e)\n }\n if (target.kind === 'scene') {\n for (const e of resolved.entries) {\n if (e.sceneIndex !== target.sceneIndex || !overlapsTarget(e)) continue\n const ti = e.trackIndex ?? 0\n const ei = e.entryIndex ?? 0\n const tTi = target.trackIndex ?? 0\n const tEi = target.entryIndex ?? 0\n if (ti < tTi || (ti === tTi && ei < tEi)) beneath.push(e)\n }\n } else {\n // An overlay layer rides above every scene entry.\n for (const e of resolved.entries) if (overlapsTarget(e)) beneath.push(e)\n }\n\n // Walk TOP-down; collect translucent veils until an opaque backdrop.\n const veils: { colors: Rgb[]; alpha: number }[] = []\n for (let i = beneath.length - 1; i >= 0; i--) {\n const e = beneath[i]\n if (!e || !isCovering(e.component)) continue\n if (isMediaBearing(e)) return { kind: 'media' }\n const colors = fillColors(e)\n if (colors.length === 0) return { kind: 'unknown' }\n const alpha = coverOpacity(e)\n const opaque = alpha >= 0.95 && colors.every((c) => c.a >= 0.95)\n if (opaque) return { kind: 'colors', colors: composite(colors, veils) }\n veils.push({ colors, alpha })\n }\n const bg = parseColor(resolveBackground(resolved.payload.brand))\n if (!bg) return { kind: 'unknown' }\n return { kind: 'colors', colors: composite([bg], veils) }\n}\n\n/** The composition's base background — `brand.bg` else the renderer's literal. */\nexport function resolveBackground(brand: Brand | undefined): string {\n return brand?.bg ?? '#08080a'\n}\n\n// Composite the recorded veils (top-down order) over each base color.\nfunction composite(base: Rgb[], veils: { colors: Rgb[]; alpha: number }[]): Rgb[] {\n let result = base\n for (let i = veils.length - 1; i >= 0; i--) {\n const veil = veils[i]\n if (!veil) continue\n const next: Rgb[] = []\n for (const under of result)\n for (const top of veil.colors) next.push(over(top, veil.alpha, under))\n result = next\n }\n return result\n}\n\n/** WCAG threshold for a text block: 3:1 for large text (≥24px regular /\n * ≥18.67px bold), 4.5:1 otherwise. */\nexport function requiredContrast(fontSize: number, fontWeight: number): number {\n const large =\n fontSize >= LARGE_TEXT_PX || (fontWeight >= BOLD_WEIGHT && fontSize >= LARGE_TEXT_BOLD_PX)\n return large ? CONTRAST_MIN_LARGE : CONTRAST_MIN_BODY\n}\n\nconst fmt = (n: number): string => (Math.round(n * 100) / 100).toString()\n\nexport const checkLegibility: Check = (ctx) => {\n const { resolved, theme, format } = ctx\n const floor = fontFloorPx(format, resolved.width, resolved.height)\n const violations: Violation[] = []\n\n for (const entry of [...resolved.entries, ...resolved.layerEntries]) {\n const blocks = textBlocks(entry, theme)\n if (blocks.length === 0) continue\n\n // 1. Font floor.\n for (const b of blocks) {\n if (b.fontSize < floor) {\n violations.push({\n check: 'text.legibility',\n severity: 'warn',\n targetId: entry.targetId,\n sceneId: entry.sceneId,\n message: `${entry.component} \"${b.textProp}\" is ${fmt(b.fontSize)}px — below the ${fmt(floor)}px ${format} floor (body text on a phone-scale canvas needs ≥${fmt(floor)}px; legibility.info video-text rules)`,\n fix: { prop: b.sizeProp ?? 'fontSize', suggested: Math.ceil(floor) },\n })\n }\n }\n\n // 2. Contrast vs the backdrop.\n const backdrop = backdropFor(entry, resolved)\n if (backdrop.kind === 'media') {\n violations.push({\n check: 'text.legibility',\n severity: 'info',\n targetId: entry.targetId,\n sceneId: entry.sceneId,\n message: `${entry.component} sits over image/video — contrast unverifiable analytically (verify on a rendered frame, or put a Scrim behind it)`,\n })\n continue\n }\n if (backdrop.kind === 'unknown') {\n violations.push({\n check: 'text.legibility',\n severity: 'info',\n targetId: entry.targetId,\n sceneId: entry.sceneId,\n message: `${entry.component}'s backdrop color can't be resolved analytically — contrast unverified`,\n })\n continue\n }\n for (const b of blocks) {\n const textColor = parseColor(b.color)\n if (!textColor) continue\n const required = requiredContrast(b.fontSize, b.fontWeight)\n let worst = Number.POSITIVE_INFINITY\n for (const c of backdrop.colors) worst = Math.min(worst, contrastRatio(textColor, c))\n if (worst < required) {\n violations.push({\n check: 'text.legibility',\n severity: 'error',\n targetId: entry.targetId,\n sceneId: entry.sceneId,\n message: `${entry.component} \"${b.textProp}\" contrast is ${fmt(worst)}:1 against its backdrop — below the WCAG ${fmt(required)}:1 minimum for ${fmt(b.fontSize)}px text (SC 1.4.3)`,\n })\n }\n }\n }\n return violations\n}\n","//! `layout.overflow` — does measured text stay inside the frame and the\n//! format's safe area?\n//!\n//! Width comes from the engine's own text metrics (`measureText`, cosmic-text\n//! via wasm — warm it with `preloadTextMetrics()` in Node for real numbers; the\n//! glyph-count estimate is the documented fallback). Placement resolves through\n//! the shared `resolvePlacement` contract with the measured element size, so\n//! the checked box is where the component actually sits. Entries whose own\n//! `fit`/`maxWidth` auto-fit caps the line are measured at the FITTED size.\n\nimport {\n type Placement,\n fitFontSize,\n fitMaxWidth,\n isPlacement,\n measureText,\n resolvePlacement,\n} from '@onda-engine/components'\nimport type { Check, Violation } from './report.js'\nimport { WRAPPING_COMPONENTS, textBlocks } from './text.js'\n\nexport const checkOverflow: Check = (ctx) => {\n const { resolved, safe, theme, format } = ctx\n const { width, height } = resolved\n const safeRect = {\n left: safe.left * width,\n top: safe.top * height,\n right: width - safe.right * width,\n bottom: height - safe.bottom * height,\n }\n const violations: Violation[] = []\n\n for (const entry of [...resolved.entries, ...resolved.layerEntries]) {\n if (WRAPPING_COMPONENTS.has(entry.component)) continue // wraps, never one long line\n const blocks = textBlocks(entry, theme)\n for (const b of blocks) {\n if (b.content.includes('\\n')) continue // multi-line content stacks, not one line\n const measureOpts = {\n fontFamily: b.fontFamily,\n fontWeight: b.fontWeight,\n letterSpacing: b.letterSpacing,\n }\n // Honor the component's own auto-fit: measure at the size it would land on.\n const cap = fitMaxWidth({ fit: b.fit, maxWidth: b.maxWidth }, width)\n const size =\n cap !== undefined ? fitFontSize(b.content, b.fontSize, cap, measureOpts) : b.fontSize\n const m = measureText(b.content, size, measureOpts)\n if (m.width <= 0) continue\n\n const placement = entry.adapted.placement\n const box = resolvePlacement(\n isPlacement(placement) ? (placement as Placement) : undefined,\n { width, height },\n { width: m.width, height: m.height },\n )\n const x0 = box.originX\n const y0 = box.originY\n const x1 = x0 + m.width\n const y1 = y0 + m.height\n\n const escapesFrame = x0 < 0 || y0 < 0 || x1 > width || y1 > height\n const escapesSafe =\n x0 < safeRect.left || y0 < safeRect.top || x1 > safeRect.right || y1 > safeRect.bottom\n if (!escapesFrame && !escapesSafe) continue\n\n // Mechanical fix: the largest size at which the box sits inside the safe\n // rect AT ITS PLACEMENT — found by reusing the SAME resolve+measure\n // predicate as the check above, not a flat width fit. (Fitting to the raw\n // safe-area WIDTH is wrong for a CENTERED element under ASYMMETRIC safe\n // margins — e.g. 9:16, whose right/bottom band is wider: a centered box\n // bumps the nearer edge first, so a width-only fit still overflows and the\n // agent shrink-loops. Reusing the box-in-rect predicate converges by\n // construction.)\n const boxFitsSafe = (fs: number): boolean => {\n const fm = measureText(b.content, fs, measureOpts)\n const fb = resolvePlacement(\n isPlacement(placement) ? (placement as Placement) : undefined,\n { width, height },\n { width: fm.width, height: fm.height },\n )\n return (\n fb.originX >= safeRect.left &&\n fb.originY >= safeRect.top &&\n fb.originX + fm.width <= safeRect.right &&\n fb.originY + fm.height <= safeRect.bottom\n )\n }\n let lo = 1\n let hi = Math.floor(size)\n let fitted = 0\n while (lo <= hi) {\n const mid = (lo + hi) >> 1\n if (boxFitsSafe(mid)) {\n fitted = mid\n lo = mid + 1\n } else {\n hi = mid - 1\n }\n }\n const fix =\n b.sizeProp && fitted > 0 && fitted < size\n ? { prop: b.sizeProp, suggested: fitted }\n : undefined\n\n violations.push({\n check: 'layout.overflow',\n severity: escapesFrame ? 'error' : 'warn',\n targetId: entry.targetId,\n sceneId: entry.sceneId,\n message: escapesFrame\n ? `${entry.component} \"${b.textProp}\" measures ${Math.round(m.width)}px wide at ${Math.round(size)}px — it escapes the ${width}×${height} frame`\n : `${entry.component} \"${b.textProp}\" measures ${Math.round(m.width)}px wide at ${Math.round(size)}px — outside the ${format} safe area (platform UI / title-safe band)`,\n fix,\n })\n }\n }\n return violations\n}\n","//! `timing.readingTime` — does every text stay up long enough to be read?\n//!\n//! Needed time = `max(1.2s, 0.25s × words + 0.6s)` — see constants.ts for the\n//! research trail (BBC subtitle guidelines, Brysbaert 2019). Measured against\n//! the entry's VISIBLE window (its duration clamped to the scene cut).\n\nimport { readingTimeSeconds } from './constants.js'\nimport type { Check, Violation } from './report.js'\nimport { textBlocks, totalWords } from './text.js'\n\nexport const checkReadingTime: Check = (ctx) => {\n const { resolved, theme } = ctx\n const violations: Violation[] = []\n for (const entry of [...resolved.entries, ...resolved.layerEntries]) {\n if (entry.role === 'ambient') continue // decoration isn't read\n const words = totalWords(textBlocks(entry, theme))\n if (words === 0) continue\n const needed = readingTimeSeconds(words)\n const visible = entry.visibleFrames / resolved.fps\n if (visible >= needed) continue\n const suggested = Math.ceil(needed * 10) / 10\n violations.push({\n check: 'timing.readingTime',\n severity: 'warn',\n targetId: entry.targetId,\n sceneId: entry.sceneId,\n message: `${entry.component} shows ${words} word${words === 1 ? '' : 's'} for ${(Math.round(visible * 100) / 100).toString()}s — ${suggested}s needed to read it (0.25s/word + 0.6s orientation, ≥1.2s)`,\n fix: { prop: 'for', suggested: `${suggested}s` },\n })\n }\n return violations\n}\n","//! The INSPECTOR — deterministic quality metrics over a composition payload.\n//!\n//! `inspect(payload, opts?)` measures the SAME document `validateComposition`\n//! checks and `buildComposition` renders, resolved to frames with the same\n//! helpers, and returns structured violations: legibility (font floors + WCAG\n//! contrast), layout overflow vs per-platform safe areas, reading time, focal\n//! entrance/settle/transition collisions, per-scene density, and\n//! transition-window thumbnail capture. Every threshold lives in\n//! `constants.ts` with its source.\n//!\n//! Where `validateComposition` answers \"will this render?\", `inspect` answers\n//! \"will this read?\" — both deterministic, both agent-correctable.\n//!\n//! Text widths use the engine's cosmic-text metrics; call\n//! `preloadTextMetrics()` (from `@onda-engine/components`) before inspecting in Node\n//! for shaped widths instead of the glyph-count estimate.\n\nimport { defaultTheme } from '@onda-engine/components'\nimport type { CompositionPayload } from '../types.js'\nimport { checkCollisions } from './collisions.js'\nimport { SAFE_AREAS, inferFormat } from './constants.js'\nimport { checkDensity, densityMetrics } from './density.js'\nimport { checkTransitionCapture } from './frames.js'\nimport { checkLegibility } from './legibility.js'\nimport { checkOverflow } from './overflow.js'\nimport { checkReadingTime } from './reading.js'\nimport type {\n Check,\n CheckContext,\n CheckId,\n InspectOptions,\n InspectReport,\n SceneDensity,\n Violation,\n} from './report.js'\nimport { resolveComposition } from './resolve.js'\n\nexport {\n CONTRAST_MIN_BODY,\n CONTRAST_MIN_LARGE,\n DENSITY_MAX_FOCAL,\n DENSITY_MAX_NON_AMBIENT,\n FOCAL_COLLISION_WINDOW_SECONDS,\n FONT_FLOOR_PX,\n type FormatId,\n READ_MIN_SECONDS,\n READ_ORIENTATION_SECONDS,\n READ_SECONDS_PER_WORD,\n SAFE_AREAS,\n type SafeAreaPreset,\n TRANSITION_BUDGET_SECONDS,\n fontFloorPx,\n inferFormat,\n readingTimeSeconds,\n} from './constants.js'\nexport { contrastRatio, parseColor, relativeLuminance, type Rgb } from './color.js'\nexport type {\n Check,\n CheckContext,\n CheckId,\n InspectOptions,\n InspectReport,\n SceneDensity,\n Violation,\n} from './report.js'\nexport {\n type ResolvedComposition,\n type ResolvedEntry,\n type ResolvedScene,\n type TransitionWindow,\n resolveComposition,\n} from './resolve.js'\nexport { type TextBlock, textBlocks, totalWords } from './text.js'\n\n/** The check registry, in the order they run. */\nexport const CHECKS: Record<CheckId, Check> = {\n 'text.legibility': checkLegibility,\n 'layout.overflow': checkOverflow,\n 'timing.readingTime': checkReadingTime,\n 'timing.collisions': checkCollisions,\n 'density.score': checkDensity,\n 'frames.transitionCapture': checkTransitionCapture,\n}\n\n/**\n * Measure a composition payload against the quality checks. Deterministic —\n * the same payload + options always yields the same report. Assumes a\n * structurally valid payload (run `validateComposition` first; `inspect`\n * tolerates but does not re-diagnose structural errors).\n */\nexport function inspect(payload: CompositionPayload, opts: InspectOptions = {}): InspectReport {\n const resolved = resolveComposition(payload)\n const format = opts.format ?? inferFormat(resolved.width, resolved.height)\n const ctx: CheckContext = {\n payload,\n resolved,\n format,\n safe: SAFE_AREAS[format],\n theme: {\n text: payload.brand?.text ?? defaultTheme.text,\n textMuted: payload.brand?.dim ?? defaultTheme.textMuted,\n background: payload.brand?.bg ?? '#08080a',\n },\n opts,\n }\n const violations: Violation[] = []\n for (const check of Object.values(CHECKS)) violations.push(...check(ctx))\n\n const summary = { error: 0, warn: 0, info: 0 }\n for (const v of violations) summary[v.severity]++\n\n const density: SceneDensity[] = densityMetrics(resolved)\n return {\n violations,\n summary,\n format,\n fps: resolved.fps,\n totalFrames: resolved.totalFrames,\n density,\n }\n}\n","//! `@onda-engine/cinema` — turn a timeline composition payload into an `@onda-engine/react`\n//! scene. This is the spec→engine renderer ONDA Studio uses in place of its\n//! Remotion `composition-renderer`: scenes play through a `<TransitionSeries>`,\n//! tracks layer as `<AbsoluteFill>`s, and each entry is a registry component\n//! wrapped in its choreography — applied as numeric `Motion` on a `<Group>`\n//! (the engine transform), not CSS.\n\nimport * as Components from '@onda-engine/components'\nimport type { KeyframeTracks, Motion, Theme } from '@onda-engine/components'\nimport {\n AbsoluteFill,\n Camera,\n Composition,\n Group,\n Rect,\n Scene3D,\n Sequence,\n Text,\n type TransitionPresentation,\n TransitionSeries,\n blur,\n chromaticAberration,\n clipEllipse,\n clipPath,\n clipRect,\n clockWipe,\n crossFade,\n depthPush,\n devicePullback,\n dipToColor,\n expandMorph,\n fade,\n filmBurn,\n flip,\n glassWipe,\n gridPixelate,\n iris,\n linearTiming,\n lumaWipe,\n morph,\n none,\n push,\n slide,\n typeMask,\n useCurrentFrame,\n useVideoConfig,\n whipPan,\n wipe,\n zoom,\n zoomBlur,\n} from '@onda-engine/react'\nimport { type ComponentType, type ReactElement, cloneElement, createElement } from 'react'\nimport { PROP_ALIASES, SELF_ANCHORING, adaptProps, placementOffset } from './props.js'\nimport {\n sceneDurationFrames,\n scenePlacements,\n timeSpecToSeconds,\n toFrames,\n totalFrames,\n transitionOverlapFrames,\n} from './timing.js'\nimport type {\n Brand,\n CameraMove,\n CompositionPayload,\n Entry,\n EntryAnimation,\n EntryClip,\n EntryEffects,\n EntryMatte,\n Scene,\n TimeSpec,\n Track,\n Transform3D,\n} from './types.js'\n\nexport * from './types.js'\nexport {\n type ScenePlacement,\n scenePlacements,\n timeSpecToSeconds,\n toFrames,\n totalFrames,\n} from './timing.js'\n// The inspector — quality metrics (`inspect`) over the same payload.\nexport * from './inspect/index.js'\n\nconst DUR = Components.DURATION\nconst num = (v: unknown, d: number): number => (typeof v === 'number' && Number.isFinite(v) ? v : d)\nconst asDir = (v: unknown): 'up' | 'down' | 'left' | 'right' =>\n v === 'down' || v === 'left' || v === 'right' || v === 'up' ? v : 'up'\n\n// An exit pattern lands in the clip's last `exitDur` frames; a positive `delay`\n// nudges it earlier. Entries play from the clip start (offset 0).\nconst exitStart = (p: Record<string, unknown>, dur: number, exitDur: number): number =>\n Math.max(0, dur - exitDur - num(p.delay, 0))\n\ntype PatternFn = (frame: number, fps: number, p: Record<string, unknown>, dur: number) => Motion\n\n/** Choreography by name — calls the `@onda-engine/components` pattern (returns scene\n * `Motion`). Mirrors Studio's `CHOREOGRAPHY` map but on the engine model. */\nconst CHOREOGRAPHY: Record<string, PatternFn> = {\n // Direct-manipulation keyframe animation (the Studio editor). Shares the sampler\n // with the Keyframes component + Studio preview, so interpolation is identical.\n // Position is an OFFSET from placement (additive); opacity/scale absolute;\n // rotation in degrees.\n keyframes: (frame, _fps, p) => {\n const k = Components.sampleKeyframes(p as KeyframeTracks, frame)\n return {\n opacity: k.opacity,\n x: k.x,\n y: k.y,\n scaleX: k.scale,\n scaleY: k.scale,\n rotation: k.rotation,\n }\n },\n entryFade: (frame, fps, p) =>\n Components.entryFade({\n frame,\n fps,\n delay: num(p.delay, 0),\n durationInFrames: num(p.durationInFrames, DUR.base),\n }),\n entryFadeRise: (frame, fps, p) =>\n Components.entryFadeRise({\n frame,\n fps,\n delay: num(p.delay, 0),\n durationInFrames: num(p.durationInFrames, DUR.base),\n travelPx: num(p.travelPx, 12),\n }),\n entrySlide: (frame, fps, p) =>\n Components.entrySlide({\n frame,\n fps,\n delay: num(p.delay, 0),\n durationInFrames: num(p.durationInFrames, DUR.base),\n direction: asDir(p.direction),\n distance: num(p.distance, 12),\n }),\n entryScale: (frame, fps, p) =>\n Components.entryScale({\n frame,\n fps,\n delay: num(p.delay, 0),\n durationInFrames: num(p.durationInFrames, DUR.base),\n from: num(p.from, 0.9),\n }),\n heroReveal: (frame, fps, p) =>\n Components.heroReveal({\n frame,\n fps,\n delay: num(p.delay, 0),\n durationInFrames: num(p.durationInFrames, DUR.slow),\n travelPx: num(p.travelPx, 16),\n }),\n exitFade: (frame, fps, p, dur) => {\n const ed = num(p.durationInFrames, DUR.fast)\n return Components.exitFade({ frame, fps, delay: exitStart(p, dur, ed), durationInFrames: ed })\n },\n exitFadeFall: (frame, fps, p, dur) => {\n const ed = num(p.durationInFrames, DUR.fast)\n return Components.exitFadeFall({\n frame,\n fps,\n delay: exitStart(p, dur, ed),\n durationInFrames: ed,\n travelPx: num(p.travelPx, 8),\n })\n },\n exitSlide: (frame, fps, p, dur) => {\n const ed = num(p.durationInFrames, DUR.fast)\n return Components.exitSlide({\n frame,\n fps,\n delay: exitStart(p, dur, ed),\n durationInFrames: ed,\n direction: asDir(p.direction),\n distance: num(p.distance, 12),\n })\n },\n exitScale: (frame, fps, p, dur) => {\n const ed = num(p.durationInFrames, DUR.fast)\n return Components.exitScale({ frame, fps, delay: exitStart(p, dur, ed), durationInFrames: ed })\n },\n}\n\nconst REST: Motion = { opacity: 1, x: 0, y: 0, scaleX: 1, scaleY: 1 }\n\n/** Compose every `animate` pattern into one Motion (opacity/scale multiply,\n * translate sums) at the entry-relative `frame`. */\nfunction composeMotion(\n animate: EntryAnimation[] | undefined,\n frame: number,\n fps: number,\n dur: number,\n): Motion {\n let m = REST\n for (const a of animate ?? []) {\n const fn = CHOREOGRAPHY[a.pattern]\n if (!fn) continue\n const r = fn(frame, fps, a.params ?? {}, dur)\n m = {\n opacity: m.opacity * r.opacity,\n x: m.x + r.x,\n y: m.y + r.y,\n scaleX: m.scaleX * r.scaleX,\n scaleY: m.scaleY * r.scaleY,\n rotation: (m.rotation ?? 0) + (r.rotation ?? 0),\n }\n }\n return m\n}\n\n/** Scene transition slugs → engine presentations (defaults). Unknown slugs fall\n * back to cross-fade. The effect transitions (blur/glass-wipe/chromatic/…) are\n * approximated in the presentation layer — no engine filter pass needed. */\ntype TransOpts = Record<string, unknown> | undefined\nconst TRANSITIONS: Record<string, (o?: TransOpts) => TransitionPresentation> = {\n 'cross-fade': () => crossFade(),\n fade: () => fade(),\n slide: (o) => slide(o as never),\n wipe: (o) => wipe(o as never),\n iris: () => iris(),\n flip: () => flip(),\n 'clock-wipe': () => clockWipe(),\n push: (o) => push(o as never),\n zoom: (o) => zoom(o as never),\n 'depth-push': () => depthPush(),\n 'dip-to-color': (o) => dipToColor(o as never),\n none: () => none(),\n // Effect transitions — approximated in the presentation layer (no engine blur).\n blur: () => blur(),\n 'chromatic-aberration': () => chromaticAberration(),\n 'device-pullback': () => devicePullback(),\n 'expand-morph': () => expandMorph(),\n 'glass-wipe': (o) => glassWipe(o as never),\n 'grid-pixelate': (o) => gridPixelate(o as never),\n morph: () => morph(),\n 'type-mask': (o) => typeMask(o as never),\n 'zoom-blur': (o) => zoomBlur(o as never),\n 'whip-pan': (o) => whipPan(o as never),\n 'film-burn': (o) => filmBurn(o as never),\n 'luma-wipe': () => lumaWipe(),\n}\nconst presentationFor = (type: string, options?: TransOpts): TransitionPresentation =>\n (TRANSITIONS[type] ?? crossFade)(options)\n\n// ── Registry ────────────────────────────────────────────────────────────────\n\nexport type Registry = Record<string, ComponentType<Record<string, unknown>>>\n\nconst isComponent = (v: unknown): v is ComponentType<Record<string, unknown>> =>\n typeof v === 'function'\n\n// Slug-derived names (PascalCase of the ondajs/Studio slug) that differ from the\n// `@onda-engine/components` export name. The bridge accepts the slug name so existing\n// agent payloads resolve; the canonical `@onda` name also works.\nconst NAME_ALIASES: Record<string, string> = {\n RgbGlitchText: 'RgbGlitch', // ondajs `rgb-glitch-text` → @onda `RgbGlitch`\n}\n\n/** Default registry: every PascalCase `@onda-engine/components` export (the components),\n * plus slug-name aliases for the few that were renamed in the port. */\nfunction defaultRegistry(): Registry {\n const reg: Registry = {}\n for (const [name, value] of Object.entries(Components)) {\n if (/^[A-Z]/.test(name) && isComponent(value)) {\n reg[name] = value as ComponentType<Record<string, unknown>>\n }\n }\n for (const [alias, target] of Object.entries(NAME_ALIASES)) {\n if (reg[target] && !reg[alias]) reg[alias] = reg[target]\n }\n return reg\n}\n\nfunction errorPlaceholder(name: string): ReactElement {\n return createElement(\n AbsoluteFill,\n { justify: 'center', align: 'center' },\n createElement(\n Text,\n { fontSize: 32, color: '#ff6b6b', fontWeight: 600 },\n `⚠ unknown component: ${name}`,\n ),\n )\n}\n\n// ── Entry / track / scene → @onda-engine/react ──────────────────────────────────────\n\ninterface AnimatedProps {\n component: string\n props?: Record<string, unknown>\n animate?: EntryAnimation[]\n effects?: EntryEffects\n depth?: number\n transform3d?: Transform3D\n matte?: EntryMatte\n clip?: EntryClip\n durationInFrames: number\n registry: Registry\n}\n\n/** Build the `matte`/`clip` node props for an entry: the matte stencil element\n * (built from the registry like a normal entry) + the clip region. */\nfunction matteClipProps(\n matte: EntryMatte | undefined,\n clip: EntryClip | undefined,\n registry: Registry,\n width: number,\n height: number,\n): Record<string, unknown> {\n const out: Record<string, unknown> = {}\n if (matte) {\n const Comp = registry[matte.component]\n if (Comp) {\n out.matte = createElement(Comp, adaptProps(matte.component, matte.props, width, height))\n out.matteMode = matte.mode ?? 'alpha'\n }\n }\n if (clip) {\n out.clip =\n clip.shape === 'ellipse'\n ? clipEllipse(clip.width ?? width, clip.height ?? height)\n : clip.shape === 'path' && clip.data\n ? clipPath(clip.data)\n : clipRect(clip.width ?? width, clip.height ?? height, clip.cornerRadius)\n }\n return out\n}\n\n/** A registry component wrapped in its composed choreography Motion (opacity +\n * translate on the outer group; scale about the canvas centre, matching CSS\n * transform-origin). Per-entry `effects` (bloom/grade/grain/…) + `depth` wrap\n * the component's own subtree as a `<Group>` carrying the engine effect props. */\nfunction AnimatedEntry({\n component,\n props,\n animate,\n effects,\n depth,\n transform3d,\n matte,\n clip,\n durationInFrames,\n registry,\n}: AnimatedProps): ReactElement {\n const frame = useCurrentFrame()\n const { fps, width, height } = useVideoConfig()\n const m = composeMotion(animate, frame, fps, durationInFrames)\n const Comp = registry[component]\n const base = Comp\n ? createElement(Comp, adaptProps(component, props, width, height))\n : errorPlaceholder(component)\n // Per-entry effects + 2.5D depth → a wrapping <Group> (the @onda engine reads\n // these sugar props as scene-graph effects; rendered on Vello in export).\n const fxChild =\n effects || typeof depth === 'number'\n ? createElement(\n Group as ComponentType<Record<string, unknown>>,\n { ...(effects ?? {}), ...(typeof depth === 'number' ? { depth } : {}) },\n base,\n )\n : base\n // Track matte (media-through-type) + clip region.\n const matteChild =\n matte || clip\n ? createElement(\n Group as ComponentType<Record<string, unknown>>,\n matteClipProps(matte, clip, registry, width, height),\n fxChild,\n )\n : fxChild\n // AE-style 3D: wrap in a <Scene3D> (default camera) with the 3D layer carrying\n // position3d / rotation3d / extrude. Inert (pixel-identical) until moved in z.\n const child =\n transform3d && Object.keys(transform3d).length > 0\n ? createElement(\n Scene3D as ComponentType<Record<string, unknown>>,\n {},\n createElement(\n Group as ComponentType<Record<string, unknown>>,\n { ...transform3d },\n matteChild,\n ),\n )\n : matteChild\n const cx = width / 2\n const cy = height / 2\n const [px, py] = SELF_ANCHORING.has(component) ? [0, 0] : placementOffset(props, width, height)\n return createElement(\n Group,\n { x: m.x + px, y: m.y + py, opacity: m.opacity },\n createElement(\n Group,\n { x: cx, y: cy },\n createElement(\n Group,\n { scaleX: m.scaleX, scaleY: m.scaleY, rotation: m.rotation },\n createElement(Group, { x: -cx, y: -cy }, child),\n ),\n ),\n )\n}\n\n/** During a magic-move overlap the matched element is drawn ONCE by the morph\n * layer (above the spine). This window — in the entry's OWN sequence-local frame\n * space — suppresses the underlying instance so it doesn't double. */\ninterface MorphSuppress {\n /** First local frame (inclusive) to hide the entry. */\n from: number\n /** Last local frame (exclusive) to hide the entry. */\n to: number\n}\n\n/** Hide `children` while the (sequence-local) frame is inside `[s.from, s.to)`\n * — the morph layer is drawing this element instead. */\nfunction MorphSuppressGate({\n suppress,\n children,\n}: { suppress: MorphSuppress; children: ReactElement }): ReactElement | null {\n const frame = useCurrentFrame()\n if (frame >= suppress.from && frame < suppress.to) return null\n return children\n}\n\nfunction EntrySlot({\n entry,\n registry,\n suppress,\n}: {\n entry: Track['entries'][number]\n registry: Registry\n /** Hide this entry during a magic-move overlap (window in entry-local frames). */\n suppress?: MorphSuppress\n}): ReactElement {\n const { fps } = useVideoConfig()\n const animated = createElement(AnimatedEntry, {\n component: entry.component,\n props: entry.props,\n animate: entry.animate,\n effects: entry.effects,\n depth: entry.depth,\n transform3d: entry.transform3d,\n matte: entry.matte,\n clip: entry.clip,\n durationInFrames: toFrames(entry.for, fps),\n registry,\n })\n return createElement(\n Sequence,\n { from: toFrames(entry.at, fps), durationInFrames: toFrames(entry.for, fps) },\n // biome-ignore lint/correctness/noChildrenProp: raw createElement props object, not JSX\n suppress ? createElement(MorphSuppressGate, { suppress, children: animated }) : animated,\n )\n}\n\n// Overlay containers MUST be plain <Group>s, not <AbsoluteFill>s. `@onda-engine/react`'s\n// AbsoluteFill is a flex column (it lays children out top-to-bottom), not a\n// Remotion-style absolutely-positioned overlay — so sibling tracks/entries would\n// STACK and consume each other's space instead of overlapping. A plain Group\n// applies no layout, so its children all render at (0,0) and overlay; each leaf\n// component fills the canvas via its own AbsoluteFill. (See buildComposition root\n// for the same fix — a full-frame bg Rect as a flex sibling otherwise eats all\n// the height and the content collapses to nothing → a blank frame.)\n/** A cinematic camera move over a scene — frames the content in an @onda\n * `<Camera>` eased from `move.from` → `move.to` over the scene duration. */\nfunction AnimatedCamera({\n move,\n durationInFrames,\n children,\n}: { move: CameraMove; durationInFrames: number; children: ReactElement }): ReactElement {\n const frame = useCurrentFrame()\n const { width, height } = useVideoConfig()\n const p = durationInFrames > 1 ? Math.min(1, Math.max(0, frame / (durationInFrames - 1))) : 1\n const e = p * p * (3 - 2 * p) // smoothstep ease-in-out\n const from = move.from ?? {}\n const to = move.to ?? {}\n const lerp = (a: number | undefined, b: number | undefined, d: number): number => {\n const av = a ?? d\n const bv = b ?? d\n return av + (bv - av) * e\n }\n return createElement(\n Camera,\n {\n focusX: lerp(from.x, to.x, 0.5) * width,\n focusY: lerp(from.y, to.y, 0.5) * height,\n zoom: lerp(from.zoom, to.zoom, 1),\n rotate: lerp(from.rotate, to.rotate, 0),\n },\n children,\n )\n}\n\nfunction SceneTracks({\n scene,\n registry,\n suppress,\n responsive,\n}: {\n scene: Scene\n registry: Registry\n /** entry → its magic-move suppression window (entry-local frames). */\n suppress?: Map<Entry, MorphSuppress>\n /** `fit:\"responsive\"` re-frame context — re-anchor each entry to the output. */\n responsive?: { design: Components.Box; out: Components.Box }\n}): ReactElement {\n return createElement(\n Group,\n null,\n ...scene.tracks.map((track, ti) =>\n createElement(\n Group,\n { key: track.id ?? `track-${ti}` },\n ...track.entries.map((entry, ei) => {\n const key = entry.id ?? `entry-${ei}`\n const slot = createElement(EntrySlot, { entry, registry, suppress: suppress?.get(entry) })\n if (!responsive) return cloneElement(slot, { key })\n // Magic Resize: pin this element's design anchor onto the output canvas.\n const t = Components.responsiveEntryTransform(\n Components.entryDesignAnchor(entry.props),\n responsive.design,\n responsive.out,\n )\n if (t.x === 0 && t.y === 0 && t.scale === 1) return cloneElement(slot, { key })\n return createElement(\n Group,\n { key, x: t.x, y: t.y, scaleX: t.scale, scaleY: t.scale },\n slot,\n )\n }),\n ),\n ),\n )\n}\n\n// ── Magic move (matched-element continuity across a cut) ──────────────────────\n//\n// When an entry in scene A and an entry in scene B share a `morphKey`, the element\n// should MORPH its position/scale across the cut (one continuous move) rather than\n// hard-cut/cross-fade — Keynote Magic Move / a matched cut. A TransitionPresentation\n// only sees the WHOLE scene flat, so it can't tween a single element. Instead, during\n// the transition OVERLAP we draw ONE interpolating instance (built from B's entry)\n// ABOVE the spine, and suppress the duplicate in A's tail + B's head so it never\n// doubles. v1 morphs translate + scale (resolved the SAME way the renderer places an\n// entry: placementOffset + canvas centre); opacity holds.\n\n/** An entry's resolved screen TRANSFORM at rest — the pixel translate the renderer\n * applies for its `placement` (matching `AnimatedEntry`'s `placementOffset`) plus a\n * uniform scale. Animation Motion is intentionally NOT baked in: the morph reads\n * the element's settled placement, which is the dominant magic-move signal. */\ninterface MorphTransform {\n x: number\n y: number\n scale: number\n}\n\nfunction entryTransform(entry: Entry, w: number, h: number): MorphTransform {\n const [px, py] = SELF_ANCHORING.has(entry.component) ? [0, 0] : placementOffset(entry.props, w, h)\n const s = entry.props?.scale\n return { x: px, y: py, scale: typeof s === 'number' && Number.isFinite(s) ? s : 1 }\n}\n\n/** A matched magic-move pair: the destination entry (drawn morphing) and the\n * endpoints + absolute overlap window it tweens across. */\ninterface MorphPair {\n /** Built from B (the destination) — same component + props. */\n to: Entry\n from: MorphTransform\n toT: MorphTransform\n /** Absolute frame the overlap (and the morph) starts. */\n overlapStart: number\n /** Overlap length in frames. */\n overlapFrames: number\n}\n\n/** Find which `morphKey`s an entry holds AT a scene boundary, with the entry. A\n * morph only fires for an entry that's actually on-screen at the cut: in scene A\n * the entry must still be live in A's last `overlap` frames; in scene B it must be\n * live in B's first `overlap` frames. */\nfunction morphEntriesAtTail(\n scene: Scene,\n fps: number,\n sceneDur: number,\n overlap: number,\n): Map<string, Entry> {\n const m = new Map<string, Entry>()\n const cutStart = sceneDur - overlap\n for (const track of scene.tracks) {\n for (const e of track.entries) {\n if (!e.morphKey) continue\n const start = toFrames(e.at, fps)\n const end = start + toFrames(e.for, fps)\n // Live during the tail overlap window [cutStart, sceneDur).\n if (start < sceneDur && end > cutStart) m.set(e.morphKey, e)\n }\n }\n return m\n}\n\nfunction morphEntriesAtHead(scene: Scene, fps: number, overlap: number): Map<string, Entry> {\n const m = new Map<string, Entry>()\n for (const track of scene.tracks) {\n for (const e of track.entries) {\n if (!e.morphKey) continue\n const start = toFrames(e.at, fps)\n const end = start + toFrames(e.for, fps)\n // Live during the head overlap window [0, overlap).\n if (start < overlap && end > 0) m.set(e.morphKey, e)\n }\n }\n return m\n}\n\n/** A morphing element above the spine: B's element wrapped in a Group that tweens\n * translate + scale from A's placement to B's over the overlap (smoothstep). */\nfunction MorphLayer({ pair, registry }: { pair: MorphPair; registry: Registry }): ReactElement {\n const frame = useCurrentFrame()\n const { width, height } = useVideoConfig()\n const n = pair.overlapFrames\n const p = n > 1 ? Math.min(1, Math.max(0, frame / (n - 1))) : 1\n const e = p * p * (3 - 2 * p) // smoothstep ease-in-out\n const lerp = (a: number, b: number): number => a + (b - a) * e\n const x = lerp(pair.from.x, pair.toT.x)\n const y = lerp(pair.from.y, pair.toT.y)\n const scale = lerp(pair.from.scale, pair.toT.scale)\n\n const Comp = registry[pair.to.component]\n const base = Comp\n ? createElement(Comp, adaptProps(pair.to.component, pair.to.props, width, height))\n : errorPlaceholder(pair.to.component)\n const cx = width / 2\n const cy = height / 2\n // Translate to the morphed placement, then scale about the canvas centre\n // (matching AnimatedEntry's scale-about-centre pivot).\n return createElement(\n Group,\n { x, y },\n createElement(\n Group,\n { x: cx, y: cy },\n createElement(\n Group,\n { scaleX: scale, scaleY: scale },\n createElement(Group, { x: -cx, y: -cy }, base),\n ),\n ),\n )\n}\n\n/** Plan the magic-move layers for a composition: for each adjacent A→B pair sharing\n * a `morphKey`, an absolute-timed morph layer + the per-entry suppression windows\n * (so the underlying duplicate hides during the overlap). `sceneStart` and\n * `sceneDur` are the per-scene absolute start / duration in frames. */\ninterface MorphPlan {\n /** Absolute-timed morph layers to render above the spine. */\n pairs: MorphPair[]\n /** scene index → (entry → suppression window in that entry's LOCAL frames). */\n suppress: Map<number, Map<Entry, MorphSuppress>>\n}\n\nfunction planMorphs(\n scenes: Scene[],\n fps: number,\n w: number,\n h: number,\n sceneStart: number[],\n sceneDur: number[],\n): MorphPlan {\n const pairs: MorphPair[] = []\n const suppress = new Map<number, Map<Entry, MorphSuppress>>()\n const addSuppress = (sceneIdx: number, entry: Entry, win: MorphSuppress): void => {\n let m = suppress.get(sceneIdx)\n if (!m) {\n m = new Map<Entry, MorphSuppress>()\n suppress.set(sceneIdx, m)\n }\n m.set(entry, win)\n }\n\n for (let i = 1; i < scenes.length; i++) {\n const prev = scenes[i - 1]\n const cur = scenes[i]\n if (!prev || !cur || !cur.transition) continue\n const overlap = transitionOverlapFrames(prev, cur, fps)\n if (overlap <= 0) continue\n const prevDur = sceneDur[i - 1] ?? 0\n const aMap = morphEntriesAtTail(prev, fps, prevDur, overlap)\n if (aMap.size === 0) continue\n const bMap = morphEntriesAtHead(cur, fps, overlap)\n if (bMap.size === 0) continue\n const overlapStart = sceneStart[i] ?? 0 // scene B starts where the overlap begins\n\n for (const [key, aEntry] of aMap) {\n const bEntry = bMap.get(key)\n if (!bEntry) continue\n pairs.push({\n to: bEntry,\n from: entryTransform(aEntry, w, h),\n toT: entryTransform(bEntry, w, h),\n overlapStart,\n overlapFrames: overlap,\n })\n // Suppress A's tail (last `overlap` local frames) and B's head (first\n // `overlap` local frames) so only the morphing instance shows.\n addSuppress(i - 1, aEntry, { from: prevDur - overlap, to: prevDur })\n addSuppress(i, bEntry, { from: 0, to: overlap })\n }\n }\n return { pairs, suppress }\n}\n\n// ── Public API ────────────────────────────────────────────────────────────────\n\nexport interface BuildOptions {\n /** Component lookup. Default: every `@onda-engine/components` component. */\n registry?: Registry\n}\n\nfunction brandToTheme(brand: Brand): Partial<Theme> {\n const t: Partial<Theme> = {}\n if (brand.accent) t.accent = brand.accent\n if (brand.accentSoft) t.accentSoft = brand.accentSoft\n if (brand.text) t.text = brand.text\n if (brand.dim) t.textMuted = brand.dim\n if (brand.bg) t.background = brand.bg\n if (brand.surface) t.surface = brand.surface\n if (brand.border) t.border = brand.border\n if (brand.fontBody) t.fontFamily = brand.fontBody\n if (brand.fontDisplay) t.headingFamily = brand.fontDisplay\n return t\n}\n\n/**\n * Build an `@onda-engine/react` `<Composition>` from a timeline payload. Pass the\n * result to `@onda-engine/render`'s `renderToFile` (export) or `<Player>` (preview).\n */\n/** Scene-level FIT — when a scene declares the canvas its content was AUTHORED for\n * (designWidth/designHeight) and it differs from the output, uniformly scale +\n * center the scene's content to `fit` the output canvas (`contain` = letterbox,\n * `cover` = fill + crop). Lets a 4:3 template scene drop into a 16:9 video with no\n * per-element re-layout. No-op when the fields are absent or already match. */\nfunction fitGroup(scene: Scene, width: number, height: number, child: ReactElement): ReactElement {\n const dw = scene.designWidth\n const dh = scene.designHeight\n const fit = scene.fit\n // `responsive` re-frames each element individually (see SceneTracks) — no uniform\n // scale here. cover/contain stay a single Group around the whole scene.\n if (!dw || !dh || !fit || fit === 'responsive' || (dw === width && dh === height)) return child\n const scale =\n fit === 'contain' ? Math.min(width / dw, height / dh) : Math.max(width / dw, height / dh)\n const x = (width - dw * scale) / 2\n const y = (height - dh * scale) / 2\n return createElement(Group, { x, y, scaleX: scale, scaleY: scale }, child)\n}\n\n/** When a scene opts into `fit:\"responsive\"` and the output differs from its design\n * canvas, the per-element re-frame context SceneTracks needs; else `undefined`\n * (cover/contain/no-fit all skip per-element handling). */\nfunction sceneResponsive(\n scene: Scene,\n width: number,\n height: number,\n): { design: Components.Box; out: Components.Box } | undefined {\n const dw = scene.designWidth\n const dh = scene.designHeight\n if (scene.fit !== 'responsive' || !dw || !dh || (dw === width && dh === height)) return undefined\n return { design: { width: dw, height: dh }, out: { width, height } }\n}\n\nexport function buildComposition(\n payload: CompositionPayload,\n opts: BuildOptions = {},\n): ReactElement {\n const {\n width,\n height,\n fps,\n scenes,\n layers = [],\n brand,\n linear,\n finish,\n motionBlur,\n dof,\n } = payload\n const registry = opts.registry ?? defaultRegistry()\n const total = totalFrames(payload, fps)\n\n // Per-scene absolute start frame + duration — the same placement\n // <TransitionSeries> computes (a scene starts where the previous one ends MINUS\n // its incoming transition overlap). The magic-move planner needs these to time\n // the morph layer to the cut window. `scenePlacements` is the shared resolver\n // (the inspector reads the identical timeline).\n const placements = scenePlacements(scenes, fps)\n const sceneDur = placements.map((p) => p.durationInFrames)\n const sceneStart = placements.map((p) => p.start)\n const morphPlan = planMorphs(scenes, fps, width, height, sceneStart, sceneDur)\n\n const seriesChildren: ReactElement[] = []\n scenes.forEach((scene, i) => {\n if (i > 0 && scene.transition) {\n seriesChildren.push(\n createElement(TransitionSeries.Transition, {\n key: `transition-${i}`,\n presentation: presentationFor(scene.transition.type, scene.transition.options),\n timing: linearTiming({\n durationInFrames: transitionOverlapFrames(scenes[i - 1], scene, fps),\n }),\n }),\n )\n }\n const sceneSuppress = morphPlan.suppress.get(i)\n const responsive = sceneResponsive(scene, width, height)\n seriesChildren.push(\n createElement(\n TransitionSeries.Sequence,\n { key: scene.id, durationInFrames: sceneDur[i] ?? sceneDurationFrames(scene, fps) },\n scene.camera\n ? createElement(AnimatedCamera, {\n move: scene.camera,\n durationInFrames: sceneDur[i] ?? sceneDurationFrames(scene, fps),\n // biome-ignore lint/correctness/noChildrenProp: raw createElement props object, not JSX\n children: fitGroup(\n scene,\n width,\n height,\n createElement(SceneTracks, {\n scene,\n registry,\n suppress: sceneSuppress,\n responsive,\n }),\n ),\n })\n : fitGroup(\n scene,\n width,\n height,\n createElement(SceneTracks, { scene, registry, suppress: sceneSuppress, responsive }),\n ),\n ),\n )\n })\n\n // Magic-move layers: one interpolating instance per matched A→B pair, absolute-\n // timed to the transition overlap and drawn ABOVE the spine.\n const morphLayers: ReactElement[] = morphPlan.pairs.map((pair, i) =>\n createElement(\n Sequence,\n {\n key: `morph-${i}`,\n from: pair.overlapStart,\n durationInFrames: pair.overlapFrames,\n },\n createElement(MorphLayer, { pair, registry }),\n ),\n )\n\n const layerEls = (under: boolean): ReactElement[] =>\n layers\n .filter((l) => Boolean(l.under) === under)\n .flatMap((layer, li) =>\n layer.entries.map((entry, ei) => {\n const from = toFrames(entry.at ?? 0, fps)\n const dur = entry.for != null ? toFrames(entry.for, fps) : Math.max(1, total - from)\n return createElement(\n Sequence,\n { key: `layer-${under ? 'u' : 'o'}-${li}-${ei}`, from, durationInFrames: dur },\n createElement(AnimatedEntry, {\n component: entry.component,\n props: entry.props,\n animate: entry.animate,\n effects: entry.effects,\n depth: entry.depth,\n transform3d: entry.transform3d,\n matte: entry.matte,\n clip: entry.clip,\n durationInFrames: dur,\n registry,\n }),\n )\n }),\n )\n\n // Plain Group, NOT AbsoluteFill: the bg Rect, layers and TransitionSeries must\n // OVERLAY (z-stack at 0,0). AbsoluteFill's flex column would lay the full-height\n // bg Rect first and squeeze everything after it to zero height → blank render.\n const root = createElement(\n Group,\n null,\n createElement(Rect, { width, height, fill: brand?.bg ?? '#08080a' }),\n ...layerEls(true),\n createElement(TransitionSeries, null, ...seriesChildren),\n // Magic-move morph layers ride ABOVE the spine (drawn during the cut overlap).\n ...morphLayers,\n ...layerEls(false),\n )\n const content = brand\n ? createElement(Components.ThemeProvider, { theme: brandToTheme(brand) }, root)\n : root\n\n // Composition-level cinematic finish/dof/motion-blur/linear ride on the root\n // <Composition> — the @onda engine applies them after the comp rasterizes\n // (finish + motionBlur are GPU/export-only).\n return createElement(\n Composition,\n { width, height, fps, durationInFrames: total, linear, finish, motionBlur, dof },\n content,\n )\n}\n\n// ── Validation ──────────────────────────────────────────────────────────────\n\nexport interface Diagnostic {\n /** `error` = won't render correctly (fix it); `warning` = renders, but off or\n * fragile; `info` = an FYI an agent should weigh (e.g. a degraded component). */\n level: 'error' | 'warning' | 'info'\n path: string\n message: string\n}\n\n/** Levenshtein edit distance — for \"did you mean?\" on a misspelled component. */\nfunction editDistance(a: string, b: string): number {\n let prev: number[] = Array.from({ length: b.length + 1 }, (_, j) => j)\n for (let i = 1; i <= a.length; i++) {\n const cur: number[] = [i]\n for (let j = 1; j <= b.length; j++) {\n const cost = a[i - 1] === b[j - 1] ? 0 : 1\n cur[j] = Math.min((prev[j] ?? 0) + 1, (cur[j - 1] ?? 0) + 1, (prev[j - 1] ?? 0) + cost)\n }\n prev = cur\n }\n return prev[b.length] ?? 0\n}\n\n/** The closest registry name to `name` within a typo-level distance, else null. */\nfunction closestComponent(name: string, registry: Registry): string | null {\n let best: string | null = null\n let bestD = Number.POSITIVE_INFINITY\n for (const k of Object.keys(registry)) {\n const d = editDistance(name.toLowerCase(), k.toLowerCase())\n if (d < bestD) {\n bestD = d\n best = k\n }\n }\n return best && bestD <= Math.max(2, Math.floor(name.length / 3)) ? best : null\n}\n\n/** Whether `v` is a well-formed TimeSpec. `timeSpecToSeconds` is lenient (garbage\n * → 0), so the validator checks the shape strictly: a finite number, or a string\n * that's `M:SS` / `<n>ms` / `<n>f` / `<n>s` / a bare number — each numeric part\n * finite. (`isValidTimeSpec(\"soon\")` is false.) */\nfunction isValidTimeSpec(v: TimeSpec): boolean {\n if (typeof v === 'number') return Number.isFinite(v)\n const s = v.trim()\n if (s === '') return false\n const numOk = (x: string): boolean => x.trim() !== '' && Number.isFinite(Number(x))\n if (s.includes(':')) {\n const [m, sec] = s.split(':')\n return numOk(m ?? '') && numOk(sec ?? '')\n }\n if (s.endsWith('ms')) return numOk(s.slice(0, -2))\n if (s.endsWith('f')) return numOk(s.slice(0, -1))\n if (s.endsWith('s')) return numOk(s.slice(0, -1))\n return numOk(s)\n}\n\n// Entry props the BRIDGE itself consumes (every component), beyond what a\n// component's own schema declares: `placement` is read by `placementOffset`,\n// `scale` by the magic-move `entryTransform`.\nconst BRIDGE_PROPS = ['placement', 'scale']\n\n/** The prop names known for `component` — its manifest props + Zod-schema keys\n * + the bridge's Studio-name aliases + the bridge-consumed props — or `null`\n * when the component isn't catalogued (then no unknown-prop check runs). */\nfunction knownPropsFor(component: string): Set<string> | null {\n const m = Components.manifestEntry(component)\n if (!m) return null\n const known = new Set<string>(m.props.map((p) => p.name))\n // The Zod object's shape, in case the schema carries keys the PropMeta lags.\n const shape = (m.schema as unknown as { shape?: Record<string, unknown> }).shape\n if (shape && typeof shape === 'object') for (const k of Object.keys(shape)) known.add(k)\n for (const src of Object.keys(PROP_ALIASES[component] ?? {})) known.add(src)\n for (const k of BRIDGE_PROPS) known.add(k)\n return known\n}\n\n/**\n * Check a payload before rendering — the tight feedback loop an agent (ONDA\n * Studio's MCP) self-corrects against. Flags structural issues, unknown\n * components (with a did-you-mean), unknown patterns/transitions, malformed\n * timing, and — from the fidelity contract — components that are GPU-only,\n * degraded, or imitate a browser feature, so the agent picks engine-native\n * components and avoids surprises. Returns `[]` when the composition is clean.\n *\n * Unknown-props policy: WARN, don't strip. An unknown prop on a known\n * component yields a `warning` diagnostic and the prop is PRESERVED through\n * `buildComposition` (the component ignores what it doesn't know) — never\n * silently dropped. Unknown COMPONENTS stay errors (with a did-you-mean).\n */\nexport function validateComposition(\n payload: CompositionPayload,\n opts: BuildOptions = {},\n): Diagnostic[] {\n const registry = opts.registry ?? defaultRegistry()\n const fidelity = Components.COMPONENT_FIDELITY as\n | Record<\n string,\n { fidelity: string; engineNative: boolean; needsFeature: string | null; backend: string }\n >\n | undefined\n const diags: Diagnostic[] = []\n if (!(payload.fps > 0)) diags.push({ level: 'error', path: 'fps', message: 'fps must be > 0' })\n if (!(payload.width > 0 && payload.height > 0))\n diags.push({ level: 'error', path: 'size', message: 'width/height must be > 0' })\n if (!payload.scenes?.length)\n diags.push({ level: 'error', path: 'scenes', message: 'composition has no scenes' })\n\n const fps = payload.fps > 0 ? payload.fps : 30\n const checkTime = (v: TimeSpec | undefined, path: string, required: boolean): void => {\n if (v === undefined) {\n if (required) diags.push({ level: 'error', path, message: 'missing required time' })\n return\n }\n if (!isValidTimeSpec(v)) {\n diags.push({\n level: 'error',\n path,\n message: `invalid time ${JSON.stringify(v)} — use seconds (e.g. 2) or a spec string (\"2s\", \"500ms\", \"0:02\", \"90f\")`,\n })\n return\n }\n const secs = typeof v === 'number' ? v : timeSpecToSeconds(v, fps)\n if (secs < 0)\n diags.push({ level: 'error', path, message: `time ${JSON.stringify(v)} is negative` })\n }\n\n const checkEntry = (\n e: {\n component: string\n at?: TimeSpec\n for?: TimeSpec\n animate?: EntryAnimation[]\n role?: string\n props?: Record<string, unknown>\n },\n path: string,\n timed: boolean,\n ): void => {\n if (e.role !== undefined && e.role !== 'focal' && e.role !== 'support' && e.role !== 'ambient')\n diags.push({\n level: 'error',\n path: `${path}.role`,\n message: `invalid role ${JSON.stringify(e.role)} — use 'focal' | 'support' | 'ambient' (absent = 'support')`,\n })\n if (!registry[e.component]) {\n const guess = closestComponent(e.component, registry)\n diags.push({\n level: 'error',\n path: `${path}.component`,\n message: `unknown component \"${e.component}\"${guess ? ` — did you mean \"${guess}\"?` : ''}`,\n })\n } else {\n const f = fidelity?.[e.component]\n if (f?.fidelity === 'apes_remotion')\n diags.push({\n level: 'warning',\n path: `${path}.component`,\n message: `\"${e.component}\" imitates a browser-only effect the engine doesn't do natively — it renders a stylized approximation; avoid for hero moments.`,\n })\n else if (f?.fidelity === 'degraded')\n diags.push({\n level: 'info',\n path: `${path}.component`,\n message: `\"${e.component}\" renders an approximation until the engine gains \"${f.needsFeature}\".`,\n })\n if (f?.backend === 'gpu_only')\n diags.push({\n level: 'warning',\n path: `${path}.component`,\n message: `\"${e.component}\" needs the GPU (Vello) backend — it won't render correctly on the CPU reference (e.g. a CPU-verified or no-GPU export).`,\n })\n // Unknown props: warn, don't strip — the prop rides through to the\n // component (which ignores what it doesn't know), and the agent learns\n // the name it probably misspelled.\n const known = knownPropsFor(e.component)\n if (known && e.props) {\n for (const k of Object.keys(e.props)) {\n if (!known.has(k))\n diags.push({\n level: 'warning',\n path: `${path}.props.${k}`,\n message: `unknown prop \"${k}\" on ${e.component} — passed through (the component ignores props it doesn't declare)`,\n })\n }\n }\n }\n // Entries are timed (at/for required); layer entries may omit them.\n checkTime(e.at, `${path}.at`, timed)\n checkTime(e.for, `${path}.for`, timed)\n ;(e.animate ?? []).forEach((a, i) => {\n if (!CHOREOGRAPHY[a.pattern])\n diags.push({\n level: 'warning',\n path: `${path}.animate[${i}]`,\n message: `unknown choreography pattern \"${a.pattern}\" (ignored)`,\n })\n })\n }\n\n payload.scenes?.forEach((scene, si) => {\n if (scene.transition && !TRANSITIONS[scene.transition.type])\n diags.push({\n level: 'warning',\n path: `scenes[${si}].transition`,\n message: `transition \"${scene.transition.type}\" not in the engine yet — falls back to cross-fade`,\n })\n if (!scene.tracks?.length)\n diags.push({ level: 'warning', path: `scenes[${si}].tracks`, message: 'scene has no tracks' })\n scene.tracks?.forEach((track, ti) =>\n track.entries.forEach((e, ei) =>\n checkEntry(e, `scenes[${si}].tracks[${ti}].entries[${ei}]`, true),\n ),\n )\n })\n payload.layers?.forEach((layer, li) =>\n layer.entries.forEach((e, ei) => checkEntry(e, `layers[${li}].entries[${ei}]`, false)),\n )\n return diags\n}\n"]}
1
+ {"version":3,"sources":["../../cinema/src/props.ts","../../cinema/src/timing.ts","../../cinema/src/inspect/constants.ts","../../cinema/src/inspect/collisions.ts","../../cinema/src/inspect/density.ts","../../cinema/src/inspect/frames.ts","../../cinema/src/inspect/color.ts","../../cinema/src/inspect/resolve.ts","../../cinema/src/inspect/text.ts","../../cinema/src/inspect/legibility.ts","../../cinema/src/inspect/overflow.ts","../../cinema/src/inspect/reading.ts","../../cinema/src/inspect/index.ts","../../cinema/src/index.tsx"],"names":["nonAmbient","manifestEntry","secs"],"mappings":"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","file":"cinema.js","sourcesContent":["//! The Studio→engine PROP vocabulary — size-role tokens, prop-name aliases,\n//! placement coords, and the self-anchoring list. Extracted (verbatim) from the\n//! renderer in `index.tsx` so the inspector can resolve an entry's effective\n//! props/placement the SAME way `buildComposition` does, without importing the\n//! React renderer. Behavior is identical to the pre-extraction code.\n\n// Placement → fraction of the canvas the element's centre is moved to. Components\n// self-centre (their own `<AbsoluteFill justify=\"center\">`), so without this every\n// entry stacks dead-centre — a regression vs the Remotion path, which anchored by\n// `placement`. Shifting the centred element by the centre→target delta restores\n// regions; centre/thirds are exact, corners are approximate (true corner-anchoring\n// needs the laid-out element size — a follow-up once the bridge can measure).\nexport const PLACEMENT_COORDS: Record<string, [number, number]> = {\n center: [0.5, 0.5],\n top: [0.5, 0.1],\n bottom: [0.5, 0.9],\n left: [0.1, 0.5],\n right: [0.9, 0.5],\n 'top-left': [0.1, 0.1],\n 'top-right': [0.9, 0.1],\n 'bottom-left': [0.1, 0.9],\n 'bottom-right': [0.9, 0.9],\n 'upper-third': [0.5, 0.28],\n 'lower-third': [0.5, 0.72],\n}\n\n// Components that consume `placement` THEMSELVES (the shared placement contract\n// in @onda-engine/components, or their own legacy anchoring) — the bridge must NOT also\n// shift them, or placement applies twice and they fly off-canvas. Every\n// component migrated onto `usePlacement`/`PlacementShift` belongs here.\nexport const SELF_ANCHORING = new Set([\n 'LowerThird',\n 'Callout',\n 'BlurReveal',\n 'Button',\n 'Captions',\n 'ChapterCard',\n 'CountUp',\n 'EndCard',\n 'InputField',\n 'KineticText',\n 'MaskReveal',\n 'MatrixDecode',\n 'PricingCard',\n 'QuoteCard',\n 'SlotMachineRoll',\n 'StatCard',\n 'Terminal',\n 'TextAnimator',\n 'TitleCard',\n 'Typewriter',\n])\n\n/** Centre→anchor pixel offset for an entry's `placement` prop (string slug or\n * `{x,y}` fractions). Returns `[0,0]` for centre / unknown. */\nexport function placementOffset(\n props: Record<string, unknown> | undefined,\n w: number,\n h: number,\n): [number, number] {\n const p = props?.placement\n let fx = 0.5\n let fy = 0.5\n const coords = typeof p === 'string' ? PLACEMENT_COORDS[p] : undefined\n if (coords) [fx, fy] = coords\n else if (p && typeof p === 'object') {\n const o = p as { x?: unknown; y?: unknown }\n if (typeof o.x === 'number') fx = o.x\n if (typeof o.y === 'number') fy = o.y\n }\n return [(fx - 0.5) * w, (fy - 0.5) * h]\n}\n\n// ── Studio prop vocabulary → @onda-engine/components prop API ────────────────────────\n// ondajs/Studio components take a semantic SIZE ROLE (a fraction of the SMALLER\n// canvas dimension, resolved canvas-aware) under prop names like `size` /\n// `titleSize` / `numberSize`, with a px companion (`fontSize` / `titleFontSize`,\n// which wins when both are passed). The `@onda-engine/components` ports instead take\n// raw px under their own names (`fontSize`, `titleSize`, `valueSize`). Without a\n// translation, a real Studio payload's `size: \"hero\"` is either dropped (default\n// size) or — worse — fed into a component's arithmetic, yielding `NaN` → a `null`\n// in the scene JSON that the Rust f32 parser rejects (hard render failure).\n//\n// SIZE_ROLES + the resolve formula MUST match Studio's `resolveSize` exactly\n// (frontend/src/lib/onda/canvas.tsx) so bridged sizes equal Studio's pixels.\nexport const SIZE_ROLES: Record<string, number> = {\n hero: 0.15,\n heading: 0.09,\n subheading: 0.052,\n body: 0.03,\n caption: 0.02,\n}\nexport const roleToPx = (role: string, w: number, h: number): number =>\n Math.round((SIZE_ROLES[role] ?? 0) * Math.min(w, h))\n\n// Per-component prop map: Studio prop name → `@onda-engine/components` prop name. Role\n// sources (`…Size`/`size`) resolve through SIZE_ROLES; px sources\n// (`…FontSize`/`fontSize`) pass numbers through and WIN over a role for the same\n// target (matching Studio's \"px wins\" rule).\nexport const isPxSource = (name: string): boolean =>\n name === 'fontSize' || name.endsWith('FontSize')\nexport const PROP_ALIASES: Record<string, Record<string, string>> = {\n TitleCard: {\n titleSize: 'titleSize',\n titleFontSize: 'titleSize',\n subtitleSize: 'subtitleSize',\n subtitleFontSize: 'subtitleSize',\n },\n Highlight: { size: 'fontSize', fontSize: 'fontSize' },\n WordStagger: { size: 'fontSize', fontSize: 'fontSize' },\n Captions: { size: 'fontSize', fontSize: 'fontSize' },\n StatCard: {\n numberSize: 'valueSize',\n numberFontSize: 'valueSize',\n labelSize: 'labelSize',\n labelFontSize: 'labelSize',\n },\n}\n\n/** Translate a Studio entry's props to the `@onda-engine/components` prop API: resolve\n * size-role tokens to canvas-aware px, alias the differing prop names, and (as a\n * safety net) resolve any leftover role-token value in place so a stray token\n * can never reach a component's arithmetic and produce a NaN→null scene node. */\nexport function adaptProps(\n component: string,\n props: Record<string, unknown> | undefined,\n w: number,\n h: number,\n): Record<string, unknown> {\n const out: Record<string, unknown> = { ...(props ?? {}) }\n const aliases = PROP_ALIASES[component]\n if (aliases) {\n // For each target prop, a px source wins over a role source.\n const pxValue: Record<string, number> = {}\n const roleValue: Record<string, number> = {}\n for (const [src, target] of Object.entries(aliases)) {\n if (!(src in out)) continue\n const v = out[src]\n if (isPxSource(src)) {\n if (typeof v === 'number') pxValue[target] = v\n } else if (typeof v === 'string' && v in SIZE_ROLES) {\n roleValue[target] = roleToPx(v, w, h)\n } else if (typeof v === 'number') {\n roleValue[target] = v // already px under a role-named prop\n }\n if (src !== target) delete out[src] // drop the Studio-only name\n }\n for (const target of new Set([...Object.keys(roleValue), ...Object.keys(pxValue)])) {\n out[target] = pxValue[target] ?? roleValue[target]\n }\n }\n // Generic safety net: any remaining prop whose value is a bare role token.\n for (const k of Object.keys(out)) {\n const v = out[k]\n if (typeof v === 'string' && v in SIZE_ROLES) out[k] = roleToPx(v, w, h)\n }\n return out\n}\n","//! Time/frame math — mirrors Studio's `composition.ts` helpers so scene windows\n//! and audio offsets line up with what actually plays.\n\nimport type { CompositionPayload, Scene, TimeSpec } from './types.js'\n\n/** Parse a TimeSpec to seconds. `fps` is needed for frame specs (`\"90f\"`). */\nexport function timeSpecToSeconds(spec: TimeSpec | undefined, fps: number): number {\n if (spec == null) return 0\n if (typeof spec === 'number') return spec >= 0 ? spec : 0\n const s = spec.trim()\n if (s === '') return 0\n if (s.includes(':')) {\n const [m, sec] = s.split(':')\n return (Number(m) || 0) * 60 + (Number(sec) || 0)\n }\n if (s.endsWith('ms')) return (Number(s.slice(0, -2)) || 0) / 1000\n if (s.endsWith('f')) return (Number(s.slice(0, -1)) || 0) / fps\n if (s.endsWith('s')) return Number(s.slice(0, -1)) || 0\n return Number(s) || 0\n}\n\n/** A TimeSpec in frames. */\nexport function toFrames(spec: TimeSpec | undefined, fps: number): number {\n return Math.round(timeSpecToSeconds(spec, fps) * fps)\n}\n\n/** A scene's duration in seconds: explicit `for`, else derived from the\n * latest-ending entry, else a 3s fallback. */\nexport function sceneDurationSeconds(scene: Scene, fps: number): number {\n if (scene.for != null) return timeSpecToSeconds(scene.for, fps)\n let max = 0\n for (const track of scene.tracks) {\n for (const e of track.entries) {\n const end = timeSpecToSeconds(e.at, fps) + timeSpecToSeconds(e.for, fps)\n if (end > max) max = end\n }\n }\n return max > 0 ? max : 3\n}\n\n/** A scene's duration in frames. */\nexport function sceneDurationFrames(scene: Scene, fps: number): number {\n return Math.max(1, Math.round(sceneDurationSeconds(scene, fps) * fps))\n}\n\nconst DEFAULT_TRANSITION_FRAMES = 15\n\n/** Frames a scene's incoming transition overlaps the previous scene — clamped to\n * ≤ ⅓ of the shorter neighbor. */\nexport function transitionOverlapFrames(\n prev: Scene | undefined,\n scene: Scene,\n fps: number,\n): number {\n if (!prev || !scene.transition) return 0\n const requested = scene.transition.durationInFrames ?? DEFAULT_TRANSITION_FRAMES\n const shorter = Math.min(sceneDurationFrames(prev, fps), sceneDurationFrames(scene, fps))\n return Math.max(1, Math.min(requested, Math.floor(shorter / 3)))\n}\n\n/** A scene's resolved position on the composition timeline, in frames. */\nexport interface ScenePlacement {\n /** Absolute frame the scene starts (the start of its incoming overlap). */\n start: number\n /** Scene duration in frames. */\n durationInFrames: number\n /** Frames the scene's incoming transition overlaps the previous scene\n * (0 for the first scene / no transition). The transition window is\n * `[start, start + overlapIn)` in absolute frames. */\n overlapIn: number\n}\n\n/** Resolve every scene's absolute start + duration — the SAME placement\n * `buildComposition`'s `<TransitionSeries>` computes (a scene starts where the\n * previous one ends MINUS its incoming transition overlap). Shared by the\n * renderer (magic-move planning) and the inspector so the two can't drift. */\nexport function scenePlacements(scenes: Scene[], fps: number): ScenePlacement[] {\n const out: ScenePlacement[] = []\n let offset = 0\n scenes.forEach((scene, i) => {\n const overlapIn = i > 0 ? transitionOverlapFrames(scenes[i - 1], scene, fps) : 0\n offset -= overlapIn\n const durationInFrames = sceneDurationFrames(scene, fps)\n out.push({ start: offset, durationInFrames, overlapIn })\n offset += durationInFrames\n })\n return out\n}\n\n/** The composition's total length in frames (scene durations minus overlaps). */\nexport function totalFrames(payload: CompositionPayload, fps: number): number {\n let total = 0\n let prev: Scene | undefined\n for (const scene of payload.scenes) {\n total -= transitionOverlapFrames(prev, scene, fps)\n total += sceneDurationFrames(scene, fps)\n prev = scene\n }\n return Math.max(1, total)\n}\n","//! Inspector constants — every threshold the checks measure against, with its\n//! source. Research-backed values cite the standard/paper; the rest are marked\n//! PRODUCT DECISION (ours to tune, no external authority).\n\n// ── Contrast (WCAG 2.x SC 1.4.3 — Contrast (Minimum), Level AA) ───────────────\n// https://www.w3.org/WAI/WCAG22/Understanding/contrast-minimum\n// Text needs a contrast ratio ≥ 4.5:1 against what's behind it, except \"large\n// scale\" text which needs ≥ 3:1. Large scale = ≥18pt regular, or ≥14pt bold.\n// At the CSS reference 96dpi, 1pt = 4/3 px → 18pt = 24px, 14pt ≈ 18.67px.\n\n/** Minimum contrast ratio for body-size text (WCAG 2.x SC 1.4.3 AA). */\nexport const CONTRAST_MIN_BODY = 4.5\n/** Minimum contrast ratio for large text (WCAG 2.x SC 1.4.3 AA). */\nexport const CONTRAST_MIN_LARGE = 3\n/** \"Large text\" floor for regular weight: 18pt × (4/3 px/pt) = 24px. */\nexport const LARGE_TEXT_PX = 24\n/** \"Large text\" floor for bold (≥700) weight: 14pt × (4/3 px/pt) ≈ 18.67px. */\nexport const LARGE_TEXT_BOLD_PX = (14 * 4) / 3\n/** Font weight WCAG counts as bold. */\nexport const BOLD_WEIGHT = 700\n\n// ── Reading time ──────────────────────────────────────────────────────────────\n// The spec formula was `max(1.2s, 0.18s × words + 0.6s)` — 0.18 s/word ≈ 333 wpm,\n// FASTER than any research supports, so the per-word constant is adjusted:\n// - BBC Subtitle Guidelines: 160–180 wpm (0.33–0.375 s/word), minimum dwell\n// ~0.3 s/word — https://www.bbc.co.uk/accessibility/forproducts/guides/subtitles\n// (via https://www.clevercast.com/bbc-subtitling-guidelines/)\n// - Brysbaert 2019 meta-analysis (190 studies, n=18,573): adults silently read\n// non-fiction at ~238 wpm ≈ 0.252 s/word — J. Memory & Language 109, 104047.\n// - legibility.info \"Rules for text in videos\": dwell 1s per 13 characters.\n// On-screen graphic titles are short, predictable, and not competing with\n// dialogue (unlike subtitles), so we anchor on the Brysbaert mean rather than\n// the stricter BBC subtitle floor: 0.25 s/word (240 wpm). The 0.6s orientation\n// constant and 1.2s minimum are PRODUCT DECISIONS (the orientation beat covers\n// saccade + entrance animation; BBC's own example floor is 1.2s for 4 words).\n\n/** Seconds of display per word (240 wpm — Brysbaert 2019 silent-reading mean). */\nexport const READ_SECONDS_PER_WORD = 0.25\n/** Fixed orientation beat: find the text + ride out its entrance. PRODUCT DECISION. */\nexport const READ_ORIENTATION_SECONDS = 0.6\n/** Absolute floor for any readable text. PRODUCT DECISION (BBC-consistent). */\nexport const READ_MIN_SECONDS = 1.2\n\n/** Seconds a text of `wordCount` words must stay visible:\n * `max(1.2, 0.25 × words + 0.6)`. */\nexport function readingTimeSeconds(wordCount: number): number {\n return Math.max(READ_MIN_SECONDS, READ_SECONDS_PER_WORD * wordCount + READ_ORIENTATION_SECONDS)\n}\n\n// ── Formats + safe areas ──────────────────────────────────────────────────────\n\n/** The delivery formats the inspector knows safe areas for. */\nexport type FormatId = '16:9' | '9:16' | '1:1' | '4:5'\n\n/** Per-side safe-area inset as a FRACTION of the canvas axis. */\nexport interface SafeAreaPreset {\n top: number\n bottom: number\n left: number\n right: number\n}\n\n// px → fraction helpers against the canonical 1080×1920 social canvas.\nconst v1920 = (px: number): number => px / 1920\nconst h1080 = (px: number): number => px / 1080\n\n/** Safe-area presets per format.\n *\n * - `16:9` — EBU R95 / SMPTE ST 2046-1 GRAPHICS-safe for 16:9 TV: 5% vertical,\n * 10% horizontal (action-safe is 3.5%; graphics/title content uses the\n * stricter band) — https://tech.ebu.ch/publications/r095.\n * - `9:16` — the UNION of the three vertical-social UI overlays at 1080×1920,\n * so one preset clears TikTok + Instagram Reels + YouTube Shorts\n * (per-platform 2025/26 overlay guides — kreatli.com/guides/safe-zone-guide,\n * zeely.ai/blog/tiktok-safe-zones):\n * · TikTok: top ~140px (profile bar), bottom ~324px (caption/sound, ~370px\n * with an ad CTA), right ~164px (like/comment/share rail), left ~60px.\n * · Reels: top ~108–220px, bottom ~320–420px (caption + CTA), right ~120px.\n * · Shorts: top ~180px, bottom ~390px (channel + CTA), right ~120px.\n * Union: top 220 / bottom 420 / left 60 / right 164 px.\n * - `1:1`, `4:5` — feed placements; platforms overlay far less UI in-feed, but\n * Meta crops covers and overlays the caption/CTA strip at the bottom.\n * PRODUCT DECISION informed by the 9:16 research (no platform publishes\n * feed-overlay pixel specs). */\nexport const SAFE_AREAS: Record<FormatId, SafeAreaPreset> = {\n '16:9': { top: 0.05, bottom: 0.05, left: 0.1, right: 0.1 },\n '9:16': { top: v1920(220), bottom: v1920(420), left: h1080(60), right: h1080(164) },\n '1:1': { top: 0.05, bottom: 0.1, left: 0.06, right: 0.06 },\n '4:5': { top: 0.05, bottom: 0.12, left: 0.06, right: 0.06 },\n}\n\n/** Nearest known format for a canvas size (by aspect-ratio distance). */\nexport function inferFormat(width: number, height: number): FormatId {\n const ratio = width / height\n const known: [FormatId, number][] = [\n ['16:9', 16 / 9],\n ['9:16', 9 / 16],\n ['1:1', 1],\n ['4:5', 4 / 5],\n ]\n let best: FormatId = '16:9'\n let bestD = Number.POSITIVE_INFINITY\n for (const [id, r] of known) {\n const d = Math.abs(Math.log(ratio / r)) // log distance — symmetric in ratio space\n if (d < bestD) {\n bestD = d\n best = id\n }\n }\n return best\n}\n\n// ── Font-size floors ─────────────────────────────────────────────────────────\n// legibility.info \"Rules for text in videos\": for full-HD video in full-screen\n// on an average smartphone, body text needs a \"minimum font size of 40 to 60\n// pixels\" (titles ≥50% larger) — https://legibility.info/rules-for-text-in-videos.\n// Vertical/feed formats are phone-first → the 40px floor applies. 16:9 is\n// desktop/TV-first where the frame fills more of the visual field; 28px is a\n// PRODUCT DECISION anchored between WCAG's 24px large-text line and the mobile\n// floor. Floors are defined at a 1080 min-dimension and scale linearly.\n\n/** Minimum body font size in px AT a 1080 min-dimension canvas, per format. */\nexport const FONT_FLOOR_PX: Record<FormatId, number> = {\n '16:9': 28,\n '9:16': 40,\n '1:1': 40,\n '4:5': 40,\n}\n/** The min(width,height) the floors are defined at. */\nexport const FONT_FLOOR_REFERENCE_DIM = 1080\n\n/** The font floor in px for a format on an actual canvas. */\nexport function fontFloorPx(format: FormatId, width: number, height: number): number {\n return (FONT_FLOOR_PX[format] * Math.min(width, height)) / FONT_FLOOR_REFERENCE_DIM\n}\n\n// ── Motion timing ─────────────────────────────────────────────────────────────\n\n/** Two FOCAL entrances beginning within this window compete for one attention\n * slot. Backed by the attentional-blink literature: a second target appearing\n * 200–500ms after a first is frequently missed outright (Raymond, Shapiro &\n * Arnell 1992; review: Dux & Marois 2009, Atten Percept Psychophys 71:1683).\n * 250ms sits inside that window. */\nexport const FOCAL_COLLISION_WINDOW_SECONDS = 0.25\n\n/** Scene-transition duration budget. Material Design caps complex multi-element\n * transitions at 500–700ms and finds >400ms \"too slow\" for simple ones\n * (https://m2.material.io/design/motion/speed.html); film dissolves run longer,\n * so 0.6s — inside Material's complex band — is the PRODUCT DECISION budget. */\nexport const TRANSITION_BUDGET_SECONDS = 0.6\n\n// ── Density budgets (PRODUCT DECISIONS — see Miller-span/working-memory lore,\n// but no citable on-screen standard exists) ───────────────────────────────────\n\n/** Max non-ambient entries visible at once in a scene. */\nexport const DENSITY_MAX_NON_AMBIENT = 5\n/** Max FOCAL entries visible at once (one thing to look at). */\nexport const DENSITY_MAX_FOCAL = 1\n","//! `timing.collisions` — attention can't be in two places at once.\n//!\n//! Three measurements:\n//! 1. Two FOCAL entrances beginning within the 250ms attention window\n//! (attentional blink: a second target 200–500ms after a first is routinely\n//! missed — Raymond, Shapiro & Arnell 1992; see constants.ts).\n//! 2. An entrance whose settle (the `@onda-engine/components` settleTime registry —\n//! the same formulas the components run) outlives the entry's visible\n//! window: the move is cut off mid-flight.\n//! 3. A scene transition longer than the 0.6s budget.\n\nimport { manifestEntry, settleTime } from '@onda-engine/components'\nimport { FOCAL_COLLISION_WINDOW_SECONDS, TRANSITION_BUDGET_SECONDS } from './constants.js'\nimport type { Check, Violation } from './report.js'\n\nconst secs = (frames: number, fps: number): string =>\n `${(Math.round((frames / fps) * 100) / 100).toString()}s`\n\nexport const checkCollisions: Check = (ctx) => {\n const { resolved } = ctx\n const { fps } = resolved\n const violations: Violation[] = []\n\n // 1. Focal entrances within the collision window (absolute frames, so\n // cross-cut overlaps during a transition count too).\n const windowFrames = FOCAL_COLLISION_WINDOW_SECONDS * fps\n const focal = resolved.entries\n .filter((e) => e.role === 'focal' && e.visibleFrames > 0)\n .sort((a, b) => a.absStart - b.absStart)\n for (let i = 1; i < focal.length; i++) {\n const a = focal[i - 1]\n const b = focal[i]\n if (!a || !b) continue\n const gap = b.absStart - a.absStart\n if (gap <= windowFrames) {\n violations.push({\n check: 'timing.collisions',\n severity: 'warn',\n targetId: b.targetId,\n sceneId: b.sceneId,\n message: `focal entrances collide: \"${a.targetId}\" and \"${b.targetId}\" begin ${secs(gap, fps)} apart (≤${FOCAL_COLLISION_WINDOW_SECONDS}s — inside the attention window; stagger them or demote one to 'support')`,\n })\n }\n }\n\n // 2. Entrance settles after the cut.\n for (const entry of resolved.entries) {\n const settle = settleTime(entry.component, entry.adapted, fps)\n if (settle === null || entry.visibleFrames <= 0) continue\n if (settle > entry.visibleFrames) {\n const fitsViaClamp = manifestEntry(entry.component)?.props.some((p) => p.name === 'fitToClip')\n violations.push({\n check: 'timing.collisions',\n severity: 'warn',\n targetId: entry.targetId,\n sceneId: entry.sceneId,\n message: `${entry.component}'s entrance settles at ${secs(settle, fps)} but it is only on screen for ${secs(entry.visibleFrames, fps)} — the move is cut off mid-flight`,\n // Mechanical: the component's own envelope clamp, when it has one.\n fix: fitsViaClamp ? { prop: 'fitToClip', suggested: true } : undefined,\n })\n }\n }\n\n // 3. Transition budget.\n const budgetFrames = Math.round(TRANSITION_BUDGET_SECONDS * fps)\n for (const t of resolved.transitions) {\n if (t.durationInFrames > budgetFrames) {\n violations.push({\n check: 'timing.collisions',\n severity: 'warn',\n targetId: t.sceneId,\n sceneId: t.sceneId,\n message: `\"${t.type}\" transition into \"${t.sceneId}\" runs ${secs(t.durationInFrames, fps)} — over the ${TRANSITION_BUDGET_SECONDS}s budget (both scenes read as mush for the whole overlap)`,\n fix: { prop: 'transition.durationInFrames', suggested: budgetFrames },\n })\n }\n }\n\n return violations\n}\n","//! `density.score` — how much is on screen at once, per scene?\n//!\n//! An event sweep over entry visible windows finds each scene's PEAK count of\n//! concurrently visible non-ambient entries (and focal entries). Budgets:\n//! ≤5 non-ambient, ≤1 focal (see constants.ts — product decisions). The peaks\n//! are always reported on the InspectReport; violations fire over budget.\n\nimport { DENSITY_MAX_FOCAL, DENSITY_MAX_NON_AMBIENT } from './constants.js'\nimport type { Check, SceneDensity, Violation } from './report.js'\nimport type { ResolvedComposition } from './resolve.js'\n\n/** Sweep one scene's entries → its density peaks. */\nfunction sceneDensity(resolved: ResolvedComposition, sceneIndex: number): SceneDensity {\n const sceneId = resolved.scenes[sceneIndex]?.scene.id ?? `scene-${sceneIndex}`\n // Boundary events in scene-local frames: +1 at visible start, -1 at end.\n const events: { frame: number; nonAmbient: number; focal: number }[] = []\n for (const e of resolved.entries) {\n if (e.sceneIndex !== sceneIndex || e.visibleFrames <= 0) continue\n const nonAmbient = e.role === 'ambient' ? 0 : 1\n const focalDelta = e.role === 'focal' ? 1 : 0\n events.push({ frame: e.localStart, nonAmbient, focal: focalDelta })\n events.push({\n frame: e.localStart + e.visibleFrames,\n nonAmbient: -nonAmbient,\n focal: -focalDelta,\n })\n }\n // Ends sort before starts at the same frame (`[start, end)` windows don't touch).\n events.sort((a, b) => a.frame - b.frame || a.nonAmbient - b.nonAmbient)\n let nonAmbient = 0\n let focal = 0\n let peakNonAmbient = 0\n let peakFocal = 0\n let peakFrame = 0\n for (const ev of events) {\n nonAmbient += ev.nonAmbient\n focal += ev.focal\n if (nonAmbient > peakNonAmbient) {\n peakNonAmbient = nonAmbient\n peakFrame = ev.frame\n }\n if (focal > peakFocal) peakFocal = focal\n }\n return { sceneId, peakNonAmbient, peakFocal, peakFrame }\n}\n\n/** All scenes' density metrics (the report carries these regardless of budget). */\nexport function densityMetrics(resolved: ResolvedComposition): SceneDensity[] {\n return resolved.scenes.map((_, i) => sceneDensity(resolved, i))\n}\n\nexport const checkDensity: Check = (ctx) => {\n const violations: Violation[] = []\n for (const d of densityMetrics(ctx.resolved)) {\n if (d.peakNonAmbient > DENSITY_MAX_NON_AMBIENT) {\n violations.push({\n check: 'density.score',\n severity: 'warn',\n targetId: d.sceneId,\n sceneId: d.sceneId,\n message: `scene \"${d.sceneId}\" peaks at ${d.peakNonAmbient} concurrently visible non-ambient entries (frame ${d.peakFrame}, scene-local) — budget is ${DENSITY_MAX_NON_AMBIENT}; cut, stagger, or mark atmosphere 'ambient'`,\n })\n }\n if (d.peakFocal > DENSITY_MAX_FOCAL) {\n violations.push({\n check: 'density.score',\n severity: 'warn',\n targetId: d.sceneId,\n sceneId: d.sceneId,\n message: `scene \"${d.sceneId}\" shows ${d.peakFocal} focal entries at once — only ${DENSITY_MAX_FOCAL} thing can be THE thing; demote the rest to 'support'`,\n })\n }\n }\n return violations\n}\n","//! `frames.transitionCapture` — don't thumbnail a frame that's mid-transition.\n//!\n//! Given `opts.frames` (the indices a consumer intends to capture), flag any\n//! that land inside a transition's overlap window — those frames show two\n//! scenes blended. The fix is mechanical: the nearest frame outside the window.\n\nimport type { Check, Violation } from './report.js'\n\nexport const checkTransitionCapture: Check = (ctx) => {\n const frames = ctx.opts.frames\n if (!frames || frames.length === 0) return []\n const { resolved } = ctx\n const violations: Violation[] = []\n\n for (const f of frames) {\n const hit = resolved.transitions.find((t) => f >= t.start && f < t.start + t.durationInFrames)\n if (!hit) continue\n // Nearest frame outside the window, clamped to the composition.\n const before = hit.start - 1\n const after = hit.start + hit.durationInFrames\n const candidates = [before, after].filter((c) => c >= 0 && c < resolved.totalFrames)\n const suggested =\n candidates.length > 0\n ? candidates.reduce((best, c) => (Math.abs(c - f) < Math.abs(best - f) ? c : best))\n : f\n violations.push({\n check: 'frames.transitionCapture',\n severity: 'warn',\n targetId: hit.sceneId,\n sceneId: hit.sceneId,\n message: `frame ${f} lands inside the \"${hit.type}\" transition into \"${hit.sceneId}\" (frames ${hit.start}–${hit.start + hit.durationInFrames - 1}) — it captures two scenes blended`,\n fix: { prop: 'frames', suggested },\n })\n }\n return violations\n}\n","//! WCAG color math — hex parsing, relative luminance, contrast ratio.\n//!\n//! Formulas from WCAG 2.x: relative luminance per\n//! https://www.w3.org/WAI/GL/wiki/Relative_luminance (sRGB linearization), and\n//! contrast ratio `(L1 + 0.05) / (L2 + 0.05)` per\n//! https://www.w3.org/WAI/WCAG22/Understanding/contrast-minimum (SC 1.4.3).\n//! Engine colors are hex (`#rgb`, `#rrggbb`, `#rrggbbaa`) — anything else is\n//! \"unparseable\" and the caller treats the contrast as unverifiable.\n\n/** An sRGB color, channels 0..1. */\nexport interface Rgb {\n r: number\n g: number\n b: number\n /** Alpha 0..1 (1 when the hex had no alpha channel). */\n a: number\n}\n\n/** Parse `#rgb` / `#rrggbb` / `#rrggbbaa` (case-insensitive). Null otherwise. */\nexport function parseColor(value: unknown): Rgb | null {\n if (typeof value !== 'string') return null\n const s = value.trim()\n if (!s.startsWith('#')) return null\n const hex = s.slice(1)\n if (!/^[0-9a-fA-F]+$/.test(hex)) return null\n if (hex.length === 3) {\n const [r, g, b] = hex\n return {\n r: Number.parseInt(`${r}${r}`, 16) / 255,\n g: Number.parseInt(`${g}${g}`, 16) / 255,\n b: Number.parseInt(`${b}${b}`, 16) / 255,\n a: 1,\n }\n }\n if (hex.length === 6 || hex.length === 8) {\n return {\n r: Number.parseInt(hex.slice(0, 2), 16) / 255,\n g: Number.parseInt(hex.slice(2, 4), 16) / 255,\n b: Number.parseInt(hex.slice(4, 6), 16) / 255,\n a: hex.length === 8 ? Number.parseInt(hex.slice(6, 8), 16) / 255 : 1,\n }\n }\n return null\n}\n\n// sRGB channel → linear-light (the WCAG piecewise curve).\nconst linearize = (c: number): number => (c <= 0.04045 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4)\n\n/** WCAG relative luminance of an sRGB color (0 = black, 1 = white). */\nexport function relativeLuminance(c: Rgb): number {\n return 0.2126 * linearize(c.r) + 0.7152 * linearize(c.g) + 0.0722 * linearize(c.b)\n}\n\n/** WCAG contrast ratio between two colors — 1:1 (identical) to 21:1 (B/W). */\nexport function contrastRatio(a: Rgb, b: Rgb): number {\n const la = relativeLuminance(a)\n const lb = relativeLuminance(b)\n const [hi, lo] = la >= lb ? [la, lb] : [lb, la]\n return (hi + 0.05) / (lo + 0.05)\n}\n","//! Resolve a composition payload to the FRAME timeline the checks measure on —\n//! the same resolution `buildComposition` performs (shared `scenePlacements` +\n//! `toFrames` + `adaptProps`), minus the React tree. Every entry gets absolute\n//! start/visible frames, its effective (size-role-resolved) props, and its\n//! attention role.\n\nimport { adaptProps } from '../props.js'\nimport { scenePlacements, toFrames, totalFrames } from '../timing.js'\nimport type { CompositionPayload, Entry, EntryRole, LayerEntry, Scene } from '../types.js'\n\n/** A scene with its absolute timeline placement (frames). */\nexport interface ResolvedScene {\n scene: Scene\n index: number\n /** Absolute start frame (= the start of its incoming transition overlap). */\n start: number\n durationInFrames: number\n}\n\n/** One entry resolved onto the absolute timeline. */\nexport interface ResolvedEntry {\n /** `'scene'` = a track entry; `'layer'` = a composition-level layer entry. */\n kind: 'scene' | 'layer'\n component: string\n /** Raw payload props. */\n props: Record<string, unknown>\n /** Effective props after the Studio→engine translation (size roles → px,\n * prop-name aliases) — what the component actually receives. */\n adapted: Record<string, unknown>\n /** Attention role; absent = `'support'` (the contract on `Entry.role`). */\n role: EntryRole\n /** `entry.id` when present, else the payload path (stable + addressable). */\n targetId: string\n /** Payload path (`scenes[0].tracks[1].entries[2]`). */\n path: string\n sceneId?: string\n sceneIndex?: number\n trackIndex?: number\n entryIndex?: number\n /** Start frame: scene-local for scene entries, absolute for layer entries. */\n localStart: number\n /** Absolute start frame on the composition timeline. */\n absStart: number\n /** Requested duration in frames. */\n durationInFrames: number\n /** Frames actually on screen: duration clamped to the scene window (scene\n * entries) / composition end (layer entries). */\n visibleFrames: number\n /** Layer entries only: `true` = renders UNDER the scene spine (a background). */\n under?: boolean\n raw: Entry | LayerEntry\n}\n\n/** A transition's absolute capture window. */\nexport interface TransitionWindow {\n /** Index of the scene the transition leads INTO. */\n sceneIndex: number\n sceneId: string\n type: string\n /** Absolute first frame of the overlap. */\n start: number\n /** Effective overlap length in frames (after the ⅓-of-shorter-scene clamp). */\n durationInFrames: number\n}\n\n/** The payload resolved to frames — everything the checks consume. */\nexport interface ResolvedComposition {\n payload: CompositionPayload\n fps: number\n width: number\n height: number\n totalFrames: number\n scenes: ResolvedScene[]\n /** Scene (track) entries. */\n entries: ResolvedEntry[]\n /** Composition-level layer entries (absolute-timed). */\n layerEntries: ResolvedEntry[]\n transitions: TransitionWindow[]\n}\n\n/** Resolve `payload` the way `buildComposition` does (same helpers), producing\n * the measurable timeline model. Assumes a structurally valid payload — run\n * `validateComposition` first for structural diagnostics. */\nexport function resolveComposition(payload: CompositionPayload): ResolvedComposition {\n const fps = payload.fps > 0 ? payload.fps : 30\n const { width, height } = payload\n const scenesIn = payload.scenes ?? []\n const placements = scenePlacements(scenesIn, fps)\n const total = totalFrames(payload, fps)\n\n const scenes: ResolvedScene[] = scenesIn.map((scene, index) => ({\n scene,\n index,\n start: placements[index]?.start ?? 0,\n durationInFrames: placements[index]?.durationInFrames ?? 1,\n }))\n\n const transitions: TransitionWindow[] = []\n scenesIn.forEach((scene, i) => {\n const overlap = placements[i]?.overlapIn ?? 0\n if (i > 0 && scene.transition && overlap > 0) {\n transitions.push({\n sceneIndex: i,\n sceneId: scene.id,\n type: scene.transition.type,\n start: placements[i]?.start ?? 0,\n durationInFrames: overlap,\n })\n }\n })\n\n const entries: ResolvedEntry[] = []\n for (const { scene, index: si, start: sceneStart, durationInFrames: sceneDur } of scenes) {\n scene.tracks?.forEach((track, ti) => {\n track.entries.forEach((entry, ei) => {\n const path = `scenes[${si}].tracks[${ti}].entries[${ei}]`\n const localStart = toFrames(entry.at, fps)\n const dur = toFrames(entry.for, fps)\n const visibleEnd = Math.min(localStart + dur, sceneDur)\n entries.push({\n kind: 'scene',\n component: entry.component,\n props: entry.props ?? {},\n adapted: adaptProps(entry.component, entry.props, width, height),\n role: entry.role ?? 'support',\n targetId: entry.id ?? path,\n path,\n sceneId: scene.id,\n sceneIndex: si,\n trackIndex: ti,\n entryIndex: ei,\n localStart,\n absStart: sceneStart + localStart,\n durationInFrames: dur,\n visibleFrames: Math.max(0, visibleEnd - localStart),\n raw: entry,\n })\n })\n })\n }\n\n const layerEntries: ResolvedEntry[] = []\n payload.layers?.forEach((layer, li) => {\n layer.entries.forEach((entry, ei) => {\n const path = `layers[${li}].entries[${ei}]`\n const from = toFrames(entry.at ?? 0, fps)\n const dur = entry.for != null ? toFrames(entry.for, fps) : Math.max(1, total - from)\n layerEntries.push({\n kind: 'layer',\n component: entry.component,\n props: entry.props ?? {},\n adapted: adaptProps(entry.component, entry.props, width, height),\n role: 'support',\n targetId: entry.id ?? path,\n path,\n localStart: from,\n absStart: from,\n durationInFrames: dur,\n visibleFrames: Math.max(0, Math.min(from + dur, total) - from),\n under: Boolean(layer.under),\n raw: entry,\n })\n })\n })\n\n return {\n payload,\n fps,\n width,\n height,\n totalFrames: total,\n scenes,\n entries,\n layerEntries,\n transitions,\n }\n}\n\n/** Do two absolute frame windows `[aStart, aStart+aLen)` / `[bStart, bStart+bLen)`\n * overlap? */\nexport function windowsOverlap(\n aStart: number,\n aLen: number,\n bStart: number,\n bLen: number,\n): boolean {\n return aStart < bStart + bLen && bStart < aStart + aLen\n}\n","//! Text extraction — what does this entry SAY, at what size, in what color?\n//!\n//! Driven by the `@onda-engine/components` manifest (per-prop semantic roles), so the\n//! inspector knows each component's text props + defaults without hardcoding\n//! eighty dialects. A `TextBlock` is one string a viewer reads: content +\n//! resolved px font size + resolved color + the measurement options needed to\n//! reproduce the component's own metrics.\n\nimport { type ManifestEntry, type PropMeta, manifestEntry } from '@onda-engine/components'\nimport type { ResolvedEntry } from './resolve.js'\n\n/** Brand-resolved theme colors the blocks fall back to. */\nexport interface InspectTheme {\n text: string\n textMuted: string\n background: string\n}\n\n/** One readable string on an entry. */\nexport interface TextBlock {\n /** The prop carrying the string (`title`, `text`, …). */\n textProp: string\n content: string\n /** Resolved px font size (explicit > manifest default > 48). */\n fontSize: number\n /** The prop that carries the size — the mechanical `fix` target. */\n sizeProp?: string\n /** Resolved color string, when determinable. */\n color?: string\n /** True when the color came from an explicit prop (vs a theme fallback). */\n colorExplicit: boolean\n fontWeight: number\n fontFamily?: string\n letterSpacing?: number\n /** The component's own auto-fit contract, when it has one. */\n fit?: 'none' | 'frame'\n maxWidth?: number\n}\n\n/** Parse a PropMeta `default` literal (TS source text) to a JS value. */\nexport function parseDefault(literal: string | undefined): unknown {\n if (literal === undefined) return undefined\n const s = literal.trim()\n if (s === 'true') return true\n if (s === 'false') return false\n const n = Number(s)\n if (s !== '' && Number.isFinite(n)) return n\n if (\n (s.startsWith(\"'\") && s.endsWith(\"'\")) ||\n (s.startsWith('\"') && s.endsWith('\"')) ||\n (s.startsWith('`') && s.endsWith('`'))\n )\n return s.slice(1, -1)\n return undefined\n}\n\nconst wordsOf = (s: string): number => s.split(/\\s+/).filter(Boolean).length\n\n/** Total word count across an entry's text blocks. */\nexport function totalWords(blocks: TextBlock[]): number {\n return blocks.reduce((sum, b) => sum + wordsOf(b.content), 0)\n}\n\n// CSS letter-spacing → px ('-0.02em' scales by fontSize; '2px'/number pass).\nfunction letterSpacingPx(value: unknown, fontSize: number): number | undefined {\n if (typeof value === 'number') return value\n if (typeof value !== 'string') return undefined\n const n = Number.parseFloat(value.trim())\n if (!Number.isFinite(n)) return undefined\n return value.trim().endsWith('em') ? n * fontSize : n\n}\n\nfunction propValue(entry: ResolvedEntry, meta: PropMeta | undefined, name: string): unknown {\n const explicit = entry.adapted[name]\n if (explicit !== undefined) return explicit\n return parseDefault(meta?.default)\n}\n\n/** Components whose primary text WRAPS to multiple lines (their `maxWidth` is a\n * canvas fraction, not a px cap) — excluded from single-line overflow math. */\nexport const WRAPPING_COMPONENTS = new Set(['Captions'])\n\n/** `text`-role props that are NOT rendered prose: `charset` is the glyph POOL\n * a reel spins through (SlotMachineRoll / MatrixDecode), never laid out as a\n * line — measuring or \"reading\" it is a false positive. */\nconst NON_READABLE_TEXT_PROPS = new Set(['charset'])\n\n/** The size prop paired with a text prop: `titleSize` for `title`, else the\n * manifest's single `fontSize`-role prop, else none. */\nfunction sizePropFor(m: ManifestEntry, textProp: string): PropMeta | undefined {\n const sizeProps = m.props.filter((p) => p.role === 'fontSize')\n const prefixed = sizeProps.find(\n (p) => p.name === `${textProp}Size` || p.name === `${textProp}FontSize`,\n )\n if (prefixed) return prefixed\n if (textProp === 'text' || sizeProps.length === 1)\n return sizeProps.find((p) => p.name === 'fontSize') ?? sizeProps[0]\n return undefined\n}\n\n/** The color prop paired with a text prop: `titleColor` for `title`, else the\n * bare `color` prop for the primary `text`. */\nfunction colorPropFor(m: ManifestEntry, textProp: string): PropMeta | undefined {\n const colorProps = m.props.filter((p) => p.role === 'color')\n return (\n colorProps.find((p) => p.name === `${textProp}Color`) ??\n (textProp === 'text' || colorProps.length === 1\n ? colorProps.find((p) => p.name === 'color')\n : undefined)\n )\n}\n\n// A themed color prop whose doc names the muted token falls back to textMuted.\nconst MUTED_HINT = /textmuted|muted|dim\\b/i\n\n/** Extract the readable text blocks of an entry, with sizes/colors resolved\n * (explicit props win; manifest defaults and theme tokens fill the gaps).\n * Empty for unknown components or entries with no string text props. */\nexport function textBlocks(entry: ResolvedEntry, theme: InspectTheme): TextBlock[] {\n const m = manifestEntry(entry.component)\n if (!m) return []\n const blocks: TextBlock[] = []\n for (const p of m.props) {\n if (p.role !== 'text' || NON_READABLE_TEXT_PROPS.has(p.name)) continue\n const value = propValue(entry, p, p.name)\n if (typeof value !== 'string' || value.trim() === '') continue\n\n const sizeMeta = sizePropFor(m, p.name)\n const sizeValue = sizeMeta ? propValue(entry, sizeMeta, sizeMeta.name) : undefined\n const fontSize = typeof sizeValue === 'number' && sizeValue > 0 ? sizeValue : 48\n\n const colorMeta = colorPropFor(m, p.name)\n const explicitColor = colorMeta ? entry.adapted[colorMeta.name] : undefined\n let color: string | undefined\n let colorExplicit = false\n if (typeof explicitColor === 'string') {\n color = explicitColor\n colorExplicit = true\n } else if (colorMeta?.themeable) {\n color = MUTED_HINT.test(colorMeta.description) ? theme.textMuted : theme.text\n } else {\n color = theme.text\n }\n\n const weightMeta = m.props.find((q) => q.name === 'fontWeight')\n const weightValue = weightMeta ? propValue(entry, weightMeta, 'fontWeight') : undefined\n const familyValue = entry.adapted.fontFamily\n\n const fitValue = entry.adapted.fit\n const maxWidthValue = entry.adapted.maxWidth\n\n blocks.push({\n textProp: p.name,\n content: value,\n fontSize,\n sizeProp: sizeMeta?.name,\n color,\n colorExplicit,\n fontWeight: typeof weightValue === 'number' ? weightValue : 400,\n fontFamily: typeof familyValue === 'string' ? familyValue : undefined,\n letterSpacing: letterSpacingPx(entry.adapted.letterSpacing, fontSize),\n fit: fitValue === 'frame' || fitValue === 'none' ? fitValue : undefined,\n maxWidth: typeof maxWidthValue === 'number' ? maxWidthValue : undefined,\n })\n }\n return blocks\n}\n","//! `text.legibility` — is every readable string big enough and contrasty enough?\n//!\n//! Two measurements per text block:\n//! 1. Font size vs the per-format research floor (legibility.info: 40px body\n//! minimum for full-HD phone-first formats — see constants.ts).\n//! 2. WCAG 2.x contrast of the text color vs what's BEHIND its placement box,\n//! found by walking the z-order beneath the entry: solid fills and gradient\n//! stops are checked analytically (worst stop wins, translucent veils are\n//! alpha-composited); an image/video behind yields an `info` — contrast is\n//! unverifiable analytically.\n\nimport { manifestEntry } from '@onda-engine/components'\nimport type { Brand } from '../types.js'\nimport { type Rgb, contrastRatio, parseColor } from './color.js'\nimport {\n BOLD_WEIGHT,\n CONTRAST_MIN_BODY,\n CONTRAST_MIN_LARGE,\n LARGE_TEXT_BOLD_PX,\n LARGE_TEXT_PX,\n fontFloorPx,\n} from './constants.js'\nimport type { Check, Violation } from './report.js'\nimport type { ResolvedComposition, ResolvedEntry } from './resolve.js'\nimport { windowsOverlap } from './resolve.js'\nimport { parseDefault, textBlocks } from './text.js'\n\n/** Components that cover the whole frame for backdrop purposes. The manifest's\n * `occlusion`/`sceneRole` carry the signal; Scrim is metadata'd\n * `non_occluding` (it doesn't COMPETE for attention) but is literally a\n * full-frame veil, so it's force-included. */\nfunction isCovering(component: string): boolean {\n if (component === 'Scrim') return true\n const m = manifestEntry(component)\n return m?.occlusion === 'full_frame' || m?.sceneRole === 'background'\n}\n\n/** Does the entry place image/video pixels on screen? (Manifest `url`-role\n * prop or the Media category.) */\nfunction isMediaBearing(entry: ResolvedEntry): boolean {\n const m = manifestEntry(entry.component)\n if (!m) return false\n if (m.category === 'Media') return true\n return m.props.some(\n (p) => p.role === 'url' && (p.required || entry.adapted[p.name] !== undefined),\n )\n}\n\n/** The candidate fill colors of a covering entry: every `color`-role prop's\n * explicit value or manifest default (string or string[]). */\nfunction fillColors(entry: ResolvedEntry): Rgb[] {\n const m = manifestEntry(entry.component)\n if (!m) return []\n const out: Rgb[] = []\n for (const p of m.props) {\n if (p.role !== 'color') continue\n const value = entry.adapted[p.name] ?? parseDefault(p.default)\n const candidates = Array.isArray(value) ? value : [value]\n for (const c of candidates) {\n const parsed = parseColor(c)\n if (parsed) out.push(parsed)\n }\n }\n // Scrim's documented default is a white veil (schema carries no literal).\n if (out.length === 0 && entry.component === 'Scrim') {\n const white = parseColor('#ffffff')\n if (white) out.push(white)\n }\n return out\n}\n\n/** A covering entry's overall coverage opacity (its `opacity` prop, default 1). */\nfunction coverOpacity(entry: ResolvedEntry): number {\n const m = manifestEntry(entry.component)\n const meta = m?.props.find((p) => p.name === 'opacity')\n const v = entry.adapted.opacity ?? parseDefault(meta?.default)\n return typeof v === 'number' && v >= 0 && v <= 1 ? v : 1\n}\n\n/** Alpha-composite `top` (with extra `alpha`) over `under`. */\nfunction over(top: Rgb, alpha: number, under: Rgb): Rgb {\n const a = Math.max(0, Math.min(1, alpha * top.a))\n return {\n r: top.r * a + under.r * (1 - a),\n g: top.g * a + under.g * (1 - a),\n b: top.b * a + under.b * (1 - a),\n a: 1,\n }\n}\n\n/** What's behind `target` over its visible window: solid color(s), media, or\n * unknown. Walks the z-order beneath it (same-scene lower tracks / earlier\n * same-track entries, then `under` layers, then the composition background),\n * top-down, compositing translucent veils. */\nexport function backdropFor(\n target: ResolvedEntry,\n resolved: ResolvedComposition,\n): { kind: 'colors'; colors: Rgb[] } | { kind: 'media' } | { kind: 'unknown' } {\n // Beneath-the-target candidates, BOTTOM-up in z.\n const beneath: ResolvedEntry[] = []\n const overlapsTarget = (e: ResolvedEntry): boolean =>\n windowsOverlap(e.absStart, e.visibleFrames, target.absStart, target.visibleFrames)\n for (const e of resolved.layerEntries) {\n if (e.under && overlapsTarget(e)) beneath.push(e)\n }\n if (target.kind === 'scene') {\n for (const e of resolved.entries) {\n if (e.sceneIndex !== target.sceneIndex || !overlapsTarget(e)) continue\n const ti = e.trackIndex ?? 0\n const ei = e.entryIndex ?? 0\n const tTi = target.trackIndex ?? 0\n const tEi = target.entryIndex ?? 0\n if (ti < tTi || (ti === tTi && ei < tEi)) beneath.push(e)\n }\n } else {\n // An overlay layer rides above every scene entry.\n for (const e of resolved.entries) if (overlapsTarget(e)) beneath.push(e)\n }\n\n // Walk TOP-down; collect translucent veils until an opaque backdrop.\n const veils: { colors: Rgb[]; alpha: number }[] = []\n for (let i = beneath.length - 1; i >= 0; i--) {\n const e = beneath[i]\n if (!e || !isCovering(e.component)) continue\n if (isMediaBearing(e)) return { kind: 'media' }\n const colors = fillColors(e)\n if (colors.length === 0) return { kind: 'unknown' }\n const alpha = coverOpacity(e)\n const opaque = alpha >= 0.95 && colors.every((c) => c.a >= 0.95)\n if (opaque) return { kind: 'colors', colors: composite(colors, veils) }\n veils.push({ colors, alpha })\n }\n const bg = parseColor(resolveBackground(resolved.payload.brand))\n if (!bg) return { kind: 'unknown' }\n return { kind: 'colors', colors: composite([bg], veils) }\n}\n\n/** The composition's base background — `brand.bg` else the renderer's literal. */\nexport function resolveBackground(brand: Brand | undefined): string {\n return brand?.bg ?? '#08080a'\n}\n\n// Composite the recorded veils (top-down order) over each base color.\nfunction composite(base: Rgb[], veils: { colors: Rgb[]; alpha: number }[]): Rgb[] {\n let result = base\n for (let i = veils.length - 1; i >= 0; i--) {\n const veil = veils[i]\n if (!veil) continue\n const next: Rgb[] = []\n for (const under of result)\n for (const top of veil.colors) next.push(over(top, veil.alpha, under))\n result = next\n }\n return result\n}\n\n/** WCAG threshold for a text block: 3:1 for large text (≥24px regular /\n * ≥18.67px bold), 4.5:1 otherwise. */\nexport function requiredContrast(fontSize: number, fontWeight: number): number {\n const large =\n fontSize >= LARGE_TEXT_PX || (fontWeight >= BOLD_WEIGHT && fontSize >= LARGE_TEXT_BOLD_PX)\n return large ? CONTRAST_MIN_LARGE : CONTRAST_MIN_BODY\n}\n\nconst fmt = (n: number): string => (Math.round(n * 100) / 100).toString()\n\nexport const checkLegibility: Check = (ctx) => {\n const { resolved, theme, format } = ctx\n const floor = fontFloorPx(format, resolved.width, resolved.height)\n const violations: Violation[] = []\n\n for (const entry of [...resolved.entries, ...resolved.layerEntries]) {\n const blocks = textBlocks(entry, theme)\n if (blocks.length === 0) continue\n\n // 1. Font floor.\n for (const b of blocks) {\n if (b.fontSize < floor) {\n violations.push({\n check: 'text.legibility',\n severity: 'warn',\n targetId: entry.targetId,\n sceneId: entry.sceneId,\n message: `${entry.component} \"${b.textProp}\" is ${fmt(b.fontSize)}px — below the ${fmt(floor)}px ${format} floor (body text on a phone-scale canvas needs ≥${fmt(floor)}px; legibility.info video-text rules)`,\n fix: { prop: b.sizeProp ?? 'fontSize', suggested: Math.ceil(floor) },\n })\n }\n }\n\n // 2. Contrast vs the backdrop.\n const backdrop = backdropFor(entry, resolved)\n if (backdrop.kind === 'media') {\n violations.push({\n check: 'text.legibility',\n severity: 'info',\n targetId: entry.targetId,\n sceneId: entry.sceneId,\n message: `${entry.component} sits over image/video — contrast unverifiable analytically (verify on a rendered frame, or put a Scrim behind it)`,\n })\n continue\n }\n if (backdrop.kind === 'unknown') {\n violations.push({\n check: 'text.legibility',\n severity: 'info',\n targetId: entry.targetId,\n sceneId: entry.sceneId,\n message: `${entry.component}'s backdrop color can't be resolved analytically — contrast unverified`,\n })\n continue\n }\n for (const b of blocks) {\n const textColor = parseColor(b.color)\n if (!textColor) continue\n const required = requiredContrast(b.fontSize, b.fontWeight)\n let worst = Number.POSITIVE_INFINITY\n for (const c of backdrop.colors) worst = Math.min(worst, contrastRatio(textColor, c))\n if (worst < required) {\n violations.push({\n check: 'text.legibility',\n severity: 'error',\n targetId: entry.targetId,\n sceneId: entry.sceneId,\n message: `${entry.component} \"${b.textProp}\" contrast is ${fmt(worst)}:1 against its backdrop — below the WCAG ${fmt(required)}:1 minimum for ${fmt(b.fontSize)}px text (SC 1.4.3)`,\n })\n }\n }\n }\n return violations\n}\n","//! `layout.overflow` — does measured text stay inside the frame and the\n//! format's safe area?\n//!\n//! Width comes from the engine's own text metrics (`measureText`, cosmic-text\n//! via wasm — warm it with `preloadTextMetrics()` in Node for real numbers; the\n//! glyph-count estimate is the documented fallback). Placement resolves through\n//! the shared `resolvePlacement` contract with the measured element size, so\n//! the checked box is where the component actually sits. Entries whose own\n//! `fit`/`maxWidth` auto-fit caps the line are measured at the FITTED size.\n\nimport {\n type Placement,\n fitFontSize,\n fitMaxWidth,\n isPlacement,\n measureText,\n resolvePlacement,\n} from '@onda-engine/components'\nimport type { Check, Violation } from './report.js'\nimport { WRAPPING_COMPONENTS, textBlocks } from './text.js'\n\nexport const checkOverflow: Check = (ctx) => {\n const { resolved, safe, theme, format } = ctx\n const { width, height } = resolved\n const safeRect = {\n left: safe.left * width,\n top: safe.top * height,\n right: width - safe.right * width,\n bottom: height - safe.bottom * height,\n }\n const violations: Violation[] = []\n\n for (const entry of [...resolved.entries, ...resolved.layerEntries]) {\n if (WRAPPING_COMPONENTS.has(entry.component)) continue // wraps, never one long line\n const blocks = textBlocks(entry, theme)\n for (const b of blocks) {\n if (b.content.includes('\\n')) continue // multi-line content stacks, not one line\n const measureOpts = {\n fontFamily: b.fontFamily,\n fontWeight: b.fontWeight,\n letterSpacing: b.letterSpacing,\n }\n // Honor the component's own auto-fit: measure at the size it would land on.\n const cap = fitMaxWidth({ fit: b.fit, maxWidth: b.maxWidth }, width)\n const size =\n cap !== undefined ? fitFontSize(b.content, b.fontSize, cap, measureOpts) : b.fontSize\n const m = measureText(b.content, size, measureOpts)\n if (m.width <= 0) continue\n\n const placement = entry.adapted.placement\n const box = resolvePlacement(\n isPlacement(placement) ? (placement as Placement) : undefined,\n { width, height },\n { width: m.width, height: m.height },\n )\n const x0 = box.originX\n const y0 = box.originY\n const x1 = x0 + m.width\n const y1 = y0 + m.height\n\n const escapesFrame = x0 < 0 || y0 < 0 || x1 > width || y1 > height\n const escapesSafe =\n x0 < safeRect.left || y0 < safeRect.top || x1 > safeRect.right || y1 > safeRect.bottom\n if (!escapesFrame && !escapesSafe) continue\n\n // Mechanical fix: the largest size at which the box sits inside the safe\n // rect AT ITS PLACEMENT — found by reusing the SAME resolve+measure\n // predicate as the check above, not a flat width fit. (Fitting to the raw\n // safe-area WIDTH is wrong for a CENTERED element under ASYMMETRIC safe\n // margins — e.g. 9:16, whose right/bottom band is wider: a centered box\n // bumps the nearer edge first, so a width-only fit still overflows and the\n // agent shrink-loops. Reusing the box-in-rect predicate converges by\n // construction.)\n const boxFitsSafe = (fs: number): boolean => {\n const fm = measureText(b.content, fs, measureOpts)\n const fb = resolvePlacement(\n isPlacement(placement) ? (placement as Placement) : undefined,\n { width, height },\n { width: fm.width, height: fm.height },\n )\n return (\n fb.originX >= safeRect.left &&\n fb.originY >= safeRect.top &&\n fb.originX + fm.width <= safeRect.right &&\n fb.originY + fm.height <= safeRect.bottom\n )\n }\n let lo = 1\n let hi = Math.floor(size)\n let fitted = 0\n while (lo <= hi) {\n const mid = (lo + hi) >> 1\n if (boxFitsSafe(mid)) {\n fitted = mid\n lo = mid + 1\n } else {\n hi = mid - 1\n }\n }\n const fix =\n b.sizeProp && fitted > 0 && fitted < size\n ? { prop: b.sizeProp, suggested: fitted }\n : undefined\n\n violations.push({\n check: 'layout.overflow',\n severity: escapesFrame ? 'error' : 'warn',\n targetId: entry.targetId,\n sceneId: entry.sceneId,\n message: escapesFrame\n ? `${entry.component} \"${b.textProp}\" measures ${Math.round(m.width)}px wide at ${Math.round(size)}px — it escapes the ${width}×${height} frame`\n : `${entry.component} \"${b.textProp}\" measures ${Math.round(m.width)}px wide at ${Math.round(size)}px — outside the ${format} safe area (platform UI / title-safe band)`,\n fix,\n })\n }\n }\n return violations\n}\n","//! `timing.readingTime` — does every text stay up long enough to be read?\n//!\n//! Needed time = `max(1.2s, 0.25s × words + 0.6s)` — see constants.ts for the\n//! research trail (BBC subtitle guidelines, Brysbaert 2019). Measured against\n//! the entry's VISIBLE window (its duration clamped to the scene cut).\n\nimport { readingTimeSeconds } from './constants.js'\nimport type { Check, Violation } from './report.js'\nimport { textBlocks, totalWords } from './text.js'\n\nexport const checkReadingTime: Check = (ctx) => {\n const { resolved, theme } = ctx\n const violations: Violation[] = []\n for (const entry of [...resolved.entries, ...resolved.layerEntries]) {\n if (entry.role === 'ambient') continue // decoration isn't read\n const words = totalWords(textBlocks(entry, theme))\n if (words === 0) continue\n const needed = readingTimeSeconds(words)\n const visible = entry.visibleFrames / resolved.fps\n if (visible >= needed) continue\n const suggested = Math.ceil(needed * 10) / 10\n violations.push({\n check: 'timing.readingTime',\n severity: 'warn',\n targetId: entry.targetId,\n sceneId: entry.sceneId,\n message: `${entry.component} shows ${words} word${words === 1 ? '' : 's'} for ${(Math.round(visible * 100) / 100).toString()}s — ${suggested}s needed to read it (0.25s/word + 0.6s orientation, ≥1.2s)`,\n fix: { prop: 'for', suggested: `${suggested}s` },\n })\n }\n return violations\n}\n","//! The INSPECTOR — deterministic quality metrics over a composition payload.\n//!\n//! `inspect(payload, opts?)` measures the SAME document `validateComposition`\n//! checks and `buildComposition` renders, resolved to frames with the same\n//! helpers, and returns structured violations: legibility (font floors + WCAG\n//! contrast), layout overflow vs per-platform safe areas, reading time, focal\n//! entrance/settle/transition collisions, per-scene density, and\n//! transition-window thumbnail capture. Every threshold lives in\n//! `constants.ts` with its source.\n//!\n//! Where `validateComposition` answers \"will this render?\", `inspect` answers\n//! \"will this read?\" — both deterministic, both agent-correctable.\n//!\n//! Text widths use the engine's cosmic-text metrics; call\n//! `preloadTextMetrics()` (from `@onda-engine/components`) before inspecting in Node\n//! for shaped widths instead of the glyph-count estimate.\n\nimport { defaultTheme } from '@onda-engine/components'\nimport type { CompositionPayload } from '../types.js'\nimport { checkCollisions } from './collisions.js'\nimport { SAFE_AREAS, inferFormat } from './constants.js'\nimport { checkDensity, densityMetrics } from './density.js'\nimport { checkTransitionCapture } from './frames.js'\nimport { checkLegibility } from './legibility.js'\nimport { checkOverflow } from './overflow.js'\nimport { checkReadingTime } from './reading.js'\nimport type {\n Check,\n CheckContext,\n CheckId,\n InspectOptions,\n InspectReport,\n SceneDensity,\n Violation,\n} from './report.js'\nimport { resolveComposition } from './resolve.js'\n\nexport {\n CONTRAST_MIN_BODY,\n CONTRAST_MIN_LARGE,\n DENSITY_MAX_FOCAL,\n DENSITY_MAX_NON_AMBIENT,\n FOCAL_COLLISION_WINDOW_SECONDS,\n FONT_FLOOR_PX,\n type FormatId,\n READ_MIN_SECONDS,\n READ_ORIENTATION_SECONDS,\n READ_SECONDS_PER_WORD,\n SAFE_AREAS,\n type SafeAreaPreset,\n TRANSITION_BUDGET_SECONDS,\n fontFloorPx,\n inferFormat,\n readingTimeSeconds,\n} from './constants.js'\nexport { contrastRatio, parseColor, relativeLuminance, type Rgb } from './color.js'\nexport type {\n Check,\n CheckContext,\n CheckId,\n InspectOptions,\n InspectReport,\n SceneDensity,\n Violation,\n} from './report.js'\nexport {\n type ResolvedComposition,\n type ResolvedEntry,\n type ResolvedScene,\n type TransitionWindow,\n resolveComposition,\n} from './resolve.js'\nexport { type TextBlock, textBlocks, totalWords } from './text.js'\n\n/** The check registry, in the order they run. */\nexport const CHECKS: Record<CheckId, Check> = {\n 'text.legibility': checkLegibility,\n 'layout.overflow': checkOverflow,\n 'timing.readingTime': checkReadingTime,\n 'timing.collisions': checkCollisions,\n 'density.score': checkDensity,\n 'frames.transitionCapture': checkTransitionCapture,\n}\n\n/**\n * Measure a composition payload against the quality checks. Deterministic —\n * the same payload + options always yields the same report. Assumes a\n * structurally valid payload (run `validateComposition` first; `inspect`\n * tolerates but does not re-diagnose structural errors).\n */\nexport function inspect(payload: CompositionPayload, opts: InspectOptions = {}): InspectReport {\n const resolved = resolveComposition(payload)\n const format = opts.format ?? inferFormat(resolved.width, resolved.height)\n const ctx: CheckContext = {\n payload,\n resolved,\n format,\n safe: SAFE_AREAS[format],\n theme: {\n text: payload.brand?.text ?? defaultTheme.text,\n textMuted: payload.brand?.dim ?? defaultTheme.textMuted,\n background: payload.brand?.bg ?? '#08080a',\n },\n opts,\n }\n const violations: Violation[] = []\n for (const check of Object.values(CHECKS)) violations.push(...check(ctx))\n\n const summary = { error: 0, warn: 0, info: 0 }\n for (const v of violations) summary[v.severity]++\n\n const density: SceneDensity[] = densityMetrics(resolved)\n return {\n violations,\n summary,\n format,\n fps: resolved.fps,\n totalFrames: resolved.totalFrames,\n density,\n }\n}\n","//! `@onda-engine/cinema` — turn a timeline composition payload into an `@onda-engine/react`\n//! scene. This is the spec→engine renderer ONDA Studio uses in place of its\n//! Remotion `composition-renderer`: scenes play through a `<TransitionSeries>`,\n//! tracks layer as `<AbsoluteFill>`s, and each entry is a registry component\n//! wrapped in its choreography — applied as numeric `Motion` on a `<Group>`\n//! (the engine transform), not CSS.\n\nimport * as Components from '@onda-engine/components'\nimport type { KeyframeTracks, Motion, Theme } from '@onda-engine/components'\nimport {\n AbsoluteFill,\n Camera,\n Composition,\n Group,\n Rect,\n Scene3D,\n Sequence,\n Text,\n type TransitionPresentation,\n TransitionSeries,\n blur,\n chromaticAberration,\n clipEllipse,\n clipPath,\n clipRect,\n clockWipe,\n crossFade,\n depthPush,\n devicePullback,\n dipToColor,\n expandMorph,\n fade,\n filmBurn,\n flip,\n glassWipe,\n gridPixelate,\n iris,\n linearTiming,\n lumaWipe,\n morph,\n none,\n push,\n slide,\n typeMask,\n useCurrentFrame,\n useVideoConfig,\n whipPan,\n wipe,\n zoom,\n zoomBlur,\n} from '@onda-engine/react'\nimport { type ComponentType, type ReactElement, cloneElement, createElement } from 'react'\nimport { PROP_ALIASES, SELF_ANCHORING, adaptProps, placementOffset } from './props.js'\nimport {\n sceneDurationFrames,\n scenePlacements,\n timeSpecToSeconds,\n toFrames,\n totalFrames,\n transitionOverlapFrames,\n} from './timing.js'\nimport type {\n Brand,\n CameraMove,\n CompositionPayload,\n Entry,\n EntryAnimation,\n EntryClip,\n EntryEffects,\n EntryMatte,\n Scene,\n TimeSpec,\n Track,\n Transform3D,\n} from './types.js'\n\nexport * from './types.js'\nexport {\n type ScenePlacement,\n scenePlacements,\n timeSpecToSeconds,\n toFrames,\n totalFrames,\n} from './timing.js'\n// The inspector — quality metrics (`inspect`) over the same payload.\nexport * from './inspect/index.js'\n\nconst DUR = Components.DURATION\nconst num = (v: unknown, d: number): number => (typeof v === 'number' && Number.isFinite(v) ? v : d)\nconst asDir = (v: unknown): 'up' | 'down' | 'left' | 'right' =>\n v === 'down' || v === 'left' || v === 'right' || v === 'up' ? v : 'up'\n\n// An exit pattern lands in the clip's last `exitDur` frames; a positive `delay`\n// nudges it earlier. Entries play from the clip start (offset 0).\nconst exitStart = (p: Record<string, unknown>, dur: number, exitDur: number): number =>\n Math.max(0, dur - exitDur - num(p.delay, 0))\n\ntype PatternFn = (frame: number, fps: number, p: Record<string, unknown>, dur: number) => Motion\n\n/** Choreography by name — calls the `@onda-engine/components` pattern (returns scene\n * `Motion`). Mirrors Studio's `CHOREOGRAPHY` map but on the engine model. */\nconst CHOREOGRAPHY: Record<string, PatternFn> = {\n // Direct-manipulation keyframe animation (the Studio editor). Shares the sampler\n // with the Keyframes component + Studio preview, so interpolation is identical.\n // Position is an OFFSET from placement (additive); opacity/scale absolute;\n // rotation in degrees.\n keyframes: (frame, _fps, p) => {\n const k = Components.sampleKeyframes(p as KeyframeTracks, frame)\n return {\n opacity: k.opacity,\n x: k.x,\n y: k.y,\n scaleX: k.scale,\n scaleY: k.scale,\n rotation: k.rotation,\n }\n },\n entryFade: (frame, fps, p) =>\n Components.entryFade({\n frame,\n fps,\n delay: num(p.delay, 0),\n durationInFrames: num(p.durationInFrames, DUR.base),\n }),\n entryFadeRise: (frame, fps, p) =>\n Components.entryFadeRise({\n frame,\n fps,\n delay: num(p.delay, 0),\n durationInFrames: num(p.durationInFrames, DUR.base),\n travelPx: num(p.travelPx, 12),\n }),\n entrySlide: (frame, fps, p) =>\n Components.entrySlide({\n frame,\n fps,\n delay: num(p.delay, 0),\n durationInFrames: num(p.durationInFrames, DUR.base),\n direction: asDir(p.direction),\n distance: num(p.distance, 12),\n }),\n entryScale: (frame, fps, p) =>\n Components.entryScale({\n frame,\n fps,\n delay: num(p.delay, 0),\n durationInFrames: num(p.durationInFrames, DUR.base),\n from: num(p.from, 0.9),\n }),\n heroReveal: (frame, fps, p) =>\n Components.heroReveal({\n frame,\n fps,\n delay: num(p.delay, 0),\n durationInFrames: num(p.durationInFrames, DUR.slow),\n travelPx: num(p.travelPx, 16),\n }),\n exitFade: (frame, fps, p, dur) => {\n const ed = num(p.durationInFrames, DUR.fast)\n return Components.exitFade({ frame, fps, delay: exitStart(p, dur, ed), durationInFrames: ed })\n },\n exitFadeFall: (frame, fps, p, dur) => {\n const ed = num(p.durationInFrames, DUR.fast)\n return Components.exitFadeFall({\n frame,\n fps,\n delay: exitStart(p, dur, ed),\n durationInFrames: ed,\n travelPx: num(p.travelPx, 8),\n })\n },\n exitSlide: (frame, fps, p, dur) => {\n const ed = num(p.durationInFrames, DUR.fast)\n return Components.exitSlide({\n frame,\n fps,\n delay: exitStart(p, dur, ed),\n durationInFrames: ed,\n direction: asDir(p.direction),\n distance: num(p.distance, 12),\n })\n },\n exitScale: (frame, fps, p, dur) => {\n const ed = num(p.durationInFrames, DUR.fast)\n return Components.exitScale({ frame, fps, delay: exitStart(p, dur, ed), durationInFrames: ed })\n },\n}\n\nconst REST: Motion = { opacity: 1, x: 0, y: 0, scaleX: 1, scaleY: 1 }\n\n/** Compose every `animate` pattern into one Motion (opacity/scale multiply,\n * translate sums) at the entry-relative `frame`. */\nfunction composeMotion(\n animate: EntryAnimation[] | undefined,\n frame: number,\n fps: number,\n dur: number,\n): Motion {\n let m = REST\n for (const a of animate ?? []) {\n const fn = CHOREOGRAPHY[a.pattern]\n if (!fn) continue\n const r = fn(frame, fps, a.params ?? {}, dur)\n m = {\n opacity: m.opacity * r.opacity,\n x: m.x + r.x,\n y: m.y + r.y,\n scaleX: m.scaleX * r.scaleX,\n scaleY: m.scaleY * r.scaleY,\n rotation: (m.rotation ?? 0) + (r.rotation ?? 0),\n }\n }\n return m\n}\n\n/** Scene transition slugs → engine presentations (defaults). Unknown slugs fall\n * back to cross-fade. The effect transitions (blur/glass-wipe/chromatic/…) are\n * approximated in the presentation layer — no engine filter pass needed. */\ntype TransOpts = Record<string, unknown> | undefined\nconst TRANSITIONS: Record<string, (o?: TransOpts) => TransitionPresentation> = {\n 'cross-fade': () => crossFade(),\n fade: () => fade(),\n slide: (o) => slide(o as never),\n wipe: (o) => wipe(o as never),\n iris: () => iris(),\n flip: () => flip(),\n 'clock-wipe': () => clockWipe(),\n push: (o) => push(o as never),\n zoom: (o) => zoom(o as never),\n 'depth-push': () => depthPush(),\n 'dip-to-color': (o) => dipToColor(o as never),\n none: () => none(),\n // Effect transitions — approximated in the presentation layer (no engine blur).\n blur: () => blur(),\n 'chromatic-aberration': () => chromaticAberration(),\n 'device-pullback': () => devicePullback(),\n 'expand-morph': () => expandMorph(),\n 'glass-wipe': (o) => glassWipe(o as never),\n 'grid-pixelate': (o) => gridPixelate(o as never),\n morph: () => morph(),\n 'type-mask': (o) => typeMask(o as never),\n 'zoom-blur': (o) => zoomBlur(o as never),\n 'whip-pan': (o) => whipPan(o as never),\n 'film-burn': (o) => filmBurn(o as never),\n 'luma-wipe': () => lumaWipe(),\n}\nconst presentationFor = (type: string, options?: TransOpts): TransitionPresentation =>\n (TRANSITIONS[type] ?? crossFade)(options)\n\n// ── Registry ────────────────────────────────────────────────────────────────\n\nexport type Registry = Record<string, ComponentType<Record<string, unknown>>>\n\nconst isComponent = (v: unknown): v is ComponentType<Record<string, unknown>> =>\n typeof v === 'function'\n\n// Slug-derived names (PascalCase of the ondajs/Studio slug) that differ from the\n// `@onda-engine/components` export name. The bridge accepts the slug name so existing\n// agent payloads resolve; the canonical `@onda` name also works.\nconst NAME_ALIASES: Record<string, string> = {\n RgbGlitchText: 'RgbGlitch', // ondajs `rgb-glitch-text` → @onda `RgbGlitch`\n}\n\n/** Default registry: every PascalCase `@onda-engine/components` export (the components),\n * plus slug-name aliases for the few that were renamed in the port. */\nfunction defaultRegistry(): Registry {\n const reg: Registry = {}\n for (const [name, value] of Object.entries(Components)) {\n if (/^[A-Z]/.test(name) && isComponent(value)) {\n reg[name] = value as ComponentType<Record<string, unknown>>\n }\n }\n for (const [alias, target] of Object.entries(NAME_ALIASES)) {\n if (reg[target] && !reg[alias]) reg[alias] = reg[target]\n }\n return reg\n}\n\nfunction errorPlaceholder(name: string): ReactElement {\n return createElement(\n AbsoluteFill,\n { justify: 'center', align: 'center' },\n createElement(\n Text,\n { fontSize: 32, color: '#ff6b6b', fontWeight: 600 },\n `⚠ unknown component: ${name}`,\n ),\n )\n}\n\n// ── Entry / track / scene → @onda-engine/react ──────────────────────────────────────\n\ninterface AnimatedProps {\n component: string\n props?: Record<string, unknown>\n animate?: EntryAnimation[]\n effects?: EntryEffects\n depth?: number\n transform3d?: Transform3D\n matte?: EntryMatte\n clip?: EntryClip\n durationInFrames: number\n registry: Registry\n}\n\n/** Build the `matte`/`clip` node props for an entry: the matte stencil element\n * (built from the registry like a normal entry) + the clip region. */\nfunction matteClipProps(\n matte: EntryMatte | undefined,\n clip: EntryClip | undefined,\n registry: Registry,\n width: number,\n height: number,\n): Record<string, unknown> {\n const out: Record<string, unknown> = {}\n if (matte) {\n const Comp = registry[matte.component]\n if (Comp) {\n out.matte = createElement(Comp, adaptProps(matte.component, matte.props, width, height))\n out.matteMode = matte.mode ?? 'alpha'\n }\n }\n if (clip) {\n out.clip =\n clip.shape === 'ellipse'\n ? clipEllipse(clip.width ?? width, clip.height ?? height)\n : clip.shape === 'path' && clip.data\n ? clipPath(clip.data)\n : clipRect(clip.width ?? width, clip.height ?? height, clip.cornerRadius)\n }\n return out\n}\n\n/** A registry component wrapped in its composed choreography Motion (opacity +\n * translate on the outer group; scale about the canvas centre, matching CSS\n * transform-origin). Per-entry `effects` (bloom/grade/grain/…) + `depth` wrap\n * the component's own subtree as a `<Group>` carrying the engine effect props. */\nfunction AnimatedEntry({\n component,\n props,\n animate,\n effects,\n depth,\n transform3d,\n matte,\n clip,\n durationInFrames,\n registry,\n}: AnimatedProps): ReactElement {\n const frame = useCurrentFrame()\n const { fps, width, height } = useVideoConfig()\n const m = composeMotion(animate, frame, fps, durationInFrames)\n const Comp = registry[component]\n const base = Comp\n ? createElement(Comp, adaptProps(component, props, width, height))\n : errorPlaceholder(component)\n // Per-entry effects + 2.5D depth → a wrapping <Group> (the @onda engine reads\n // these sugar props as scene-graph effects; rendered on Vello in export).\n const fxChild =\n effects || typeof depth === 'number'\n ? createElement(\n Group as ComponentType<Record<string, unknown>>,\n { ...(effects ?? {}), ...(typeof depth === 'number' ? { depth } : {}) },\n base,\n )\n : base\n // Track matte (media-through-type) + clip region.\n const matteChild =\n matte || clip\n ? createElement(\n Group as ComponentType<Record<string, unknown>>,\n matteClipProps(matte, clip, registry, width, height),\n fxChild,\n )\n : fxChild\n // AE-style 3D: wrap in a <Scene3D> (default camera) with the 3D layer carrying\n // position3d / rotation3d / extrude. Inert (pixel-identical) until moved in z.\n const child =\n transform3d && Object.keys(transform3d).length > 0\n ? createElement(\n Scene3D as ComponentType<Record<string, unknown>>,\n {},\n createElement(\n Group as ComponentType<Record<string, unknown>>,\n { ...transform3d },\n matteChild,\n ),\n )\n : matteChild\n const cx = width / 2\n const cy = height / 2\n const [px, py] = SELF_ANCHORING.has(component) ? [0, 0] : placementOffset(props, width, height)\n return createElement(\n Group,\n { x: m.x + px, y: m.y + py, opacity: m.opacity },\n createElement(\n Group,\n { x: cx, y: cy },\n createElement(\n Group,\n { scaleX: m.scaleX, scaleY: m.scaleY, rotation: m.rotation },\n createElement(Group, { x: -cx, y: -cy }, child),\n ),\n ),\n )\n}\n\n/** During a magic-move overlap the matched element is drawn ONCE by the morph\n * layer (above the spine). This window — in the entry's OWN sequence-local frame\n * space — suppresses the underlying instance so it doesn't double. */\ninterface MorphSuppress {\n /** First local frame (inclusive) to hide the entry. */\n from: number\n /** Last local frame (exclusive) to hide the entry. */\n to: number\n}\n\n/** Hide `children` while the (sequence-local) frame is inside `[s.from, s.to)`\n * — the morph layer is drawing this element instead. */\nfunction MorphSuppressGate({\n suppress,\n children,\n}: { suppress: MorphSuppress; children: ReactElement }): ReactElement | null {\n const frame = useCurrentFrame()\n if (frame >= suppress.from && frame < suppress.to) return null\n return children\n}\n\nfunction EntrySlot({\n entry,\n registry,\n suppress,\n}: {\n entry: Track['entries'][number]\n registry: Registry\n /** Hide this entry during a magic-move overlap (window in entry-local frames). */\n suppress?: MorphSuppress\n}): ReactElement {\n const { fps } = useVideoConfig()\n const animated = createElement(AnimatedEntry, {\n component: entry.component,\n props: entry.props,\n animate: entry.animate,\n effects: entry.effects,\n depth: entry.depth,\n transform3d: entry.transform3d,\n matte: entry.matte,\n clip: entry.clip,\n durationInFrames: toFrames(entry.for, fps),\n registry,\n })\n return createElement(\n Sequence,\n { from: toFrames(entry.at, fps), durationInFrames: toFrames(entry.for, fps) },\n // biome-ignore lint/correctness/noChildrenProp: raw createElement props object, not JSX\n suppress ? createElement(MorphSuppressGate, { suppress, children: animated }) : animated,\n )\n}\n\n// Overlay containers MUST be plain <Group>s, not <AbsoluteFill>s. `@onda-engine/react`'s\n// AbsoluteFill is a flex column (it lays children out top-to-bottom), not a\n// Remotion-style absolutely-positioned overlay — so sibling tracks/entries would\n// STACK and consume each other's space instead of overlapping. A plain Group\n// applies no layout, so its children all render at (0,0) and overlay; each leaf\n// component fills the canvas via its own AbsoluteFill. (See buildComposition root\n// for the same fix — a full-frame bg Rect as a flex sibling otherwise eats all\n// the height and the content collapses to nothing → a blank frame.)\n/** A cinematic camera move over a scene — frames the content in an @onda\n * `<Camera>` eased from `move.from` → `move.to` over the scene duration. */\nfunction AnimatedCamera({\n move,\n durationInFrames,\n children,\n}: { move: CameraMove; durationInFrames: number; children: ReactElement }): ReactElement {\n const frame = useCurrentFrame()\n const { width, height } = useVideoConfig()\n const p = durationInFrames > 1 ? Math.min(1, Math.max(0, frame / (durationInFrames - 1))) : 1\n const e = p * p * (3 - 2 * p) // smoothstep ease-in-out\n const from = move.from ?? {}\n const to = move.to ?? {}\n const lerp = (a: number | undefined, b: number | undefined, d: number): number => {\n const av = a ?? d\n const bv = b ?? d\n return av + (bv - av) * e\n }\n return createElement(\n Camera,\n {\n focusX: lerp(from.x, to.x, 0.5) * width,\n focusY: lerp(from.y, to.y, 0.5) * height,\n zoom: lerp(from.zoom, to.zoom, 1),\n rotate: lerp(from.rotate, to.rotate, 0),\n },\n children,\n )\n}\n\nfunction SceneTracks({\n scene,\n registry,\n suppress,\n responsive,\n}: {\n scene: Scene\n registry: Registry\n /** entry → its magic-move suppression window (entry-local frames). */\n suppress?: Map<Entry, MorphSuppress>\n /** `fit:\"responsive\"` re-frame context — re-anchor each entry to the output. */\n responsive?: { design: Components.Box; out: Components.Box }\n}): ReactElement {\n return createElement(\n Group,\n null,\n ...scene.tracks.map((track, ti) =>\n createElement(\n Group,\n { key: track.id ?? `track-${ti}` },\n ...track.entries.map((entry, ei) => {\n const key = entry.id ?? `entry-${ei}`\n const slot = createElement(EntrySlot, { entry, registry, suppress: suppress?.get(entry) })\n if (!responsive) return cloneElement(slot, { key })\n // Magic Resize: full-bleed plates COVER the output; everything else pins its design\n // anchor per-axis and fits — so a background never letterboxes into dead space.\n const t = Components.isFullBleed(entry.props, responsive.design)\n ? Components.responsiveCoverTransform(responsive.design, responsive.out)\n : Components.responsiveEntryTransform(\n Components.entryDesignAnchor(entry.props),\n responsive.design,\n responsive.out,\n )\n if (t.x === 0 && t.y === 0 && t.scale === 1) return cloneElement(slot, { key })\n return createElement(\n Group,\n { key, x: t.x, y: t.y, scaleX: t.scale, scaleY: t.scale },\n slot,\n )\n }),\n ),\n ),\n )\n}\n\n// ── Magic move (matched-element continuity across a cut) ──────────────────────\n//\n// When an entry in scene A and an entry in scene B share a `morphKey`, the element\n// should MORPH its position/scale across the cut (one continuous move) rather than\n// hard-cut/cross-fade — Keynote Magic Move / a matched cut. A TransitionPresentation\n// only sees the WHOLE scene flat, so it can't tween a single element. Instead, during\n// the transition OVERLAP we draw ONE interpolating instance (built from B's entry)\n// ABOVE the spine, and suppress the duplicate in A's tail + B's head so it never\n// doubles. v1 morphs translate + scale (resolved the SAME way the renderer places an\n// entry: placementOffset + canvas centre); opacity holds.\n\n/** An entry's resolved screen TRANSFORM at rest — the pixel translate the renderer\n * applies for its `placement` (matching `AnimatedEntry`'s `placementOffset`) plus a\n * uniform scale. Animation Motion is intentionally NOT baked in: the morph reads\n * the element's settled placement, which is the dominant magic-move signal. */\ninterface MorphTransform {\n x: number\n y: number\n scale: number\n}\n\nfunction entryTransform(entry: Entry, w: number, h: number): MorphTransform {\n const [px, py] = SELF_ANCHORING.has(entry.component) ? [0, 0] : placementOffset(entry.props, w, h)\n const s = entry.props?.scale\n return { x: px, y: py, scale: typeof s === 'number' && Number.isFinite(s) ? s : 1 }\n}\n\n/** A matched magic-move pair: the destination entry (drawn morphing) and the\n * endpoints + absolute overlap window it tweens across. */\ninterface MorphPair {\n /** Built from B (the destination) — same component + props. */\n to: Entry\n from: MorphTransform\n toT: MorphTransform\n /** Absolute frame the overlap (and the morph) starts. */\n overlapStart: number\n /** Overlap length in frames. */\n overlapFrames: number\n}\n\n/** Find which `morphKey`s an entry holds AT a scene boundary, with the entry. A\n * morph only fires for an entry that's actually on-screen at the cut: in scene A\n * the entry must still be live in A's last `overlap` frames; in scene B it must be\n * live in B's first `overlap` frames. */\nfunction morphEntriesAtTail(\n scene: Scene,\n fps: number,\n sceneDur: number,\n overlap: number,\n): Map<string, Entry> {\n const m = new Map<string, Entry>()\n const cutStart = sceneDur - overlap\n for (const track of scene.tracks) {\n for (const e of track.entries) {\n if (!e.morphKey) continue\n const start = toFrames(e.at, fps)\n const end = start + toFrames(e.for, fps)\n // Live during the tail overlap window [cutStart, sceneDur).\n if (start < sceneDur && end > cutStart) m.set(e.morphKey, e)\n }\n }\n return m\n}\n\nfunction morphEntriesAtHead(scene: Scene, fps: number, overlap: number): Map<string, Entry> {\n const m = new Map<string, Entry>()\n for (const track of scene.tracks) {\n for (const e of track.entries) {\n if (!e.morphKey) continue\n const start = toFrames(e.at, fps)\n const end = start + toFrames(e.for, fps)\n // Live during the head overlap window [0, overlap).\n if (start < overlap && end > 0) m.set(e.morphKey, e)\n }\n }\n return m\n}\n\n/** A morphing element above the spine: B's element wrapped in a Group that tweens\n * translate + scale from A's placement to B's over the overlap (smoothstep). */\nfunction MorphLayer({ pair, registry }: { pair: MorphPair; registry: Registry }): ReactElement {\n const frame = useCurrentFrame()\n const { width, height } = useVideoConfig()\n const n = pair.overlapFrames\n const p = n > 1 ? Math.min(1, Math.max(0, frame / (n - 1))) : 1\n const e = p * p * (3 - 2 * p) // smoothstep ease-in-out\n const lerp = (a: number, b: number): number => a + (b - a) * e\n const x = lerp(pair.from.x, pair.toT.x)\n const y = lerp(pair.from.y, pair.toT.y)\n const scale = lerp(pair.from.scale, pair.toT.scale)\n\n const Comp = registry[pair.to.component]\n const base = Comp\n ? createElement(Comp, adaptProps(pair.to.component, pair.to.props, width, height))\n : errorPlaceholder(pair.to.component)\n const cx = width / 2\n const cy = height / 2\n // Translate to the morphed placement, then scale about the canvas centre\n // (matching AnimatedEntry's scale-about-centre pivot).\n return createElement(\n Group,\n { x, y },\n createElement(\n Group,\n { x: cx, y: cy },\n createElement(\n Group,\n { scaleX: scale, scaleY: scale },\n createElement(Group, { x: -cx, y: -cy }, base),\n ),\n ),\n )\n}\n\n/** Plan the magic-move layers for a composition: for each adjacent A→B pair sharing\n * a `morphKey`, an absolute-timed morph layer + the per-entry suppression windows\n * (so the underlying duplicate hides during the overlap). `sceneStart` and\n * `sceneDur` are the per-scene absolute start / duration in frames. */\ninterface MorphPlan {\n /** Absolute-timed morph layers to render above the spine. */\n pairs: MorphPair[]\n /** scene index → (entry → suppression window in that entry's LOCAL frames). */\n suppress: Map<number, Map<Entry, MorphSuppress>>\n}\n\nfunction planMorphs(\n scenes: Scene[],\n fps: number,\n w: number,\n h: number,\n sceneStart: number[],\n sceneDur: number[],\n): MorphPlan {\n const pairs: MorphPair[] = []\n const suppress = new Map<number, Map<Entry, MorphSuppress>>()\n const addSuppress = (sceneIdx: number, entry: Entry, win: MorphSuppress): void => {\n let m = suppress.get(sceneIdx)\n if (!m) {\n m = new Map<Entry, MorphSuppress>()\n suppress.set(sceneIdx, m)\n }\n m.set(entry, win)\n }\n\n for (let i = 1; i < scenes.length; i++) {\n const prev = scenes[i - 1]\n const cur = scenes[i]\n if (!prev || !cur || !cur.transition) continue\n const overlap = transitionOverlapFrames(prev, cur, fps)\n if (overlap <= 0) continue\n const prevDur = sceneDur[i - 1] ?? 0\n const aMap = morphEntriesAtTail(prev, fps, prevDur, overlap)\n if (aMap.size === 0) continue\n const bMap = morphEntriesAtHead(cur, fps, overlap)\n if (bMap.size === 0) continue\n const overlapStart = sceneStart[i] ?? 0 // scene B starts where the overlap begins\n\n for (const [key, aEntry] of aMap) {\n const bEntry = bMap.get(key)\n if (!bEntry) continue\n pairs.push({\n to: bEntry,\n from: entryTransform(aEntry, w, h),\n toT: entryTransform(bEntry, w, h),\n overlapStart,\n overlapFrames: overlap,\n })\n // Suppress A's tail (last `overlap` local frames) and B's head (first\n // `overlap` local frames) so only the morphing instance shows.\n addSuppress(i - 1, aEntry, { from: prevDur - overlap, to: prevDur })\n addSuppress(i, bEntry, { from: 0, to: overlap })\n }\n }\n return { pairs, suppress }\n}\n\n// ── Public API ────────────────────────────────────────────────────────────────\n\nexport interface BuildOptions {\n /** Component lookup. Default: every `@onda-engine/components` component. */\n registry?: Registry\n}\n\nfunction brandToTheme(brand: Brand): Partial<Theme> {\n const t: Partial<Theme> = {}\n if (brand.accent) t.accent = brand.accent\n if (brand.accentSoft) t.accentSoft = brand.accentSoft\n if (brand.text) t.text = brand.text\n if (brand.dim) t.textMuted = brand.dim\n if (brand.bg) t.background = brand.bg\n if (brand.surface) t.surface = brand.surface\n if (brand.border) t.border = brand.border\n if (brand.fontBody) t.fontFamily = brand.fontBody\n if (brand.fontDisplay) t.headingFamily = brand.fontDisplay\n return t\n}\n\n/**\n * Build an `@onda-engine/react` `<Composition>` from a timeline payload. Pass the\n * result to `@onda-engine/render`'s `renderToFile` (export) or `<Player>` (preview).\n */\n/** Scene-level FIT — when a scene declares the canvas its content was AUTHORED for\n * (designWidth/designHeight) and it differs from the output, uniformly scale +\n * center the scene's content to `fit` the output canvas (`contain` = letterbox,\n * `cover` = fill + crop). Lets a 4:3 template scene drop into a 16:9 video with no\n * per-element re-layout. No-op when the fields are absent or already match. */\nfunction fitGroup(scene: Scene, width: number, height: number, child: ReactElement): ReactElement {\n const dw = scene.designWidth\n const dh = scene.designHeight\n const fit = scene.fit\n // `responsive` re-frames each element individually (see SceneTracks) — no uniform\n // scale here. cover/contain stay a single Group around the whole scene.\n if (!dw || !dh || !fit || fit === 'responsive' || (dw === width && dh === height)) return child\n const scale =\n fit === 'contain' ? Math.min(width / dw, height / dh) : Math.max(width / dw, height / dh)\n const x = (width - dw * scale) / 2\n const y = (height - dh * scale) / 2\n return createElement(Group, { x, y, scaleX: scale, scaleY: scale }, child)\n}\n\n/** When a scene opts into `fit:\"responsive\"` and the output differs from its design\n * canvas, the per-element re-frame context SceneTracks needs; else `undefined`\n * (cover/contain/no-fit all skip per-element handling). */\nfunction sceneResponsive(\n scene: Scene,\n width: number,\n height: number,\n): { design: Components.Box; out: Components.Box } | undefined {\n const dw = scene.designWidth\n const dh = scene.designHeight\n if (scene.fit !== 'responsive' || !dw || !dh || (dw === width && dh === height)) return undefined\n return { design: { width: dw, height: dh }, out: { width, height } }\n}\n\nexport function buildComposition(\n payload: CompositionPayload,\n opts: BuildOptions = {},\n): ReactElement {\n const {\n width,\n height,\n fps,\n scenes,\n layers = [],\n brand,\n linear,\n finish,\n motionBlur,\n dof,\n } = payload\n const registry = opts.registry ?? defaultRegistry()\n const total = totalFrames(payload, fps)\n\n // Per-scene absolute start frame + duration — the same placement\n // <TransitionSeries> computes (a scene starts where the previous one ends MINUS\n // its incoming transition overlap). The magic-move planner needs these to time\n // the morph layer to the cut window. `scenePlacements` is the shared resolver\n // (the inspector reads the identical timeline).\n const placements = scenePlacements(scenes, fps)\n const sceneDur = placements.map((p) => p.durationInFrames)\n const sceneStart = placements.map((p) => p.start)\n const morphPlan = planMorphs(scenes, fps, width, height, sceneStart, sceneDur)\n\n const seriesChildren: ReactElement[] = []\n scenes.forEach((scene, i) => {\n if (i > 0 && scene.transition) {\n seriesChildren.push(\n createElement(TransitionSeries.Transition, {\n key: `transition-${i}`,\n presentation: presentationFor(scene.transition.type, scene.transition.options),\n timing: linearTiming({\n durationInFrames: transitionOverlapFrames(scenes[i - 1], scene, fps),\n }),\n }),\n )\n }\n const sceneSuppress = morphPlan.suppress.get(i)\n const responsive = sceneResponsive(scene, width, height)\n seriesChildren.push(\n createElement(\n TransitionSeries.Sequence,\n { key: scene.id, durationInFrames: sceneDur[i] ?? sceneDurationFrames(scene, fps) },\n scene.camera\n ? createElement(AnimatedCamera, {\n move: scene.camera,\n durationInFrames: sceneDur[i] ?? sceneDurationFrames(scene, fps),\n // biome-ignore lint/correctness/noChildrenProp: raw createElement props object, not JSX\n children: fitGroup(\n scene,\n width,\n height,\n createElement(SceneTracks, {\n scene,\n registry,\n suppress: sceneSuppress,\n responsive,\n }),\n ),\n })\n : fitGroup(\n scene,\n width,\n height,\n createElement(SceneTracks, { scene, registry, suppress: sceneSuppress, responsive }),\n ),\n ),\n )\n })\n\n // Magic-move layers: one interpolating instance per matched A→B pair, absolute-\n // timed to the transition overlap and drawn ABOVE the spine.\n const morphLayers: ReactElement[] = morphPlan.pairs.map((pair, i) =>\n createElement(\n Sequence,\n {\n key: `morph-${i}`,\n from: pair.overlapStart,\n durationInFrames: pair.overlapFrames,\n },\n createElement(MorphLayer, { pair, registry }),\n ),\n )\n\n const layerEls = (under: boolean): ReactElement[] =>\n layers\n .filter((l) => Boolean(l.under) === under)\n .flatMap((layer, li) =>\n layer.entries.map((entry, ei) => {\n const from = toFrames(entry.at ?? 0, fps)\n const dur = entry.for != null ? toFrames(entry.for, fps) : Math.max(1, total - from)\n return createElement(\n Sequence,\n { key: `layer-${under ? 'u' : 'o'}-${li}-${ei}`, from, durationInFrames: dur },\n createElement(AnimatedEntry, {\n component: entry.component,\n props: entry.props,\n animate: entry.animate,\n effects: entry.effects,\n depth: entry.depth,\n transform3d: entry.transform3d,\n matte: entry.matte,\n clip: entry.clip,\n durationInFrames: dur,\n registry,\n }),\n )\n }),\n )\n\n // Plain Group, NOT AbsoluteFill: the bg Rect, layers and TransitionSeries must\n // OVERLAY (z-stack at 0,0). AbsoluteFill's flex column would lay the full-height\n // bg Rect first and squeeze everything after it to zero height → blank render.\n const root = createElement(\n Group,\n null,\n createElement(Rect, { width, height, fill: brand?.bg ?? '#08080a' }),\n ...layerEls(true),\n createElement(TransitionSeries, null, ...seriesChildren),\n // Magic-move morph layers ride ABOVE the spine (drawn during the cut overlap).\n ...morphLayers,\n ...layerEls(false),\n )\n const content = brand\n ? createElement(Components.ThemeProvider, { theme: brandToTheme(brand) }, root)\n : root\n\n // Composition-level cinematic finish/dof/motion-blur/linear ride on the root\n // <Composition> — the @onda engine applies them after the comp rasterizes\n // (finish + motionBlur are GPU/export-only).\n return createElement(\n Composition,\n { width, height, fps, durationInFrames: total, linear, finish, motionBlur, dof },\n content,\n )\n}\n\n// ── Validation ──────────────────────────────────────────────────────────────\n\nexport interface Diagnostic {\n /** `error` = won't render correctly (fix it); `warning` = renders, but off or\n * fragile; `info` = an FYI an agent should weigh (e.g. a degraded component). */\n level: 'error' | 'warning' | 'info'\n path: string\n message: string\n}\n\n/** Levenshtein edit distance — for \"did you mean?\" on a misspelled component. */\nfunction editDistance(a: string, b: string): number {\n let prev: number[] = Array.from({ length: b.length + 1 }, (_, j) => j)\n for (let i = 1; i <= a.length; i++) {\n const cur: number[] = [i]\n for (let j = 1; j <= b.length; j++) {\n const cost = a[i - 1] === b[j - 1] ? 0 : 1\n cur[j] = Math.min((prev[j] ?? 0) + 1, (cur[j - 1] ?? 0) + 1, (prev[j - 1] ?? 0) + cost)\n }\n prev = cur\n }\n return prev[b.length] ?? 0\n}\n\n/** The closest registry name to `name` within a typo-level distance, else null. */\nfunction closestComponent(name: string, registry: Registry): string | null {\n let best: string | null = null\n let bestD = Number.POSITIVE_INFINITY\n for (const k of Object.keys(registry)) {\n const d = editDistance(name.toLowerCase(), k.toLowerCase())\n if (d < bestD) {\n bestD = d\n best = k\n }\n }\n return best && bestD <= Math.max(2, Math.floor(name.length / 3)) ? best : null\n}\n\n/** Whether `v` is a well-formed TimeSpec. `timeSpecToSeconds` is lenient (garbage\n * → 0), so the validator checks the shape strictly: a finite number, or a string\n * that's `M:SS` / `<n>ms` / `<n>f` / `<n>s` / a bare number — each numeric part\n * finite. (`isValidTimeSpec(\"soon\")` is false.) */\nfunction isValidTimeSpec(v: TimeSpec): boolean {\n if (typeof v === 'number') return Number.isFinite(v)\n const s = v.trim()\n if (s === '') return false\n const numOk = (x: string): boolean => x.trim() !== '' && Number.isFinite(Number(x))\n if (s.includes(':')) {\n const [m, sec] = s.split(':')\n return numOk(m ?? '') && numOk(sec ?? '')\n }\n if (s.endsWith('ms')) return numOk(s.slice(0, -2))\n if (s.endsWith('f')) return numOk(s.slice(0, -1))\n if (s.endsWith('s')) return numOk(s.slice(0, -1))\n return numOk(s)\n}\n\n// Entry props the BRIDGE itself consumes (every component), beyond what a\n// component's own schema declares: `placement` is read by `placementOffset`,\n// `scale` by the magic-move `entryTransform`.\nconst BRIDGE_PROPS = ['placement', 'scale']\n\n/** The prop names known for `component` — its manifest props + Zod-schema keys\n * + the bridge's Studio-name aliases + the bridge-consumed props — or `null`\n * when the component isn't catalogued (then no unknown-prop check runs). */\nfunction knownPropsFor(component: string): Set<string> | null {\n const m = Components.manifestEntry(component)\n if (!m) return null\n const known = new Set<string>(m.props.map((p) => p.name))\n // The Zod object's shape, in case the schema carries keys the PropMeta lags.\n const shape = (m.schema as unknown as { shape?: Record<string, unknown> }).shape\n if (shape && typeof shape === 'object') for (const k of Object.keys(shape)) known.add(k)\n for (const src of Object.keys(PROP_ALIASES[component] ?? {})) known.add(src)\n for (const k of BRIDGE_PROPS) known.add(k)\n return known\n}\n\n/**\n * Check a payload before rendering — the tight feedback loop an agent (ONDA\n * Studio's MCP) self-corrects against. Flags structural issues, unknown\n * components (with a did-you-mean), unknown patterns/transitions, malformed\n * timing, and — from the fidelity contract — components that are GPU-only,\n * degraded, or imitate a browser feature, so the agent picks engine-native\n * components and avoids surprises. Returns `[]` when the composition is clean.\n *\n * Unknown-props policy: WARN, don't strip. An unknown prop on a known\n * component yields a `warning` diagnostic and the prop is PRESERVED through\n * `buildComposition` (the component ignores what it doesn't know) — never\n * silently dropped. Unknown COMPONENTS stay errors (with a did-you-mean).\n */\nexport function validateComposition(\n payload: CompositionPayload,\n opts: BuildOptions = {},\n): Diagnostic[] {\n const registry = opts.registry ?? defaultRegistry()\n const fidelity = Components.COMPONENT_FIDELITY as\n | Record<\n string,\n { fidelity: string; engineNative: boolean; needsFeature: string | null; backend: string }\n >\n | undefined\n const diags: Diagnostic[] = []\n if (!(payload.fps > 0)) diags.push({ level: 'error', path: 'fps', message: 'fps must be > 0' })\n if (!(payload.width > 0 && payload.height > 0))\n diags.push({ level: 'error', path: 'size', message: 'width/height must be > 0' })\n if (!payload.scenes?.length)\n diags.push({ level: 'error', path: 'scenes', message: 'composition has no scenes' })\n\n const fps = payload.fps > 0 ? payload.fps : 30\n const checkTime = (v: TimeSpec | undefined, path: string, required: boolean): void => {\n if (v === undefined) {\n if (required) diags.push({ level: 'error', path, message: 'missing required time' })\n return\n }\n if (!isValidTimeSpec(v)) {\n diags.push({\n level: 'error',\n path,\n message: `invalid time ${JSON.stringify(v)} — use seconds (e.g. 2) or a spec string (\"2s\", \"500ms\", \"0:02\", \"90f\")`,\n })\n return\n }\n const secs = typeof v === 'number' ? v : timeSpecToSeconds(v, fps)\n if (secs < 0)\n diags.push({ level: 'error', path, message: `time ${JSON.stringify(v)} is negative` })\n }\n\n const checkEntry = (\n e: {\n component: string\n at?: TimeSpec\n for?: TimeSpec\n animate?: EntryAnimation[]\n role?: string\n props?: Record<string, unknown>\n },\n path: string,\n timed: boolean,\n ): void => {\n if (e.role !== undefined && e.role !== 'focal' && e.role !== 'support' && e.role !== 'ambient')\n diags.push({\n level: 'error',\n path: `${path}.role`,\n message: `invalid role ${JSON.stringify(e.role)} — use 'focal' | 'support' | 'ambient' (absent = 'support')`,\n })\n if (!registry[e.component]) {\n const guess = closestComponent(e.component, registry)\n diags.push({\n level: 'error',\n path: `${path}.component`,\n message: `unknown component \"${e.component}\"${guess ? ` — did you mean \"${guess}\"?` : ''}`,\n })\n } else {\n const f = fidelity?.[e.component]\n if (f?.fidelity === 'apes_remotion')\n diags.push({\n level: 'warning',\n path: `${path}.component`,\n message: `\"${e.component}\" imitates a browser-only effect the engine doesn't do natively — it renders a stylized approximation; avoid for hero moments.`,\n })\n else if (f?.fidelity === 'degraded')\n diags.push({\n level: 'info',\n path: `${path}.component`,\n message: `\"${e.component}\" renders an approximation until the engine gains \"${f.needsFeature}\".`,\n })\n if (f?.backend === 'gpu_only')\n diags.push({\n level: 'warning',\n path: `${path}.component`,\n message: `\"${e.component}\" needs the GPU (Vello) backend — it won't render correctly on the CPU reference (e.g. a CPU-verified or no-GPU export).`,\n })\n // Unknown props: warn, don't strip — the prop rides through to the\n // component (which ignores what it doesn't know), and the agent learns\n // the name it probably misspelled.\n const known = knownPropsFor(e.component)\n if (known && e.props) {\n for (const k of Object.keys(e.props)) {\n if (!known.has(k))\n diags.push({\n level: 'warning',\n path: `${path}.props.${k}`,\n message: `unknown prop \"${k}\" on ${e.component} — passed through (the component ignores props it doesn't declare)`,\n })\n }\n }\n }\n // Entries are timed (at/for required); layer entries may omit them.\n checkTime(e.at, `${path}.at`, timed)\n checkTime(e.for, `${path}.for`, timed)\n ;(e.animate ?? []).forEach((a, i) => {\n if (!CHOREOGRAPHY[a.pattern])\n diags.push({\n level: 'warning',\n path: `${path}.animate[${i}]`,\n message: `unknown choreography pattern \"${a.pattern}\" (ignored)`,\n })\n })\n }\n\n payload.scenes?.forEach((scene, si) => {\n if (scene.transition && !TRANSITIONS[scene.transition.type])\n diags.push({\n level: 'warning',\n path: `scenes[${si}].transition`,\n message: `transition \"${scene.transition.type}\" not in the engine yet — falls back to cross-fade`,\n })\n if (!scene.tracks?.length)\n diags.push({ level: 'warning', path: `scenes[${si}].tracks`, message: 'scene has no tracks' })\n scene.tracks?.forEach((track, ti) =>\n track.entries.forEach((e, ei) =>\n checkEntry(e, `scenes[${si}].tracks[${ti}].entries[${ei}]`, true),\n ),\n )\n })\n payload.layers?.forEach((layer, li) =>\n layer.entries.forEach((e, ei) => checkEntry(e, `layers[${li}].entries[${ei}]`, false)),\n )\n return diags\n}\n"]}