{{/* The verbs live in the top bar; the page is the list. This screen used to open 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. A list of sheets should be a list of sheets. Create is a button beside the account menu now, and makes a sheet called "Untitled sheet" in one click; the name is fixed afterwards by renaming it in the top bar of the sheet itself, which is what handlers_rename.go is for. Import moved to a page of its own at /sheets/import — see handleImportPage for why a page and not an item in the File menu. */}} {{define "head"}} {{/* Drag and drop, and only that. The overlay at the foot of this file is hidden until a file is dragged over the window, and every drop ends as a submit of the same form /sheets/import serves — same route, same CSRF check, same job. With scripting off it never appears and the Import link in the top bar is the entire feature. That is what AGENTS.md's "every drag-only affordance needs a menu equivalent" asks for: the link is the floor, and the drag is a shortcut to it. */}} {{end}} {{/* Import and Create are the bar's page actions (handleSheetList builds them as estilo chrome.Actions): buttons beside the account at wide widths, rows in the Menu sheet below 800px. Create is a POST in both places. They used to be an extra block in the rastrillo tail, whose buttons were taller than the bar and grew it from 45px to 51px. */}} {{define "content"}}
{{/* "All sheets", not "Your sheets". The old heading was wrong twice: it repeated the brand in the bar directly above it, and it claimed ownership the line underneath immediately contradicts — everyone on the instance opens every sheet here, so almost none of these are yours. A heading its own subtitle corrects is worse than none. */}}

All sheets

Everyone on this instance can open every sheet here.

{{if .Data.Sheets}} {{else}} {{/* The empty state points at the two controls in the top bar. It used to say "make one above", which was true when the form was directly above it and would now be a sentence pointing at a header. An empty screen is the one place in a product that has nothing to do but explain what to do next. */}}

No sheets yet

Create one from the top bar and it opens with a blank grid you can type into straight away, or import an Excel file to start from what you already have.

{{end}} {{/* The drop target for the whole page. This screen used to carry a dashed box you could drop a file on, and taking the box away took the drop with it — so the drop comes back without the box. It is `hidden` at rest, contributes nothing to the layout and nothing to the tab order, and drop.js reveals it only while a drag carrying files is actually over the window. An affordance that appears exactly when it applies beats a permanent rectangle explaining that it exists. It is the same form as the one on /sheets/import, deliberately: drop.js fills this file input and submits this form, so a drop from here is the ordinary multipart POST and there is no second code path on the server. The file field is visible inside the panel rather than hidden, because a refused drop ("drop one file at a time") needs something to recover with that is not the back button. `hidden` is load-bearing and is asserted in a test: rst-modal-overlay sets display:flex, an author rule beats the UA's [hidden], and without the reinstating rule in sheets.css this would cover the list permanently. */}} {{end}}