Skip to content

Make the tool cursor actually change, and stop the dock hiding two tabs - #28

Merged
ibrahimweng merged 1 commit into
mainfrom
claude/tool-cursors
Aug 30, 2026
Merged

Make the tool cursor actually change, and stop the dock hiding two tabs#28
ibrahimweng merged 1 commit into
mainfrom
claude/tool-cursors

Conversation

@ibrahimweng

Copy link
Copy Markdown
Owner

Two faults, both found by looking rather than by reading.

The tool cursor did nothing at all

It was set on the timeline viewport, and every surface inside it carries a
cursor of its own — a sound says grab, an empty lane says copy, the ruler
says ew-resize, a curve says crosshair. A cursor on the parent loses to
every one of them, so picking up the blade or the hand changed nothing you
could see.

Measured across six tools and nine surfaces, all six rows came back
identical
. I claimed in #23 that the pointer says which tool is holding it.
It never did — I set it in one place and never checked it arrived.

Each rule names the descendants now, which also outranks them:

tool cursor
Move contextual — grab over a sound, I-beam over a name it can rename
Range I-beam
Cut a drawn blade
Hand grab, → grabbing while dragging
Zoom zoom-in, and zoom-out while alt is held
Pen a drawn nib

It stops at the viewport rather than covering the whole panel, since that is
where these tools act — the toolbar and the layer names keep their own
pointers because they still do their own jobs. Move is deliberately left
alone: its contextual cursors are both what a selection tool should do and
more use than one shape over everything.

Cut and Pen are drawn rather than named because every standard cursor that
suits one suits the other — both are "put this exact point somewhere", which
is crosshair — so naming them would have given two of six tools the same
pointer and lost exactly the distinction this is for. They are the same shapes
as the buttons in the strip.

Those drawn cursors shipped broken first. Written out plainly, with raw
angle brackets and quotes, the browser accepts the declaration and reports it
back from getComputedStyle intact, then silently fails to decode the image
and falls through to the crosshair after the comma. Nothing says so anywhere.
It only came out by building an Image from the computed value to see whether
it loaded. Percent-encoded, both decode as 22×22.

The dock was hiding two tabs

Found by building main the way Vercel does and comparing the artifact against
the design.

Six tab names do not fit a 340px column. The strip scrolled sideways with the
scrollbar hidden, leaving "Session" and "Palette" 75px past the edge with
nothing saying they were there. A tab is how you reach a panel, so two of the
six were reachable only by dragging or through the Window menu.

That is the same silent overflow the top bar had before #20, shipped again
somewhere narrower. The strip wraps now: a row of height when the column is
narrow, nothing when it is wide, and no width at which something is missing.

Checks

tsc --noEmit clean, 199 tests passing, vite build clean.

Verified in Chromium: the computed cursor over nine surfaces for each of the
six tools (five now distinct, Move contextual by design), both drawn cursors
decoding as real images, alt flipping zoom-in to zoom-out and back, and all
six dock tabs measured as on-screen at 340px.


Generated by Claude Code

Two faults, both found by looking rather than by reading.

The tool cursor did nothing at all. It was set on the timeline viewport, and
every surface inside it carries a cursor of its own: a sound says grab, an
empty lane says copy, the ruler says ew-resize, a curve says crosshair. A
cursor on the parent loses to every one of them, so picking up the blade or
the hand changed nothing you could see. Measured across six tools and nine
surfaces, all six rows came back identical. I claimed at the time that the
pointer says which tool is holding it; it never did, because I set it in one
place and never checked it arrived.

Each rule names the descendants as well now, which also outranks them. It
stops at the viewport rather than covering the whole panel, since that is
where these tools act -- the toolbar and the layer names keep their own
pointers because they still do their own jobs. Move is deliberately left
alone: its cursor is the contextual one each surface already sets, which is
both what a selection tool should do and more use than one shape everywhere.

Cut and Pen are drawn rather than named. Every standard cursor that suits one
suits the other -- both are "put this exact point somewhere", which is
crosshair -- so naming them would have given two of the six tools the same
pointer and lost the distinction this is for. They are the same shapes as the
buttons in the strip, so what is in your hand looks like what you clicked.
And alt over the zoom tool now shows zoom-out, since that tool does both jobs
off one button and there was otherwise no way to tell which a click would do.

Those drawn cursors shipped broken first. Written out plainly, with raw angle
brackets and quotes, the browser accepts the declaration and reports it back
from getComputedStyle intact, then silently fails to decode the image and
falls through to the crosshair after the comma. Nothing says so anywhere. It
only came out by building an Image from the computed value to see whether it
loaded; percent encoded, both decode.

The second fault came out of comparing the built artifact against the design.
Six tab names do not fit a 340 pixel column: the strip scrolled sideways with
the scrollbar hidden, leaving "Session" and "Palette" 75 pixels past the edge
with nothing saying they were there. A tab is how you reach a panel, so two
of the six were reachable only by dragging or through the Window menu. That
is the same silent overflow the top bar used to have, shipped again somewhere
narrower. The strip wraps now: a row of height when the column is narrow,
nothing when it is wide, and no width at which something is missing.
@vercel

vercel Bot commented Aug 30, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
beat-studio Ready Ready Preview Aug 30, 2026 12:34am

@ibrahimweng
ibrahimweng merged commit fbc84a6 into main Aug 30, 2026
4 checks passed
@ibrahimweng
ibrahimweng deleted the claude/tool-cursors branch August 30, 2026 00:44
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