Commit Graph
705 Commits
Author SHA1 Message Date
Vance IngallsandClaude Sonnet 5 684ec4e875 fix(studio): reconcile keyframe-seek timing basis between flat Layout and Motion groups
Whole-plan coherence review (Plan 3a Layout + Plan 3b Motion) found that
Layout's keyframe gutter and Motion's Timing row independently derived an
element's start/duration and disagreed whenever an element had animations
but no explicit data-duration: Motion correctly inferred the range from the
element's GSAP tweens, while Layout's keyframe gutter fell back to a naive
`duration ?? 1`, so clicking a keyframe percentage in Layout could seek to a
different absolute time than what Motion's Timing row displayed.

Extract deriveElementTiming (propertyPanelFlatTimingDerivation.ts) as the
single shared basis both paths now consume: FlatTimingRow (Motion) and
PropertyPanelFlat's own elStart/elDuration (Layout's keyframe gutter and 3D
Transform block). PropertyPanelFlat now recomputes this basis itself from
its own element/gsapAnimations props instead of trusting the parent's naive
value, so PropertyPanel.tsx (and its legacy non-flat panel) is untouched.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-09 12:58:00 -07:00
Vance Ingalls 710a2488f1 feat(studio): wire the flat Motion group into the one-open accordion 2026-07-09 12:33:34 -07:00
Vance Ingalls 59e178019c feat(studio): compose FlatMotionSection from Timing and the flat effect-card list 2026-07-09 12:15:14 -07:00
Vance Ingalls b53db878a4 feat(studio): add flat collapsed-header variant to AnimationCard 2026-07-09 12:06:31 -07:00
Vance Ingalls f925bf60e5 feat(studio): add FlatTimingRow for the flat Motion group 2026-07-09 11:55:16 -07:00
Vance IngallsandClaude Sonnet 5 382989a06c feat(studio): wire the flat Layout group into the one-open accordion
Thread the Layout-group values through PropertyPanel -> PropertyPanelFlat
and add the third FlatGroup to the one-open/pin accordion (unconditional,
matching legacy Layout). Default-open Layout when neither Text nor Style
applies.

Fix the Flex double-render: the legacy StyleSections still renders its own
Flex Section, and the new flat Layout group renders its own LayoutFlexBlock.
Add an additive optional hideFlex prop to StyleSections and pass it on the
flat path so Flex renders exactly once (from the flat Layout group). Non-flat
callers omit it and are unchanged.

Extract the shared onLivePreviewProps closure into gsapLivePreview.ts (it was
duplicated inline in the legacy path) so PropertyPanel.tsx stays within the
600-LOC studio gate.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-09 11:52:16 -07:00
Vance Ingalls 58f2b1bbaa feat(studio): compose FlatLayoutSection from geometry, z-index, flex, and 3D blocks 2026-07-09 11:52:15 -07:00
Vance Ingalls 00553e8cea feat(studio): nest the existing 3D transform sub-view in a flat wrapper 2026-07-09 11:52:15 -07:00
Vance IngallsandClaude Sonnet 5 2c31fa185f feat(studio): add flat Layout Z-index row and Flex sub-block
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-09 11:52:15 -07:00
Vance Ingalls 411735f4f2 feat(studio): add flat Layout geometry rows (X/Y/W/H/Angle) with keyframe gutters 2026-07-09 11:52:15 -07:00
Vance Ingalls ec3ad428fb feat(studio): wire the flat Style group into the one-open accordion 2026-07-09 11:52:15 -07:00
Vance Ingalls a5c8d39090 feat(studio): add flat Opacity slider, completing the Style group 2026-07-09 11:52:15 -07:00
Vance Ingalls 62b5fafca8 feat(studio): add flat Overflow and Mask rows to the Style group 2026-07-09 11:52:15 -07:00
Vance Ingalls bc9651284e feat(studio): add flat Layer blur and Backdrop sliders to the Style group 2026-07-09 11:52:14 -07:00
Vance Ingalls 1d7d8aaa5d feat(studio): add flat Shadow and Blend rows to the Style group 2026-07-09 11:52:14 -07:00
Vance Ingalls fbc3036a54 feat(studio): add flat Stroke and Radius rows to the Style group 2026-07-09 11:52:14 -07:00
Vance Ingalls 7738a67ddb feat(studio): add FlatStyleSection with the flat Fill sub-block 2026-07-09 11:52:14 -07:00
Vance Ingalls 5032c9cfe3 feat(studio): add stroke-summary format/parse helpers for the flat Style group 2026-07-09 11:52:14 -07:00
Vance Ingalls 1e3b987b46 feat(studio): add FlatSelectRow primitive for the flat inspector 2026-07-09 11:52:14 -07:00
Vance Ingalls dca78da5b9 feat(studio): add FlatSlider primitive for the flat inspector 2026-07-09 11:52:13 -07:00
Vance Ingalls 444639d751 fix(studio): gate flat Text group to text-editable elements, dedupe heading in multi-field fallback
The flat inspector's Text FlatGroup rendered unconditionally, showing an
empty "Text" header for non-text elements (image, video, etc). Gate it on
isTextEditableSelection(element) so it disappears entirely when there's no
text to edit.

