Files
npub1223z34hd7vtwc6qj4s7flsxkj644nlre2nthu7lrrmkumhu3xddsrx9r6wandTaylor Ho e9ad63d880 fix(desktop): hold timeline scroll anchors through zoom-scaled reflow
Three scroll-anchor gaps surfaced by the 1.1 default text scale (all
app-side; no test tolerances changed):

- Prepend drift: after the older-history re-pin, prepended rows above
  the viewport realize their content-visibility intrinsic-size
  estimates a few frames later. No scroll event fires for that shrink
  and native scroll anchoring has no anchor node above the viewport, so
  the reading row drifted ~30px (scales with root font size — 1.1
  pushed it past the 28px e2e budget). The content ResizeObserver now
  re-pins mid-history message anchors (it only handled at-bottom), and
  onScroll swallows the echoes of our own anchor-holding writes instead
  of re-capturing the drifted position as the new anchor.

- Stranded bottom jump: the scroll-to-latest pill's smooth jump
  computes its animation target from metrics at call time; rows
  realizing their true heights mid-flight make that target stale, the
  engine settles ~52px above the real floor, and then emits no further
  scroll events — an event-driven settle guard can never issue the
  final corrective write. The settle guard is now a rAF loop outside
  the event stream: hands-off while the position is moving, corrective
  pin once it holds still short of the true floor, disarmed at the
  floor, on trusted user input, or a hard time cap.

- Anchor-blind system rows: SystemRow rendered no data-message-id, so
  in a young channel whose only rows are system events computeAnchor
  found nothing and fell through to at-bottom — a user who scrolled up
  never got the scroll-to-latest pill and was yanked down by the next
  arrival. System rows now carry their message id.

Co-authored-by: Taylor Ho <taylorkmho@gmail.com>
Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
2026-07-02 12:20:14 -07:00
..
2026-06-11 15:06:24 +00:00
2026-06-11 15:06:24 +00: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