fix(library): a reading that never finished no longer says nought

`saveWalkedDirs` filled in a nought beside every folder a reading had listed but
never opened. A reading stopped by a closed tab, and one kept to a branch, list
the rest of the roll before they have been into any of it — 484 folders of one
real roll read empty over tens of thousands of frames — and the record is folded
back into itself, so the noughts stayed.

Only a reading that met the whole roll may say nought now (`WalkedDirs.full`), and
the screen drops a nought from a record that does not say so. An old record has no
word to give, so its rows fall back on the catalogue instead.

feat(library): search Immich from the filter row

One box, one query, one node: the backend reads what is typed as a tag name when
the key can see one and as a file name otherwise, and the answer is filed under the
node itself. A share link searches its one album in place. The box is not a filter —
it leaves the shelf, which is what the md's search permission is for.

feat(ui): a shorter status line, and a wall that keeps its own row height

The status line is one short 12px row at the foot of the library. A wall with fewer
frames than there are columns no longer stretches its one row — and the cards' own
borders with it — down to the stage.
This commit is contained in:
2026-10-10 18:27:49 +07:00
parent edd7b8497b
commit b3b9ed0193
8 changed files with 267 additions and 34 deletions
+8 -3
View File
@@ -1291,8 +1291,9 @@ form[data-key='immich-modal'] {
/* The one line of word a reading has: what it scanned, what it repaired, what it
is doing now. It sits at the foot of the column and is always there, so the
frame above it does not move when a note comes and goes — hence the fixed
height, and `:empty` hiding the ink rather than the row. */
.lib-root .lib-status { flex: 0 0 auto; min-height: 18px; margin: 6px 0 12px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
height, and `:empty` hiding the ink rather than the row. Kept to one short line
at 12px: it is news, not content, and the wall above it is the point. */
.lib-root .lib-status { flex: 0 0 auto; min-height: 14px; margin: 2px 0 6px; font-size: 12px; line-height: 1.2; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.lib-root .lib-status:empty { visibility: hidden; }
/* The column: title and the folder's own chips stay put, the split takes what
is left, the strip keeps its natural height on the bottom. */
@@ -1371,7 +1372,11 @@ form[data-key='immich-modal'] {
}
/* All thumbs: the wall scrolls down inside the stage, and its own scrollbar on
the right edge is what reaches the frames below. */
.lib-root .adm-grid { flex: 1 1 auto; min-height: 0; overflow-y: auto; padding-right: 6px; overflow-anchor: none; }
/* `align-content: start`, because the grid is stretched to the stage: a wall with
fewer frames than there are columns is one row, and a stretched row makes every
card's border that much taller than the picture inside it. Rows keep the height
their own frames give them however few of them there are. */
.lib-root .adm-grid { flex: 1 1 auto; min-height: 0; overflow-y: auto; padding-right: 6px; overflow-anchor: none; align-content: start; }
/* What the thumbnail wall is read through: the four selects and the count of what
is left. One row above the wall, and it does not scroll with it. */
.lib-root .adm-stage > .lib-filters,