Skip to content

Rounds 12-14 — fluidity overhaul + real-vs-shell architecture (lib v2.3.5)#28

Merged
YamadaBlog merged 3 commits into
mainfrom
feat/round-12-14-fluidity-shells
Jun 12, 2026
Merged

Rounds 12-14 — fluidity overhaul + real-vs-shell architecture (lib v2.3.5)#28
YamadaBlog merged 3 commits into
mainfrom
feat/round-12-14-fluidity-shells

Conversation

@YamadaBlog

Copy link
Copy Markdown
Owner

Problem

The demo was heavily janky on a 2K desktop even with audio paused (user report, RTX 3060).

Measured root causes

  • Per-frame filter pumps on hero glow/backdrop (viewport-sized re-raster every frame while playing)
  • 5 always-on rAF loops — worst: 5 orbit orbs ~380px, blur(60px)+mix-blend, stepped 60 Hz even offscreen
  • Scroll-driven font-variation-settings on the 96px headline (full text relayout per scrolled frame)
  • 25 full MusicPlayer instances mounted (29 live backdrop-filters, 45 blur layers)

Fixes

  • Pumps → compositor-only opacity/transform; IO-gating of all per-frame loops; orbs 30 Hz; static font weight
  • content-visibility: auto on plain sections (pinned showcases exempt)
  • Real-vs-shell architecture: 5 real instances + 11 pre-rendered WebP shells (284 kB; npm run generate:shells pipeline committed). Pick-a-mood keeps ONE live player — clicking a shell moves it. Reveal mobile slides mount only ≤720px.
  • lib v2.3.5: eqBars notify 30 Hz + EqBarsRow extraction (tag pushed; byte-identical gate baseline updated)

Numbers (same protocol, headed GPU 2K)

idle playing p50 36-48 → 18.1 ms (1% jank) · scroll-while-playing jank 63-99% → 30% · idle paused 6.1 ms, 0% jank · backdrop-filters 29 → 9

Validation

ci exit=0 (88 tests, 0 vulns, byte-identical v2.3.5 ✓) · consumer-smoke 4/4 · visual 2/2 · responsive 6/6 · Axe AA 2/2

🤖 Generated with Claude Code

YamadaBlog and others added 3 commits June 12, 2026 12:15
Library-side share of the round-12 fluidity work :
- useAudioStore: eqBars triggerRef notifications capped at 30 Hz
  (analyser still sampled per frame ; consumers re-render half as
  often — the 4-bar chrome is visually identical at half rate)
- EqBarsRow.vue: the per-instance eq DOM extracted into one shared
  renderer component used by MusicPlayer + MiniPlayer
- byte-identical gate baseline moved v2.3.4 -> v2.3.5 (tag pushed
  with this PR ; PULSE_LIB_BASELINE_REF still overrides)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ture

Measured root causes (2560x1440, prod build, headed GPU) :
- per-frame filter pumps on hero glow/backdrop -> opacity/transform
- 5 always-on rAF loops (orbit orbs blur(60px)+blend stepped 60 Hz
  even offscreen) -> IntersectionObserver-gated, orbs 30 Hz
- scroll-driven font-variation-settings on the 96px headline (full
  text relayout per frame) -> static weight
- content-visibility:auto on plain sections (pinned showcases exempt)
- 25 full MusicPlayer instances -> 5 real + 11 pre-rendered WebP
  shells (PlayerShell.vue, 284 kB total) ; Pick-a-mood keeps ONE live
  player, clicking a shell moves it there ; reveal mobile slides now
  mount only at <=720px

Numbers (same protocol before/after) : idle paused p50 6.1 ms 0% jank ;
idle playing 36-48 -> 18.1 ms (1% jank) ; scroll-while-playing jank
63-99% -> 30% ; live backdrop-filters 29 -> 9, blur layers 45 -> 20.

Shell pipeline : npm run generate:shells (showcase rig + sharp),
regenerate after any lib visual change.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ures

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@YamadaBlog YamadaBlog merged commit 71422ec into main Jun 12, 2026
17 checks passed
@YamadaBlog YamadaBlog deleted the feat/round-12-14-fluidity-shells branch June 12, 2026 10:32
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