Skip to content

iPhone: the car view with the node view's header, the glass bar and the receipt log (WP12) - #55

Merged
frahlg merged 6 commits into
mainfrom
claude/ios-wp12-car
Oct 14, 2026
Merged

frahlg merged 6 commits into
mainfrom
claude/ios-wp12-car

Conversation

@frahlg

@frahlg frahlg commented Oct 14, 2026

Copy link
Copy Markdown
Member

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 antar in ink3 when it is a guess). The level is never worked out from power; FTW Cloud's lp feeds 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, so 15 kW no longer clips.

The glass bar. Plan · Laddar nu · Pausa in one GlassEffectContainer, at the foot, in the same places whatever the car does; the chosen one is .glassProminent in 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.

  • SENT lights at the tap, before the box hears of it.
  • ACCEPTED lights on cmd.ack.
  • MEASURED lights once the box has the command and lane 0 shows the car doing what was asked, live: 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 this needs a home with one charger.
  • CONFIRMED lights lime on cmd.result.
  • REFUSED takes the last slot in alarm red, with the box's reason in the sentence under the line.

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).
  • NowFitsTests on an iPhone SE (3rd generation), iOS 26.5: 11 of 11 green. It includes Charge now on the car's first screen at the standard size and the largest, and no button moving on a tap.
  • Recording, iPhone 17 Pro simulator, dark, Swedish, against the demo box, which takes 900 ms to a result and 4 s for the charger to ramp. Charge now walks the four slots in the order their evidence comes, then Pause, then Back to the plan; each ends with all four lit (MEASURED for Pause and Back to the plan is the car at rest). Then a finger across the car's plan: 02:30–02:45 · laddar 11 kW · 27,0 öre/kWh. Taps through the simulator, 73 s: wp12-car-dark.mp4

The 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

frahlg and others added 5 commits October 14, 2026 17:34
…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>
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 14, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-14T17:21:57.085607Z a9cb0dc PR opened
ℹ️ 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" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 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)) }

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge 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)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge 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>
@frahlg
frahlg merged commit fd3a608 into main Oct 14, 2026
1 check passed
@frahlg frahlg mentioned this pull request Oct 14, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant