A rule set is now tested cheapest rule first (numbers, choices and yes/no, then lists and
dates, then text and paths, then smart albums), worked out once per prepared filter and per
smart album, not per photo. Photos matched are the same; the editor still shows the user's order.
While a smart album tests itself, or a chain of smart albums reaches the depth limit, rules are
tested as written, since there an answer can depend on which album is asked first.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- docs/whats-new.md, docs/parity-checklist.md (LR-VIEW-SURVEY row and the
revision-history line): the active-photo ring in Compare, Reference,
Survey and the People view.
- tests_grid.rs: the ring comment matches the paint order.
Co-Authored-By: Claude <noreply@anthropic.com>
The active photo had a 2 px pure white outline and the other selected photos
grey 170, so on Silver and Paper's light grid the active ring vanished and the
two differed by lightness alone. The loading placeholder was a fixed dark grey
slab in every theme.
- theme.rs: new tokens `ring_active`, `ring_inner`, `ring_selected` and
`placeholder`, per theme; tests that every theme's rings stand 3:1 against
the grid and the square grid's cells, and that the placeholder follows the
theme's family
- panels/grid.rs: `selection_ring` draws the active ring as 3 pt (1 pt inner
line against the photo, 2 pt theme line) and the others as 1.5 pt; the grid
uses it for loaded and unloaded thumbnails, and the placeholder token
- panels/detail.rs: the filmstrip uses the same ring and rule
- panels/compare.rs: the compare placeholder uses the token
- tests_grid.rs, tests_filmstrip.rs: painted ring widths and colours in a
light theme, active versus selected versus unselected
- docs/parity-checklist.md, docs/whats-new.md: rows and entry
Co-Authored-By: Claude <noreply@anthropic.com>
The dragged label, the Move Photos question and the toast named a folder by its last name only, so two folders called Home (or two albums called Garden in different album folders) looked the same. When another row has the name, the label now adds the folder it is in. A name nothing else uses is unchanged.
The restore actions use the recorded folder without checking that it still
exists, so an upgrade creates it again rather than using the default folder.
album.setRules with replace (what the rules dialog sends) started from an empty filter and kept only the library folder, so a view of an album saved as a smart album matched the whole library after OK. It keeps the album too, unless the call gives album: null.
`rating:>=3`, `iso:<=400`, `f:>=2.8` read the `=` as part of the number, the
parse failed, and the token silently matched no photo. Parse the two-character
operators first and compare inclusively; `>`, `<`, `=` and bare numbers are
unchanged.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SqKgSkHi5MfTQFrZvDKBjm