Skip to content

feat(mobile): Week/Interval calendar views + horizontal-scroll time-grid (parity with web) - #339

Merged
thomasluizon merged 1 commit into
mainfrom
feat/mobile-calendar-views
Jun 27, 2026
Merged

feat(mobile): Week/Interval calendar views + horizontal-scroll time-grid (parity with web)#339
thomasluizon merged 1 commit into
mainfrom
feat/mobile-calendar-views

Conversation

@thomasluizon

Copy link
Copy Markdown
Owner

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)

  • View switch Mês / Semana / Intervalo.
  • Week view (7-day time-grid) + week-nav + show-recurring toggle.
  • Interval view (N-day time-grid) with the 14-day clamp + amber notice.
  • Full CalendarTimeGrid port (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_DAYS lifted from apps/web/libpackages/shared/src/utils/calendar-range.ts (web re-points its import; web copy removed). filterRecurringEntries / buildCalendarDayMap already shared.

Validation

type-check 3/3; lint 0 errors; tests shared 1241, mobile 723, web 1738 (calendar 38/38).

server-fetch 401-retry tests are a pre-existing concurrent-run flake (untouched).

🤖 Generated with Claude Code

#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>
@vercel

vercel Bot commented Jun 27, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
orbit-ui-mobile-web Ignored Ignored Jun 27, 2026 9:41pm

Request Review

@sonarqubecloud

Copy link
Copy Markdown

@claude claude 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.

test

@thomasluizon
thomasluizon merged commit 776ced9 into main Jun 27, 2026
10 checks passed
@thomasluizon
thomasluizon deleted the feat/mobile-calendar-views branch June 27, 2026 21:56

@claude claude 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.

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.

thomasluizon added a commit that referenced this pull request Jun 27, 2026
…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>
thomasluizon added a commit that referenced this pull request Aug 19, 2026
…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>
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