Also, the legacy multi-field TextSection (used as a fallback when an
element has 2+ text fields) rendered its own internal "Text" heading
nested inside the new flat Text FlatGroup, producing a doubled "Text"
heading. Add a hideOwnHeading prop to TextSection (default false, so its
other — legacy, non-flat — call site is unaffected) and pass it from
FlatTextSection's fallback path.
2026-07-09 11:52:13 -07:00
Vance IngallsandClaude Sonnet 5 b57b31beb9 feat(studio): render the flat Ledger inspector shell behind STUDIO_FLAT_INSPECTOR_ENABLED
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-09 11:52:13 -07:00
Vance Ingalls 8b7738422a feat(studio): wire group-selection and hide-all into the property panel 2026-07-09 11:52:13 -07:00
Vance Ingalls df36722623 feat(studio): add flat empty and multi-select states (#6b) 2026-07-09 11:52:12 -07:00
Vance Ingalls 6f2e9848c4 feat(studio): add FlatTextSection, the flat inspector's canonical reference group 2026-07-09 11:52:12 -07:00
Vance Ingalls eba8a0fa29 feat(studio): add flat trigger variants for ColorField, FontFamilyField, TextAreaField 2026-07-09 11:52:12 -07:00
Vance Ingalls 3bb943e96a feat(studio): add flat footer (ask agent + record) for the inspector 2026-07-09 11:52:12 -07:00
Vance Ingalls 1acb1e63c7 feat(studio): add flat identity header for the inspector 2026-07-09 11:52:12 -07:00
Vance Ingalls 77e8f3d04c feat(studio): add FlatGroup accordion and PinnedZoneDivider primitives 2026-07-09 11:52:11 -07:00
Vance Ingalls 86f6a7d820 feat(studio): add FlatRow and FlatSegmentedRow flat-inspector primitives 2026-07-09 11:52:11 -07:00
Vance Ingalls cb835554d3 feat(studio): add 3-tier value/label color resolver for the flat inspector 2026-07-09 11:52:11 -07:00
Vance Ingalls 514fe91e58 feat(studio): add flat-inspector tokens and STUDIO_FLAT_INSPECTOR_ENABLED flag 2026-07-09 11:52:10 -07:00
Vance Ingalls 31f0810be8 chore: release v0.7.45 2026-07-08 22:15:49 -07:00
Miguel Ángel 0ac000181e feat(studio): storyboard empty state with agent copy-prompt and skeleton preview (#2091)
The storyboard view's empty state was a single "no storyboard yet" line. Add a
copy-to-clipboard prompt box (a ready-to-paste handoff prompt carrying the
canonical STORYBOARD.md frontmatter + per-frame format) so users can hand it to
their coding agent, plus a faded skeleton of the contact-sheet grid so landing
on an empty board previews what a filled one looks like instead of a dead end.
2026-07-08 22:32:40 -04:00
Miguel Ángel 623f91d6a1 feat(studio): always-on crop with reposition handle, drop crop mode (#2090)
Crop is now part of the element selection instead of a separate mode. Selecting
a croppable element shows edge handles just outside each side and, once cropped,
the full content with the cropped-away area dimmed plus a center reposition
handle to pan the crop window. Dragging the body moves the element, edge handles
crop, the center handle pans; corners stay free for the resize handle. Removes
the crop-mode toggle (toolbar + property-panel buttons), the cropMode/
cropAvailable player-store state, and the double-click-to-crop gesture. The
clip-path inset model is unchanged.
2026-07-08 22:24:26 -04:00
Vance Ingalls 1e8dd29815 chore: release v0.7.44 2026-07-08 16:21:05 -07:00
Vance Ingalls f8f945d42e chore: release v0.7.43 2026-07-08 15:51:39 -07:00
Vance Ingalls 8854bad8f9 fix(engine,cli): resolve drawElement to a Chrome build that actually has it
canvas.drawElementImage is an unlaunched Dev/Canary-only Blink feature
(~151+). The CLI's pinned CHROME_VERSION fallback was still 131.0.6778.85 —
a puppeteer 24→25.2.1 bump that pinned it to Chrome Dev 151.0.7912.0 was
written on 2026-06-29 but never merged (orphaned local commit, no PR). Any
render on that pin, or on the shared puppeteer-cache binary, or on system
Chrome (Stable, no drawElementImage at all) got a canvas.getContext("2d")
missing the method and crashed mid-capture with "ctx.drawElementImage is
not a function" instead of falling back (HF#2060).

Three changes:
- Bump puppeteer/puppeteer-core to ^25.2.1 across every package that
  depends on it, and CHROME_VERSION to 152.0.7928.2 (today's Dev channel;
  confirmed via direct probe to implement drawElementImage, unlike 131).
- `ensureBrowser({ preferManagedChrome: true })`, always used by `render`:
  resolve straight to our pinned/cached build, skipping both the shared
  puppeteer-cache preference and system Chrome. Rendering shouldn't depend
  on whatever arbitrary Chrome a machine happens to have — that's exactly
  how this regressed (any Mac with Chrome.app installed bypassed the CLI's
  pin entirely).
- A runtime capability probe in the engine, right before any other
  drawElement work: if `drawElementImage` isn't a function on the injected
  canvas, route to the existing screenshot-fallback gate instead of
  crashing. This is the real backstop — it protects every resolution path
  (env override, stale cache entry, a future Chrome regression), not just
  the ones `preferManagedChrome` reaches.

Verified end-to-end: rendering against chrome-headless-shell 131 (confirmed
to lack drawElementImage) now falls back cleanly and produces a valid MP4
instead of crashing; rendering against a capable build still engages
drawElement normally. 922 engine tests + 1373 CLI tests pass.

Fixes #2060.
2026-07-08 14:14:28 -07:00
Vance IngallsandClaude Fable 5 f6cd711bf0 chore: release v0.7.42
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-07 16:04:26 -07:00
Miguel Ángel 60463d0bd5 chore: release v0.7.41 2026-07-07 20:30:24 +00:00
Miguel Ángel 2bd9bb6f69 chore: release v0.7.40 (#2024) 2026-07-07 12:30:13 -04:00
Miguel Ángel 574da2b215 fix(studio): off-canvas indicators track live layout instead of going stale (#2018)
The dashed indicators for elements outside the canvas stayed pinned at an element's
old position after a move or a seek: they were recomputed by an effect keyed on
compRect/activeCompositionPath, neither of which changes on an in-place soft-reload
edit or a playhead seek.

They now recompute via a MutationObserver on the preview document (coalesced to one
recompute per frame), so they follow the element live. Crop-hugging is preserved.
Adds a regression test that mutates an element in place and asserts the indicator moves.
2026-07-07 04:39:46 -04:00
Miguel Ángel 037266e72b feat(studio): timeline revamp with active-clip highlighting and hide controls (#2017)
Timeline UI
- Highlight clips visible at the playhead in the primary color; others share one neutral color
- Minimalist rounded clips, single-color track rows, no gutter icons or superscript labels
- Per-track eye toggle and a per-element hide button in the design panel
- Ruler zoom fixes: sub-second tick intervals and correct label formatting at high zoom
- Sticky gutter so track controls stay visible while scrolling

WYSIWYG visibility (data-hidden)
- Runtime honors data-hidden (display:none), so hiding affects the render, not just the preview
- HTML stays the source of truth; hide state persists and round-trips on reload

Split several studio files to stay under the 600-line cap; pure relocations, no behavior change.
2026-07-07 04:26:56 -04:00
Miguel Ángel 5d59835446 fix(studio): static-position drag no longer freezes an element beside an animated rotation (#2016)
## What

Brief description of the change.

## Why

Why is this change needed?

## How

How was this implemented? Any notable design decisions?

## Test plan

How was this tested?

- [ ] Unit tests added/updated
- [ ] Manual testing performed
- [ ] Documentation updated (if applicable)
2026-07-07 03:45:17 -04:00
Vance Ingalls 229e88eac5 chore: release v0.7.39 2026-07-06 22:48:42 -07:00
ukimsanov 8f022d06ec fix(studio): remove selection overlay fill 2026-07-06 21:02:36 -07:00
Miguel Angel Simon Sierra 676f461f6a feat(studio): non-destructive crop + cross-project asset view 2026-07-06 23:40:32 -04:00
Vance Ingalls d8d3a93b0d chore: release v0.7.38 2026-07-06 17:47:34 -07:00
Vance Ingalls 89e36da13d fix(studio): shell UX — data-loss guards, error surfacing, dialog contracts, toasts (#1964) 2026-07-06 16:56:06 -07:00
Vance Ingalls 241f9d683e feat(studio,studio-server,cli): render cancel end-to-end + renders/nle/storyboard UX (#1963) 2026-07-06 16:43:48 -07:00