mirror of
https://github.com/heygen-com/hyperframes.git
synced 2026-09-01 19:42:03 +00:00
## Summary - hide the leading trim handle for timeline clips that cannot offset their own content - keep leading trim available for media clips backed by playback offset metadata or source duration - map visual row priority like a normal timeline editor: top timeline rows render above lower rows ## Why This Is Needed Generic GSAP/DOM timeline clips do not have a playback-offset model like media clips do. That means a left trim affordance on those clips is misleading today: - users reasonably expect front trim to remove the beginning of the animation - the current model can only shorten the clip window, not start the motion halfway through Instead of exposing a control that implies unsupported behavior, this PR keeps true front trim only on clips that can actually offset their content. The PR also fixes the stacking convention so the timeline matches normal editor expectations: - visually higher track row = higher render priority - visually lower track row = lower render priority ## Current Flow By Element Type ### Generic motion / DOM clips Examples: `section`, `div`, `aside`, GSAP-driven cards and overlays. Current supported flow: - drag the whole clip horizontally to change `data-start` - right-trim to shorten the end of the clip window - move between tracks to change `data-track-index` Not supported yet: - true front trim that removes the beginning of the animation itself Behavior after this PR: - no interactive left trim handle is shown - right trim still works - horizontal move still works ### Media clips Examples: `video` / `audio` clips, or wrappers carrying `data-media-start` / `data-playback-start`. Current supported flow: - drag the whole clip horizontally to change `data-start` - left trim advances clip start and playback offset together - right trim shortens `data-duration` Behavior after this PR: - both left and right trim handles remain available - left trim persists `data-start` plus `data-media-start` / `data-playback-start` - right trim persists `data-duration` ## Z-Index Rule This PR now follows the normal timeline-editor convention: - top visual row on the timeline = highest `z-index` - lower visual rows = lower `z-index` Concretely, because Studio renders tracks in ascending numeric order from top to bottom, lower numeric track values now map to higher `z-index` values. ## Validation ### Automated - `bun test packages/studio/src/player/components/timelineEditing.test.ts packages/studio/src/player/components/Timeline.test.ts packages/studio/src/player/store/playerStore.test.ts packages/studio/src/utils/sourcePatcher.test.ts` - `bun run --filter @hyperframes/studio typecheck` ### Browser verification Verified with `agent-browser` on `timeline-edit-playground`: - generic motion clips no longer expose an interactive left trim handle - media clips still expose both trim handles - left trim on `media-card` persisted `data-start` and `data-media-start` - right trim on `media-card` persisted `data-duration` only - moving `title-card` from the bottom row to the top row persisted the highest `z-index` for the top-row clips - recordings: - `/tmp/trim-fix-artifacts/trim-flow.webm` - `/tmp/trim-fix-artifacts/z-index-flow.webm`
210 lines
5.4 KiB
JSON
210 lines
5.4 KiB
JSON
{
|
|
"$schema": "https://mintlify.com/docs.json",
|
|
"name": "HyperFrames",
|
|
"theme": "maple",
|
|
"colors": {
|
|
"primary": "#0a0a0a",
|
|
"light": "#f6f5f1",
|
|
"dark": "#0a0a0a"
|
|
},
|
|
"background": {
|
|
"color": {
|
|
"light": "#f6f5f1",
|
|
"dark": "#0a0a0a"
|
|
}
|
|
},
|
|
"fonts": {
|
|
"family": "Inter",
|
|
"heading": {
|
|
"family": "Inter"
|
|
}
|
|
},
|
|
"appearance": {
|
|
"default": "light"
|
|
},
|
|
"logo": {
|
|
"light": "/logo/light.svg",
|
|
"dark": "/logo/dark.svg"
|
|
},
|
|
"favicon": "/favicon.svg",
|
|
"contextual": {
|
|
"options": [
|
|
"copy",
|
|
"claude",
|
|
"cursor",
|
|
"vscode",
|
|
"windsurf",
|
|
"mcp",
|
|
{
|
|
"title": "Open an issue",
|
|
"description": "Report a bug or request a feature",
|
|
"icon": "github",
|
|
"iconType": "brands",
|
|
"href": "https://github.com/heygen-com/hyperframes/issues/new"
|
|
}
|
|
]
|
|
},
|
|
"navigation": {
|
|
"tabs": [
|
|
{
|
|
"tab": "Documentation",
|
|
"groups": [
|
|
{
|
|
"group": "Getting Started",
|
|
"pages": [
|
|
"introduction",
|
|
"quickstart",
|
|
"examples"
|
|
]
|
|
},
|
|
{
|
|
"group": "Concepts",
|
|
"pages": [
|
|
"concepts/compositions",
|
|
"concepts/data-attributes",
|
|
"concepts/frame-adapters",
|
|
"concepts/determinism"
|
|
]
|
|
},
|
|
{
|
|
"group": "Guides",
|
|
"pages": [
|
|
"guides/website-to-video",
|
|
"guides/prompting",
|
|
"guides/hyperframes-vs-remotion",
|
|
"guides/gsap-animation",
|
|
"guides/rendering",
|
|
"guides/hdr",
|
|
"guides/performance",
|
|
"guides/timeline-editing",
|
|
"guides/common-mistakes",
|
|
"guides/troubleshooting"
|
|
]
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"tab": "Catalog",
|
|
"groups": [
|
|
{
|
|
"group": "Social Overlays",
|
|
"pages": [
|
|
"catalog/blocks/instagram-follow",
|
|
"catalog/blocks/macos-notification",
|
|
"catalog/blocks/reddit-post",
|
|
"catalog/blocks/spotify-card",
|
|
"catalog/blocks/tiktok-follow",
|
|
"catalog/blocks/x-post",
|
|
"catalog/blocks/yt-lower-third"
|
|
]
|
|
},
|
|
{
|
|
"group": "Shader Transitions",
|
|
"pages": [
|
|
"catalog/blocks/chromatic-radial-split",
|
|
"catalog/blocks/cinematic-zoom",
|
|
"catalog/blocks/cross-warp-morph",
|
|
"catalog/blocks/domain-warp-dissolve",
|
|
"catalog/blocks/flash-through-white",
|
|
"catalog/blocks/glitch",
|
|
"catalog/blocks/gravitational-lens",
|
|
"catalog/blocks/light-leak",
|
|
"catalog/blocks/ridged-burn",
|
|
"catalog/blocks/ripple-waves",
|
|
"catalog/blocks/sdf-iris",
|
|
"catalog/blocks/swirl-vortex",
|
|
"catalog/blocks/thermal-distortion",
|
|
"catalog/blocks/whip-pan"
|
|
]
|
|
},
|
|
{
|
|
"group": "CSS Transitions",
|
|
"pages": [
|
|
"catalog/blocks/transitions-3d",
|
|
"catalog/blocks/transitions-blur",
|
|
"catalog/blocks/transitions-cover",
|
|
"catalog/blocks/transitions-destruction",
|
|
"catalog/blocks/transitions-dissolve",
|
|
"catalog/blocks/transitions-distortion",
|
|
"catalog/blocks/transitions-grid",
|
|
"catalog/blocks/transitions-light",
|
|
"catalog/blocks/transitions-mechanical",
|
|
"catalog/blocks/transitions-other",
|
|
"catalog/blocks/transitions-push",
|
|
"catalog/blocks/transitions-radial",
|
|
"catalog/blocks/transitions-scale"
|
|
]
|
|
},
|
|
{
|
|
"group": "Showcases",
|
|
"pages": [
|
|
"catalog/blocks/app-showcase",
|
|
"catalog/blocks/ui-3d-reveal"
|
|
]
|
|
},
|
|
{
|
|
"group": "Data",
|
|
"pages": [
|
|
"catalog/blocks/data-chart"
|
|
]
|
|
},
|
|
{
|
|
"group": "Effects",
|
|
"pages": [
|
|
"catalog/components/grain-overlay",
|
|
"catalog/components/grid-pixelate-wipe",
|
|
"catalog/components/shimmer-sweep"
|
|
]
|
|
},
|
|
{
|
|
"group": "Blocks",
|
|
"pages": [
|
|
"catalog/blocks/flowchart",
|
|
"catalog/blocks/logo-outro"
|
|
]
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"tab": "Packages",
|
|
"groups": [
|
|
{
|
|
"group": "Packages",
|
|
"pages": [
|
|
"packages/core",
|
|
"packages/engine",
|
|
"packages/player",
|
|
"packages/producer",
|
|
"packages/studio",
|
|
"packages/cli"
|
|
]
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"tab": "Reference",
|
|
"groups": [
|
|
{
|
|
"group": "Reference",
|
|
"pages": [
|
|
"reference/html-schema"
|
|
]
|
|
},
|
|
{
|
|
"group": "Contributing",
|
|
"pages": [
|
|
"contributing",
|
|
"contributing/testing-local-changes"
|
|
]
|
|
}
|
|
]
|
|
}
|
|
]
|
|
},
|
|
"footer": {
|
|
"socials": {
|
|
"github": "https://github.com/heygen-com/hyperframes"
|
|
}
|
|
}
|
|
}
|