Skip to content

Add orbit card background styles and paint the orbit behind the library header - #371

Merged
ultraelectronica merged 12 commits into
mainfrom
versionF
Nov 10, 2026
Merged

ultraelectronica merged 12 commits into
mainfrom
versionF

Conversation

@ultraelectronica

Copy link
Copy Markdown
Member

Summary

  • Add three portrait orbit card backgrounds: Blur gradient, Black gradient, and Album art color, with blur as the new reusable artwork treatment.
  • Persist the choice as orbit_card_background_style (default black gradient), reset it with the portrait layout, and expose it in Orbit settings, settings search, and a deep link that opens the portrait Card Background section.
  • Pre-blur artwork once instead of blurring live: OrbitCardBlurImage decodes a bounded 192px raster, bakes the horizontal fade into the image, and disposes its codecs and pictures after each render.
  • Prewarm upcoming covers with OrbitCardBlurPreloader: four-card lookahead plus half the visible window, forward before backward, one cover at a time, and a fresh queue when the user changes direction or jumps.
  • Let genuinely missing artwork defer behind the existing extraction gate, while already-cached covers render immediately; failures fall back to sharp art or the normal scrim.
  • Cache dominant album colors for the album-color style and tint a gradient from albumSurface, with a darkening scrim that keeps title and artist text readable. The black style keeps its existing two-pass fade, and landscape cards are unchanged.
  • Paint the orbit and ribbon behind the Songs library header instead of stopping at it. A clipped header overlay keeps cards below the measured header while the ribbon continues behind the header, search bar, and shell bottom inset without bleeding outside the Songs page.
  • Reword the orbit boundary notice to explain that the orbit passes behind the header but stays clipped inside Songs.
  • Add the six new strings in English, Spanish, Taglish, and Chinese, regenerating and committing the localization output.

Related issue

none

Checklist

  • flutter analyze passes
  • flutter test passes
  • Rust changes: cargo test --manifest-path rust/Cargo.toml passes
  • Built and ran the app if the change touches a playback path (flutter run --flavor full)
  • Generated code regenerated and committed if bridge/drift/freezed models changed
  • CHANGELOG.md updated for user-facing changes
  • No secrets, keys, tokens, or machine-local files committed
  • One change per PR; no unrelated reformatting in the same diff
  • Hardware tested if the Rust audio engine or USB/DAC output changed

Lay out the preview orbit in a separate content slot so it can paint
upward behind the header while the header stays readable, and clip the
fullscreen stage so the overflow never escapes the route.
Extract header and content into separate slots so the orbit can paint
above the stage behind the header, and clip the tab at screen bounds via
a custom clipper. Add a paint-only top overflow to OrbitScroll for the
ribbon and cards.
Verify the orbit path paints behind the library header by comparing
gallery output with the path enabled and disabled, and tighten the rail
clipping assertion to require zero ribbon bleed outside the Songs page.
Update the notice copy in en, es, tl, and zh to describe the
orbit passing behind the library header and search bar while
staying clipped to the Songs screen edges, matching the new
overlay behavior. Regenerate the localizations.
Add a portrait-only Card Background section to the orbit settings
with blur, black, and album-art color gradient options, and pass
the selected style through to the orbit preview. Deep links to the
cardBackground section now force the portrait profile.
Portrait cards now honor the card background setting: blackGradient
keeps
the legacy two-pass fade, blurGradient draws a pre-baked blurred cover
with a lighter fade, and albumColorGradient tints the fade from the
extracted dominant color. OrbitScroll preloads blurred artwork for the
visible window so motion draws a cached texture instead of a live
filter, and SongCard resolves album colors off the layout path.
Wire the new cardBackground section into the settings search catalog and
pass the selected background style through to the orbit stage from the
Songs screen.
Add the provider setter and preference plumbing for the card
background style so the selection survives restarts and is cleared
with the portrait layout reset.
Cover the selector in portrait settings, preference persistence and
reset for the background style, and update card image lookups for the
pre-baked blurred cover.
Introduce an ImageProvider that rasterizes a blurred, gradient-masked
portrait overlay at a bounded size, sharing resolved local covers and
image-cache entries across cards. Add a preloader that warms a small
moving lookahead window, one cover at a time, replacing queued work on
jumps or direction changes.

Cover the raster sizing, cache behavior during animation and scrolling,
and preloader queueing, reversal, disposal, and error handling with
tests.
Introduce an OrbitCardBlur widget that renders the cached blur
overlay without a live filter or gradient mask, reusing prewarmed
textures on the first frame and deferring only missing artwork
behind the extraction gate.

Add the OrbitCardBackgroundStyle enum with storage serialization
for the blur, black, and album color gradient options.
Add labels and hints for the card background style selector
in English, Spanish, Filipino, and Chinese.
@ultraelectronica ultraelectronica self-assigned this Nov 10, 2026
@ultraelectronica
ultraelectronica merged commit 847382e into main Nov 10, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant