Repository navigation
iPhone: the car view with the node view's header, the glass bar and the receipt log (WP12) - #55
Conversation
…e Activity ReceiptLog (FTWShared) is the car command's receipt in the terminal layer: SENT ▸ ACCEPTED ▸ MEASURED ▸ CONFIRMED. Every slot is always on the line and lights only on its own evidence: the local send, the box's cmd.ack, lane 0 showing the car above 42 W while live once the box has the command, and cmd.result. The box often confirms before the car draws, so the slots light in the order their evidence comes. A refusal takes the last slot in alarm red, padded to the same width, so the line never moves. ReceiptRow (FTWCharts) draws it for the Live Activity and, next, the car view. The Charge now Live Activity shows the receipt in place of its three capsules. LoadpointsModel lights MEASURED from lane 0 when the home has one Live Activity up; lane 0 has one car figure for every charger. The card goes stale two minutes after the box last confirmed it (it was fifteen): the app confirms it once a minute while someone looks, and nothing does while it sleeps. The Control still trusts its record for fifteen. The card sits on FTW's ground with SF Pro figures and never glows. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Each charge command's step now carries MEASURED: once the box has the command, lane 0 shows the car doing what was asked, live. That is above 42 W for Charge now, at or below for Pause, and for Back to the plan whatever the plan says for this moment. Lane 0 has one car figure for every charger, so it lights only in a home with one charger. EVText.receipt turns a step into the receipt log: ACCEPTED on cmd.ack, CONFIRMED on cmd.result, and the box's reason in the last slot when it refused, or when something else changed it first. A level's receipt has no MEASURED: lane 0 says nothing about a level. LoadpointsModel serves both receipts. A confirmed charge command waits up to a minute for MEASURED, then stays 20 s and fades; before, it faded 20 s after the result, often before the car had started. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… the receipt log The car view opens on the car node's hero: the power now at 60 pt with its word in violet, and the car's level at 34 pt over the 10-cell meter, with where the level comes from and how old it is, in minutes. The level is never worked out from power. The meter takes the car's colour without glow, because a level is a fact and not a live reading; the car's node view shows it too. Under the hero sit the status line and what the charger does in words. The car's plan for the hours ahead is the car node's Ahead chart: ghost bars for its charging, the price in eight levels under the same slots, a finger that reads each slot, and the plan in one sentence. A finger on the plan leaves the hero on now. The Ahead chart's right gutter is a little wider, so "15 kW" no longer clips. Plan · Charge now · Pause sit in one GlassEffectContainer at the foot, the chosen one prominent in ink. Under them, in room reserved for it, the receipt log on one SF Mono line, SENT ▸ ACCEPTED ▸ MEASURED ▸ CONFIRMED, and the sentence: what the box did, or in alarm red why not. The outcome plays one haptic. No cards: the level, the goal and the demo's cable sit on the ground under mono kickers, with glass chips and buttons. The goal sheet has the ground with raised rows. The old Sent/Received/Done receipt moves to its own file for the mode sheet and the control sheet. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…w's sizes A scaled metric reads the text size where its view is placed, so the cap sits at the car view's placement, as in the node view. At the largest accessibility size the status line was growing past its line. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The bar's hint and its receipt were swapped with an insertion and a removal. A receipt that changes four times in a few seconds left the hint half removed under the receipt line in the simulator. Both now stay in the bar's reserved room and only fade, and the sentence under the receipt cross-fades when it changes. 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. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: a9cb0dcdd6
ℹ️ 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".
| let live = site.isLive | ||
| if ReceiptLog.measures(evW: evW, live: live), let host = activityHost { | ||
| let ids = host.loadpointIDs(home: activityHome) | ||
| if ids.count == 1 { showChargeNow(ids[0], .measured(atMs: site.scheduler.nowMs)) } |
There was a problem hiding this comment.
Require one charger before lighting MEASURED
When a home has multiple chargers but only one Charge now Live Activity, ids.count == 1 is still true even though lane 0 contains aggregate car power. Power drawn by another charger can therefore mark this activity as MEASURED while its own car remains idle. Check the home's charger count, as the car-view receipt does below, rather than the number of active Live Activities.
Useful? React with 👍 / 👎.
| VStack(alignment: .leading, spacing: 6) { | ||
| Kicker(L("Plan")) | ||
| .padding(.horizontal, 20) | ||
| AheadChartArea(site: home.site, node: .car, home: home, scrub: scrub, text: text) |
There was a problem hiding this comment.
Filter the plan chart to the selected charger
For homes with multiple chargers, this single-loadpoint screen embeds AheadChartArea, whose car branch iterates every entry in home.loadpoints.points (NodeHistory.swift:387-394), while the summary immediately below is built only from lp. The chart can consequently show another charger's windows—or fill gaps with them—as though they belong to the selected car; pass or filter by lp.id here.
Useful? React with 👍 / 👎.
The car view extends WP14's receipt log with the slots a command has and MEASURED for the car view; inside each conflict this branch's side is the superset, and everything else comes from main. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
WP12 of the iPhone polish release (Phosphor): the car view in the node view's material, with the receipt log under the glass bar. Design:
design/ftw-ios-polish-2026-10/ftw-ios-redesign.md§15 WP12, §4 (the six TUI details), §6 (the node view), §10 and §12.Paired with the widgets PR (WP14, #54): both carry the first commit, the receipt log. Whichever merges first, the other's copy drops out on rebase.
What changes
The node view's header. The car view opens on the same hero as the car's node view: the power now at 60 pt with the word in violet (
laddar,vilar), and on the right the car's level at 34 pt over the 10-cell meter, with where the level comes from and how old it is (från bilen · för 2 min sedan, minutes, never seconds;FTW antarin ink3 when it is a guess). The level is never worked out from power; FTW Cloud'slpfeeds it as before, with its own age. Under it the status line (● LIVE · EASEE) and what the charger does in words. The meter takes the car's colour without glow, because a level is a fact, not a live reading. The car's node view shows the same meter.The car's plan in the same material. The car node's Ahead chart, on the engine: its charging as ghost bars, the price under the same slots in eight levels by thirds, a finger that reads each slot, and the plan in one sentence under it (
Laddar 01:00–04:47, 42 kWh totalt.). A finger on the plan leaves the hero on now: a plan is not a reading. The Ahead chart's right gutter is a little wider, so15 kWno longer clips.The glass bar.
Plan · Laddar nu · Pausain oneGlassEffectContainer, at the foot, in the same places whatever the car does; the chosen one is.glassProminentin ink, the others plain glass.The receipt log under the bar, in four reserved slots on one SF Mono line:
SKICKAT ▸ MOTTAGET ▸ UPPMÄTT ▸ BEKRÄFTAT.cmd.ack.cmd.result.Each slot lights in the order its evidence comes; the box usually confirms before the car draws. The outcome plays one haptic. A confirmed charge command waits up to a minute for MEASURED, then stays 20 s, then fades. The hint and the receipt share the bar's reserved room and only fade, so a receipt that changes four times in a few seconds leaves nothing half removed. A level's receipt has no MEASURED: lane 0 says nothing about a level.
The rest in the new look. No cards: the level, the goal and the demo's cable sit on the ground under mono kickers, with glass chips and buttons. The goal sheet has FTW's ground with raised rows. The old Sent/Received/Done receipt moved to its own file for the mode sheet and the control sheet, which still use it.
Proof
swift test: FTWShared 188 tests, FTWKit 345 (the live suites skip, as always), all green. New: Charge now walks SENT, ACCEPTED, CONFIRMED, then MEASURED once the demo's charger has ramped, and fades 20 s after its last slot (CarFlowTests); a refused level says why in the last slot and has no MEASURED; what MEASURED means for each command; a level has three slots (ReceiptLogTests).02:30–02:45 · laddar 11 kW · 27,0 öre/kWh. Taps through the simulator, 73 s: wp12-car-dark.mp4The receipt in the bar, from the recording: before, SENT, ACCEPTED, CONFIRMED (the box confirms first), MEASURED (the car draws 11 kW).
Dark while charging, and light after the box confirmed but before the car drew (UPPMÄTT still dark). Then the iPhone SE at the standard size and, dark, at the largest accessibility size.
Not proven here: Charge now on the home box's Easee from Fredrik's iPhone, and an Animation Hitches run on a device. The commits carry no DCO sign-off.
🤖 Generated with Claude Code