For developers: the React components and hooks behind the HyperFrames browser editor. Looking for the Studio app? See Get the Studio app.
Looking for the HyperFrames Studio app, the one you download to make videos? It’s here:
Get the Studio app. This page is for developers building on the editor’s code.
@hyperframes/studio contains the React application, editor components, player, timeline, and hooks behind the
HyperFrames browser editor.To open a project in the browser editor, you don’t need this package:
npx hyperframes preview
Install the package only when you are extending Studio or building an editor that
uses its lower-level parts:
The exported components are building blocks, not a drop-in embedded editor. Components such as
EditorShell, NLEPreview, Timeline, PropertyPanel, and FileTree require project state,
callbacks, or Studio contexts. Use StudioApp when you need the whole editor, or inspect
the component types before composing a custom host.
When you run Studio from the monorepo, its dev server listens on http://localhost:5190.
The package also exports CompositionLevel, TimelineElement, PickedElement,
and PatchOperation.useElementPicker remembers the current selection while inspection is active.
Press Escape in either Studio or the preview to cancel and restore that selection. The
hovered target is identified beside the preview as tag#id, tag.class, or the
tag name alone.
Studio loads the composition in an iframe with the HyperFrames runtime.
Player controls communicate with that runtime to play, pause, and seek.
The editor and timeline send changes through the Studio API.
The Studio server writes those changes back to the project files.
External file changes refresh the preview while keeping the current position
when possible.
Preview and render use the same seekable composition contract. Preview still
depends on the browser playing in real time, while render captures frames one at a
time. A heavy project can therefore stutter during preview and still render every
frame.Paused video scrubbing decodes and stages the visible video layers before
advancing the composition’s animations. Completed frames appear during a drag,
with newer pointer positions coalesced into the next decode. Canvas and GPU
effects consume the same staged pixels. Continuous playback uses native video;
Studio keeps the paused picture visible while those videos catch up before Play.
A native handoff waits for ready frames for up to ten seconds; Pause or a new
seek cancels it. At the deadline, the rest plays while each unready video keeps
its last full-quality picture. During playback, native frame presentation or
playback progress releases that picture; normal transport sync corrects drift.
Paused recovery still waits for its requested frame. A skipped source keeps its
picture on subsequent Play requests until it recovers.
A paused fallback that outlasts its wait retains the presented clock and picture,
while paused sync continues. It can still publish when the video becomes ready;
a new gesture cancels that recovery. Studio requests paused-decoder release
before preparing native playback and reopens readers when paused scrubbing resumes.
Paused-reader release waits up to two seconds for transparent video queries to
drain. After that it cancels their downloads and lets playback continue while
unfinished merges close in the background; input disposal still waits for the
merge to finish. A recovering video more than half a second out of sync with the transport
gets at most one corrective seek per recovery registration before its retained picture is removed.
Scrubbing and paused frame steps decode the original video at source resolution
throughout. Automatic playback quality reductions do not reduce these frames,
and the frame decoder does not substitute re-encoded seek copies. Playback
quality settings do not reduce these paused frames. Browsers or
media that cannot use the frame decoder fall back to native seeking. Long-GOP
sources can take longer to seek, especially backward or across distant cuts.
Host apps can compose the same rulers, safe margins, grid, and snap toolbar that
Studio uses over their own preview iframe. The provider owns the iframe geometry
and shared preferences, so the host supplies its current iframe element and chooses the
parts to render:
Connect project files, media, linting, and render jobs.
Player
Embed playback without the editing interface.
SDK
Query and edit compositions without Studio.
{"docsConfig":{"theme":"aspen","$schema":"https://mintlify.com/docs.json","name":"HyperFrames","colors":{"primary":"#181716","light":"#3CE6AC","dark":"#181716"},"logo":{"light":"https://mintcdn.com/hyperframes/MANsCjTNA4o2G0Te/logo/light.svg?fit=max\u0026auto=format\u0026n=MANsCjTNA4o2G0Te\u0026q=85\u0026s=ac43cb67ca98063e61623b68f6d13001","dark":"https://mintcdn.com/hyperframes/MANsCjTNA4o2G0Te/logo/dark.svg?fit=max\u0026auto=format\u0026n=MANsCjTNA4o2G0Te\u0026q=85\u0026s=6137a2d2c04fffddc1758f577e984d25","href":"https://hyperframes.heygen.com/"},"favicon":"https://mintcdn.com/hyperframes/f2-jlVtMPgjQyGrS/favicon.svg?fit=max\u0026auto=format\u0026n=f2-jlVtMPgjQyGrS\u0026q=85\u0026s=f58a2e47d3db5d9169b456060dfbcfad","appearance":{"default":"system"},"background":{"color":{"light":"#f2f0ed","dark":"#201e1c"}},"navbar":{"links":[{"href":"https://github.com/heygen-com/hyperframes","type":"github"},{"href":"https://discord.gg/7uMDe3PwQn","type":"discord"}],"primary":{"type":"button","label":"Download","href":"https://hyperframes.studio/studio/download?src=docs-navbar"}},"footer":{"socials":{"github":"https://github.com/heygen-com/hyperframes","discord":"https://discord.gg/7uMDe3PwQn","x":"https://x.com/HyperFrames_"},"links":[{"header":"Explore","items":[{"label":"Introduction","href":"/introduction"},{"label":"Make your first video","href":"/quickstart"},{"label":"Examples","href":"/examples"}]},{"header":"Build","items":[{"label":"Browser editor","href":"/studio"},{"label":"Catalog","href":"/catalog"},{"label":"Developers","href":"/developers/overview"}]},{"header":"Resources","items":[{"label":"Product updates","href":"/product-updates"},{"label":"Download the app","href":"https://hyperframes.studio/studio/download?src=docs-footer"},{"label":"GitHub","href":"https://github.com/heygen-com/hyperframes"}]},{"header":"Made by HeyGen","items":[{"label":"heygen.com","href":"https://www.heygen.com"}]}]},"fonts":{"family":"Inter"},"integrations":{"posthog":{"apiKey":"phc_zjjbX0PnWxERXrMHhkEJWj9A9BhGVLRReICgsfTMmpx","sessionRecording":false}},"contextual":{"options":["copy","claude","cursor","vscode","windsurf","mcp",{"title":"Open an issue","description":"Report a bug or request a feature","icon":"github","href":"https://github.com/heygen-com/hyperframes/issues/new"}],"display":"header"},"styling":{"latex":true},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"hyperframes","hasAudioNarration":false,"actualSubdomain":"hyperframes","customDomains":["hyperframes.heygen.com"],"gitSource":{"type":"github","owner":"heygen-com","repo":"hyperframes","deployBranch":"main","contentDirectory":"docs","isPrivate":false,"mountPath":"","label":""},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6af41026e02ab65c314d1519","clientVersion":"0.0.4102","searchFilterCounts":[{"language":"default","tag":"Catalog","count":898},{"language":"default","tag":"Docs","count":135},{"language":"default","tag":"Motion \u0026 effects","count":97},{"language":"default","tag":"Scenes \u0026 demos","count":93},{"language":"default","tag":"Text \u0026 captions","count":74},{"language":"default","tag":"Developers","count":72},{"language":"default","tag":"Make a video","count":63},{"language":"default","tag":"Effects","count":57},{"language":"default","tag":"Blocks","count":47},{"language":"default","tag":"Typography \u0026 Text","count":45}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-rbac-roles","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[{"filePath":"template-gallery.css","content":".tpl-card video{width:100%;aspect-ratio:16/9;object-fit:cover;display:block}.tpl-card.portrait video{aspect-ratio:9/16}.tpl-card:hover{transform:translateY(-2px);border-color:var(--hf-border-color-light, #d0cfcb)}.tpl-label{position:absolute;bottom:0;left:0;right:0;padding:2.5rem 0.75rem 0.75rem;background:linear-gradient(transparent, rgba(0,0,0,0.75));pointer-events:none}"},{"filePath":"custom.css","href":"/_mintlify/custom/hyperframes/90bb600fca48615f/custom.css"},{"filePath":"catalog-gallery.css","content":".hfc-gallery{color:var(--hf-text);font-family:inherit}.hfc-gallery *{box-sizing:border-box}.hfc-gallery :is(button,a):focus-visible{outline:2px solid var(--hf-brand);outline-offset:4px}.hfc-gallery button{font:inherit;cursor:pointer}.hfc-gallery .hfc-hero h1{line-height:1.08;font-weight:600;letter-spacing:-.045em;margin:0 0 24px;color:var(--hf-heading)}.hfc-gallery .hfc-hero>p{font-size:15px;line-height:1.7;color:var(--hf-text-secondary);max-width:560px;margin:0}.hfc-gallery .hfc-overview{display:flex;flex-direction:column;gap:44px}.hfc-gallery .hfc-section-head{display:flex;justify-content:space-between;align-items:center;gap:12px;margin-bottom:20px}.hfc-gallery .hfc-section-head h2{display:flex;align-items:center;gap:12px;font-size:20px;line-height:1.3;font-weight:600;margin:0;color:var(--hf-heading)}.hfc-gallery .hfc-section-head button{display:flex;align-items:center;justify-content:center;gap:6px;min-height:44px;min-width:44px;border:0;background:transparent;color:var(--hf-text-secondary);padding:6px 0 6px 8px;font-size:12px;white-space:nowrap}.hfc-gallery .hfc-caret{flex-shrink:0;transition:transform .16s ease}.hfc-gallery .hfc-section-head button[aria-expanded=\"true\"] .hfc-caret{transform:rotate(180deg)}.hfc-gallery .hfc-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:30px 20px}.hfc-gallery a.hfc-card,.hfc-gallery a.hfc-card:hover{display:block;min-width:0;text-decoration:none;color:inherit;border:0;background:transparent;box-shadow:none;transform:none}.hfc-gallery .hfc-media{position:relative;aspect-ratio:16/9;isolation:isolate;overflow:hidden;border-radius:12px;background:#101214}.hfc-gallery .hfc-media :is(img,video){position:absolute;inset:0;width:100%;height:100%;object-fit:cover;margin:0;border:0;border-radius:0}.hfc-gallery .hfc-preview-host{position:absolute;inset:0;pointer-events:none;opacity:0}.hfc-gallery .hfc-preview-host[data-ready=\"true\"]{opacity:1}.hfc-gallery .hfc-fallback{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;padding:24px;height:100%;text-align:center;color:#ccc;background:#141414}.hfc-gallery .hfc-fallback span{color:#999;font-size:10px}.hfc-gallery .hfc-fallback strong{font-size:18px;line-height:1.2}.hfc-gallery .hfc-unsupported{gap:6px;padding:20px}.hfc-gallery .hfc-unsupported span{font-size:11px}.hfc-gallery .hfc-unsupported code{font-size:11px;padding:2px 6px;border-radius:6px;background:#0006;color:#ccc}.hfc-gallery .hfc-card-body{padding:12px 2px 0}.hfc-gallery .hfc-card-title{display:flex;align-items:start;justify-content:space-between;gap:10px}.hfc-gallery .hfc-card-title h3{font-size:15px;font-weight:500;line-height:1.4;margin:0;color:var(--hf-heading)}.hfc-gallery .hfc-status{flex-shrink:0;padding:2px 7px;border-radius:20px;background:var(--hf-brand-soft);color:var(--hf-brand);font-size:11px}.hfc-gallery .hfc-meta{font-size:12px;line-height:1.5;margin:4px 0 0;color:var(--hf-text-secondary)}.hfc-gallery .hfc-empty{padding:44px 20px;text-align:center}.hfc-gallery .hfc-empty h3{font-size:18px}.hfc-gallery .hfc-empty p{color:var(--hf-text-secondary);font-size:13px}.hfc-gallery .hfc-empty button,.hfc-gallery .hfc-load{padding:10px 16px;border:1px solid var(--hf-border-color);border-radius:8px;color:var(--hf-text);background:var(--hf-background-light);font-size:12px}.hfc-gallery .hfc-load{display:block;margin:24px auto 0}#navigation-items:has(a[href=\"/catalog\"]) .sidebar-group-header{display:none}#navigation-items .sidebar-group>li>a[href=\"/catalog\"]{width:100%;margin-left:0;padding:6px 12px;border:0;border-radius:12px}#navigation-items .sidebar-group>li[data-active=\"true\"]>a[href=\"/catalog\"],#navigation-items .sidebar-group>li[data-active-nav-item=\"true\"]>a[href=\"/catalog\"],#navigation-items .sidebar-group>li>a[href=\"/catalog\"][aria-current=\"page\"]{color:var(--hf-brand);background:color-mix(in oklab,var(--hf-brand) 10%,transparent)!important}@media (max-width:1100px) and (min-width:601px){.hfc-gallery .hfc-grid{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (max-width:600px){.hfc-gallery .hfc-grid{grid-template-columns:minmax(0,1fr)}.hfc-gallery .hfc-card-title h3{font-size:16px}}@media (prefers-reduced-motion:reduce){.hfc-gallery *{transition:none!important}}#navigation-items a[href^=\"/catalog/\"][aria-current=\"page\"]{color:var(--hf-brand);background:color-mix(in oklab,var(--hf-brand) 10%,transparent)!important}#navigation-items li[data-group-tag]{--catalog-desc:\"\"}#navigation-items li[data-group-tag]::after{content:var(--catalog-desc);display:block;padding:0 12px 8px 40px;font-size:11px;line-height:1.5;color:var(--hf-text-secondary)}#navigation-items li[data-title=\"3D\"][data-group-tag]{--catalog-desc:\"Three.js scenes and objects: camera moves, product turntables, glass, exploded layers.\"}#navigation-items li[data-title=\"Carousels\"][data-group-tag]{--catalog-desc:\"Image cards that circle, orbit, or sweep a path across the frame.\"}#navigation-items li[data-title=\"Text \u0026 captions\"][data-group-tag]{--catalog-desc:\"Word-by-word caption reveals, highlights, and kinetic type.\"}#navigation-items li[data-title=\"Code\"][data-group-tag]{--catalog-desc:\"Code snippets that type, diff, highlight, and morph on screen.\"}#navigation-items li[data-title=\"Transitions\"][data-group-tag]{--catalog-desc:\"Cuts between shots: zooms, warps, glitches, light leaks.\"}#navigation-items li[data-title=\"Data \u0026 charts\"][data-group-tag]{--catalog-desc:\"Bar, line, and progress charts that animate their own data in.\"}#navigation-items li[data-title=\"Scenes \u0026 demos\"][data-group-tag]{--catalog-desc:\"Full scenes: app showcases, chat exchanges, product demos.\"}#navigation-items li[data-title=\"Cursors\"][data-group-tag]{--catalog-desc:\"Pointers that glide, click, drag, select, and steer the eye across a UI.\"}#navigation-items li[data-title=\"Motion \u0026 effects\"][data-group-tag]{--catalog-desc:\"General-purpose motion: hovers, pops, blurs, grids, paths.\"}#navigation-items li[data-title=\"Surfaces\"][data-group-tag]{--catalog-desc:\"Background textures and screen treatments: grain, halftone, glass.\"}#navigation-items li[data-title=\"Blocks\"][data-group-tag]{--catalog-desc:\"Flowcharts, sketched frames, speech bubbles, and outro cards.\"}.hfc-gallery .mw{display:inline-block;position:relative;white-space:nowrap;--phase: 0;--period: 6;--bl: .87em}.hfc-gallery .mw .ch{display:inline-block;position:relative;transform-origin:50% 70%;background-image:var(--grad);background-size:calc(var(--period) * 1em) 100%;background-position:calc((var(--phase) * var(--period) - var(--x, 0)) * 1em) 0;-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;color:transparent}.hfc-gallery .mw .bl{display:inline-block;width:0;height:0;vertical-align:baseline}.hfc-gallery .mw .dsvg{position:absolute;left:var(--dot-x, 50%);top:var(--dot-y, .16em);width:calc(var(--dot-d, .15em) * 5);height:calc(var(--dot-d, .15em) * 5);margin:calc(var(--dot-d, .15em) * -2.5) 0 0 calc(var(--dot-d, .15em) * -2.5);overflow:visible;pointer-events:none}.hfc-gallery .mw .sq{position:absolute;display:block;left:0;top:calc(var(--bl) + .05em);width:100%;height:auto;overflow:visible;pointer-events:none}.hfc-gallery{padding:0 32px;max-width:1400px;margin:0 auto 48px}.hfc-gallery .hfc-hero{padding:48px 0}.hfc-gallery .hfc-hero h1{max-width:800px;font-size:clamp(34px,4vw,54px)}.hfc-gallery .mw .dsvg{left:50%;top:.18em;width:.75em;height:.75em;margin:-.375em 0 0 -.375em}.hfc-gallery .mw .sq{top:.94em}.hfc-gallery .mw .ring{transform-origin:0 0}.hfc-gallery .mw .sq path{stroke-dasharray:220;stroke-dashoffset:220}@media (prefers-reduced-motion:reduce){.hfc-gallery .mw .sq path{stroke-dashoffset:0}}@media (max-width:600px){.hfc-gallery{padding:0 18px}.hfc-gallery .hfc-hero{padding:28px 0}}.hfc-search{display:block;width:min(560px, 100%);margin-top:18px;padding:12px 16px;border:1px solid color-mix(in srgb, currentColor 18%, transparent);border-radius:999px;background:color-mix(in srgb, currentColor 4%, transparent);color:inherit;font:inherit;font-size:15px}.hfc-search:focus-visible{outline:2px solid color-mix(in srgb, currentColor 40%, transparent);outline-offset:2px}.hfc-gallery .hfc-pause{margin-top:14px;padding:7px 14px;border:1px solid color-mix(in srgb, currentColor 22%, transparent);border-radius:999px;background:transparent;color:inherit;font:inherit;font-size:13px;cursor:pointer}.hfc-gallery .hfc-pause:focus-visible{outline:2px solid color-mix(in srgb, currentColor 45%, transparent);outline-offset:2px}"}],"page":{"pagePath":"packages/studio","slug":"/packages/studio","pageMetadata":{"title":"@hyperframes/studio","description":"For developers: the React components and hooks behind the HyperFrames browser editor. Looking for the Studio app? See Get the Studio app.","href":"/packages/studio"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"For developers: the React components and hooks behind the HyperFrames browser editor. Looking for the Studio app? See Get the Studio app.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,..._provideComponents(),...props.components},{Card,CardGroup,CodeBlock,Heading,Note,Table,Warning}=_components;if(!Card)_missingMdxReference(`Card`,true);if(!CardGroup)_missingMdxReference(`CardGroup`,true);if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Note)_missingMdxReference(`Note`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(Note,{children:_jsxs(_components.p,{children:[`Looking for the `,_jsx(_components.strong,{children:`HyperFrames Studio app`}),`, the one you download to make videos? It’s here:\n`,_jsx(_components.a,{href:`/studio-app`,children:`Get the Studio app`}),`. This page is for developers building on the editor’s code.`]})}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`@hyperframes/studio`}),` contains the React application, editor components, player, timeline, and hooks behind the\nHyperFrames browser editor.`]}),`\n`,_jsx(_components.p,{children:`To open a project in the browser editor, you don’t need this package:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`npx`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` hyperframes`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` preview`})]}),`\n`]})})}),`\n`,_jsx(_components.p,{children:`Install the package only when you are extending Studio or building an editor that\nuses its lower-level parts:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`npm`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` install`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` @hyperframes/studio`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` react`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` react-dom`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` zustand`})]}),`\n`]})})}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`The exported components are building blocks, not a drop-in embedded editor. Components such as\n`,_jsx(_components.code,{children:`EditorShell`}),`, `,_jsx(_components.code,{children:`NLEPreview`}),`, `,_jsx(_components.code,{children:`Timeline`}),`, `,_jsx(_components.code,{children:`PropertyPanel`}),`, and `,_jsx(_components.code,{children:`FileTree`}),` require project state,\ncallbacks, or Studio contexts. Use `,_jsx(_components.code,{children:`StudioApp`}),` when you need the whole editor, or inspect\nthe component types before composing a custom host.`]})}),`\n`,_jsxs(_components.p,{children:[`When you run Studio from the monorepo, its dev server listens on `,_jsx(_components.code,{children:`http://localhost:5190`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`entry-points`,children:`Entry points`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Import`}),_jsx(_components.th,{children:`Contains`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`@hyperframes/studio`})}),_jsx(_components.td,{children:`React components, hooks, utilities, and their public types`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`@hyperframes/studio/ui`})}),_jsx(_components.td,{children:`UI primitives (buttons, menus, popovers, fields) without the editor`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`@hyperframes/studio/player`})}),_jsxs(_components.td,{children:[`The `,_jsx(_components.code,{children:`Player`}),` component alone, without the timeline`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`@hyperframes/studio/tailwind-preset`})}),_jsx(_components.td,{children:`Tailwind preset used by Studio`})]})]})]}),`\n`,_jsx(_components.p,{children:`Peer dependencies are React 19, React DOM 19, and Zustand 4 or 5.`}),`\n`,_jsx(Heading,{level:`2`,id:`main-exports`,children:`Main exports`}),`\n`,_jsx(Heading,{level:`3`,id:`complete-application`,children:`Complete application`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Export`}),_jsx(_components.th,{children:`Use`})]})}),_jsx(_components.tbody,{children:_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`StudioApp`})}),_jsx(_components.td,{children:`The complete Studio application`})]})})]}),`\n`,_jsx(Heading,{level:`3`,id:`editor-structure`,children:`Editor structure`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Export`}),_jsx(_components.th,{children:`Use`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`EditorShell`})}),_jsx(_components.td,{children:`Preview, side panels, and timeline shell`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`NLEPreview`})}),_jsx(_components.td,{children:`Composition preview surface`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`CompositionBreadcrumb`})}),_jsx(_components.td,{children:`Navigation through nested compositions`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`SourceEditor`})}),_jsx(_components.td,{children:`Source editor`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`PropertyPanel`})}),_jsx(_components.td,{children:`Inspector for the selected element`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`FileTree`})}),_jsx(_components.td,{children:`Project file browser`})]})]})]}),`\n`,_jsx(Heading,{level:`3`,id:`playback-and-timeline`,children:`Playback and timeline`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Export`}),_jsx(_components.th,{children:`Use`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`Player`})}),_jsx(_components.td,{children:`Composition iframe and playback bridge`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`PlayerControls`})}),_jsx(_components.td,{children:`Playback, seeking, and frame controls`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`Timeline`})}),_jsx(_components.td,{children:`Timeline editing surface`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`VideoThumbnail`})}),_jsx(_components.td,{children:`Video clip thumbnail`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`CompositionThumbnail`})}),_jsx(_components.td,{children:`Nested-composition thumbnail`})]})]})]}),`\n`,_jsx(Heading,{level:`3`,id:`hooks-and-utilities`,children:`Hooks and utilities`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Export`}),_jsx(_components.th,{children:`Use`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`useTimelinePlayer`})}),_jsx(_components.td,{children:`Read and control the shared player state`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`usePlayerStore`})}),_jsx(_components.td,{children:`Access the Zustand player store`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`useCompositionStack`})}),_jsx(_components.td,{children:`Drill into and back out of nested compositions`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`useElementPicker`})}),_jsx(_components.td,{children:`Select and edit an element through the preview iframe`})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.code,{children:`resolveSourceFile`}),`, `,_jsx(_components.code,{children:`applyPatch`})]}),_jsx(_components.td,{children:`Locate and patch source`})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.code,{children:`parseStyleString`}),`, `,_jsx(_components.code,{children:`mergeStyleIntoTag`}),`, `,_jsx(_components.code,{children:`findElementBlock`})]}),_jsx(_components.td,{children:`Work with inline source styles and elements`})]})]})]}),`\n`,_jsxs(_components.p,{children:[`The package also exports `,_jsx(_components.code,{children:`CompositionLevel`}),`, `,_jsx(_components.code,{children:`TimelineElement`}),`, `,_jsx(_components.code,{children:`PickedElement`}),`,\nand `,_jsx(_components.code,{children:`PatchOperation`}),`.`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`useElementPicker`}),` remembers the current selection while inspection is active.\nPress Escape in either Studio or the preview to cancel and restore that selection. The\nhovered target is identified beside the preview as `,_jsx(_components.code,{children:`tag#id`}),`, `,_jsx(_components.code,{children:`tag.class`}),`, or the\ntag name alone.`]}),`\n`,_jsx(Heading,{level:`2`,id:`how-studio-stays-connected-to-a-project`,children:`How Studio stays connected to a project`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsx(_components.li,{children:`Studio loads the composition in an iframe with the HyperFrames runtime.`}),`\n`,_jsx(_components.li,{children:`Player controls communicate with that runtime to play, pause, and seek.`}),`\n`,_jsx(_components.li,{children:`The editor and timeline send changes through the Studio API.`}),`\n`,_jsx(_components.li,{children:`The Studio server writes those changes back to the project files.`}),`\n`,_jsx(_components.li,{children:`External file changes refresh the preview while keeping the current position\nwhen possible.`}),`\n`]}),`\n`,_jsx(_components.p,{children:`Preview and render use the same seekable composition contract. Preview still\ndepends on the browser playing in real time, while render captures frames one at a\ntime. A heavy project can therefore stutter during preview and still render every\nframe.`}),`\n`,_jsx(_components.p,{children:`Paused video scrubbing decodes and stages the visible video layers before\nadvancing the composition’s animations. Completed frames appear during a drag,\nwith newer pointer positions coalesced into the next decode. Canvas and GPU\neffects consume the same staged pixels. Continuous playback uses native video;\nStudio keeps the paused picture visible while those videos catch up before Play.\nA native handoff waits for ready frames for up to ten seconds; Pause or a new\nseek cancels it. At the deadline, the rest plays while each unready video keeps\nits last full-quality picture. During playback, native frame presentation or\nplayback progress releases that picture; normal transport sync corrects drift.\nPaused recovery still waits for its requested frame. A skipped source keeps its\npicture on subsequent Play requests until it recovers.\nA paused fallback that outlasts its wait retains the presented clock and picture,\nwhile paused sync continues. It can still publish when the video becomes ready;\na new gesture cancels that recovery. Studio requests paused-decoder release\nbefore preparing native playback and reopens readers when paused scrubbing resumes.\nPaused-reader release waits up to two seconds for transparent video queries to\ndrain. After that it cancels their downloads and lets playback continue while\nunfinished merges close in the background; input disposal still waits for the\nmerge to finish. A recovering video more than half a second out of sync with the transport\ngets at most one corrective seek per recovery registration before its retained picture is removed.\nScrubbing and paused frame steps decode the original video at source resolution\nthroughout. Automatic playback quality reductions do not reduce these frames,\nand the frame decoder does not substitute re-encoded seek copies. Playback\nquality settings do not reduce these paused frames. Browsers or\nmedia that cannot use the frame decoder fall back to native seeking. Long-GOP\nsources can take longer to seek, especially backward or across distant cuts.`}),`\n`,_jsx(Heading,{level:`2`,id:`tailwind-preset`,children:`Tailwind preset`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`5`,language:`typescript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`typescript`,children:_jsxs(_components.code,{language:`typescript`,numberOfLines:`5`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`import`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` studioPreset`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` from`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"@hyperframes/studio/tailwind-preset\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`export`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` default`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#D4D4D4`},children:` {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` presets:`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` [`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`studioPreset`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`]`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#D4D4D4`},children:`}`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`]})})}),`\n`,_jsx(Heading,{level:`2`,id:`preview-guides-in-your-own-app`,children:`Preview guides in your own app`}),`\n`,_jsx(_components.p,{children:`Host apps can compose the same rulers, safe margins, grid, and snap toolbar that\nStudio uses over their own preview iframe. The provider owns the iframe geometry\nand shared preferences, so the host supplies its current iframe element and chooses the\nparts to render:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`15`,language:`tsx`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`tsx`,children:_jsxs(_components.code,{language:`tsx`,numberOfLines:`15`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`import`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` GridOverlay`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` PreviewGuides`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` PreviewOverlayProvider`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` SnapToolbar`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`} `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`from`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"@hyperframes/studio\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`function`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` Preview`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`({ `}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`iframe`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`:`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` { `}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`iframe`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`:`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#4EC9B0`},children:` HTMLIFrameElement`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` |`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` null`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }) {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` return`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` (`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#808080`},children:` \u003c`}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#4EC9B0`},children:`PreviewOverlayProvider`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#9CDCFE`},children:` iframe`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`{`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`iframe`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`}`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#808080`},children:`>`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#808080`},children:` \u003c`}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#4EC9B0`},children:`PreviewGuides`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#808080`},children:` />`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#808080`},children:` \u003c`}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#4EC9B0`},children:`GridOverlay`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#808080`},children:` />`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#808080`},children:` \u003c`}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#4EC9B0`},children:`SnapToolbar`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#808080`},children:` />`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#808080`},children:` \u003c/`}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#4EC9B0`},children:`PreviewOverlayProvider`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#808080`},children:`>`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` );`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsx(Heading,{level:`2`,id:`related-topics`,children:`Related topics`}),`\n`,_jsxs(CardGroup,{cols:2,children:[_jsx(Card,{title:`Use Studio`,icon:`pen-to-square`,href:`/studio`,children:_jsx(_components.p,{children:`Learn the complete editing workflow.`})}),_jsx(Card,{title:`Studio server`,icon:`server`,href:`/packages/studio-server`,children:_jsx(_components.p,{children:`Connect project files, media, linting, and render jobs.`})}),_jsx(Card,{title:`Player`,icon:`circle-play`,href:`/packages/player`,children:_jsx(_components.p,{children:`Embed playback without the editing interface.`})}),_jsx(Card,{title:`SDK`,icon:`code`,href:`/sdk/quickstart`,children:_jsx(_components.p,{children:`Query and edit compositions without Studio.`})})]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"@hyperframes/studio","description":"For developers: the React components and hooks behind the HyperFrames browser editor. Looking for the Studio app? See Get the Studio app.","href":"/packages/studio"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Entry points","slug":"entry-points","depth":2,"children":[]},{"title":"Main exports","slug":"main-exports","depth":2,"children":[{"title":"Complete application","slug":"complete-application","depth":3,"children":[]},{"title":"Editor structure","slug":"editor-structure","depth":3,"children":[]},{"title":"Playback and timeline","slug":"playback-and-timeline","depth":3,"children":[]},{"title":"Hooks and utilities","slug":"hooks-and-utilities","depth":3,"children":[]}]},{"title":"How Studio stays connected to a project","slug":"how-studio-stays-connected-to-a-project","depth":2,"children":[]},{"title":"Tailwind preset","slug":"tailwind-preset","depth":2,"children":[]},{"title":"Preview guides in your own app","slug":"preview-guides-in-your-own-app","depth":2,"children":[]},{"title":"Related topics","slug":"related-topics","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":["/_mintlify/custom/hyperframes/e197f5ee3156e18e/template-gallery.js","/_mintlify/custom/hyperframes/ff53aade3e43a5d8/download-attribution.js","/_mintlify/custom/hyperframes/3e1dd9f13f45d886/docs-menu-label.js"],"subdomain":"hyperframes","siteName":"HyperFrames","title":"@hyperframes/studio - HyperFrames","relatedPagesConfig":{"enabled":true,"limit":3,"mode":"automatic"},"navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-11-08T02:48:41.045Z","originalFileLocation":"packages/studio.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"For developers: the React components and hooks behind the HyperFrames browser editor. Looking for the Studio app? See Get the Studio app.\">\u003cmeta data-mint-head name=\"application-name\" content=\"HyperFrames\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/hyperframes/QHbSdD0ZQMZYQE9R/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/hyperframes/QHbSdD0ZQMZYQE9R/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/hyperframes/QHbSdD0ZQMZYQE9R/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/hyperframes/QHbSdD0ZQMZYQE9R/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/hyperframes/QHbSdD0ZQMZYQE9R/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/hyperframes/QHbSdD0ZQMZYQE9R/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/hyperframes/QHbSdD0ZQMZYQE9R/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/hyperframes/QHbSdD0ZQMZYQE9R/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/hyperframes/QHbSdD0ZQMZYQE9R/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"@hyperframes/studio - HyperFrames\">\u003cmeta data-mint-head property=\"og:description\" content=\"For developers: the React components and hooks behind the HyperFrames browser editor. Looking for the Studio app? See Get the Studio app.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"HyperFrames\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://hyperframes.heygen.com/packages/studio\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://hyperframes.mintlify.site/_mintlify/api/og/v2?division=Packages\u0026amp;title=%40hyperframes%2Fstudio\u0026amp;description=For+developers%3A+the+React+components+and+hooks+behind+the+HyperFrames+browser+editor.+Looking+for+the+Studio+app%3F+See+Get+the+Studio+app.\u0026amp;theme=8e6ca3f41db190753b0e8384\u0026amp;signature=ceaa972f77cfc22a659d67d6d14c00bfea45b5dc64df75c243a8a5d4d15dfaa6\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"@hyperframes/studio - HyperFrames\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"For developers: the React components and hooks behind the HyperFrames browser editor. Looking for the Studio app? See Get the Studio app.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://hyperframes.mintlify.site/_mintlify/api/og/v2?division=Packages\u0026amp;title=%40hyperframes%2Fstudio\u0026amp;description=For+developers%3A+the+React+components+and+hooks+behind+the+HyperFrames+browser+editor.+Looking+for+the+Studio+app%3F+See+Get+the+Studio+app.\u0026amp;theme=8e6ca3f41db190753b0e8384\u0026amp;signature=ceaa972f77cfc22a659d67d6d14c00bfea45b5dc64df75c243a8a5d4d15dfaa6\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/hyperframes/QHbSdD0ZQMZYQE9R/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"HyperFrames\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#181716\">\u003clink data-mint-head rel=\"canonical\" href=\"https://hyperframes.heygen.com/packages/studio\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/packages/studio.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://hyperframes.heygen.com/#organization\",\"name\":\"HyperFrames\",\"url\":\"https://hyperframes.heygen.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/hyperframes/MANsCjTNA4o2G0Te/logo/light.svg?fit=max\u0026auto=format\u0026n=MANsCjTNA4o2G0Te\u0026q=85\u0026s=ac43cb67ca98063e61623b68f6d13001\"}},{\"@type\":\"WebSite\",\"@id\":\"https://hyperframes.heygen.com#website\",\"name\":\"HyperFrames\",\"url\":\"https://hyperframes.heygen.com\",\"publisher\":{\"@id\":\"https://hyperframes.heygen.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://hyperframes.heygen.com/packages/studio#webpage\",\"url\":\"https://hyperframes.heygen.com/packages/studio\",\"name\":\"@hyperframes/studio\",\"description\":\"For developers: the React components and hooks behind the HyperFrames browser editor. Looking for the Studio app? See Get the Studio app.\",\"dateModified\":\"2026-11-08T02:48:41.045Z\",\"isPartOf\":{\"@id\":\"https://hyperframes.heygen.com#website\"},\"breadcrumb\":{\"@id\":\"https://hyperframes.heygen.com/packages/studio#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://hyperframes.heygen.com/packages/studio#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Packages\",\"item\":\"https://hyperframes.heygen.com/packages/core\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"@hyperframes/studio\",\"item\":\"https://hyperframes.heygen.com/packages/studio\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://hyperframes.heygen.com/packages/studio#article\",\"headline\":\"@hyperframes/studio\",\"name\":\"@hyperframes/studio\",\"description\":\"For developers: the React components and hooks behind the HyperFrames browser editor. Looking for the Studio app? See Get the Studio app.\",\"url\":\"https://hyperframes.heygen.com/packages/studio\",\"mainEntityOfPage\":{\"@id\":\"https://hyperframes.heygen.com/packages/studio#webpage\"},\"dateModified\":\"2026-11-08T02:48:41.045Z\",\"publisher\":{\"@id\":\"https://hyperframes.heygen.com/#organization\"},\"isPartOf\":{\"@id\":\"https://hyperframes.heygen.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"HyperFrames\",\"publisher\":{\"@type\":\"Organization\",\"name\":\"HyperFrames\"},\"provider\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","agentPointerHref":"/packages/studio.md","siteName":"HyperFrames","nav":{"global":null,"tabs":[{"tab":"Docs","icon":"book-open","menu":[{"item":"Make a video","icon":"book-open","description":"Guides by kind of video","pages":[{"title":"Make a video","href":"/introduction"}]},{"item":"Studio app","icon":"laptop","description":"The desktop app","pages":[{"title":"Studio app","href":"/studio-app"}]},{"item":"Developers","icon":"code","description":"CLI, SDK and reference","groups":[{"group":"Start here","pages":[{"title":"How HyperFrames fits into an application","sidebarTitle":"Developer overview","href":"/developers/overview"},{"title":"Build on HyperFrames","sidebarTitle":"Developers","href":"/developers/index"},{"title":"How a HyperFrames project works","sidebarTitle":"Project model","href":"/concepts/index"}]},{"group":"Command line","pages":[{"title":"CLI guide","href":"/developers/cli"},{"title":"CLI","sidebarTitle":"CLI reference","href":"/packages/cli"},{"title":"Editable source in a share","href":"/developers/share-source"},{"title":"How catalog search works","href":"/developers/catalog-search"},{"title":"Running the CLI from an agent harness","href":"/developers/harness-tool-context"},{"title":"@hyperframes/lint","href":"/packages/lint"}]},{"group":"SDK guides","pages":[{"title":"Edit a composition with the SDK","sidebarTitle":"SDK quickstart","href":"/sdk/quickstart"},{"title":"Querying \u0026 Editing Elements","href":"/sdk/guides/querying-and-editing"},{"title":"Timing \u0026 Animation","href":"/sdk/guides/timing-and-animation"},{"title":"Undo, Redo \u0026 Patches","href":"/sdk/guides/undo-redo-and-patches"},{"title":"Persistence","href":"/sdk/guides/persistence"},{"title":"Embedded Override Mode","href":"/sdk/guides/embedded-override-mode"},{"title":"Canvas \u0026 Preview Integration","href":"/sdk/guides/canvas-integration"},{"title":"Editing Affordances","href":"/sdk/guides/editing-affordances"}]},{"group":"SDK reference","pages":[{"title":"openComposition","href":"/sdk/reference/open-composition"},{"title":"Composition","href":"/sdk/reference/composition"},{"title":"Edit Operations","href":"/sdk/reference/edit-operations"},{"title":"Types","href":"/sdk/reference/types"},{"title":"Adapters","href":"/sdk/reference/adapters"},{"title":"Utilities \u0026 Constants","href":"/sdk/reference/utilities"}]},{"group":"Composition, design \u0026 animation","pages":[{"title":"Compositions","href":"/concepts/compositions"},{"title":"Reuse a design with variables","sidebarTitle":"Variables","href":"/concepts/variables"},{"title":"Time elements with data attributes","sidebarTitle":"Data attributes","href":"/concepts/data-attributes"},{"title":"Animate with GSAP","sidebarTitle":"GSAP animation","href":"/guides/gsap-animation"},{"title":"Frame sources","href":"/guides/frame-sources"},{"title":"Imported film HTML","href":"/guides/imported-film-html"},{"title":"Frame adapters","href":"/concepts/frame-adapters"},{"title":"Deterministic Rendering","href":"/concepts/determinism"},{"title":"HTML in Canvas","href":"/guides/html-in-canvas"},{"title":"Motion Blur","href":"/guides/motion-blur"},{"title":"Per-pixel effects with data-vfx-chain","sidebarTitle":"VFX chain","href":"/guides/vfx-chain"},{"title":"Figma integration","href":"/guides/figma"}]},{"group":"Composition reference","pages":[{"title":"HTML schema reference","href":"/reference/html-schema"},{"title":"Color grading implementation","sidebarTitle":"Color grading","href":"/reference/color-grading"},{"title":"Audio effects implementation","sidebarTitle":"Audio effects","href":"/reference/audio-effects"},{"title":"Speed ramps","sidebarTitle":"Speed ramps","href":"/reference/speed-ramps"},{"title":"Lint rules","sidebarTitle":"Lint rules","href":"/reference/lint-rules"}]},{"group":"Rendering paths","pages":[{"title":"Render from the command line","href":"/guides/rendering"},{"title":"Choose a rendering path","sidebarTitle":"Rendering overview","href":"/deploy/overview"},{"title":"Cloud rendering","href":"/deploy/cloud"},{"title":"Deploy a preview and render API","sidebarTitle":"Hosted templates","href":"/guides/deploy"}]},{"group":"Cloud infrastructure","pages":[{"title":"AWS Lambda","href":"/deploy/aws-lambda"},{"title":"Google Cloud Run","href":"/deploy/gcp-cloud-run"},{"title":"Render templates on Lambda","href":"/deploy/templates-on-lambda"},{"title":"Migrating to HyperFrames Lambda","href":"/deploy/migrating-to-hyperframes-lambda"},{"title":"@hyperframes/aws-lambda","href":"/packages/aws-lambda"},{"title":"@hyperframes/gcp-cloud-run","href":"/packages/gcp-cloud-run"}]},{"group":"Advanced rendering","pages":[{"title":"4K rendering","href":"/guides/4k-rendering"},{"title":"Render HDR video","href":"/guides/hdr"},{"title":"Fix a slow preview or render","href":"/guides/performance"}]},{"group":"Packages","pages":[{"title":"@hyperframes/core","href":"/packages/core"},{"title":"@hyperframes/parsers","href":"/packages/parsers"},{"title":"@hyperframes/studio-server","href":"/packages/studio-server"},{"title":"@hyperframes/sdk","href":"/packages/sdk"},{"title":"@hyperframes/engine","href":"/packages/engine"},{"title":"@hyperframes/player","href":"/packages/player"},{"title":"@hyperframes/producer","href":"/packages/producer"},{"title":"@hyperframes/shader-transitions","description":"WebGL shader transitions for HyperFrames scenes and compositions.","href":"/packages/shader-transitions"},{"title":"@hyperframes/studio","href":"/packages/studio"}]},{"group":"Agent setup","pages":[{"title":"Authentication \u0026 API keys","description":"Sign in to HeyGen and understand how agent workflows choose voice, music, sound, and optional capture-description providers.","href":"/guides/authentication"},{"title":"Let an agent drive Studio","sidebarTitle":"Agent tools (WebMCP)","href":"/guides/webmcp"}]},{"group":"Contributing \u0026 community","pages":[{"title":"Contribute to HyperFrames","href":"/contributing"},{"title":"Contribute to the Catalog","href":"/contributing/catalog"},{"title":"Release channels","href":"/contributing/release-channels"},{"title":"Release agent plugins","href":"/contributing/agent-plugins"},{"title":"Changelog process","href":"/contributing/changelog-process"},{"title":"Test local CLI changes","href":"/contributing/testing-local-changes"},{"title":"Canary rollouts","href":"/contributing/canary-rollouts"},{"title":"Adopters","href":"/community/adopters"}]}]},{"item":"Free lessons","icon":"graduation-cap","description":"A free video course","href":"https://hyperframes.heygen.com/lessons"},{"item":"Community","icon":"users","description":"Videos people made","href":"https://hyperframes.studio/?view=community\u0026src=docs-navbar"},{"item":"App changelog","icon":"sparkles","description":"What's new in the app","href":"https://hyperframes.studio/changelog?src=docs-navbar"}]},{"tab":"Catalog","icon":"grid-2","pages":[{"title":"Catalog","href":"/catalog"}]}]},"basePath":"","title":"@hyperframes/studio - HyperFrames","buildId":"dpl_596ePT575z4qnAFksq1biRW97aLY","deploymentId":"dpl_596ePT575z4qnAFksq1biRW97aLY","dynamics":[],"chunks":[]}