Skip to content

On a phone the lit tab follows the swipe, and the top bar keeps it on screen - #62

Merged
andrin-n-dream merged 1 commit into
masterfrom
Ui
Sep 18, 2026
Merged

andrin-n-dream merged 1 commit into
masterfrom
Ui

Conversation

@andrin-n-dream

Copy link
Copy Markdown
Contributor

Two complaints from using it on a phone, both about the same question -- which
window am I in:

  • The tab only moved once the row came to rest. settleActive runs on
    scrollend (or 140ms after the last scroll event), and a swipe's momentum
    plus the snap is most of a second of the strip naming the window you had
    left. Now, where the row is one window wide, each scroll event asks which
    window covers the middle of the screen and marks it through onActivate --
    the mark alone, which writes no ui, sends no scroll request and takes no
    focus. The arrival (onReveal, the keyboard) still waits for rest.
    A tab click glides the row with a smooth scrollTo, which fires scroll
    too, so the mid-swipe mark is held while the row is being steered and
    released at rest or by a touch. Measured: clicking a project four windows
    away lit only that project, nothing in between.

  • Past the last rung the strip scrolls, and the lit tab could be off either
    end. The bar now brings the current project into the strip's view -- the
    whole sleeve when it fits, the lit tab alone when it does not -- with the
    least movement, on a change of activeId and on a resize only, so a strip
    you scrolled by hand is not dragged back by attention's once-a-second render.
    Measured at 390px with five projects (strip 528 vs 277px): swiping the row end
    to end and back, the current project was inside the strip at every step.

🤖 Generated with Claude Code

… screen

Two complaints from using it on a phone, both about the same question -- which
window am I in:

- The tab only moved once the row came to rest. `settleActive` runs on
  `scrollend` (or 140ms after the last scroll event), and a swipe's momentum
  plus the snap is most of a second of the strip naming the window you had
  left. Now, where the row is one window wide, each scroll event asks which
  window covers the middle of the screen and marks it through `onActivate` --
  the mark alone, which writes no `ui`, sends no scroll request and takes no
  focus. The arrival (`onReveal`, the keyboard) still waits for rest.
  A tab click glides the row with a smooth `scrollTo`, which fires `scroll`
  too, so the mid-swipe mark is held while the row is being steered and
  released at rest or by a touch. Measured: clicking a project four windows
  away lit only that project, nothing in between.

- Past the last rung the strip scrolls, and the lit tab could be off either
  end. The bar now brings the current project into the strip's view -- the
  whole sleeve when it fits, the lit tab alone when it does not -- with the
  least movement, on a change of `activeId` and on a resize only, so a strip
  you scrolled by hand is not dragged back by attention's once-a-second render.
  Measured at 390px with five projects (strip 528 vs 277px): swiping the row end
  to end and back, the current project was inside the strip at every step.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@andrin-n-dream
andrin-n-dream merged commit 4e10069 into master Sep 18, 2026
1 check 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