1:"$Sreact.fragment"
2:I[5386,["/opencut/_next/static/chunks/049ff6ae64fe49e7.js","/opencut/_next/static/chunks/73628bbd5d656418.js","/opencut/_next/static/chunks/9eb542cd47321b68.js","/opencut/_next/static/chunks/2f18e43b04fc1c1e.js","/opencut/_next/static/chunks/2a3fbaad9a8bf049.js","/opencut/_next/static/chunks/10c37fe99487cbf0.js"],"Header"]
3:I[79198,["/opencut/_next/static/chunks/049ff6ae64fe49e7.js","/opencut/_next/static/chunks/73628bbd5d656418.js","/opencut/_next/static/chunks/9eb542cd47321b68.js","/opencut/_next/static/chunks/2f18e43b04fc1c1e.js","/opencut/_next/static/chunks/2a3fbaad9a8bf049.js","/opencut/_next/static/chunks/10c37fe99487cbf0.js"],""]
34:I[76581,["/opencut/_next/static/chunks/049ff6ae64fe49e7.js","/opencut/_next/static/chunks/73628bbd5d656418.js","/opencut/_next/static/chunks/9eb542cd47321b68.js","/opencut/_next/static/chunks/2f18e43b04fc1c1e.js","/opencut/_next/static/chunks/2a3fbaad9a8bf049.js","/opencut/_next/static/chunks/10c37fe99487cbf0.js"],"Separator"]
40:I[85369,["/opencut/_next/static/chunks/049ff6ae64fe49e7.js","/opencut/_next/static/chunks/73628bbd5d656418.js","/opencut/_next/static/chunks/9eb542cd47321b68.js","/opencut/_next/static/chunks/2f18e43b04fc1c1e.js","/opencut/_next/static/chunks/2a3fbaad9a8bf049.js","/opencut/_next/static/chunks/10c37fe99487cbf0.js"],"Image"]
45:I[34778,["/opencut/_next/static/chunks/ba87d901fca5afd6.js","/opencut/_next/static/chunks/6ced418915ddbb2a.js"],"OutletBoundary"]
46:"$Sreact.suspense"
0:{"buildId":"s6P8sDhi397Y5G9wJI3N2","rsc":["$","$1","c",{"children":[["$","section",null,{"className":"bg-background min-h-screen","children":[["$","$L2",null,{}],["$","main",null,{"className":"relative container mx-auto flex flex-col gap-12 px-6 pt-12 pb-24 md:pt-24 max-w-3xl","children":[["$","div",null,{"className":"flex flex-col gap-8 text-center","children":[["$","h1",null,{"className":"text-5xl font-bold tracking-tight md:text-6xl","children":"Changelog"}],["$","p",null,{"className":"text-muted-foreground mx-auto max-w-2xl text-xl leading-relaxed","children":"See what's new in OpenCut"}],"$undefined"]}],["$","div",null,{"className":"mx-auto w-full max-w-3xl","children":["$","div",null,{"className":"relative","children":[["$","div",null,{"aria-hidden":true,"className":"absolute top-2 bottom-0 left-[5px] w-px bg-border hidden sm:block"}],["$","div",null,{"className":"flex flex-col","children":[["$","div","0.3.0",{"className":"flex flex-col","children":[["$","article",null,{"className":"relative sm:pl-10","children":[["$","div",null,{"aria-hidden":true,"className":"absolute left-0 top-[3px] hidden sm:block","children":["$","div",null,{"className":"size-[11px] rounded-full border-[1.5px] border-foreground bg-foreground"}]}],["$","div",null,{"className":"flex flex-col gap-5","children":[["$","span",null,{"className":"text-sm font-medium tracking-widest text-muted-foreground","children":["0.3.0"," — ","2026-04-15"]}],["$","div",null,{"className":"flex flex-col gap-4","children":[["$","h2",null,{"className":"font-bold tracking-tight text-2xl","children":["$","$L3",null,{"href":"/changelog/0.3.0","className":"hover:underline underline-offset-4","children":"Masks, animation & more"}]}],["$","p",null,{"className":"text-base text-foreground leading-relaxed max-w-xl","children":"This release adds masks, a graph editor for keyframe curves, volume and speed controls, preview zoom, canvas backgrounds, stickers, and a lot more."}]]}],["$","div",null,{"className":"flex flex-col gap-4","children":[["$","div","new",{"className":"flex flex-col gap-1.5","children":[["$","h3",null,{"className":"text-base font-semibold text-foreground","children":["Features",":"]}],["$","ul",null,{"className":"list-disc space-y-1.5 pl-5","children":[["$","li","Added a brand page with downloadable brand assets. Assets are also accessible directly from the header logo context menu.",{"className":"text-base leading-relaxed text-foreground","children":[["$","span","p-0",{"className":"m-0","node":{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Added a brand page with downloadable brand assets. Assets are also accessible directly from the header logo context menu.","position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":122,"offset":121}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":122,"offset":121}}},"children":"Added a brand page with downloadable brand assets. Assets are also accessible directly from the header logo context menu."}]]}],["$","li","Scale now has separate width and height controls. You can stretch or squash elements independently on each axis.",{"className":"text-base leading-relaxed text-foreground","children":[["$","span","p-0",{"className":"m-0","node":{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Scale now has separate width and height controls. You can stretch or squash elements independently on each axis.","position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":113,"offset":112}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":113,"offset":112}}},"children":"Scale now has separate width and height controls. You can stretch or squash elements independently on each axis."}]]}],["$","li","Volume control for audio and video elements.",{"className":"text-base leading-relaxed text-foreground","children":[["$","span","p-0",{"className":"m-0","node":{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Volume control for audio and video elements.","position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":45,"offset":44}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":45,"offset":44}}},"children":"Volume control for audio and video elements."}]]}],"$L4","$L5","$L6","$L7","$L8","$L9","$La","$Lb","$Lc","$Ld","$Le","$Lf"]}]]}],"$L10","$L11","$L12"]}]]}]]}],"$L13"]}],"$L14","$L15"]}]]}]}]]}],"$L16"]}],["$L17","$L18","$L19"],"$L1a"]}],"loading":null,"isPartial":false}
4:["$","li","Speed control for video and audio clips. Includes a maintain pitch option so audio doesn't chipmunk or deepen when you change the rate.",{"className":"text-base leading-relaxed text-foreground","children":[["$","span","p-0",{"className":"m-0","node":{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Speed control for video and audio clips. Includes a maintain pitch option so audio doesn't chipmunk or deepen when you change the rate.","position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":136,"offset":135}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":136,"offset":135}}},"children":"Speed control for video and audio clips. Includes a maintain pitch option so audio doesn't chipmunk or deepen when you change the rate."}]]}]
5:["$","li","Masks. Hide or reveal parts of any video or image layer. Choose from split, rectangle, ellipse, star, heart, diamond, and cinematic bars. Adjust position, size, rotation, feather, and stroke in the properties panel, or drag the handles in the preview.",{"className":"text-base leading-relaxed text-foreground","children":[["$","span","p-0",{"className":"m-0","node":{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Masks. Hide or reveal parts of any video or image layer. Choose from split, rectangle, ellipse, star, heart, diamond, and cinematic bars. Adjust position, size, rotation, feather, and stroke in the properties panel, or drag the handles in the preview.","position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":252,"offset":251}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":252,"offset":251}}},"children":"Masks. Hide or reveal parts of any video or image layer. Choose from split, rectangle, ellipse, star, heart, diamond, and cinematic bars. Adjust position, size, rotation, feather, and stroke in the properties panel, or drag the handles in the preview."}]]}]
6:["$","li","Canvas backgrounds are back. Set a blur, solid color, or gradient as the canvas background from the new Background tab in the settings panel.",{"className":"text-base leading-relaxed text-foreground","children":[["$","span","p-0",{"className":"m-0","node":{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Canvas backgrounds are back. Set a blur, solid color, or gradient as the canvas background from the new Background tab in the settings panel.","position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":142,"offset":141}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":142,"offset":141}}},"children":"Canvas backgrounds are back. Set a blur, solid color, or gradient as the canvas background from the new Background tab in the settings panel."}]]}]
7:["$","li","Custom canvas size. Instead of being locked to a handful of presets, you can now enter any width and height you want.",{"className":"text-base leading-relaxed text-foreground","children":[["$","span","p-0",{"className":"m-0","node":{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Custom canvas size. Instead of being locked to a handful of presets, you can now enter any width and height you want.","position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":118,"offset":117}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":118,"offset":117}}},"children":"Custom canvas size. Instead of being locked to a handful of presets, you can now enter any width and height you want."}]]}]
8:["$","li","Preview zoom and panning. Zoom into the canvas to work on fine details, and pan around to navigate when zoomed in.",{"className":"text-base leading-relaxed text-foreground","children":[["$","span","p-0",{"className":"m-0","node":{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Preview zoom and panning. Zoom into the canvas to work on fine details, and pan around to navigate when zoomed in.","position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":115,"offset":114}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":115,"offset":114}}},"children":"Preview zoom and panning. Zoom into the canvas to work on fine details, and pan around to navigate when zoomed in."}]]}]
9:["$","li","Stickers panel now has content. Browse and add country flags and shapes.",{"className":"text-base leading-relaxed text-foreground","children":[["$","span","p-0",{"className":"m-0","node":{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Stickers panel now has content. Browse and add country flags and shapes.","position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":73,"offset":72}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":73,"offset":72}}},"children":"Stickers panel now has content. Browse and add country flags and shapes."}]]}]
a:["$","li","You can now import transcript files to generate captions instead of running auto-transcription.",{"className":"text-base leading-relaxed text-foreground","children":[["$","span","p-0",{"className":"m-0","node":{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"You can now import transcript files to generate captions instead of running auto-transcription.","position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":96,"offset":95}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":96,"offset":95}}},"children":"You can now import transcript files to generate captions instead of running auto-transcription."}]]}]
b:["$","li","Graph editor for keyframe curves. Shape the easing between keyframes by dragging bezier handles.",{"className":"text-base leading-relaxed text-foreground","children":[["$","span","p-0",{"className":"m-0","node":{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Graph editor for keyframe curves. Shape the easing between keyframes by dragging bezier handles.","position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":97,"offset":96}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":97,"offset":96}}},"children":"Graph editor for keyframe curves. Shape the easing between keyframes by dragging bezier handles."}]]}]
c:["$","li","Multiple selected timeline clips move and resize together.",{"className":"text-base leading-relaxed text-foreground","children":[["$","span","p-0",{"className":"m-0","node":{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Multiple selected timeline clips move and resize together.","position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":59,"offset":58}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":59,"offset":58}}},"children":"Multiple selected timeline clips move and resize together."}]]}]
d:["$","li","Position X and Y can now be animated independently.",{"className":"text-base leading-relaxed text-foreground","children":[["$","span","p-0",{"className":"m-0","node":{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Position X and Y can now be animated independently.","position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":52,"offset":51}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":52,"offset":51}}},"children":"Position X and Y can now be animated independently."}]]}]
e:["$","li","Keyframes can be copied and pasted between elements.",{"className":"text-base leading-relaxed text-foreground","children":[["$","span","p-0",{"className":"m-0","node":{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Keyframes can be copied and pasted between elements.","position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":53,"offset":52}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":53,"offset":52}}},"children":"Keyframes can be copied and pasted between elements."}]]}]
f:["$","li","Timeline clips can expand to show a lane for each animated property. Right-click a clip -> \"Expand keyframes\" to see all properties in their own rows.",{"className":"text-base leading-relaxed text-foreground","children":[["$","span","p-0",{"className":"m-0","node":{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Timeline clips can expand to show a lane for each animated property. Right-click a clip -> \"Expand keyframes\" to see all properties in their own rows.","position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":151,"offset":150}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":151,"offset":150}}},"children":"Timeline clips can expand to show a lane for each animated property. Right-click a clip -> \"Expand keyframes\" to see all properties in their own rows."}]]}]
10:["$","div","improved",{"className":"flex flex-col gap-1.5","children":[["$","h3",null,{"className":"text-base font-semibold text-foreground","children":["Improvements",":"]}],["$","ul",null,{"className":"list-disc space-y-1.5 pl-5","children":[["$","li","Added a changelog link to the footer.",{"className":"text-base leading-relaxed text-foreground","children":[["$","span","p-0",{"className":"m-0","node":{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Added a changelog link to the footer.","position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":38,"offset":37}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":38,"offset":37}}},"children":"Added a changelog link to the footer."}]]}],["$","li","Playback performance is dramatically better. The editor used to slow to a crawl during playback, and audio would stutter when interacting with elements mid-play. Both are fixed.",{"className":"text-base leading-relaxed text-foreground","children":[["$","span","p-0",{"className":"m-0","node":{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Playback performance is dramatically better. The editor used to slow to a crawl during playback, and audio would stutter when interacting with elements mid-play. Both are fixed.","position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":178,"offset":177}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":178,"offset":177}}},"children":"Playback performance is dramatically better. The editor used to slow to a crawl during playback, and audio would stutter when interacting with elements mid-play. Both are fixed."}]]}],["$","li","More vertical space between timeline tracks. Selection outlines on adjacent tracks no longer overlap each other.",{"className":"text-base leading-relaxed text-foreground","children":[["$","span","p-0",{"className":"m-0","node":{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"More vertical space between timeline tracks. Selection outlines on adjacent tracks no longer overlap each other.","position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":113,"offset":112}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":113,"offset":112}}},"children":"More vertical space between timeline tracks. Selection outlines on adjacent tracks no longer overlap each other."}]]}],["$","li","Holding Shift or Ctrl while drag-selecting in the timeline now adds to your existing selection instead of replacing it. Matches how Shift/Ctrl+click already worked.",{"className":"text-base leading-relaxed text-foreground","children":[["$","span","p-0",{"className":"m-0","node":{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Holding Shift or Ctrl while drag-selecting in the timeline now adds to your existing selection instead of replacing it. Matches how Shift/Ctrl+click already worked.","position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":165,"offset":164}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":165,"offset":164}}},"children":"Holding Shift or Ctrl while drag-selecting in the timeline now adds to your existing selection instead of replacing it. Matches how Shift/Ctrl+click already worked."}]]}],["$","li","Timeline track rows now highlight when they contain a selected element, making it easier to see which tracks are active at a glance.",{"className":"text-base leading-relaxed text-foreground","children":[["$","span","p-0",{"className":"m-0","node":{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Timeline track rows now highlight when they contain a selected element, making it easier to see which tracks are active at a glance.","position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":133,"offset":132}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":133,"offset":132}}},"children":"Timeline track rows now highlight when they contain a selected element, making it easier to see which tracks are active at a glance."}]]}],"$L1b","$L1c","$L1d","$L1e","$L1f","$L20","$L21","$L22"]}]]}]
11:["$","div","fixed",{"className":"flex flex-col gap-1.5","children":[["$","h3",null,{"className":"text-base font-semibold text-foreground","children":["Fixes",":"]}],["$","ul",null,{"className":"list-disc space-y-1.5 pl-5","children":[["$","li","Sponsor logos now correctly invert in dark mode.",{"className":"text-base leading-relaxed text-foreground","children":[["$","span","p-0",{"className":"m-0","node":{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sponsor logos now correctly invert in dark mode.","position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":49,"offset":48}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":49,"offset":48}}},"children":"Sponsor logos now correctly invert in dark mode."}]]}],["$","li","Media asset cards in the grid view were larger than their thumbnails, leaving empty space around each item. Cards now size to their content.",{"className":"text-base leading-relaxed text-foreground","children":[["$","span","p-0",{"className":"m-0","node":{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Media asset cards in the grid view were larger than their thumbnails, leaving empty space around each item. Cards now size to their content.","position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":141,"offset":140}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":141,"offset":140}}},"children":"Media asset cards in the grid view were larger than their thumbnails, leaving empty space around each item. Cards now size to their content."}]]}],["$","li","Project thumbnails now generate correctly even when the timeline is empty. If you set a background color or gradient with no clips, the thumbnail reflects that instead of staying blank.",{"className":"text-base leading-relaxed text-foreground","children":[["$","span","p-0",{"className":"m-0","node":{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Project thumbnails now generate correctly even when the timeline is empty. If you set a background color or gradient with no clips, the thumbnail reflects that instead of staying blank.","position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":186,"offset":185}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":186,"offset":185}}},"children":"Project thumbnails now generate correctly even when the timeline is empty. If you set a background color or gradient with no clips, the thumbnail reflects that instead of staying blank."}]]}],["$","li","Clicking a selected element no longer keeps the rest of the selection.",{"className":"text-base leading-relaxed text-foreground","children":[["$","span","p-0",{"className":"m-0","node":{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Clicking a selected element no longer keeps the rest of the selection.","position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":71,"offset":70}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":71,"offset":70}}},"children":"Clicking a selected element no longer keeps the rest of the selection."}]]}],["$","li","Track labels on the left side of the timeline were misaligned with the tracks on the right.",{"className":"text-base leading-relaxed text-foreground","children":[["$","span","p-0",{"className":"m-0","node":{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Track labels on the left side of the timeline were misaligned with the tracks on the right.","position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":92,"offset":91}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":92,"offset":91}}},"children":"Track labels on the left side of the timeline were misaligned with the tracks on the right."}]]}],["$","li","Clicking in the empty space below timeline tracks now seeks the playhead.",{"className":"text-base leading-relaxed text-foreground","children":[["$","span","p-0",{"className":"m-0","node":{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Clicking in the empty space below timeline tracks now seeks the playhead.","position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":74,"offset":73}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":74,"offset":73}}},"children":"Clicking in the empty space below timeline tracks now seeks the playhead."}]]}],"$L23","$L24","$L25","$L26","$L27","$L28","$L29","$L2a","$L2b","$L2c"]}]]}]
12:["$","details","technical",{"className":"group flex flex-col gap-1.5","children":[["$","summary",null,{"className":"flex w-fit cursor-pointer list-none items-center gap-1.5 text-base font-semibold text-foreground [&::-webkit-details-marker]:hidden","children":[["$","span",null,{"children":["Technical details",":"]}],["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","color":"currentColor","className":"size-3 shrink-0 text-muted-foreground group-open:rotate-90","children":[["$","path","0",{"d":"M9.00005 6C9.00005 6 15 10.4189 15 12C15 13.5812 9 18 9 18","stroke":"currentColor","strokeLinecap":"round","strokeLinejoin":"round","strokeWidth":"1.5"}]]}]]}],["$","ul",null,{"className":"list-disc space-y-1.5 pl-5","children":[["$","li","Ripple editing now has a proper algorithmic foundation. The old inline approach was replaced with a diff-based system in `src/lib/ripple/`: track snapshots before and after an operation are compared as interval sets, vacated intervals are computed (accounting for elements moved to other tracks), and the result is a list of explicit `RippleAdjustment` values applied in a separate pass. Composable, testable, and independent of the command that triggered it.",{"className":"text-base leading-relaxed text-foreground","children":[["$","span","p-0",{"className":"m-0","node":{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ripple editing now has a proper algorithmic foundation. The old inline approach was replaced with a diff-based system in ","position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":122,"offset":121}}},{"type":"element","tagName":"code","properties":{},"children":[{"type":"text","value":"src/lib/ripple/","position":{"start":{"line":1,"column":122,"offset":121},"end":{"line":1,"column":139,"offset":138}}}],"position":{"start":{"line":1,"column":122,"offset":121},"end":{"line":1,"column":139,"offset":138}}},{"type":"text","value":": track snapshots before and after an operation are compared as interval sets, vacated intervals are computed (accounting for elements moved to other tracks), and the result is a list of explicit ","position":{"start":{"line":1,"column":139,"offset":138},"end":{"line":1,"column":335,"offset":334}}},{"type":"element","tagName":"code","properties":{},"children":[{"type":"text","value":"RippleAdjustment","position":{"start":{"line":1,"column":335,"offset":334},"end":{"line":1,"column":353,"offset":352}}}],"position":{"start":{"line":1,"column":335,"offset":334},"end":{"line":1,"column":353,"offset":352}}},{"type":"text","value":" values applied in a separate pass. Composable, testable, and independent of the command that triggered it.","position":{"start":{"line":1,"column":353,"offset":352},"end":{"line":1,"column":460,"offset":459}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":460,"offset":459}}},"children":["Ripple editing now has a proper algorithmic foundation. The old inline approach was replaced with a diff-based system in ",["$","code","code-0",{"className":"rounded border border-destructive/20 bg-destructive/5 px-1.5 py-0.5 font-mono text-[0.85em] text-red-700 dark:text-red-300","node":"$12:props:children:1:props:children:0:props:children:0:props:node:children:1","children":"src/lib/ripple/"}],": track snapshots before and after an operation are compared as interval sets, vacated intervals are computed (accounting for elements moved to other tracks), and the result is a list of explicit ",["$","code","code-1",{"className":"rounded border border-destructive/20 bg-destructive/5 px-1.5 py-0.5 font-mono text-[0.85em] text-red-700 dark:text-red-300","node":"$12:props:children:1:props:children:0:props:children:0:props:node:children:3","children":"RippleAdjustment"}]," values applied in a separate pass. Composable, testable, and independent of the command that triggered it."]}]]}],["$","li","Time is now represented as `MediaTime`, an integer tick count at 120,000 ticks per second, defined in `rust/crates/time`. Previously, floating-point seconds were used throughout, which accumulated rounding errors and made frame alignment imprecise. 120,000 was chosen because it divides evenly by every standard frame rate denominator, including drop-frame rates: 23.976 maps to 5,005 ticks/frame, 29.97 to 4,004, 30 to 4,000. `FrameRate` is a rational `{numerator, denominator}` type rather than a float. All time arithmetic, frame snapping, and timecode formatting are implemented in Rust and exposed via WASM.",{"className":"text-base leading-relaxed text-foreground","children":"$L2d"}],"$L2e","$L2f","$L30","$L31","$L32","$L33"]}]]}]
13:["$","$L34",null,{"className":"my-10 sm:ml-1.5"}]
14:["$","div","0.2.0",{"className":"flex flex-col","children":[["$","article",null,{"className":"relative sm:pl-10","children":[["$","div",null,{"aria-hidden":true,"className":"absolute left-0 top-[3px] hidden sm:block","children":["$","div",null,{"className":"size-[11px] rounded-full border-[1.5px] border-muted-foreground/30 bg-background"}]}],["$","div",null,{"className":"flex flex-col gap-5","children":[["$","span",null,{"className":"text-sm font-medium tracking-widest text-muted-foreground","children":["0.2.0"," — ","2026-03-01"]}],["$","div",null,{"className":"flex flex-col gap-4","children":[["$","h2",null,{"className":"font-bold tracking-tight text-2xl","children":["$","$L3",null,{"href":"/changelog/0.2.0","className":"hover:underline underline-offset-4","children":"Motion & effects"}]}],["$","p",null,{"className":"text-base text-foreground leading-relaxed max-w-xl","children":"This release adds the foundation for motion and effects, alongside many improvements & fixes."}]]}],["$","div",null,{"className":"flex flex-col gap-4","children":[["$","div","new",{"className":"flex flex-col gap-1.5","children":[["$","h3",null,{"className":"text-base font-semibold text-foreground","children":["Features",":"]}],["$","ul",null,{"className":"list-disc space-y-1.5 pl-5","children":[["$","li","Keyframe animation system for animating element properties over time.",{"className":"text-base leading-relaxed text-foreground","children":[["$","span","p-0",{"className":"m-0","node":{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Keyframe animation system for animating element properties over time.","position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":70,"offset":69}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":70,"offset":69}}},"children":"Keyframe animation system for animating element properties over time."}]]}],["$","li","Entirely new efects system. Effects can be applied per-clip or added as standalone elements on the timeline (with our first effect: Blur!)",{"className":"text-base leading-relaxed text-foreground","children":[["$","span","p-0",{"className":"m-0","node":{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Entirely new efects system. Effects can be applied per-clip or added as standalone elements on the timeline (with our first effect: Blur!)","position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":139,"offset":138}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":139,"offset":138}}},"children":"Entirely new efects system. Effects can be applied per-clip or added as standalone elements on the timeline (with our first effect: Blur!)"}]]}],["$","li","Added a changelog page to the site.",{"className":"text-base leading-relaxed text-foreground","children":[["$","span","p-0",{"className":"m-0","node":{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Added a changelog page to the site.","position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":36,"offset":35}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":36,"offset":35}}},"children":"Added a changelog page to the site."}]]}],["$","li","Ripple editing mode.",{"className":"text-base leading-relaxed text-foreground","children":[["$","span","p-0",{"className":"m-0","node":{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ripple editing mode.","position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":21,"offset":20}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":21,"offset":20}}},"children":"Ripple editing mode."}]]}]]}]]}],["$","div","improved",{"className":"flex flex-col gap-1.5","children":[["$","h3",null,{"className":"text-base font-semibold text-foreground","children":["Improvements",":"]}],["$","ul",null,{"className":"list-disc space-y-1.5 pl-5","children":[["$","li","New text elements no longer have a black background by default.",{"className":"text-base leading-relaxed text-foreground","children":[["$","span","p-0",{"className":"m-0","node":{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"New text elements no longer have a black background by default.","position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":64,"offset":63}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":64,"offset":63}}},"children":"New text elements no longer have a black background by default."}]]}],"$L35","$L36","$L37"]}]]}],"$L38"]}]]}]]}],"$L39"]}]
15:["$","div","0.1.0",{"className":"flex flex-col","children":[["$","article",null,{"className":"relative sm:pl-10","children":[["$","div",null,{"aria-hidden":true,"className":"absolute left-0 top-[3px] hidden sm:block","children":["$","div",null,{"className":"size-[11px] rounded-full border-[1.5px] border-muted-foreground/30 bg-background"}]}],["$","div",null,{"className":"flex flex-col gap-5","children":[["$","span",null,{"className":"text-sm font-medium tracking-widest text-muted-foreground","children":["0.1.0"," — ","2026-02-23"]}],["$","div",null,{"className":"flex flex-col gap-4","children":[["$","h2",null,{"className":"font-bold tracking-tight text-2xl","children":["$","$L3",null,{"href":"/changelog/0.1.0","className":"hover:underline underline-offset-4","children":"Editor foundation"}]}],["$","p",null,{"className":"text-base text-foreground leading-relaxed max-w-xl","children":"This first release focuses on making editing faster, clearer, and more reliable for day-to-day use."}]]}],["$","div",null,{"className":"flex flex-col gap-4","children":[["$","div","new",{"className":"flex flex-col gap-1.5","children":[["$","h3",null,{"className":"text-base font-semibold text-foreground","children":["Features",":"]}],["$","ul",null,{"className":"list-disc space-y-1.5 pl-5","children":[["$","li","Rebuilt the properties panel from scratch. Number inputs now support math expressions and click-drag scrubbing instead of just typing values in.",{"className":"text-base leading-relaxed text-foreground","children":[["$","span","p-0",{"className":"m-0","node":{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Rebuilt the properties panel from scratch. Number inputs now support math expressions and click-drag scrubbing instead of just typing values in.","position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":145,"offset":144}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":145,"offset":144}}},"children":"Rebuilt the properties panel from scratch. Number inputs now support math expressions and click-drag scrubbing instead of just typing values in."}]]}],["$","li","The properties panel went from a flat list of basic text styles to organized sections: transform, blending, typography, spacing, and background controls. Text elements finally have position, scale, and rotation.",{"className":"text-base leading-relaxed text-foreground","children":[["$","span","p-0",{"className":"m-0","node":{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"The properties panel went from a flat list of basic text styles to organized sections: transform, blending, typography, spacing, and background controls. Text elements finally have position, scale, and rotation.","position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":212,"offset":211}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":212,"offset":211}}},"children":"The properties panel went from a flat list of basic text styles to organized sections: transform, blending, typography, spacing, and background controls. Text elements finally have position, scale, and rotation."}]]}],["$","li","New color picker with eyedropper, opacity control, and multiple color formats.",{"className":"text-base leading-relaxed text-foreground","children":[["$","span","p-0",{"className":"m-0","node":{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"New color picker with eyedropper, opacity control, and multiple color formats.","position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":79,"offset":78}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":79,"offset":78}}},"children":"New color picker with eyedropper, opacity control, and multiple color formats."}]]}],["$","li","Bookmarks now support notes, color labels, and optional duration to plan scenes more clearly.",{"className":"text-base leading-relaxed text-foreground","children":[["$","span","p-0",{"className":"m-0","node":{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Bookmarks now support notes, color labels, and optional duration to plan scenes more clearly.","position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":94,"offset":93}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":94,"offset":93}}},"children":"Bookmarks now support notes, color labels, and optional duration to plan scenes more clearly."}]]}],"$L3a","$L3b","$L3c","$L3d"]}]]}],"$L3e","$L3f"]}]]}]]}],false]}]
41:T518,M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z42:T495,M19.3034 5.33716C17.9344 4.71103 16.4805 4.2547 14.9629 4C14.7719 4.32899 14.5596 4.77471 14.411 5.12492C12.7969 4.89144 11.1944 4.89144 9.60255 5.12492C9.45397 4.77471 9.2311 4.32899 9.05068 4C7.52251 4.2547 6.06861 4.71103 4.70915 5.33716C1.96053 9.39111 1.21766 13.3495 1.5891 17.2549C3.41443 18.5815 5.17612 19.388 6.90701 19.9187C7.33151 19.3456 7.71356 18.73 8.04255 18.0827C7.41641 17.8492 6.82211 17.5627 6.24904 17.2231C6.39762 17.117 6.5462 17.0003 6.68416 16.8835C10.1438 18.4648 13.8911 18.4648 17.3082 16.8835C17.4568 17.0003 17.5948 17.117 17.7434 17.2231C17.1703 17.5627 16.576 17.8492 15.9499 18.0827C16.2789 18.73 16.6609 19.3456 17.0854 19.9187C18.8152 19.388 20.5875 18.5815 22.4033 17.2549C22.8596 12.7341 21.6806 8.80747 19.3034 5.33716ZM8.5201 14.8459C7.48007 14.8459 6.63107 13.9014 6.63107 12.7447C6.63107 11.5879 7.45884 10.6434 8.5201 10.6434C9.57071 10.6434 10.4303 11.5879 10.4091 12.7447C10.4091 13.9014 9.57071 14.8459 8.5201 14.8459ZM15.4936 14.8459C14.4535 14.8459 13.6034 13.9014 13.6034 12.7447C13.6034 11.5879 14.4323 10.6434 15.4936 10.6434C16.5442 10.6434 17.4038 11.5879 17.3825 12.7447C17.3825 13.9014 16.5548 14.8459 15.4936 14.8459Z16:["$","footer",null,{"className":"bg-background border-t","children":["$","div",null,{"className":"mx-auto max-w-5xl px-8 py-10","children":[["$","div",null,{"className":"mb-8 grid grid-cols-1 gap-12 md:grid-cols-2","children":[["$","div",null,{"className":"max-w-sm md:col-span-1","children":[["$","div",null,{"className":"mb-4 flex items-center justify-start gap-2","children":[["$","$L40",null,{"src":"/opencut/logos/opencut/svg/logo.svg","alt":"OpenCut","width":24,"height":24,"className":"invert dark:invert-0"}],["$","span",null,{"className":"text-lg font-bold","children":"OpenCut"}]]}],["$","p",null,{"className":"text-muted-foreground mb-5 text-sm md:text-left","children":"The privacy-first video editor that feels simple to use."}],["$","div",null,{"className":"flex justify-start gap-3","children":[["$","$L3",null,{"href":"https://github.com/OpenCut-app/OpenCut","className":"text-muted-foreground hover:text-foreground transition-colors","target":"_blank","rel":"noopener noreferrer","children":["$","svg",null,{"stroke":"currentColor","fill":"currentColor","strokeWidth":"0","viewBox":"0 0 496 512","className":"size-5","children":["$undefined",[["$","path","0",{"d":"$41","children":[]}]]],"style":{},"height":"1em","width":"1em","xmlns":"http://www.w3.org/2000/svg"}]}],["$","$L3",null,{"href":"https://x.com/opencutapp","className":"text-muted-foreground hover:text-foreground transition-colors","target":"_blank","rel":"noopener noreferrer","children":["$","svg",null,{"stroke":"currentColor","fill":"currentColor","strokeWidth":"0","viewBox":"0 0 24 24","className":"size-5","children":["$undefined",[["$","path","0",{"d":"M10.4883 14.651L15.25 21H22.25L14.3917 10.5223L20.9308 3H18.2808L13.1643 8.88578L8.75 3H1.75L9.26086 13.0145L2.31915 21H4.96917L10.4883 14.651ZM16.25 19L5.75 5H7.75L18.25 19H16.25Z","children":[]}]]],"style":{},"height":"1em","width":"1em","xmlns":"http://www.w3.org/2000/svg"}]}],["$","$L3",null,{"href":"https://discord.com/invite/Mu3acKZvCp","className":"text-muted-foreground hover:text-foreground transition-colors","target":"_blank","rel":"noopener noreferrer","children":["$","svg",null,{"stroke":"currentColor","fill":"currentColor","strokeWidth":"0","viewBox":"0 0 24 24","className":"size-5","children":["$undefined",[["$","path","0",{"d":"$42","children":[]}]]],"style":{},"height":"1em","width":"1em","xmlns":"http://www.w3.org/2000/svg"}]}]]}]]}],"$L43"]}],"$L44"]}]}]
17:["$","script","script-0",{"src":"/opencut/_next/static/chunks/2f18e43b04fc1c1e.js","async":true}]
18:["$","script","script-1",{"src":"/opencut/_next/static/chunks/2a3fbaad9a8bf049.js","async":true}]
19:["$","script","script-2",{"src":"/opencut/_next/static/chunks/10c37fe99487cbf0.js","async":true}]
1a:["$","$L45",null,{"children":["$","$46",null,{"name":"Next.MetadataOutlet","children":"$@47"}]}]
1b:["$","li","System fonts (Arial, Helvetica, Times New Roman, and others) now appear in the font picker alongside Google Fonts.",{"className":"text-base leading-relaxed text-foreground","children":[["$","span","p-0",{"className":"m-0","node":{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"System fonts (Arial, Helvetica, Times New Roman, and others) now appear in the font picker alongside Google Fonts.","position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":115,"offset":114}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":115,"offset":114}}},"children":"System fonts (Arial, Helvetica, Times New Roman, and others) now appear in the font picker alongside Google Fonts."}]]}]
1c:["$","li","Your projects can disappear if your disk runs low on space. OpenCut now asks the browser to protect them.",{"className":"text-base leading-relaxed text-foreground","children":[["$","span","p-0",{"className":"m-0","node":{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Your projects can disappear if your disk runs low on space. OpenCut now asks the browser to protect them.","position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":106,"offset":105}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":106,"offset":105}}},"children":"Your projects can disappear if your disk runs low on space. OpenCut now asks the browser to protect them."}]]}]
1d:["$","li","The properties panel has been redesigned with a tabbed layout.",{"className":"text-base leading-relaxed text-foreground","children":[["$","span","p-0",{"className":"m-0","node":{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"The properties panel has been redesigned with a tabbed layout.","position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":63,"offset":62}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":63,"offset":62}}},"children":"The properties panel has been redesigned with a tabbed layout."}]]}]
1e:["$","li","Audio waveforms have gotten an upgrade. The old ones were inaccurate, prone to crashing, and not very useful. The new ones are RMS-based, properly scaled, and only render what's visible so they don't slow things down.",{"className":"text-base leading-relaxed text-foreground","children":[["$","span","p-0",{"className":"m-0","node":{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Audio waveforms have gotten an upgrade. The old ones were inaccurate, prone to crashing, and not very useful. The new ones are RMS-based, properly scaled, and only render what's visible so they don't slow things down.","position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":218,"offset":217}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":218,"offset":217}}},"children":"Audio waveforms have gotten an upgrade. The old ones were inaccurate, prone to crashing, and not very useful. The new ones are RMS-based, properly scaled, and only render what's visible so they don't slow things down."}]]}]
1f:["$","li","The timeline now opens scrolled to the bottom, so your main video track is visible right away instead of being hidden above the fold.",{"className":"text-base leading-relaxed text-foreground","children":[["$","span","p-0",{"className":"m-0","node":{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"The timeline now opens scrolled to the bottom, so your main video track is visible right away instead of being hidden above the fold.","position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":134,"offset":133}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":134,"offset":133}}},"children":"The timeline now opens scrolled to the bottom, so your main video track is visible right away instead of being hidden above the fold."}]]}]
20:["$","li","The settings panel has been redesigned with a cleaner layout and better organization.",{"className":"text-base leading-relaxed text-foreground","children":[["$","span","p-0",{"className":"m-0","node":{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"The settings panel has been redesigned with a cleaner layout and better organization.","position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":86,"offset":85}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":86,"offset":85}}},"children":"The settings panel has been redesigned with a cleaner layout and better organization."}]]}]
21:["$","li","You can now select multiple assets in the assets panel. Useful for deleting several at once.",{"className":"text-base leading-relaxed text-foreground","children":[["$","span","p-0",{"className":"m-0","node":{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"You can now select multiple assets in the assets panel. Useful for deleting several at once.","position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":93,"offset":92}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":93,"offset":92}}},"children":"You can now select multiple assets in the assets panel. Useful for deleting several at once."}]]}]
22:["$","li","If your browser doesn't support GPU-accelerated rendering, the editor now shows a notice explaining why and suggests switching to another browser.",{"className":"text-base leading-relaxed text-foreground","children":[["$","span","p-0",{"className":"m-0","node":{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"If your browser doesn't support GPU-accelerated rendering, the editor now shows a notice explaining why and suggests switching to another browser.","position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":147,"offset":146}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":147,"offset":146}}},"children":"If your browser doesn't support GPU-accelerated rendering, the editor now shows a notice explaining why and suggests switching to another browser."}]]}]
23:["$","li","Timeline vertical scroll now works anywhere in the panel, not just over the track labels. The header no longer scrolls with the tracks.",{"className":"text-base leading-relaxed text-foreground","children":[["$","span","p-0",{"className":"m-0","node":{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Timeline vertical scroll now works anywhere in the panel, not just over the track labels. The header no longer scrolls with the tracks.","position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":136,"offset":135}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":136,"offset":135}}},"children":"Timeline vertical scroll now works anywhere in the panel, not just over the track labels. The header no longer scrolls with the tracks."}]]}]
24:["$","li","MP4 exports with audio failed on Firefox. The export now completes successfully regardless of browser.",{"className":"text-base leading-relaxed text-foreground","children":[["$","span","p-0",{"className":"m-0","node":{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"MP4 exports with audio failed on Firefox. The export now completes successfully regardless of browser.","position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":103,"offset":102}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":103,"offset":102}}},"children":"MP4 exports with audio failed on Firefox. The export now completes successfully regardless of browser."}]]}]
25:["$","li","Snap guides in the preview panel didn't show when moving a full-canvas element to the center of the frame.",{"className":"text-base leading-relaxed text-foreground","children":[["$","span","p-0",{"className":"m-0","node":{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Snap guides in the preview panel didn't show when moving a full-canvas element to the center of the frame.","position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":107,"offset":106}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":107,"offset":106}}},"children":"Snap guides in the preview panel didn't show when moving a full-canvas element to the center of the frame."}]]}]
26:["$","li","The rotation handle could float above the editor UI when an element was near the top of the canvas. It now clips to the preview area.",{"className":"text-base leading-relaxed text-foreground","children":[["$","span","p-0",{"className":"m-0","node":{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"The rotation handle could float above the editor UI when an element was near the top of the canvas. It now clips to the preview area.","position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":134,"offset":133}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":134,"offset":133}}},"children":"The rotation handle could float above the editor UI when an element was near the top of the canvas. It now clips to the preview area."}]]}]
27:["$","li","Images with a blur effect at 0% intensity would disappear completely when a blurred background was also active. Now 0% blur correctly renders the image unchanged.",{"className":"text-base leading-relaxed text-foreground","children":[["$","span","p-0",{"className":"m-0","node":{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Images with a blur effect at 0% intensity would disappear completely when a blurred background was also active. Now 0% blur correctly renders the image unchanged.","position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":163,"offset":162}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":163,"offset":162}}},"children":"Images with a blur effect at 0% intensity would disappear completely when a blurred background was also active. Now 0% blur correctly renders the image unchanged."}]]}]
28:["$","li","Section titles in the properties panel showed the wrong text color when the section wasn't collapsible. Non-collapsible titles now use the correct muted style.",{"className":"text-base leading-relaxed text-foreground","children":[["$","span","p-0",{"className":"m-0","node":{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Section titles in the properties panel showed the wrong text color when the section wasn't collapsible. Non-collapsible titles now use the correct muted style.","position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":160,"offset":159}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":160,"offset":159}}},"children":"Section titles in the properties panel showed the wrong text color when the section wasn't collapsible. Non-collapsible titles now use the correct muted style."}]]}]
29:["$","li","Blur looked pixelated at higher intensities instead of producing a real blur. Both the canvas background blur and the blur effect are now fixed.",{"className":"text-base leading-relaxed text-foreground","children":[["$","span","p-0",{"className":"m-0","node":{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Blur looked pixelated at higher intensities instead of producing a real blur. Both the canvas background blur and the blur effect are now fixed.","position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":145,"offset":144}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":145,"offset":144}}},"children":"Blur looked pixelated at higher intensities instead of producing a real blur. Both the canvas background blur and the blur effect are now fixed."}]]}]
2a:["$","li","Auto-generated captions were sometimes inaccurate. The underlying issue has been fixed.",{"className":"text-base leading-relaxed text-foreground","children":[["$","span","p-0",{"className":"m-0","node":{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Auto-generated captions were sometimes inaccurate. The underlying issue has been fixed.","position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":88,"offset":87}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":88,"offset":87}}},"children":"Auto-generated captions were sometimes inaccurate. The underlying issue has been fixed."}]]}]
2b:["$","li","Text element handles no longer shift position as you type.",{"className":"text-base leading-relaxed text-foreground","children":[["$","span","p-0",{"className":"m-0","node":{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Text element handles no longer shift position as you type.","position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":59,"offset":58}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":59,"offset":58}}},"children":"Text element handles no longer shift position as you type."}]]}]
2c:["$","li","The rotation handle drifted further and further from the element as the canvas size got smaller. On a 100x100 project it was almost off-screen. The gap is now a fixed size regardless of canvas dimensions or zoom.",{"className":"text-base leading-relaxed text-foreground","children":[["$","span","p-0",{"className":"m-0","node":{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"The rotation handle drifted further and further from the element as the canvas size got smaller. On a 100x100 project it was almost off-screen. The gap is now a fixed size regardless of canvas dimensions or zoom.","position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":213,"offset":212}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":213,"offset":212}}},"children":"The rotation handle drifted further and further from the element as the canvas size got smaller. On a 100x100 project it was almost off-screen. The gap is now a fixed size regardless of canvas dimensions or zoom."}]]}]
2d:[["$","span","p-0",{"className":"m-0","node":{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Time is now represented as ","position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":28,"offset":27}}},{"type":"element","tagName":"code","properties":{},"children":[{"type":"text","value":"MediaTime","position":{"start":{"line":1,"column":28,"offset":27},"end":{"line":1,"column":39,"offset":38}}}],"position":{"start":{"line":1,"column":28,"offset":27},"end":{"line":1,"column":39,"offset":38}}},{"type":"text","value":", an integer tick count at 120,000 ticks per second, defined in ","position":{"start":{"line":1,"column":39,"offset":38},"end":{"line":1,"column":103,"offset":102}}},{"type":"element","tagName":"code","properties":{},"children":[{"type":"text","value":"rust/crates/time","position":{"start":{"line":1,"column":103,"offset":102},"end":{"line":1,"column":121,"offset":120}}}],"position":{"start":{"line":1,"column":103,"offset":102},"end":{"line":1,"column":121,"offset":120}}},{"type":"text","value":". Previously, floating-point seconds were used throughout, which accumulated rounding errors and made frame alignment imprecise. 120,000 was chosen because it divides evenly by every standard frame rate denominator, including drop-frame rates: 23.976 maps to 5,005 ticks/frame, 29.97 to 4,004, 30 to 4,000. ","position":{"start":{"line":1,"column":121,"offset":120},"end":{"line":1,"column":428,"offset":427}}},{"type":"element","tagName":"code","properties":{},"children":[{"type":"text","value":"FrameRate","position":{"start":{"line":1,"column":428,"offset":427},"end":{"line":1,"column":439,"offset":438}}}],"position":{"start":{"line":1,"column":428,"offset":427},"end":{"line":1,"column":439,"offset":438}}},{"type":"text","value":" is a rational ","position":{"start":{"line":1,"column":439,"offset":438},"end":{"line":1,"column":454,"offset":453}}},{"type":"element","tagName":"code","properties":{},"children":[{"type":"text","value":"{numerator, denominator}","position":{"start":{"line":1,"column":454,"offset":453},"end":{"line":1,"column":480,"offset":479}}}],"position":{"start":{"line":1,"column":454,"offset":453},"end":{"line":1,"column":480,"offset":479}}},{"type":"text","value":" type rather than a float. All time arithmetic, frame snapping, and timecode formatting are implemented in Rust and exposed via WASM.","position":{"start":{"line":1,"column":480,"offset":479},"end":{"line":1,"column":613,"offset":612}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":613,"offset":612}}},"children":["Time is now represented as ",["$","code","code-0",{"className":"rounded border border-destructive/20 bg-destructive/5 px-1.5 py-0.5 font-mono text-[0.85em] text-red-700 dark:text-red-300","node":"$2d:0:props:node:children:1","children":"MediaTime"}],", an integer tick count at 120,000 ticks per second, defined in ",["$","code","code-1",{"className":"rounded border border-destructive/20 bg-destructive/5 px-1.5 py-0.5 font-mono text-[0.85em] text-red-700 dark:text-red-300","node":"$2d:0:props:node:children:3","children":"rust/crates/time"}],". Previously, floating-point seconds were used throughout, which accumulated rounding errors and made frame alignment imprecise. 120,000 was chosen because it divides evenly by every standard frame rate denominator, including drop-frame rates: 23.976 maps to 5,005 ticks/frame, 29.97 to 4,004, 30 to 4,000. ",["$","code","code-2",{"className":"rounded border border-destructive/20 bg-destructive/5 px-1.5 py-0.5 font-mono text-[0.85em] text-red-700 dark:text-red-300","node":"$2d:0:props:node:children:5","children":"FrameRate"}]," is a rational ",["$","code","code-3",{"className":"rounded border border-destructive/20 bg-destructive/5 px-1.5 py-0.5 font-mono text-[0.85em] text-red-700 dark:text-red-300","node":"$2d:0:props:node:children:7","children":"{numerator, denominator}"}]," type rather than a float. All time arithmetic, frame snapping, and timecode formatting are implemented in Rust and exposed via WASM."]}]]
2e:["$","li","Track ordering is now enforced at the type level. `SceneTracks` replaces a flat track array with three explicit fields: `overlay`, `main` (a singleton `VideoTrack`), and `audio`. The type makes it structurally impossible to mix track kinds or misplace a track.",{"className":"text-base leading-relaxed text-foreground","children":[["$","span","p-0",{"className":"m-0","node":{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Track ordering is now enforced at the type level. ","position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":51,"offset":50}}},{"type":"element","tagName":"code","properties":{},"children":[{"type":"text","value":"SceneTracks","position":{"start":{"line":1,"column":51,"offset":50},"end":{"line":1,"column":64,"offset":63}}}],"position":{"start":{"line":1,"column":51,"offset":50},"end":{"line":1,"column":64,"offset":63}}},{"type":"text","value":" replaces a flat track array with three explicit fields: ","position":{"start":{"line":1,"column":64,"offset":63},"end":{"line":1,"column":121,"offset":120}}},{"type":"element","tagName":"code","properties":{},"children":[{"type":"text","value":"overlay","position":{"start":{"line":1,"column":121,"offset":120},"end":{"line":1,"column":130,"offset":129}}}],"position":{"start":{"line":1,"column":121,"offset":120},"end":{"line":1,"column":130,"offset":129}}},{"type":"text","value":", ","position":{"start":{"line":1,"column":130,"offset":129},"end":{"line":1,"column":132,"offset":131}}},{"type":"element","tagName":"code","properties":{},"children":[{"type":"text","value":"main","position":{"start":{"line":1,"column":132,"offset":131},"end":{"line":1,"column":138,"offset":137}}}],"position":{"start":{"line":1,"column":132,"offset":131},"end":{"line":1,"column":138,"offset":137}}},{"type":"text","value":" (a singleton ","position":{"start":{"line":1,"column":138,"offset":137},"end":{"line":1,"column":152,"offset":151}}},{"type":"element","tagName":"code","properties":{},"children":[{"type":"text","value":"VideoTrack","position":{"start":{"line":1,"column":152,"offset":151},"end":{"line":1,"column":164,"offset":163}}}],"position":{"start":{"line":1,"column":152,"offset":151},"end":{"line":1,"column":164,"offset":163}}},{"type":"text","value":"), and ","position":{"start":{"line":1,"column":164,"offset":163},"end":{"line":1,"column":171,"offset":170}}},{"type":"element","tagName":"code","properties":{},"children":[{"type":"text","value":"audio","position":{"start":{"line":1,"column":171,"offset":170},"end":{"line":1,"column":178,"offset":177}}}],"position":{"start":{"line":1,"column":171,"offset":170},"end":{"line":1,"column":178,"offset":177}}},{"type":"text","value":". The type makes it structurally impossible to mix track kinds or misplace a track.","position":{"start":{"line":1,"column":178,"offset":177},"end":{"line":1,"column":261,"offset":260}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":261,"offset":260}}},"children":["Track ordering is now enforced at the type level. ",["$","code","code-0",{"className":"rounded border border-destructive/20 bg-destructive/5 px-1.5 py-0.5 font-mono text-[0.85em] text-red-700 dark:text-red-300","node":"$2e:props:children:0:props:node:children:1","children":"SceneTracks"}]," replaces a flat track array with three explicit fields: ",["$","code","code-1",{"className":"rounded border border-destructive/20 bg-destructive/5 px-1.5 py-0.5 font-mono text-[0.85em] text-red-700 dark:text-red-300","node":"$2e:props:children:0:props:node:children:3","children":"overlay"}],", ",["$","code","code-2",{"className":"rounded border border-destructive/20 bg-destructive/5 px-1.5 py-0.5 font-mono text-[0.85em] text-red-700 dark:text-red-300","node":"$2e:props:children:0:props:node:children:5","children":"main"}]," (a singleton ",["$","code","code-3",{"className":"rounded border border-destructive/20 bg-destructive/5 px-1.5 py-0.5 font-mono text-[0.85em] text-red-700 dark:text-red-300","node":"$2e:props:children:0:props:node:children:7","children":"VideoTrack"}],"), and ",["$","code","code-4",{"className":"rounded border border-destructive/20 bg-destructive/5 px-1.5 py-0.5 font-mono text-[0.85em] text-red-700 dark:text-red-300","node":"$2e:props:children:0:props:node:children:9","children":"audio"}],". The type makes it structurally impossible to mix track kinds or misplace a track."]}]]}]
2f:["$","li","The WebGL renderer has been replaced with a Rust/wgpu compositor compiled to WASM. The `rust/` crate tree covers compositing (`rust/crates/compositor`), effects (`rust/crates/effects`), masks with JFA-based feathering (`rust/crates/masks`), GPU context (`rust/crates/gpu`), and time (`rust/crates/time`). WASM bindings live in `rust/wasm/` and are consumed from TypeScript through `src/lib/wasm/`. The old GLSL shaders and WebGL utilities are gone.",{"className":"text-base leading-relaxed text-foreground","children":[["$","span","p-0",{"className":"m-0","node":{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"The WebGL renderer has been replaced with a Rust/wgpu compositor compiled to WASM. The ","position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":88,"offset":87}}},{"type":"element","tagName":"code","properties":{},"children":[{"type":"text","value":"rust/","position":{"start":{"line":1,"column":88,"offset":87},"end":{"line":1,"column":95,"offset":94}}}],"position":{"start":{"line":1,"column":88,"offset":87},"end":{"line":1,"column":95,"offset":94}}},{"type":"text","value":" crate tree covers compositing (","position":{"start":{"line":1,"column":95,"offset":94},"end":{"line":1,"column":127,"offset":126}}},{"type":"element","tagName":"code","properties":{},"children":[{"type":"text","value":"rust/crates/compositor","position":{"start":{"line":1,"column":127,"offset":126},"end":{"line":1,"column":151,"offset":150}}}],"position":{"start":{"line":1,"column":127,"offset":126},"end":{"line":1,"column":151,"offset":150}}},{"type":"text","value":"), effects (","position":{"start":{"line":1,"column":151,"offset":150},"end":{"line":1,"column":163,"offset":162}}},{"type":"element","tagName":"code","properties":{},"children":[{"type":"text","value":"rust/crates/effects","position":{"start":{"line":1,"column":163,"offset":162},"end":{"line":1,"column":184,"offset":183}}}],"position":{"start":{"line":1,"column":163,"offset":162},"end":{"line":1,"column":184,"offset":183}}},{"type":"text","value":"), masks with JFA-based feathering (","position":{"start":{"line":1,"column":184,"offset":183},"end":{"line":1,"column":220,"offset":219}}},{"type":"element","tagName":"code","properties":{},"children":[{"type":"text","value":"rust/crates/masks","position":{"start":{"line":1,"column":220,"offset":219},"end":{"line":1,"column":239,"offset":238}}}],"position":{"start":{"line":1,"column":220,"offset":219},"end":{"line":1,"column":239,"offset":238}}},{"type":"text","value":"), GPU context (","position":{"start":{"line":1,"column":239,"offset":238},"end":{"line":1,"column":255,"offset":254}}},{"type":"element","tagName":"code","properties":{},"children":[{"type":"text","value":"rust/crates/gpu","position":{"start":{"line":1,"column":255,"offset":254},"end":{"line":1,"column":272,"offset":271}}}],"position":{"start":{"line":1,"column":255,"offset":254},"end":{"line":1,"column":272,"offset":271}}},{"type":"text","value":"), and time (","position":{"start":{"line":1,"column":272,"offset":271},"end":{"line":1,"column":285,"offset":284}}},{"type":"element","tagName":"code","properties":{},"children":[{"type":"text","value":"rust/crates/time","position":{"start":{"line":1,"column":285,"offset":284},"end":{"line":1,"column":303,"offset":302}}}],"position":{"start":{"line":1,"column":285,"offset":284},"end":{"line":1,"column":303,"offset":302}}},{"type":"text","value":"). WASM bindings live in ","position":{"start":{"line":1,"column":303,"offset":302},"end":{"line":1,"column":328,"offset":327}}},{"type":"element","tagName":"code","properties":{},"children":[{"type":"text","value":"rust/wasm/","position":{"start":{"line":1,"column":328,"offset":327},"end":{"line":1,"column":340,"offset":339}}}],"position":{"start":{"line":1,"column":328,"offset":327},"end":{"line":1,"column":340,"offset":339}}},{"type":"text","value":" and are consumed from TypeScript through ","position":{"start":{"line":1,"column":340,"offset":339},"end":{"line":1,"column":382,"offset":381}}},{"type":"element","tagName":"code","properties":{},"children":[{"type":"text","value":"src/lib/wasm/","position":{"start":{"line":1,"column":382,"offset":381},"end":{"line":1,"column":397,"offset":396}}}],"position":{"start":{"line":1,"column":382,"offset":381},"end":{"line":1,"column":397,"offset":396}}},{"type":"text","value":". The old GLSL shaders and WebGL utilities are gone.","position":{"start":{"line":1,"column":397,"offset":396},"end":{"line":1,"column":449,"offset":448}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":449,"offset":448}}},"children":["The WebGL renderer has been replaced with a Rust/wgpu compositor compiled to WASM. The ",["$","code","code-0",{"className":"rounded border border-destructive/20 bg-destructive/5 px-1.5 py-0.5 font-mono text-[0.85em] text-red-700 dark:text-red-300","node":"$2f:props:children:0:props:node:children:1","children":"rust/"}]," crate tree covers compositing (",["$","code","code-1",{"className":"rounded border border-destructive/20 bg-destructive/5 px-1.5 py-0.5 font-mono text-[0.85em] text-red-700 dark:text-red-300","node":"$2f:props:children:0:props:node:children:3","children":"rust/crates/compositor"}],"), effects (","$L48","), masks with JFA-based feathering (","$L49","), GPU context (","$L4a","), and time (","$L4b","). WASM bindings live in ","$L4c"," and are consumed from TypeScript through ","$L4d",". The old GLSL shaders and WebGL utilities are gone."]}]]}]
30:["$","li","`src/types/` and `src/constants/` have been dissolved. All types and constants now live alongside the code that owns them inside `src/lib/`. The `packages/env` and `packages/ui` internal packages were also folded into the web app, with icons at `src/components/icons/` and env at `src/lib/env/`.",{"className":"text-base leading-relaxed text-foreground","children":[["$","span","p-0",{"className":"m-0","node":{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"code","properties":{},"children":[{"type":"text","value":"src/types/","position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":13,"offset":12}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":13,"offset":12}}},{"type":"text","value":" and ","position":{"start":{"line":1,"column":13,"offset":12},"end":{"line":1,"column":18,"offset":17}}},{"type":"element","tagName":"code","properties":{},"children":[{"type":"text","value":"src/constants/","position":{"start":{"line":1,"column":18,"offset":17},"end":{"line":1,"column":34,"offset":33}}}],"position":{"start":{"line":1,"column":18,"offset":17},"end":{"line":1,"column":34,"offset":33}}},{"type":"text","value":" have been dissolved. All types and constants now live alongside the code that owns them inside ","position":{"start":{"line":1,"column":34,"offset":33},"end":{"line":1,"column":130,"offset":129}}},{"type":"element","tagName":"code","properties":{},"children":[{"type":"text","value":"src/lib/","position":{"start":{"line":1,"column":130,"offset":129},"end":{"line":1,"column":140,"offset":139}}}],"position":{"start":{"line":1,"column":130,"offset":129},"end":{"line":1,"column":140,"offset":139}}},{"type":"text","value":". The ","position":{"start":{"line":1,"column":140,"offset":139},"end":{"line":1,"column":146,"offset":145}}},{"type":"element","tagName":"code","properties":{},"children":[{"type":"text","value":"packages/env","position":{"start":{"line":1,"column":146,"offset":145},"end":{"line":1,"column":160,"offset":159}}}],"position":{"start":{"line":1,"column":146,"offset":145},"end":{"line":1,"column":160,"offset":159}}},{"type":"text","value":" and ","position":{"start":{"line":1,"column":160,"offset":159},"end":{"line":1,"column":165,"offset":164}}},{"type":"element","tagName":"code","properties":{},"children":[{"type":"text","value":"packages/ui","position":{"start":{"line":1,"column":165,"offset":164},"end":{"line":1,"column":178,"offset":177}}}],"position":{"start":{"line":1,"column":165,"offset":164},"end":{"line":1,"column":178,"offset":177}}},{"type":"text","value":" internal packages were also folded into the web app, with icons at ","position":{"start":{"line":1,"column":178,"offset":177},"end":{"line":1,"column":246,"offset":245}}},{"type":"element","tagName":"code","properties":{},"children":[{"type":"text","value":"src/components/icons/","position":{"start":{"line":1,"column":246,"offset":245},"end":{"line":1,"column":269,"offset":268}}}],"position":{"start":{"line":1,"column":246,"offset":245},"end":{"line":1,"column":269,"offset":268}}},{"type":"text","value":" and env at ","position":{"start":{"line":1,"column":269,"offset":268},"end":{"line":1,"column":281,"offset":280}}},{"type":"element","tagName":"code","properties":{},"children":[{"type":"text","value":"src/lib/env/","position":{"start":{"line":1,"column":281,"offset":280},"end":{"line":1,"column":295,"offset":294}}}],"position":{"start":{"line":1,"column":281,"offset":280},"end":{"line":1,"column":295,"offset":294}}},{"type":"text","value":".","position":{"start":{"line":1,"column":295,"offset":294},"end":{"line":1,"column":296,"offset":295}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":296,"offset":295}}},"children":[["$","code","code-0",{"className":"rounded border border-destructive/20 bg-destructive/5 px-1.5 py-0.5 font-mono text-[0.85em] text-red-700 dark:text-red-300","node":"$30:props:children:0:props:node:children:0","children":"src/types/"}]," and ",["$","code","code-1",{"className":"rounded border border-destructive/20 bg-destructive/5 px-1.5 py-0.5 font-mono text-[0.85em] text-red-700 dark:text-red-300","node":"$30:props:children:0:props:node:children:2","children":"src/constants/"}]," have been dissolved. All types and constants now live alongside the code that owns them inside ",["$","code","code-2",{"className":"rounded border border-destructive/20 bg-destructive/5 px-1.5 py-0.5 font-mono text-[0.85em] text-red-700 dark:text-red-300","node":"$30:props:children:0:props:node:children:4","children":"src/lib/"}],". The ",["$","code","code-3",{"className":"rounded border border-destructive/20 bg-destructive/5 px-1.5 py-0.5 font-mono text-[0.85em] text-red-700 dark:text-red-300","node":"$30:props:children:0:props:node:children:6","children":"packages/env"}]," and ",["$","code","code-4",{"className":"rounded border border-destructive/20 bg-destructive/5 px-1.5 py-0.5 font-mono text-[0.85em] text-red-700 dark:text-red-300","node":"$30:props:children:0:props:node:children:8","children":"packages/ui"}]," internal packages were also folded into the web app, with icons at ","$L4e"," and env at ","$L4f","."]}]]}]
31:["$","li","The web app can now deploy to Cloudflare Workers via OpenNext. `wrangler.jsonc` and `apps/web/open-next.config.ts` are included for anyone self-hosting.",{"className":"text-base leading-relaxed text-foreground","children":[["$","span","p-0",{"className":"m-0","node":{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"The web app can now deploy to Cloudflare Workers via OpenNext. ","position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":64,"offset":63}}},{"type":"element","tagName":"code","properties":{},"children":[{"type":"text","value":"wrangler.jsonc","position":{"start":{"line":1,"column":64,"offset":63},"end":{"line":1,"column":80,"offset":79}}}],"position":{"start":{"line":1,"column":64,"offset":63},"end":{"line":1,"column":80,"offset":79}}},{"type":"text","value":" and ","position":{"start":{"line":1,"column":80,"offset":79},"end":{"line":1,"column":85,"offset":84}}},{"type":"element","tagName":"code","properties":{},"children":[{"type":"text","value":"apps/web/open-next.config.ts","position":{"start":{"line":1,"column":85,"offset":84},"end":{"line":1,"column":115,"offset":114}}}],"position":{"start":{"line":1,"column":85,"offset":84},"end":{"line":1,"column":115,"offset":114}}},{"type":"text","value":" are included for anyone self-hosting.","position":{"start":{"line":1,"column":115,"offset":114},"end":{"line":1,"column":153,"offset":152}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":153,"offset":152}}},"children":["The web app can now deploy to Cloudflare Workers via OpenNext. ",["$","code","code-0",{"className":"rounded border border-destructive/20 bg-destructive/5 px-1.5 py-0.5 font-mono text-[0.85em] text-red-700 dark:text-red-300","node":"$31:props:children:0:props:node:children:1","children":"wrangler.jsonc"}]," and ",["$","code","code-1",{"className":"rounded border border-destructive/20 bg-destructive/5 px-1.5 py-0.5 font-mono text-[0.85em] text-red-700 dark:text-red-300","node":"$31:props:children:0:props:node:children:3","children":"apps/web/open-next.config.ts"}]," are included for anyone self-hosting."]}]]}]
32:["$","li","`apps/desktop/` is a new GPUI + Rust app. It is early: there is a `main.rs` and a working build setup, but no features yet.",{"className":"text-base leading-relaxed text-foreground","children":[["$","span","p-0",{"className":"m-0","node":{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"code","properties":{},"children":[{"type":"text","value":"apps/desktop/","position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":16,"offset":15}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":16,"offset":15}}},{"type":"text","value":" is a new GPUI + Rust app. It is early: there is a ","position":{"start":{"line":1,"column":16,"offset":15},"end":{"line":1,"column":67,"offset":66}}},{"type":"element","tagName":"code","properties":{},"children":[{"type":"text","value":"main.rs","position":{"start":{"line":1,"column":67,"offset":66},"end":{"line":1,"column":76,"offset":75}}}],"position":{"start":{"line":1,"column":67,"offset":66},"end":{"line":1,"column":76,"offset":75}}},{"type":"text","value":" and a working build setup, but no features yet.","position":{"start":{"line":1,"column":76,"offset":75},"end":{"line":1,"column":124,"offset":123}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":124,"offset":123}}},"children":[["$","code","code-0",{"className":"rounded border border-destructive/20 bg-destructive/5 px-1.5 py-0.5 font-mono text-[0.85em] text-red-700 dark:text-red-300","node":"$32:props:children:0:props:node:children:0","children":"apps/desktop/"}]," is a new GPUI + Rust app. It is early: there is a ",["$","code","code-1",{"className":"rounded border border-destructive/20 bg-destructive/5 px-1.5 py-0.5 font-mono text-[0.85em] text-red-700 dark:text-red-300","node":"$32:props:children:0:props:node:children:2","children":"main.rs"}]," and a working build setup, but no features yet."]}]]}]
33:["$","li","16 new storage migration steps were added (v9 through v25), covering the schema changes accumulated during this release cycle.",{"className":"text-base leading-relaxed text-foreground","children":[["$","span","p-0",{"className":"m-0","node":{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"16 new storage migration steps were added (v9 through v25), covering the schema changes accumulated during this release cycle.","position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":127,"offset":126}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":127,"offset":126}}},"children":"16 new storage migration steps were added (v9 through v25), covering the schema changes accumulated during this release cycle."}]]}]
35:["$","li","Selection outline in the preview is now dashed.",{"className":"text-base leading-relaxed text-foreground","children":[["$","span","p-0",{"className":"m-0","node":{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Selection outline in the preview is now dashed.","position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":48,"offset":47}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":48,"offset":47}}},"children":"Selection outline in the preview is now dashed."}]]}]
36:["$","li","Clips sitting next to each other on the timeline now have a small gap between them so selected clips are always clearly visible.",{"className":"text-base leading-relaxed text-foreground","children":[["$","span","p-0",{"className":"m-0","node":{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Clips sitting next to each other on the timeline now have a small gap between them so selected clips are always clearly visible.","position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":129,"offset":128}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":129,"offset":128}}},"children":"Clips sitting next to each other on the timeline now have a small gap between them so selected clips are always clearly visible."}]]}]
37:["$","li","Press Escape to deselect the current element.",{"className":"text-base leading-relaxed text-foreground","children":[["$","span","p-0",{"className":"m-0","node":{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Press Escape to deselect the current element.","position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":46,"offset":45}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":46,"offset":45}}},"children":"Press Escape to deselect the current element."}]]}]
38:["$","div","fixed",{"className":"flex flex-col gap-1.5","children":[["$","h3",null,{"className":"text-base font-semibold text-foreground","children":["Fixes",":"]}],["$","ul",null,{"className":"list-disc space-y-1.5 pl-5","children":[["$","li","Fixed an issue where click-and-drag selection on one timeline track could accidentally select items from the track below.",{"className":"text-base leading-relaxed text-foreground","children":[["$","span","p-0",{"className":"m-0","node":{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Fixed an issue where click-and-drag selection on one timeline track could accidentally select items from the track below.","position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":122,"offset":121}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":122,"offset":121}}},"children":"Fixed an issue where click-and-drag selection on one timeline track could accidentally select items from the track below."}]]}],["$","li","Audio could flicker or cut out at the start of playback when certain elements were selected. The scheduler now recovers from timing slips without losing audio.",{"className":"text-base leading-relaxed text-foreground","children":[["$","span","p-0",{"className":"m-0","node":{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Audio could flicker or cut out at the start of playback when certain elements were selected. The scheduler now recovers from timing slips without losing audio.","position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":160,"offset":159}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":160,"offset":159}}},"children":"Audio could flicker or cut out at the start of playback when certain elements were selected. The scheduler now recovers from timing slips without losing audio."}]]}],["$","li","Dragging a clip onto the timeline and pressing Ctrl+Z now removes both the clip and the track it created in one step, instead of requiring two undos.",{"className":"text-base leading-relaxed text-foreground","children":[["$","span","p-0",{"className":"m-0","node":{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Dragging a clip onto the timeline and pressing Ctrl+Z now removes both the clip and the track it created in one step, instead of requiring two undos.","position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":150,"offset":149}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":150,"offset":149}}},"children":"Dragging a clip onto the timeline and pressing Ctrl+Z now removes both the clip and the track it created in one step, instead of requiring two undos."}]]}],["$","li","A few values in the properties panel were previously showing incorrect values. This has been fixed.",{"className":"text-base leading-relaxed text-foreground","children":[["$","span","p-0",{"className":"m-0","node":{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"A few values in the properties panel were previously showing incorrect values. This has been fixed.","position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":100,"offset":99}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":100,"offset":99}}},"children":"A few values in the properties panel were previously showing incorrect values. This has been fixed."}]]}],["$","li","Timeline trim handles now sit outside the clip instead of inside them, so the clip's visible area accurately represents where it starts and ends.",{"className":"text-base leading-relaxed text-foreground","children":[["$","span","p-0",{"className":"m-0","node":{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Timeline trim handles now sit outside the clip instead of inside them, so the clip's visible area accurately represents where it starts and ends.","position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":146,"offset":145}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":146,"offset":145}}},"children":"Timeline trim handles now sit outside the clip instead of inside them, so the clip's visible area accurately represents where it starts and ends."}]]}],"$L50","$L51","$L52","$L53","$L54","$L55"]}]]}]
39:["$","$L34",null,{"className":"my-10 sm:ml-1.5"}]
3a:["$","li","Move, scale, and rotate elements directly in the preview panel.",{"className":"text-base leading-relaxed text-foreground","children":[["$","span","p-0",{"className":"m-0","node":{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Move, scale, and rotate elements directly in the preview panel.","position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":64,"offset":63}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":64,"offset":63}}},"children":"Move, scale, and rotate elements directly in the preview panel."}]]}]
3b:["$","li","Blend modes (Multiply, Screen, Overlay, etc). Only available on text elements for now.",{"className":"text-base leading-relaxed text-foreground","children":[["$","span","p-0",{"className":"m-0","node":{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Blend modes (Multiply, Screen, Overlay, etc). Only available on text elements for now.","position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":87,"offset":86}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":87,"offset":86}}},"children":"Blend modes (Multiply, Screen, Overlay, etc). Only available on text elements for now."}]]}]
3c:["$","li","Paste images, videos, or audio from your clipboard straight into the editor.",{"className":"text-base leading-relaxed text-foreground","children":[["$","span","p-0",{"className":"m-0","node":{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Paste images, videos, or audio from your clipboard straight into the editor.","position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":77,"offset":76}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":77,"offset":76}}},"children":"Paste images, videos, or audio from your clipboard straight into the editor."}]]}]
3d:["$","li","Hold Shift while moving or resizing to temporarily turn off snapping.",{"className":"text-base leading-relaxed text-foreground","children":[["$","span","p-0",{"className":"m-0","node":{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Hold Shift while moving or resizing to temporarily turn off snapping.","position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":70,"offset":69}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":70,"offset":69}}},"children":"Hold Shift while moving or resizing to temporarily turn off snapping."}]]}]
3e:["$","div","improved",{"className":"flex flex-col gap-1.5","children":[["$","h3",null,{"className":"text-base font-semibold text-foreground","children":["Improvements",":"]}],["$","ul",null,{"className":"list-disc space-y-1.5 pl-5","children":[["$","li","Expanded font selection from 7 to over 1,000.",{"className":"text-base leading-relaxed text-foreground","children":[["$","span","p-0",{"className":"m-0","node":{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Expanded font selection from 7 to over 1,000.","position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":46,"offset":45}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":46,"offset":45}}},"children":"Expanded font selection from 7 to over 1,000."}]]}],["$","li","Fonts load much faster.",{"className":"text-base leading-relaxed text-foreground","children":[["$","span","p-0",{"className":"m-0","node":{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Fonts load much faster.","position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":24,"offset":23}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":24,"offset":23}}},"children":"Fonts load much faster."}]]}],["$","li","All asset panel tabs now share a consistent layout.",{"className":"text-base leading-relaxed text-foreground","children":[["$","span","p-0",{"className":"m-0","node":{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"All asset panel tabs now share a consistent layout.","position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":52,"offset":51}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":52,"offset":51}}},"children":"All asset panel tabs now share a consistent layout."}]]}],["$","li","Text rendering properly supports multiple lines, line height, and letter spacing.",{"className":"text-base leading-relaxed text-foreground","children":[["$","span","p-0",{"className":"m-0","node":{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Text rendering properly supports multiple lines, line height, and letter spacing.","position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":82,"offset":81}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":82,"offset":81}}},"children":"Text rendering properly supports multiple lines, line height, and letter spacing."}]]}],["$","li","Better contrast in the dark theme.",{"className":"text-base leading-relaxed text-foreground","children":[["$","span","p-0",{"className":"m-0","node":{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Better contrast in the dark theme.","position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":35,"offset":34}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":35,"offset":34}}},"children":"Better contrast in the dark theme."}]]}]]}]]}]
3f:["$","div","fixed",{"className":"flex flex-col gap-1.5","children":[["$","h3",null,{"className":"text-base font-semibold text-foreground","children":["Fixes",":"]}],["$","ul",null,{"className":"list-disc space-y-1.5 pl-5","children":[["$","li","Fixed undo/redo for drag-and-drop so dropped items are reliably undoable.",{"className":"text-base leading-relaxed text-foreground","children":[["$","span","p-0",{"className":"m-0","node":{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Fixed undo/redo for drag-and-drop so dropped items are reliably undoable.","position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":74,"offset":73}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":74,"offset":73}}},"children":"Fixed undo/redo for drag-and-drop so dropped items are reliably undoable."}]]}]]}]]}]
43:["$","div",null,{"className":"flex items-start justify-start gap-12 py-2","children":[["$","div","resources",{"className":"flex flex-col gap-2","children":[["$","h3",null,{"className":"text-foreground font-semibold","children":"Resources"}],["$","ul",null,{"className":"space-y-2 text-sm","children":[["$","li","/roadmap",{"children":["$","$L3",null,{"href":"/roadmap","className":"text-muted-foreground hover:text-foreground transition-colors","children":"Roadmap"}]}],["$","li","/changelog",{"children":["$","$L3",null,{"href":"/changelog","className":"text-muted-foreground hover:text-foreground transition-colors","children":"Changelog"}]}],["$","li","/privacy",{"children":["$","$L3",null,{"href":"/privacy","className":"text-muted-foreground hover:text-foreground transition-colors","children":"Privacy"}]}],["$","li","/terms",{"children":["$","$L3",null,{"href":"/terms","className":"text-muted-foreground hover:text-foreground transition-colors","children":"Terms of use"}]}]]}]]}],["$","div","company",{"className":"flex flex-col gap-2","children":[["$","h3",null,{"className":"text-foreground font-semibold","children":"Company"}],["$","ul",null,{"className":"space-y-2 text-sm","children":[["$","li","/sponsors",{"children":["$","$L3",null,{"href":"/sponsors","className":"text-muted-foreground hover:text-foreground transition-colors","children":"Sponsors"}]}],["$","li","/brand",{"children":["$","$L3",null,{"href":"/brand","className":"text-muted-foreground hover:text-foreground transition-colors","children":"Brand"}]}],["$","li","https://github.com/OpenCut-app/OpenCut/blob/main/README.md",{"children":["$","$L3",null,{"href":"https://github.com/OpenCut-app/OpenCut/blob/main/README.md","className":"text-muted-foreground hover:text-foreground transition-colors","target":"_blank","rel":"noopener noreferrer","children":"About"}]}]]}]]}]]}]
44:["$","div",null,{"className":"flex flex-col items-start justify-between gap-4 pt-2 md:flex-row","children":["$","div",null,{"className":"text-muted-foreground flex items-center gap-4 text-sm","children":["$","span",null,{"children":["© ",2026," OpenCut, All Rights Reserved"]}]}]}]
47:null
48:["$","code","code-2",{"className":"rounded border border-destructive/20 bg-destructive/5 px-1.5 py-0.5 font-mono text-[0.85em] text-red-700 dark:text-red-300","node":"$2f:props:children:0:props:node:children:5","children":"rust/crates/effects"}]
49:["$","code","code-3",{"className":"rounded border border-destructive/20 bg-destructive/5 px-1.5 py-0.5 font-mono text-[0.85em] text-red-700 dark:text-red-300","node":"$2f:props:children:0:props:node:children:7","children":"rust/crates/masks"}]
4a:["$","code","code-4",{"className":"rounded border border-destructive/20 bg-destructive/5 px-1.5 py-0.5 font-mono text-[0.85em] text-red-700 dark:text-red-300","node":"$2f:props:children:0:props:node:children:9","children":"rust/crates/gpu"}]
4b:["$","code","code-5",{"className":"rounded border border-destructive/20 bg-destructive/5 px-1.5 py-0.5 font-mono text-[0.85em] text-red-700 dark:text-red-300","node":"$2f:props:children:0:props:node:children:11","children":"rust/crates/time"}]
4c:["$","code","code-6",{"className":"rounded border border-destructive/20 bg-destructive/5 px-1.5 py-0.5 font-mono text-[0.85em] text-red-700 dark:text-red-300","node":"$2f:props:children:0:props:node:children:13","children":"rust/wasm/"}]
4d:["$","code","code-7",{"className":"rounded border border-destructive/20 bg-destructive/5 px-1.5 py-0.5 font-mono text-[0.85em] text-red-700 dark:text-red-300","node":"$2f:props:children:0:props:node:children:15","children":"src/lib/wasm/"}]
4e:["$","code","code-5",{"className":"rounded border border-destructive/20 bg-destructive/5 px-1.5 py-0.5 font-mono text-[0.85em] text-red-700 dark:text-red-300","node":"$30:props:children:0:props:node:children:10","children":"src/components/icons/"}]
4f:["$","code","code-6",{"className":"rounded border border-destructive/20 bg-destructive/5 px-1.5 py-0.5 font-mono text-[0.85em] text-red-700 dark:text-red-300","node":"$30:props:children:0:props:node:children:12","children":"src/lib/env/"}]
50:["$","li","Clips being dragged on the timeline now render on top of other clips instead of underneath them.",{"className":"text-base leading-relaxed text-foreground","children":[["$","span","p-0",{"className":"m-0","node":{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Clips being dragged on the timeline now render on top of other clips instead of underneath them.","position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":97,"offset":96}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":97,"offset":96}}},"children":"Clips being dragged on the timeline now render on top of other clips instead of underneath them."}]]}]
51:["$","li","Undoing a trim-from-start operation now correctly restores the clip to its original position and length, instead of stretching it to the right.",{"className":"text-base leading-relaxed text-foreground","children":[["$","span","p-0",{"className":"m-0","node":{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Undoing a trim-from-start operation now correctly restores the clip to its original position and length, instead of stretching it to the right.","position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":144,"offset":143}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":144,"offset":143}}},"children":"Undoing a trim-from-start operation now correctly restores the clip to its original position and length, instead of stretching it to the right."}]]}]
52:["$","li","Resizing a clip on the timeline would deselect it when the mouse was released. The clip now stays selected after a resize.",{"className":"text-base leading-relaxed text-foreground","children":[["$","span","p-0",{"className":"m-0","node":{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Resizing a clip on the timeline would deselect it when the mouse was released. The clip now stays selected after a resize.","position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":123,"offset":122}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":123,"offset":122}}},"children":"Resizing a clip on the timeline would deselect it when the mouse was released. The clip now stays selected after a resize."}]]}]
53:["$","li","Resizing a clip could extend it past another clip on the same track, causing an overlap. The resize now stops at the next clip's edge.",{"className":"text-base leading-relaxed text-foreground","children":[["$","span","p-0",{"className":"m-0","node":{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Resizing a clip could extend it past another clip on the same track, causing an overlap. The resize now stops at the next clip's edge.","position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":135,"offset":134}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":135,"offset":134}}},"children":"Resizing a clip could extend it past another clip on the same track, causing an overlap. The resize now stops at the next clip's edge."}]]}]
54:["$","li","Dragging a clip to a different track would deselect it on drop. The clip stays selected after moving.",{"className":"text-base leading-relaxed text-foreground","children":[["$","span","p-0",{"className":"m-0","node":{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Dragging a clip to a different track would deselect it on drop. The clip stays selected after moving.","position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":102,"offset":101}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":102,"offset":101}}},"children":"Dragging a clip to a different track would deselect it on drop. The clip stays selected after moving."}]]}]
55:["$","li","Finishing a resize or drag with the mouse over empty track space would deselect the clip.",{"className":"text-base leading-relaxed text-foreground","children":[["$","span","p-0",{"className":"m-0","node":{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Finishing a resize or drag with the mouse over empty track space would deselect the clip.","position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":90,"offset":89}}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":1,"column":90,"offset":89}}},"children":"Finishing a resize or drag with the mouse over empty track space would deselect the clip."}]]}]
