/* ==========================================================================
Accessible-hidden utility ÃƒÂ¢Ã¢â€šÂ¬Ã¢â‚¬Â clips content off-screen instead of
display, so screen readers and crawlers that read the rendered
accessibility tree (search engines, AI browsing agents) still see it.
Used for the h1 on ansoegning.html and the semantic comparison table
that duplicates the .edge-compare visual for machine readers.
========================================================================== /
.sr-only{
position;
width:1px; height:1px;
padding:0; margin:-1px;
overflow;
clip(0,0,0,0);
white-space;
border:0;
}
/ table-layout (the default) ignores width:1px and expands to fit
cell content, which as a position box enlarges the page's
scrollable area even though it's visually clipped. Fixed layout makes
it actually honor the 1px width. */
table.sr-only{ table-layout; }

/* ==========================================================================
10Multiply: Revenue Growth System Design Tokens
========================================================================== /
/ =========================================================
GLOBAL FONT CONTROL
Change ONLY --site-font-family below to change the entire site.
Previous font:
'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif
========================================================= */
{
--site-font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
}
{
--graphite: #171044;
--graphite-soft: #24165F;
--graphite-card: #332078;
--limestone: #FAF9FF;
--limestone-card: #FFFFFF;
--limestone-line: rgba(23,16,68,0.10);
--ink: #24165F;
--ink-soft: #625B7A;
--ink-faint: #9690A8;
--on-dark: #FAF9FF;
--on-dark-soft: #E5DEFF;
--signal-blue: #774CF7;
--signal-blue-dim: #6034D8;
--warm-metal: #774CF7;

--radius-lg: 28px;
--radius-md: 20px;
--radius-sm: 14px;
--radius-pill: 999px;

--container: 1180px;
--container-narrow: 760px;

--ease: cubic-bezier(.22,.61,.36,1);
--dur-fast: .25s;
--dur-med: .4s;
--dur-slow: .6s;

--shadow-card: 0 2px 4px rgba(23,16,68,0.05), 0 18px 40px -14px rgba(23,16,68,0.18);
--shadow-lift: 0 24px 70px -18px rgba(23,16,68,0.4);

--icon-blue-bg: #F0EBFF;
--icon-blue-fg: #6034D8;
--icon-metal-bg: #F4F0FF;
--icon-metal-fg: #6034D8;
--icon-green-bg: #E2F6EA;
--icon-green-fg: #16803C;
}

,::before,::after{ box-sizing; }
html{ scroll-behavior; -webkit-text-size-adjust:100%; text-size-adjust:100%; }
a,button{ -webkit-tap-highlight-color; }
@media (prefers-reduced-motion: reduce){
html{ scroll-behavior; }
,::before,::after{ animation-duration:.001ms !important; animation-iteration-count:1 !important; transition-duration:.001ms !important; scroll-behavior !important; }
}

body{
margin:0;
background(--limestone);
color(--ink);
font-family(--site-font-family);
font-size:15.5px;
line-height:1.5;
-webkit-font-smoothing;
background-image:
radial-gradient(circle at 1px 1px, rgba(23,16,68,0.05) 1px, transparent 0);
background-size: 28px 28px;
}

.cursor-glow{
position;
inset:0;
z-index:-1;
pointer-events;
opacity:0;
transition .4s ease;
background-image(circle at 1px 1px, rgba(119,76,247,.85) 1.6px, transparent 0);
background-size:18px 18px;
background-position:0 0;
-webkit-mask-image(140px circle at var(--mx,50vw) var(--my,25vh), #000 0%, transparent 78%);
mask-image(140px circle at var(--mx,50vw) var(--my,25vh), #000 0%, transparent 78%);
}
.cursor-glow.is-active{ opacity:1; }
@media (prefers-reduced-motion: reduce){
.cursor-glow{ display; }
}

img,svg{ display; max-width:100%; }
a{ color; text-decoration; }
ul{ margin:0; padding:0; list-style; }
h1,h2,h3,h4,p{ margin:0; }
button{ font-family; }

.container{ max-width(--container); margin:0 auto; padding:0 32px; }
.container-narrow{ max-width(--container-narrow); }

::selection{ background(--signal-blue); color:#fff; }

{
outline:2px solid var(--signal-blue);
outline-offset:3px;
border-radius:6px;
}

/* ==========================================================================
Reveal-on-scroll
========================================================================== */
[data-reveal]{
opacity:0;
transform(32px) scale(0.985);
transition .85s cubic-bezier(.16,.8,.24,1), transform .85s cubic-bezier(.16,.8,.24,1);
transition-delay(var(--reveal-delay, 0) * 70ms);
will-change, transform;
}
[data-reveal].is-visible{
opacity:1;
transform(0) scale(1);
}
.process-row[data-reveal]{
transform(40px) scale(0.97);
transition 1s cubic-bezier(.16,.8,.24,1), transform 1s cubic-bezier(.16,.8,.24,1);
}
.process-row[data-reveal].is-visible{
transform(0) scale(1);
}
.edge-vs[data-reveal]{
transform(-50%,-50%) translateY(20px) scale(0.85);
}
.edge-vs[data-reveal].is-visible{
transform(-50%,-50%) translateY(0) scale(1);
}
.deco2[data-reveal]{
transform(var(--r,0deg)) translateY(28px) scale(0.8);
transition .85s cubic-bezier(.16,.8,.24,1), transform .85s cubic-bezier(.16,.8,.24,1);
transition-delay(var(--reveal-delay, 0) * 70ms);
}
.deco2[data-reveal].is-visible{
transform(var(--r,0deg)) translateY(0) scale(1);
}
.deco2[data-reveal]{
transform(var(--r,0deg)) scale(1.14);
}
@media (prefers-reduced-motion: reduce){
[data-reveal]{ opacity:1; transform; transition; }
}

/* ==========================================================================
Buttons & Pills
========================================================================== */
.btn{
display;
align-items;
justify-content;
gap:8px;
border-radius(--radius-pill);
font-weight:600;
font-size:15px;
padding:13px 26px;
cursor;
border:1px solid transparent;
transition var(--dur-fast) var(--ease), background var(--dur-fast) var(--ease), box-shadow var(--dur-fast) var(--ease), border-color var(--dur-fast) var(--ease);
white-space;
}
.btn-primary{
background(--signal-blue);
color:#fff;
box-shadow:0 1px 2px rgba(119,76,247,0.15), 0 10px 24px -10px rgba(119,76,247,0.55);
}
.btn-primary{ background(--signal-blue-dim); transform(-1px); }
.btn-primary{ transform(0); }
@media (hover){
.btn{ transform(0.96); }
.pill-link{ border-color(--signal-blue); color(--signal-blue); }
}
.btn-lg{ padding:16px 32px; font-size:16px; }
.btn-block{ width:100%; }
.btn-nav{ padding:10px 20px; font-size:14px; }

.pill{
display;
align-items;
gap:6px;
padding:8px 16px;
border-radius(--radius-pill);
font-size:13px;
font-weight:600;
letter-spacing:0.01em;
background(--limestone-card);
border:1px solid var(--limestone-line);
color(--ink-soft);
}
.pill-link{ cursor; transition var(--dur-fast) var(--ease), color var(--dur-fast) var(--ease); }
.pill-link{ border-color(--signal-blue); color(--signal-blue); }
.pill-static{ margin-bottom:20px; color(--signal-blue); }
.pill-on-dark{ background(255,255,255,0.06); border-color(255,255,255,0.12); color:#BDA8FF; }

.accent{ color(--signal-blue); }
.accent-underline{
position;
color(--signal-blue);
}

.eyebrow{
display;
font-size:12px;
font-weight:700;
letter-spacing:0.06em;
color(--signal-blue);
margin-bottom:12px;
}
.eyebrow-inverse{ color:#BDA8FF; }
.hero-eyebrow{
display;
font-size:13px;
font-weight:700;
letter-spacing:0.1em;
text-transform;
color(--signal-blue);
}

.icon-badge{
display; align-items; justify-content;
width:48px; height:48px;
border-radius:14px;
margin-bottom:18px;
flex-shrink:0;
}
.icon-badge svg{ width:22px; height:22px; }
.icon-badge-blue{ background(--icon-blue-bg); color(--icon-blue-fg); }
.icon-badge-metal{ background(--icon-metal-bg); color(--icon-metal-fg); }
.icon-badge-green{ background(--icon-green-bg); color(--icon-green-fg); }
.icon-badge-dark{ background(255,255,255,0.08); color:#BDA8FF; }

/* ==========================================================================
Nav
========================================================================== */
.nav-wrap{
position;
top:16px; left:16px; right:16px;
z-index:100;
display;
justify-content;
pointer-events;
}
.nav{
position;
pointer-events;
width:100%;
max-width(--container);
display;
grid-template-columns(0,1fr) auto minmax(0,1fr);
align-items;
gap:24px;
padding:10px 44px;
background;
transition var(--dur-med) var(--ease);
}
.nav-logo img {
display: block;
width: 150px;
height: auto;
object-fit: contain;
}
.nav-logo{ justify-self; }
.nav-links{ justify-self; }
.nav-right{ justify-self; }
.nav-logo{
display; align-items; gap:9px;
font-weight:900; font-size:24px; letter-spacing:0.01em;
text-transform;
color(--ink);
}
.nav-links{
display; align-items; gap:32px;
font-size:12.5px; font-weight:700; color(--ink);
}
.nav-links a{
position;
text-transform;
letter-spacing:0.06em;
padding:4px 0;
transition var(--dur-fast) var(--ease);
}
.nav-links a(.btn)::after{
content:'';
position;
left:0; right:100%;
bottom:0;
height:2px;
background(--signal-blue);
transition var(--dur-fast) var(--ease);
}
.nav-links a(.btn){ color(--ink); }
.nav-links a(.btn):hover::after{ right:0; }

.nav-right{ display; align-items; gap:14px; }
.nav-lang{
display; align-items; gap:5px;
font-size:11px; font-weight:700;
letter-spacing:0.02em;
}
.nav-lang-mobile{ display; }
.nav-lang-btn{
background; border; padding:2px; cursor;
font; color(--ink-faint);
transition var(--dur-fast) var(--ease);
}
.nav-lang-btn.is-active{ color(--ink); }
.nav-lang-btn{ color(--signal-blue); }
.nav-lang-sep{ color(--limestone-line); font-size:10px; }

.nav-toggle{ display; }
.btn-nav-mobile{ display; }

/* ==========================================================================
Layout helpers
========================================================================== */
.section{ padding:140px 0; position; }
.section-head{ max-width:680px; margin-bottom:56px; }
.section-head h2{
font-size(2rem, 3.6vw, 3rem);
font-weight:800;
letter-spacing:-0.02em;
line-height:1.12;
color(--ink);
}
.section-lede{
margin-top:18px;
font-size:18px;
line-height:1.6;
color(--ink-soft);
max-width:560px;
}
.section-head-dark h2{ color(--on-dark); }
.section-lede-dark{ color(--on-dark-soft); }

/* ==========================================================================
Hero
========================================================================== */
.hero{
position;
padding:140px 0 20px;
overflow;
}
.hero-bg{
position; inset:0;
background:
radial-gradient(ellipse 60% 46% at 22% 8%, rgba(119,76,247,0.16), transparent 68%),
radial-gradient(ellipse 50% 40% at 82% 4%, rgba(119,76,247,0.16), transparent 65%);
pointer-events;
}
.hero-inner{
position;
text-align;
display;
flex-direction;
align-items;
}
.hero-h1{
margin-top:26px;
font-size(3rem, 6.6vw, 5.6rem);
font-weight:900;
letter-spacing:-0.035em;
line-height:1.03;
color(--ink);
max-width:980px;
}
.hero-sub{
margin-top:26px;
font-size(1.05rem, 1.6vw, 1.25rem);
color(--ink-soft);
max-width:600px;
line-height:1.6;
}
.hero-cta{
margin-top:38px;
display; flex-direction; align-items; gap:14px;
}
.hero-micro{ font-size:13px; color(--ink-faint); }

.funnel-wrap{
position;
max-width:860px;
margin:-15px auto 0;
height:1243px;
padding:0 20px;
}
.funnel-lines{ position; inset:0; width:100%; height:100%; overflow; }
.funnel-lines-mobile{ display; }
.funnel-mobile-marker{ display; }
.funnel-path{
fill;
stroke(#funnelGradient);
stroke-width:2;
opacity:0.72;
stroke-dasharray:9 9;
}
.funnel-path-dashed{ stroke-dasharray:6 8; opacity:0.6; }
.funnel-trunk{ stroke-dasharray; opacity:0.62; }
/* Reveal-on-load for the 6 fan-out lines + their dots, timed to match each
icon's own pop-in delay. Each variant gets its own @keyframes with a fixed
numeric end-opacity rather than var(--target-opacity) in the keyframe body:
browsers don't reliably resolve custom properties per-element when several
elements share one @keyframes name with different variable values. /
.funnel-path(.funnel-trunk)(.funnel-path-dashed),
.funnel-path-dashed{
opacity:0;
}
.funnel-path-dot{
/ The icon badge sits directly on top of this anchor point once revealed,
so showing the bare dot first (before its icon pops in) just reads as a
flash of stray dots with no purpose. /
display;
}
.funnel-wrap.is-visible .funnel-path(.funnel-trunk)(.funnel-path-dashed){
animation .45s ease-out forwards;
animation-delay(--path-delay, 0s);
}
.funnel-wrap.is-visible .funnel-path-dashed{
animation .45s ease-out forwards;
animation-delay(--path-delay, 0s);
}
@keyframes funnelPathRevealSolid{ from{ opacity:0; } to{ opacity:0.72; } }
@keyframes funnelPathRevealDashed{ from{ opacity:0; } to{ opacity:0.6; } }
@media (prefers-reduced-motion: reduce){
.funnel-path(.funnel-trunk)(.funnel-path-dashed),
.funnel-path-dashed{ opacity:0.72; }
.funnel-path-dashed{ opacity:0.6; }
.funnel-wrap.is-visible .funnel-path(.funnel-trunk)(.funnel-path-dashed),
.funnel-wrap.is-visible .funnel-path-dashed{ animation; }
}
.funnel-connector{
fill;
stroke:#7E7597;
stroke-opacity:0.4;
stroke-width:2;
stroke-dasharray:9 9;
stroke-linecap;
}
.funnel-path-dot{
fill(--signal-blue);
opacity:0.9;
}
.funnel-dot-accent{
fill(--signal-blue);
stroke:#fff;
stroke-width:2;
}
.funnel-marker-bg{ fill:#fff; stroke(23,16,68,0.08); stroke-width:1; filter(0 2px 6px rgba(23,16,68,0.14)); }
.funnel-marker circle{ fill(--signal-blue); stroke:#fff; stroke-width:2; }
.funnel-marker path{ stroke:#fff; stroke-width:2; stroke-linecap; }
.funnel-marker text{ font-family:'Inter',sans-serif; font-size:12.5px; font-weight:800; fill(--ink); fill-opacity:1; }
.funnel-node{
position;
transform(-50%,-50%) scale(0.4);
opacity:0;
}
.funnel-wrap.is-visible .funnel-node{
animation .6s cubic-bezier(.34,1.4,.64,1) forwards;
animation-delay(--node-delay, 0s);
}
@keyframes funnelNodePop{
0%{ opacity:0; transform(-50%,-50%) scale(0.4); }
60%{ opacity:1; transform(-50%,-50%) scale(1.1); }
100%{ opacity:1; transform(-50%,-50%) scale(1); }
}
@media (prefers-reduced-motion: reduce){
.funnel-node{ opacity:1; transform(-50%,-50%); }
.funnel-wrap.is-visible .funnel-node{ animation; }
}
.funnel-node-icon{
position;
width:44px; height:44px;
border-radius:13px;
display; align-items; justify-content;
box-shadow(--shadow-card);
color:#fff;
}
.funnel-node-icon svg{ width:20px; height:20px; }
.funnel-node-icon.logo-badge svg{ width:26px; height:26px; }
.funnel-node-badge-mini{
position; right:-4px; bottom:-4px;
width:20px; height:20px;
border-radius:50%;
background:#fff;
border:2px solid #fff;
box-shadow:0 4px 10px rgba(0,0,0,.18);
display; align-items; justify-content;
}
.funnel-node-badge-mini svg{ width:12px; height:12px; }
.funnel-node-icon-sm{
width:70px; height:70px; border-radius:50%;
border:3px solid #fff;
transition var(--dur-fast) var(--ease), box-shadow var(--dur-fast) var(--ease);
}
.funnel-node-icon-sm svg{ width:29px; height:29px; }
.funnel-system .funnel-node-icon-sm{ transform(1.08) rotate(-2deg); }
.funnel-chip{
position;
top:100%;
left:50%;
transform(-50%);
margin-top:10px;
display;
padding:8px 15px;
border-radius(--radius-pill);
background(--limestone-card);
border:1px solid var(--limestone-line);
font-size:12.5px;
font-weight:700;
color(--ink);
box-shadow(--shadow-card);
white-space;
}
.funnel-system{
position;
transform(-50%,-50%) scale(0.5);
opacity:0;
}
.funnel-system.in-view{
animation .55s cubic-bezier(.34,1.4,.64,1) forwards;
animation-delay(--sys-delay, 0s);
}
@media (prefers-reduced-motion: reduce){
.funnel-system{ opacity:1; transform(-50%,-50%); }
.funnel-system.in-view{ animation; }
}
/ Risk markers + capability-icon labels: scroll-triggered fade, each observed
individually so they reveal precisely as they enter view rather than all
firing together with the hero icons on page load. */
.funnel-marker{ opacity:0; }
.funnel-marker.in-view{
animation .45s ease-out forwards;
animation-delay(--marker-delay, 0s);
}
@keyframes funnelMarkerReveal{ from{ opacity:0; } to{ opacity:1; } }
.funnel-system-label{
opacity:0;
transform(-50%) translateY(6px);
}
.funnel-system-label.in-view{
animation .4s ease-out forwards;
animation-delay(--sys-delay, 0s);
}
@keyframes funnelLabelReveal{
from{ opacity:0; transform(-50%) translateY(6px); }
to{ opacity:1; transform(-50%); }
}
@media (prefers-reduced-motion: reduce){
.funnel-marker{ opacity:1; }
.funnel-marker.in-view{ animation; }
.funnel-system-label{ opacity:1; transform(-50%); }
.funnel-system-label.in-view{ animation; }
}
.funnel-node-icon-sm.tone-ink{ color:#fff; background:#171044; box-shadow:0 14px 28px -8px rgba(36,22,95,.5), 0 0 0 1px rgba(36,22,95,.08); }
.funnel-node-icon-sm.tone-orange{ color:#fff; background:#774CF7; box-shadow:0 14px 28px -8px rgba(119,76,247,.55), 0 0 0 1px rgba(119,76,247,.1); }
.funnel-system-label{
position;
transform(-50%);
width:168px;
font-size:13.5px;
font-weight:600;
line-height:1.35;
color(--ink);
text-align;
}
.funnel-system-label-right{ text-align; }

.funnel-transition{
text-align;
max-width:820px;
margin:0 auto;
padding:0 20px 0;
position;
z-index:1;
}
.funnel-transition-connector{
display;
}
.funnel-transition .pill{ margin-top:0; position; z-index:1; }
.funnel-transition h2{
font-size(2.3rem,5vw,4.1rem) !important;
line-height:1.04 !important;
margin-top:22px;
}

.cost-timeline{
position;
max-width:1040px;
margin:64px auto 0;
padding:0 20px 28px;
}
.cost-timeline::before{
content:'';
position;
left:50%; top:0; bottom:0;
width:3px;
background(--signal-blue);
opacity:0.7;
transform(-50%);
}
.cost-timeline-stage{
position;
min-height:280px;
}
.cost-timeline-content{
position;
width:34%;
top:50%;
}
.cost-timeline-stage[data-side="left"] .cost-timeline-content{ left:0; text-align; }
.cost-timeline-stage[data-side="right"] .cost-timeline-content{ right:0; text-align; }
.cost-timeline-connector{
position;
top:50%;
height:2px;
transform(-1px);
background-image(to right, rgba(129,144,179,.6) 0, rgba(129,144,179,.6) 9px, transparent 9px, transparent 18px);
}
.cost-timeline-stage[data-side="left"] .cost-timeline-connector{ left:34%; width:16%; }
.cost-timeline-stage[data-side="right"] .cost-timeline-connector{ right:34%; width:16%; }
.cost-timeline-week{
position;
left:50%; top:50%;
transform(-50%,-50%);
display;
flex-direction;
align-items;
justify-content;
gap:2px;
width:92px; height:92px;
background(--limestone-card);
border:1px solid var(--limestone-line);
border-radius:22px;
box-shadow(--shadow-card);
z-index:1;
transition var(--dur-fast) var(--ease), box-shadow var(--dur-fast) var(--ease);
}
.cost-timeline-week{
transform(-50%,-50%) scale(1.08);
box-shadow:0 18px 36px -6px rgba(119,76,247,.5), 0 0 0 1px rgba(23,16,68,.08);
}
.cost-timeline-week em{
font-style;
font-size:11px;
font-weight:800;
letter-spacing:0.08em;
color(--ink-soft);
}
.cost-timeline-week strong{
font-size:30px;
font-weight:900;
letter-spacing:-0.02em;
color(--ink);
line-height:1.1;
}
.cost-timeline-badge{
display;
padding:8px 18px;
border-radius(--radius-pill);
font-size:14px;
font-weight:700;
margin-bottom:16px;
transform(-50%);
}
.cost-timeline-badge-neutral{ background:#171044; border; color:#fff; }
.cost-timeline-badge-warn{ background:#774CF7; border; color:#fff; }
.cost-timeline-badge-loss{ background:#DC2626; border; color:#fff; }
.cost-timeline-content h4{ font-size:23px; font-weight:800; color(--ink); margin-bottom:10px; letter-spacing:-0.01em; line-height:1.2; }
.cost-timeline-content p{ font-size:15.5px; line-height:1.6; color(--ink-soft); }

.cost-timeline-verdict{
position;
max-width:420px;
margin:172px auto 0;
padding:18px 26px;
text-align;
background(150deg, var(--signal-blue), var(--signal-blue-dim));
border;
border-radius(--radius-lg);
box-shadow:0 8px 16px -14px rgba(119,76,247,.25);
transition .85s cubic-bezier(.16,.8,.24,1), transform .85s cubic-bezier(.16,.8,.24,1), box-shadow var(--dur-fast) var(--ease);
}
.cost-timeline-verdict{
transform(1.03);
box-shadow:0 8px 14px -10px rgba(119,76,247,.3);
}
.cost-timeline-verdict p{
font-size:15px;
font-weight:600;
line-height:1.45;
color:#fff;
}
.cost-timeline-verdict strong{ font-weight:800; color:#fff; }

/* ==========================================================================
Cards
========================================================================== */
.two-card-row{ display; grid-template-columns:1fr 1fr; gap:24px; margin-bottom:24px; }
.compare-row{ display; grid-template-columns:1fr 1fr; gap:24px; }

/* ==========================================================================
Edge comparison
========================================================================== */
.edge-compare{
position;
display;
grid-template-columns:1fr 1fr;
gap:72px;
max-width:980px;
margin:0 auto;
align-items;
}
.edge-compare[data-reveal]{ opacity:1; transform; transition; }
.edge-vs{
position;
left:50%; top:50%;
width:50px; height:50px;
border-radius:50%;
background(150deg, var(--signal-blue), var(--signal-blue-dim));
border:3px solid var(--limestone);
display; align-items; justify-content;
font-size:11px; font-weight:800; letter-spacing:0.03em;
color:#fff;
box-shadow:0 10px 24px -6px rgba(119,76,247,.65), 0 0 0 6px rgba(119,76,247,.12);
z-index:2;
}
.edge-col{
position;
z-index:1;
border-radius(--radius-lg);
padding:44px 40px;
}
.edge-col-us{
background(165deg, #ffffff 0%, #F2F6FF 100%);
border:2px solid var(--signal-blue);
box-shadow:0 30px 60px -24px rgba(119,76,247,0.38), 0 4px 14px -4px rgba(36,22,95,.06);
}
.edge-col-them{
background(255,255,255,0.35);
border:1px solid var(--limestone-line);
box-shadow;
}
.edge-col-badge{
position;
top:0; right:32px;
transform(-50%);
display; align-items; gap:6px;
background(135deg, var(--signal-blue), var(--signal-blue-dim));
color:#fff;
font-size:11.5px;
font-weight:800;
letter-spacing:0.04em;
text-transform;
padding:8px 16px 8px 12px;
border-radius(--radius-pill);
box-shadow:0 10px 20px -6px rgba(119,76,247,0.55);
}
.edge-col-badge svg{ width:13px; height:13px; flex-shrink:0; }
.nav-logo-mark{
display; align-items; justify-content;
width:30px; height:30px;
border-radius:9px;
background(150deg, var(--signal-blue), var(--signal-blue-dim));
color:#fff;
flex-shrink:0;
box-shadow:0 6px 14px -5px rgba(119,76,247,.55), inset 0 1px 1px rgba(255,255,255,.35);
}
.edge-col-head{
display; align-items; gap:12px;
padding-bottom:18px;
margin-bottom:6px;
font-size:18px; font-weight:800; color(--ink); letter-spacing:-0.01em;
}
.edge-col-them .edge-col-head{
color(--ink-soft);
font-weight:700;
gap:10px;
}
.edge-col-them-mark{
display; align-items; justify-content;
width:30px; height:30px;
border-radius:9px;
border:1.5px solid var(--limestone-line);
color(--ink-faint);
flex-shrink:0;
}
.edge-col-them-mark svg{ width:14px; height:14px; }
.edge-col-caption{
font-size:13px; color(--ink-faint); font-weight:500;
padding-bottom:20px; margin-bottom:20px;
border-bottom:1px solid var(--limestone-line);
}
.edge-col-them .edge-col-caption{ color(--ink-soft); }
.edge-col ul{ display; flex-direction; gap:22px; }
.edge-col li{ display; align-items; gap:16px; }
.edge-col li span{ font-size:15.5px; line-height:1.5; color(--ink); }
.edge-col-them li span{ color(--ink-soft); font-weight:500; }
.edge-icon{
flex-shrink:0;
width:48px; height:48px;
border-radius:14px;
display; align-items; justify-content;
}
.edge-icon svg{ width:23px; height:23px; }
.edge-icon-us{
background(150deg, var(--signal-blue), var(--signal-blue-dim));
color:#fff;
box-shadow:0 8px 16px -7px rgba(119,76,247,.6), inset 0 1px 1px rgba(255,255,255,.3);
}
.edge-icon-them{
background;
border:1.5px solid var(--limestone-line);
color(--ink-soft);
width:48px; height:48px;
}
.edge-icon-them svg{ width:19px; height:19px; }

@media (max-width:760px){
.edge-compare{ grid-template-columns:1fr; gap:24px; }
.edge-divider{ display; }
.edge-vs{ display; }
.edge-col{ padding:32px 26px; }
.edge-col-badge{ right:26px; }
}
.card{
padding:36px;
border-radius(--radius-lg);
}
.card-light{
background(--limestone-card);
border:1px solid var(--limestone-line);
box-shadow(--shadow-card);
transition var(--dur-med) var(--ease), box-shadow var(--dur-med) var(--ease);
}
.card-light{ transform(-4px); box-shadow(--shadow-lift); }
.card-light h3,.card-light h4{ font-size:20px; font-weight:700; margin-bottom:12px; letter-spacing:-0.01em; }
.card-light p{ color(--ink-soft); line-height:1.6; font-size:15px; }
.card-dark{
background(--graphite);
color(--on-dark);
}
.card-dark h3,.card-dark h4{ font-size:20px; font-weight:700; margin-bottom:12px; color:#fff; letter-spacing:-0.01em; }
.card-dark p{ color(--on-dark-soft); line-height:1.6; font-size:15px; }

.highlight-bar{
margin-top:24px;
padding:34px 40px;
border-radius(--radius-lg);
background:#F0EBFF;
color(--ink);
}
.highlight-bar p{ font-size(1.1rem,1.8vw,1.4rem); font-weight:600; line-height:1.4; letter-spacing:-0.01em; }
.highlight-bar strong{ color(--signal-blue-dim); }
.highlight-bar-dark{ background(--graphite); color(--on-dark); }
.highlight-bar-dark strong{ color:#BDA8FF; }

/* ==========================================================================
Timeline (section 03)
========================================================================== */
.timeline{ position; padding:20px 0; max-width:900px; margin:0 auto; }
.timeline-line{
position; left:50%; top:0; bottom:0; width:2px;
background(--limestone-line);
transform(-50%);
}
.timeline-line-fill{
position; top:0; left:0; width:100%; height:0%;
background(--signal-blue);
transition .2s linear;
}
.timeline-step{
position;
width(50% - 40px);
margin-bottom:32px;
}
.timeline-step-right{ margin-left(50% + 40px); }
.timeline-marker{
position; top:0;
width:36px; height:36px;
border-radius:50%;
background(--limestone-card);
border:2px solid var(--limestone-line);
display; align-items; justify-content;
font-size:12px; font-weight:700; color(--ink-soft);
}
.timeline-step(.timeline-step-right) .timeline-marker{ right:-58px; }
.timeline-step-right .timeline-marker{ left:-58px; }
.timeline-step.is-active .timeline-marker{ background(--signal-blue); border-color(--signal-blue); color:#fff; }
.timeline-card{
background(--limestone-card);
border:1px solid var(--limestone-line);
border-radius(--radius-md);
padding:24px 26px;
box-shadow(--shadow-card);
}
.timeline-card h4{ font-size:16.5px; font-weight:700; margin-bottom:8px; letter-spacing:-0.01em; }
.timeline-card p{ font-size:14.5px; color(--ink-soft); line-height:1.55; }

/* ==========================================================================
Process rows (section 04)
========================================================================== /
.section-system{ overflow; margin-top:-140px; }
.section-bridge-line{
width:3px;
height:100px;
margin:-20px auto 0;
background(--signal-blue);
opacity:0.7;
}
/ Desktop-only bridge; the mobile equivalent (.cost-timeline-bend, a
curved SVG rather than a straight bar) takes over below 760px ÃƒÂ¢Ã¢â€šÂ¬Ã¢â‚¬Â see
that media query for why a straight line can't do this job there. /
.cost-timeline-bend{ display; }
.section-head-center{
position;
max-width:720px;
margin-left;
margin-right;
text-align;
padding-top:70px;
}
.section-head-center .section-lede{ margin-left; margin-right; }
.section-head-connector{
position;
left:50%; top:0;
width:2px; height:70px;
transform(-50%);
background(--signal-blue);
opacity:0.7;
}
#system .section-head-connector{ width:3px; }
/ Pulls the edge-comparison section up so the gap below the case-study
carousel matches the tight gap above it (headline to images), instead
of the much larger default section spacing. /
#fordel{ margin-top:-224px; }
@media (max-width:1024px){ #fordel{ margin-top:-168px; } }
#system .section-head-center{ transform !important; margin-bottom:76px; }
/ The process-list connector (below) is extended all the way into this
section's headline, so cadence doesn't need its own short connector ÃƒÂ¢Ã¢â€šÂ¬Ã¢â‚¬Â
having both rendered a visible double-line where they overlapped. */
#cadence .section-head-connector{ display; }
#fordel .section-head-connector{ display; }
#system .section-head-center .pill-static{ margin-bottom:40px; }

.process-list{ position; display; flex-direction; gap:40px; margin-bottom:40px; margin-top:56px; max-width:960px; margin-left; margin-right; }
/* The list itself is only observed (via [data-reveal]) so the connector
line below can fade in on the same schedule as the cards ÃƒÂ¢Ã¢â€šÂ¬Ã¢â‚¬Â the rows
already animate individually, so the container's own default reveal
transform/opacity is cancelled out here to avoid double-animating them. */
.process-list[data-reveal]{ opacity:1; transform; transition; }
.process-list::before{
content:'';
position;
left:50%; top:-36px; bottom:-230px;
width:3px;
background(--signal-blue);
opacity:0;
transform(-50%);
transition .9s cubic-bezier(.16,.8,.24,1);
transition-delay:.15s;
z-index:0;
}
.process-list[data-reveal].is-visible::before{ opacity:0.7; }
@media (prefers-reduced-motion: reduce){
.process-list::before{ opacity:0.7; transition; }
}
.process-row{ position; z-index:1; }
.process-row{
display;
grid-template-columns:1fr 1fr;
gap:56px;
align-items;
background(--limestone-card);
border:1px solid var(--limestone-line);
border-radius(--radius-lg);
padding:40px;
box-shadow(--shadow-card);
}
.process-row-reverse{ direction; }
.process-row-reverse > *{ direction; }
.process-num{
display; align-items; justify-content;
width:60px; height:60px; border-radius:50%;
background(--signal-blue); color:#fff;
font-weight:800; font-size:20px; margin-bottom:24px;
}
.process-copy h3{ font-size:34px; font-weight:900; letter-spacing:-0.02em; line-height:1.1; margin-bottom:16px; }
.process-copy p{ color(--ink-soft); line-height:1.65; font-size:16.5px; font-weight:400; max-width:440px; }

.process-visual{ align-self; display; }
.mock-card{
position;
border-radius(--radius-md);
overflow;
min-height:320px;
width:100%;
background-size;
background-position;
box-shadow:0 20px 40px -18px rgba(23,16,68,0.32);
}
.mock-diagnose{ background-image('images/2026-07-22-19-22-37-process-diagnose.jpg?v=3'); }
.mock-build{ background-image('images/2026-07-22-19-22-50-process-build.jpg?v=3'); }
.mock-launch{ background-image('images/2026-07-22-19-23-05-process-launch.jpg?v=3'); }
.mock-optimise{ background-image('images/2026-07-22-19-23-20-process-optimize.jpg?v=3'); }
.mock-card-panel{
position;
z-index:2;
margin:18px;
padding:18px 20px;
background(255,255,255,0.94);
backdrop-filter(14px);
-webkit-backdrop-filter(14px);
border-radius:14px;
box-shadow:0 10px 28px rgba(15,22,50,0.22);
display; flex-direction; gap:12px;
}
.mock-row{ display; align-items; justify-content; font-size:14px; color(--ink-soft); }
.mock-row strong{ color(--ink); font-size:15px; }
.mock-tag{ font-size:11.5px; font-weight:700; padding:4px 10px; border-radius(--radius-pill); }
.mock-tag-ok{ background:#E2F6EA; color:#16803C; }
.mock-tag-pending{ background:#F0EBFF; color:#6034D8; }
.mock-bar{ height:6px; border-radius:99px; background(--limestone-line); overflow; margin-top:4px; }
.mock-bar div{ height:100%; background(--signal-blue); border-radius:99px; }
.mock-grid{ display; grid-template-columns:1fr 1fr; gap:12px; }
.mock-tile{
background(--limestone-card);
border:1px solid var(--limestone-line);
border-radius:12px;
padding:20px 14px;
text-align;
font-size:13.5px;
font-weight:600;
color(--ink-soft);
}
.mock-channel{ display; align-items; gap:10px; font-size:14px; font-weight:600; color(--ink); padding:10px 0; border-bottom:1px solid var(--limestone-line); }
.mock-channel{ border-bottom; }
.mock-channel-off{ color(--ink-faint); font-weight:500; }
.mock-dot{ width:9px; height:9px; border-radius:50%; background(--ink-faint); flex-shrink:0; }
.mock-sparkline{ width:100%; height:80px; margin-bottom:8px; }

/* ==========================================================================
Cadence carousel ÃƒÂ¢Ã¢â€šÂ¬Ã¢â‚¬Â full-bleed, large-format image gallery. Breaks out of
.container entirely (edge to edge) with an infinite/looping scroll (see
script.js), closer to a social/ad-creative feed than a bordered card
grid: big bold photos, no card chrome, caption sits directly on the
light page background rather than in a shadowed box.
========================================================================== */
.section-cadence{ margin-top:-160px; }
.section-cadence .section-head-center{ margin-bottom:56px; max-width:860px; }

.cadence-carousel{
display;
gap:24px;
overflow-x;
scroll-behavior;
padding:4px max(24px, calc((100vw - var(--container))/2)) 8px;
scrollbar-width;
touch-action;
}
.cadence-carousel::-webkit-scrollbar{ display; }
.cadence-slide{
flex:0 0 auto;
width:340px;
}
.cadence-visual{
position;
aspect-ratio:3/4;
border-radius:28px;
margin-bottom:18px;
overflow;
}
.cadence-visual img{
width:100%;
height:100%;
object-fit;
display;
transition var(--dur-med) var(--ease);
}
.cadence-slide .cadence-visual img{ transform(1.04); }
.cadence-slide{
opacity:0;
transform(26px) scale(0.97);
transition .7s cubic-bezier(.16,.8,.24,1), transform .7s cubic-bezier(.16,.8,.24,1);
}
.cadence-carousel.is-visible .cadence-slide{ opacity:1; transform; }
.cadence-slide(9n+2){ transition-delay:70ms; }
.cadence-slide(9n+3){ transition-delay:140ms; }
.cadence-slide(9n+4){ transition-delay:210ms; }
.cadence-slide(9n+5){ transition-delay:280ms; }
.cadence-slide(9n+6){ transition-delay:350ms; }
.cadence-slide(9n+7){ transition-delay:420ms; }
.cadence-slide(9n+8){ transition-delay:490ms; }
.cadence-slide(9n+9){ transition-delay:560ms; }
@media (prefers-reduced-motion: reduce){
.cadence-slide{ opacity:1; transform; transition; }
}
.cadence-visual::after{
content:'';
position; inset:0;
background(to top, rgba(10,10,10,.65) 0%, rgba(10,10,10,.08) 34%, transparent 55%);
pointer-events;
}
.cadence-visual-stat{
position;
left:18px; bottom:16px;
z-index:1;
font-size:14px;
font-weight:700;
color:#fff;
text-shadow:0 1px 3px rgba(0,0,0,.4);
}
.cadence-visual-stat strong{ font-size:17px; font-weight:800; }

.cadence-tag{
display;
font-size:12px; font-weight:800;
letter-spacing:0.06em;
color(--signal-blue);
margin-bottom:10px;
}
.cadence-slide h3{ font-size:18px; font-weight:600; color(--ink); margin-bottom:10px; letter-spacing:-0.015em; }
.cadence-slide p{
font-size:14.5px; line-height:1.6; color(--ink-soft); max-width:300px;
display:-webkit-box;
-webkit-line-clamp:4;
-webkit-box-orient;
overflow;
}

@media (max-width:760px){
.cadence-slide{ width:76vw; }
}

@media (max-width:760px){
.section-cadence .section-head-center{ margin-bottom:32px; }
.cadence-slide{ width:72vw; }
}

/* ==========================================================================
Dark capability section (05)
========================================================================== */
.section-dark{
background(--graphite);
padding:140px 0;
position;
}
.cap-grid{ display; grid-template-columns(3,1fr); gap:20px; }
.cap-card{
background(--graphite-card);
border:1px solid rgba(255,255,255,0.07);
border-radius(--radius-lg);
padding:32px;
transition var(--dur-med) var(--ease), border-color var(--dur-med) var(--ease);
}
.cap-card{ transform(-4px); border-color(119,76,247,0.4); }
.cap-card h4{ font-size:19px; font-weight:700; color:#fff; margin-bottom:16px; letter-spacing:-0.01em; }
.cap-card ul{ display; flex-direction; gap:9px; }
.cap-card li{
font-size:14px; color(--on-dark-soft); line-height:1.5;
padding-left:16px; position;
}
.cap-card li::before{
content:''; position; left:0; top:8px;
width:5px; height:5px; border-radius:50%; background(--signal-blue);
}

/* ==========================================================================
Growth loop (07)
========================================================================== */
.loop-wrap{ position; max-width:640px; margin:0 auto; aspect-ratio:1/1; cursor; }
.loop-svg{ width:100%; height:100%; overflow; }

.loop-ring-outer{
stroke(--ink);
stroke-width:1;
opacity:0.16;
}
.loop-ring{
stroke(--ink);
stroke-width:1.8;
opacity:0.4;
stroke-dasharray:2 12;
transform-origin:320px 320px;
animation 60s linear infinite;
}
@keyframes loopRotate{ to{ transform(360deg); } }

.loop-spokes{ pointer-events; }
.loop-spoke{
stroke(--ink);
stroke-width:1.6;
stroke-linecap;
opacity:0.3;
transition var(--dur-med) var(--ease), stroke-width var(--dur-med) var(--ease), stroke var(--dur-med) var(--ease);
}
.loop-spoke.is-active{
stroke(--signal-blue);
opacity:0.95;
stroke-width:2.4;
stroke-dasharray:5 7;
animation 1.1s linear infinite;
}
@keyframes loopSpokeFlow{ to{ stroke-dashoffset:-24; } }

.loop-cursor-dot{
fill(--signal-blue);
opacity:0;
transition var(--dur-fast) var(--ease);
}
.loop-wrap .loop-cursor-dot{ opacity:1; }

.loop-hub-halo{
fill;
stroke(--signal-blue);
stroke-width:1;
opacity:0.18;
}
.loop-hub-ring{
stroke(255,255,255,0.14);
stroke-width:1;
}
.loop-hub-orbit-dot{
fill(--warm-metal);
transform-origin:320px 320px;
animation 12s linear infinite;
}
@keyframes loopOrbit{ to{ transform(360deg); } }

.loop-center{ fill(--graphite); }
.loop-center-label{ fill(--warm-metal); font-size:12px; font-weight:700; letter-spacing:0.12em; font-family:'Inter',sans-serif; }
.loop-center-title{ fill:#fff; font-size:15.5px; font-weight:800; letter-spacing:-0.01em; font-family:'Inter',sans-serif; }

.loop-hub-card{ display; }

.loop-node{
position; transform(-50%,-50%);
display; flex-direction; align-items; gap:0;
text-align;
background(180deg, var(--limestone-card), #fbf9f5);
border:1px solid var(--limestone-line);
border-radius:50%;
width:140px; height:140px;
padding:22px 20px;
box-sizing;
justify-content;
box-shadow(--shadow-card);
transition var(--dur-med) var(--ease), border-color var(--dur-med) var(--ease), box-shadow var(--dur-med) var(--ease);
cursor;
}
.loop-node-num{
display;
font-size:10px; font-weight:800; color(--signal-blue);
letter-spacing:0.14em;
margin-bottom:8px;
}
.loop-node-icon{
display; align-items; justify-content;
width:38px; height:38px; margin-bottom:9px; flex-shrink:0;
border-radius:11px;
background(--icon-blue-bg, #F0EBFF);
color(--signal-blue);
transition var(--dur-med) var(--ease), background var(--dur-med) var(--ease);
}
.loop-node-icon svg{ width:18px; height:18px; }
.loop-node, .loop-node.is-near{
transform(-50%,-50%) scale(1.08);
border-color(--signal-blue);
box-shadow:0 24px 60px -16px rgba(119,76,247,.35), var(--shadow-lift);
}
.loop-node .loop-node-icon{ transform(1.1); background(--signal-blue); color:#fff; }
.loop-node{ outline:2px solid var(--signal-blue); outline-offset:3px; }
.loop-node-title{ font-size:14px; font-weight:700; color(--ink); line-height:1.2; max-width:88px; }
.loop-node-sub{ font-size:11px; color(--ink-faint); margin-top:3px; max-width:88px; line-height:1.3; }

.section-tail-connector{
display;
width:2px; height:64px;
margin:0 auto;
background-image(to bottom, var(--signal-blue) 60%, transparent 0%);
background-size:2px 12px;
background-repeat;
opacity:0.6;
}
@media (prefers-reduced-motion: reduce){
.loop-ring{ animation; }
.loop-hub-orbit-dot{ animation; }
.loop-spoke.is-active{ animation; }
}

/* ==========================================================================
Dashboard mockup (08)
========================================================================== */
.section-mockup{ overflow; }
.dash-stage{
position;
max-width:1040px;
margin:64px auto 0;
padding:64px 56px 72px;
border-radius:44px;
background:
radial-gradient(ellipse 70% 55% at 18% 0%, rgba(119,76,247,.14), transparent 60%),
radial-gradient(ellipse 60% 50% at 100% 100%, rgba(23,16,68,.08), transparent 60%),
var(--limestone);
border:1px solid var(--limestone-line);
overflow;
}
.dash-frame{
position;
max-width:960px;
margin:0 auto;
padding:8px;
border-radius:32px;
background(160deg, #F0EBFF, var(--limestone-card) 55%);
box-shadow:0 40px 90px -30px rgba(23,16,68,.28);
}
.dash-window{
background(--limestone-card);
border-radius:26px;
overflow;
box-shadow(--shadow-lift);
border:1px solid var(--limestone-line);
}
.dash-topbar{
display; align-items; justify-content;
padding:18px 26px;
background(--graphite);
color:#fff;
}
.dash-brand{ font-weight:700; font-size:15px; }
.dash-pill{ font-size:12px; font-weight:600; background(255,255,255,0.1); padding:5px 12px; border-radius(--radius-pill); }
.dash-body{ display; grid-template-columns:0.9fr 1.4fr; gap:1px; background(--limestone-line); }
.dash-col{ background(--limestone-card); padding:24px; display; flex-direction; gap:16px; }
.dash-col-wide{ }
.dash-card{ background(--limestone); border-radius:16px; padding:20px; }
.dash-label{ font-size:12.5px; font-weight:600; color(--ink-soft); }
.dash-big{ display; font-size:30px; font-weight:800; letter-spacing:-0.02em; margin-top:8px; }
.dash-big small{ font-size:16px; font-weight:600; color(--ink-soft); }
.dash-mini-row{ font-size:12.5px; color(--ink-faint); margin-top:6px; }
.dash-up{ color:#16803C; font-weight:700; }
.dash-quality{ display; align-items; gap:12px; margin-top:10px; }
.dash-quality-bar{ flex:1; height:8px; border-radius:99px; background(--limestone-line); overflow; }
.dash-quality-bar div{ height:100%; background(--warm-metal); border-radius:99px; }
.dash-row-between{ display; align-items; justify-content; }
.dash-select{ font-size:12px; color(--ink-faint); background(--limestone-card); padding:5px 10px; border-radius:99px; border:1px solid var(--limestone-line); }
.dash-chart{ width:100%; height:110px; margin-top:14px; }
.dash-card-ai{ background(--graphite); }
.dash-card-ai .dash-label{ color(--on-dark-soft); }
.dash-ai-query{ color:#fff; font-size:14.5px; font-style; margin:10px 0; }
.dash-ai-answer{ font-size:12.5px; color(--on-dark-soft); display; align-items; gap:8px; }
.dash-ai-check{ color:#BDA8FF; font-weight:700; }
.dash-toast{
position; top:-18px; right:24px;
background(--limestone-card);
border:1px solid var(--limestone-line);
border-radius(--radius-pill);
padding:11px 18px;
font-size:13px; font-weight:600;
display; align-items; gap:9px;
box-shadow(--shadow-lift);
opacity:0;
transform(8px);
transition .4s var(--ease), transform .4s var(--ease);
z-index:2;
}
.dash-toast.is-shown{ opacity:1; transform(0); }
.dash-toast-dot{ width:8px; height:8px; border-radius:50%; background:#16803C; }

.dash-badge-float{
position; left:-28px; bottom:-26px;
display; flex-direction;
background(--graphite);
color:#fff;
border-radius:20px;
padding:16px 22px;
box-shadow:0 24px 50px -16px rgba(23,16,68,.5);
transform(-4deg);
z-index:2;
}
.dash-badge-float-num{ font-size:26px; font-weight:800; letter-spacing:-0.02em; color(--warm-metal); }
.dash-badge-float-label{ font-size:12px; font-weight:600; color(--on-dark-soft); margin-top:2px; }

/* ==========================================================================
Cost table (09)
========================================================================== */
.cost-card{
background(--limestone-card);
border:1px solid var(--limestone-line);
border-radius(--radius-lg);
padding:40px 44px;
box-shadow(--shadow-card);
}
.cost-row{ display; align-items; justify-content; padding:16px 0; border-bottom:1px solid var(--limestone-line); font-size:15.5px; }
.cost-row span{ color(--ink-soft); }
.cost-row strong{ font-weight:700; }
.cost-row-total{
margin-top:8px;
border-bottom;
background(--graphite);
color:#fff;
padding:20px 24px;
border-radius(--radius-md);
}
.cost-row-total span{ color(--on-dark-soft); font-weight:600; }
.cost-row-total strong{ font-size:18px; }
.cost-caveat{ font-size:13px; color(--ink-faint); margin-top:16px; font-style; }
.fee-grid{ display; grid-template-columns(3,1fr); gap:20px; margin-top:56px; }

/* ==========================================================================
FAQ
========================================================================== */
.faq-list{ display; flex-direction; gap:12px; }
.faq-item{
background(--limestone-card);
border:1px solid var(--limestone-line);
border-radius(--radius-md);
padding:22px 26px;
}
.faq-item summary{
cursor;
font-weight:600;
font-size:16px;
list-style;
display;
align-items;
justify-content;
}
.faq-item summary::-webkit-details-marker{ display; }
.faq-item summary::after{
content:'+';
font-size:20px;
color(--ink-faint);
transition var(--dur-fast) var(--ease);
flex-shrink:0;
margin-left:16px;
}
.faq-item[open] summary::after{ transform(45deg); }
.faq-item p{ margin-top:14px; color(--ink-soft); font-size:14.5px; line-height:1.6; }

/* ==========================================================================
Final CTA (10)
========================================================================== */
.section-final{
position; overflow;
min-height:100vh;
display; align-items; justify-content;
padding-top:120px; padding-bottom:120px;
box-sizing;
}
.section-final::before{
content:'';
position; inset:0;
background(ellipse 55% 45% at 50% 50%, rgba(119,76,247,.10), transparent 70%);
pointer-events;
}
.section-final .section-head{ text-align; margin-left; margin-right; margin-bottom:48px; max-width:900px; }
.section-final .section-head h2{
font-size(2.4rem, 4.5vw, 4.2rem) !important;
line-height:1.02 !important;
}
.section-final .section-lede{ margin-left; margin-right; }
.final-cta{ margin-top:8px; }
.final-cta .btn-lg{ padding:19px 44px; font-size:17px; }
.final-deco{ position; inset:0; pointer-events; }
.deco{
position;
filter(0 16px 30px rgba(23,16,68,0.16));
}
.deco-badge{
display; align-items; justify-content;
width:100%; height:100%;
border-radius:28%;
}
.deco-badge svg{ width:44%; height:44%; }
.deco-badge-navy-fill{ background(--graphite); color:#fff; border-radius:50%; }
.deco-badge-orange-fill{ background(--signal-blue); color:#fff; border-radius:50%; }
.deco-badge-cream{ background(--icon-metal-bg, #F4F0FF); color(--signal-blue-dim, var(--signal-blue)); border:1px solid rgba(23,16,68,.08); }
.deco-badge-navy-tint{ background(23,16,68,.08); color(--graphite); border:1px solid rgba(23,16,68,.12); }
.deco-badge-orange-tint{ background(--icon-blue-bg, #F0EBFF); color(--signal-blue); border-radius:50%; }

.final-deco-illustrated .deco{ filter(0 18px 32px rgba(23,16,68,0.22)); }
.final-deco-illustrated .deco img{
width:100%; height:100%;
object-fit;
border-radius:28%;
background:#F3F6FC;
}

.final-deco-loose{ overflow; }
.deco2{
position;
filter(0 14px 26px rgba(23,16,68,0.22));
transform(var(--r,0deg));
transition var(--dur-fast) var(--ease), filter var(--dur-fast) var(--ease);
pointer-events;
cursor;
}
.deco2{
transform(var(--r,0deg)) scale(1.14);
filter(0 20px 34px rgba(119,76,247,0.4));
}
.deco2 img{ width:100%; height; display; }

.deco2-1{  top:6%;   left:16%;  width:158px; --r:-8deg; }
.deco2-2{  top:70%;  left:5%;   width:120px; --r:11deg; }
.deco2-3{  top:15%;  left:37%;  width:70px;  --r:-14deg; }
.deco2-4{  bottom:4%; right:29%; width:132px; --r:7deg; }
.deco2-5{  top:47%;  left:2%;   width:70px;  --r:12deg; opacity:0.95; }
.deco2-6{  top:7%;   right:9%;  width:104px; --r:-11deg; }
.deco2-7{  top:83%;  left:47%;  width:56px;  --r:10deg; opacity:0.95; }
.deco2-8{  top:29%;  right:5%;  width:94px;  --r:-6deg; }
.deco2-9{  top:59%;  right:1%;  width:50px;  --r:16deg; opacity:0.9; }
.deco2-10{ bottom:9%; left:33%; width:128px; --r:5deg; }
.deco2-11{ top:35%;  right:21%; width:88px;  --r:-9deg; }
.deco2-12{ top:90%;  left:64%;  width:60px;  --r:-15deg; opacity:0.9; }

@media (max-width:760px){
/* The desktop layout scatters 12 stickers across a short, wide section,
leaving plenty of margin beside the centered headline. On mobile the
section is much narrower and taller, so those same positions land
directly on top of the headline and button. Rather than reuse
percentages tuned for a different aspect ratio, only the stickers that
sit cleanly in the top and bottom margins are kept, shrunk down so
they read as light corner accents instead of dominating a small
screen. /
.deco2{ transform(0.58) rotate(var(--r,0deg)); }
/ All 12 now kept (only 5 were before) ÃƒÂ¢Ã¢â€šÂ¬Ã¢â‚¬Â repositioned into the top and
bottom margins around the headline/button instead of reusing
desktop's wide-short-section percentages, which land several of
these directly on top of the text on a narrow-tall mobile section. */
.deco2-1{ top:1%; left:2%; bottom; right; }
.deco2-2{ top; bottom:2%; left:0; right; }
.deco2-3{ top:16%; left:6%; bottom; right; }
.deco2-4{ top; bottom:15%; right:16%; left; }
.deco2-5{ top:24%; right:10%; bottom; left; }
.deco2-6{ top:1%; right:0; left; bottom; }
.deco2-7{ top; bottom:22%; left:22%; right; }
.deco2-8{ top:9%; right:-2%; left; bottom; }
.deco2-9{ top:20%; left:22%; bottom; right; }
.deco2-10{ top; bottom:6%; left:24%; right; }
.deco2-11{ top:12%; right:24%; bottom; left; }
.deco2-12{ top; bottom:1%; right:4%; left; }
}
.deco-1{ top:8%;  left:6%;  width:126px; height:126px; transform(-9deg); }
.deco-2{ top:14%; right:8%; width:104px; height:104px; transform(11deg); }
.deco-3{ bottom:22%; left:14%; width:86px;  height:86px;  transform(-7deg); }
.deco-4{ bottom:10%; right:16%; width:118px; height:118px; transform(6deg); }
.deco-5{ top:48%; left:3%;  width:74px;  height:74px;  transform(14deg); opacity:0.92; }
.deco-6{ top:6%;  right:26%; width:70px;  height:70px;  transform(-12deg); opacity:0.9; }
.deco-7{ bottom:6%; left:34%; width:80px; height:80px; transform(9deg); opacity:0.9; }

.apply-form{
background(--limestone-card);
border:1px solid var(--limestone-line);
border-radius(--radius-lg);
padding:44px;
box-shadow(--shadow-card);
}
.form-grid{ display; grid-template-columns:1fr 1fr; gap:20px; margin-bottom:28px; }
.form-field{ display; flex-direction; gap:8px; }
.form-field-full{ grid-column:1 / -1; }
.form-field span{ font-size:13px; font-weight:600; color(--ink-soft); }
.form-field input, .form-field select, .form-field textarea{
font-family;
font-size:15px;
padding:12px 14px;
border-radius:11px;
border:1px solid var(--limestone-line);
background(--limestone);
color(--ink);
resize;
transition var(--dur-fast) var(--ease), background var(--dur-fast) var(--ease);
}
.form-field input, .form-field select, .form-field textarea{
outline;
border-color(--signal-blue);
background:#fff;
}
.form-note{ text-align; margin-top:16px; font-size:13px; color(--ink-faint); }

/* ==========================================================================
Footer
========================================================================== */
.footer{ padding:36px 0 48px; border-top:1px solid var(--limestone-line); }
.footer-inner{ display; align-items; justify-content; font-size:13px; color(--ink-faint); }
.footer-links{ display; gap:20px; }
.footer-links a{ transition var(--dur-fast) var(--ease); }
.footer-links a{ color(--ink); }

/* ==========================================================================
Responsive
========================================================================== */
@media (max-width:1024px){
.container{ padding:0 24px; }
.section{ padding:100px 0; }
.process-list::before{ bottom:-154px; }
.section-cadence{ margin-top:-120px; }
.cap-grid{ grid-template-columns:1fr 1fr; }
.cadence-grid{ grid-template-columns:1fr; gap:20px; }
.fee-grid{ grid-template-columns:1fr; }
.dash-body{ grid-template-columns:1fr; }
.form-grid{ grid-template-columns:1fr; }
.loop-node{ width:110px; height:110px; }
}

/* Below the width where equal centered columns have room for the
lang switcher + CTA, cluster logo+links left instead of colliding. */
@media (min-width:761px) and (max-width:1150px){
.nav{ display; gap:28px; }
.nav-logo{ justify-self; }
.nav-links{ justify-self; gap:18px; font-size:11.5px; }
.nav-right{ justify-self; margin-left; }
}

@media (max-width:760px){
.nav-wrap{ top(12px, env(safe-area-inset-top)); left:12px; right:12px; }
/* Base .nav is a 3-col grid (logo / links / right) for desktop's centered
nav-links. On mobile nav-links is pulled out with position, so
its grid track collapses to near-zero width but still eats a share of
the free space, leaving the hamburger stranded mid-header instead of
flush right. Flex with space-between sidesteps the grid math entirely. /
.nav{ display; align-items; justify-content; gap:10px; padding:8px 8px 8px 16px; }
/ .nav-right (desktop lang switcher + CTA, both display below) still
counts as a 3rd flex item even though it's visually empty, so
space-between spreads logo/toggle/nav-right evenly across the header
instead of pinning logo left and toggle right. Removing it from flow
leaves exactly the two items space-between is meant to split. /
.nav-right{ display; }
.nav-logo-text{ font-size:19px; white-space; }
/ Full-screen takeover sheet, not a floating dropdown card: it fills
everything below the header bar (the header itself, logo + close icon,
stays visible on top as the panel's title row) so opening the menu
reads as switching screens the way a native app does. /
.nav-links{
position;
top:0; left:0; right:0; bottom:0;
width:100%;
height:100%;
margin:0;
max-width;
transform;
flex-direction;
align-items;
justify-content;
gap:2px;
background:
radial-gradient(ellipse 75% 42% at 10% 0%, rgba(119,76,247,.16), transparent 60%),
radial-gradient(ellipse 60% 40% at 100% 14%, rgba(119,76,247,.14), transparent 62%),
var(--limestone);
border;
border-radius:0;
box-shadow;
padding(max(12px, env(safe-area-inset-top)) + 76px) 22px calc(28px + env(safe-area-inset-bottom));
opacity:0;
visibility;
z-index:41;
transition .3s var(--ease), visibility 0s linear .3s;
}
.nav-links.is-open{
opacity:1;
visibility;
transition .3s var(--ease);
}
.nav-backdrop{ display; }
body.nav-open{ overflow; }
.nav-links a(.btn){
padding:20px 6px;
border-radius:14px;
font-size:24px;
font-weight:800;
letter-spacing:0;
text-transform;
border-bottom:1px solid var(--limestone-line);
-webkit-tap-highlight-color;
transition .15s var(--ease), color .15s var(--ease), transform .15s var(--ease);
}
/  can't be used here: it matches the last <a> among ALL
<a> siblings regardless of the (.btn) filter on this rule, and
the "Apply for a partnership" link (also an <a>, just .btn) comes
after "Our edge" in the DOM ÃƒÂ¢Ã¢â€šÂ¬Ã¢â‚¬Â so  never matched "Our
edge" at all, leaving its border-bottom rendering right on top of
.nav-lang-mobile's own border-top just below it (a doubled-up
divider line). nth-last-of-type(2) is exactly "Our edge": counting
back through all <a> tags, position 1 is the .btn link, position 2
is the last non-btn one. /
.nav-links a(.btn)(2){ border-bottom; }
.nav-links a(.btn)::after{ display; }
@media (hover){
.nav-links a(.btn){ background(23,16,68,0.04); }
}
.nav-links a(.btn){ background(23,16,68,0.06); transform(0.98); }
.nav-lang-desktop{ display; }
.nav-lang-mobile{
display; justify-content;
margin:22px 0 4px; padding:22px 0 2px;
border-right;
border-top:1px solid var(--limestone-line);
}
.nav-lang-mobile .nav-lang-btn{ padding:8px 14px; font-size:14px; }
.btn-nav-mobile{ display; margin:26px 4px 4px; justify-content; }
/ .btn-nav-mobile is the link itself (not a wrapper around a nested
.btn), so ".btn-nav-mobile .btn" never matched anything ÃƒÂ¢Ã¢â€šÂ¬Ã¢â‚¬Â this button
was silently still running on the generic ".nav-links a" styling
(padding:4px 0, uppercase, letter-spacing:0.06em, 12.5px), nothing
like the hero CTA it's supposed to mirror. ".nav-links a" is (1
class + 1 element) specificity; matching that requires at least two
classes here too, hence ".nav-links a.btn-nav-mobile" rather than
".btn-nav-mobile" alone. Values below are copied 1:1 from the hero's
.btn.btn-lg computed styles at this breakpoint (padding, font-size,
weight, and ÃƒÂ¢Ã¢â€šÂ¬Ã¢â‚¬Â critically ÃƒÂ¢Ã¢â€šÂ¬Ã¢â‚¬Â text-transform / letter-spacing:
normal to undo the uppercase nav styling), so this button reads as
the exact same button, not a smaller lookalike.
box-shadow needs !important: the brand-override block (section 9,
unscoped by width) forces .btn-primary's shadow at every breakpoint,
so a plain declaration here would silently lose to it. /
.nav-links a.btn-nav-mobile{
width:100%;
padding:16px 32px;
font-size:16px;
font-weight:600;
text-transform;
letter-spacing;
border-radius(--radius-pill);
box-shadow:0 1px 2px rgba(119,76,247,.18), 0 10px 26px -10px rgba(119,76,247,.52) !important;
transition .15s var(--ease), box-shadow .15s var(--ease);
}
.nav-links a.btn-nav-mobile{
transform(0.97);
}
.btn-nav-desktop{ display; }
/ nav-links is a fixed full-screen sheet at z-index:41 painted after
these in DOM order, so without their own stacking position it would
render on top and bury the logo/close icon. Lifting both above it
keeps the header row visible as the panel's title bar while open. */
.nav-logo{ position; z-index:42; }
.nav-toggle{
display; flex-direction; justify-content; align-items; gap:5px;
width:44px; height:44px; border; background; cursor;
flex-shrink:0; border-radius:12px;
position; z-index:42;
-webkit-tap-highlight-color;
transition .15s var(--ease);
}
.nav-toggle{ background(23,16,68,0.06); }
.nav-toggle span{
width:19px; height:2px; background(--ink); margin:0 auto; border-radius:2px;
transition .28s cubic-bezier(.34,1.42,.64,1), opacity .18s var(--ease);
}
.nav-toggle[aria-expanded="true"] span{ transform(3.5px) rotate(45deg); }
.nav-toggle[aria-expanded="true"] span{ transform(-3.5px) rotate(-45deg); }

.hero{ padding:150px 0 40px; }

/* Scaling the exact desktop canvas down (the previous approach here)
guaranteed identical curves, but desktop's icons sit spread across a
wide 860px canvas ÃƒÂ¢Ã¢â€šÂ¬Ã¢â‚¬Â shrinking that whole canvas to fit a phone made
everything, icons included, too small to read comfortably. This is a
compact mobile-native layout instead: fixed, legible icon/text sizes
in a tight 6-column grid (so the 6 channel icons land 3-per-row and
the capability rows land as dark-icon/label/label/orange-icon pairs),
with connecting lines computed at runtime by funnelMobileLines() in
script.js from each icon's actual on-screen position ÃƒÂ¢Ã¢â€šÂ¬Ã¢â‚¬Â needed because
row heights vary with label length/language and can't be hardcoded.
Packing 6 icons into a narrower column spread than desktop's 860px
span also naturally produces a tighter "V" convergence instead of a
wide shallow arc. /
.funnel-wrap{
position;
display;
grid-template-columns(6, 1fr);
grid-auto-flow;
align-items;
column-gap:3%;
row-gap:22px;
height;
width;
max-width:100%;
left;
transform;
margin:32px auto 0;
padding:0 16px;
box-sizing;
}
.funnel-lines-mobile{
display;
position;
inset:0;
width:100%;
height:100%;
z-index:-1;
overflow;
}
/ Solid, not dashed: 6 dashed curves converging on one point put several
lines' dash/gap segments on top of each other right at the merge,
which reads as chaotic no matter how the curves themselves are eased.
Solid strokes overlapping there just blend into a slightly thicker
line ÃƒÂ¢Ã¢â€šÂ¬Ã¢â‚¬Â no dash pattern to clash. /
.funnel-mobile-path{
fill;
stroke:#774CF7;
stroke-width:2;
opacity:0.5;
}
.funnel-mobile-trunk{
fill;
stroke:#774CF7;
stroke-width:2.5;
opacity:0.62;
}
.funnel-lines,
.funnel-marker,
.funnel-connector{ display; }
/ Mobile version of desktop's .funnel-marker pills ÃƒÂ¢Ã¢â€šÂ¬Ã¢â‚¬Â top set by
funnelMobileLines() in script.js (the trunk's length is content-
driven, not a fixed value), left:50% + translateX(-50%) centers them
on the trunk since there's no room on a phone to stagger them to
alternating sides the way desktop does. /
.funnel-mobile-marker{
display;
align-items;
gap:7px;
position;
left:50%;
transform(-50%,-50%) translateY(10px);
opacity:0;
transition .45s ease-out, transform .45s ease-out;
background:#fff;
border-radius(--radius-pill);
padding:6px 14px 6px 6px;
font-size:10.5px;
font-weight:800;
letter-spacing:0.02em;
color(--ink);
box-shadow(--shadow-card);
white-space;
z-index:1;
}
.funnel-mobile-marker.in-view{
opacity:1;
transform(-50%,-50%);
}
.funnel-mobile-marker-x{
display; align-items; justify-content;
width:20px; height:20px;
border-radius:50%;
background:#774CF7;
color:#fff;
flex-shrink:0;
}
.funnel-mobile-marker-x svg{ width:9px; height:9px; }
/ !important: the scroll-reveal rules (.funnel-wrap.is-visible
.funnel-node etc.) are more specific than a plain .funnel-node
selector, so without it the reveal animation keeps winning and holds
every icon at its mid-animation translate(-50%,-50%) offset. The
desktop keyframe/scale animation is still swapped out for a plain
opacity+translateY transition here (rather than left fully static) so
mobile gets its own real, layout-safe entrance instead of popping in
instantly with no motion at all. /
.funnel-node{
position !important;
transform(16px) !important;
opacity:0 !important;
animation !important;
transition .6s cubic-bezier(.16,.8,.24,1), transform .6s cubic-bezier(.16,.8,.24,1);
transition-delay(--node-delay, 0s);
grid-column 2;
display;
flex-direction;
align-items;
}
.funnel-wrap.is-visible .funnel-node{
transform(0) !important;
opacity:1 !important;
}
.funnel-chip{
position;
transform;
margin-top:12px;
padding:6px 12px;
font-size:13px;
white-space;
text-align;
box-shadow;
}
.funnel-node-icon-sm{ width:46px; height:46px; }
.funnel-node-icon-sm svg{ width:20px; height:20px; }
/ Explicit grid-column, not span-based auto-flow: puts the dark icon in
column 1 (flush left) and mirrors the orange icon into column 6
(flush right), with both labels pulled toward the middle ÃƒÂ¢Ã¢â€šÂ¬Ã¢â‚¬Â this is
what actually keeps text off the trunk line at 50%, since a plain
span-based left label would end exactly there. Regardless of DOM
order (icon, then label) CSS grid can place things anywhere, so the
right column renders label-then-icon visually without touching the
HTML. grid-auto-flow above is required for this to work: with
the default sparse algorithm the placement cursor only moves forward,
and the label (col 4-6) coming right after its icon (col 6-7) in DOM
order would get dropped to a new row since its start column is
behind the cursor. /
.funnel-system{
position !important;
transform(16px) !important;
opacity:0 !important;
animation !important;
transition .55s cubic-bezier(.16,.8,.24,1), transform .55s cubic-bezier(.16,.8,.24,1);
transition-delay(--sys-delay, 0s);
grid-column:1 / 2;
display;
align-items;
justify-content;
}
.funnel-system.in-view{
transform(0) !important;
opacity:1 !important;
}
.funnel-system-right{ grid-column:6 / 7; }
.funnel-system-label{
position !important;
transform(16px) !important;
opacity:0 !important;
animation !important;
transition .55s cubic-bezier(.16,.8,.24,1), transform .55s cubic-bezier(.16,.8,.24,1);
transition-delay(--sys-delay, 0s);
grid-column:2 / 4;
width;
min-width:0;
display;
align-items;
min-height:46px;
padding:0 10px 0 8px;
font-size:14px;
line-height:1.3;
text-align !important;
/ Some Danish labels (e.g. "konverteringssporing") are one long word
with no space to wrap at, so they were overflowing their column
horizontally into the next one instead of wrapping ÃƒÂ¢Ã¢â€šÂ¬Ã¢â‚¬Â this lets long
words break mid-word rather than spill over. min-width:0 above is
needed too: as a grid item this would otherwise refuse to shrink
below its text's natural unbroken width regardless of overflow-wrap. /
overflow-wrap;
word-break;
}
.funnel-system-label.in-view{
transform(0) !important;
opacity:1 !important;
}
.funnel-system-label-right{ grid-column:4 / 6; padding:0 8px 0 10px; }
/ The gap the fan needs to actually read as "converging" before the
trunk starts ÃƒÂ¢Ã¢â€šÂ¬Ã¢â‚¬Â script.js measures this gap live rather than
hardcoding it, so it stays correct if this value changes.
nth-of-type(10)/(11), not (7)/(8):  counts among ALL
sibling <div>s in DOM order, and the 3 .funnel-mobile-marker divs
(added for the risk-marker pills) now come before the 6 .funnel-node
divs, shifting the first .funnel-system pair from the 7th/8th div to
the 10th/11th. Any time a div is added/removed before this point in
the markup, these indices need to move with it. /
.funnel-system(10),
.funnel-system(11){ margin-top:280px; }
/ .funnel-system-label is a <span> and the icon above is a <div>, so
these are two separate nth-of-type counts (each counts only among
same-tag siblings, unaffected by the marker divs) ÃƒÂ¢Ã¢â€šÂ¬Ã¢â‚¬Â the label's own
count still starts at 1. Without shifting the label to match, the
icon drops 280px into the gap while its label stays put, desyncing
the pair. */
.funnel-system-label(1),
.funnel-system-label(2){ margin-top:280px; }

.funnel-transition{ padding-top:0; margin-top:48px; max-width:100%; }
.funnel-transition-connector{ display; }
/* The manual <br> after "marketing" was tuned for desktop's much wider,
larger-font headline ÃƒÂ¢Ã¢â€šÂ¬Ã¢â‚¬Â at 30px on a narrow mobile column it forces
an early break and then wraps AGAIN within each half anyway, costing
an extra line for no benefit. Letting it wrap naturally across the
full width uses the space better. /
.funnel-transition h2 br{ display; }
/ 30px matches every other section headline on mobile (see #fordel,
#system, #cadence below) ÃƒÂ¢Ã¢â€šÂ¬Ã¢â‚¬Â only the hero h1 and .section-final's
headline keep their own larger sizes. */
.funnel-transition h2{ font-size:30px !important; line-height:1.18 !important; margin-top:16px; }

/* Desktop centers everything with position + top:50% against a
tall fixed-height stage. On mobile the stage height is content-driven
instead, so that whole scheme (including the badge's leftover
translateY(-50%)) was fighting the real layout: the week box clipped
off the left edge and the badge sat shifted above the heading instead
of level with the box. Flexbox replaces it outright: box and content
as two row items sharing the same top edge is what actually guarantees
"the line through the box center" and "badge level with the box". /
/ padding-bottom:0 (not the 28px desktop uses) so the rail ÃƒÂ¢Ã¢â€šÂ¬Ã¢â‚¬Â which
spans this container's full top:0 to bottom:0 ÃƒÂ¢Ã¢â€šÂ¬Ã¢â‚¬Â ends exactly at the
verdict box's own bottom edge instead of continuing past it into
empty space below the box. /
.cost-timeline{ margin:64px auto 0; max-width:100%; padding:0 20px 0; }
.cost-timeline::before{ left:48px; }
.cost-timeline-stage{
display;
align-items;
gap:18px;
min-height:0;
padding-left:0;
margin-bottom:36px;
}
.cost-timeline-content{
position;
width;
flex:1 1 auto;
transform;
text-align !important;
}
.cost-timeline-badge{ transform; }
.cost-timeline-connector{ display; }
/ DOM order is content, then week (desktop alternates which side each
lands on visually via absolute positioning) ÃƒÂ¢Ã¢â€šÂ¬Ã¢â‚¬Â order:-1 is needed to
actually put the week box first/left in the flex row to sit on the
line, otherwise it flows after content and ends up stranded on the
right, disconnected from the line entirely. /
.cost-timeline-week{
position;
order:-1;
flex-shrink:0;
transform;
width:56px; height:56px;
border-radius:16px;
}
.cost-timeline-week strong{ font-size:18px; }
.cost-timeline-content h4{ font-size:19px; }
/ The box's own left padding edge (22px box padding + the container's
22.7px left offset) lands almost exactly on the timeline rail at
48px ÃƒÂ¢Ã¢â€šÂ¬Ã¢â‚¬Â so left-aligning the text (instead of desktop's centered)
makes the rail flow straight into where the copy starts, rather
than the rail cutting across a centered paragraph off to its side
the way it did before, which read as broken/misaligned since every
other line on the page runs centered but this was the one place a
line visibly crossed through a block of centered text. /
/ radius-lg (28px) is wider than the 25.3px gap between the box's own
left edge (22.7px) and the rail at 48px, so the rounded bottom-left
corner was sweeping past the rail's x position before reaching the
box's true bottom edge ÃƒÂ¢Ã¢â€šÂ¬Ã¢â‚¬Â a visible notch between the rail and the
box. A smaller radius here keeps the corner's arc inside that gap. /
.cost-timeline-verdict{ margin:36px 0 0 0; max-width:100%; padding:20px 22px; text-align; border-radius:14px; }
.cost-timeline-verdict p{ font-size:15.5px; }
/ No connecting line between the verdict box and "How it works" at all
now ÃƒÂ¢Ã¢â€šÂ¬Ã¢â‚¬Â the rail stops flush at the box (see .cost-timeline padding
above) and the pill has no lead-in line either (see
#system .section-head-connector below), instead of trying to
visually bridge the two. /
.cost-timeline-bend{ display; }
/ No orange line touching the "How it works" pill at all on mobile. /
#system .section-head-connector{ display; }
/ Also a floating standalone bar with nothing above or below it to
connect to on mobile (it's a desktop-only decorative element between
the hero and #system) ÃƒÂ¢Ã¢â€šÂ¬Ã¢â‚¬Â without this it was still rendering at its
default desktop position/size, showing up as an orphan orange line
with empty space on both sides of it. /
.section-bridge-line{ display; }
/ Same orphan-line issue as #system/#cadence above, just never given
the matching override: #fordel's pill has nothing above it on
mobile to connect to either. /
#fordel .section-head-connector{ display; }
/ Uppercase + bold at the default clamp() size wraps this specific
headline to 5 very uneven lines (several down to a single short
word) on a ~350px-wide mobile column ÃƒÂ¢Ã¢â€šÂ¬Ã¢â‚¬Â shrinking it to 2-3 balanced
lines uses the width much better. Scoped to #fordel only, not the
shared .section-head h2 rule every other section's headline uses. /
/ !important needed: the unscoped brand-override block (further down
this file) sets h2 font-size with !important at every breakpoint, so
a plain declaration here would silently lose to it. /
#fordel .section-head h2{ font-size:30px !important; line-height:1.18 !important; }
/ Same 30px as #fordel ÃƒÂ¢Ã¢â€šÂ¬Ã¢â‚¬Â every section headline on mobile matches now
except the hero h1 and .section-final's, which keep their own larger
sizes (see those rules for why). /
#system .section-head h2, #cadence .section-head h2{ font-size:30px !important; line-height:1.18 !important; }
/ Matches the 30px section headlines above (see #cadence) ÃƒÂ¢Ã¢â€šÂ¬Ã¢â‚¬Â the process
card h3s used their own larger 34px, which read visibly bigger than
every other headline on the page once those were normalized. */
.process-copy h3{ font-size:30px !important; line-height:1.18 !important; }
.cost-timeline-bend path{
fill;
stroke(--signal-blue);
stroke-width:3;
stroke-linecap;
opacity:0.7;
}

.two-card-row, .compare-row, .cap-grid, .fee-grid{ grid-template-columns:1fr; }
.process-row, .process-row-reverse{ grid-template-columns:1fr; direction; padding:28px; }
/* .process-list::before is a center spine meant to run behind desktop's
alternating left/right cards, visually connecting them. On mobile the
rows above are forced to grid-template-columns:1fr ÃƒÂ¢Ã¢â€šÂ¬Ã¢â‚¬Â full-width,
stacked, no left/right split ÃƒÂ¢Ã¢â€šÂ¬Ã¢â‚¬Â so that spine has nothing left to
connect; it just shows as a stray vertical segment in the gaps
between cards (hidden behind the cards themselves the rest of the
time), which is the disconnected "line going into nothing" look. */
.process-list::before{ display; }

.timeline-line{ left:18px; }
.timeline-step, .timeline-step-right{ width(100% - 56px); margin-left:56px !important; }
.timeline-step(.timeline-step-right) .timeline-marker, .timeline-step-right .timeline-marker{ left:-56px; right; }

.loop-wrap{
max-width:100%; aspect-ratio; cursor;
display; flex-direction; gap:12px;
counter-reset;
}
.loop-svg{ display; }
.loop-hub-card{
display; align-items; gap:14px;
background(--graphite);
border-radius(--radius-lg);
padding:20px 22px;
box-shadow(--shadow-card);
order:-1;
}
.loop-hub-card-icon{
display; align-items; justify-content;
width:44px; height:44px; border-radius:12px; flex-shrink:0;
background(255,255,255,0.1); color(--warm-metal);
}
.loop-hub-card-icon svg{ width:22px; height:22px; }
.loop-hub-card-text{ display; flex-direction; }
.loop-hub-card-label{
font-size:11px; font-weight:700; letter-spacing:0.1em;
color(--warm-metal); text-transform;
}
.loop-hub-card-title{ font-size:16.5px; font-weight:800; color:#fff; margin-top:2px; }

.loop-node{
position; left !important; top !important; transform; text-align;
display; grid-template-columns:38px 1fr; align-items; column-gap:14px; row-gap:1px;
width:100%; height; border-radius:18px;
padding:14px 18px;
}
.loop-node, .loop-node.is-near{ transform; }
.loop-node()::after{
content:''; position; left:32px; top:100%; width:2px; height:12px;
background(--limestone-line); z-index:1;
}
.loop-node-icon{
grid-row 2; align-self;
width:38px; height:38px; border-radius:11px; margin-bottom:0;
background(--icon-blue-bg, #F0EBFF);
}
.loop-node-icon svg{ width:19px; height:19px; }
.loop-node-num{ display; }
.loop-node-title{ font-size:15px; margin-top:0; }
.loop-node-sub{ display; }

.dash-stage{ padding:52px 20px 56px; border-radius:28px; margin-top:44px; }
.dash-toast{ top:-14px; right:14px; padding:9px 14px; font-size:12px; }
.dash-badge-float{ left:8px; bottom:-20px; padding:12px 16px; border-radius:16px; }
.dash-badge-float-num{ font-size:20px; }
.dash-badge-float-label{ font-size:11px; }

.cadence-grid{ grid-template-columns:1fr; }
.cost-card{ padding:28px; }
.cost-row{ font-size:14px; flex-direction; align-items; gap:4px; }

.section-final{ padding-top:96px; padding-bottom:96px; }
.deco{ transform(0.6) rotate(var(--deco-rot, 0deg)); }
.deco-1{ transform(0.6) rotate(-9deg); top:4%; left:2%; }
.deco-2{ transform(0.6) rotate(11deg); top:8%; right:0%; }
.deco-3{ transform(0.55) rotate(-7deg); bottom:26%; left:0%; }
.deco-4{ transform(0.6) rotate(6deg); bottom:16%; right:2%; }
.deco-6, .deco-7{ display; }
.deco-5{ top:44%; left:-4%; }

.footer-inner{ flex-direction; gap:14px; text-align; }
/* Desktop's row layout (gap:20px, no wrap control) wraps onto two
uneven lines on a narrow mobile column (email alone, then Privacy
Policy + Terms of Service crammed together). Stacking each link on
its own centered line reads cleanly instead. */
.footer-links{ flex-direction; align-items; gap:10px; }
}

@media (max-width:760px) and (prefers-reduced-motion: reduce){
.funnel-node,
.funnel-system,
.funnel-system-label{
opacity:1 !important;
transform !important;
transition !important;
}
.funnel-mobile-marker{
opacity:1;
transform(-50%,-50%);
transition;
}
}

/* =====================================================
FYNZA VISUAL REFERENCE: Full Theme Override
===================================================== */

/* ---- 1. Color System -------------------------------- */
{
--orange:        #774CF7;
--orange-dim:    #6034D8;
--navy:          #171044;
--navy-card:     #171044;

/* Override existing tokens */
--signal-blue:     #774CF7;
--signal-blue-dim: #6034D8;
--graphite:        #171044;
--graphite-soft:   #171044;
--graphite-card:   #171044;
--limestone:       #FAF9FF;
--limestone-card:  #ffffff;
--limestone-line:  rgba(23,16,68,.09);
--ink:             #171044;
--ink-soft:        #625B7A;
--ink-faint:       #9690A8;
--warm-metal:      #774CF7;
--icon-blue-bg:    #F0EBFF;
--icon-blue-fg:    #774CF7;
--icon-metal-bg:   #F4F0FF;
--icon-metal-fg:   #6034D8;
--icon-green-bg:   #F0EBFF;
--icon-green-fg:   #774CF7;
--shadow-card:     0 2px 4px rgba(23,16,68,.05), 0 18px 40px -14px rgba(23,16,68,.14);
--shadow-lift:     0 24px 70px -18px rgba(23,16,68,.28);
}

/* ---- 2. Body: warm cream + white dot grid ---------- */
body{
background-color:#FAF9FF;
background-image(circle at 1px 1px, rgba(255,255,255,.92) 1.2px, transparent 0);
background-size:18px 18px;
color(--ink);
}

/* ---- 3. Orange bloom at top (fixed layer) ----------- */
body::before{
content:'';
position;
inset:0;
pointer-events;
z-index:-1;
background:
radial-gradient(ellipse 90% 38% at 50% -2%,  rgba(119,76,247,.30), transparent 62%),
radial-gradient(ellipse 26% 18% at   0% 100%, rgba(119,76,247,.12), transparent 55%),
radial-gradient(ellipse 26% 18% at 100% 100%, rgba(119,76,247,.12), transparent 55%);
}

/* ---- 4. Hero: remove the old blue-tinted bg -------- */
.hero-bg{ background !important; }

/* ---- 5. Hero headline: ALL CAPS, bigger, navy ------ */
.hero-h1{
font-size(2.6rem,5.8vw,4.6rem) !important;
font-weight:900 !important;
letter-spacing:-0.04em !important;
line-height:0.98 !important;
text-transform !important;
color(--ink) !important;
}
@media(max-width:760px){
.hero-h1{ font-size(1.8rem,7.6vw,3.1rem) !important; }
}

/* ---- 6. All section h2: ALL CAPS, 900w, navy ------- */
.section-head h2, h2{
text-transform !important;
font-size(2.4rem,5vw,4rem) !important;
font-weight:900 !important;
letter-spacing:-0.045em !important;
line-height:0.96 !important;
color(--ink) !important;
}

/* ---- 7. Accent colour ------------------------------- */
.accent,.accent-underline{ color:#774CF7 !important; }

/* ---- 8. Pill badges ---------------------------------- */
.pill{ background:#fff; border-color(23,16,68,.12); color(--ink); }
.pill-static{ color:#774CF7 !important; }
.pill-link
.pill-on-dark{ background(255,255,255,.10); border-color(255,255,255,.24); color(255,255,255,.92); }

/* ---- 9. Buttons ------------------------------------- */
.btn-primary{
background:#774CF7 !important;
box-shadow:0 1px 2px rgba(119,76,247,.18), 0 10px 26px -10px rgba(119,76,247,.52) !important;
}
.btn-primary{ background:#6034D8 !important; }



/* ---- 10. Nav ---------------------------------------- */
.nav{
max-width:1280px;
background !important;
border !important;
box-shadow !important;
padding:10px 44px !important;
}
.nav-logo{ color(--ink) !important; font-weight:900 !important; }

/* ---- 11. Eyebrow ------------------------------------ */
.eyebrow{ color:#774CF7 !important; }
.eyebrow-inverse{ color:#BDA8FF !important; }

/* ---- 12. Funnel viz: solid orange lines + circles -- */
.funnel-path{
stroke:#774CF7 !important;
stroke-width:2.2 !important;
}
.funnel-path-dot{ fill:#774CF7 !important; }
.funnel-node-icon(.funnel-node-icon-sm){
border-radius:50% !important;
border:4px solid #fff !important;
box-shadow:0 14px 30px -6px rgba(119,76,247,.5), 0 0 0 1px rgba(23,16,68,.06) !important;
width:78px !important; height:78px !important;
transition var(--dur-fast) var(--ease), box-shadow var(--dur-fast) var(--ease) !important;
}
.funnel-node-icon.logo-badge{ background:#fff !important; }
.funnel-node-icon(.funnel-node-icon-sm) svg{ width:30px !important; height:30px !important; }
.funnel-node-icon.logo-badge svg{ width:36px !important; height:36px !important; }
.funnel-node .funnel-node-icon{
transform(1.08) !important;
box-shadow:0 18px 36px -6px rgba(119,76,247,.6), 0 0 0 1px rgba(23,16,68,.08) !important;
}
.funnel-chip{
background:#fff !important;
border-color(23,16,68,.10) !important;
color(--ink) !important;
font-weight:700 !important;
}

/* ---- 13. Cards -------------------------------------- */
.card-dark{ background:#171044 !important; }
.highlight-bar{ background:#F0EBFF !important; }
.highlight-bar strong{ color:#6034D8 !important; }
.highlight-bar-dark{ background:#171044 !important; }
.highlight-bar-dark strong{ color:#BDA8FF !important; }
.icon-badge-blue{ background:#F0EBFF !important; color:#774CF7 !important; }
.icon-badge-metal{ background:#F4F0FF !important; color:#6034D8 !important; }
.icon-badge-green{ background:#F0EBFF !important; color:#774CF7 !important; }

/* ---- 14. Process numbers ---------------------------- */
.process-num{ background:#774CF7 !important; }

/* ---- 15. Timeline ----------------------------------- */
.timeline-line-fill{ background:#774CF7 !important; }
.timeline-step.is-active .timeline-marker{ background:#774CF7 !important; border-color:#774CF7 !important; }
.timeline-marker{ color(--ink) !important; }

/* ---- 16. Dark capability section (navy) ------------- */
.section-dark{ background:#171044 !important; }
.cap-card{ background(12,22,80,.50) !important; border-color(255,255,255,.10) !important; }
.cap-card{ border-color(119,76,247,.55) !important; }
.cap-card li::before{ background:#774CF7 !important; }
.icon-badge-dark{ background(255,255,255,.10) !important; color(255,255,255,.88) !important; }

/* ---- 17. Growth loop -------------------------------- /
/ Colors resolve via the CSS custom properties redefined in the
 override above (--ink, --signal-blue, --warm-metal), so no
per-element overrides are needed here. */

/* ---- 18. Dashboard ---------------------------------- */
.dash-topbar{ background:#171044 !important; }
.dash-quality-bar div{ background(--warm-metal) !important; }
.dash-toast-dot{ background:#774CF7 !important; }
.dash-up{ color:#774CF7 !important; }
.dash-card-ai{ background:#171044 !important; }
.dash-ai-check{ color:#BDA8FF !important; }

/* ---- 19. Cost table --------------------------------- */
.cost-row-total{ background:#171044 !important; }
.cost-caveat{ color:#7E7597 !important; }

/* ---- 20. Compare cards ------------------------------ */
.compare-row .card-dark{ background:#774CF7 !important; }

/* ---- 21. Cadence ------------------------------------ */
.cadence-tag{ color:#774CF7 !important; }

/* ---- 27. Vores fordel comparison --------------------- /
/ Colors resolve via the --signal-blue custom property redefined in the
 override above, so no per-element overrides are needed here. */

/* ---- 22. Form --------------------------------------- */
.form-field input,.form-field select,.form-field textarea{
border-color:#774CF7 !important;
}

/* ---- 23. FAQ ---------------------------------------- */
.faq-item summary::after{ color:#774CF7 !important; }

/* ---- 24. Soft text ---------------------------------- */
.section-lede,.hero-sub{ color:#625B7A !important; }
.hero-micro{ color:#7E7597 !important; }

/* ---- 25. Footer ------------------------------------- */
.footer{ border-top-color(23,16,68,.09) !important; }

/* ---- 26. Mock card details -------------------------- */
.mock-tag-ok{ background:#F0EBFF !important; color:#6034D8 !important; }
.mock-bar div{ background:#774CF7 !important; }

/* ==========================================================================
Legal pages (Privacy Policy / Terms of Service)
========================================================================== */
.legal-hero{ padding-top:180px; padding-bottom:40px; }
.legal-back{
display; align-items; gap:8px;
font-size:14px; font-weight:700; color(--ink-soft);
margin-bottom:28px;
transition var(--dur-fast) var(--ease), gap var(--dur-fast) var(--ease);
}
.legal-back svg{ width:13px; height:13px; flex-shrink:0; transition var(--dur-fast) var(--ease); }
.legal-back{ color(--signal-blue); gap:11px; }
.legal-back svg{ transform(-2px); }
.legal-hero h1{
font-size(2.4rem, 5vw, 3.4rem);
font-weight:900; letter-spacing:-0.02em; line-height:1.05;
color(--ink); margin-top:18px;
}
.legal-updated{ margin-top:16px; font-size:14px; color(--ink-faint); font-weight:500; }

.legal-toc{
display; flex-wrap; gap:10px;
margin:8px 0 0;
padding-bottom:40px;
border-bottom:1px solid var(--limestone-line);
}
.legal-toc a{
font-size:13.5px; font-weight:700; color(--ink-soft);
padding:9px 16px;
border-radius(--radius-pill);
background(--limestone-card);
border:1px solid var(--limestone-line);
transition var(--dur-fast) var(--ease), border-color var(--dur-fast) var(--ease), background var(--dur-fast) var(--ease);
}
.legal-toc a{ color(--signal-blue); border-color(--signal-blue); background(--icon-blue-bg); }

.legal-body{ padding-top:8px; }
.legal-section{
padding:44px 0;
border-bottom:1px solid var(--limestone-line);
display; grid-template-columns:56px 1fr; gap:24px;
scroll-margin-top:110px;
}
.legal-section{ border-bottom; padding-bottom:0; }
.legal-num{
display; align-items; justify-content;
width:40px; height:40px;
border-radius:50%;
background(150deg, var(--signal-blue), var(--signal-blue-dim));
color:#fff; font-weight:800; font-size:14px;
box-shadow:0 8px 16px -7px rgba(119,76,247,.5), inset 0 1px 1px rgba(255,255,255,.3);
flex-shrink:0;
}
.legal-section h2{ font-size:22px; font-weight:800; letter-spacing:-0.01em; color(--ink); margin-bottom:14px; }
.legal-section h3{ font-size:16px; font-weight:700; color(--ink); margin:22px 0 8px; }
.legal-section p{ font-size:15.5px; line-height:1.7; color(--ink-soft); margin-bottom:14px; }
.legal-section p{ margin-bottom:0; }
.legal-section ul{ display; flex-direction; gap:10px; margin:14px 0; padding-left:0; list-style; }
.legal-section ul{ margin-bottom:0; }
.legal-section li{ display; align-items; gap:12px; font-size:15.5px; line-height:1.6; color(--ink-soft); }
.legal-section li::before{
content:''; flex-shrink:0; margin-top:9px;
width:6px; height:6px; border-radius:50%;
background(--signal-blue);
}
.legal-section strong{ color(--ink); font-weight:700; }
.legal-link{ color(--signal-blue); font-weight:600; text-decoration; text-underline-offset:3px; }
.legal-callout{
margin:22px 0; padding:22px 24px;
border-radius(--radius-md);
background(--icon-blue-bg);
border:1px solid rgba(119,76,247,.18);
font-size:14.5px; line-height:1.65; color(--ink);
}
.legal-callout{ margin-bottom:0; }
.legal-callout strong{ color(--ink); }

.legal-cross-link{
margin-top:28px;
font-size:14.5px; color(--ink-faint);
text-align;
}

@media (max-width:640px){
.legal-hero{ padding-top:140px; }
.legal-section{ grid-template-columns:1fr; gap:14px; }
.legal-num{ width:34px; height:34px; font-size:12.5px; }
}

/* ---- 14. Mobile nav: the brand-override block above forces
.nav{ padding:10px 44px !important; } at every width (section 10,
unscoped by any media query). On a ~360-400px viewport that 44px side
padding alone eats ~22% of the header's width, which is what was
squeezing the logo inward and stranding the hamburger short of the
true right edge no matter what the mobile nav rules further up set.
This needs matching !important, placed after that block, to win. ---- /
@media (max-width:760px){
.nav{ padding:8px 8px 8px 16px !important; }
}
/ FINAL LOGO */
.nav-logo > img,
.nav-logo img{
display;
width:148px;
height;
max-width:148px;
object-fit;
}
@media(max-width:760px){
.nav-logo > img,
.nav-logo img{width:132px;max-width:132px;}
}

/* GLOBAL BRAND LOGO â€” use the real logo image everywhere */
.nav-logo,
.nav-logo img,
.footer-logo img,
.footer-brand img{
display;
}
.nav-logo img,
.footer-logo img,
.footer-brand img{
width:148px;
max-width:100%;
height;
object-fit;
}
@media(max-width:760px){
.nav-logo img,
.footer-logo img,
.footer-brand img{width:132px;}
}

/* FINAL PROCESS IMAGE POLISH â€” no shadow on the visual boxes/images */
.process-visual .mock-card{
box-shadow !important;
}
.process-visual .mock-card img{
box-shadow !important;
filter !important;
}

/* =========================================================
GLOBAL TYPOGRAPHY REFINEMENT
Match the new Client Stories visual language site-wide.
Hierarchy intentionally steps down in size + weight:
H1 â†’ H2 â†’ H3 â†’ H4.
========================================================= */

/* H1 â€” primary hero only */
.hero-h1{
font-size(3rem,5.2vw,4.1rem) !important;
line-height:1.02 !important;
font-weight:800 !important;
letter-spacing:-0.035em !important;
}

/* H2 â€” all main section headings */
.section-head h2,
h2{
font-size(2rem,3.6vw,3rem) !important;
line-height:1.12 !important;
font-weight:800 !important;
letter-spacing:-0.02em !important;
text-transform !important;
}

/* Keep special section headings on the same scale */
.funnel-transition h2{
font-size(2rem,3.6vw,3rem) !important;
line-height:1.12 !important;
font-weight:800 !important;
letter-spacing:-0.02em !important;
}

/* H3 â€” content/card headings */
h3,
.process-copy h3,
.cadence-slide h3{
font-size: clamp(16px, 1.25vw, 18px) !important;
line-height:1.15 !important;
font-weight:700 !important;
letter-spacing:-0.015em !important;
}

/* H4 â€” supporting/card micro-headings */
h4,
.cap-card h4{
font-size(1.05rem,1.4vw,1.2rem) !important;
line-height:1.3 !important;
font-weight:650 !important;
letter-spacing:-0.005em !important;
}

/* Don't let legal-page typography get overridden by the marketing
hierarchy above. */
.legal-hero h1{
font-size(2.4rem,5vw,3.4rem) !important;
font-weight:800 !important;
}
.legal-section h2{
font-size:22px !important;
font-weight:700 !important;
}
.legal-section h3{
font-size:16px !important;
font-weight:650 !important;
}

/* Mobile: same hierarchy, scaled down cleanly */
@media(max-width:760px){
.hero-h1{
font-size(2.15rem,8.5vw,2.8rem) !important;
line-height:1.06 !important;
font-weight:800 !important;
}

.section-head h2,
h2,
.funnel-transition h2{
font-size:30px !important;
line-height:1.18 !important;
font-weight:800 !important;
letter-spacing:-0.02em !important;
}

h3,
.process-copy h3,
.cadence-slide h3{
font-size:18px !important;
line-height:1.2 !important;
font-weight:700 !important;
}

h4,
.cap-card h4{
font-size:17px !important;
line-height:1.3 !important;
font-weight:650 !important;
}
}

/* =========================================================
FINAL CTA â€” MATCH CLIENT STORIES / GLOBAL H2
The CTA was keeping its older oversized 4.2rem rule.
Keep the same responsive scale and weight as the other
main section headings.
========================================================= */
.section-final .section-head h2{
font-size(2rem,3.6vw,3rem) !important;
line-height:1.12 !important;
font-weight:800 !important;
letter-spacing:-0.02em !important;
}

@media(max-width:760px){
.section-final .section-head h2{
font-size:30px !important;
line-height:1.18 !important;
font-weight:800 !important;
letter-spacing:-0.02em !important;
}
}