- #page-overview #hero padding rebalanced to clamp(3,8vh,6rem) top
and clamp(4,10vh,7rem) bottom so the grid-centered content sits
on the true vertical midline rather than being pushed upward by
an asymmetric padding-bottom.
- .hero-copy max-width 58ch → 70ch (~+20%). .hero-lede follows to
53ch (was 44ch). Headline size clamp(1.65rem,4vw,3.4rem) →
clamp(1.8rem,4.4vw,3.75rem), lede follows in proportion.
- .support type + svg drop to half the previous (0.75x the base
--step-sm, svg 27→14px). The "Backed by Innovationsfonden" line
now reads as a quiet footnote instead of competing with the
main copy above it.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- "Meet Fenja AI" eyebrow removed — headline + wordmark pairing
is enough to anchor the scene.
- Type scale reduced inside #hero: title clamp(1.65rem, 4vw, 3.4rem)
(was clamp(2rem, 5.1vw, 4.4rem) via --step-hero), lede
clamp(1rem, 1.7vw, 1.4rem). Reads calmer and keeps the headline
from overshadowing the lede.
- .hero-copy gets padding-left: clamp(2rem, 8vw, 8rem) so the text
block floats in the same way the wordmark does in its column —
symmetric breathing room on both sides of the viewport rather
than the copy hugging the left edge.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Hero copy moves into a .hero-copy column on the left; a new
.hero-mark column on the right holds the Fenja wordmark at
clamp(200px, 22vw, 320px) wide — same position as the welcome
page's .welcome-logo (~75% across the viewport).
- New eyebrow "Meet Fenja AI", headline "Trusted & Sovereign AI /
built in Denmark, for Europe.", and expanded lede explaining
that Fenja AI is both the company and the platform.
- "Supported by" → "Backed by". Both the wordmark font-size and
the Innovationsfonden SVG get a 50% size bump (calc(--step-sm *
1.5) on the text, 18px → 27px on the svg).
- Responsive: at <780px the grid collapses to a single column so
the wordmark stacks below the copy on narrow desktop viewports
(the mobile UA still gets the separate static mobile view).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Stack title bar moves from top-left next to the site-mark to
centered at ~14vh so the title anchors visually to the cards
below. Font size bumped to clamp(2rem, 3.6vw, 3rem).
- Counter ("1 / 4 … 4 / 4") relocates from the title bar into
each .layer-card as a .card-counter element in the top-right of
each card-box. No longer driven by ScrollTrigger onUpdate —
each card carries its own number, so stacked + grid phases
both read correctly without JS. Grid phase shrinks the counter
so it doesn't compete with the per-cell label.
- SCENE_ANCHOR_OFFSET for stack-scene drops from 1800 back to 0,
so clicking the "Capabilities" dot lands at the top of the
pin — the title and first card come in together instead of
starting mid-stack.
Welcome step: the "desktop experience" aside and its CSS are
removed. Users now see only the two definitions before the CTA.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
.m-logo img 22px → 34px; .m-logo gets text-decoration:none so the
wrapping <a href="/"> doesn't paint a default underline under the
wordmark on Safari / any browser with link styles leaking through.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Icons grow 72px → 148px and shift to top:-18px right:-18px so they
overflow the card edges. .m-cap gets overflow:hidden so the bleed
is clipped at the tile boundary — icon reads as an ornament tucked
into the top-right corner rather than a floating sticker. Num,
eyebrow, and title rows bump their right padding from 92 to 120 so
the text still clears the icon's visible silhouette.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Masthead is now the Fenja wordmark on its own, centred. The logout
handler and the .m-logout CSS are gone; mobile.js header comment
updated to reflect "two behaviours" (session check + join CTA).
Users who need to log out can do so from a desktop session or by
clearing cookies.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Capability cards now carry the desktop's per-layer colours —
sage / slate / clay / plum — with paper-toned text for contrast.
Icon, num, eyebrow, title, body all flipped to paper with per-
element alpha so the hierarchy still reads on the coloured tile.
Footer reintroduced as a stacked column of three supporter marks:
"Project Bifrost" serif lockup, Fenja AI wordmark, Innovationsfonden
mark. Centered, 26px gap, paper background, 44/56 top/bottom padding.
No "view desktop" link — the ?view=desktop query override still
works for anyone who needs it.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Timeline: 12 event tiles are now a horizontal scroll-snap carousel
instead of a vertical stack. Each card flex-basis: 84vw, snap-align
start, with paper-tile styling + a subtle shadow + "NN / 12" index
in the top-right. A "Swipe →" hint sits above the track. Zero JS —
pure CSS scroll-snap + -webkit-overflow-scrolling.
Hero: Fenja wordmark (36px) placed above the "For regulated
environments" eyebrow, whole section wrapped in a paper-2 strip
with 72/80px top/bottom padding and hairline rules top + bottom.
Sits visually as its own chapter instead of a continuation of the
previous section.
Transition strip ("How Fenja AI addresses this") gets vertical
rules above and below and 88px vertical padding so it reads as a
deliberate pause between the timeline and the platform sections.
Capability cards: 4 per-layer illustrations (ai.png, lightbulb,
blocs tools, agents.png — all already in fenja/illustrations/)
placed as 72×72 PNGs in the top-right of each card. Card content
padding-right bumped to 92px for the num/eyebrow/title rows so
long titles wrap around the icon instead of under it.
Project Bifrost: the desktop aurora arc reused as a static SVG
backdrop. Scaled to 190% viewport width (max 900px) so the arc
runs off both edges of the phone screen, matching the desktop's
"bridge spans the stage" feel.
Treasure-map stops: community.svg, council.svg, pilot.svg sit
as 220px-wide illustrations above each stop's text, replacing
the text-only mobile rendering.
Join CTA: now wrapped in an inset paper tile with a 1.5px ink
border, a shadow, and an accent hairline ornament floating above
the eyebrow. Enclosing section gets a paper-3 background to push
the tile forward. Button grows to 20px serif / 18×34 padding.
Section padding standardised to 56-120px vertical so sections
breathe. Body overflow-x:hidden on html/body as a safety net for
the wide arc + the carousel overflow.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The footer added a wordmark row and a "view desktop" escape hatch
below the Join confirmation. Neither is worth the visual weight on
a phone screen — the masthead already has the wordmark, and the
?view=desktop override still works as a manual URL. Page now ends
at the join confirmation.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Desktop is a GSAP/Lenis/d3 animated experience that doesn't hold up
on phones. Rather than retrofitting media queries across 1200+ lines
of scroll-trigger code, add a completely isolated static mobile tree:
- protected/mobile/index.html — one-page static flow covering the
intro, 12 timeline events, hero, 4 capability cards, Bifrost
reveal, 3 participation stops, and Join CTA. All copy duplicated
from the desktop HTML on purpose — a shared data module would
re-couple the two trees.
- protected/mobile/mobile.css — paper/ink palette, all m-prefixed,
zero cascade overlap with the desktop CSS.
- protected/mobile/mobile.js — 60-line client: /auth/me check,
/api/bifrost-join POST + panel swap, /auth/logout. No GSAP, no
Lenis, no d3.
Routing (server.js):
- GET /timeline now UA-dispatches via MOBILE_UA_RE. Phone UAs get
the mobile page; everything else gets the desktop page.
- ?view=mobile and ?view=desktop query overrides take precedence
over the UA sniff — for bad guesses or previewing the other
version.
- Gating is unchanged: protected/mobile/ is inside protected/ so
the existing requireAuth + express.static gate covers it.
Docs:
- CLAUDE.md §routing now lists the UA dispatch as step 4.
- PROJECT.md gets a new "Mobile view" section explaining the
isolation rules (no shared JS/CSS, content duplicated manually).
- CHECKLIST.md gains section H0 with dispatch curl checks, render
verification on a phone, and an isolation audit that fails if
mobile classes leak into the desktop HTML or vice versa.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- SCENE_ANCHOR_OFFSET replaced with getSceneAnchorOffset() so the
bifrost scene can compute its offset per-viewport instead of using
a fixed px count. bifrost lands at offsetTop + 0.85 * vh so the arc
and sub-headline are already drawn in; stack-scene drops from 2100
to 1800 so the anchor lands mid-stack rather than on the 4th card's
final beat.
- .stack-title-bar top drops from clamp(3.75rem, 7vh, 5.25rem) to
clamp(1.25rem, 2.8vh, 1.85rem) so the title floats at the same
vertical baseline as the fixed .site-mark wordmark in the top-left,
instead of sitting below it.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Timeline page:
- .page-sub: final sentence wrapped in .page-sub-accent and styled
crimson so the rhetorical beat lifts off the block.
- Scroll-to-begin hint is now toggled from applyScroll() against
state.target, so it dismisses on first commit AND re-appears when
the reader scrolls all the way back to the start. onWheel no longer
hard-adds .hint-dismissed; the applyScroll toggle drives both ways.
Overview page:
- Hero scroll icon: size and presence bumped (2px line, 44px tall, 11px
chevron, weight 600, color:var(--ink)) so it reads as a confident
cue, not a whisper at the bottom of the hero.
- Architecture scene gains a title bar pinned with the scene: "The
Fenja AI platform in four steps" with a 1/4 → 4/4 counter driven by
the scroll-trigger onUpdate. Bar is placed below the site-mark's
fixed position so the two don't collide.
- Dot-nav: dot size 5px → 10px (1.5px ring) for better click target +
visual weight. Buttons for "Words" and "Participate" removed — the
corresponding intermediate sections now map to their nearest
surviving dot in bifrost.js's scroll-spy (words-scene →
stack-scene, bifrost-meaning → bifrost).
- Renames: "Hero" → "Fenja introduction", "Architecture" →
"Capabilities", "Bifrost" → "Project Bifrost".
- scrollTo() adds a per-scene SCENE_ANCHOR_OFFSET — stack-scene lands
+2100px into its 5000px pin so the reader arrives on the fully
stacked state instead of an empty pre-animation frame.
Welcome step (public/entrance.html):
- New .welcome-note callout between definitions and CTA advising
desktop viewing and gentle scrolling so readers don't fly past
animated sections before they've resolved.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Six scroll-bound scenes (hero, architecture stack, words fly-in,
aurora arc, treasure-map, join CTA) now live inside page-overview,
above the existing 23-headline timeline. The Europe map stays as a
static background that fades with scroll.
- protected/index.html: rewrote #page-overview only; timeline and
archive sections unchanged. Site-2 palette re-mapped to site-1
Nordic Editorial tokens, Fraunces to Newsreader, tokens scoped
to #page-overview.
- protected/timeline.js: dot-nav boots window.__bifrost.init()
on first Overview activation. Added .js class on documentElement.
- protected/bifrost.js (new): Lenis + ScrollTrigger wired to the
overview's internal scroller via scrollerProxy; drives Europe
map opacity on scroll.
- protected/vendor/{lenis,gsap,scrolltrigger}.min.js (new):
extracted from site-2's inlined vendor blobs; CSP-compliant.
- protected/fenja/illustrations/{community,council,pilot}.svg
(new): treasure-map stop images.
No changes to src/, server.js, deploy/, or public/. CSP stays
strict (script-src 'self'); zero inline scripts added. Auth gate
and session model untouched.