Skip to content

feat(WhereUI): merge continuous planned Timeline stays - #307

Open
kyleve wants to merge 6 commits into
mainfrom
codex/merge-timeline-plan-card
Open

feat(WhereUI): merge continuous planned Timeline stays#307
kyleve wants to merge 6 commits into
mainfrom
codex/merge-timeline-plan-card

Conversation

@kyleve

@kyleve kyleve commented Sep 4, 2026

Copy link
Copy Markdown
Owner

Posted by an AI agent on kve's behalf.

Summary

  • join the current recorded stint and planned continuation into one segmented rounded card when they represent the same continuous stay
  • render a joined plan as a compact, single-line footer with a smaller day badge and lower minimum height while preserving duration-based growth
  • crossfade the recorded fill into the planned fill and diagonal hatch over a 16-point transition, with no border across the shared edge
  • keep different-region and nonconsecutive planned stays as separate full cards
  • show the existing Estimated Time panel after the complete Timeline, with the same forecasts and plan editing controls as Calendar
  • preserve rail markers, ordered accessibility elements, feature visibility, and LFS-backed snapshot coverage

Why

The Timeline previously rendered a planned continuation as a separate rounded card even when it began the day after the current stint in the same region. Giving both joined sections the same full-row minimum also made a short plan look disproportionately large beside the current stay. The compact planned footer makes the continuous stay read as one unit and reduces that minimum-height distortion without making short-plan text unusably small. The trailing estimate panel adds Calendar's forecast context without interrupting that chronological flow.

Review focus

  • joining requires both matching regions and calendar-day adjacency; a recording gap keeps full corners and spacing
  • the joined plan uses a 32-point base height instead of the recorded row's 64-point base, but both add the same day-proportional height
  • the Estimated Time panel is a separate sibling after the zero-spacing journey stack and remains hidden with the feature setting
  • Timeline reuses Calendar's forecast rows, primary-region microprint, and edit/clear behavior
  • accessibility Dynamic Type restores a stacked label/date layout while retaining the full planned-stay VoiceOver label
  • the planned section starts at the recorded fill strength, then fades to the lighter planned fill while the hatch fades in over 16 points

Testing

  • ./swiftformat --lint
  • ./test WhereUITests — 485 tests passed
  • ./test --snapshots --no-generate --no-build --only 'WhereUISnapshotTests/PresenceTimelineListSnapshotTests' --review — 1 snapshot test passed; 15 architecture rule tests passed
  • visually reviewed the trailing estimate panel with joined and ordinary timelines, light appearance, and AX5 Dynamic Type
  • verified the feature-disabled Timeline snapshot remains unchanged
  • installed and launched the preceding joined-card build on Kyle's iPhone 17

: nil
let joinsPlannedStay = if let plannedInterval, let currentStint = stints.last {
plannedInterval.region == currentStint.region
&& CalendarDay(from: currentStint.end, in: report.calendar).adding(days: 1)

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

Posted by an AI agent on kve's behalf.

Review focus: the visual join is deliberately stricter than region equality. Converting the recorded Date through the injected Gregorian calendar and requiring its next CalendarDay to equal the planned start prevents an unrecorded gap from appearing as one continuous stay; the new PlannedStayAfterRecordingGap snapshots pin the fallback.

@kyleve
kyleve enabled auto-merge (squash) September 4, 2026 23:48
@kyleve
kyleve disabled auto-merge September 4, 2026 23:49
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