Apply posta web palette + dark mode to PostaMac and iOS #2

Merged
arne merged 2 commits from theming into main 2026-05-14 18:27:53 +02:00
Owner

Summary

  • Introduces a shared Theme palette (paper / ink / sky / forest / lantern / surface) mirroring web/static/style.css for light mode and the mark-night.svg night aesthetic for dark mode.
  • Each token resolves dynamically via a Color(light:dark:) helper that branches on the system appearance (UITraitCollection on iOS, NSAppearance on Mac).
  • Apps now follow system appearance — .preferredColorScheme(.light) has been removed from both RootViews.

What's themed

Mac (PostaMac/)

  • Paper-cream window background, transparent toolbar, paperDeep main / paperShade composer footer.
  • Forest + paperWarm message bubbles.
  • Custom inset moss selection pill (no List(selection:)) so the pill stays green regardless of focus instead of falling back to the system unemphasized gray.

iOS (Posta/ + PostaFeatures)

  • PaperDeep behind the root; paperWarm section rows in SettingsSheet / AddContactSheet; .scrollContentBackground(.hidden) everywhere a Form/List would otherwise paint over it.
  • Gold-on-forest contact monograms.
  • Forest / paperWarm thread bubbles with Liquid Glass overlay preserved.
  • PaperShade composer bar.
  • Terracotta row + white label for the destructive "Remove this account" button.
  • Global UINavigationBar title set to the system serif design (New York) via UIKit appearance proxy.

Dark mode

Dark palette derives from web/static/mark-night.svg:

  • Backgrounds: night-sky blue tones (#1f2a3a#0e1722).
  • Text: paper tones (paper / cool dim grays).
  • Forest / forestDeep unchanged (read well on dark).
  • Moss lifted slightly so the sidebar selection stays visible on dark.
  • Gold / sunset / terracotta unchanged — warm accents work on dark.
  • Surface line tokens flip to white at 10% / 6%.

Test plan

  • Build PostaMac and PostaiOS in Debug.
  • Pair Mac client, walk: paper-cream window, sidebar selection pill (active + after focus shift), composer + bubbles.
  • Pair iOS, walk: contact list (paper + gold monograms), thread (bubbles + composer footer), add contact, settings (sections + destructive row).
  • Toggle system appearance to dark on both Mac and iOS; verify night palette engages and no surface remains stuck on light.
## Summary - Introduces a shared `Theme` palette (paper / ink / sky / forest / lantern / surface) mirroring `web/static/style.css` for light mode and the `mark-night.svg` night aesthetic for dark mode. - Each token resolves dynamically via a `Color(light:dark:)` helper that branches on the system appearance (UITraitCollection on iOS, NSAppearance on Mac). - Apps now follow system appearance — `.preferredColorScheme(.light)` has been removed from both `RootView`s. ## What's themed ### Mac (PostaMac/) - Paper-cream window background, transparent toolbar, paperDeep main / paperShade composer footer. - Forest + paperWarm message bubbles. - Custom inset moss selection pill (no `List(selection:)`) so the pill stays green regardless of focus instead of falling back to the system unemphasized gray. ### iOS (Posta/ + PostaFeatures) - PaperDeep behind the root; paperWarm section rows in `SettingsSheet` / `AddContactSheet`; `.scrollContentBackground(.hidden)` everywhere a Form/List would otherwise paint over it. - Gold-on-forest contact monograms. - Forest / paperWarm thread bubbles with Liquid Glass overlay preserved. - PaperShade composer bar. - Terracotta row + white label for the destructive \"Remove this account\" button. - Global `UINavigationBar` title set to the system serif design (New York) via UIKit appearance proxy. ## Dark mode Dark palette derives from `web/static/mark-night.svg`: - Backgrounds: night-sky blue tones (`#1f2a3a` → `#0e1722`). - Text: paper tones (paper / cool dim grays). - Forest / forestDeep unchanged (read well on dark). - Moss lifted slightly so the sidebar selection stays visible on dark. - Gold / sunset / terracotta unchanged — warm accents work on dark. - Surface line tokens flip to white at 10% / 6%. ## Test plan - [x] Build PostaMac and PostaiOS in Debug. - [x] Pair Mac client, walk: paper-cream window, sidebar selection pill (active + after focus shift), composer + bubbles. - [x] Pair iOS, walk: contact list (paper + gold monograms), thread (bubbles + composer footer), add contact, settings (sections + destructive row). - [ ] Toggle system appearance to dark on both Mac and iOS; verify night palette engages and no surface remains stuck on light.
Introduce a Theme palette (paper/ink/sky/forest/lantern) mirroring the
web tokens so the Mac and iOS clients share the same warm-paper look as
posta.example. Both apps force light scheme for now; dark variants
arrive later.

Mac (PostaMac/): paper-cream window, transparent toolbar, forest/paperWarm
message bubbles, moss-tinted custom sidebar selection pill rendered via
listRowBackground (escapes the system unemphasized-selection gray).

iOS (Posta/ + PostaFeatures): paperDeep behind the root, paperWarm
section rows in settings/add-contact, gold-on-forest contact monograms,
forest/paperWarm thread bubbles, paperShade composer bar, terracotta
destructive-button row, plus a global UINavigationBar serif title
(New York) via UIKit appearance proxy.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Each token in PostaMac/Theme.swift and PostaFeatures/Theme.swift now
resolves through a Color(light:dark:) helper that branches on system
appearance (UITraitCollection on iOS, NSAppearance on macOS).

Dark values draw from the night-mood mark-night.svg: deep blue paper
tones (#1f2a3a → #0e1722), paper text on dark, lifted moss for
selection visibility, and unchanged warm accents (gold / sunset /
terracotta) that already read well on dark.

Removing .preferredColorScheme(.light) from both RootViews so the
apps now follow the OS appearance setting.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
arne merged commit 5240db6187 into main 2026-05-14 18:27:53 +02:00
arne deleted branch theming 2026-05-14 18:27:53 +02:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
posta/ios!2
No description provided.