No description
Find a file
Jonathan Hvid 7bd3997564 feat(component): RoadmapCarousel — snap-scrolling horizontal strip
Replaces the 3-column grid on /pulse with a CSS scroll-snap carousel.
3 cards per view on desktop (flex 0 0 calc((100% - 2px) / 3)), one full
card with a slice of the next at 88% on mobile.

Header row: serif 22px 'On the roadmap' title on the left; right side has
the 'See the full roadmap →' section link plus two 30px round arrow
buttons. Arrows disable (opacity 0.25) when at start/end of scroll. Hidden
on mobile — touch swipe is the affordance.

Carousel-scroll has 0.5px top + bottom borders in rgba(0,0,0,0.08).
Scrollbar hidden cross-browser. Each card has a 0.5px right border (last
card excluded), 24/26 padding, background --background so it sits on the
cream rather than introducing a white surface.

Card contents:
  - 6px status dot in the status colour + tracked 10px label
    '{STATUS_LABEL} · {TARGET}' in the same family colour. The
    considering tier uses the lighter #d4d2c8 dot with the #b4b2a9 label
    to distinguish it from exploring.
  - 19px serif title, line-height 1.2.
  - 12px description, line-height 1.55, --on-surface-variant. If the
    item has attributions, an attributionLine() trailer appends 'Shaped
    by Lars.' / 'Shaped by Lars and Anna.' / etc. in --on-surface-muted.

Right-edge fade gradient (80px) fades to opacity 0 at scrollEnd via a
small vanilla script. The script also handles arrow disabled state and
scrollBy ±cardWidth on click. No library.

Items are loaded with the full set ordered by display_order ASC (then
id ASC tiebreak) — admin orders chronologically nearest-to-furthest and
the carousel just consumes that.

If items.length < 4 the arrows + fade are hidden; the cards still flex
naturally and don't actually need to scroll.

/pulse: dropped the old .roadmap-section/.roadmap-grid/.roadmap-card +
status-dot/breathe styles. Carousel does its own.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-12 10:55:44 +02:00
.claude style: drop eyebrows + body italics across editorial pages 2026-05-12 09:52:29 +02:00
content feat: database schema, migrations, and seed data 2026-04-18 22:43:16 +02:00
design chore: add Innofounder logo to public, wire to home page 2026-04-19 20:36:54 +02:00
migrations feat(db): roadmap_items gains 'considering' + 'in_beta' rename, --on-ink tokens 2026-05-12 10:46:39 +02:00
public chore: add Innofounder logo to public, wire to home page 2026-04-19 20:36:54 +02:00
scripts feat(db): roadmap_items gains 'considering' + 'in_beta' rename, --on-ink tokens 2026-05-12 10:46:39 +02:00
src feat(component): RoadmapCarousel — snap-scrolling horizontal strip 2026-05-12 10:55:44 +02:00
tests feat(pulse): two-column greeting + tenure-milestone copy 2026-05-12 10:48:50 +02:00
.env.example feat: database schema, migrations, and seed data 2026-04-18 22:43:16 +02:00
.gitignore wip: scaffold and index before style-guide 2026-04-18 16:09:49 +02:00
astro.config.mjs feat: database schema, migrations, and seed data 2026-04-18 22:43:16 +02:00
CLAUDE.md wip: scaffold and index before style-guide 2026-04-18 16:09:49 +02:00
DECISIONS.md docs: document decisions D-15 through D-18 2026-04-19 20:32:09 +02:00
HANDOVER.md docs: HANDOVER.md — build summary and next steps 2026-04-18 22:54:48 +02:00
KNOWN_ISSUES.md feat(db): add migration 0003 for council portal schema 2026-05-11 14:39:07 +02:00
package.json chore(demo): seed-demo.js + utc fix for last_seen_at 2026-05-11 15:04:11 +02:00
pnpm-lock.yaml feat: database schema, migrations, and seed data 2026-04-18 22:43:16 +02:00
SPEC.md wip: scaffold and index before style-guide 2026-04-18 16:09:49 +02:00
todo.md docs: capture deferred home-page features in todo.md 2026-05-11 17:04:40 +02:00
tsconfig.json wip: scaffold and index before style-guide 2026-04-18 16:09:49 +02:00
vitest.config.ts test: vitest suite — pulse status, vote uniqueness, home route 2026-05-11 14:45:55 +02:00