web: a row's menu is the tree's own and speaks only of that row, and only the row being read admits to it

The menu that hangs off a folder is a menu read mid-scan, with the eye still
moving down the column, and it was drawn to the measure of a page rather than of
a list: a box wide enough to be a destination, type the size of a heading. A
catalogue's own context menu is a thing passed over on the way somewhere else —
it is sized to its words and to the row it hangs off, and the reader's eye steps
across it without stopping. The type comes down a point, the rows tighten to the
tree's own measure, and the frame around them thickens to a radius the rows
themselves use. The clamp that keeps it in the window follows the smaller box,
so a menu opened near the right or the bottom edge no longer floats an inch off
the pointer for room it does not use.

A row that is being read has exactly one thing to be asked of it — that it stop
— where a row at rest has the reading that brings it up to date. The menu said
RESCAN either way, greyed while a scan was up, which is a command offered and
refused in the same breath. The two never both apply, so the menu now carries
the one the row is actually in: a roll being read offers STOP SCAN and stops
that roll; a roll at rest offers UPDATE... and reads it again. A row with
folders under it grows a third thing — a fold that closes the branch and not
merely the row, because a reader who is done with a tree means the whole of it
shut, and closing only the row they happened to point at leaves the children
standing open underneath it.

The last is a matter of what a row is allowed to claim. Every row of a roll
spanning the tree spun while that roll was being read, so a reader looking at a
tree of a hundred folders saw a hundred rows each insisting it was the one being
read, when the reading had been pointed at one of them. A row now says it is
being read only when it is the row the reading was kept to — the folder it was
pointed at, which for a whole roll is the roll's own row. A tree that says all
of itself is busy when one branch of it is says nothing a reader can trust.
This commit is contained in:
2026-10-01 19:00:21 +07:00
parent 4f87f022da
commit d5da6ebcba
4 changed files with 86 additions and 33 deletions
+14 -9
View File
@@ -1210,26 +1210,31 @@ button.hint:disabled { cursor: default; }
when the window is narrow. */
.lib-icon { padding: 5px 8px; justify-content: center; }
/* A folder's own menu, on a right click. Fixed, so the tree's own scroll cannot
clip it; the position is clamped to the window when it is drawn. */
clip it; the position is clamped to the window when it is drawn.
Sized after a catalogue's own menu rather than after a page's: it hangs off a
row of a list the reader is scanning with their eyes, and a box of commands as
loud as the list is a box that stops the scanning. The type and the rows are
the tree's own, a shade tighter. */
.lib-menu {
position: fixed;
z-index: 40;
display: flex;
flex-direction: column;
min-width: 170px;
padding: 4px;
min-width: 148px;
padding: 3px;
background: var(--bg-elev);
border: 1px solid var(--border);
border-radius: var(--radius);
border-radius: var(--radius-sm);
box-shadow: var(--shadow);
}
.lib-menu-item {
border: 0;
border-radius: var(--radius-sm);
background: none;
padding: 7px 10px;
font-size: 12px;
letter-spacing: 0.04em;
padding: 4px 7px;
font-size: 11px;
line-height: 1.35;
letter-spacing: 0.03em;
text-align: left;
cursor: pointer;
/* Each command leads with a mark of its own — rename, scan, forget, fold — the
@@ -1237,9 +1242,9 @@ button.hint:disabled { cursor: default; }
column of marks rather than a block of uppercase. */
display: flex;
align-items: center;
gap: 8px;
gap: 7px;
}
.lib-menu-icon { flex: 0 0 auto; width: 12px; text-align: center; opacity: 0.85; }
.lib-menu-icon { flex: 0 0 auto; width: 10px; text-align: center; opacity: 0.85; }
.lib-menu-item:hover:not(:disabled) { background: var(--accent-soft); color: var(--accent); }
.lib-menu-item:disabled { opacity: 0.45; cursor: not-allowed; }