oficina / sheets Public

feat/list-chrome: the verbs move to the chrome — review record open

On branch feat/list-chrome

The review record for feat/list-chrome, at b6666e0 on top of core d7cea4f.

What it does

The sheet list opened with two stacked forms — a title field with a Create button, then a dashed drop zone with a file input and four lines of limits — and the sheets themselves began below the fold of both. The verbs move to the chrome and the page becomes a list of sheets.

  • Create is a button beside the account menu. One click makes a sheet called "Untitled sheet" and 303s into it, so you land in a grid you can type into.
  • Rename is the other half of that, and did not exist anywhere in the app before this branch. Without it, removing the title field would have left every sheet permanently called "Untitled sheet" — a degraded product, not a tidier one. POST /sheets/{id}/rename, a real form in the sheet's top bar, sealed at rest like every other title.
  • Import is a page at /sheets/import, not an item in the File menu as originally sketched. Three reasons, and the second is the one that decided it: a dropdown is a poor container for a file picker plus three limits; a hidden file input behind a menu-shaped label never submits itself, so scriptless import would have died silently; and the File menu only exists on a sheet page, so a person with zero sheets would have had no way in at all.
  • Drag and drop stays on the list, without the box. An overlay that is hidden at rest — no paint, no layout, no tab stop — and appears only while a drag carrying files is over the window. It is the same form /sheets/import serves, so a drop is the ordinary multipart POST: one route, one CSRF check, one code path.

What it is verified by

The Go suite and go vet are green. Three browser gates pass in a real Chromium at 1280×800, light and dark: tools/drive/drive.mjs, tools/drive/chrome.mjs (30 checks, including the read-only-viewer suite, which exercises the rename's static-text branch), and tools/drive/drop.mjs (21 checks, new on this branch).

Two defects got through the entire Go suite and were caught only in a browser. Both are now pinned by tests.

  1. Create and Import rendered hard-left beside the nav rather than beside the profile dropdown, because rastrillo's [rst-shell-account] { margin-inline-start: auto } absorbs all the free space. The first fix made it worse — giving the group its own auto margin parked the buttons dead-centre, since flexbox splits free space equally between auto margins. The correct fix moves the margin and has to beat 0-3-0.
  2. The drop overlay carries data-drop, because that is what drop.js looks for, so it also matched [data-drop][data-drop-over] — 0-2-0 against [rst-modal-overlay]'s 0-1-0. The scrim was painted accent-soft and the sheet list disappeared behind a flat blue screen.

Both are specificity arithmetic against the framework's own rules, and both rendered a plausible page that no assertion could distinguish from the right one.

What is outstanding

  • §Review has not run. No highest-capability-model review, and no deployed canary — everything above was verified locally, which AGENTS.md does not accept as a review.
  • New user-facing copy has not been through /copy-review: the import page h1 and subhead, "Choose a file", the drop overlay's "Drop it to import" and its two hint sentences, the empty-state sentence, and the "Rename" button.

What it does not fix, deliberately

#12 — a running import shows "No sheets yet" to a first-time importer. Live on core today; this branch makes it louder by removing the form that sat above the empty state and softened it by accident. Filed rather than fixed because the answer turns on whether the creator may learn their own import is in flight, and "an importing sheet is nobody's until it is finished" is a settled decision with a rule in it.

Note on the history

This branch was force-pushed once to collapse a stale pre-rebase ref (a54233e) that a duplicate branch had superseded. Every commit on the stale ref was patch-identical to one already here — git cherry reported no unique work — and the operator asked for the collapse. Recording it because the ref moved backwards in a way a reader of the history would otherwise have to reconstruct.