feat: month grid, day-view REST, modal & pretty pages (Epic #15) #107

Merged
manlycucumber merged 1 commit from feature/15-calendar-day-view into develop 2026-07-03 21:13:54 +00:00
manlycucumber commented 2026-07-03 21:12:49 +00:00 (Migrated from github.com)

Ordo O4 — Epic #15 (Calendar & day view), built to the approved Illuminated-Breviary mockup (docs/mockups/). Standalone/offline through the bundled Core; PHP 7.4 floor; GPL-2.0-or-later.

Surfaces

  • [ordo_calendar] month grid (#16) — Sunday-first square cells (aspect-ratio:1/1), leading colour edge, class numeral, today ring, first-class gold box, a corner reserved for the v0.4 fasting mark. Mobile → an agenda list below the breakpoint. Month navigation lives in the page query string (?ordo_y=&ordo_m=), so stepping months is a plain link and every month is a shareable, no-JS URL. Server-rendered block shares the render callback.
  • REST ordo/v1/day/{date} (#17) — public, cacheable GET; resolves the day under the site's configured calendar and returns the shared article body + a 7-day navigator window. The payload builder is a pure method, unit-tested without WordPress.
  • Day-view modal (#18) — progressive enhancement over every day trigger (grid, agenda, strip, ribbon, today card). Focus-trapped, Escape/backdrop dismissable, focus restored on close; a day-by-day footer navigator (chevrons step ±1, click a day to load). No JavaScript → the trigger's href is followed to the pretty page.
  • /ordo/YYYY-MM-DD/ pretty pages (#19)DayRoute serves the O1 rewrite through a theme-integrated template, clears the would-be 404, titles the tab with the feast, and renders the same day view. The shareable home of a day and the no-JS fallback.

Design notes

  • DayView is the single day body shared by the page and the modal, so they never disagree. DayPresenter gains rankLine(), kind(), classLabel()/kindLabel(), commemorations() and temporalName().
  • Only real contract data is shown — commemorations, season, temporal day, calendar context. The mockup's "At Mass" rubric texts belong to the Missal milestone and are not fabricated here; the honest rank line reads e.g. "First class · Feast" from rankOrdinal + kind, never an invented "Duplex".
  • The fasting corner is reserved but empty (the contract's fasting slot is null until Core v0.4).

Verification

  • PHPUnit 40 tests / 142 assertions green (offline, WP-stub render harness): grid markings, month nav, today ring, day-view article, REST payload + nav window, real-commemoration rendering, SSPX overlay raising St Pius X & Seven Sorrows to first class.
  • phpcs (PSR-12), phpstan (level 6), and the clean-room old-engine guard all clean.
  • Offline render spot-check of Sept 2026 (SSPX): 30 in-month cells, 3 first-class boxes (Sep 3/15/29 — matching the mockup), real commemoration on Sep 16, modal filled from the REST payload.

Closes #15, #16, #17, #18, #19.

Ordo **O4 — Epic #15 (Calendar & day view)**, built to the approved Illuminated-Breviary mockup (`docs/mockups/`). Standalone/offline through the bundled Core; PHP 7.4 floor; GPL-2.0-or-later. ## Surfaces - **`[ordo_calendar]` month grid (#16)** — Sunday-first square cells (`aspect-ratio:1/1`), leading colour edge, class numeral, today ring, first-class gold box, a corner reserved for the v0.4 fasting mark. Mobile → an **agenda list** below the breakpoint. Month navigation lives in the page query string (`?ordo_y=&ordo_m=`), so stepping months is a plain link and every month is a shareable, no-JS URL. Server-rendered block shares the render callback. - **REST `ordo/v1/day/{date}` (#17)** — public, cacheable GET; resolves the day under the site's configured calendar and returns the shared article body + a 7-day navigator window. The payload builder is a **pure method**, unit-tested without WordPress. - **Day-view modal (#18)** — progressive enhancement over every day trigger (grid, agenda, strip, ribbon, today card). Focus-trapped, Escape/backdrop dismissable, focus restored on close; a day-by-day footer navigator (chevrons step ±1, click a day to load). No JavaScript → the trigger's `href` is followed to the pretty page. - **`/ordo/YYYY-MM-DD/` pretty pages (#19)** — `DayRoute` serves the O1 rewrite through a theme-integrated template, clears the would-be 404, titles the tab with the feast, and renders the same day view. The shareable home of a day and the no-JS fallback. ## Design notes - **`DayView`** is the single day body shared by the page and the modal, so they never disagree. **`DayPresenter`** gains `rankLine()`, `kind()`, `classLabel()`/`kindLabel()`, `commemorations()` and `temporalName()`. - **Only real contract data is shown** — commemorations, season, temporal day, calendar context. The mockup's "At Mass" rubric texts belong to the Missal milestone and are **not fabricated** here; the honest rank line reads e.g. *"First class · Feast"* from `rankOrdinal` + `kind`, never an invented "Duplex". - The `fasting` corner is reserved but empty (the contract's `fasting` slot is null until Core v0.4). ## Verification - **PHPUnit 40 tests / 142 assertions** green (offline, WP-stub render harness): grid markings, month nav, today ring, day-view article, REST payload + nav window, real-commemoration rendering, SSPX overlay raising St Pius X & Seven Sorrows to first class. - **phpcs (PSR-12)**, **phpstan (level 6)**, and the **clean-room old-engine guard** all clean. - Offline render spot-check of Sept 2026 (SSPX): 30 in-month cells, 3 first-class boxes (Sep 3/15/29 — matching the mockup), real commemoration on Sep 16, modal filled from the REST payload. Closes #15, #16, #17, #18, #19.
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
Directorium/Ordo!107
No description provided.