Commit Graph
2777 Commits
Author SHA1 Message Date
Vance Ingalls 1deb0dc970 fix(studio): resolve the 4 cumulative blockers from the #2416 tip re-review
Fixes the Deepwork tip re-review's four remaining blockers plus its
additive findings:

- selectionIdentityKey: add sourceFile as a 5th identity component. The
  same local id/selector can legitimately recur across different
  composition files (host vs. an inlined sub-composition, or two unrelated
  sub-comps) — without sourceFile, those collided onto the same identity
  key and reused stale controller state across a selection change that
  should have reset it.
- useColorGradingController: flush (not discard) a pending Grade edit when
  selection changes before the 350ms debounce fires. The prior fix
  correctly stopped it from landing on the WRONG (new) target, but
  cancelling outright silently dropped the user's in-flight edit instead of
  writing it to the element it was authored for — using the
  onSetAttributeLive closure captured for the outgoing render, which
  (via commitDataAttribute's own useCallback deps) is still bound to the
  outgoing selection.
- useColorGradingController: revert to the last confirmed-good grading when
  a persist rejects, instead of leaving the optimistic (never-actually-
  saved) value showing indefinitely. Tracks a separate
  confirmedGradingRef, updated only on a successful persist.
- FlatSelectRow: disable the reset button when the row itself is disabled
  (it previously ignored disabled entirely, same class of bug as the
  FlatSlider reset button fixed earlier) and give the underlying <select>
  an aria-label from the row's label text.
- FlatSlider: handle lostpointercapture the same as pointercancel — capture
  can be lost without either firing first (another element steals it, or
  the browser reclaims it for a scroll/touch gesture), which previously
  left the dragging flag stuck and the knob permanently unable to sync to
  external value changes.

New regression tests for all of the above; full studio suite still at the
known pre-existing baseline (55 failures unrelated to this stack).
2026-07-14 16:28:33 -07:00
Vance Ingalls 5dd9efe555 fix(studio): resolve 8 confirmed adversarial-review findings across the flat-inspector stack
Fixes issues raised in the Deepwork re-review of #2120-#2190 that weren't
covered by #2225's earlier fix pass:

- useColorGradingController: reset grading/compare/mediaMetadata state (and
  cancel pending persist/status timers) when selection changes to a
  different element — this hook is called unconditionally on every render
  (unlike legacy ColorGradingSection, remounted via a selectionIdentityKey
  React key), so switching selection reused the previous element's state.
- useColorGradingController: stop permanently caching a non-OK
  /media/metadata response as null — a transient server error poisoned the
  HDR banner for that asset for the whole page lifetime.
- FlatSelectRow: preserve a valid authored value outside the preset list
  (e.g. mix-blend-mode: difference, an arbitrary object-position) instead of
  silently misrepresenting it as the first preset — touching the control
  would overwrite real persisted state.
- FlatSlider: the throttled trailing commit now reads onCommit through a
  ref updated every render instead of closing over it at schedule time — a
  caller whose onCommit spreads other current state (Grade's per-detail
  commits) could otherwise have a delayed commit revert whatever the user
  changed on a different control in the same 40ms window.
- FlatSlider: flush a still-queued trailing commit on unmount instead of
  dropping it, and disable the reset button when the slider itself is
  disabled.
- FlatSlider: add touch-action: none to the track so touch drags don't
  compete with page scroll.
- FlatColorGradingAccessory: clean up the compare-hold's window listeners
  on unmount, not only on release — switching selection mid-hold used to
  leak them.
- Align (flat Text): re-clicking the option already visually active for a
  logical start/end value no longer rewrites it to the physical left/right,
  preserving RTL semantics.
- FlatSegmentedRow: give every option an accessible name and aria-pressed
  state — two visually-identical glyph buttons (upright/italic "A") had no
  way to be told apart by assistive tech.
- PropertyPanelFlat: the panel body falls back to its own scroll when the
  collapsed group headers alone exceed the available height, so groups
  can't become permanently unreachable in a short pane.

New regression tests for all of the above; full studio suite at the known
pre-existing baseline (55 failures unrelated to this stack).
2026-07-14 16:28:33 -07:00
Vance Ingalls 2e44a15d19 Merge pull request #2369 from heygen-com/07-13-style_studio_distinguish_open-section_body_from_header_background
style(studio): distinguish open-section body from header background
2026-07-14 16:10:12 -07:00
Vance Ingalls be8a2912f6 Merge pull request #2225 from heygen-com/studio-flat-15-review-fixes
fix(studio): resolve flat-inspector review defects
2026-07-14 16:09:53 -07:00
Miguel Ángel 26eb5956e5 fix(registry): install liquid-glass runtimes (#2451)
* fix(registry): install liquid-glass runtime

* fix(registry): cover liquid-glass sibling runtimes

* test(registry): satisfy manifest audit
2026-07-14 19:09:41 -04:00
Vance Ingalls 68553b0a4f Merge pull request #2190 from heygen-com/07-10-fix_studio_debounce_flat_slider_drag_commits_to_prevent_rapid-fire_writes
fix(studio): debounce flat slider drag commits to prevent rapid-fire writes
2026-07-14 16:09:34 -07:00
Vance Ingalls 163a36eee7 Merge pull request #2186 from heygen-com/studio-flat-13-slider-drag
fix(studio): support drag on FlatSlider, not just click-to-set
2026-07-14 16:09:16 -07:00
Vance Ingalls e97ae2364c Merge pull request #2142 from heygen-com/studio-flat-12-slider-hit-area
fix(studio): widen FlatSlider's click/drag hit area vertically
2026-07-14 16:08:56 -07:00
Vance Ingalls 06240e0afb Merge pull request #2136 from heygen-com/studio-flat-11-expand-collapse-animation
feat(studio): animate flat inspector group expand/collapse
2026-07-14 16:08:42 -07:00
Vance Ingalls 40be1e0806 Merge pull request #2135 from heygen-com/studio-flat-10-remove-pinning
refactor(studio): remove section pinning from the flat inspector
2026-07-14 16:08:22 -07:00
Vance Ingalls 6c9c86585d Merge pull request #2134 from heygen-com/studio-flat-09-fixed-headers-scrollable-body
refactor(studio): scroll only the open group's body, keep headers fixed
2026-07-14 16:08:01 -07:00
Vance Ingalls 692ccbb5c8 Merge pull request #2127 from heygen-com/studio-flat-08-style-grade-parity
fix(studio): Style/Grade/Text parity gaps found in legacy-retirement audit
2026-07-14 16:04:48 -07:00
Vance Ingalls 7f7ff4fdaa Merge pull request #2126 from heygen-com/studio-flat-07-retire-legacy-style-grade
fix(studio): retire legacy Style and Grade sections from flat inspector
2026-07-14 16:04:31 -07:00
Vance Ingalls 1bba229748 Merge pull request #2125 from heygen-com/studio-flat-06-pinning-multifield
feat(studio): flat inspector — persisted pinning + multi-field Text
2026-07-14 16:04:03 -07:00
Vance Ingalls 4fe6f6a179 Merge pull request #2124 from heygen-com/studio-flat-05-grade
feat(studio): flat inspector — Grade (color grading) group
2026-07-14 16:03:44 -07:00
Vance Ingalls 6e72af5cdf Merge pull request #2123 from heygen-com/studio-flat-04-media
feat(studio): flat inspector — Media group
2026-07-14 16:03:24 -07:00
Vance Ingalls 770639cc35 Merge pull request #2122 from heygen-com/studio-flat-03-layout-motion
feat(studio): flat inspector — Layout + Motion groups
2026-07-14 16:03:05 -07:00
Vance Ingalls 3011406c4f Merge pull request #2121 from heygen-com/studio-flat-02-style
feat(studio): flat inspector — Style group
2026-07-14 16:02:48 -07:00
Vance Ingalls 127b8e4658 style(studio): distinguish open-section body from header background
Add panel.bg-inset token (#121214) and inset shadow to open-group body
for visual separation from the header row.
2026-07-14 15:51:58 -07:00
Vance Ingalls 6062d3b31c fix(studio): resolve flat-inspector review defects 2026-07-14 15:51:57 -07:00
Vance Ingalls a1fccfa748 fix(studio): throttle FlatSlider commits instead of debouncing them
A pure debounce resets its timer on every pointermove, so a real drag
(events faster than 40ms apart) never commits until the pointer pauses
or lifts — killing live preview updates mid-drag. Throttle with a
leading-edge commit + trailing flush instead.
2026-07-14 15:51:57 -07:00
Vance IngallsandClaude Sonnet 5 c699778689 fix(studio): support drag on FlatSlider, not just click-to-set
Only onPointerDown was wired, so dragging the knob/track only ever
committed the initial click position — nothing tracked the pointer
after that. Uses the Pointer Capture API (setPointerCapture on
pointerdown, onPointerMove while captured, release on pointerup) so
the value follows the cursor continuously during a drag, matching how
the legacy native <input type="range"> control behaves for free.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-14 15:51:57 -07:00
Vance Ingalls 567b0aa017 fix(studio): debounce flat slider drag commits to prevent rapid-fire writes 2026-07-14 15:51:57 -07:00
Vance IngallsandClaude Sonnet 5 ce07dfcd4d fix(studio): widen FlatSlider's click/drag hit area vertically
The track's visible line was only 2px tall, and pointerdown was bound
directly to that thin element, making it hard to grab. The hit area is
now 20px tall (a wrapping div) with the visible line rendered as a
thin decorative child, centered inside it — the ratio math only reads
left/width so click accuracy is unaffected.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-14 15:51:56 -07:00
Vance Ingalls 2aefec3e68 fix(studio): animate the implicitly-closed group too, add regression test 2026-07-14 15:51:56 -07:00
Vance Ingalls 2285b399e5 refactor(studio): remove section pinning from the flat inspector 2026-07-14 15:51:56 -07:00
Vance Ingalls a0f2a65bc2 feat(studio): animate flat inspector group expand/collapse
Adds a fast (120ms) CSS entrance animation for flat inspector accordion
group headers/body, gated to the group actually toggling (not derived
from remounting alone) to avoid a Chromium reflow quirk that otherwise
replays the animation on untouched collapsed siblings.
2026-07-14 15:51:56 -07:00
Vance IngallsandClaude Sonnet 5 528f2be242 refactor(studio): scroll only the open group's body, keep headers fixed
Collapsed group headers render in fixed, non-scrolling document flow
above and below the open group; only the open group's own content
scrolls, in a dedicated region. Also fixes the flat inspector footer's
missing background.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-14 15:51:55 -07:00
Vance IngallsandClaude Sonnet 5 f6fa9b4ec3 fix(studio): restore capitalize, end-align, live-commit size, and autofocus in flat Text
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-14 15:51:55 -07:00
Vance Ingalls 8a25f21cd6 fix(studio): restore zero-strength revive, keyboard hold, and HDR detail in flat Grade 2026-07-14 15:51:55 -07:00
Vance Ingalls 8564ea4c92 docs(studio): fix stale radius-row comment after unlink fix 2026-07-14 15:51:55 -07:00
Vance Ingalls 58bb05c31d fix(studio): restore stroke color, radius unlink, and mask inset in flat Style 2026-07-14 15:51:55 -07:00
Vance Ingalls 22359eaab3 fix(studio): retire legacy Style and Grade sections from flat inspector
The flat inspector rendered its new Style/Grade groups AND the legacy
ColorGradingSection/StyleSections components a second time below them,
visibly doubling every control. Remove the now-redundant legacy render
call sites (and their now-unused imports) from PropertyPanelFlat.tsx;
those components stay intact for the legacy (flag-off) PropertyPanel.
2026-07-14 15:51:54 -07:00
Vance IngallsandClaude Sonnet 5 0524f1c9c2 feat(studio): flatten multi-field Text, retiring TextSection fallback
FlatTextSection's multi-field branch (textFields.length > 1) now renders
FlatTextLayerList (Task 5) + the existing single-field FlatTextFieldEditor
for the active field, tracked via new local activeFieldKey state that
resyncs (useEffect) when the active field disappears from props. This
retires the legacy TextSection delegation entirely for that case; the
TextSection import is removed from propertyPanelFlatTextSection.tsx since
nothing else in the file referenced it.

Also updates propertyPanelSections.test.tsx and PropertyPanel.test.tsx,
which exercised/documented the old multi-field-falls-back-to-legacy-
TextSection behavior in comments and test titles — reworded to describe
the new flat path (assertions were already compatible and still pass).

Flag for reviewer: hideOwnHeading on the legacy TextSection component
(propertyPanelSections.tsx) was added in an earlier plan specifically for
this now-removed call site. It has no remaining consumer after this task
lands (PropertyPanel.tsx's legacy caller doesn't pass it). Left in place
per brief instruction — not deleting unilaterally, since that's a scope
decision for whoever reviews this task.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-14 15:51:54 -07:00
Vance IngallsandClaude Sonnet 5 475f764e5a test(studio): assert stopPropagation prevents onSelect on remove click
Review proved the existing test didn't catch a broken stopPropagation
by temporarily removing it and confirming the suite still passed.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-14 15:51:54 -07:00
Vance IngallsandClaude Sonnet 5 b0093835fd feat(studio): add FlatTextLayerList for multi-field text
Originated layout, no design mock exists — flag for design review.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-14 15:51:54 -07:00
Vance IngallsandClaude Sonnet 5 e6cf075363 test(studio): rename unpin test to match what it actually verifies
Review of the pin-aware group list refactor flagged the test name
claiming the group "closes" on unpin — it doesn't assert that, and
structurally the group re-opens (togglePin never touches openGroupId).
Retitled to describe only the return-to-stack behavior actually tested.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-14 15:51:54 -07:00
Vance Ingalls b2384fad67 feat(studio): render pinned groups first with a persisted, per-element-kind pin zone 2026-07-14 15:51:54 -07:00
Vance Ingalls 31849d62e2 feat(studio): add PinnedGroupRow always-open pinned-group primitive 2026-07-14 15:51:54 -07:00
Vance IngallsandClaude Sonnet 5 384fe5934a feat(studio): wire the flat Grade group into the one-open accordion
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-14 15:51:53 -07:00
Vance Ingalls 4bff97090b feat(studio): add usePersistedPinnedGroups hook
Reads/writes the per-element-kind pinned-groups map added to
studioUiPreferences in the prior task, read-modify-writing the whole
map since writeStudioUiPreferences only shallow-merges top-level keys.
2026-07-14 15:51:53 -07:00
Vance IngallsandClaude Sonnet 5 0d7a60a525 feat(studio): persist per-element-type pinned groups in studioUiPreferences
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-14 15:51:53 -07:00
Vance IngallsandClaude Sonnet 5 cc07c84a31 feat(studio): add HDR warning banner and Apply-to-scope row, completing FlatColorGradingSection
Also adds a not-busy click assertion for the Apply button so
onApplyToScope is exercised end-to-end, not just its disabled state.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-14 15:51:52 -07:00
Vance Ingalls 80dc7c49f6 feat(studio): add Blur and Pixelate effect sliders 2026-07-14 15:51:52 -07:00
Vance IngallsandClaude Sonnet 5 93f3bf5945 feat(studio): add Vignette and Grain rows with tuned-settings sub-panel
Also hoists the pointerdown-drag/reset-click test scaffold shared by the
new Roundness tests and the existing Contrast/Exposure tests into helpers
(findRowByText/dragSliderTrack/clickSliderReset), and exempts pre-existing,
branch-inherited fallow findings unrelated to this task (TextFieldEditor
complexity from earlier Text-inspector commits; test-scaffold duplication
across four flat-inspector-series test files from Plans 2-4) via
.fallowrc.jsonc, per this repo's established convention for line-shift/
inherited findings.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-14 15:51:51 -07:00
Vance IngallsandClaude Sonnet 5 82cb7b8979 refactor(studio): collapse dead-branch scale ternary in Adjust sliders
Review of Task 6 flagged the exposure/other-key scale ternary as always
resolving to 100 on both arms.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-14 15:50:52 -07:00
Vance Ingalls 96d90feb50 feat(studio): add the 10 Adjust sliders to FlatColorGradingSection 2026-07-14 15:50:51 -07:00
Vance Ingalls 9b6bed2824 feat(studio): add FlatColorGradingSection Preset and Custom LUT rows 2026-07-14 15:50:51 -07:00
Vance Ingalls 160193d833 feat(studio): add FlatColorGradingAccessory (compare, status dot, reset) 2026-07-14 15:50:50 -07:00
Vance Ingalls 18e4aef7dc feat(studio): widen FlatSelectRow options to support label!=value entries 2026-07-14 15:50:49 -07:00