Files
npub1qyvc0c5kl4gqv2fd97fsk46tu378sqgy35vc83rvgfwne90sel7s0ed67dandTyler Longwell 33d10c7510 feat(desktop): eagerTimelineLayout preview — lay out every fetched row immediately
Fetched pages already mount fully into the DOM (no virtualizer since
#1338; the markdown parse is paid eagerly at the deferred commit from
#1022). But each row wears content-visibility:auto with a heuristic
contain-intrinsic-size reserve, so offscreen rows skip layout until they
scroll near the viewport — and since the estimate never exactly matches
the true height, every realization during a fling changes scrollHeight
and forces useAnchoredScroll to compensate mid-momentum. That
estimate→true re-realization is the root the reserve heuristic only
approximates away.

This flag removes the root: with eagerTimelineLayout on, timeline rows
opt out of content-visibility skipping entirely. The full fetched window
lays out once, at exact heights, at commit time; scrolling through
already-loaded history triggers zero height re-realizations and zero
anchored-scroll corrections. Cost is a one-time layout of the loaded
window (~50 rows/page) instead of pay-as-you-scroll.

Mechanics:
- preview-features.json: new eagerTimelineLayout entry (desktop),
  toggled in Settings → Experiments like the other preview lanes.
- TimelineMessageList: rows add timeline-row-cv-eager when the flag is
  on. The reserve style stays on the wrapper — inert without size
  containment — so flag-off behavior is byte-identical to main.
- utilities.css: .timeline-row-cv.timeline-row-cv-eager flips
  content-visibility to visible.
- timeline-no-shift e2e: the wiring guard now asserts the eager path
  (the e2e bridge opts every preview feature in), and a new sibling
  spec with seedPreviewFeatures:false pins the default auto path.

Portable classifier (sami/portable-classifier 5e5bd4a5, advisory per
arc law — Tyler's trackpad judges): baseline at this tip scores 19
post-momentum bites @60px max (chromium) / 22 @60px (webkit); flag-ON
scores 0 bites / 0.0px max on both engines, stable across repeat runs,
with healthy momentum-frame populations (~226-238).

Verified: typecheck, biome, 2217 unit tests, timeline-no-shift 6/6,
scroll-history + overscroll-boundary + channel-window-mock-paging +
live-broadcast-reply-timeline 20/20, messaging 31/31.

Co-authored-by: Tyler Longwell <tlongwell@block.xyz>
Signed-off-by: Tyler Longwell <tlongwell@block.xyz>
2026-07-09 12:20:01 -04:00
..

Buzz

Desktop chat shell with:

  • Tauri + React + TypeScript + Vite
  • Tailwind CSS
  • shadcn/ui-ready shared components
  • Biome (lint/format/check)
  • Feature-driven frontend structure

Scripts

  • pnpm dev - run the web frontend
  • pnpm tauri dev - run the desktop app
  • pnpm build - typecheck and build frontend
  • pnpm typecheck - TypeScript checks
  • pnpm lint - Biome lint
  • pnpm format - Biome format (write)
  • pnpm check - Biome check

Structure

  • src/shared - reusable app-wide code (ui, lib, styles)
  • src/features - feature modules (vertical slices)
  • src/app - top-level app composition