Move the hero and choose-your-path card sections out of sections/home so
pages other than the homepage can compose them, extract the two-line
statement heading, and lift CenterCtaSection out of the Movement page's
private atoms module.
The hero now takes an optional `background` node, defaulting to the same
Logos background video the homepage has always rendered.
Rendered output is unchanged: the homepage's hero, social proof, and
choose-your-path markup and the Movement page body are byte-identical to
develop, and the generated stylesheet loses no rules.
* fix: increase small text to 12px
* fix: use initiative CTA label
* refactor: use Tailwind text-xs utility
* fix: make homepage banner dismissible
* fix: update Discord links and banner text
* fix: refresh Discord invite links
* docs: add page-copy single-source spec and implementation plan
* feat(content): add typed home section schemas and migrate home copy into content
Add 7 bespoke home* section schemas (+ techStack ctas) to the page section
union and populate content/pages/en/home.json with home copy moved verbatim
from messages.
* refactor(web): source home page copy from @repo/content; drop home namespace from messages
Feed every home section from content via findSection/data props (replacing
next-intl getTranslations), remove the home namespace from messages/en.json,
and add a regression guard plus content-based tests. Render output unchanged.
* docs: add get-started/movement page-copy dedup spec and plan
* feat(content): add get-started & movement section schemas and content docs
Move get-started/movement page copy verbatim into content/pages so it is
single-sourced in @repo/content.
* refactor(web): source get-started/movement copy from content; drop those namespaces from messages
Feed both pages from content via findSection/data props (replacing next-intl),
switch them to content-based metadata, delete pages.getStarted/movement from
messages, and add content-based tests + ownership guard. Render unchanged.
* docs: add navbar-pages CMS copy spec and plan
* feat(content): add navbar page section schemas + Pages docs (book, brand-kit, research, node-programme, lambda-prize, manifesto, media, podcast, broadcast, tech-stack explorer)
* refactor(web): source navbar pages copy from content; drop those namespaces from messages
Migrate book, brand-kit, research (incl. rich-text via a tagged-text renderer),
node-programme, lambda-prize, manifesto, media, podcast, logos-broadcast-network,
and the tech-stack explorer to read copy from content via findSection/data props
and content-based metadata; remove the migrated pages.* namespaces from messages;
update guards + contracts. Render output unchanged.
* feat(web): source activist/coalition pages copy from content (CMS title/description)
Migrate activistBuilder, activistLeaderSteward, and coalitionPartner page
metadata from next-intl messages.pages.* into @repo/content PageCopy JSON,
following the established bookCopy pattern.
- Add activistBuilderCopySectionSchema, activistLeaderStewardCopySectionSchema,
coalitionPartnerCopySectionSchema to packages/content/src/schemas/pages.ts
and wire them into the pageSectionSchema discriminated union
- Create content/pages/en/activist-builder.json,
activist-leader-steward.json, coalition-partner.json with verbatim
title/description/heading values from the old messages namespace
- Switch all three route pages from createTranslatedPageMetadata to
createPageMetadata(ROUTE), removing the NAMESPACE constant
- Remove activistBuilder, activistLeaderSteward, coalitionPartner from
apps/web/messages/en.json pages object
- Add schema parse tests, renderToStaticMarkup page tests, messages ownership
guards, and content-route contract entries for all three pages
* chore(web): remove dead faq (pages.faq + unused FaqSection components)
* fix: remove stale faq links
* fix: pass payload env through turbo build
* fix: preserve lambda prize support labels
* fix: preserve live copy after master rebase
* fix: address page copy review feedback
* refactor: move design guide copy to content
* feat: add schemas for home and page copy sections
- Introduced home section schemas including homeSocialProof, homeChoosePath, homeDecide, homeStartBuilding, homeAbout, homeUseCases, and homeBuilderPortal.
- Added page copy section schemas such as getStartedCopy, movementCopy, bookCopy, designGuideCopy, activistBuilderCopy, activistLeaderStewardCopy, coalitionPartnerCopy, researchCopy, nodeProgrammeCopy, lambdaPrizeCopy, mediaCopy, podcastCopy, broadcastCopy, and manifestoCopy.
- Created shared schema for section keys to maintain consistency across sections.
* chore(web): remove dead pages.faq from messages
* fix: resolve page copy migration conflicts
* fix: source connect form page copy from content
* fix: remove duplicated afform page copy exports
* fix: stop generating afform page copy exports
* fix(cms): require only server actions key
* fix(cms): load env files before build validation
* fix(cms): make env loader available during build
* fix(cms): load next env via require
* test(cms): isolate missing env validation
* feat: add homepage testnet highlight
* fix: restore lambda prize support links
- Drop the hero 'Join a circle'/'Start a new circle' CTAs and the
'Local action' kicker; the CTAs are already covered by the blocks below.
- Use the single merged hero paragraph and tighten desktop spacing to
70px (title to body) and 108px (body to the next-section divider).
- Render the intro description at its 456px max-width by widening its grid
column (cn-merged descriptionClassName) so the line breaks match the design.
- Drop the now-unused movement.hero primaryCta/secondaryCta/kicker keys.
* fix(content): update description for storage overview section
* fix(content): update references from "The Logos Blog" to "Logos Media" across multiple files
* feat: Refactor blog section to media section
- Created new components for articles and podcasts under the media section.
- Updated routing constants to replace blog with media.
- Adjusted all references in the codebase from blog to media, including links, buttons, and navigation.
- Implemented new layout and design for articles and podcasts to enhance user experience.
- Updated translations and content references to align with the new media section.
* feat(about): replace h1 with AnimatedHeading component in AboutHero section
* fix: update import paths for PodcastsSection and adjust LambdaBadge properties in multiple components
* fix: adjust hover translation values for desktop stack items
The fixed-width 440px activism cards sat in an overflow-hidden row, so
between the md breakpoint and ~1360px the third card was clipped with no
way to reach it. Switch the container to overflow-x-auto and add scroll
snapping so the cards scroll into view instead of being hidden.
The movement Circles Resources was a hardcoded placeholder. Extract the circles
resources section into a shared CircleResourcesSection and render it on both
pages with the same real resource data and copy.
- Add components/sections/shared/circle-resources-section.tsx (header + whole-row
resource links) — circles resources-section.tsx now delegates to it (output
unchanged)
- movement route fetches getCircleResources() and threads resources through
MovementPageView to its resources section
- movement resources now uses circlesSettings.resourcesSection copy + real rows
(drops placeholder rows / t(resources.*))
tsc + eslint + 61 tests clean.
The movement "Activism in Action" cards used i18n placeholders (4 cards, generic
body, not clickable). Drive them from the same circle initiatives as /circles.
- movement route fetches getCircleInitiatives() and threads initiatives through
MovementPageView to ActivismSection
- ActivismSection renders the 3 featured initiatives (LA / Benin / Lisbon) in the
existing card design: location, title, and real description (line-clamped to
fit); each card links to initiative.href (same GitHub winnable-issues anchor as
/circles, opens in a new tab)
- card background uses the initiative image; removed now-unused movement issue
images (issueLondon/issuePorto)
tsc + eslint + 61 tests clean.
- "Propose a new circle" now links to the forum meetups category
(EXTERNAL_URLS.forumMeetups = https://forum.logos.co/c/meetups/6) instead of
routing to /circles
- The Find-a-Circle map was rendered twice (mobile + desktop variants), which
left the visible Leaflet instance stuck on "Loading map…". Render a single
CirclesMap and swap the find-CTA/map order responsively via flex order, so it
matches the working home/circles map.
The movement Upcoming Events was a hardcoded placeholder. Extract the circles
events section into a shared UpcomingEventsSection and render it on both pages
with the same live event data and copy.
- Add components/sections/shared/upcoming-events-section.tsx (date grouping,
EventCard, header, empty state) — circles events-section.tsx now delegates to
it (output unchanged)
- movement route fetches getUpcomingCircleEvents() and threads upcomingEvents +
locale through MovementPageView to the events section
- movement events section now uses circlesSettings.eventsSection copy + real
events (drops placeholder rows / t(events.*) and unused movementImages.event)
tsc + eslint + 61 tests clean.
719-line movement-page.tsx held every section. Extract each section into its
own file under _sections/ (hero, action-cards, campaign, activism, events,
get-involved, builder, resources) with shared types.ts + atoms.tsx;
movement-page.tsx is now a thin orchestrator. Pure move/extract, no behavior
change. tsc + 61 tests + eslint clean.