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 restore actions use the recorded folder without checking that it still
exists, so an upgrade creates it again rather than using the default folder.
The policy check now reads the compiled AppSearch and RegLocator rows for the
remembered-folder properties (registry root, key, value name and type for both
scopes) and runs the DIR, FOLDER, PATH and legacy exe actions in sequence order
against seeded values, so their precedence and the preset-folder guard cannot
regress. It also replays the wizard folder actions in sequence order (a
remembered folder beats the new-install default, a typed folder beats both) and
requires the machine restore action between the scope page and costing.
The pre-signing check matched any folder named Program Files, so it rejected
a valid MSI when Windows resolves Program Files elsewhere, accepted the 64-bit
root for an x86 package and accepted a different app name. Build the expected
folder from the package architecture's resolved root and the policy name.