Repository navigation
iPhone: the Phosphor palette and type (WP2) - #36
Conversation
The app gets its own palette and type, as Fredrik decided on 13 Oct: a blue-black ground, an ink interface, no orange, and the grid in magenta both ways. - Thirteen roles in Display P3 replace the sixteen web-token sets. They live in FTWCharts/Theme.xcassets, which the app and the widgets both build, and FTWCharts/Palette.swift names them for both. - The 0.3 names point at the new roles, so every screen changes at once. Where an old name meant two things, each use now says which: errors and warnings are alarm, confirmed outcomes are live, an age that is not live is ink2, and a battery that gives power is gives. - The system tint is ink and the launch screen is the ground. - Prices are ink by level, never red and green. - Figures are SF Pro with even digits (Theme.figure); Theme.mono is the terminal layer, used by kickers and the box's fingerprint. - Card keeps its spacing and draws no fill or border. - Switches are lime when on: an ink track would hide the white knob in dark mode. - The widgets read the shared palette; Grid today draws the grid in magenta. The Live Activity and the Charge now control use the car's violet. - The app icon's bolt is FTW's gold on the ground, the last orange in the target. - ThemeTests checks P3, contrast, Increase Contrast, the tint and the launch colour, and fails on any orange or any colour written in code. - CLAUDE.md gets the look's rules and new design references. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
Seven rules that outlive the polish release: the phone's own cache first, the fastest live path, no ticking seconds, a small control mark, charts with volume, a small smooth flow, and TUI without bloat. They sit at the top of the look's section. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: ee6a95d6fe
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| yEnd: .value("Price", Self.priceFloor + Self.priceRise * max(0, bar.minor) / top) | ||
| ) | ||
| .foregroundStyle(grey ? Theme.fgMuted : PriceBars.color(bar.tone)) | ||
| .foregroundStyle(grey ? Theme.fgMuted : Theme.price(bar.tone)) |
There was a problem hiding this comment.
Avoid applying opacity twice to price bars
Theme.price already encodes the intended cheap/flat/dear strengths as 0.32/0.50/0.80 alpha, but this chart retains the following .opacity(0.4), reducing the effective values to 0.128/0.20/0.32 and making the cheaper bars especially faint. The plan widget has the same issue through Tone.of(bar.tone) followed by .opacity(0.4); apply the existing dimming only to the grey state, or otherwise avoid multiplying the full-color price alpha.
Useful? React with 👍 / 👎.
WP2 of the polish release: the app gets its own palette and type, as Fredrik decided on 13 Oct (decisions 1 and 3). The ground is blue-black, the interface is ink, there is no orange, and the grid is magenta both ways. Every screen changes at once; no layout moves.
What changes
ground,raised,hairline;ink,ink2,ink3;solar,gives,stores,grid,car;live,alarm.appleApp/FTWCharts/Theme.xcassets, andFTWCharts/Palette.swiftnames the roles. Both targets build that folder. The widgets' hex copies (Tonepairs,Pair,GridColors) are gone.fgis ink,surfaceis the ground,accentis ink, and so on). Where an old name meant two things, each use now says which: an error, a refusal or a warning isalarm; a confirmed outcome islive; an age that is not live isink2; a battery giving power isgives.importing,exportingandgenerationare gone.Theme.priceserves the app and the widgets;PriceChart.swiftis gone.live.Theme.figure) in place of bold SF Mono (Theme.number), so the slashed zero and the wide decimal gap go.Theme.monois the terminal layer; kickers and the box's fingerprint on pairing use it now.Cardkeeps its spacing and draws no fill and no border.#FFB000) on the ground, where it was#FFAC41on#0D0D0D. It was the last orange in the target. Small, but it is the home-screen icon, so say if it should stay as it was.CLAUDE.mdgets Fredrik's seven standing rules from 13 Oct (the phone's own cache first, the fastest live path, no ticking seconds, a small control mark, charts with volume, a small smooth flow, TUI without bloat), the look's rules (light means live, three tenses, colour is energy, no cards, type, the six TUI details, one palette source) and a new design references table.Not here
The rest is layout, and other packages own it: Now's control card, plan card and node bubbles (WP8, WP9), the node views (WP6), the price chart (WP3), the plan view (WP11), and pairing, About and FTW Cloud (WP15). Those hand-made panels now draw in
raisedwith ahairlineborder; in dark mode that sits close to the ground. The web tokens and the box'stheme.cssstay as they are. No glow and no new motion yet: WP9 brings them.Two departures from the design
ink3is#727D90, one step lighter than#717C8F. The design's value reaches 4.48:1 onraisedlist rows; this one reaches 4.54:1.appleApp/FTW/UI/. It lives inappleApp/FTWCharts/because both targets build that folder, which is how the widgets read the same source.Contrast
WCAG ratios from the colour sets, with Display P3 luminance, as
ThemeTestscomputes them.#05080F#F5F6F8#0B111C#FFFFFF#1B2433#DCE0E7#EEF3FF#0A0F1A#9AA5B8#545E70#727D90#677184#FFE14D#8A6C00#FFB000#A35700#18D9FF#00739A#FF5FA8#C2186F#B69CFF#6A48D8#83F52C#2F7A00#FF453A#D70015#9AA5B8#545E70Inverse video, ground on ink: 18.0 dark, 17.7 light. Ground on alarm (the danger button): 6.2 dark, 4.7 light.
Screens
From the demo, on an iPhone SE (3rd generation) and an iPhone 17 Pro Max, iOS 26.5, in dark, light and the largest text size (Accessibility XXXL, dark). Each picture puts before beside after; SE on top, Pro Max below.
Now
Node views
Car
Plan and price
Mode sheet, and its switch turned on (Pro Max, after)
Pairing and About
Widgets (17 Pro): Grid today, price, plan
App icon
Tests
swift testinappleApp/FTWKit: 105 (FTWShared) and 277 (FTWKit) pass.ThemeTestsnow checks that every role is Display P3 with a dark variant; that ink, ink2 and ink3 reach 4.5:1 on ground and raised in light, dark and Increase Contrast; that energy colours reach 4.5:1 in light and 7:1 in dark, and states 4.5:1 in both; that Increase Contrast turns ink3 into ink2; thatAccentColoris ink andLaunchBackgroundthe ground; and that no Swift, JSON or SVG file underFTW,FTWCharts,FTWWidgetsorFTWNotifyholds#DA7F00or#FFAC41or writes a colour in code. I planted a file with both to see it fail.GridTodayShareTestschecks that the grid widget draws in the grid role and in no other energy's hue.assetutil).Not done: a recording and an Animation Hitches run from a device. This PR changes colour and type only and adds no motion; WP9 and later bring the motion that needs them.
🤖 Generated with Claude Code