The board wears a picture — background becomes a mapping, and the window chrome follows it under a thin frost

background is {color:, image:} and only a mapping at every level; the board's image paints the full window under a transparent title bar, with a thin-material frost strip keeping the chrome legible and the standard accommodations intact.

Claude-Session: https://claude.ai/code/session_014PtZdPwqZuqEDLc6wZMtEy
This commit is contained in:
2026-08-07 10:15:03 -04:00
parent 190a8e36f1
commit d5ad21c3da
37 changed files with 1182 additions and 76 deletions
+15
View File
@@ -88,6 +88,21 @@ public struct BoardModel: Sendable, Equatable {
public let deleted: FieldValue<Date>
public let background: FieldValue<String>
/// The `background` mapping's `image` subkey a path **relative to `rootURL`**
/// (01-storage-format.md § Frontmatter; 03-board-ui.md § Styling Capabilities).
///
/// **Board-level only**, which is why `Lane` and `Card` carry no twin: a lane's and a card's
/// colour are edge accents, and there is nothing at those levels an image could fill. The
/// shared reader still accepts the mapping at every level for the colour's sake one key, one
/// reading but this half has exactly one consumer, the board window's backdrop.
///
/// A **reading, not a location**: the path is resolved (and required to stay inside the board)
/// where it is drawn, `BoardBackdrop.imageURL(named:inBoardRoot:)`, so a value that leads
/// nowhere paints nothing and stays on disk exactly as written the same lenient degrade an
/// unrecognized colour gets.
public let backgroundImage: FieldValue<String>
public let icon: FieldValue<String>
public let iconColor: FieldValue<String>