@oeave/bakery3 0.2.0 → 0.3.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.
Files changed (46) hide show
  1. package/dist/bake/index.js +3 -3
  2. package/dist/catalog/index.js +1 -1
  3. package/dist/{chunk-KNUAOILG.js → chunk-3T3FJOSD.js} +4 -4
  4. package/dist/{chunk-KNUAOILG.js.map → chunk-3T3FJOSD.js.map} +1 -1
  5. package/dist/{chunk-6FYI6AJM.js → chunk-6FAMQZXB.js} +7 -7
  6. package/dist/{chunk-6FYI6AJM.js.map → chunk-6FAMQZXB.js.map} +1 -1
  7. package/dist/{chunk-QRCT5UGZ.js → chunk-CSSJRP5W.js} +9 -6
  8. package/dist/chunk-CSSJRP5W.js.map +1 -0
  9. package/dist/{chunk-APWUCEEB.js → chunk-EN4ROBYQ.js} +3 -3
  10. package/dist/{chunk-APWUCEEB.js.map → chunk-EN4ROBYQ.js.map} +1 -1
  11. package/dist/{chunk-JFYUDERE.js → chunk-NEK5TBEH.js} +2 -2
  12. package/dist/chunk-NEK5TBEH.js.map +1 -0
  13. package/dist/chunk-OPM2L63B.js +253 -0
  14. package/dist/chunk-OPM2L63B.js.map +1 -0
  15. package/dist/{chunk-UWBP7B54.js → chunk-R5IUPOWI.js} +3 -3
  16. package/dist/{chunk-UWBP7B54.js.map → chunk-R5IUPOWI.js.map} +1 -1
  17. package/dist/{chunk-HNMSWQU7.js → chunk-STRK4SZN.js} +3 -3
  18. package/dist/{chunk-HNMSWQU7.js.map → chunk-STRK4SZN.js.map} +1 -1
  19. package/dist/{chunk-Z7IYVH22.js → chunk-WLEFNUOH.js} +30 -279
  20. package/dist/chunk-WLEFNUOH.js.map +1 -0
  21. package/dist/{chunk-NXBAZGNB.js → chunk-X6GW43EX.js} +3 -3
  22. package/dist/{chunk-NXBAZGNB.js.map → chunk-X6GW43EX.js.map} +1 -1
  23. package/dist/devtools/index.js +7 -6
  24. package/dist/hotspots/index.d.ts +237 -31
  25. package/dist/hotspots/index.js +1013 -118
  26. package/dist/hotspots/index.js.map +1 -1
  27. package/dist/index.d.ts +1 -1
  28. package/dist/index.js +7 -6
  29. package/dist/node/index.cjs +1 -1
  30. package/dist/node/index.cjs.map +1 -1
  31. package/dist/node/index.js +2 -2
  32. package/dist/presets/index.js +2 -2
  33. package/dist/r3f/index.js +9 -8
  34. package/dist/r3f/index.js.map +1 -1
  35. package/dist/{room-FS26KAPQ.js → room-BM7Z7NKG.js} +4 -4
  36. package/dist/{room-FS26KAPQ.js.map → room-BM7Z7NKG.js.map} +1 -1
  37. package/dist/session-NPVBESWA.js +9 -0
  38. package/dist/{session-VCIQEO26.js.map → session-NPVBESWA.js.map} +1 -1
  39. package/dist/tsl/index.d.ts +14 -1
  40. package/dist/tsl/index.js +8 -2
  41. package/dist/tsl/index.js.map +1 -1
  42. package/package.json +1 -1
  43. package/dist/chunk-JFYUDERE.js.map +0 -1
  44. package/dist/chunk-QRCT5UGZ.js.map +0 -1
  45. package/dist/chunk-Z7IYVH22.js.map +0 -1
  46. package/dist/session-VCIQEO26.js +0 -9
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/devtools/dom.ts","../src/devtools/timelinePanel.ts","../src/devtools/devPanel.ts","../src/devtools/sceneVersion.ts","../src/devtools/bakery3Devtools.ts"],"names":["time","report","settings","select","estimate"],"mappings":"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","file":"chunk-QRCT5UGZ.js","sourcesContent":["/**\n * The devtools' shared vocabulary of elements and styles.\n *\n * Everything is an inline style on purpose. The panels drop into any\n * application, and a stylesheet would either be overridden by the host's CSS\n * reset or override theirs. Nothing here inherits and nothing here leaks.\n *\n * The dev panel and the timeline panel both build from this file, so they\n * stay visibly the same object: the same glass, the same monospace, the same\n * pills.\n */\n\n/** Plain string pairs, not `CSSStyleDeclaration`: the DOM type carries\n * read-only members that make every spread of a shared style object an\n * error, and `Object.assign` onto `element.style` takes strings happily. */\nexport type Style = Record<string, string>;\n\n/**\n * The brand's colors, from the logo's own sample field (`HEADER` in\n * packages/logo-generator/avatar.ts): it runs from blue on the left through\n * peach to orange on the right. Blue is the accent (the active tab, the price,\n * a success), orange is where a sweep ends.\n */\nexport const INK = '#06070d';\nexport const BLUE = '#46b8ed';\nexport const PEACH = '#fdc385';\nexport const ORANGE = '#ec9d3c';\n/** BLUE as `r,g,b`, for the translucent fills and glows built on it. */\nexport const BLUE_RGB = '70,184,237';\n/** Progress, left to right, the way the logo reads. */\nexport const SWEEP = `linear-gradient(90deg, ${BLUE}, ${PEACH}, ${ORANGE})`;\n\nexport const CORNERS: Record<string, Style> = {\n 'bottom-right': { right: '16px', bottom: '16px' },\n 'bottom-left': { left: '16px', bottom: '16px' },\n 'top-right': { right: '16px', top: '16px' },\n 'top-left': { left: '16px', top: '16px' },\n};\n\nexport const SHELL: Style = {\n position: 'fixed',\n zIndex: '2147483000',\n width: '380px',\n background: 'rgba(18,18,20,0.92)',\n backdropFilter: 'blur(12px)',\n color: '#f4f4f5',\n borderRadius: '10px',\n border: '1px solid rgba(255,255,255,0.08)',\n boxShadow: '0 8px 32px rgba(0,0,0,0.4)',\n font: '12px/1.5 ui-monospace, SFMono-Regular, Menlo, monospace',\n overflow: 'hidden',\n};\n\nexport const HEADER: Style = {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n width: '100%',\n padding: '10px 12px',\n background: 'transparent',\n border: '0',\n color: 'inherit',\n font: 'inherit',\n fontWeight: '600',\n letterSpacing: '0.02em',\n cursor: 'pointer',\n};\n\nexport const BODY: Style = { padding: '0 12px 12px' };\n\nexport const PILL: Style = {\n flex: '1 1 auto',\n padding: '4px 8px',\n background: 'rgba(255,255,255,0.06)',\n border: '1px solid transparent',\n borderRadius: '6px',\n color: 'inherit',\n font: 'inherit',\n cursor: 'pointer',\n};\n\nexport const CTA: Style = {\n flex: '1 1 auto',\n padding: '6px 8px',\n background: '#f4f4f5',\n color: '#18181b',\n border: '0',\n borderRadius: '6px',\n font: 'inherit',\n fontWeight: '600',\n cursor: 'pointer',\n};\n\nexport function div(style: Style): HTMLDivElement {\n const element = document.createElement('div');\n Object.assign(element.style, style);\n return element;\n}\n\nexport function span(text: string, style: Style): HTMLSpanElement {\n const element = document.createElement('span');\n element.textContent = text;\n Object.assign(element.style, style);\n return element;\n}\n\nexport function button(text: string, style: Style): HTMLButtonElement {\n const element = document.createElement('button');\n element.textContent = text;\n Object.assign(element.style, style);\n return element;\n}\n\nexport function numberInput(\n value: number,\n min: number,\n step: number,\n): HTMLInputElement {\n const element = document.createElement('input');\n element.type = 'number';\n element.value = String(value);\n element.min = String(min);\n element.step = String(step);\n Object.assign(element.style, {\n ...PILL,\n width: '100%',\n cursor: 'text',\n });\n return element;\n}\n\nexport function select(entries: Array<[string, string]>): HTMLSelectElement {\n const element = document.createElement('select');\n Object.assign(element.style, PILL);\n for (const [value, label] of entries)\n element.appendChild(optionEl(value, label));\n return element;\n}\n\nexport function optionEl(value: string, label: string): HTMLOptionElement {\n const option = document.createElement('option');\n option.value = value;\n option.textContent = label;\n return option;\n}\n\nexport function labeled(text: string, control: HTMLElement): HTMLElement {\n const wrapper = div({ flex: '1 1 auto' });\n wrapper.appendChild(\n span(text, { display: 'block', opacity: '0.5', fontSize: '10px' }),\n );\n wrapper.appendChild(control);\n return wrapper;\n}\n\n/** The designed failure shape, when there is one. */\nexport function describe(error: unknown): string {\n if (error && typeof error === 'object' && 'toDisplayString' in error) {\n return (error as { toDisplayString(): string }).toDisplayString();\n }\n return error instanceof Error ? error.message : String(error);\n}\n","/**\n * The timeline panel: a floating strip, not an editor.\n *\n * The developer orbits their product with the mouse, presses +, scrubs,\n * presses + again, and presses Render video, without leaving the page. It is\n * vanilla DOM and imports nothing but the timeline itself, so a plain three.js\n * app and, through the thin wrapper in r3f/, a React app mount exactly the\n * same panel.\n *\n * import { mountTimelinePanel } from '@oeave/bakery3/devtools';\n *\n * const panel = mountTimelinePanel({\n * timeline,\n * targets: [{ object: hero, label: 'hero' }],\n * onPlaybackChange: (active) => { controls.enabled = !active; },\n * onRenderVideo: (tl) => renderVideo(tl),\n * });\n *\n * `onPlaybackChange` is the one that matters. Orbit controls rewrite the\n * camera every frame, so a timeline that owns the camera and controls that\n * also own it fight, and the developer sees a stuttering preview. The host\n * suspends them; capture still reads the camera the developer framed with the\n * controls.\n *\n * `buildTimelineBody` is the same UI without the shell, because the dev panel\n * (./devPanel.ts) shows it as its Video tab. `mountTimelinePanel` is the\n * floating shell around that body.\n */\n\nimport type { Object3D } from 'three';\nimport type { Easing, Timeline, Track } from '../timeline/index.js';\nimport { OBJECT_PROPERTIES, linearToSrgbHex } from '../timeline/index.js';\nimport {\n BLUE,\n BLUE_RGB,\n BODY,\n CORNERS,\n CTA,\n INK,\n ORANGE,\n PILL,\n SHELL,\n SWEEP,\n HEADER,\n button,\n describe,\n div,\n numberInput,\n optionEl,\n select,\n span,\n type Style,\n} from './dom.js';\n\n/** An object the developer can add a lane for. The label is what the picker\n * shows: a three `name` is often empty or generated, and \"Mesh\" three times\n * in a dropdown is not a choice anybody can make. */\nexport type TimelinePanelTarget = { object: Object3D; label: string };\n\n/** What the host supplies. Only `timeline` is required; the Render-video\n * button appears only when there is something for it to call. */\nexport type TimelinePanelOptions = {\n timeline: Timeline;\n /** Objects offered in the \"add track\" picker. The camera is always there. */\n targets?: TimelinePanelTarget[];\n /** Shows the \"Render video\" button when given. */\n onRenderVideo?: (timeline: Timeline) => void | Promise<void>;\n /** Fired when the timeline takes the camera, and when it gives it back. */\n onPlaybackChange?: (active: boolean) => void;\n container?: HTMLElement;\n position?: 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left';\n defaultOpen?: boolean;\n};\n\n/** The handle a host keeps. Small on purpose: the panel reads everything else\n * it needs off the timeline and its events, so there is no second copy of the\n * state to keep in sync. */\nexport type TimelinePanel = {\n /** Rebuild the lanes, after loading a different scene, say. */\n refresh(): void;\n /** One line under the transport: \"tracing frame 12/48\". */\n setStatus(message: string, tone?: 'info' | 'error'): void;\n dispose(): void;\n};\n\n/** Everything the body needs, plus the two knobs only the dev panel turns. */\nexport type TimelineBodyOptions = Omit<\n TimelinePanelOptions,\n 'container' | 'position' | 'defaultOpen'\n> & {\n /** Applied to the body element. The timeline panel passes its own padding;\n * the dev panel passes the padding of its tab. */\n style?: Style;\n /**\n * Whether the body draws its own \"Render video\" button. The dev panel puts\n * that action in its own action bar next to the cost chip, and calls\n * `renderVideo()` on this handle instead: same code path, one button.\n */\n showRenderButton?: boolean;\n};\n\nexport type TimelineBody = {\n element: HTMLDivElement;\n /** Rebuild the picker and repaint. Pass the targets if they changed. */\n refresh(targets?: TimelinePanelTarget[]): void;\n setStatus(message: string, tone?: 'info' | 'error'): void;\n /** Exactly what the Render-video button does, for a host that draws its\n * own. Resolves when `onRenderVideo` does. */\n renderVideo(): Promise<void>;\n /** True while a render started from here is in flight. */\n readonly busy: boolean;\n dispose(): void;\n};\n\nconst EASINGS: Easing[] = ['linear', 'ease-in', 'ease-out', 'ease-in-out'];\n\nconst OBJECT_TRACKS = [\n 'position',\n 'rotation',\n 'scale',\n 'color',\n 'emissive',\n 'emissiveIntensity',\n 'roughness',\n 'metalness',\n 'opacity',\n 'intensity',\n 'target',\n 'groundColor',\n 'environmentIntensity',\n 'environmentRotation',\n];\n\n/** The track view's columns: lane names, the strips the playhead runs\n * along, and each lane's +. The ruler keeps the same three. */\nconst GUTTER_PX = 104;\nconst END_PX = 22;\nconst GAP_PX = 6;\nconst INSET_PX = 6;\n/** Time runs this far inside a strip's ends, so a keyframe at 0 s or at the\n * very end is drawn whole. */\nconst AXIS_PX = 6;\n\n/** Where time runs inside the ruler and inside each lane's strip. */\nfunction axis(): HTMLDivElement {\n return div({\n position: 'absolute',\n top: '0',\n bottom: '0',\n left: `${AXIS_PX}px`,\n right: `${AXIS_PX}px`,\n });\n}\n\nconst ROW: Style = {\n display: 'flex',\n alignItems: 'center',\n gap: `${GAP_PX}px`,\n padding: `0 ${INSET_PX}px`,\n};\n\n/** Play and loop. */\nconst ROUND: Style = {\n flex: '0 0 auto',\n width: '28px',\n height: '28px',\n padding: '0',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n background: 'rgba(255,255,255,0.08)',\n border: '0',\n borderRadius: '50%',\n color: 'inherit',\n font: 'inherit',\n fontSize: '11px',\n cursor: 'pointer',\n};\n\nconst DIAMOND: Style = {\n position: 'absolute',\n top: '50%',\n width: '10px',\n height: '10px',\n marginTop: '-5px',\n transform: 'rotate(45deg)',\n borderRadius: '2px',\n};\n\n/** A number inside a sentence: `[4] s × [24] fps = 96 frames`. */\nconst INLINE_NUMBER: Style = {\n flex: '0 0 auto',\n padding: '3px 5px',\n background: 'rgba(255,255,255,0.06)',\n border: '1px solid transparent',\n borderRadius: '4px',\n textAlign: 'right',\n fontVariantNumeric: 'tabular-nums',\n};\n\nconst MUTED: Style = { opacity: '0.55' };\n\n/**\n * Attach the panel to the page.\n *\n * It appends one fixed-position element to `container` (the body by default)\n * and owns nothing else: no globals, no stylesheet, no listener outside its\n * own subtree and the timeline's events. `dispose()` puts the page back\n * exactly as it was, which is what makes it safe to mount from a hot-reloading\n * dev server.\n */\nexport function mountTimelinePanel(\n options: TimelinePanelOptions,\n): TimelinePanel {\n const host = options.container ?? document.body;\n let open = options.defaultOpen ?? true;\n\n const shell = div(SHELL);\n Object.assign(shell.style, CORNERS[options.position ?? 'bottom-left']);\n\n const header = button('Timeline', HEADER);\n const caret = span(open ? '▾' : '▴', { opacity: '0.5' });\n header.appendChild(caret);\n\n const timelineBody = buildTimelineBody({\n timeline: options.timeline,\n ...(options.targets ? { targets: options.targets } : {}),\n ...(options.onRenderVideo ? { onRenderVideo: options.onRenderVideo } : {}),\n ...(options.onPlaybackChange\n ? { onPlaybackChange: options.onPlaybackChange }\n : {}),\n style: BODY,\n showRenderButton: true,\n });\n const body = timelineBody.element;\n if (!open) body.style.display = 'none';\n\n header.onclick = () => {\n open = !open;\n caret.textContent = open ? '▾' : '▴';\n body.style.display = open ? 'block' : 'none';\n };\n\n shell.append(header, body);\n host.appendChild(shell);\n\n return {\n refresh() {\n timelineBody.refresh(options.targets ?? []);\n },\n setStatus: timelineBody.setStatus,\n dispose() {\n timelineBody.dispose();\n shell.remove();\n },\n };\n}\n\n/**\n * The transport, the track view and the clip's length, in one element.\n *\n * Read top to bottom it is one sentence: play it, see where everything moves\n * in time, and how long the clip is. The track view is the one designed\n * thing: a ruler with the time already played in the brand's sweep, one\n * playhead through every lane, and each lane's keyframes joined by the span\n * they move over. Everything around it stays quiet.\n *\n * Everything about how a timeline is authored lives here; the two callers\n * differ only in what surrounds it.\n */\nexport function buildTimelineBody(options: TimelineBodyOptions): TimelineBody {\n const { timeline } = options;\n let targets = options.targets ?? [];\n\n let selected: { trackId: string; index: number } | null = null;\n /** True while the timeline owns the camera: playing, or being scrubbed. */\n let holding = false;\n let scrubbing = false;\n let busy = false;\n\n const body = div(options.style ?? {});\n\n // ---- transport ----------------------------------------------------------\n\n const transport = div({ display: 'flex', alignItems: 'center', gap: '8px' });\n const playButton = button('▶', ROUND);\n playButton.title = 'play';\n const loopButton = button('⟲', {\n ...ROUND,\n borderRadius: '6px',\n background: 'transparent',\n fontSize: '15px',\n });\n loopButton.title = 'loop';\n const timeNow = span('0.00', {\n fontSize: '13px',\n fontWeight: '600',\n fontVariantNumeric: 'tabular-nums',\n });\n const timeTotal = span(' / 0.00 s', { opacity: '0.5' });\n const readout = span('', { flex: '1 1 auto', whiteSpace: 'nowrap' });\n readout.append(timeNow, timeTotal);\n const cameraButton = button('◆ Keyframe camera', {\n flex: '0 0 auto',\n padding: '6px 10px',\n background: `rgba(${BLUE_RGB},0.12)`,\n color: BLUE,\n border: '0',\n borderRadius: '6px',\n font: 'inherit',\n fontSize: '11px',\n cursor: 'pointer',\n });\n cameraButton.title = 'Record where the camera is and what it looks at, here';\n transport.append(playButton, loopButton, readout, cameraButton);\n\n // ---- track view ---------------------------------------------------------\n\n const view = div({\n marginTop: '10px',\n padding: '6px 0',\n borderRadius: '8px',\n background: 'rgba(255,255,255,0.025)',\n border: '1px solid rgba(255,255,255,0.06)',\n userSelect: 'none',\n });\n /** The ruler and the lanes, which the playhead runs through. */\n const stack = div({ position: 'relative' });\n\n const rulerRow = div(ROW);\n const ruler = div({\n position: 'relative',\n flex: '1 1 auto',\n height: '22px',\n cursor: 'ew-resize',\n });\n const rulerBase = div({\n position: 'absolute',\n left: '0',\n right: '0',\n bottom: '0',\n height: '2px',\n borderRadius: '1px',\n background: 'rgba(255,255,255,0.08)',\n });\n // The time already played, in the sweep the logo runs in: blue where the\n // clip starts, orange where it ends. Clipped, not resized, so a colour\n // always stands for the same moment.\n const played = div({\n position: 'absolute',\n left: '0',\n right: '0',\n bottom: '0',\n height: '2px',\n borderRadius: '1px',\n background: SWEEP,\n clipPath: 'inset(0 100% 0 0)',\n });\n const ticks = div({ position: 'absolute', inset: '0' });\n const rulerAxis = axis();\n rulerAxis.append(ticks, rulerBase, played);\n ruler.appendChild(rulerAxis);\n rulerRow.append(gutter(), ruler, end());\n\n const lanes = div({ display: 'flex', flexDirection: 'column', gap: '2px' });\n\n // The playhead's column is the lanes' strip column: past the gutter on the\n // left, short of the + column on the right.\n const head = div({\n position: 'absolute',\n top: '0',\n bottom: '0',\n left: `${INSET_PX + GUTTER_PX + GAP_PX + AXIS_PX}px`,\n right: `${INSET_PX + END_PX + GAP_PX + AXIS_PX}px`,\n pointerEvents: 'none',\n });\n const playhead = div({\n position: 'absolute',\n top: '0',\n bottom: '0',\n left: '0%',\n width: '2px',\n marginLeft: '-1px',\n background: BLUE,\n boxShadow: `0 0 6px rgba(${BLUE_RGB},0.6)`,\n });\n // The head sits on the ruler's ticks, under the labels it moves past.\n const knob = div({\n position: 'absolute',\n top: '12px',\n left: '-4px',\n width: '10px',\n height: '8px',\n borderRadius: '2px 2px 5px 5px',\n background: BLUE,\n });\n playhead.appendChild(knob);\n head.appendChild(playhead);\n stack.append(rulerRow, lanes, head);\n\n const addRow = div({ ...ROW, marginTop: '4px' });\n const trackPicker = select(addOptions(targets));\n Object.assign(trackPicker.style, {\n flex: '0 1 auto',\n padding: '3px 6px',\n background: 'transparent',\n border: '1px dashed rgba(255,255,255,0.14)',\n fontSize: '11px',\n opacity: '0.75',\n });\n trackPicker.title = 'Add a lane for another property';\n addRow.appendChild(trackPicker);\n\n // Outside the lanes, so the playhead does not run through it.\n const emptyNote = span(\n 'Frame the shot and press Keyframe camera. Move the playhead, frame the next one, and press it again.',\n {\n display: 'none',\n padding: `8px ${INSET_PX}px 4px`,\n fontSize: '11px',\n opacity: '0.5',\n },\n );\n\n view.append(stack, emptyNote, addRow);\n\n // ---- the selected keyframe ---------------------------------------------\n\n const inspector = div({\n display: 'none',\n alignItems: 'center',\n gap: '8px',\n marginTop: '8px',\n fontSize: '11px',\n });\n const inspectorMark = div({\n ...DIAMOND,\n position: 'static',\n flex: '0 0 auto',\n width: '8px',\n height: '8px',\n margin: '0 2px',\n background: ORANGE,\n });\n const inspectorText = span('', {\n flex: '1 1 auto',\n minWidth: '0',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n });\n const easingSelect = select(\n EASINGS.map((value) => [String(value), String(value)]),\n );\n Object.assign(easingSelect.style, { flex: '0 0 auto', fontSize: '11px' });\n easingSelect.title = 'how it eases into this keyframe';\n const deleteButton = button('Delete', { ...PILL, flex: '0 0 auto' });\n const deselect = button('×', { ...PILL, flex: '0 0 auto', width: '24px' });\n deselect.title = 'done';\n inspector.append(\n inspectorMark,\n inspectorText,\n easingSelect,\n deleteButton,\n deselect,\n );\n\n // ---- the clip -----------------------------------------------------------\n\n // How long the clip is, written as the sum it is: the frame count is what\n // a video costs, so it is the answer, not a field.\n const clip = div({\n display: 'flex',\n alignItems: 'center',\n gap: '6px',\n marginTop: '10px',\n fontSize: '11px',\n });\n const durationInput = numberInput(timeline.duration, 0.25, 0.25);\n Object.assign(durationInput.style, INLINE_NUMBER, { width: '52px' });\n durationInput.title = 'length in seconds';\n const fpsInput = numberInput(timeline.fps, 1, 1);\n Object.assign(fpsInput.style, INLINE_NUMBER, { width: '40px' });\n fpsInput.title = 'frames per second';\n const frames = span(String(timeline.frameCount), {\n fontWeight: '600',\n fontVariantNumeric: 'tabular-nums',\n });\n const copyButton = button('Copy JSON', {\n ...PILL,\n flex: '0 0 auto',\n marginLeft: 'auto',\n fontSize: '11px',\n });\n copyButton.title = 'the timeline as JSON, for `createTimeline()`';\n clip.append(\n durationInput,\n span('s ×', MUTED),\n fpsInput,\n span('fps =', MUTED),\n frames,\n span('frames', MUTED),\n copyButton,\n );\n\n const actions = div({ display: 'none', marginTop: '10px' });\n const renderButton = button('Render video', { ...CTA, width: '100%' });\n if (options.onRenderVideo && options.showRenderButton !== false) {\n actions.style.display = 'flex';\n actions.appendChild(renderButton);\n }\n\n const status = div({\n display: 'none',\n marginTop: '8px',\n fontSize: '11px',\n opacity: '0.7',\n whiteSpace: 'pre-wrap',\n });\n\n body.append(transport, view, inspector, clip, actions, status);\n\n // -------------------------------------------------------------------------\n // Behavior\n // -------------------------------------------------------------------------\n\n function hold(active: boolean) {\n if (holding === active) return;\n holding = active;\n options.onPlaybackChange?.(active);\n }\n\n playButton.onclick = () => {\n if (timeline.playing) timeline.pause();\n else timeline.play();\n };\n\n loopButton.onclick = () => {\n timeline.loop = !timeline.loop;\n paintLoop();\n };\n\n cameraButton.onclick = () => {\n try {\n timeline.captureCameraKeyframe();\n setStatus(`camera keyframed at ${timeline.time.toFixed(2)} s`);\n } catch (error) {\n setStatus(describe(error), 'error');\n }\n };\n\n /** Drag on the ruler, or on a lane between its keyframes, to scrub.\n * `time` is the part of it time runs along. */\n function scrubbable(element: HTMLElement, time: HTMLElement) {\n const seek = (event: PointerEvent) => {\n const rect = time.getBoundingClientRect();\n const fraction = Math.max(\n 0,\n Math.min(1, (event.clientX - rect.left) / rect.width),\n );\n timeline.seek(fraction * timeline.duration);\n };\n element.addEventListener('pointerdown', (event) => {\n scrubbing = true;\n timeline.pause();\n hold(true);\n element.setPointerCapture(event.pointerId);\n seek(event);\n });\n element.addEventListener('pointermove', (event) => {\n if (scrubbing) seek(event);\n });\n const endScrub = (event: PointerEvent) => {\n if (!scrubbing) return;\n scrubbing = false;\n element.releasePointerCapture?.(event.pointerId);\n // The camera goes back to the host the moment the drag ends, so orbit\n // controls resume from exactly where the timeline left the camera.\n if (!timeline.playing) hold(false);\n };\n element.addEventListener('pointerup', endScrub);\n element.addEventListener('pointercancel', endScrub);\n }\n scrubbable(ruler, rulerAxis);\n\n durationInput.onchange = () => {\n timeline.duration = Number(durationInput.value) || timeline.duration;\n durationInput.value = String(timeline.duration);\n };\n fpsInput.onchange = () => {\n timeline.fps = Number(fpsInput.value) || timeline.fps;\n fpsInput.value = String(timeline.fps);\n };\n\n trackPicker.onchange = () => {\n const [kind, property] = trackPicker.value.split('|');\n trackPicker.value = '';\n try {\n const target =\n kind === 'camera' ? 'camera' : targets[Number(kind)]?.object;\n if (!target || !property) return;\n // Created with a keyframe at the playhead: an empty lane holds nothing,\n // and the developer's intent in adding it is \"remember where this is\n // now\".\n timeline.keyframe(target, property, timeline.time);\n setStatus(`${property} keyframed at ${timeline.time.toFixed(2)} s`);\n } catch (error) {\n setStatus(describe(error), 'error');\n }\n };\n\n copyButton.onclick = () => {\n const json = JSON.stringify(timeline.toJSON(), null, 2);\n void navigator.clipboard?.writeText(json);\n setStatus(`${json.length} bytes of timeline JSON copied`);\n };\n\n async function renderVideo(): Promise<void> {\n if (!options.onRenderVideo) return;\n timeline.pause();\n hold(false);\n busy = true;\n renderButton.disabled = true;\n renderButton.style.opacity = '0.6';\n try {\n await options.onRenderVideo(timeline);\n } catch (error) {\n setStatus(describe(error), 'error');\n } finally {\n busy = false;\n renderButton.disabled = false;\n renderButton.style.opacity = '1';\n }\n }\n\n renderButton.onclick = () => void renderVideo();\n\n easingSelect.onchange = () => {\n if (!selected) return;\n timeline.setEasing(\n selected.trackId,\n selected.index,\n easingSelect.value as Easing,\n );\n };\n\n deleteButton.onclick = () => {\n if (!selected) return;\n const { trackId, index } = selected;\n pick(null);\n timeline.removeKeyframe(trackId, index);\n };\n deselect.onclick = () => {\n pick(null);\n paintLanes();\n };\n\n function pick(next: { trackId: string; index: number } | null) {\n selected = next;\n inspector.style.display = next ? 'flex' : 'none';\n }\n\n // -------------------------------------------------------------------------\n // Painting\n // -------------------------------------------------------------------------\n\n function paintTime() {\n const fraction = timeline.duration ? timeline.time / timeline.duration : 0;\n const percent = Math.max(0, Math.min(1, fraction)) * 100;\n playhead.style.left = `${percent}%`;\n played.style.clipPath = `inset(0 ${100 - percent}% 0 0)`;\n timeNow.textContent = timeline.time.toFixed(2);\n timeTotal.textContent = ` / ${timeline.duration.toFixed(2)} s`;\n playButton.textContent = timeline.playing ? '❚❚' : '▶';\n playButton.title = timeline.playing ? 'pause' : 'play';\n playButton.style.background = timeline.playing\n ? BLUE\n : 'rgba(255,255,255,0.08)';\n playButton.style.color = timeline.playing ? INK : 'inherit';\n if (timeline.playing) hold(true);\n else if (!scrubbing) hold(false);\n }\n\n function paintLoop() {\n loopButton.style.color = timeline.loop ? BLUE : 'inherit';\n loopButton.style.opacity = timeline.loop ? '1' : '0.45';\n }\n\n function paintRuler() {\n const step = rulerStep(timeline.duration);\n const marks: HTMLElement[] = [];\n if (step > 0) {\n for (let i = 0; (i * step) / 2 <= timeline.duration + 1e-9; i++) {\n const at = (i * step) / 2;\n const major = i % 2 === 0;\n const fraction = at / timeline.duration;\n marks.push(\n div({\n position: 'absolute',\n bottom: '2px',\n left: `${fraction * 100}%`,\n width: '1px',\n height: major ? '5px' : '3px',\n background: 'rgba(255,255,255,0.22)',\n }),\n );\n if (!major) continue;\n // The first label sits right of its tick and the last one left of\n // it, so neither hangs out of the ruler.\n const shift =\n fraction <= 0 ? '0' : fraction >= 0.999 ? '-100%' : '-50%';\n marks.push(\n span(`${formatSeconds(at)}s`, {\n position: 'absolute',\n top: '0',\n left: `${fraction * 100}%`,\n transform: `translateX(${shift})`,\n fontSize: '10px',\n opacity: '0.45',\n fontVariantNumeric: 'tabular-nums',\n }),\n );\n }\n }\n ticks.replaceChildren(...marks);\n }\n\n function paintLanes() {\n paintRuler();\n durationInput.value = String(timeline.duration);\n fpsInput.value = String(timeline.fps);\n frames.textContent = String(timeline.frameCount);\n\n emptyNote.style.display = timeline.tracks.length ? 'none' : 'block';\n if (!timeline.tracks.length) {\n pick(null);\n lanes.replaceChildren();\n return;\n }\n\n if (selected) {\n const track = timeline.tracks.find(\n (each) => each.id === selected!.trackId,\n );\n const keyframe = track?.keyframes[selected.index];\n if (!track || !keyframe) pick(null);\n else {\n inspectorText.textContent = `${laneName(track)} at ${keyframe.time.toFixed(2)} s`;\n easingSelect.value = String(keyframe.easing ?? 'linear');\n }\n }\n lanes.replaceChildren(...timeline.tracks.map(lane));\n }\n\n function lane(track: Track): HTMLElement {\n const row = div({ ...ROW, height: '24px' });\n\n const name = div({\n flex: `0 0 ${GUTTER_PX}px`,\n display: 'flex',\n alignItems: 'center',\n gap: '5px',\n minWidth: '0',\n fontSize: '11px',\n });\n name.title = laneName(track);\n // The colour a colour track holds at the playhead, as a swatch.\n if (track.property === 'color' || track.property === 'emissive') {\n const value = timeline.valueAt(track, timeline.time);\n if (value) {\n name.appendChild(\n span('', {\n flex: '0 0 auto',\n width: '8px',\n height: '8px',\n borderRadius: '50%',\n background: linearToSrgbHex(value),\n }),\n );\n }\n }\n name.appendChild(\n span(laneName(track), {\n minWidth: '0',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n opacity: '0.75',\n }),\n );\n\n const strip = div({\n position: 'relative',\n flex: '1 1 auto',\n height: '18px',\n borderRadius: '4px',\n background: 'rgba(255,255,255,0.04)',\n cursor: 'ew-resize',\n });\n const time = axis();\n strip.appendChild(time);\n scrubbable(strip, time);\n\n const at = (time: number) =>\n timeline.duration ? (time / timeline.duration) * 100 : 0;\n // What moves between two keyframes, as the span it moves over.\n track.keyframes.forEach((keyframe, index) => {\n if (index === 0) return;\n const from = at(track.keyframes[index - 1]!.time);\n time.appendChild(\n div({\n position: 'absolute',\n top: '50%',\n left: `${from}%`,\n width: `${at(keyframe.time) - from}%`,\n height: '2px',\n marginTop: '-1px',\n background:\n keyframe.path === 'orbit'\n ? `rgba(${BLUE_RGB},0.55)`\n : 'rgba(244,244,245,0.22)',\n }),\n );\n });\n track.keyframes.forEach((keyframe, index) => {\n const isSelected =\n selected?.trackId === track.id && selected.index === index;\n const diamond = div({\n ...DIAMOND,\n left: `calc(${at(keyframe.time)}% - 5px)`,\n background: isSelected\n ? ORANGE\n : keyframe.path === 'orbit'\n ? BLUE\n : '#e4e4e7',\n boxShadow: isSelected\n ? `0 0 0 2px rgb(24,24,27), 0 0 10px rgba(236,157,60,0.7)`\n : '0 0 0 2px rgb(24,24,27)',\n cursor: 'pointer',\n });\n diamond.title = `${keyframe.time.toFixed(2)} s${\n keyframe.path === 'orbit' ? ', orbiting' : ''\n }`;\n // A keyframe is picked, not scrubbed through.\n diamond.addEventListener('pointerdown', (event) =>\n event.stopPropagation(),\n );\n diamond.onclick = (event) => {\n event.stopPropagation();\n pick({ trackId: track.id, index });\n timeline.seek(keyframe.time);\n paintLanes();\n };\n time.appendChild(diamond);\n });\n\n const add = button('+', {\n ...PILL,\n flex: `0 0 ${END_PX}px`,\n height: '18px',\n padding: '0',\n fontSize: '11px',\n opacity: '0.7',\n });\n add.title = 'keyframe the live value here';\n add.onclick = () => {\n try {\n if (track.target === 'camera' && track.property === 'lookAt') {\n timeline.captureCameraKeyframe();\n } else {\n timeline.keyframe(track.target, track.property, timeline.time);\n }\n } catch (error) {\n setStatus(describe(error), 'error');\n }\n };\n\n row.append(name, strip, add);\n return row;\n }\n\n function setStatus(message: string, tone: 'info' | 'error' = 'info') {\n status.textContent = message;\n status.style.display = message ? 'block' : 'none';\n status.style.color = tone === 'error' ? '#ff6b6b' : 'inherit';\n }\n\n const offChange = timeline.on('change', () => {\n paintLanes();\n paintTime();\n });\n const offTime = timeline.on('time', () => paintTime());\n const offPlay = timeline.on('play', () => paintTime());\n const offPause = timeline.on('pause', () => paintTime());\n\n paintLoop();\n paintLanes();\n paintTime();\n\n return {\n element: body,\n get busy() {\n return busy;\n },\n refresh(next) {\n if (next) targets = next;\n trackPicker.replaceChildren();\n for (const [value, label] of addOptions(targets)) {\n trackPicker.appendChild(optionEl(value, label));\n }\n trackPicker.value = '';\n paintLanes();\n paintTime();\n },\n setStatus,\n renderVideo,\n dispose() {\n offChange();\n offTime();\n offPlay();\n offPause();\n timeline.pause();\n hold(false);\n },\n };\n}\n\n/** The empty left column of the ruler, in line with the lane names. */\nfunction gutter(): HTMLElement {\n return div({ flex: `0 0 ${GUTTER_PX}px` });\n}\n\n/** The empty right column of the ruler, in line with the lanes' +. */\nfunction end(): HTMLElement {\n return div({ flex: `0 0 ${END_PX}px` });\n}\n\nfunction laneName(track: Track): string {\n return `${track.label}.${track.property}`;\n}\n\n/** The ruler's labelled step: a round number of seconds, at most five of\n * them across. */\nfunction rulerStep(duration: number): number {\n if (!(duration > 0)) return 0;\n for (const step of [0.25, 0.5, 1, 2, 5, 10, 15, 30, 60, 120, 300]) {\n if (duration / step <= 5) return step;\n }\n return Math.ceil(duration / 5);\n}\n\nfunction formatSeconds(seconds: number): string {\n return Number.isInteger(seconds)\n ? String(seconds)\n : seconds.toFixed(2).replace(/0$/, '');\n}\n\n/** The add picker: a prompt, then the camera and every target's properties. */\nfunction addOptions(targets: TimelinePanelTarget[]): Array<[string, string]> {\n return [['', '+ Add a track'], ...trackOptions(targets)];\n}\n\nfunction trackOptions(targets: TimelinePanelTarget[]): Array<[string, string]> {\n const entries: Array<[string, string]> = [\n ['camera|position', 'camera · position'],\n ['camera|lookAt', 'camera · lookAt'],\n ['camera|fov', 'camera · fov'],\n ];\n targets.forEach((target, index) => {\n for (const property of OBJECT_TRACKS) {\n // Only what this kind of object has: a light's target, a hemisphere\n // light's ground color, the scene's environment.\n const applies = OBJECT_PROPERTIES[property]?.appliesTo;\n if (applies && !applies(target.object)) continue;\n entries.push([`${index}|${property}`, `${target.label} · ${property}`]);\n }\n });\n return entries;\n}\n","/**\n * The dev panel: one floating thing that renders, films and bakes.\n *\n * A 48px mark in the corner of the developer's own app, which opens into a\n * card with up to three tabs and a price. Four things about it are contracts\n * and the rest is layout:\n *\n * 1. The cost is visible before the money is spent. Beside every primary\n * button is a quiet line, `98% compatible ≈ $0.12`: hover the price for\n * what it is made of (`96 frames × $0.039`, at most $5.00), click the\n * figure for the objects that render differently. The price refreshes\n * when the settings change, when the tab changes, and when the scene\n * changes; never on a clock, so a price that has not moved is not fetched\n * again. A key or a balance that will refuse the render is said in the\n * status line then, not when Render is pressed.\n * 2. Every refusal is in place. An object that cannot be baked appears in the\n * list with a ⚠ and its reason and fix on hover, next to the ones that\n * can. Nothing is silently missing.\n * 3. Hold to compare. Pointer down shows the live scene, pointer up puts the\n * bake back, both within a frame and both lossless, because the session\n * keeps the patch and just switches it off.\n * 4. The lock explains itself. Downloads are the one gated action, and the\n * locked state says what kind of key unlocks it and where to put it.\n *\n * A tab only exists if its options were supplied. A vanilla three app with\n * no timeline gets a two-tab panel, not a Video tab that does nothing.\n *\n * import { mountDevPanel } from '@oeave/bakery3/devtools';\n *\n * const panel = mountDevPanel({\n * estimate: (request) => post('/api/estimate', request),\n * render: { onRender: (settings) => runRender(settings) },\n * bake: { session, onBake: (settings) => runBake(settings) },\n * });\n */\n\nimport type { Object3D } from 'three';\nimport type { BakeQuality, BakeTextureSize } from '../protocol/index.js';\nimport type { BakeSession } from '../bake/session.js';\nimport type { Timeline } from '../timeline/index.js';\n// The rule `render()` sizes a picture by, so the size the panel shows and\n// prices is the size that renders.\nimport { outputSize } from '../capture/output.js';\nimport {\n BLUE,\n BLUE_RGB,\n CORNERS,\n CTA,\n INK,\n PILL,\n SHELL,\n SWEEP,\n button,\n describe,\n div,\n labeled,\n select,\n span,\n type Style,\n} from './dom.js';\nimport {\n buildTimelineBody,\n type TimelineBody,\n type TimelinePanelTarget,\n} from './timelinePanel.js';\n\n// ---------------------------------------------------------------------------\n// Options\n// ---------------------------------------------------------------------------\n\nexport type DevPanelTab = 'render' | 'video' | 'bake';\n\n/** What the panel asks the host to price. */\nexport type DevPanelEstimateRequest =\n | { kind: 'render'; quality: string; width: number; height: number }\n | {\n kind: 'video';\n quality: string;\n width: number;\n height: number;\n frames: number;\n fps: number;\n format: 'mp4' | 'webm';\n }\n | {\n kind: 'bake';\n quality: BakeQuality;\n textureSize: number;\n objects: number;\n texels: number;\n /** The ticked objects, as objectIds. */\n include: string[];\n };\n\nexport type DevPanelEstimate = {\n /** The price beside the button. */\n usd: number;\n /** The most it can be charged: the breakdown's `at most` line. */\n maximum?: number;\n /**\n * A line of your own under the breakdown, which already lists the\n * settings, the count the price is made of (`96 frames × $0.039`) and the\n * maximum: `on the local worker`.\n */\n detail?: string;\n /** False when the price is exact rather than an estimate: no `≈`. */\n approximate?: boolean;\n};\n\n/** One past artifact, as the host's history lists it. */\nexport type DevPanelHistoryEntry = {\n id: string;\n kind: DevPanelTab;\n createdAt: string;\n /** When `artifact` and `thumbnail` stop working (signed URLs do). The\n * panel's own history drops an entry then. */\n expiresAt?: string;\n cacheKey?: string;\n cached?: boolean;\n meta?: {\n width?: number;\n height?: number;\n format?: string;\n frames?: number;\n fps?: number;\n quality?: string;\n textureSize?: number;\n objects?: number;\n skipped?: number;\n /** What it was charged, in dollars. */\n cost?: number;\n };\n thumbnail?: string;\n artifact?: string;\n};\n\n/** What a finished action gives the panel to show. `entry` is what makes the\n * result's Download button real: downloads go through the same gated path\n * as history, never round an alternative route. */\nexport type DevPanelActionResult = {\n url?: string;\n meta?: string;\n isVideo?: boolean;\n entry?: DevPanelHistoryEntry;\n /** The job's id, so the panel's own history does not list it twice. */\n id?: string;\n /** The output's size: the result area holds the image's shape before the\n * image has loaded, so nothing below it moves when it does. */\n width?: number;\n height?: number;\n quality?: string;\n format?: string;\n frames?: number;\n /** Dollars charged, for the history line. */\n cost?: number;\n /** Millisecond epoch at which `url` stops working. */\n expiresAt?: number;\n};\n\nexport type DevPanelRenderSettings = {\n quality: string;\n width: number;\n height: number;\n};\n\nexport type DevPanelRenderOptions = {\n onRender: (\n settings: DevPanelRenderSettings,\n ) => void | DevPanelActionResult | Promise<void | DevPanelActionResult>;\n qualities?: string[];\n /** Long edges to offer. The short edge follows `aspect`. */\n sizes?: number[];\n /**\n * Width ÷ height of the frame the host renders: 4/3 for a 640×480 room\n * shot, or a function that reads the camera, so a wide viewport renders\n * wide. Read each time the panel prices or renders. Defaults to 1, a\n * square.\n */\n aspect?: number | (() => number);\n defaultQuality?: string;\n defaultSize?: number;\n};\n\nexport type DevPanelVideoSettings = DevPanelRenderSettings & {\n format: 'mp4' | 'webm';\n timeline: Timeline;\n};\n\nexport type DevPanelVideoOptions = {\n timeline: Timeline;\n targets?: TimelinePanelTarget[];\n /**\n * The live scene, read whenever `sceneVersion` reports a change.\n *\n * Supplying it lets the panel re-attach tracks whose objects were rebuilt\n * (a variant swap, an r3f remount) instead of letting the timeline refuse at\n * export. Without it the panel still works; stale tracks just survive until\n * something else catches them.\n */\n scene?: () => Object3D | undefined;\n /** Passed straight through to the timeline body: the orbit-controls\n * handshake that keeps the camera from being driven twice. */\n onPlaybackChange?: (active: boolean) => void;\n onRenderVideo: (\n settings: DevPanelVideoSettings,\n ) => void | DevPanelActionResult | Promise<void | DevPanelActionResult>;\n qualities?: string[];\n /** Long edges to offer. The short edge follows `aspect`. */\n sizes?: number[];\n /** As the Render tab's. Video sizes are rounded to even numbers, which is\n * what a video encoder takes. */\n aspect?: number | (() => number);\n formats?: Array<'mp4' | 'webm'>;\n defaultQuality?: string;\n defaultSize?: number;\n defaultFormat?: 'mp4' | 'webm';\n};\n\nexport type DevPanelBakeSettings = {\n quality: BakeQuality;\n textureSize: BakeTextureSize;\n /** The ticked boxes, as objectIds. */\n include: string[];\n};\n\nexport type DevPanelBakeResult = {\n /** Index of the generation the host added, when it added one. The panel\n * reads the session for everything else. */\n generation?: number;\n entry?: DevPanelHistoryEntry;\n};\n\nexport type DevPanelBakeOptions = {\n session: BakeSession;\n onBake: (\n settings: DevPanelBakeSettings,\n ) => void | DevPanelBakeResult | Promise<void | DevPanelBakeResult>;\n qualities?: BakeQuality[];\n sizes?: BakeTextureSize[];\n defaultQuality?: BakeQuality;\n defaultSize?: BakeTextureSize;\n};\n\n/** The shape of `bakery3.check()`, structurally, so the panel does not have\n * to import the compatibility analyzer to display its verdict. */\nexport type DevPanelCompatibility = {\n score: number;\n issues: Array<{\n severity: string;\n message: string;\n /** `<Car>/<Body>/<Paint>`: the panel lists the issue under `Paint`. */\n path?: string;\n /** Linked beside the issue. */\n docs?: string;\n }>;\n};\n\nexport type DevPanelHistoryOptions = {\n list: () => Promise<DevPanelHistoryEntry[]>;\n /** Omit it and no download buttons are drawn at all, which is better than\n * a button that cannot work. */\n download?: (\n entry: DevPanelHistoryEntry,\n part?: 'glb',\n ) => void | Promise<void>;\n};\n\n/**\n * A render the panel shows in its jobs strip: what is tracing now and what\n * waits behind it. A job in a terminal state is not drawn; what finished is\n * the Recent list's to show. States use the protocol's RenderState names\n * (`queued`, `preparing`, `rendering_preview`, `rendering`, `completed`,\n * `failed`, `cancelled`) so an SDK job and a host's own queue read alike.\n */\nexport type DevPanelJob = {\n id: string;\n label: string;\n state: string;\n /** Overall, 0–1. Omit for an honest indeterminate. */\n progress?: number;\n /** The renderer's own words: `48% of samples`, `frame 12/48`. */\n detail?: string;\n /** The low-sample preview, the moment it exists: the row's thumbnail\n * until `resultUrl` replaces it. */\n previewUrl?: string;\n resultUrl?: string;\n seconds?: number;\n /** Drawn as × on a job that is not finished. */\n onCancel?: () => void;\n};\n\n/** What a tracked job's listeners receive: the union of RenderJob's payloads,\n * loosely, so the panel can read them without importing the client. */\nexport type TrackedJobPayload = {\n percent?: number;\n state?: string;\n url?: string;\n result?: {\n url: string;\n width?: number;\n height?: number;\n format?: string;\n cost?: number;\n expiresAt?: number;\n };\n error?: { message?: string };\n /** Every RenderJob payload carries the record; the strip does not read it,\n * but naming it keeps this an honest structural match for all five events. */\n render?: unknown;\n};\n\n/**\n * What `trackJob` needs from an SDK `RenderJob`, structurally, so the panel\n * never imports the client and any object with these members works.\n */\nexport type TrackableJob = {\n id: string;\n status: string;\n progress: number;\n previewUrl?: string;\n on(\n event: 'progress' | 'preview' | 'complete' | 'failed' | 'cancelled',\n listener: (payload: TrackedJobPayload) => void,\n ): () => void;\n cancel?(): void | Promise<void>;\n};\n\nexport type DevPanelOptions = {\n container?: HTMLElement;\n position?: 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left';\n defaultOpen?: boolean;\n defaultTab?: DevPanelTab;\n /** A name beside the mark in the header, for a host with a panel of its\n * own to tell apart. None by default: the mark says whose panel it is. */\n title?: string;\n /** Fired when the FAB is opened or the card collapsed. A host that\n * remounts the panel (switching scenes, say) uses it to come back open. */\n onOpenChange?: (open: boolean) => void;\n /**\n * A cheap fingerprint of what is in the scene: its objects, which of them\n * are visible, their geometry and materials. When it changes, the price,\n * the Bake tab's object list and the compatibility verdict follow, because\n * a developer who just added a wall should not be looking at the price of\n * the room without it.\n *\n * three.js has no event for most of that (a swapped geometry, a hidden\n * mesh), so the panel compares this on animation frames a few times a\n * second while it is open, and never while the tab is in the background.\n * Keep it to a walk over the scene; it can be as approximate as you like.\n */\n sceneVersion?: () => string | number;\n /**\n * A cheap fingerprint of where things are: the camera's position, and the\n * objects' if they move. How walled in the camera is moves a price, so a\n * camera carried into a room is priced again, once it has come to rest. A\n * view that never rests (an auto-rotating orbit, a scene that animates)\n * keeps the price it had; `sceneVersion` still re-prices what is added to\n * it meanwhile.\n */\n viewVersion?: () => string | number;\n estimate?: (\n request: DevPanelEstimateRequest,\n ) => Promise<DevPanelEstimate | null> | DevPanelEstimate | null;\n /**\n * The free, local, offline compatibility check, shown beside the button as\n * `98% compatible`, which opens the issues object by object. Read on open,\n * when the scene changes and on every `refresh()`; returning `null` hides\n * it.\n */\n compatibility?: () => DevPanelCompatibility | null;\n history?: DevPanelHistoryOptions;\n render?: DevPanelRenderOptions;\n video?: DevPanelVideoOptions;\n bake?: DevPanelBakeOptions;\n};\n\nexport type DevPanel = {\n open(): void;\n close(): void;\n setTab(tab: DevPanelTab): void;\n /** Re-read candidates, generations and history and repaint. */\n refresh(): void;\n /** Ask for a fresh estimate now. */\n refreshCost(): void;\n setStatus(message: string, tone?: 'info' | 'error' | 'ok'): void;\n /** The host drives per-object progress:\n * `setProgress('Baking pedestal · 3/12', 3/12)`. `null` clears it. */\n setProgress(text: string | null, fraction?: number): void;\n /**\n * The jobs strip, replaced wholesale. A host with its own queue (a local\n * worker, a batch script) reports what is tracing now and what waits\n * behind it. Finished jobs are dropped from the strip; with no active job\n * it hides.\n */\n setJobs(jobs: DevPanelJob[]): void;\n /**\n * Follow an SDK render job into the strip (progress, the preview the\n * moment it lands) with nothing to translate on the host's side. The row\n * leaves the strip when the job ends; the untrack function detaches the\n * listeners.\n */\n trackJob(job: TrackableJob, label?: string): () => void;\n /**\n * A row in the jobs strip from the moment an action starts, before there\n * is a job to follow: `update()` says what is happening (capturing the\n * scene, uploading), `follow()` hands the same row to the job once it\n * exists, and `end()` takes it away. One row from the click to the result,\n * where it would otherwise be a bar that vanishes and a row that appears.\n */\n startJob(label: string): DevPanelJobHandle;\n dispose(): void;\n};\n\n/** What `startJob` returns. See there. */\nexport type DevPanelJobHandle = {\n /** `state` names a step after the job itself is done (`applying`), which\n * keeps the row up while the action finishes. */\n update(detail: string, progress?: number, state?: string): void;\n follow(job: TrackableJob): void;\n end(): void;\n};\n\n// ---------------------------------------------------------------------------\n\nconst CARD: Style = {\n ...SHELL,\n /**\n * In-flow, unlike the standalone timeline shell: the corner-anchored root is\n * the one fixed element, so a `bottom`-anchored panel grows upward from the\n * FAB's corner. A fixed card here would sit at its static position (the\n * corner point) and run its full height off the bottom of the screen.\n */\n position: 'static',\n width: '380px',\n display: 'flex',\n flexDirection: 'column',\n maxHeight: 'min(78vh, 720px)',\n};\n\n/** A tab in the header row, beside the mark: the tabs share the width up to\n * the collapse button, and the underline sits on the header's bottom rule. */\nconst TAB: Style = {\n flex: '1 1 0',\n minWidth: '0',\n padding: '12px 8px 10px',\n background: 'transparent',\n border: '0',\n borderBottom: '2px solid transparent',\n color: 'inherit',\n font: 'inherit',\n opacity: '0.55',\n cursor: 'pointer',\n};\n\n/**\n * The quiet line beside the button: how much of the scene renders as you see\n * it, and what pressing the button costs. Plain text, no box. Half the action\n * bar, beside the button (see `action`), and never sized by its text: the one\n * moment a Render button must not move is the moment somebody is about to\n * press it.\n */\nconst META: Style = {\n flex: '1 1 0',\n minWidth: '0',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'flex-end',\n gap: '12px',\n fontSize: '11px',\n whiteSpace: 'nowrap',\n position: 'relative',\n};\n\n/** The compatibility half of META: a button only when there is something to\n * open. */\nconst COMPAT: Style = {\n display: 'flex',\n alignItems: 'center',\n gap: '6px',\n minWidth: '0',\n padding: '0',\n background: 'transparent',\n border: '0',\n color: 'inherit',\n font: 'inherit',\n opacity: '0.65',\n cursor: 'default',\n transition: 'opacity 120ms ease',\n};\n\nconst PRICE: Style = {\n flex: '0 0 auto',\n color: BLUE,\n cursor: 'default',\n transition: 'opacity 120ms ease',\n};\n\n/** The price's breakdown, above it while it is hovered. Inside the card, over\n * the settings row, so the card's own clipping never cuts it. */\nconst BREAKDOWN: Style = {\n display: 'none',\n position: 'absolute',\n right: '0',\n bottom: 'calc(100% + 8px)',\n zIndex: '1',\n width: 'max-content',\n maxWidth: '330px',\n padding: '8px 10px',\n borderRadius: '8px',\n background: 'rgb(28,29,34)',\n border: '1px solid rgba(255,255,255,0.10)',\n boxShadow: '0 8px 24px rgba(0,0,0,0.45)',\n whiteSpace: 'normal',\n pointerEvents: 'none',\n};\n\nconst WARNING = '#ffc107';\nconst ERROR = '#ff6b6b';\n\nconst GHOST: Style = {\n ...PILL,\n flex: '0 0 auto',\n padding: '3px 8px',\n fontSize: '11px',\n};\n\n/** Recent rows are one fixed height so the list can be exactly five tall\n * and scroll the rest, whether or not a row has a thumbnail. */\nconst HISTORY_ROW_PX = 40;\nconst HISTORY_VISIBLE = 5;\n/** A job row is a 33px thumbnail plus padding; four fit before it scrolls. */\nconst JOBS_MAX_PX = 172;\n\nconst HISTORY_LIST: Style = {\n maxHeight: `${HISTORY_ROW_PX * HISTORY_VISIBLE}px`,\n overflowY: 'auto',\n};\n\nconst SECTION_LABEL: Style = {\n display: 'block',\n marginTop: '10px',\n marginBottom: '4px',\n fontSize: '10px',\n letterSpacing: '0.08em',\n textTransform: 'uppercase',\n opacity: '0.4',\n};\n\nconst OUTPUT_READOUT: Style = {\n opacity: '0.6',\n fontSize: '11px',\n display: 'block',\n padding: '4px 0',\n whiteSpace: 'nowrap',\n};\n\n/** How often, at most, the panel compares the host's fingerprints. On an\n * animation frame, so a page in a background tab costs nothing. */\nconst WATCH_MS = 250;\n/** What is in the scene changed: priced once it has held this long, so a\n * model that loads in pieces is priced once, and at the latest after\n * SCENE_MAX_WAIT_MS of changes that never stop. */\nconst SCENE_SETTLE_MS = 250;\nconst SCENE_MAX_WAIT_MS = 1500;\n/** The camera or an object moved: priced once it has been still this long,\n * which is the end of an orbit, not every frame of it. */\nconst VIEW_SETTLE_MS = 600;\n/** A price that could not be fetched (offline, a dev server still starting)\n * is asked for again this often, and only until one comes back. */\nconst RETRY_MS = 10_000;\n/** Coming back to the page re-prices, since the balance may have been topped\n * up in another tab, unless the price on screen is this fresh. */\nconst FOCUS_FRESH_MS = 5_000;\n\n/**\n * The estimate failures that will refuse the render too, and where each is\n * fixed. Said in the status line the moment the price fails, rather than\n * left in the chip's tooltip until Render is pressed. Anything else (offline,\n * a scene still loading) stays a quiet blank chip.\n */\nconst LOUD_ESTIMATE_ERRORS: Record<string, { label: string; url: string }> = {\n Unauthorized: { label: 'Check your key:', url: 'https://bakery3.com/keys' },\n TokenExpired: { label: 'Check your key:', url: 'https://bakery3.com/keys' },\n OriginNotAllowed: {\n label: 'Check your key:',\n url: 'https://bakery3.com/keys',\n },\n InsufficientBalance: {\n label: 'Add credit:',\n url: 'https://bakery3.com/billing',\n },\n};\n\n/**\n * Mount the panel. Appends one fixed-position element to `container` (the\n * body by default) and owns nothing else; `dispose()` puts the page back.\n */\nexport function mountDevPanel(options: DevPanelOptions): DevPanel {\n const host = options.container ?? document.body;\n const tabs = availableTabs(options);\n if (!tabs.length) {\n // Nothing to show is not an error worth throwing over. A panel with no\n // actions would be a mystery box in the corner of the app, so none is\n // mounted.\n return inertPanel();\n }\n\n let open = options.defaultOpen ?? false;\n let tab: DevPanelTab =\n options.defaultTab && tabs.includes(options.defaultTab)\n ? options.defaultTab\n : tabs[0]!;\n let disposed = false;\n /**\n * Without a `history` callback the panel keeps its own: every render,\n * video and bake it saw finish, newest first, kept in this browser across\n * reloads until the signed links in it expire. A reload is routine while a\n * page is being built, and losing the last ten renders to one is not.\n */\n const ownHistory = !options.history;\n\n // ---- shell --------------------------------------------------------------\n\n const root = div({ position: 'fixed', zIndex: '2147483000' });\n Object.assign(root.style, CORNERS[options.position ?? 'bottom-right']);\n\n const fab = button('', {\n width: '48px',\n height: '48px',\n padding: '0',\n borderRadius: '50%',\n background: INK,\n border: '1px solid rgba(255,255,255,0.10)',\n boxShadow: '0 6px 20px rgba(0,0,0,0.45)',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n transition: 'box-shadow 120ms ease, border-color 120ms ease',\n });\n fab.title = 'Bakery3: render, video, bake';\n fab.appendChild(brandMark(46));\n fab.onmouseenter = () => {\n fab.style.boxShadow = `0 0 0 3px rgba(${BLUE_RGB},0.28), 0 6px 20px rgba(0,0,0,0.45)`;\n fab.style.borderColor = `rgba(${BLUE_RGB},0.6)`;\n };\n fab.onmouseleave = () => {\n fab.style.boxShadow = '0 6px 20px rgba(0,0,0,0.45)';\n fab.style.borderColor = 'rgba(255,255,255,0.10)';\n };\n fab.onclick = () => panel.open();\n\n const card = div(CARD);\n\n // One row: the mark says whose panel it is, so no name is spelled out\n // beside it, and the tabs sit right after it.\n const header = div({\n display: 'flex',\n alignItems: 'center',\n gap: '2px',\n padding: '0 12px',\n borderBottom: '1px solid rgba(255,255,255,0.08)',\n flex: '0 0 auto',\n });\n // As tall as the row the tabs make (42px): the mark is the header's name.\n const headerMark = brandMark(40);\n headerMark.style.marginRight = '6px';\n header.appendChild(headerMark);\n if (options.title) {\n header.appendChild(\n span(options.title, {\n fontWeight: '600',\n letterSpacing: '0.02em',\n marginRight: '8px',\n }),\n );\n }\n const tabButtons = new Map<DevPanelTab, HTMLButtonElement>();\n for (const name of tabs) {\n const element = button(\n name === 'bake' ? 'Bake' : name === 'video' ? 'Video' : 'Render',\n TAB,\n );\n element.onclick = () => panel.setTab(name);\n tabButtons.set(name, element);\n header.appendChild(element);\n }\n const collapse = button('\\u25be', {\n ...GHOST,\n marginLeft: 'auto',\n width: '24px',\n });\n collapse.title = 'collapse';\n collapse.onclick = () => panel.close();\n header.appendChild(collapse);\n\n const bodies = div({\n flex: '1 1 auto',\n overflowY: 'auto',\n padding: '0 12px 4px',\n borderTop: '1px solid rgba(255,255,255,0.08)',\n });\n\n const progressRow = div({\n display: 'none',\n padding: '6px 12px 0',\n flex: '0 0 auto',\n });\n const progressText = span('', {\n fontSize: '11px',\n opacity: '0.8',\n display: 'block',\n });\n const progressTrack = div({\n height: '3px',\n marginTop: '4px',\n borderRadius: '2px',\n background: 'rgba(255,255,255,0.08)',\n overflow: 'hidden',\n });\n const progressFill = div({\n height: '100%',\n width: '0%',\n background: SWEEP,\n transition: 'width 160ms ease',\n });\n progressTrack.appendChild(progressFill);\n progressRow.append(progressText, progressTrack);\n\n // The rule above it separates what will run (settings, Render) from what is\n // running.\n const jobsRow = div({\n display: 'none',\n margin: '14px 12px 0',\n padding: '10px 0 0',\n borderTop: '1px solid rgba(255,255,255,0.12)',\n flex: '0 0 auto',\n });\n const jobsList = div({ maxHeight: `${JOBS_MAX_PX}px`, overflowY: 'auto' });\n jobsRow.append(span('jobs', { ...SECTION_LABEL, marginTop: '0' }), jobsList);\n\n const statusRow = div({\n display: 'none',\n padding: '6px 12px 0',\n fontSize: '11px',\n whiteSpace: 'pre-wrap',\n flex: '0 0 auto',\n });\n\n /**\n * The primary action sits at the top, under the tabs, with the jobs it\n * starts directly beneath it: pressing Render and seeing the row appear\n * happen in the same place, not at opposite ends of a scrolling card.\n */\n const actionBar = div({\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n padding: '10px 12px 0',\n flex: '0 0 auto',\n });\n // Two equal halves, whatever the line beside it says: the price lands\n // asynchronously and its text changes width ('…' → '≈ $0.12'), and a\n // button sized by its neighbour moves under the pointer every time it does.\n const action = button('Render', { ...CTA, flex: '1 1 0', minWidth: '0' });\n const meta = div(META);\n const compat = button('', COMPAT);\n const compatDot = span('', {\n flex: '0 0 auto',\n width: '6px',\n height: '6px',\n borderRadius: '50%',\n background: BLUE,\n });\n const compatLabel = span('', {\n minWidth: '0',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n textUnderlineOffset: '2px',\n });\n compat.append(compatDot, compatLabel);\n compat.style.display = 'none';\n const price = span('', PRICE);\n const breakdown = div(BREAKDOWN);\n meta.append(compat, price, breakdown);\n actionBar.append(action, meta);\n\n /**\n * What renders differently from the viewport, object by object, opened from\n * the compatibility figure beside the button.\n */\n const issuesRow = div({\n display: 'none',\n margin: '10px 12px 0',\n padding: '8px 10px',\n borderRadius: '8px',\n background: 'rgba(255,255,255,0.04)',\n flex: '0 0 auto',\n });\n const issuesClose = button('×', { ...GHOST, width: '22px' });\n issuesClose.title = 'close';\n const issuesHead = div({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginBottom: '6px',\n });\n const issuesTitle = span('', { fontSize: '11px', opacity: '0.8' });\n issuesHead.append(issuesTitle, issuesClose);\n const issuesList = div({ maxHeight: '180px', overflowY: 'auto' });\n issuesRow.append(issuesHead, issuesList);\n\n const jobsFoot = div({ flex: '0 0 auto', height: '10px' });\n /** Each tab's quality/size row, lifted out of its body so the action sits\n * directly beneath the settings it will run with. */\n const tabSettings = div({ flex: '0 0 auto', padding: '0 12px' });\n\n card.append(\n header,\n tabSettings,\n actionBar,\n issuesRow,\n progressRow,\n statusRow,\n jobsRow,\n jobsFoot,\n bodies,\n );\n root.append(fab, card);\n host.appendChild(root);\n\n // ---- tab bodies ---------------------------------------------------------\n\n const renderTab = options.render ? buildRenderTab(options.render) : null;\n const videoTab = options.video ? buildVideoTab(options.video) : null;\n const bakeTab = options.bake ? buildBakeTab(options.bake) : null;\n\n for (const body of [renderTab, videoTab, bakeTab]) {\n if (!body) continue;\n tabSettings.appendChild(body.settings);\n bodies.appendChild(body.element);\n }\n\n // ---- cost ---------------------------------------------------------------\n\n let costToken = 0;\n let lastCostAt = 0;\n /**\n * What the price on screen (or the one on its way) was asked for: the\n * request, and the scene and the view as last seen. A price is asked for\n * again only when one of those moved, or when `force` says the answer may\n * have changed without them (a render spent some of the balance, the\n * developer came back from topping it up).\n */\n let pricedKey: string | undefined;\n /** When to ask again for a price that could not be fetched. */\n let retryAt: number | undefined;\n\n function estimateRequest(): DevPanelEstimateRequest | null {\n if (tab === 'render' && renderTab) return renderTab.estimateRequest();\n if (tab === 'video' && videoTab) return videoTab.estimateRequest();\n if (tab === 'bake' && bakeTab) return bakeTab.estimateRequest();\n return null;\n }\n\n /** The estimate failure last said in the status line, so asking again\n * with the same wrong key (a scene edit, a tab switch) says it once. */\n let loudEstimateError: string | null = null;\n /** Whether the status line still shows it, or something else since. */\n let statusFromEstimate = false;\n\n async function refreshCost(force = false) {\n if (!options.estimate || disposed) return;\n renderTab?.paintOutput();\n videoTab?.paintOutput();\n const request = estimateRequest();\n if (!request) return;\n const key = [JSON.stringify(request), seenScene, seenView].join('\\n');\n if (!force && key === pricedKey) return;\n pricedKey = key;\n retryAt = undefined;\n const token = ++costToken;\n lastCostAt = Date.now();\n // The last price stays up, dimmed, until the new one lands, so a price\n // that is being asked for again never blanks.\n if (!price.textContent) price.textContent = '…';\n price.style.opacity = '0.55';\n try {\n const estimate = await options.estimate(request);\n if (token !== costToken || disposed) return;\n price.style.opacity = '1';\n settleLoudEstimateError();\n if (!estimate) {\n price.textContent = '';\n breakdown.replaceChildren();\n return;\n }\n // Only the price beside the button; what it is made of is the\n // breakdown's, on hover.\n price.textContent =\n (estimate.approximate === false ? '' : '≈ ') + usd(estimate.usd);\n breakdown.replaceChildren(...breakdownLines(request, estimate));\n } catch (error) {\n if (token !== costToken || disposed) return;\n // A price that cannot be fetched is a blank, not an error the developer\n // has to dismiss before they can render.\n price.style.opacity = '1';\n price.textContent = '';\n breakdown.replaceChildren();\n // Except when the same refusal is waiting for the Render button: a\n // wrong key or an empty balance is said now, once, with where to fix it.\n // Those wait for the developer. Anything else (offline, a dev server\n // still starting) is asked again until a price comes back.\n if (!sayLoudEstimateError(error)) retryAt = Date.now() + RETRY_MS;\n }\n }\n\n /** Says a refusal that will meet the Render button too; false for any\n * other failure. */\n function sayLoudEstimateError(error: unknown): boolean {\n const code = errorCode(error);\n const link = code ? LOUD_ESTIMATE_ERRORS[code] : undefined;\n if (!link) return false;\n const text = describe(error);\n const key = `${code}\\n${text}`;\n if (key === loudEstimateError) return true;\n loudEstimateError = key;\n panel.setStatus(\n text.includes(link.url) ? text : `${text}\\n\\n${link.label} ${link.url}`,\n 'error',\n );\n statusFromEstimate = true;\n return true;\n }\n\n /** A price came back, so whatever the status line said about the key or\n * the balance is no longer true. */\n function settleLoudEstimateError() {\n if (loudEstimateError === null) return;\n loudEstimateError = null;\n if (statusFromEstimate) panel.setStatus('');\n }\n\n // Hovering the price shows what it is made of.\n price.onmouseenter = () => {\n if (breakdown.childNodes.length) breakdown.style.display = 'block';\n };\n price.onmouseleave = () => {\n breakdown.style.display = 'none';\n };\n\n // ---- compatibility ------------------------------------------------------\n\n let report: DevPanelCompatibility | null = null;\n let issuesOpen = false;\n\n /** The free, local check beside the button: how much of the scene renders\n * as you see it, and a click away from what does not. */\n function paintCompatibility() {\n report = options.compatibility?.() ?? null;\n if (!report) {\n compat.style.display = 'none';\n closeIssues();\n return;\n }\n const counts = { error: 0, warning: 0, info: 0 } as Record<string, number>;\n for (const issue of report.issues) {\n counts[issue.severity] = (counts[issue.severity] ?? 0) + 1;\n }\n compat.style.display = 'flex';\n compatLabel.textContent = `${Math.round(report.score * 100)}% compatible`;\n compatDot.style.background = counts.error\n ? ERROR\n : counts.warning\n ? WARNING\n : BLUE;\n const openable = report.issues.length > 0;\n compat.style.cursor = openable ? 'pointer' : 'default';\n compat.title = openable\n ? `${issueCount(report.issues.length)} in this scene. Click to see which objects.`\n : 'Everything in this scene renders as you see it.';\n if (!issuesOpen) return;\n if (openable) paintIssues();\n else closeIssues();\n }\n\n function paintIssues() {\n const issues = [...(report?.issues ?? [])].sort(\n (a, b) => severityRank(a.severity) - severityRank(b.severity),\n );\n // One group per object, the scene's own (fog, its size) under \"Scene\".\n const groups = new Map<string, typeof issues>();\n for (const issue of issues) {\n const where = issue.path ?? '';\n groups.set(where, [...(groups.get(where) ?? []), issue]);\n }\n issuesTitle.textContent = 'What renders differently';\n issuesList.replaceChildren(\n ...[...groups].map(([path, list]) => issueGroup(path, list)),\n );\n }\n\n function openIssues() {\n issuesOpen = true;\n paintIssues();\n issuesRow.style.display = 'block';\n compat.style.opacity = '1';\n }\n\n function closeIssues() {\n issuesOpen = false;\n issuesRow.style.display = 'none';\n compat.style.opacity = '0.65';\n }\n\n compat.onclick = () => {\n if (!report?.issues.length) return;\n if (issuesOpen) closeIssues();\n else openIssues();\n };\n compat.onmouseenter = () => {\n if (!report?.issues.length) return;\n compat.style.opacity = '1';\n compatLabel.style.textDecoration = 'underline';\n };\n compat.onmouseleave = () => {\n compat.style.opacity = issuesOpen ? '1' : '0.65';\n compatLabel.style.textDecoration = 'none';\n };\n issuesClose.onclick = () => closeIssues();\n\n // ---- following the scene ------------------------------------------------\n //\n // Recent three.js announces a child added or removed, to its parent alone,\n // and nothing else a price depends on: not a move, not a swapped\n // geometry, not a hidden mesh. So the panel looks at the host's two fingerprints itself,\n // while it is open, on an animation frame a few times a second, and asks\n // for a price only when one of them has changed and settled.\n\n /** The fingerprints as last seen. Both are part of the priced key. */\n let seenScene: string | number | undefined;\n let seenView: string | number | undefined;\n /** The request as last seen: a resized viewport changes its size. */\n let seenRequest = '';\n /** First and latest change to what is in the scene, not yet priced. */\n let sceneDirtySince: number | undefined;\n let sceneMovedAt = 0;\n /** Latest move of the camera, an object or the output size, not yet\n * priced. */\n let viewMovedAt: number | undefined;\n let watching = false;\n let cancelLook: (() => void) | undefined;\n const page = typeof window === 'undefined' ? undefined : window;\n\n function startWatching() {\n if (watching || disposed) return;\n watching = true;\n seenScene = options.sceneVersion?.();\n seenView = options.viewVersion?.();\n seenRequest = requestShape();\n sceneDirtySince = viewMovedAt = undefined;\n const next = () => {\n cancelLook = afterAWhile(() => {\n look(Date.now());\n if (watching) next();\n });\n };\n next();\n page?.addEventListener('focus', onFocus);\n }\n\n function stopWatching() {\n if (!watching) return;\n watching = false;\n cancelLook?.();\n cancelLook = undefined;\n page?.removeEventListener('focus', onFocus);\n }\n\n /** The request, to notice a resize by. Not the Bake tab's: it walks the\n * candidates, a verdict per object, and no viewport size is in it; the\n * scene fingerprint covers what changes it. */\n function requestShape(): string {\n return tab === 'bake' ? '' : JSON.stringify(estimateRequest());\n }\n\n function look(now: number) {\n // The readout follows a resized viewport at once, the price once the\n // size has settled.\n renderTab?.paintOutput();\n videoTab?.paintOutput();\n const request = requestShape();\n const scene = options.sceneVersion?.();\n const view = options.viewVersion?.();\n if (scene !== seenScene) {\n seenScene = scene;\n sceneMovedAt = now;\n sceneDirtySince ??= now;\n }\n if (view !== seenView || request !== seenRequest) {\n seenView = view;\n seenRequest = request;\n viewMovedAt = now;\n }\n\n if (sceneDirtySince !== undefined) {\n if (\n now - sceneMovedAt < SCENE_SETTLE_MS &&\n now - sceneDirtySince < SCENE_MAX_WAIT_MS\n ) {\n return;\n }\n sceneDirtySince = undefined;\n // What is in the scene changed, so the object list is as stale as the\n // price: a mesh added while the Bake tab is open should appear in it\n // without the developer having to close and reopen the panel.\n bakeTab?.paintCandidates();\n paintCompatibility();\n // A rebuilt subtree leaves timeline tracks pointing at objects that\n // are gone. Re-attach them to their replacements here, while the\n // developer is looking at the panel, not at export, where the only\n // honest thing left to do is refuse.\n videoTab?.reconcile();\n void refreshCost();\n return;\n }\n if (viewMovedAt !== undefined) {\n if (now - viewMovedAt < VIEW_SETTLE_MS) return;\n viewMovedAt = undefined;\n void refreshCost();\n return;\n }\n if (retryAt !== undefined && now >= retryAt) void refreshCost(true);\n }\n\n /** Back from another tab or window, where the balance may have been\n * topped up or the key fixed. */\n function onFocus() {\n if (open && Date.now() - lastCostAt > FOCUS_FRESH_MS) {\n void refreshCost(true);\n }\n }\n\n // ---- history ------------------------------------------------------------\n\n let historyEntries: DevPanelHistoryEntry[] = [];\n let historyToken = 0;\n /**\n * An entry created after the panel opened happened while the developer was\n * looking, so it is shown big, whatever started it (this panel's button, a\n * host's own queue). By time, not by \"not seen before\": a host that loads\n * its history after mounting would otherwise make every old render new.\n */\n let openedAt = open ? Date.now() : Infinity;\n const seenHistory = new Set<string>();\n\n let sessionEntries: DevPanelHistoryEntry[] = ownHistory\n ? readSessionHistory()\n : [];\n\n function record(entry: DevPanelHistoryEntry) {\n if (!ownHistory || disposed) return;\n sessionEntries = [\n entry,\n ...sessionEntries.filter((each) => each.id !== entry.id),\n ].slice(0, SESSION_HISTORY_MAX);\n writeSessionHistory(sessionEntries);\n historyEntries = liveEntries(sessionEntries);\n paintHistory();\n }\n\n /** A finished render or video, from an action of the panel's or a job it\n * followed. The same job seen both ways is one entry (by id). */\n function recordResult(\n id: string | undefined,\n result: {\n url: string;\n width?: number;\n height?: number;\n format?: string;\n frames?: number;\n quality?: string;\n cost?: number;\n expiresAt?: number;\n },\n kind?: DevPanelTab,\n ) {\n const isVideo =\n kind === 'video' || /^(mp4|webm|mov)$/.test(result.format ?? '');\n const createdAt = Date.now();\n record({\n id: id ?? `${isVideo ? 'video' : 'render'}-${createdAt}`,\n kind: isVideo ? 'video' : 'render',\n createdAt: new Date(createdAt).toISOString(),\n expiresAt: new Date(\n result.expiresAt ?? createdAt + URL_LIFETIME_MS,\n ).toISOString(),\n meta: {\n ...(result.width ? { width: result.width } : {}),\n ...(result.height ? { height: result.height } : {}),\n ...(result.format ? { format: result.format } : {}),\n ...(result.frames ? { frames: result.frames } : {}),\n ...(result.quality ? { quality: result.quality } : {}),\n ...(result.cost !== undefined ? { cost: result.cost } : {}),\n },\n ...(isVideo ? {} : { thumbnail: result.url }),\n artifact: result.url,\n });\n }\n\n async function refreshHistory() {\n if (disposed) return;\n if (ownHistory) {\n historyEntries = liveEntries(sessionEntries);\n paintHistory();\n return;\n }\n if (!options.history) return;\n const token = ++historyToken;\n try {\n const entries = await options.history.list();\n if (token !== historyToken || disposed) return;\n historyEntries = entries;\n showFreshEntries(entries);\n } catch {\n // A history endpoint that is down is not worth a red line across the\n // panel; the section simply stays empty.\n historyEntries = [];\n }\n paintHistory();\n }\n\n function showFreshEntries(entries: DevPanelHistoryEntry[]) {\n if (!open) return;\n // Newest first, so the first fresh entry of a kind is its latest.\n const fresh = (kind: DevPanelTab) =>\n entries.find(\n (entry) =>\n entry.kind === kind &&\n !seenHistory.has(entry.id) &&\n Date.parse(entry.createdAt) >= openedAt,\n );\n const render = fresh('render');\n const video = fresh('video');\n if (render) renderTab?.showEntry(render);\n if (video) videoTab?.showEntry(video);\n for (const entry of entries) seenHistory.add(entry.id);\n }\n\n function paintHistory() {\n renderTab?.paintHistory(\n historyEntries.filter((entry) => entry.kind === 'render'),\n );\n videoTab?.paintHistory(\n historyEntries.filter((entry) => entry.kind === 'video'),\n );\n bakeTab?.paintHistory(\n historyEntries.filter((entry) => entry.kind === 'bake'),\n );\n }\n\n // ---- jobs ---------------------------------------------------------------\n\n let hostJobs: DevPanelJob[] = [];\n /** Rows this panel follows, by a key that stays put when a row started by\n * `startJob` is handed to its job, so the row never moves. */\n const trackedJobs = new Map<string, DevPanelJob>();\n /** Finished rows kept until the action that started them has shown its\n * result: the row and the old picture then leave in one step, instead of\n * the panel shrinking and growing again a moment later. */\n const lingering = new Set<string>();\n let actionsInFlight = 0;\n let pendingRows = 0;\n\n /** Ids drawn last paint, so a job that leaves the strip refreshes Recent,\n * where it now belongs, without the host having to ask. */\n let activeJobIds = new Set<string>();\n let rowsShown = 0;\n\n function paintJobs() {\n const jobs = [\n ...[...trackedJobs]\n .filter(\n ([key, job]) =>\n lingering.has(key) || !TERMINAL_JOB_STATES.has(job.state),\n )\n .map(([, job]) => job),\n ...hostJobs.filter((job) => !TERMINAL_JOB_STATES.has(job.state)),\n ];\n const ids = new Set(jobs.map((job) => job.id));\n const ended = [...activeJobIds].some((id) => !ids.has(id));\n activeJobIds = ids;\n rowsShown = jobs.length;\n jobsList.replaceChildren(...jobs.map(jobRow));\n jobsRow.style.display = jobs.length ? 'block' : 'none';\n paintProgress();\n if (ended) void refreshHistory();\n }\n\n /** A row the panel no longer follows: gone now, or, when it finished\n * inside an action, once that action has shown what it made. */\n function retire(key: string, entry: DevPanelJob) {\n if (entry.state === 'completed' && actionsInFlight > 0) lingering.add(key);\n else trackedJobs.delete(key);\n paintJobs();\n }\n\n function releaseLingering() {\n if (!lingering.size) return;\n for (const key of lingering) trackedJobs.delete(key);\n lingering.clear();\n paintJobs();\n }\n\n /**\n * A job's events, onto its row; the returned functions detach them.\n * `recordOnComplete` is for a job the page started (its own button): one\n * the panel started goes into Recent when its picture is on screen, in the\n * same step, rather than a moment before it.\n */\n function attach(\n entry: DevPanelJob,\n job: TrackableJob,\n recordOnComplete: boolean,\n ): Array<() => void> {\n entry.id = job.id;\n entry.state = job.status;\n entry.progress = job.progress;\n delete entry.detail;\n if (job.previewUrl) entry.previewUrl = job.previewUrl;\n if (job.cancel) {\n entry.onCancel = () => {\n // A cancel that cannot reach the server says so; the row stays\n // until the job really ends.\n const failed = (error: unknown) =>\n panel.setStatus(describe(error), 'error');\n try {\n void Promise.resolve(job.cancel!()).catch(failed);\n } catch (error) {\n failed(error);\n }\n };\n }\n return [\n job.on('progress', (payload) => {\n if (payload.state) entry.state = payload.state;\n if (payload.percent !== undefined)\n entry.progress = payload.percent / 100;\n paintJobs();\n }),\n job.on('preview', (payload) => {\n if (payload.url) entry.previewUrl = payload.url;\n paintJobs();\n }),\n job.on('complete', (payload) => {\n entry.state = 'completed';\n entry.progress = 1;\n const result = payload.result;\n if (result?.url) {\n entry.resultUrl = result.url;\n if (recordOnComplete) recordResult(job.id, result);\n }\n paintJobs();\n }),\n job.on('failed', (payload) => {\n entry.state = 'failed';\n if (payload.error?.message) entry.detail = payload.error.message;\n // The row leaves the strip, so the reason has to land somewhere.\n panel.setStatus(\n `${entry.label} failed${entry.detail ? `: ${entry.detail}` : ''}`,\n 'error',\n );\n paintJobs();\n }),\n job.on('cancelled', () => {\n entry.state = 'cancelled';\n paintJobs();\n }),\n ];\n }\n\n // ---- progress -----------------------------------------------------------\n\n let progressLabel: string | null = null;\n let progressFraction: number | undefined;\n\n /**\n * The bar under the action, for a host that reports no jobs (a local\n * worker answering one POST). When a row in the jobs strip is following\n * the work it says everything the bar would, so the bar stays hidden\n * rather than flashing up and vanishing as the row arrives.\n */\n function paintProgress() {\n if (progressLabel === null || rowsShown > 0) {\n progressRow.style.display = 'none';\n return;\n }\n progressRow.style.display = 'block';\n progressText.textContent = progressLabel;\n // No fraction is an honest indeterminate: a single POST that answers\n // only at the end cannot report 40%, so it says so with a full sweep\n // rather than a bar that lies.\n progressFill.style.width =\n progressFraction === undefined\n ? '100%'\n : `${Math.round(Math.max(0, Math.min(1, progressFraction)) * 100)}%`;\n progressFill.style.opacity = progressFraction === undefined ? '0.35' : '1';\n }\n\n /** A tab's Recent heading and list, one block, so it can hide as one. */\n function historySection(list: HTMLElement): HTMLElement {\n const section = div({});\n section.append(span('recent', SECTION_LABEL), list);\n // Hidden until there is something in it: a heading over an empty list\n // on first open is a question nobody can answer yet. A host's own\n // history keeps its \"nothing yet\", because it is the host's list.\n section.style.display = ownHistory ? 'none' : 'block';\n return section;\n }\n\n function paintSection(section: HTMLElement, rows: number) {\n section.style.display = !ownHistory || rows ? 'block' : 'none';\n }\n\n function downloadButton(\n entry: DevPanelHistoryEntry,\n part?: 'glb',\n ): HTMLButtonElement | null {\n const download = options.history?.download;\n if (!download) return null;\n const element = button(part === 'glb' ? 'GLB' : 'Download', GHOST);\n element.title = `download ${part === 'glb' ? 'the portable GLB' : 'this artifact'}`;\n element.onclick = async () => {\n try {\n await download(entry, part);\n } catch (error) {\n panel.setStatus(describe(error), 'error');\n }\n };\n return element;\n }\n\n // ---- primary action -----------------------------------------------------\n\n /**\n * Renders and videos run side by side: the button is free again the moment\n * one is started, each has its own row in the jobs strip, and that row's ×\n * is where it is cancelled. A bake applies itself to the scene when it\n * lands, so one bakes at a time.\n */\n let baking = false;\n\n function paintAction() {\n const busy = tab === 'bake' && baking;\n action.disabled = busy;\n action.style.opacity = busy ? '0.6' : '1';\n }\n\n async function runAction() {\n const kind = tab;\n if (kind === 'bake') {\n if (baking) return;\n baking = true;\n paintAction();\n }\n panel.setStatus('');\n actionsInFlight += 1;\n try {\n try {\n if (kind === 'render' && renderTab) await renderTab.run();\n else if (kind === 'video' && videoTab) await videoTab.run();\n else if (kind === 'bake' && bakeTab) await bakeTab.run();\n } finally {\n // The result is on screen now (run() waits for it), so its row\n // leaves in the same frame rather than a moment before. Not waiting\n // for the others: a render still tracing beside it keeps its own row.\n actionsInFlight -= 1;\n releaseLingering();\n }\n await refreshHistory();\n // What it spent came off the balance, so the next one may now be\n // refused: said beside the button, before it is pressed again.\n void refreshCost(true);\n } catch (error) {\n panel.setStatus(describe(error), 'error');\n } finally {\n if (kind === 'bake') {\n baking = false;\n paintAction();\n }\n if (actionsInFlight === 0) panel.setProgress(null);\n }\n }\n // A double click is one render, not two: its second click says so.\n action.onclick = (event: MouseEvent) => {\n if (event?.detail > 1) return;\n void runAction();\n };\n\n // ---- painting -----------------------------------------------------------\n\n function paintTab() {\n for (const [name, element] of tabButtons) {\n const active = name === tab;\n element.style.opacity = active ? '1' : '0.55';\n element.style.borderBottomColor = active ? BLUE : 'transparent';\n element.style.fontWeight = active ? '600' : '400';\n }\n for (const [name, body] of [\n ['render', renderTab],\n ['video', videoTab],\n ['bake', bakeTab],\n ] as const) {\n if (!body) continue;\n body.element.style.display = tab === name ? 'block' : 'none';\n body.settings.style.display = tab === name ? 'flex' : 'none';\n }\n action.textContent =\n tab === 'render' ? 'Render' : tab === 'video' ? 'Render video' : 'Bake';\n paintAction();\n }\n\n function paintOpen() {\n fab.style.display = open ? 'none' : 'flex';\n card.style.display = open ? 'flex' : 'none';\n }\n\n const panel: DevPanel = {\n open() {\n if (disposed || open) return;\n open = true;\n openedAt = Date.now();\n paintOpen();\n options.onOpenChange?.(true);\n panel.refresh();\n startWatching();\n // Asked afresh: the balance or the key may have changed while the\n // panel was closed.\n void refreshCost(true);\n },\n close() {\n if (disposed || !open) return;\n open = false;\n openedAt = Infinity;\n paintOpen();\n stopWatching();\n options.onOpenChange?.(false);\n },\n setTab(next) {\n if (disposed || !tabs.includes(next)) return;\n tab = next;\n paintTab();\n void refreshCost();\n },\n refresh() {\n if (disposed) return;\n paintCompatibility();\n bakeTab?.paintCandidates();\n bakeTab?.paintGenerations();\n videoTab?.refreshTimeline();\n void refreshHistory();\n },\n refreshCost() {\n void refreshCost(true);\n },\n setStatus(message, tone = 'info') {\n statusFromEstimate = false;\n // Links are links: a docs page, the keys page, the billing page.\n statusRow.replaceChildren(...linkified(message));\n statusRow.style.display = message ? 'block' : 'none';\n statusRow.style.color =\n tone === 'error'\n ? ERROR\n : tone === 'ok'\n ? BLUE\n : 'rgba(244,244,245,0.75)';\n },\n setJobs(jobs) {\n hostJobs = jobs;\n paintJobs();\n },\n trackJob(job, label) {\n const key = job.id;\n const entry: DevPanelJob = {\n id: job.id,\n label: label ?? `render ${job.id.slice(0, 8)}`,\n state: job.status,\n };\n trackedJobs.set(key, entry);\n const offs = attach(entry, job, true);\n paintJobs();\n let ended = false;\n return () => {\n if (ended) return;\n ended = true;\n for (const off of offs) off();\n retire(key, entry);\n };\n },\n startJob(label) {\n pendingRows += 1;\n const key = `pending:${pendingRows}`;\n const entry: DevPanelJob = {\n id: key,\n label,\n state: 'preparing',\n detail: 'capturing the scene',\n };\n trackedJobs.set(key, entry);\n paintJobs();\n let offs: Array<() => void> = [];\n let ended = false;\n return {\n update(detail, progress, state) {\n if (ended || disposed) return;\n if (state) entry.state = state;\n entry.detail = detail;\n if (progress === undefined) delete entry.progress;\n else entry.progress = progress;\n paintJobs();\n },\n follow(job) {\n if (ended || disposed) return;\n for (const off of offs) off();\n offs = attach(entry, job, false);\n paintJobs();\n },\n end() {\n if (ended) return;\n ended = true;\n for (const off of offs) off();\n retire(key, entry);\n },\n };\n },\n setProgress(text, fraction) {\n progressLabel = text;\n progressFraction = fraction;\n if (text === null) progressFill.style.width = '0%';\n paintProgress();\n },\n dispose() {\n if (disposed) return;\n disposed = true;\n stopWatching();\n videoTab?.dispose();\n bakeTab?.dispose();\n root.remove();\n },\n };\n\n paintTab();\n paintOpen();\n if (open) {\n panel.refresh();\n startWatching();\n void refreshCost(true);\n } else {\n bakeTab?.paintCandidates();\n bakeTab?.paintGenerations();\n }\n\n return panel;\n\n // -------------------------------------------------------------------------\n // Tab builders: closures over the shell above, so they can drive the\n // shared status line, the shared progress bar and the shared lock state.\n // -------------------------------------------------------------------------\n\n function buildRenderTab(config: DevPanelRenderOptions) {\n const element = div({ display: 'none' });\n const qualities = config.qualities ?? ['preview', 'studio', 'ultra'];\n const sizes = config.sizes ?? [512, 768, 1024, 2048];\n\n const qualitySelect = select(qualities.map((value) => [value, value]));\n qualitySelect.value = config.defaultQuality ?? qualities[0]!;\n // The long edge. The other one follows the frame the host renders, so a\n // wide viewport comes back wide instead of cropped to a square.\n const sizeSelect = select(\n sizes.map((value) => [String(value), `${value}`]),\n );\n sizeSelect.value = String(config.defaultSize ?? sizes[0]!);\n const readout = span('', OUTPUT_READOUT);\n const output = () =>\n outputSize({}, Number(sizeSelect.value), readAspect(config.aspect));\n\n const settings = div({ display: 'flex', gap: '6px', marginTop: '10px' });\n settings.append(\n labeled('quality', qualitySelect),\n labeled('long edge', sizeSelect),\n labeled('output', readout),\n );\n\n const paintOutput = () => {\n const { width, height } = output();\n readout.textContent = `${width} × ${height} png`;\n };\n paintOutput();\n qualitySelect.onchange = () => void refreshCost();\n sizeSelect.onchange = () => {\n paintOutput();\n void refreshCost();\n };\n\n const result = div({ marginTop: '10px' });\n /** The history id the result area is showing, so the history refresh\n * that follows a run does not repaint the same render with less said. */\n let shownId: string | undefined;\n const showOutcome = async (outcome: DevPanelActionResult | undefined) => {\n if (!outcome?.url) return;\n shownId = outcome.entry?.id ?? outcome.id;\n if (shownId) seenHistory.add(shownId);\n await paintResult(result, outcome, downloadButton);\n // After the picture, in the same step as it: Recent growing first\n // and the picture a moment later moved the panel twice.\n recordResult(outcome.id, { ...outcome, url: outcome.url }, 'render');\n paintList();\n };\n const historyList = div(HISTORY_LIST);\n const history = historySection(historyList);\n let listed: DevPanelHistoryEntry[] = [];\n const paintList = () => {\n paintHistoryList(historyList, listed, downloadButton, showEntry, shownId);\n paintSection(history, listed.length);\n };\n\n element.append(result, history);\n\n return {\n element,\n settings,\n paintOutput,\n estimateRequest(): DevPanelEstimateRequest {\n return { kind: 'render', quality: qualitySelect.value, ...output() };\n },\n async run() {\n panel.setProgress('Rendering…');\n const outcome = await config.onRender({\n quality: qualitySelect.value,\n ...output(),\n });\n await showOutcome(outcome ?? undefined);\n },\n paintHistory(entries: DevPanelHistoryEntry[]) {\n listed = entries;\n paintList();\n },\n showEntry,\n };\n\n function showEntry(entry: DevPanelHistoryEntry) {\n if (entry.id === shownId) return;\n const url = entry.artifact ?? entry.thumbnail;\n if (!url) return;\n shownId = entry.id;\n paintList();\n void paintResult(\n result,\n {\n url,\n meta: describeEntry(entry),\n isVideo: false,\n entry,\n ...(entry.meta?.width ? { width: entry.meta.width } : {}),\n ...(entry.meta?.height ? { height: entry.meta.height } : {}),\n },\n downloadButton,\n );\n }\n }\n\n function buildVideoTab(config: DevPanelVideoOptions) {\n const element = div({ display: 'none' });\n const qualities = config.qualities ?? ['preview', 'studio', 'ultra'];\n // Up to the stills' largest, with 720p and 1080p on the way.\n const sizes = config.sizes ?? [256, 512, 768, 1024, 1280, 1920, 2048];\n const formats = config.formats ?? (['mp4', 'webm'] as const);\n\n const qualitySelect = select(qualities.map((value) => [value, value]));\n qualitySelect.value = config.defaultQuality ?? qualities[0]!;\n const sizeSelect = select(\n sizes.map((value) => [String(value), `${value}`]),\n );\n sizeSelect.value = String(config.defaultSize ?? sizes[0]!);\n const formatSelect = select(formats.map((value) => [value, value]));\n formatSelect.value = config.defaultFormat ?? formats[0]!;\n const readout = span('', OUTPUT_READOUT);\n const output = () =>\n outputSize({}, Number(sizeSelect.value), readAspect(config.aspect), {\n even: true,\n });\n const paintOutput = () => {\n const { width, height } = output();\n readout.textContent = `${width} × ${height}`;\n };\n paintOutput();\n\n const settings = div({ display: 'flex', gap: '6px', marginTop: '10px' });\n settings.append(\n labeled('quality', qualitySelect),\n labeled('long edge', sizeSelect),\n labeled('format', formatSelect),\n labeled('output', readout),\n );\n for (const control of [qualitySelect, sizeSelect, formatSelect]) {\n control.onchange = () => {\n paintOutput();\n void refreshCost();\n };\n }\n\n // The same timeline UI the standalone panel mounts, not a second\n // implementation of it.\n const body: TimelineBody = buildTimelineBody({\n timeline: config.timeline,\n ...(config.targets ? { targets: config.targets } : {}),\n ...(config.onPlaybackChange\n ? { onPlaybackChange: config.onPlaybackChange }\n : {}),\n onRenderVideo: async () => {\n const outcome = await config.onRenderVideo({\n quality: qualitySelect.value,\n ...output(),\n format: formatSelect.value as 'mp4' | 'webm',\n timeline: config.timeline,\n });\n await showOutcome(outcome ?? undefined);\n },\n // The action lives in the shared action bar next to the price.\n showRenderButton: false,\n style: { marginTop: '4px' },\n });\n\n // A frame count that moves with the duration should move the price too.\n const offChange = config.timeline.on('change', () => void refreshCost());\n\n const result = div({ marginTop: '4px' });\n /** The history id the result area is showing, so the history refresh\n * that follows a run does not repaint the same render with less said. */\n let shownId: string | undefined;\n const showOutcome = async (outcome: DevPanelActionResult | undefined) => {\n if (!outcome?.url) return;\n shownId = outcome.entry?.id ?? outcome.id;\n if (shownId) seenHistory.add(shownId);\n await paintResult(result, outcome, downloadButton);\n recordResult(\n outcome.id,\n {\n ...outcome,\n url: outcome.url,\n frames: outcome.frames ?? config.timeline.frameCount,\n },\n 'video',\n );\n paintList();\n };\n const historyList = div(HISTORY_LIST);\n const history = historySection(historyList);\n let listed: DevPanelHistoryEntry[] = [];\n const paintList = () => {\n paintHistoryList(historyList, listed, downloadButton, showEntry, shownId);\n paintSection(history, listed.length);\n };\n // What reconcile() did, in the tab it happened in. A track silently\n // re-pointed at a different object is exactly as bad as one silently\n // dropped, so both are said out loud.\n const repairLine = span('', {\n fontSize: '11px',\n marginTop: '6px',\n display: 'none',\n whiteSpace: 'pre-wrap',\n });\n\n element.append(body.element, repairLine, result, history);\n\n return {\n element,\n settings,\n paintOutput,\n estimateRequest(): DevPanelEstimateRequest {\n return {\n kind: 'video',\n quality: qualitySelect.value,\n ...output(),\n frames: config.timeline.frameCount,\n fps: config.timeline.fps,\n format: formatSelect.value as 'mp4' | 'webm',\n };\n },\n async run() {\n // An empty timeline would film one frame of nothing moving, or be\n // refused far from here with a message about tracks. Say what to do.\n if (!config.timeline.tracks.length) {\n panel.setStatus(\n 'The timeline has no keyframes yet. Frame the shot and press Keyframe camera, move the playhead, frame the next shot and press it again. Then press Render video.',\n 'error',\n );\n return;\n }\n panel.setProgress(`Rendering ${config.timeline.frameCount} frames…`);\n await body.renderVideo();\n },\n refreshTimeline() {\n body.refresh(config.targets);\n },\n /**\n * Re-attach tracks to a rebuilt scene, and say what happened.\n *\n * A stale track is repaired where possible and removed where not: a lane\n * that can only refuse at export is not a lane, and leaving it there\n * means the developer finds out by pressing Render.\n */\n reconcile() {\n const scene = config.scene?.();\n if (!scene) return;\n const { healed, stale } = config.timeline.reconcile(scene);\n for (const track of stale) config.timeline.removeTrack(track.trackId);\n if (healed.length || stale.length) body.refresh(config.targets);\n\n const notes: string[] = [];\n if (healed.length) {\n notes.push(\n `re-attached ${healed.length} track${healed.length === 1 ? '' : 's'} to the rebuilt scene`,\n );\n }\n for (const track of stale) {\n notes.push(\n `dropped \"${track.label} · ${track.property}\": ${track.reason}`,\n );\n }\n repairLine.textContent = notes.join('\\n');\n repairLine.style.color = stale.length\n ? WARNING\n : 'rgba(244,244,245,0.55)';\n repairLine.style.display = notes.length ? 'block' : 'none';\n },\n paintHistory(entries: DevPanelHistoryEntry[]) {\n listed = entries;\n paintList();\n },\n showEntry,\n dispose() {\n offChange();\n body.dispose();\n },\n };\n\n function showEntry(entry: DevPanelHistoryEntry) {\n if (entry.id === shownId) return;\n const url = entry.artifact ?? entry.thumbnail;\n if (!url) return;\n shownId = entry.id;\n paintList();\n void paintResult(\n result,\n {\n url,\n meta: describeEntry(entry),\n isVideo: true,\n entry,\n ...(entry.meta?.width ? { width: entry.meta.width } : {}),\n ...(entry.meta?.height ? { height: entry.meta.height } : {}),\n },\n downloadButton,\n );\n }\n }\n\n function buildBakeTab(config: DevPanelBakeOptions) {\n const element = div({ display: 'none' });\n const { session } = config;\n const qualities =\n config.qualities ?? (['preview', 'standard', 'high'] as BakeQuality[]);\n const sizes = config.sizes ?? ([256, 512, 1024, 2048] as BakeTextureSize[]);\n\n const qualitySelect = select(qualities.map((value) => [value, value]));\n qualitySelect.value = config.defaultQuality ?? 'standard';\n const sizeSelect = select(\n sizes.map((value) => [String(value), `${value}²`]),\n );\n sizeSelect.value = String(config.defaultSize ?? 1024);\n\n const settings = div({ display: 'flex', gap: '6px', marginTop: '10px' });\n settings.append(\n labeled('texture size', sizeSelect),\n labeled('quality', qualitySelect),\n );\n for (const control of [qualitySelect, sizeSelect]) {\n control.onchange = () => void refreshCost();\n }\n\n /** Sticky per objectId, so repainting the list after a scene edit does\n * not silently re-tick a box the developer just cleared. */\n const ticked = new Map<string, boolean>();\n const objectList = div({\n maxHeight: '168px',\n overflowY: 'auto',\n border: '1px solid rgba(255,255,255,0.06)',\n borderRadius: '6px',\n padding: '4px 6px',\n });\n\n // Both are about the bake on the scene, so they show only while one is.\n const appliedRow = div({\n display: 'none',\n alignItems: 'center',\n gap: '12px',\n marginTop: '8px',\n });\n const compareButton = button('Hold to compare', GHOST);\n compareButton.title = 'hold to see the scene without the bake';\n const muteToggle = document.createElement('input');\n muteToggle.type = 'checkbox';\n muteToggle.style.accentColor = BLUE;\n const muteLabel = span('Mute realtime lights', {\n fontSize: '11px',\n opacity: '0.75',\n });\n muteLabel.title =\n \"The lightmap already replaces the diffuse light from this scene's lamps; they only add highlights now. Muting them shows the bake on its own. Reflections from an environment map keep running.\";\n const mute = div({ display: 'flex', alignItems: 'center', gap: '6px' });\n mute.append(muteToggle, muteLabel);\n appliedRow.append(compareButton, mute);\n\n const reportLine = span('', {\n display: 'none',\n marginTop: '8px',\n fontSize: '11px',\n color: WARNING,\n whiteSpace: 'pre-wrap',\n });\n\n const historyList = div(HISTORY_LIST);\n const history = historySection(historyList);\n /** Bakes the host's history lists, for the ones not made here. */\n let hostBakes: DevPanelHistoryEntry[] = [];\n\n element.append(\n span('objects', SECTION_LABEL),\n objectList,\n history,\n appliedRow,\n reportLine,\n );\n\n /** generation index → the history entry it produced, so its Download\n * button is the same gated path everything else uses. */\n const entryByGeneration = new Map<number, DevPanelHistoryEntry>();\n\n function include(): string[] {\n return session\n .candidates()\n .filter(\n (candidate) => candidate.bakeable && ticked.get(candidate.objectId),\n )\n .map((candidate) => candidate.objectId);\n }\n\n function texels(): number {\n const size = Number(sizeSelect.value);\n return include().length * size * size;\n }\n\n function paintCandidates() {\n const candidates = session.candidates();\n // What actually happened to each object in the generation on screen:\n // a fact in the list, not an inference from how the scene looks. A\n // floor the realtime key light already floods takes a bake with almost\n // no visible change, and \"did it apply?\" must not depend on noticing one.\n const report =\n session.current >= 0 &&\n session.lastReport?.generation === session.current\n ? session.lastReport\n : null;\n const applied = new Set(report?.applied ?? []);\n const applySkips = new Map(\n (report?.skipped ?? []).map((skip) => [skip.objectId, skip]),\n );\n const workerSkips = new Map(\n (report\n ? (session.generations[session.current]?.bundle.skipped ?? [])\n : []\n ).map((skip) => [skip.objectId, skip]),\n );\n objectList.replaceChildren();\n if (!candidates.length) {\n objectList.appendChild(\n span('no meshes in this scene yet', {\n opacity: '0.45',\n fontSize: '11px',\n }),\n );\n return;\n }\n for (const candidate of candidates) {\n if (!ticked.has(candidate.objectId)) {\n ticked.set(\n candidate.objectId,\n candidate.bakeable && candidate.defaultInclude,\n );\n }\n const row = div({\n display: 'flex',\n alignItems: 'center',\n gap: '6px',\n padding: '2px 0',\n });\n const box = document.createElement('input');\n box.type = 'checkbox';\n box.style.accentColor = BLUE;\n box.checked =\n Boolean(ticked.get(candidate.objectId)) && candidate.bakeable;\n box.disabled = !candidate.bakeable;\n box.onchange = () => {\n ticked.set(candidate.objectId, box.checked);\n void refreshCost();\n };\n const name = span(candidate.name, {\n flex: '1 1 auto',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n fontSize: '11px',\n opacity: candidate.bakeable ? '0.9' : '0.5',\n });\n name.title = candidate.path;\n row.append(box, name);\n if (report) {\n const skip =\n applySkips.get(candidate.objectId) ??\n workerSkips.get(candidate.objectId);\n if (applied.has(candidate.objectId)) {\n const lit = span('✓', {\n flex: '0 0 auto',\n color: BLUE,\n cursor: 'help',\n });\n lit.title = 'lit by the applied bake';\n row.appendChild(lit);\n } else if (skip) {\n const missed = span('✗', {\n flex: '0 0 auto',\n color: WARNING,\n cursor: 'help',\n });\n missed.title = [skip.message, skip.why, skip.fix]\n .filter(Boolean)\n .join('\\n\\n');\n row.appendChild(missed);\n }\n }\n if (candidate.reason) {\n // The refusal, in place, on the object it is about, with reason and\n // fix in the tooltip so the list stays scannable.\n const warn = span(candidate.bakeable ? '·' : '⚠', {\n flex: '0 0 auto',\n color: candidate.bakeable ? 'rgba(244,244,245,0.4)' : WARNING,\n cursor: 'help',\n });\n warn.title = [\n candidate.reason.message,\n candidate.reason.why,\n candidate.reason.fix,\n ]\n .filter(Boolean)\n .join('\\n\\n');\n row.appendChild(warn);\n }\n objectList.appendChild(row);\n }\n }\n\n /**\n * Recent, for bakes: every bake made here, newest first, as the same rows\n * the other tabs list. A click puts a bake on the scene, and a click on\n * the one that is on it takes it off again.\n */\n function paintGenerations() {\n const rows: HTMLElement[] = [];\n for (let index = session.generations.length - 1; index >= 0; index--) {\n rows.push(generationRow(index));\n }\n // Bakes in the host's history that were not made here: their lightmaps\n // are not loaded, but their files can still be downloaded.\n const linked = new Set(\n [...entryByGeneration.values()].map((entry) => entry.id),\n );\n for (const entry of hostBakes) {\n const download = linked.has(entry.id) ? null : downloadButton(entry);\n if (!download) continue;\n rows.push(\n recentRow({\n tile: bakeTile(false),\n title: entryTitle(entry),\n meta: entryMeta(entry),\n selected: false,\n actions: [download],\n }),\n );\n }\n historyList.replaceChildren(...rows);\n if (!rows.length) {\n historyList.appendChild(\n span('nothing yet', { opacity: '0.4', fontSize: '11px' }),\n );\n }\n paintSection(history, rows.length);\n\n const applied = session.current >= 0;\n appliedRow.style.display = applied ? 'flex' : 'none';\n muteToggle.checked = session.lightsMuted;\n\n const notes: string[] = [];\n const report = session.lastReport;\n if (applied && report && report.generation >= 0) {\n if (report.unmatched.length) {\n notes.push(\n `${report.unmatched.length} baked object${report.unmatched.length === 1 ? '' : 's'} no longer exist${report.unmatched.length === 1 ? 's' : ''}`,\n );\n }\n if (report.unbaked.length) {\n notes.push(\n `${report.unbaked.length} new object${report.unbaked.length === 1 ? ' is' : 's are'} unbaked`,\n );\n }\n for (const skip of report.skipped) notes.push(`${skip.message}`);\n }\n const skipped = applied\n ? (session.generations[session.current]?.bundle.skipped ?? [])\n : [];\n if (skipped.length) {\n notes.push(\n `${skipped.length} object${skipped.length === 1 ? '' : 's'} skipped by the bake, hover the list`,\n );\n }\n reportLine.textContent = notes.join(' · ');\n reportLine.style.display = notes.length ? 'block' : 'none';\n }\n\n function generationRow(index: number): HTMLElement {\n const generation = session.generations[index]!;\n const { settings, objects, skipped } = generation.bundle;\n const applied = session.current === index;\n const entry = entryByGeneration.get(index);\n const actions: HTMLElement[] = [];\n if (entry) {\n const bundle = downloadButton(entry);\n if (bundle) {\n bundle.textContent = 'Bundle';\n actions.push(bundle);\n }\n if (generation.bundle.glb) {\n const glb = downloadButton(entry, 'glb');\n if (glb) actions.push(glb);\n }\n }\n const cost = entry?.meta?.cost;\n return recentRow({\n tile: bakeTile(applied),\n title: `${objects.length} object${objects.length === 1 ? '' : 's'} · ${settings.textureSize}²`,\n meta: [\n ago(generation.createdAt),\n settings.quality,\n skipped.length ? `${skipped.length} skipped` : undefined,\n cost !== undefined ? `$${cost.toFixed(2)}` : undefined,\n ]\n .filter(Boolean)\n .join(' · '),\n selected: applied,\n pick: applied\n ? {\n hint: 'Take it off: back to the live scene',\n run: () => {\n session.revert();\n paintGenerations();\n },\n }\n : {\n hint: 'Put this bake on the scene',\n run: () => void applyGeneration(index),\n },\n actions,\n });\n }\n\n async function applyGeneration(index: number) {\n try {\n panel.setProgress('Applying…');\n await session.apply(index);\n panel.setStatus('');\n } catch (error) {\n panel.setStatus(describe(error), 'error');\n } finally {\n panel.setProgress(null);\n paintGenerations();\n }\n }\n\n // Pointer, not mouse: a trackpad, a pen and a touch screen all release.\n // `pointerleave` matters as much as `pointerup`: dragging off the button\n // must not leave the scene stuck on live.\n compareButton.addEventListener('pointerdown', () => session.compare(true));\n for (const event of [\n 'pointerup',\n 'pointercancel',\n 'pointerleave',\n ] as const) {\n compareButton.addEventListener(event, () => session.compare(false));\n }\n\n muteToggle.onchange = () => session.muteLights(muteToggle.checked);\n\n const offSession = session.on('change', () => {\n // Candidates too: the per-object ✓/✗ outcome badges follow the applied\n // generation, not just the strip.\n paintCandidates();\n paintGenerations();\n });\n\n paintCandidates();\n paintGenerations();\n\n return {\n element,\n settings,\n estimateRequest(): DevPanelEstimateRequest {\n const chosen = include();\n return {\n kind: 'bake',\n quality: qualitySelect.value as BakeQuality,\n textureSize: Number(sizeSelect.value),\n objects: chosen.length,\n texels: texels(),\n include: chosen,\n };\n },\n async run() {\n const chosen = include();\n if (!chosen.length) {\n panel.setStatus(\n 'Nothing is ticked. Choose at least one object to bake.',\n 'error',\n );\n return;\n }\n panel.setProgress(\n `Baking… (${chosen.length} object${chosen.length === 1 ? '' : 's'})`,\n );\n const outcome = await config.onBake({\n quality: qualitySelect.value as BakeQuality,\n textureSize: Number(sizeSelect.value) as BakeTextureSize,\n include: chosen,\n });\n if (outcome?.entry !== undefined && outcome.generation !== undefined) {\n entryByGeneration.set(outcome.generation, outcome.entry);\n }\n paintCandidates();\n paintGenerations();\n },\n paintCandidates,\n paintGenerations,\n paintHistory(entries: DevPanelHistoryEntry[]) {\n // A bake made here is listed from the session, which can put it back\n // on the scene; only a host's history reaches further back.\n hostBakes = ownHistory ? [] : entries;\n paintGenerations();\n },\n dispose() {\n offSession();\n },\n };\n }\n}\n\n// ---------------------------------------------------------------------------\n// Shared painting\n// ---------------------------------------------------------------------------\n\n/**\n * `callback` on the first animation frame at least WATCH_MS from now. A page\n * in a background tab draws no frames, so nothing is looked at until it is\n * back. Without frames at all (a test, a worker) it is the timer alone.\n */\nfunction afterAWhile(callback: () => void): () => void {\n let frame: number | undefined;\n const timer = setTimeout(() => {\n if (typeof requestAnimationFrame === 'function') {\n frame = requestAnimationFrame(() => callback());\n } else {\n callback();\n }\n }, WATCH_MS);\n return () => {\n clearTimeout(timer);\n if (frame !== undefined) cancelAnimationFrame(frame);\n };\n}\n\n/** The aspect a tab renders at, read now: the viewport may have been resized\n * since the panel mounted. Anything unusable is a square. */\nfunction readAspect(aspect: number | (() => number) | undefined): number {\n const value = typeof aspect === 'function' ? aspect() : (aspect ?? 1);\n return Number.isFinite(value) && value > 0 ? value : 1;\n}\n\n/** The settings an estimate prices, the breakdown's first line. What the\n * price is a multiple of (frames, objects) is the line under it. */\nfunction describeRequest(request: DevPanelEstimateRequest): string {\n if (request.kind === 'bake') {\n return `${request.quality} · ${request.textureSize}² per object`;\n }\n const size = `${request.width} × ${request.height}`;\n if (request.kind === 'video') {\n return `${request.quality} · ${size} · ${request.fps} fps · ${request.format}`;\n }\n return `${request.quality} · ${size}`;\n}\n\n/**\n * The price, taken apart for the hover: what it prices, the count it is made\n * of times the price of one (`96 frames × $0.039`), and the most it can come\n * to. The price of one is the estimate divided by the count, so the two\n * multiply back to what is beside the button.\n */\nfunction breakdownLines(\n request: DevPanelEstimateRequest,\n estimate: DevPanelEstimate,\n): HTMLElement[] {\n const muted: Style = { display: 'block', fontSize: '11px', opacity: '0.6' };\n const count =\n request.kind === 'video'\n ? { n: request.frames, unit: 'frame' }\n : request.kind === 'bake'\n ? { n: request.objects, unit: 'object' }\n : null;\n const approximate = estimate.approximate !== false;\n const lines: HTMLElement[] = [\n span(describeRequest(request), { ...muted, marginBottom: '4px' }),\n breakdownRow(\n count && count.n > 0\n ? `${count.n} ${count.unit}${count.n === 1 ? '' : 's'} × ${usd(estimate.usd / count.n, true)}`\n : approximate\n ? 'estimate'\n : 'price',\n `${approximate ? '≈ ' : ''}${usd(estimate.usd)}`,\n ),\n ];\n if (estimate.maximum !== undefined) {\n lines.push(breakdownRow('at most', usd(estimate.maximum)));\n }\n if (estimate.detail) {\n lines.push(span(estimate.detail, { ...muted, marginTop: '4px' }));\n }\n if (approximate) {\n lines.push(\n span('You pay for the GPU time used.', { ...muted, marginTop: '4px' }),\n );\n }\n return lines;\n}\n\nfunction breakdownRow(label: string, value: string): HTMLElement {\n const row = div({\n display: 'flex',\n justifyContent: 'space-between',\n gap: '24px',\n fontSize: '11px',\n });\n row.append(span(label, { opacity: '0.85' }), span(value, { color: BLUE }));\n return row;\n}\n\n/** Dollars to the cent; the price of one frame or one object to the tenth\n * of a cent when it is under a dime, where cents would round it away. */\nfunction usd(value: number, unit = false): string {\n const digits = unit ? (value < 0.01 ? 4 : value < 0.1 ? 3 : 2) : 2;\n return `$${value.toFixed(digits)}`;\n}\n\n/** A group of the compatibility panel: the object, then each thing about it\n * that renders differently, with the docs page that says what to do. */\nfunction issueGroup(\n path: string,\n issues: DevPanelCompatibility['issues'],\n): HTMLElement {\n const group = div({ padding: '4px 0' });\n const name = span(path ? objectName(path) : 'Scene', {\n display: 'block',\n fontSize: '11px',\n fontWeight: '600',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n });\n if (path) name.title = path;\n group.appendChild(name);\n for (const issue of issues) {\n const row = div({\n display: 'flex',\n alignItems: 'baseline',\n gap: '6px',\n marginTop: '2px',\n fontSize: '11px',\n });\n const [glyph, color] =\n issue.severity === 'error'\n ? ['✕', ERROR]\n : issue.severity === 'warning'\n ? ['⚠', WARNING]\n : ['i', 'rgba(244,244,245,0.5)'];\n row.append(\n span(glyph, { flex: '0 0 auto', width: '12px', color }),\n span(issue.message, {\n flex: '1 1 auto',\n minWidth: '0',\n opacity: '0.8',\n whiteSpace: 'normal',\n }),\n );\n if (issue.docs) {\n const docs = document.createElement('a');\n docs.textContent = 'docs';\n docs.href = issue.docs;\n docs.target = '_blank';\n docs.rel = 'noreferrer';\n Object.assign(docs.style, {\n flex: '0 0 auto',\n color: BLUE,\n textDecoration: 'none',\n });\n row.appendChild(docs);\n }\n group.appendChild(row);\n }\n return group;\n}\n\n/** `<Car>/<Body>/<Paint>` → `Paint`: the name the developer gave it. */\nfunction objectName(path: string): string {\n return /<([^>]*)>$/.exec(path)?.[1] || path;\n}\n\nfunction severityRank(severity: string): number {\n return severity === 'error' ? 0 : severity === 'warning' ? 1 : 2;\n}\n\nfunction issueCount(count: number): string {\n return `${count} thing${count === 1 ? '' : 's'} render${count === 1 ? 's' : ''} differently`;\n}\n\n/** A Bakery3Error's code, read structurally so the panel needs no client. */\nfunction errorCode(error: unknown): string | undefined {\n const code = (error as { code?: unknown } | null)?.code;\n return typeof code === 'string' ? code : undefined;\n}\n\nconst URL_PATTERN = /https:\\/\\/[^\\s<>\"')]*[^\\s<>\"').,;:]/g;\n\n/** A status message as text with its https:// URLs as real links. */\nfunction linkified(message: string): HTMLElement[] {\n const parts: HTMLElement[] = [];\n let last = 0;\n for (const match of message.matchAll(URL_PATTERN)) {\n const at = match.index ?? 0;\n if (at > last) parts.push(span(message.slice(last, at), {}));\n const link = document.createElement('a');\n link.textContent = match[0];\n link.href = match[0];\n link.target = '_blank';\n link.rel = 'noreferrer';\n Object.assign(link.style, {\n color: 'inherit',\n textDecoration: 'underline',\n textUnderlineOffset: '2px',\n });\n parts.push(link);\n last = at + match[0].length;\n }\n if (last < message.length) parts.push(span(message.slice(last), {}));\n return parts;\n}\n\n// ---------------------------------------------------------------------------\n// The panel's own history\n// ---------------------------------------------------------------------------\n\n/** Where the panel keeps its history: this origin's localStorage, so every\n * page of the app shares one list. Only what a result looks like and its\n * signed link; never a key or a token. */\nconst SESSION_HISTORY_KEY = 'bakery3.devtools.history';\nconst SESSION_HISTORY_MAX = 40;\n/** How long a signed result link lives when the result does not say. */\nconst URL_LIFETIME_MS = 24 * 60 * 60 * 1000;\n\nfunction readSessionHistory(): DevPanelHistoryEntry[] {\n try {\n const raw = globalThis.localStorage?.getItem(SESSION_HISTORY_KEY);\n const parsed: unknown = raw ? JSON.parse(raw) : [];\n if (!Array.isArray(parsed)) return [];\n return liveEntries(\n parsed.filter(\n (entry): entry is DevPanelHistoryEntry =>\n !!entry &&\n typeof entry === 'object' &&\n typeof (entry as DevPanelHistoryEntry).id === 'string' &&\n typeof (entry as DevPanelHistoryEntry).createdAt === 'string',\n ),\n );\n } catch {\n // Storage off (a private window, a sandboxed frame): this session only.\n return [];\n }\n}\n\nfunction writeSessionHistory(entries: DevPanelHistoryEntry[]): void {\n try {\n globalThis.localStorage?.setItem(\n SESSION_HISTORY_KEY,\n JSON.stringify(entries),\n );\n } catch {\n // Full or off: the list still holds for this page.\n }\n}\n\n/** Without the entries whose links have stopped working, or will in a\n * minute: a row that opens nothing is worse than no row. */\nfunction liveEntries(entries: DevPanelHistoryEntry[]): DevPanelHistoryEntry[] {\n const soon = Date.now() + 60_000;\n return entries.filter(\n (entry) => !entry.expiresAt || Date.parse(entry.expiresAt) > soon,\n );\n}\n\n/** The latest paint asked of each result area, so a slow image that loads\n * after a newer one was asked for never replaces it. */\nconst paintTokens = new WeakMap<HTMLElement, number>();\n\n/** How long a result may take to load before it is swapped in anyway: a\n * broken URL should not leave the old one up forever. */\nconst RESULT_LOAD_TIMEOUT_MS = 8000;\n\n/**\n * Show a finished render in the result area.\n *\n * The new picture is built off screen and swapped in whole, once it has\n * loaded: emptying the area first and appending an image with no height yet\n * made the panel collapse and grow again a moment later. It also gets the\n * output's shape before it loads (`aspect-ratio`), so a slow network cannot\n * reopen that gap. No outcome (a cancelled render, a refusal) leaves the last\n * result where it is.\n */\nasync function paintResult(\n host: HTMLElement,\n outcome: DevPanelActionResult | undefined,\n downloadButton: (\n entry: DevPanelHistoryEntry,\n part?: 'glb',\n ) => HTMLButtonElement | null,\n): Promise<void> {\n if (!outcome?.url) return;\n const token = (paintTokens.get(host) ?? 0) + 1;\n paintTokens.set(host, token);\n\n const shape =\n outcome.width && outcome.height\n ? { aspectRatio: `${outcome.width} / ${outcome.height}` }\n : {};\n let media: HTMLElement;\n let loaded: Promise<void>;\n if (outcome.isVideo) {\n const video = document.createElement('video');\n video.controls = true;\n video.loop = true;\n video.muted = true;\n video.autoplay = true;\n video.preload = 'auto';\n Object.assign(video.style, {\n width: '100%',\n borderRadius: '6px',\n display: 'block',\n ...shape,\n });\n // Something that is not a browser's video element (a test's DOM) has\n // nothing to wait for.\n loaded =\n typeof video.load === 'function'\n ? loadedOrTimeout(video, ['loadeddata', 'error'])\n : Promise.resolve();\n video.src = outcome.url;\n media = video;\n } else {\n const image = document.createElement('img');\n image.alt = 'render';\n Object.assign(image.style, {\n width: '100%',\n borderRadius: '6px',\n display: 'block',\n background:\n 'repeating-conic-gradient(#2a2a2e 0% 25%, #232327 0% 50%) 50% / 12px 12px',\n ...shape,\n });\n image.src = outcome.url;\n loaded =\n typeof image.decode === 'function'\n ? Promise.race([\n image.decode().catch(() => undefined),\n delay(RESULT_LOAD_TIMEOUT_MS),\n ])\n : Promise.resolve();\n media = image;\n }\n\n const parts: HTMLElement[] = [media];\n if (outcome.meta) {\n parts.push(\n span(outcome.meta, {\n display: 'block',\n marginTop: '6px',\n fontSize: '11px',\n opacity: '0.7',\n }),\n );\n }\n const actions = div({ display: 'flex', gap: '6px', marginTop: '6px' });\n appendLinks(actions, outcome.url);\n if (outcome.entry) {\n const download = downloadButton(outcome.entry);\n if (download) actions.appendChild(download);\n }\n if (actions.childNodes.length) parts.push(actions);\n\n await loaded;\n if (paintTokens.get(host) !== token) return;\n host.replaceChildren(...parts);\n}\n\n/** Resolves on the first of `events`, or after the load timeout. */\nfunction loadedOrTimeout(target: HTMLElement, events: string[]): Promise<void> {\n return new Promise((resolve) => {\n const done = () => {\n for (const event of events) target.removeEventListener(event, done);\n resolve();\n };\n for (const event of events) target.addEventListener(event, done);\n void delay(RESULT_LOAD_TIMEOUT_MS).then(done);\n });\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction appendLinks(actions: HTMLElement, url: string) {\n const openLink = document.createElement('a');\n openLink.textContent = 'Open';\n openLink.href = url;\n openLink.target = '_blank';\n openLink.rel = 'noreferrer';\n Object.assign(openLink.style, {\n ...GHOST,\n textAlign: 'center',\n textDecoration: 'none',\n });\n const copy = button('Copy URL', GHOST);\n copy.onclick = () => void navigator.clipboard?.writeText(url);\n actions.append(openLink, copy);\n}\n\nconst TERMINAL_JOB_STATES = new Set([\n 'completed',\n 'failed',\n 'cancelled',\n 'expired',\n]);\n\n/** One row of the jobs strip: thumbnail (preview, then result), label, a\n * state line in the renderer's words, a hairline bar, × while it can still\n * be stopped. */\nfunction jobRow(job: DevPanelJob): HTMLElement {\n const terminal = TERMINAL_JOB_STATES.has(job.state);\n const row = div({\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n padding: '4px 0',\n });\n\n const thumb = div({\n width: '44px',\n height: '33px',\n flex: '0 0 auto',\n borderRadius: '4px',\n background: 'rgba(255,255,255,0.06)',\n overflow: 'hidden',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n });\n const image = job.resultUrl ?? job.previewUrl;\n if (image) {\n const img = document.createElement('img');\n img.src = image;\n img.alt = job.resultUrl ? 'result' : 'preview';\n Object.assign(img.style, {\n width: '100%',\n height: '100%',\n objectFit: 'cover',\n display: 'block',\n });\n thumb.appendChild(img);\n } else {\n thumb.appendChild(\n span(job.state === 'queued' ? '…' : '', {\n opacity: '0.5',\n fontSize: '11px',\n }),\n );\n }\n\n const text = div({ flex: '1 1 auto', minWidth: '0' });\n const line = [\n job.state.replace(/_/g, ' '),\n job.detail,\n job.seconds !== undefined ? `${Math.round(job.seconds)}s` : undefined,\n job.previewUrl && !job.resultUrl ? 'preview' : undefined,\n ]\n .filter(Boolean)\n .join(' · ');\n text.append(\n span(job.label, {\n display: 'block',\n fontSize: '11px',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }),\n span(line, {\n display: 'block',\n fontSize: '10px',\n opacity: '0.7',\n color: job.state === 'failed' ? ERROR : 'inherit',\n }),\n );\n const track = div({\n height: '2px',\n marginTop: '3px',\n borderRadius: '1px',\n background: 'rgba(255,255,255,0.08)',\n overflow: 'hidden',\n });\n const indeterminate = job.progress === undefined && !terminal;\n track.appendChild(\n div({\n height: '100%',\n width:\n terminal || indeterminate\n ? '100%'\n : `${Math.round(Math.max(0, Math.min(1, job.progress!)) * 100)}%`,\n opacity: indeterminate ? '0.35' : '1',\n background: terminal ? 'rgba(255,255,255,0.25)' : SWEEP,\n }),\n );\n text.appendChild(track);\n row.append(thumb, text);\n\n if (job.onCancel && !terminal) {\n const cancel = button('\\u00d7', { ...GHOST, width: '24px' });\n cancel.title = 'cancel';\n cancel.onclick = () => job.onCancel?.();\n row.appendChild(cancel);\n }\n return row;\n}\n\n/**\n * One row of Recent, the same on every tab: a tile, what it is, when and for\n * how much, and what can be done with it. The row that is on screen (or, for\n * a bake, on the scene) is marked, and a click puts another one there.\n */\ntype RecentItem = {\n tile: HTMLElement;\n title: string;\n meta: string;\n selected: boolean;\n /** What a click on the row does, and the tooltip that says so. */\n pick?: { hint: string; run: () => void };\n actions: HTMLElement[];\n};\n\nfunction recentRow(item: RecentItem): HTMLElement {\n const row = div({\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n height: `${HISTORY_ROW_PX}px`,\n padding: '0 6px',\n boxSizing: 'border-box',\n borderRadius: '6px',\n flex: '0 0 auto',\n background: item.selected ? `rgba(${BLUE_RGB},0.10)` : 'transparent',\n boxShadow: item.selected ? `inset 2px 0 0 ${BLUE}` : 'none',\n });\n const text = div({ flex: '1 1 auto', minWidth: '0' });\n const line: Style = {\n display: 'block',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n };\n text.append(\n span(item.title, {\n ...line,\n fontSize: '11px',\n opacity: item.selected ? '1' : '0.85',\n }),\n span(item.meta, { ...line, fontSize: '10px', opacity: '0.5' }),\n );\n if (item.pick) {\n const { hint, run } = item.pick;\n row.style.cursor = 'pointer';\n row.title = hint;\n row.onclick = (event) => {\n // A button in the row (Download) is its own action.\n const target = (event.target as HTMLElement | null)?.tagName;\n if (target?.toUpperCase() === 'BUTTON') return;\n run();\n };\n }\n row.append(item.tile, text, ...item.actions);\n return row;\n}\n\nconst TILE: Style = {\n flex: '0 0 auto',\n width: '32px',\n height: '32px',\n borderRadius: '5px',\n background: 'rgba(255,255,255,0.06)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: '10px',\n overflow: 'hidden',\n};\n\nfunction imageTile(url: string): HTMLElement {\n const image = document.createElement('img');\n // Below the fifth row they are out of view until scrolled to.\n image.loading = 'lazy';\n image.src = url;\n image.alt = '';\n Object.assign(image.style, { ...TILE, objectFit: 'cover' });\n return image;\n}\n\n/** A bake has no picture of its own: its tile is a lit ball, lit up while\n * the bake is on the scene. */\nfunction bakeTile(applied: boolean): HTMLElement {\n const glow = applied ? 1 : 0.5;\n return div({\n ...TILE,\n background:\n `radial-gradient(circle at 32% 30%, rgba(253,195,133,${glow}) 0%, ` +\n `rgba(236,157,60,${glow * 0.6}) 30%, rgba(${BLUE_RGB},${glow * 0.35}) 70%, ` +\n `rgba(255,255,255,0.04) 100%)`,\n });\n}\n\n/** A render or a video from the history, as a row of Recent. */\nfunction paintHistoryList(\n host: HTMLElement,\n entries: DevPanelHistoryEntry[],\n downloadButton: (\n entry: DevPanelHistoryEntry,\n part?: 'glb',\n ) => HTMLButtonElement | null,\n /** Shows the entry big in the result area, when it has something to show. */\n select?: (entry: DevPanelHistoryEntry) => void,\n /** The entry the result area is showing. */\n shownId?: string,\n) {\n host.replaceChildren();\n if (!entries.length) {\n host.appendChild(span('nothing yet', { opacity: '0.4', fontSize: '11px' }));\n return;\n }\n for (const entry of entries) {\n const selected = entry.id === shownId;\n const download = downloadButton(entry);\n host.appendChild(\n recentRow({\n // A clip without a still: its tile says what it is.\n tile: entry.thumbnail\n ? imageTile(entry.thumbnail)\n : span(entry.kind === 'video' ? '\\u25b6' : '', {\n ...TILE,\n opacity: '0.7',\n }),\n title: entryTitle(entry),\n meta: entryMeta(entry),\n selected,\n ...(select && !selected && (entry.artifact ?? entry.thumbnail)\n ? { pick: { hint: 'Show it above', run: () => select(entry) } }\n : {}),\n actions: download ? [download] : [],\n }),\n );\n }\n}\n\n/** What an entry is: its size, and for a video its frames. */\nfunction entryTitle(entry: DevPanelHistoryEntry): string {\n const meta = entry.meta ?? {};\n const size =\n meta.width && meta.height ? `${meta.width} × ${meta.height}` : undefined;\n if (entry.kind === 'bake') {\n return (\n [\n meta.objects !== undefined\n ? `${meta.objects} object${meta.objects === 1 ? '' : 's'}`\n : undefined,\n meta.textureSize !== undefined ? `${meta.textureSize}²` : undefined,\n ]\n .filter(Boolean)\n .join(' · ') || 'bake'\n );\n }\n if (entry.kind === 'video') {\n return (\n [meta.frames !== undefined ? `${meta.frames} frames` : undefined, size]\n .filter(Boolean)\n .join(' · ') || 'video'\n );\n }\n return size ?? 'render';\n}\n\n/** When it was made, how, and what it cost. */\nfunction entryMeta(entry: DevPanelHistoryEntry): string {\n const meta = entry.meta ?? {};\n return [\n ago(Date.parse(entry.createdAt)),\n meta.quality,\n entry.kind === 'video' ? meta.format : undefined,\n meta.skipped ? `${meta.skipped} skipped` : undefined,\n meta.cost !== undefined ? `$${meta.cost.toFixed(2)}` : undefined,\n entry.cached ? 'cached' : undefined,\n ]\n .filter(Boolean)\n .join(' · ');\n}\n\nfunction describeEntry(entry: DevPanelHistoryEntry): string {\n const meta = entry.meta ?? {};\n const parts: string[] = [ago(Date.parse(entry.createdAt))];\n if (entry.kind === 'bake') {\n if (meta.objects !== undefined) parts.push(`${meta.objects} objects`);\n if (meta.textureSize !== undefined) parts.push(`${meta.textureSize}²`);\n if (meta.skipped) parts.push(`${meta.skipped} skipped`);\n } else {\n if (meta.width && meta.height) parts.push(`${meta.width}×${meta.height}`);\n if (meta.frames !== undefined) parts.push(`${meta.frames} frames`);\n if (meta.format) parts.push(meta.format);\n }\n if (meta.quality) parts.push(meta.quality);\n if (meta.cost !== undefined) parts.push(`$${meta.cost.toFixed(2)}`);\n if (entry.cached) parts.push('cached');\n return parts.join(' · ');\n}\n\nfunction ago(timestamp: number): string {\n if (!Number.isFinite(timestamp)) return 'just now';\n const seconds = Math.max(0, Math.round((Date.now() - timestamp) / 1000));\n if (seconds < 45) return 'just now';\n const minutes = Math.round(seconds / 60);\n if (minutes < 60) return `${minutes}m ago`;\n const hours = Math.round(minutes / 60);\n if (hours < 24) return `${hours}h ago`;\n return `${Math.round(hours / 24)}d ago`;\n}\n\nfunction availableTabs(options: DevPanelOptions): DevPanelTab[] {\n const tabs: DevPanelTab[] = [];\n if (options.render) tabs.push('render');\n if (options.video) tabs.push('video');\n if (options.bake) tabs.push('bake');\n return tabs;\n}\n\nfunction inertPanel(): DevPanel {\n const noop = () => {};\n return {\n open: noop,\n close: noop,\n setTab: noop,\n refresh: noop,\n refreshCost: noop,\n setStatus: noop,\n setProgress: noop,\n setJobs: noop,\n trackJob: () => noop,\n startJob: () => ({ update: noop, follow: noop, end: noop }),\n dispose: noop,\n };\n}\n\n// ---------------------------------------------------------------------------\n// The mark\n// ---------------------------------------------------------------------------\n\n/**\n * The round mark the brand uses on social media, from the CDN. The name\n * carries the file's hash, so the year-long edge cache can never serve an\n * older one. Uploaded from packages/logo-generator/out/avatar/avatar-400.png.\n */\nconst AVATAR_URL = 'https://cdn.bakery3.com/sdk/brand/avatar-6fffdec6ef.png';\n\n/**\n * The mark at `size` px, as a round image. A page whose Content Security\n * Policy does not allow the CDN's images gets the inline cut below instead,\n * so the panel never shows a broken image.\n */\nfunction brandMark(size: number): HTMLElement | SVGSVGElement {\n const img = document.createElement('img');\n img.src = AVATAR_URL;\n img.alt = '';\n img.width = size;\n img.height = size;\n img.decoding = 'async';\n img.draggable = false;\n Object.assign(img.style, {\n display: 'block',\n flex: '0 0 auto',\n width: `${size}px`,\n height: `${size}px`,\n borderRadius: '50%',\n background: INK,\n });\n img.onerror = () => img.replaceWith(convergeMark(Math.round(size * 0.65)));\n return img;\n}\n\n/**\n * The Bakery3 mark: an ordered-dither sphere lit from the top left,\n * dissolving into sparse samples in shadow. A render resolving out of noise.\n * This is the coarse cut, which is the one that still reads at 30px, in the\n * logo's colors: blue at the top left to orange at the bottom right.\n */\nconst MARK_CELLS: Array<[number, number, string]> = [\n [23, 3, '#2d5daf'],\n [43, 3, '#46b8ed'],\n [3, 23, '#2d5daf'],\n [23, 23, '#46b8ed'],\n [63, 23, '#fdc385'],\n [3, 43, '#46b8ed'],\n [23, 43, '#ffd4ae'],\n [43, 43, '#fdc385'],\n [63, 43, '#ec9d3c'],\n [83, 43, '#be5c20'],\n [23, 63, '#fdc385'],\n [63, 63, '#be5c20'],\n [43, 83, '#be5c20'],\n];\n\nfunction convergeMark(size: number): SVGSVGElement {\n const NS = 'http://www.w3.org/2000/svg';\n const svg = document.createElementNS(NS, 'svg');\n svg.setAttribute('viewBox', '0 0 100 100');\n svg.setAttribute('width', String(size));\n svg.setAttribute('height', String(size));\n svg.setAttribute('aria-hidden', 'true');\n // No auto margins: this sits inside flex rows, where `margin: 0 auto` on\n // the first child would shove the title across the header.\n Object.assign(svg.style, { display: 'block', flex: '0 0 auto' });\n for (const [x, y, fill] of MARK_CELLS) {\n const rect = document.createElementNS(NS, 'rect');\n rect.setAttribute('x', String(x));\n rect.setAttribute('y', String(y));\n rect.setAttribute('width', '14');\n rect.setAttribute('height', '14');\n rect.setAttribute('rx', '3');\n rect.setAttribute('fill', fill);\n svg.appendChild(rect);\n }\n return svg;\n}\n","/**\n * The two fingerprints the panel compares to follow a scene: what is in it,\n * and where things stand. `mountBakery3Devtools` hands them to the panel as\n * `sceneVersion` and `viewVersion`, and the lab, which mounts `mountDevPanel`\n * itself, uses the same pair through internal.ts.\n */\n\nimport type { Camera, Mesh, Object3D, Scene } from 'three';\n\n/**\n * What is in the scene, cheaply: the panel compares it a few times a second\n * and re-prices when it changes, so a developer who just added a wall sees\n * the price of the room with the wall in it.\n *\n * Approximate on purpose, and not a hash of anything expensive. It follows\n * what a price is made of: how many objects, which are hidden, their\n * triangles (a geometry swapped for a heavier one), their materials (an\n * emitter lets light out of a room), instance counts and fog. Where things\n * stand is `viewFingerprint`'s, so a scene that animates is not re-priced on\n * every frame of it.\n */\nexport function sceneFingerprint(scene: Scene): string {\n let count = 0;\n let triangles = 0;\n let hash = 0;\n const mix = (value: number) => {\n hash = (Math.imul(hash, 31) + value) | 0;\n };\n scene.traverse((object) => {\n count += 1;\n if (!object.visible) mix(count);\n const mesh = object as Partial<Mesh> & { count?: number };\n const geometry = mesh.geometry;\n if (geometry) {\n mix(geometry.id);\n triangles +=\n (geometry.index?.count ?? geometry.attributes?.position?.count ?? 0) /\n 3;\n }\n // Every material has a numeric `id` at runtime; not every version of\n // three's typings says so.\n const materials = mesh.material as\n { id?: number } | Array<{ id?: number }> | undefined;\n if (Array.isArray(materials)) {\n for (const material of materials) mix(material.id ?? 0);\n } else if (materials) {\n mix(materials.id ?? 0);\n }\n if (typeof mesh.count === 'number') mix(mesh.count);\n });\n return `${count}:${Math.round(triangles)}:${hash}:${scene.fog ? 1 : 0}`;\n}\n\n/**\n * Where things stand: the camera and every object. How walled in the camera\n * is moves a price (a camera carried into a room costs more than one outside\n * it), so this is compared too, and priced once it has come to rest.\n */\nexport function viewFingerprint(scene: Object3D, camera: Camera): string {\n let sum = 0;\n scene.traverse((object) => {\n const elements = object.matrix?.elements;\n if (elements) for (let i = 12; i < 15; i++) sum += elements[i] ?? 0;\n });\n const eye = camera.matrixWorld.elements;\n return `${sum.toFixed(3)}:${eye[12]!.toFixed(2)},${eye[13]!.toFixed(2)},${eye[14]!.toFixed(2)}`;\n}\n","/**\n * `mountBakery3Devtools`: the panel, wired to your client, in one call.\n *\n * `mountDevPanel` underneath it takes callbacks and knows nothing about an\n * account. This function supplies those callbacks from a `createBakery3()`\n * client, so the estimate, render, video and bake plumbing is written once\n * for a vanilla three.js app and for React alike (`<Bakery3Devtools />` is a\n * shell over this same function, see ../r3f/Devtools.tsx).\n *\n * import { createBakery3 } from '@oeave/bakery3';\n * import { mountBakery3Devtools } from '@oeave/bakery3/devtools';\n *\n * const bakery3 = createBakery3({ token: mintToken });\n * const panel = mountBakery3Devtools({ bakery3, scene, camera, renderer });\n *\n * By default the Bake tab goes through `bakery3.bake()`: the same capture,\n * upload and `/v1/bakes` round trip a render takes, with the bundle's\n * textures coming back on signed URLs. A `bakeTransport` replaces that with\n * a function of your own that turns a `BakeSpec` into a `BakeBundle` (a local\n * worker, or a bake farm you already run), and nothing else about the panel\n * changes.\n */\n\nimport type { Camera, Scene } from 'three';\nimport type {\n BakeBundle,\n BakeSpec,\n BakeTextureSize,\n QualityPreset,\n} from '../protocol/index.js';\nimport { prepareBake } from '../bake/prepare.js';\nimport { createBakeSession } from '../bake/session.js';\nimport type { BakeJob } from '../bake/job.js';\nimport { Bakery3Error } from '../errors.js';\nimport { aspectOf } from '../capture/output.js';\nimport type { CaptureOptions, CapturedScene } from '../capture/capture.js';\nimport type { Bakery3, RenderOptions } from '../index.js';\nimport type { RenderJob } from '../job.js';\nimport type { UploadProgress } from '../upload.js';\nimport { createTimeline, type Timeline } from '../timeline/index.js';\nimport { mountDevPanel } from './devPanel.js';\nimport { sceneFingerprint, viewFingerprint } from './sceneVersion.js';\nimport type {\n DevPanel,\n DevPanelHistoryOptions,\n DevPanelTab,\n TrackableJob,\n TrackedJobPayload,\n} from './devPanel.js';\nimport type { TimelinePanelTarget } from './timelinePanel.js';\n\n/** What turns a prepared bake into a bundle. See the file header. */\nexport type BakeTransport = (\n spec: BakeSpec,\n assets: CapturedScene['assets'],\n) => Promise<BakeBundle>;\n\n/**\n * The part of the client the panel uses.\n *\n * Structural rather than `Bakery3` itself so that a host wrapping the client\n * (to add its own telemetry, or to swap in a fake in a test) is not shut out\n * of the panel for it. A real `createBakery3()` satisfies it as-is.\n */\nexport type Bakery3DevtoolsClient = Pick<\n Bakery3,\n 'check' | 'estimate' | 'renderVideo'\n> & {\n /** One render, one job: the panel never asks for a set of cameras. */\n render(options?: RenderOptions): Promise<RenderJob>;\n} &\n /** Present on every real client; a host that fakes one and gives no\n * `bakeTransport` is told so when the Bake button is pressed. */\n Partial<Pick<Bakery3, 'bake'>>;\n\nexport type Bakery3DevtoolsOptions = {\n bakery3: Bakery3DevtoolsClient;\n /**\n * The live scene the panel checks, prices, renders and bakes. Read each\n * time it is used, so a getter works; the Bake tab's session belongs to the\n * scene this is when the panel mounts.\n */\n scene: Scene;\n /** Read each time it is used, so a getter can follow a camera that is\n * swapped (R3F does) without remounting the panel. Its aspect is the\n * aspect of every render and video the panel starts. */\n camera: Camera;\n /**\n * The live `WebGLRenderer`, so the capture carries your color space and\n * tone mapping instead of guessing them. Optional but wanted: an app that\n * tone-maps and does not say so gets a render that is faithful to the\n * manifest and not to the viewport.\n */\n renderer?: CaptureOptions['renderer'];\n /** Where the panel mounts. Defaults to `document.body`. */\n container?: HTMLElement;\n position?: 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left';\n defaultQuality?: QualityPreset;\n defaultOpen?: boolean;\n defaultTab?: DevPanelTab;\n /** A name beside the mark in the header. None by default. */\n title?: string;\n onOpenChange?: (open: boolean) => void;\n /**\n * The timeline the Video tab films. Without one the panel makes its own,\n * empty, on the live scene and camera: frame a shot, press Keyframe camera,\n * move the playhead and press it again.\n */\n timeline?: Timeline;\n /** Objects offered in the timeline's \"add track\" picker. */\n timelineTargets?: TimelinePanelTarget[];\n /** Fired when the timeline takes the camera and when it gives it back.\n * Suspend your orbit controls here. */\n onPlaybackChange?: (active: boolean) => void;\n /** Your own bake worker instead of the hosted `/v1/bakes`. */\n bakeTransport?: BakeTransport;\n /** Where a bundle's relative uris resolve against, when it has any. */\n bakeBaseUrl?: string;\n /** Zero the realtime lights when a generation is applied. Off by default:\n * the session already replaces diffuse lighting with the lightmap (see\n * bake/shading.ts), so muting only removes the lamps' highlights. It is a\n * look to switch on from the panel, not a correction. */\n muteLightsOnApply?: boolean;\n history?: DevPanelHistoryOptions;\n};\n\nexport function mountBakery3Devtools(\n options: Bakery3DevtoolsOptions,\n): DevPanel {\n // Everything else on `options` is read when it is used, never destructured\n // here: a host may pass getters (the React shell does) so that a new camera\n // or renderer takes effect without a remount.\n const { bakery3 } = options;\n\n // The panel owns its bake session, which is why dispose() is wrapped below:\n // unmounting the devtools must not leave a bake baked into the application.\n const bakeSession = createBakeSession({ scene: options.scene });\n\n // Without a timeline from the host the Video tab films one of the panel's\n // own, bound to the scene and camera as they are when it is used.\n const timeline = options.timeline ?? liveTimeline(options);\n const ownTimeline = options.timeline === undefined;\n\n let disposed = false;\n /** Jobs this panel started and still follows: stopped on dispose, so a\n * closed panel does not keep polling the API. */\n const running = new Set<() => void>();\n\n const capture = () => ({\n scene: options.scene,\n camera: options.camera,\n ...(options.renderer ? { renderer: options.renderer } : {}),\n });\n\n /**\n * One row in the jobs strip from the click to the result: it says what is\n * happening while the scene is captured and uploaded, then follows the job\n * (progress, its preview, × to cancel). `end()` takes it away, and the\n * panel keeps a finished one until the result it made is on screen.\n */\n function startRow(label: string) {\n const row = panel.startJob(label);\n let job: (TrackableJob & { stop?: () => void }) | undefined;\n const stop = () => {\n row.end();\n job?.stop?.();\n };\n running.add(stop);\n return {\n /** For `onUpload`: the bytes on their way, or the cache hit. */\n upload(progress: UploadProgress) {\n if (!progress.bytesTotal) {\n row.update('already uploaded');\n return;\n }\n row.update(\n `uploading ${megabytes(progress.bytesUploaded)} of ${megabytes(progress.bytesTotal)}`,\n progress.bytesUploaded / progress.bytesTotal,\n );\n },\n update: (detail: string, state?: string) =>\n row.update(detail, undefined, state),\n follow(next: TrackableJob & { stop?: () => void }) {\n job = next;\n row.follow(next);\n },\n end() {\n running.delete(stop);\n row.end();\n },\n };\n }\n\n const panel = mountDevPanel({\n ...(options.container ? { container: options.container } : {}),\n ...(options.position ? { position: options.position } : {}),\n ...(options.defaultOpen !== undefined\n ? { defaultOpen: options.defaultOpen }\n : {}),\n ...(options.defaultTab ? { defaultTab: options.defaultTab } : {}),\n ...(options.title ? { title: options.title } : {}),\n ...(options.onOpenChange ? { onOpenChange: options.onOpenChange } : {}),\n\n compatibility: () => {\n try {\n return bakery3.check(options.scene);\n } catch {\n // A scene that has not finished loading is not an error worth showing\n // in a panel that is meant to be reassuring.\n return null;\n }\n },\n\n sceneVersion: () => sceneFingerprint(options.scene),\n viewVersion: () => viewFingerprint(options.scene, options.camera),\n\n estimate: async (request) => {\n if (request.kind === 'bake') {\n // Nothing ticked is nothing to price: no chip rather than a quote\n // for every object in the scene, which is what an empty list means\n // to the estimate.\n if (!request.include.length) return null;\n const estimate = await bakery3.estimate({\n scene: options.scene,\n bake: {\n quality: request.quality,\n textureSize: request.textureSize as BakeTextureSize,\n include: request.include,\n },\n });\n return { usd: estimate.estimatedCost, maximum: estimate.maximumCost };\n }\n const estimate = await bakery3.estimate({\n scene: options.scene,\n // An interior is priced from where the camera stands, and a vanilla\n // client has nothing attached to fall back on: without it every\n // estimate threw and the chip stayed blank.\n camera: options.camera,\n quality: request.quality as QualityPreset,\n width: request.width,\n height: request.height,\n // The route prices a clip itself (a frame in a clip is cheaper than\n // a still), so the chip quotes what the render will be accepted under.\n ...(request.kind === 'video' ? { frames: request.frames } : {}),\n });\n return { usd: estimate.estimatedCost, maximum: estimate.maximumCost };\n },\n\n ...(options.history ? { history: options.history } : {}),\n\n render: {\n defaultQuality: options.defaultQuality ?? 'studio',\n // The camera's own aspect, by the rule render() uses when it is given\n // no size, so a wide viewport renders wide.\n aspect: () => aspectOf(options.camera, options.renderer),\n onRender: async (settings) => {\n // The panel times the wait itself: the result carries the price, not\n // seconds, and what a developer watching the panel wants to know is\n // how long they sat there.\n const startedAt = Date.now();\n // Before the first await, so the row is there in the same frame as\n // the click.\n const row = startRow(\n `render · ${settings.width} × ${settings.height} · ${settings.quality}`,\n );\n let job: RenderJob | undefined;\n try {\n job = await bakery3.render({\n ...capture(),\n quality: settings.quality as QualityPreset,\n width: settings.width,\n height: settings.height,\n onUpload: row.upload,\n });\n if (disposed) return undefined;\n row.follow(job);\n const result = await job.result();\n return {\n id: job.id,\n url: result.url,\n width: result.width,\n height: result.height,\n format: result.format,\n quality: settings.quality,\n cost: result.cost,\n ...(result.expiresAt ? { expiresAt: result.expiresAt } : {}),\n meta: `$${result.cost.toFixed(2)} · ${result.width} × ${result.height} · ${elapsed(startedAt)}`,\n };\n } catch (error) {\n // Closed while it ran: the wait was stopped, which is not news.\n if (disposed) return undefined;\n if (job && wasCancelled(job, error)) {\n panel.setStatus('Render cancelled.');\n return undefined;\n }\n throw error;\n } finally {\n row.end();\n }\n },\n },\n\n video: {\n timeline,\n ...(options.timelineTargets ? { targets: options.timelineTargets } : {}),\n // The scene is handed over so the panel can re-attach tracks whose\n // objects were rebuilt (a variant swap, a reload) instead of letting a\n // stale lane survive to refuse at export.\n scene: () => options.scene,\n aspect: () => aspectOf(options.camera, options.renderer),\n onPlaybackChange: (active: boolean) => options.onPlaybackChange?.(active),\n defaultQuality: options.defaultQuality ?? 'studio',\n onRenderVideo: async (settings) => {\n const startedAt = Date.now();\n const row = startRow(\n `video · ${settings.timeline.frameCount} frames · ${settings.width} × ${settings.height}`,\n );\n let job: RenderJob | undefined;\n try {\n job = await bakery3.renderVideo({\n ...capture(),\n timeline: settings.timeline,\n quality: settings.quality as QualityPreset,\n width: settings.width,\n height: settings.height,\n format: settings.format,\n onUpload: row.upload,\n });\n if (disposed) return undefined;\n row.follow(job);\n const result = await job.result();\n return {\n id: job.id,\n url: result.url,\n isVideo: true,\n width: result.width,\n height: result.height,\n format: result.format,\n frames: settings.timeline.frameCount,\n quality: settings.quality,\n cost: result.cost,\n ...(result.expiresAt ? { expiresAt: result.expiresAt } : {}),\n meta: `$${result.cost.toFixed(2)} · ${elapsed(startedAt)}`,\n };\n } catch (error) {\n // Closed while it ran: the wait was stopped, which is not news.\n if (disposed) return undefined;\n if (job && wasCancelled(job, error)) {\n panel.setStatus('Video cancelled.');\n return undefined;\n }\n throw error;\n } finally {\n row.end();\n }\n },\n },\n\n bake: {\n session: bakeSession,\n onBake: async (settings) => {\n // Read now, not at mount, so a host that swaps the transport\n // between renders (React does, every time its props change) is\n // not still talking to the first one.\n const transport = options.bakeTransport;\n const count = settings.include.length;\n // One row from the click to the applied lightmaps, as for a render.\n const row = startRow(\n `bake · ${count} object${count === 1 ? '' : 's'} at ${settings.textureSize}²`,\n );\n try {\n const bakeSettings = {\n quality: settings.quality,\n textureSize: settings.textureSize,\n include: settings.include,\n };\n let bundle: BakeBundle;\n if (transport) {\n const { spec, assets } = await prepareBake({\n scene: options.scene,\n camera: options.camera,\n settings: bakeSettings,\n });\n row.update('baking', 'baking');\n bundle = await transport(spec, assets);\n } else {\n // The hosted path: the same capture, the asset upload, and\n // `/v1/bakes`. The bundle comes back with its textures on signed\n // URLs, so no base URL is needed to load it.\n if (!bakery3.bake) {\n throw new Bakery3Error({\n code: 'InvalidRequest',\n message: 'This client cannot bake.',\n why: 'The devtools were mounted with a client that has no bake() and no bakeTransport was given.',\n fix: 'Mount them with the object createBakery3() returns, or pass a bakeTransport.',\n docs: 'https://bakery3.com/docs/devtools',\n });\n }\n const job = await bakery3.bake({\n ...capture(),\n settings: bakeSettings,\n onUpload: row.upload,\n });\n if (disposed) return undefined;\n row.follow(trackableBake(job));\n try {\n bundle = (await job.result()).bundle;\n } catch (error) {\n if (disposed) return undefined;\n if (wasCancelled(job, error)) {\n panel.setStatus('Bake cancelled.');\n return undefined;\n }\n throw error;\n }\n }\n // Closed while it baked: the session is gone with the panel, and the\n // scene must stay exactly as the developer has it.\n if (disposed) return undefined;\n row.update('applying the lightmaps', 'applying');\n const generation = bakeSession.addGeneration(bundle, {\n ...(transport && options.bakeBaseUrl\n ? { baseUrl: options.bakeBaseUrl }\n : {}),\n });\n // Auto-applied: the first bake should be one click end to end,\n // not a click and then a second thing to find.\n const report = await bakeSession.apply(generation);\n if (disposed) return undefined;\n if (options.muteLightsOnApply) bakeSession.muteLights(true);\n panel.setStatus(\n `Applied to ${report.applied.length} object${report.applied.length === 1 ? '' : 's'}.`,\n 'ok',\n );\n return { generation };\n } finally {\n row.end();\n }\n },\n },\n });\n\n return {\n ...panel,\n dispose() {\n if (disposed) return;\n disposed = true;\n // Stop polling every job this panel started before the DOM goes. They\n // still run on the server; nothing here is left to show them.\n for (const stop of [...running]) stop();\n running.clear();\n panel.dispose();\n if (ownTimeline) timeline.dispose();\n // Reverts the scene and frees the lightmaps. Disposing the panel without\n // this would leave the developer's app holding a bake it can no longer\n // turn off.\n bakeSession.dispose();\n },\n };\n}\n\n/** The panel's own timeline, on the scene and camera as they are when it is\n * used: an R3F camera can be swapped after the panel mounted. */\nfunction liveTimeline(options: Bakery3DevtoolsOptions): Timeline {\n const timeline = createTimeline({ duration: 4, fps: 24 });\n for (const key of ['scene', 'camera'] as const) {\n Object.defineProperty(timeline, key, {\n configurable: true,\n enumerable: true,\n get: () => options[key],\n // The timeline never reassigns these itself; a host that does wants the\n // live one anyway.\n set: () => {},\n });\n }\n return timeline;\n}\n\n/** A cancel the developer asked for is an outcome, not an error. */\nfunction wasCancelled(job: { status: string }, error: unknown): boolean {\n return (\n job.status === 'cancelled' ||\n (error as { code?: unknown } | null)?.code === 'Cancelled'\n );\n}\n\n/** A bake job as the jobs strip reads one: it has no preview. */\nfunction trackableBake(job: BakeJob): TrackableJob & { stop?: () => void } {\n return {\n id: job.id,\n get status() {\n return job.status;\n },\n get progress() {\n return job.progress;\n },\n on(event, listener) {\n if (event === 'preview') return () => {};\n return job.on(event, (payload) =>\n listener(payload as unknown as TrackedJobPayload),\n );\n },\n cancel: () => job.cancel(),\n stop: () => job.stop(),\n };\n}\n\n/** `12.4 MB`, `0.3 MB`: the units an upload is felt in. */\nfunction megabytes(bytes: number): string {\n return `${(bytes / 1_000_000).toFixed(1)} MB`;\n}\n\n/** How long the panel waited, for the chip beside the price. */\nfunction elapsed(startedAt: number): string {\n return `${Math.max(0, (Date.now() - startedAt) / 1000).toFixed(1)}s`;\n}\n"]}