Skip to content

feat(ios): the plan as a clock, with Now's strip under it - #140

Merged
frahlg merged 4 commits into
mainfrom
ios-plan-clock
Nov 1, 2026
Merged

frahlg merged 4 commits into
mainfrom
ios-plan-clock

Conversation

@frahlg

@frahlg frahlg commented Nov 1, 2026

Copy link
Copy Markdown
Member

Why

Erik, 1 November 2026, about the plan dial: 18 is not straight down as on a normal clock, so you lose the feel for when things happen and have to read the figures at the edge. Fredrik said yes to a twelve-hour clock and to round 3 of the design canvas ("Planen, runda 3": E2 as the dial, D as the lanes, a switch between them, proposal 5's style). This is step 3 of four. It stacks on #139, which stacks on #138.

Change

  • The dial is a clock. PlanDial turns once in twelve hours (48 quarters), 12 at the top and 18 straight down. The turn's whole hours sit round the rim as the household's clock reads them, none on the hand or the seam.
  • Ticks show the battery, not the price. A tick is as long as the battery's planned power against the most it moves in the turn (at least 1 kW). Gold gives power, as on the strip under it, and cyan stores. A quarter in which it waits is a stub. The sun stays a thin dashed arc on the rim. The price leaves the dial.
  • Now's strip under the dial and as the lanes. The plan view shows the same PlanStripView as Now: the passes, the price from zero and the chosen pass's figures. A tap on a pass also lights its ticks on the dial. The lanes run the whole plan (PlanStrip.build(quarters:)) with the battery's planned level in a row of its own, coloured by what the battery does. In the plan the strip opens nothing and a drag scrolls the page, so it does not scrub.
  • What goes. The Swift Charts lanes, the story under the dial and the rows under the lanes. The figures say what they said. The legend stays, in the new colours.
  • One face everywhere. The widget's dial and the watch draw the same face, so they become a twelve-hour clock with battery ticks too. The Crown steps 48 quarters.
  • CLAUDE.md. The dial rules are rewritten: a clock, ticks as power, gold for giving on the dial (round 3), the price in the strip under it.

Evidence

  • swift test in appleApp/FTWKit: 636 tests in 95 suites and 344 Swift Testing tests pass locally. New: theHoursSitWhereAClockHasThem, aTickIsTheBatterysPower, eighteenSitsStraightDown. The dial tests that assumed a day now use a turn of twelve hours.
  • Built for the iOS Simulator (FTW scheme, with the watch). Demo on an iPhone 17, iOS 26.5:
Clock Lanes Clock, light

Close-ups: the strip under the clock, the lanes.

Not checked

  • The watch app and the dial widget in their own simulators. Both compile, and their face is the one shown here.
  • VoiceOver, the largest text size and a device.
  • A tap on the dial's ring does not choose a pass; the strip's lanes do.

🤖 Generated with Claude Code

frahlg and others added 3 commits November 1, 2026 15:11
Erik, 1 November 2026: Now's strip made 450 against 550 öre look five
times dearer. It put the window's cheapest quarter at the floor and the
dearest at the top.

Every price bar now reads one PriceScale: zero at the foot and a round
top just over the dearest (1, 1.5, 2, 2.5, 3, 4, 5, 6 or 8 times a power
of ten). Now's strip draws the bars from zero, marks half the top and the
top with figures in a gutter on the right, and carries the price now on
as a dashed line. A price below zero hangs under the zero line. The dial's
ticks, the lock-screen glyphs, the plan widget and the watch's bars take
the same scale in eight steps.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Fredrik picked proposal 5 for Now on 1 November 2026. Each run of the
battery and each car window on the strip is a pass (PlanPass, FTWShared,
tested). A tap chooses one: it stands in full colour over a faint column
of its colour, the bars under it take that colour, and three figures
under the strip say when it runs, what it does to the level and the
price it meets. The strip opens on the battery's run under way or next.
A run on spare sun says it buys nothing. With no pass, the sentence
stays; under a finger, the quarter's line still takes its place.

The colours are Phosphor's, not the proposal's: gold gives power, cyan
stores, violet for the car. Nothing glows, since a plan is not live.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Erik, 1 November 2026: on the 24-hour dial 18 is not straight down as on
a clock, so you lose the feel for when things happen and have to read the
figures at the edge. Fredrik said yes to round 3 of the design canvas the
same day.

- The dial is a clock: one turn is the next twelve hours, 12 at the top
  and 18 straight down, with the turn's whole hours round the rim. Its
  ticks are as long as the battery's planned power and coloured by what
  it does, gold giving power as on the strip, cyan storing. The price
  leaves the dial. The phone, its widget and the watch draw the same face.
- Under the dial, and as the lanes, the plan shows Now's strip: the
  passes, the price from zero and the chosen pass's figures. A tap on a
  pass lights its ticks on the dial. The lanes run the whole plan with
  the battery's level in a row of its own.
- The old lanes, the story under the dial and the rows under the lanes
  go; the figures say what they said. CLAUDE.md's dial rules follow.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Nov 1, 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-11-01T14:30:18.680100Z 01b1f44 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: 01b1f449b6

ℹ️ 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".

Comment on lines +61 to +64
if !grey, lit != nil {
ticks(g, .gives, lit: true).fill(Theme.gives)
ticks(g, .stores, lit: true).fill(Theme.stores)
}

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 Keep selected battery ticks visible for stale plans

When the phone displays a cached or otherwise grey plan that still contains a battery pass, PlanBody automatically supplies that pass's time range as lit. The lit: false paths exclude every tick inside that range, but this !grey condition prevents the complementary paths from being drawn. Consequently, the selected battery run disappears entirely instead of remaining visible in the stale-plan colour; if it is the only run, all active battery ticks disappear. Ignore the selection filter when grey, or draw the selected paths using Theme.oldPlan.

Useful? React with 👍 / 👎.

… ci]

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@frahlg
frahlg changed the base branch from ios-now-passes to main November 1, 2026 17:49
@frahlg
frahlg merged commit 9d0d63b into main Nov 1, 2026
@frahlg
frahlg deleted the ios-plan-clock branch November 1, 2026 17:50
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