feat(mobile): Week/Interval calendar views + horizontal-scroll time-grid (parity with web) - #339
Conversation
#326/#333 shipped the calendar Week (7-day) and Interval (N-day) time-grid views to apps/web only. Mirror them to apps/mobile for cross-platform parity. Mobile: - Mês / Semana / Intervalo view switch on the calendar screen. - Week view: 7-day time grid with week-granularity nav + show-recurring toggle. - Interval view: range-picker mini-calendar (14-day cap + clamped notice) plus an N-day time grid + show-recurring toggle. - New CalendarTimeGrid, CalendarWeekView, CalendarRangeView, ShowRecurringToggle and CalendarWeekNav; CalendarGrid gains an optional range-highlight mode; useCalendarRange hook. Shared: - Lift clampRangeToMaxDays + MAX_RANGE_DAYS from apps/web/lib/calendar-range to packages/shared/src/utils/calendar-range.ts so both platforms consume one copy (web re-points its import; no duplication). filterRecurringEntries was already shared and is reused. Web: - Make the shared CalendarTimeGrid horizontally scrollable: day columns keep an ~80px minimum width and scroll left/right with the left time gutter and the header/all-day rows pinned, instead of compressing at narrow widths. Applies to both the web week and interval views; mobile mirrors the same behavior. Tests: shared 14-day clamp; mobile time-grid render (timed + all-day, N columns, header tap), view switch, and show-recurring filtering. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub. 1 Skipped Deployment
|
|
There was a problem hiding this comment.
PR Review APPROVE. No Critical/High findings. MEDIUM-1: CalendarTimeGrid body spans 186 lines (320-506), nearly double 100-line hard cap. Extract GutterColumn, ColumnHeaderRow, AllDayRow, BodyScrollArea as sub-components. MEDIUM-2: JSDoc on unexported layoutTimed (lines 94-96) violates comment policy (JSDoc only on exported symbols). Delete the comment. Positive: range-pick vs day-select split correct; horizontal-scroll architecture sound (gutter pinned outside ScrollView, syncGutter); shared utility extraction clean (clampRangeToMaxDays/MAX_RANGE_DAYS in packages/shared, web re-import updated); tests behavioral; no any; no raw slate/hardcoded rgba; i18n parity (12 keys in en.json and pt-BR.json same commit); no backward-compat risk (additive exports only). Subagents: parity-checker PAIRED, i18n-syncer IN SYNC, contract-aligner N/A, orbit-api not verifiable in CI.
…hours (#341) In the week and interval time-grid (#339), the three pinned panes (the day-header row, the "DIA INTEIRO" all-day band, and the left hour gutter) were backed by --bg-card, which is translucent on dark (alpha 0.04). As the hourly body scrolled underneath, the gutter hour labels and day-column content bled through the all-day band (the 8:00 label rendered behind it) and through the gutter. The z-index layering (z-3 header, z-2 band, z-1 gutter) was already correct; only the backdrop was see-through. Back the pinned panes with an opaque equivalent of the card surface (opaque --bg canvas plus the --bg-card tint layered on top) so they fully occlude the scrolling content while matching the card's appearance. The all-day band now reads as its own zone with the hourly grid cleanly below it, and the horizontal scroll plus pinned gutter still work. Mobile already isolates the zones with separate clipped scroll regions and a reserved all-day band height, so it never had the overlap and needs no change. Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…he five missing surfaces (#36) The canvas is the design of record now, and nothing said so where a worker would read it. /orchestrate reads the ticket, not the project. Twenty one existing tickets gained a comment naming the document that defines their surface. Their bodies were already corrected against D69 on 2026-08-16, so the comment adds the drawing rather than restating the job, and says plainly that the document is the later artefact where the two differ. Five surfaces gained a document in this run and had no ticket at all: #335 the notification bell and its list Orbit Avisos #336 search results, including which matched Orbit Busca #337 the step up code screen Orbit Verificacao #338 the error and static surfaces Orbit Estados #339 offline, and the dropped change Orbit Offline #335 is ordered behind #334, because rewriting the client while the server still writes /streak leaves the two disagreeing. #336 needs no API work at all: the server already returns searchMatches and computeHabitMatchBadges has zero consumers, so the app has been throwing away a better result than it draws. D4, the fourth system round, landed five of nine. The canvas read the whole brief, judged it lacked the headroom to build nine components plus their cards without leaving the system half edited, and wrote nothing that round rather than risk it. Sheet's mount contract, CapacityNotice's body, the Skeleton grid variant, the ListRow read only variant and EventRow are done. DayCell and MonthGrid, OtpInput, Pager and Columns stay on its todo list. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>



Mobile Week + Interval calendar views (cross-platform parity) + horizontal scroll
Completes the #326/#333 parity gap — the Week/Interval time-grid views existed on web only; the mobile calendar was month-only. Adds them to mobile, and makes the time-grid horizontally scrollable on BOTH platforms so days don't squish at narrow widths.
Mobile (new — mirrors web)
CalendarTimeGridport (all-day band, hourly body, lane-packed blocks, now-line, 7am auto-scroll).Horizontal scroll (both platforms)
Day columns keep an ~80px min width and scroll horizontally with the time-gutter + header/all-day rows pinned, instead of compressing. Landed in the shared
calendar-time-grid(what both views render) so one change covers week + interval, no duplication.Shared (no duplication)
clampRangeToMaxDays+MAX_RANGE_DAYSlifted fromapps/web/lib→packages/shared/src/utils/calendar-range.ts(web re-points its import; web copy removed).filterRecurringEntries/buildCalendarDayMapalready shared.Validation
type-check 3/3; lint 0 errors; tests shared 1241, mobile 723, web 1738 (calendar 38/38).
🤖 Generated with Claude Code