docs: sync CLAUDE.md + reference/guides with standalone-page cleanup
- Replace 'Shared feed-map partial' section with 'entry-map' partial + the single MapUtils.initEntryMap map path - Trip architecture: two content subfolders (dailies/stories as inert routable:false containers); map/stats inline on trip page - Fix stale references to deleted map/stats/dailies/stories templates in architecture.md (template list, page tree, GPX flow) and trip-switching.md (scaffold + verify steps) - Correct GPX rendering: toGeoJSON bundled in map.js, no leaflet CDN - Pre-launch smoke test now checks the trip page feed, not /dailies Left docs/working/* (milestones, learnings, QA, plans) as point-in-time history. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -27,39 +27,48 @@ The Docker dev server runs at **http://localhost:8081** (mapped from container p
|
||||
The site is structured around Trip entities. Key facts:
|
||||
- Active trip is set in `user/config/site.yaml` → `active_trip: japan-korea-2026`
|
||||
- Trip pages live at `user/pages/01.trips/<slug>/`
|
||||
- Each trip has: `01.dailies/`, `02.map/`, `03.stats/`, `04.stories/`
|
||||
- Each trip has two content subfolders: `01.dailies/` (journal entries) and `04.stories/` (stories). The former `02.map/` and `03.stats/` standalone views were **removed** (2026-07-04, see `docs/working/plans/2026-07-04-standalone-page-cleanup.md`) — map and stats now render inline on the trip page
|
||||
- `01.dailies/` and `04.stories/` are `routable:false` **data containers** — visiting `/trips/<slug>/dailies` or `/stories` directly 404s/redirects; their children (entries/stories) render at their own detail URLs and are aggregated by the trip page
|
||||
- Site nav in `base.html.twig` has Home + Past Trips only — does not link to trip sub-sections
|
||||
- Post form parent (`post-form.md` → `pageconfig.parent`) **must be kept in sync** with `active_trip`
|
||||
- The trip page (`trip.html.twig`) uses a **client-side filter bar** (All content / Journal / Stories) — do NOT add nav links back to `/dailies`, `/stats`, `/stories` on the trip page. This filter bar + stats chrome is shared with the home active-trip view via the `trip-feed-col` partial (see "Shared trip-feed-col partial" below)
|
||||
- Stats are shown inline on the trip page via a toggle; the standalone `/stats` sub-page still exists as a URL but is not linked from the trip page
|
||||
- GPX route files live as media on the trip page itself, served via leaflet-gpx CDN
|
||||
- The trip page (`trip.html.twig`) uses a **client-side filter bar** (All content / Journal / Stories). The standalone `/dailies`, `/map`, `/stats`, `/stories` view pages no longer exist — do NOT try to re-create them or link to them. This filter bar + stats chrome is shared with the home active-trip view via the `trip-feed-col` partial (see "Shared trip-feed-col partial" below)
|
||||
- Stats are shown inline on the trip page via a toggle (the standalone `/stats` view was removed)
|
||||
- GPX route files live as media on the trip page itself, parsed client-side via toGeoJSON (bundled into `js/map.js`) and drawn on the trip/home map
|
||||
- Manage GPX files (view/upload/delete) at `/gpx-manager` — requires admin login; filenames are auto-slugified on upload
|
||||
|
||||
### Shared feed-map partial
|
||||
### One map path: `MapUtils.initEntryMap` + the `entry-map` partial
|
||||
|
||||
The mini-map above the feed is shared across two pages via a Twig partial:
|
||||
There is a **single** map code path on the site. The engine is `MapUtils.initEntryMap(opts)` in `js/src/maplibre-utils.js` (bundled into `js/map.js` via `make build-assets` — never hand-edit `js/map.js`). It builds the MapLibre map, places markers/popups, fits bounds, draws the GPX journey, and wires the fullscreen toggle.
|
||||
|
||||
- **Partial:** `user/themes/intotheeast/templates/partials/feed-map.html.twig`
|
||||
- **Used by:** `dailies.html.twig` and `stories.html.twig`
|
||||
- **NOT used by:** `trip.html.twig` (uses its own `#trip-map` / `.home-map-col` layout)
|
||||
The map **markup + invocation** is shared via one partial:
|
||||
|
||||
**Parameters (passed via `{% include ... with {...} only %}`):**
|
||||
- **Partial:** `user/themes/intotheeast/templates/partials/entry-map.html.twig`
|
||||
- **Used by:** `trip.html.twig` and the active branch of `home.html.twig` (both via `{% include ... with {...} only %}`)
|
||||
|
||||
| Parameter | Type | Description |
|
||||
|---|---|---|
|
||||
| `map_entries` | array | `[{lat, lng, title, slug, url, type, force_connect, transport_mode}]` |
|
||||
| `map_id` | string | HTML id for map div: `'feed-map'` or `'stories-map'` |
|
||||
| `map_var` | string | JS global variable: `'feedMap'` or `'storiesMap'` |
|
||||
| `link_href` | string\|null | "View full map" link URL; `null` hides it |
|
||||
| `card_prefix` | string | Scroll-to ID prefix: `'entry-'` (dailies) or `'story-'` (stories) |
|
||||
| `trip_page` | Page | Trip page object for autoconnect setting |
|
||||
| `show_journey` | bool | `true` draws the route connector; `false` skips it |
|
||||
It renders the `.home-map-col` column (map div `#{{ map_id }}` + fullscreen button) and, when `entries` is non-empty, a thin `<script>` that assigns `window.{{ map_global }}` from `initEntryMap`. Callers resolve header values (use_gpx / autoconnect) and pass them in.
|
||||
|
||||
The partial always: starts attribution collapsed, shows the fullscreen button (mobile-only, CSS `display:none` ≥769px), and on marker click scrolls to `#<card_prefix><slug>` + flashes `.is-highlighted`.
|
||||
**Parameters:**
|
||||
|
||||
| Parameter | Type | Trip passes | Home passes |
|
||||
|---|---|---|---|
|
||||
| `map_id` | string | `'trip-map'` | `'home-map'` |
|
||||
| `map_global` | string | `'tripMap'` | `'homeMap'` |
|
||||
| `entries` | array | `[{lat, lng, slug, title, url, type?, force_connect, ...}]` | same |
|
||||
| `card_prefix` | string | `'entry-'` | `'entry-'` |
|
||||
| `story_markers` | bool | `true` (diamond markers) | `false` |
|
||||
| `gpx_urls` | array | `gpx_urls` | `home_gpx_urls` |
|
||||
| `use_gpx` | bool | `page.header.use_gpx ?? true` | derived from `trip.header` |
|
||||
| `autoconnect` | string | `page.header.autoconnect ?? 'on'` | derived from `trip.header` |
|
||||
| `gpx_source_prefix` | string | `'gpx'` | `'home-gpx'` |
|
||||
| `journey_id` | string | `'trip-journey'` | `'home-journey'` |
|
||||
|
||||
The map globals `window.tripMap` / `window.homeMap` are asserted by the Playwright map specs, so any surface using this partial must keep assigning them.
|
||||
|
||||
> History: this replaced the old three-variant setup (a `feed-map.html.twig` partial with its own inline init, plus a full-page `map.html.twig`). Those were deleted in the 2026-07-04 standalone-page cleanup; the `2026-06-27-map-init-consolidation` plan had already moved trip + home onto `initEntryMap`.
|
||||
|
||||
### Shared trip-feed-col partial
|
||||
|
||||
The home page's active-trip view and the trip page render the **same feed-col chrome** (date-range header, filter bar, stats/cycling panels, feed loop) via one shared Twig partial. This is separate from the feed-map partial above — it is the column **beside** the map, not the map.
|
||||
The home page's active-trip view and the trip page render the **same feed-col chrome** (date-range header, filter bar, stats/cycling panels, feed loop) via one shared Twig partial. This is separate from the `entry-map` partial above — it is the column **beside** the map, not the map.
|
||||
|
||||
- **Partial:** `user/themes/intotheeast/templates/partials/trip-feed-col.html.twig`
|
||||
- **Used by:** `trip.html.twig` and the active branch of `home.html.twig` (both via `{% include ... with {...} only %}`)
|
||||
@@ -84,7 +93,7 @@ The home page's active-trip view and the trip page render the **same feed-col ch
|
||||
|
||||
### GPX file management
|
||||
|
||||
GPX files are stored as page media on the trip page (`user/pages/01.trips/<slug>/`). They are picked up automatically by `map.html.twig` via `trip_page.media.all`.
|
||||
GPX files are stored as page media on the trip page (`user/pages/01.trips/<slug>/`). They are picked up automatically by `trip.html.twig` (and `home.html.twig`) via `trip_page.media.all`, filtered to `.gpx`, and passed to the shared `entry-map` partial.
|
||||
|
||||
The GPX manager page (`user/pages/03.gpx-manager/`) provides a browser UI at `/gpx-manager`:
|
||||
- **Auth:** enforced by Login plugin via `access.admin.login: true` in frontmatter — shows login form if not authenticated
|
||||
@@ -109,7 +118,7 @@ Two places hardcode the active trip slug. Grav's config and page frontmatter are
|
||||
|
||||
Note: `system.yaml` `home.alias` is permanently set to `/home` (the real home page) and does **not** need to change when switching trips.
|
||||
|
||||
After updating, also create the new trip's page tree under `user/pages/01.trips/<new-slug>/` with the standard four subfolders.
|
||||
After updating, also create the new trip's page tree under `user/pages/01.trips/<new-slug>/` with the two content subfolders `01.dailies/` and `04.stories/` (each with an inert `routable:false` container `.md`), plus the trip's `trip.md`. Do **not** recreate `02.map/` or `03.stats/` — those standalone views were retired.
|
||||
|
||||
### Environment
|
||||
|
||||
@@ -155,7 +164,7 @@ Before going live, change in `user/config/system.yaml`:
|
||||
|---|---|---|
|
||||
| `twig.cache` | `true` | Templates compiled once and reused; safe because theme files don't change at runtime |
|
||||
|
||||
**Pre-launch smoke test required:** with `twig.cache: true`, submit one post via `/post` and confirm the entry appears in `/trips/italy-2026-demo/dailies` immediately. This verifies the cache-on-save plugin (BUG-001 fix) works correctly with caching enabled.
|
||||
**Pre-launch smoke test required:** with `twig.cache: true`, submit one post via `/post` and confirm the entry appears in the trip page feed at `/trips/italy-2026-demo` immediately. This verifies the cache-on-save plugin (BUG-001 fix) works correctly with caching enabled.
|
||||
|
||||
### What the cache-on-save plugin handles
|
||||
|
||||
|
||||
Reference in New Issue
Block a user