The admin-driven home dropped the #about and #events sections. The
subnav now links to what the page has: the hero, connect, retreats,
calendar and the numbers band (labelled About).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
seed.js moved the v1.2 static content into SQLite. Its chapter
source, src/pages/chapters.js, was deleted in the same commit that
added it, and the default path pointed at src/data/chapters, which
is the API hook and has none of GROUPS/SPLITS/CHAPTERS. Given the
old file, it still fails on today's schema (events.host_org_id went
with co-hosting), and a working run would wipe everything entered
through the admin since.
The database is the source of truth now. Removes seed.js, the
seed-only src/data/events.ts, and the seed command from CLAUDE.md.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Renames every .js module under src/ to .ts (api, useResource,
adminSchema, navConfig, adminNav and src/data/*) and points imports,
comments and the seed script's module paths at the new names. Their
types now come from inference; no .d.ts files and no shape
interfaces.
tsc stays strict (noImplicitAny off). The errors inference leaves
behind get the lightest fix that clears them: `any` on empty state,
contexts and list defaults, `: any` on components with optional or
spread props, class fields on ApiError, and option shapes on
get/useResource.
Kept as real types, since they belong to modules that were already
TypeScript and later features import them: PageShell's ShellSection
and props, useContent's corrected record types (website/email/
instagram are bare strings) and EventListItem, and TimelineRef's
orgKind.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Reverts 2428f44. The .d.ts files beside the JS modules and the
annotations threaded through src/ to satisfy noImplicitAny go;
tsconfig turns noImplicitAny off instead. The JS modules become
TypeScript in the next commit, so their types come from inference.
Kept from that commit, since they're runtime fixes rather than types:
- OrganizationDetail's website and email pills get an href and label
(they arrive as bare strings, not link objects).
- The chapter map falls back to FALLBACK_COLOR for a region with no
colour instead of painting its tiles black.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
EventCalendar shows events on a month grid or as a list of the
month. Multi-day events are lane-packed bars that break at week
edges, series events appear on every meeting with their time, and
clicking a day lists everything on it. Phones get the list. Visitors
can narrow by scope, type, online only and search, all starting at
"all"; a page can pin section, host or type through props, which
hides that control.
Migration 019 rebuilds front_page_sections to allow a 'calendar'
band and slots it in after the retreats carousel, so it can be
reordered, retitled or hidden from the Front page editor.
useEvents drops its empty fallback so a failed request surfaces as
an error rather than an empty list, and returns the scope list
alongside the events for the calendar's scope filter.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
DoveMark carries the dove path from the original home page as its
own component. The hero draws it at the rings' centre, upright while
they turn, with a soft glow and a gentle bob that stops under reduced
motion. The rings' opacity moves from the SVG to their own group so
the dove isn't dimmed with them.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The home page is rebuilt from scratch and configured from a new
Front page tab in the admin, backed by migration 017 and served by
GET /api/front-page.
Hero: brand, photos (crossfading slideshow with progress and pause)
or livestream (YouTube/Facebook/Vimeo embed with a LIVE badge),
switched by hand. After it, bands the admin can reorder, retitle or
hide: a countdown to the next event (series-aware), the National
Retreats carousel, a numbers band (typed in or counted from the
database), a horizontal rail of featured timeline entries, and a
"Find your way in" pathfinder replacing the old connect section.
The CRUD engine gains a `singleton` flag: the entity has one row,
made by its migration, and create and delete are refused. The list
screen opens that row and the editor drops the slug, back link and
delete. shapeSeries moves to shape.js so /front-page can share it.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
GET /api/people/:id returns a published person's profile, public
roles (current and past), published events they were billed at or
hosted, and public awards, each under the same visibility rules its
own page applies. public_phone is never sent.
PersonDetail renders it at /people/:id, the route personHref already
pointed at. PeopleTiles links a tile with a people id to that page;
an expandable tile keeps its details panel and the panel carries a
"View full profile" link instead.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A Series checkbox under When opens a panel for the schedule:
weekly on chosen weekdays, monthly by date, or monthly by weekday
position, every N weeks or months, with meeting times and an
optional meeting count. starts_on anchors the schedule and ends_on
bounds it, so effective_status needs no change.
Occurrences are derived, not stored. src/lib/eventSeries.ts builds
the schedule label shown on cards and the event page, and the
upcoming dates listed on the event page.
Migration 016 adds the columns; the CRUD engine gains a time type.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Declare the --ig-fill custom property on React's CSSProperties once,
instead of casting the style prop in Footer, Home and EventList-Cards.
- Type Footer's Get_In_Touch links as internal or external, so the
external branch type-checks.
- Pass undefined rather than null for an absent gradient (Home) and
Instagram URL (EventList-Cards).
tsc --noEmit is now clean, with and without --noImplicitAny.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Adds .d.ts declarations beside the untyped JS modules imported from
TS (api.js, navConfig.js, adminSchema.js, adminNav.js, src/data/*),
with shapes taken from the server routes and migrations. get/post/
patch/del now return unknown unless the caller names the response.
Fixes found along the way:
- website/email/instagram are bare strings from splitLinks, not Link
objects; OrganizationDetail's website and email pills rendered with
no href or label and now link correctly.
- The chapter map falls back to FALLBACK_COLOR for a region with no
colour instead of painting its tiles black.
Adds defineSection() so each page manifest entry's props are checked
against its own Component.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>