- effect_stack: the params view is cached per effect (recreation per
render killed in-progress slider drags and clicks); new
LibraryEffectDrag payload + AddTypeRequested event let an effect
dragged from the app's effect library drop onto the stack at the
indicator position
- timeline: left-press selects clips (plain press selects an
unselected clip, keeps multi-selection on a selected one for group
drags, Ctrl/Cmd toggles membership)
- node_graph: graph_position_at() converts a window-space point (drop
position) to graph space
- Menu popups (menu bar, context menus, submenus) now occlude hover
beneath them via a BlockMouse hitbox, so items under an open popup no
longer stay highlighted.
- Menu bar dropdowns anchor to the opened title's bottom-left (local
anchoring) instead of the raw pointer position plus a fixed offset;
submenus are absolute children of the popup with separator-aware row
alignment.
- Selected timeline clips render one luma notch darker so the
selection is visible against the green clip body.
- oak theme palette to a denser professional dark (near-black base,
container/window surfaces, subtler secondary text).
- Dock tabs: selected tab solid accent with white text, hairline
separators between panels.
- Timeline: green clip blocks, blue playhead, neutral track headers,
brighter ruler labels, deep-green waveforms.
- Viewer: green timecode readout, solid-accent play button, chip-style
fit/safe-margin buttons.
- Effect stack cards and node cards get rounded borders; spinbox
values in amber per the design.
NodeGraphView::set_selection selects nodes programmatically (emitting
SelectionChanged); EffectStackDataSource::selected_effect highlights
the chosen card and EffectStackEvent::CardSelected reports card clicks
— the two-way clip/node selection sync between the timeline, node
editor and inspector.
- Tab close buttons are now visible and right-aligned with a hover
background (they were nearly invisible, causing accidental panel
closes).
- Tear-off: dragging a tab outside the dock opens the panel in its own
floating window; closing the window re-docks the panel to its last
group (or closes it outright from the Window menu).
- Timeline clip dragging shows a translucent ghost at the target track
and frame, including cross-track moves.
- Project explorer icon view renders real thumbnail images when the
engine provides them, with debug selectors and a structural test.
TimelineView emits ContextMenuRequested with hit target (clip/empty/
track head/ruler marker), NodeGraphView emits it for nodes and the
background, and ProjectExplorer emits it for entries and blank areas,
so the app can open context menus aligned with the C++ version.
The handle mixed the hitbox-local drag origin with window-space
drag-move positions, so the first move snapped the ratio to a clamp
boundary (a panel suddenly grew and further drags did nothing). Drags
are now incremental window-space deltas applied to the freshly-read
ratio; drag-move routing is filtered to the owning split container so
nested splits no longer double-apply with wrong geometry; pair extent
excludes the divider itself so the boundary tracks the pointer 1:1.
- node_graph: card geometry stays graph-space; paint/hit-test/wire
endpoints scale by zoom so nodes no longer overlap at zoom != 1
- project_explorer: icon grid aligns items to start (no full-height
selection stretch), loads thumbnails from filesystem paths and
observes the data source for late arrivals
The strip handed the drag to the dock area via cx.emit, which is
deferred — the dock's drag state was created a dispatch too late, so
the hovered target was never recorded and drops were no-ops. The dock
area now lazily begins the drag in its own capture-phase handler;
drops onto the root edge from the panel's own group split the tree
instead of being swallowed as self-drops.
- MenuBar: hover another title with a menu open to switch (scrubbing)
- menu popup width computed from the longest label; ROW_HEIGHT 22
- dock tab bar 26px / smaller tab text; viewer transport tightened
- gpui::i18n: minimal string-table override (set_table/tr/clear_table) with
built-in defaults; effect-stack and viewer strings now go through it so
hosts can localize widget-baked labels without a full i18n framework.
- gpui_widgets::i18n re-exports the hook (gpui_widgets::i18n::set_table).
- node_graph: GraphViewState::fit_to_rect for fit-window/initial viewports
(unit tested); NodeGraphView::viewport_size accessor for fit targets.
- menu: add runtime set-checked path (MenuItem::set_checked/clear_checked,
Menu::set_item_checked recursive, MenuBar::set_item_checked)
- dock: Split now stores per-child ratios (sum 1.0) so 3+ panels on one
axis keep distinct sizes; resize_split_child adjusts a single boundary,
resize_split keeps its two-arg whole-share semantics; one handle per
boundary; DockLayoutState VERSION bumped to 2 for the new ratios field
- audio_meter: MeterOrientation::Vertical for the 26px transport strip,
segments lit bottom to top
- viewer: ViewerFrameSource::CpuFrame + set_cpu_frame (BGRA8 RenderImage
via the sprite atlas) for platforms without CVPixelBuffer
- timeline: TimeDisplay::TimecodeDropFrame (SMPTE drop-frame for NTSC
rates, non-drop fallback otherwise)
- gpui_widgets: regression test pinning the fractional spacing helpers
(py_0p5/py_1p5/py_2p5/py_3p5 already exist; no _0_5 aliases added)
W5 timeline supplements: clicking a track header toggles the track in a
selected_tracks set and emits TimelineEvent::TrackSelected; clips with in/out
transitions get a resize handle at the wedge edge that emits
TimelineEvent::TransitionChanged with the clamped new length (delta-scaled
by zoom). Both follow the request-only contract. 182 gpui tests pass.
* Add text spacing and transform style plumbing
* Apply byte-stable transforms and spacing-aware truncation
* Add platform letter spacing support
* Fix scheduler clippy warning
* Refresh dependency lockfile
* Fix CI for text spacing changes
* Add text transform preview example
Improves the scheduler by allowing tasks to have a set priority which
will significantly improve responsiveness.
Release notes:
- N/A
---------
Co-authored-by: Yara <git@yara.blue>
Co-authored-by: dvdsk <noreply@davidsk.dev>