26 Commits
Author SHA1 Message Date
jinhojang6 2771e99d32 refactor: promote reusable home sections into sections/shared
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.
2026-08-10 20:38:46 +09:00
JulesFILIOT 3f730452c5 chore(web): remove get help link on movement page 2026-07-29 13:37:03 +02:00
Jinho Jang 3e36fc9790 Increase small text to 12px (#114)
* 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
2026-07-23 20:58:59 +09:00
jinhojang6 1f8da80d29 fix: route builder ctas to get started 2026-07-09 20:29:25 +09:00
JulesFILIOT fedd8153e3 fix: swap impact building and coalition cards on movement page 2026-07-07 14:38:05 +02:00
Jinho Jang 96be50d8d0 refactor: make @repo/content the single source for home, get-started & movement page copy (#62)
* 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
2026-07-06 19:09:02 +09:00
jinhojang6 b60b7159b7 refactor(web): refine movement hero and intro copy/layout
- 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.
2026-06-27 01:22:42 +09:00
jinhojang6 2b0f817999 fix: adjust padding and spacing in various sections for improved layout 2026-06-22 16:35:44 +09:00
jinhojang6 c40819e8b9 fix: streamline activism section title and remove mobile-specific titles from JSON 2026-06-19 02:25:44 +09:00
jinhojang6 77c46f6009 fix: remove unnecessary padding from sections for improved layout 2026-06-17 01:22:04 +09:00
Jinho Jang a9d3dcdd8a Rebrand blog to Logos Media, refresh copy, and polish stack/hero UI (#43)
* 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
2026-06-11 18:56:03 +09:00
Jinho Jang 707a364fc7 fix(content): update winnable issues and initiative details for movement page (#41) 2026-06-11 00:03:40 +09:00
jinhojang6 af019854c5 fix(movement): make activism cards horizontally scrollable
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.
2026-06-06 14:40:17 +09:00
JulesFILIOT 530d2ced2f fix(movement): update CTA routes in builder and coalition sections
Builder primary CTA -> activist-builder, feature card -> Porto winnable
issue URL. Coalition CTA -> coalition-partner page.
2026-06-04 13:25:58 +09:00
JulesFILIOT 101dc4af68 feat(movement): add view issue button to activism cards 2026-06-04 13:25:33 +09:00
JulesFILIOT 5573c109c2 feat(movement): make CenterCtaSection cta prop optional 2026-06-04 12:43:02 +09:00
JulesFILIOT a7e813c12c feat(movement): remove CTAs and reduce map section gap
Remove "Submit an issue" from Activism in Action and "Find a circle"
button from the map section; tighten bottom padding above the map.
2026-06-04 12:42:32 +09:00
JulesFILIOT 2133e4537d feat(movement): update campaign section CTA links
"Join an upcoming circle" scrolls to the circles map; "Propose a circle"
links to the activist-leader-steward page.
2026-06-04 12:36:24 +09:00
JulesFILIOT 68f7f28d7a feat(movement): anchor action cards to in-page sections
Activism -> Join an Activist Circle, Coalition -> Join the Coalition,
Impact Building -> Become an Activist Builder.
2026-06-04 12:32:14 +09:00
JulesFILIOT 2dbf491757 feat(movement): anchor hero CTAs to in-page sections
"Join a circle" scrolls to the circles map, "Start a new circle" scrolls
to the Join an Activist Circle section.
2026-06-04 12:19:47 +09:00
jinhojang6 dee44f4131 fix(movement): point "Submit an issue" CTA to the forum meetups category
The Activism in Action "Submit an issue" CTA routed to /circles; link it to
EXTERNAL_URLS.forumMeetups (https://forum.logos.co/c/meetups/6, new tab).
2026-06-03 03:38:58 +09:00
jinhojang6 65246cde48 feat(movement): unify Circles Resources with /circles (shared component + real resources)
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.
2026-06-03 03:38:09 +09:00
jinhojang6 1e713d6dcd feat(movement): populate Activism in Action cards from circles initiatives
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.
2026-06-03 03:32:46 +09:00
jinhojang6 55eb3dbf12 fix(movement): correct Propose CTA link and render map once
- "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.
2026-06-03 03:26:56 +09:00
jinhojang6 fe5a8dd157 feat(movement): unify Upcoming Events with /circles (shared component + live events)
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.
2026-06-03 03:20:09 +09:00
jinhojang6 0b8a6a8f15 refactor(movement): split page into one-section-per-file modules
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.
2026-06-03 02:21:50 +09:00