
/* ===== COLOUR PALETTES: change data-palette on <html> (pulse | harbour | ae | violet) ===== */
:root{--bg:#08101d;--panel:#101a2b;--line:#22344d;--ink:#ecf3ff;--muted:#96a8c4;--beam:#2de2e6;--on-beam:#04222a;--sea:#8b9bff;--ok:#7dffb2;--bad:#ff5d6c;color-scheme:dark;box-sizing:border-box;padding-top:env(safe-area-inset-top,0px);padding-bottom:env(safe-area-inset-bottom,0px)}
[data-palette="harbour"]{--bg:#070d14;--panel:#0e1824;--line:#1f3144;--ink:#eaf2f5;--muted:#93a9b6;--beam:#ffd45e;--on-beam:#1a1400;--sea:#3fb6c9;--bad:#ff5d5d}
[data-palette="ae"]{--bg:#f2f7fa;--panel:#fff;--line:#d5e2ea;--ink:#0a2236;--muted:#4b6578;--beam:#e8263c;--on-beam:#fff;--sea:#0b7285;--ok:#0b8a52;--bad:#d62f2f;color-scheme:light}
[data-palette="violet"]{--bg:#0d0a1f;--panel:#17122e;--line:#2e2552;--ink:#f1ecff;--muted:#a89fc9;--beam:#ff5fa2;--on-beam:#2a0016;--sea:#9b8bff;--bad:#ff7a7a}
html{scroll-padding-top:env(safe-area-inset-top,0px);scroll-behavior:smooth}
*,*::before,*::after{box-sizing:inherit}
body{margin:0;background:var(--bg);color:var(--ink);font:400 1.05rem/1.6 Figtree,system-ui,sans-serif;overflow-x:hidden}
h1,h2,h3{font-family:'Bricolage Grotesque',Figtree,system-ui,sans-serif;margin:0;letter-spacing:-.03em;line-height:1}
a{color:inherit}:focus-visible{outline:3px solid var(--beam);outline-offset:3px}
.wrap{max-width:1180px;margin:0 auto;padding:0 1.25rem}
.btn{display:inline-block;padding:1rem 1.6rem;border:0;border-radius:999px;font:600 1rem Figtree,sans-serif;text-decoration:none;background:var(--beam);color:var(--on-beam);cursor:pointer;transition:transform .25s,box-shadow .25s}
.btn:hover{box-shadow:0 0 40px color-mix(in srgb,var(--beam) 45%,transparent)}.btn:disabled{opacity:.6;cursor:wait}
.btn.ghost{background:transparent;color:var(--ink);border:1.5px solid var(--line)}
nav{position:fixed;top:calc(.8rem + env(safe-area-inset-top,0px));left:50%;transform:translateX(-50%);z-index:20;display:flex;gap:1.4rem;align-items:center;padding:.5rem .5rem .5rem 1.3rem;border-radius:999px;background:color-mix(in srgb,var(--panel) 75%,transparent);backdrop-filter:blur(14px);border:1px solid var(--line);max-width:calc(100% - 1.5rem)}
nav .logo{display:flex;align-items:center;gap:.6rem;font:800 1.05rem 'Bricolage Grotesque',sans-serif;text-decoration:none;white-space:nowrap}.mk{width:30px;height:30px;flex:none}.bigmk{width:84px;height:84px;margin-bottom:1.2rem}
nav a.l{text-decoration:none;color:var(--muted);font-weight:500;font-size:.95rem}nav a.l:hover{color:var(--ink)}
nav .btn{padding:.55rem 1.1rem;font-size:.95rem}
nav .links{display:flex;gap:1.4rem;align-items:center}nav a[aria-current]{color:var(--ink)}
.burger{display:none;width:40px;height:40px;border-radius:50%;border:1px solid var(--line);background:transparent;cursor:pointer;padding:0;flex:none;position:relative}
.burger span{position:absolute;left:11px;right:11px;height:2px;border-radius:2px;background:var(--ink);transition:transform .3s,opacity .2s,top .3s}
.burger span:nth-child(1){top:14px}.burger span:nth-child(2){top:19px}.burger span:nth-child(3){top:24px}
nav.open .burger span:nth-child(1){top:19px;transform:rotate(45deg)}nav.open .burger span:nth-child(2){opacity:0}nav.open .burger span:nth-child(3){top:19px;transform:rotate(-45deg)}
@media(max-width:760px){
nav{width:calc(100% - 1.5rem);justify-content:space-between;gap:.6rem}
nav .logo{margin-right:auto}.burger{display:block}
nav .links{position:absolute;top:calc(100% + .5rem);left:0;right:0;flex-direction:column;align-items:stretch;gap:0;padding:.6rem;border-radius:22px;background:var(--panel);border:1px solid var(--line);box-shadow:0 18px 40px rgba(0,0,0,.35);visibility:hidden;opacity:0;translate:0 -8px;transition:opacity .25s,translate .25s,visibility 0s .25s}
nav.open .links{visibility:visible;opacity:1;translate:0 0;transition:opacity .25s,translate .25s}
nav .links a{padding:.9rem 1rem;border-radius:14px;font-size:1.05rem;color:var(--ink)}nav .links a:hover{background:var(--bg)}}
@media(max-width:400px){nav .lt{display:none}}
.top{padding:6.5rem 0 1.5rem}
.top h1{font-size:clamp(2.8rem,8vw,6.5rem);font-weight:800;max-width:13ch}
.top p{max-width:46ch;color:var(--muted);font-size:1.2rem;margin:1.2rem 0 1.8rem}
.cta{display:flex;gap:.8rem;flex-wrap:wrap}
/* stage */
.stage{position:relative;display:flex;flex-direction:column;min-height:600px;overflow:hidden;isolation:isolate;border-block:1px solid var(--line);background:var(--panel);--x:50%;--y:50%}
.grid{position:absolute;inset:0;z-index:-2;background:linear-gradient(var(--line) 1px,transparent 1px) 0 0/44px 44px,linear-gradient(90deg,var(--line) 1px,transparent 1px) 0 0/44px 44px;opacity:.5}
.fx{position:absolute;inset:0;z-index:2;pointer-events:none;-webkit-mask-image:radial-gradient(circle 210px at var(--x) var(--y),#000 20%,transparent 100%);mask-image:radial-gradient(circle 210px at var(--x) var(--y),#000 20%,transparent 100%)}
.fx .g{position:absolute;inset:0;background:linear-gradient(var(--beam) 1px,transparent 1px) 0 0/44px 44px,linear-gradient(90deg,var(--beam) 1px,transparent 1px) 0 0/44px 44px;opacity:.55}
.fx b{position:absolute;font:600 .9rem ui-monospace,Menlo,monospace;color:var(--bad);border:1px solid currentColor;padding:.3rem .7rem;border-radius:6px;background:var(--bg);white-space:nowrap}
.stage.fixed .fx b{color:var(--ok)}.stage.fixed .fx .g{filter:hue-rotate(60deg)}
.bar{display:flex;justify-content:space-between;align-items:flex-start;gap:1rem;flex-wrap:wrap;width:100%;padding:1.1rem}
.term{width:min(330px,100%);min-height:8.6rem;background:var(--bg);border:1px solid var(--line);border-radius:12px;padding:.8rem 1rem;font:.9rem/1.65 ui-monospace,Menlo,monospace;color:var(--sea)}
.term i{color:var(--beam);font-style:normal}
.cur{display:inline-block;width:.6em;height:1.05em;background:var(--beam);vertical-align:-.2em;animation:bl 1s steps(2) infinite}@keyframes bl{50%{opacity:0}}
.side{display:grid;gap:.7rem;justify-items:end}
.chip{display:inline-flex;align-items:center;gap:.6rem;padding:.5rem 1rem;border-radius:999px;border:1px solid var(--line);background:var(--bg);font-weight:600;font-size:.95rem}
.chip i{width:10px;height:10px;border-radius:50%;background:var(--bad);animation:pu 1s infinite}.stage.fixed .chip i{background:var(--ok);animation:none}
@keyframes pu{50%{opacity:.25}}
.tog{display:flex;gap:.4rem}.tog button{font:600 .9rem Figtree,sans-serif;padding:.4rem .9rem;border-radius:999px;border:1.5px solid var(--line);background:transparent;color:var(--ink);cursor:pointer}
.tog button[aria-pressed="true"]{background:var(--ink);color:var(--bg);border-color:var(--ink)}
.dev{flex:1;display:grid;place-items:center;margin-bottom:105px}
.dev svg{width:min(400px,78vw);height:auto;overflow:visible}
.stage[data-dev="pc"] #ph,.stage[data-dev="ph"] #pc{display:none}
.stage.fixed .s,.stage:not(.fixed) .f{display:none}
.sm{fill:var(--muted);opacity:0;animation:rise 3s infinite}.sm:nth-of-type(2){animation-delay:1s}.sm:nth-of-type(3){animation-delay:2s}
@keyframes rise{0%{opacity:.6;transform:translateY(0)}100%{opacity:0;transform:translateY(-40px)}}
.star{fill:var(--beam);transform-box:fill-box;transform-origin:center;animation:pop 1.2s ease-out both}.star:nth-of-type(2){animation-delay:.2s}.star:nth-of-type(3){animation-delay:.4s}
@keyframes pop{0%{transform:scale(0);opacity:1}60%{transform:scale(1.6)}100%{transform:scale(1);opacity:0}}
.road{position:absolute;left:0;right:0;bottom:0;height:100px;background:#16212c;border-top:3px solid #2b3d4e}
.road::after{content:"";position:absolute;left:0;right:0;top:58px;height:4px;background:repeating-linear-gradient(90deg,#f4d36b 0 36px,transparent 36px 76px)}
.drive .road::after{animation:rd .35s linear infinite}@keyframes rd{to{background-position:-76px 0}}
#amb{position:absolute;left:0;bottom:18px;width:min(260px,60vw);z-index:3;transform:translateX(-130%)}
.drive #amb{filter:drop-shadow(0 0 22px rgba(45,123,255,.75))}
.bl,.rd{opacity:.3}.drive .bl{animation:fl .4s steps(1) infinite}.drive .rd{animation:fl .4s steps(1) infinite reverse}
@keyframes fl{0%{opacity:1}50%{opacity:.2}}
.sp{transform-box:fill-box;transform-origin:center;animation:spin .45s linear infinite paused}.drive .sp{animation-play-state:running}@keyframes spin{to{transform:rotate(360deg)}}
.flash{position:absolute;inset:0;z-index:1;pointer-events:none;opacity:0;background:radial-gradient(circle at 50% 42%,rgba(125,255,178,.4),transparent 60%)}
.flash.go{animation:fh .9s ease-out}@keyframes fh{from{opacity:1}}
.hint{padding:.8rem 1.1rem;color:var(--muted);font-size:.9rem;position:absolute;right:0;bottom:104px;z-index:1}
/* services */
section{padding:6rem 0}
h2.big{font-size:clamp(2.2rem,6vw,4.2rem);font-weight:800;max-width:16ch;margin-bottom:2.5rem}
.cards{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:1rem}
.card{position:relative;background:var(--panel);border:1px solid var(--line);border-radius:22px;padding:1.6rem;min-height:210px;overflow:hidden;display:flex;flex-direction:column;justify-content:flex-end;gap:.6rem;--mx:50%;--my:50%}
.card::before{content:"";position:absolute;inset:0;background:radial-gradient(320px circle at var(--mx) var(--my),color-mix(in srgb,var(--beam) 14%,transparent),transparent 70%);opacity:0;transition:opacity .3s}.card:hover::before{opacity:1}
.card h3{font-size:1.6rem;position:relative}.card p{margin:0;color:var(--muted);position:relative}
.stats{display:grid;grid-template-columns:repeat(4,1fr);gap:1rem;border-top:1px solid var(--line);padding-top:2.5rem;margin-top:4rem}
.stats b{display:block;font:800 clamp(2.4rem,7vw,4.6rem)/1 'Bricolage Grotesque',sans-serif;color:var(--beam)}.stats span{color:var(--muted)}
@media(max-width:700px){.stats{grid-template-columns:repeat(2,1fr);row-gap:2rem}.side{justify-items:start}}
.contact{text-align:center;padding:6rem 0 3rem}
.contact h2{font-size:clamp(2.4rem,7vw,5rem);font-weight:800;margin:0 auto 1.5rem;max-width:12ch}
.tel{display:inline-block;font:800 clamp(2.2rem,9vw,6rem)/1 'Bricolage Grotesque',sans-serif;color:var(--beam);text-decoration:none;transition:transform .25s,text-shadow .25s}.tel:hover{text-shadow:0 0 50px color-mix(in srgb,var(--beam) 60%,transparent)}
.contact p{color:var(--muted);max-width:46ch;margin:1.5rem auto}
.soc{display:flex;gap:1.5rem;justify-content:center;margin:2rem 0 3rem}
.fine{color:var(--muted);font-size:.9rem;border-top:1px solid var(--line);padding-top:1.5rem}
/* repair bar */
.repair{position:relative;overflow:hidden;background:var(--panel);border-bottom:1px solid var(--line);padding:2.2rem 0}
.ecg{position:absolute;inset:0;width:100%;height:100%;pointer-events:none}
.ecg path{fill:none;vector-effect:non-scaling-stroke;stroke-width:1.5}.ecg .base{stroke:var(--line)}
.ecg .pulse{stroke:var(--beam);stroke-width:2.5;stroke-dasharray:90 910;animation:run 4.5s linear infinite;filter:drop-shadow(0 0 6px var(--beam))}
@keyframes run{from{stroke-dashoffset:90}to{stroke-dashoffset:-910}}
.rp{position:relative;display:flex;align-items:center;gap:1.5rem 2.5rem;flex-wrap:wrap}
.rp h2{font-size:clamp(1.8rem,4vw,2.6rem);font-weight:800}
.rp ul{list-style:none;margin:0;padding:0;display:flex;gap:1rem;flex-wrap:wrap;flex:1;justify-content:flex-end}
.rp li{position:relative;display:flex;align-items:center;gap:.9rem;padding:.8rem 1.4rem .8rem .9rem;border-radius:18px;background:var(--bg);border:1px solid var(--line);overflow:hidden}
.rp li:hover{border-color:var(--c);box-shadow:0 0 34px color-mix(in srgb,var(--c) 45%,transparent);transform:translateY(-4px)}
.rp li::after{content:"";position:absolute;inset:0;background:linear-gradient(105deg,transparent 40%,rgba(255,255,255,.14) 50%,transparent 60%);translate:-120% 0;animation:shine 6s ease-in-out infinite;animation-delay:var(--s,0s);pointer-events:none}
@keyframes shine{0%,60%{translate:-120% 0}100%{translate:120% 0}}
.lg{width:46px;height:46px;padding:9px;border-radius:12px;background:color-mix(in srgb,var(--c) 14%,transparent);fill:var(--c);animation:bob 3.2s ease-in-out infinite;animation-delay:var(--s,0s)}
@keyframes bob{50%{transform:translateY(-4px) rotate(-5deg)}}
.rp li b{display:block;font:800 1.25rem 'Bricolage Grotesque',sans-serif;line-height:1.1}.rp li span{color:var(--muted);font-size:.9rem}
@media(max-width:700px){.rp ul{justify-content:flex-start}}
/* reveal and tilt */
.rv{opacity:0;translate:0 28px;scale:.96;transition:opacity .8s cubic-bezier(.2,.8,.2,1) var(--d,0s),translate .8s cubic-bezier(.2,.8,.2,1) var(--d,0s),scale .8s cubic-bezier(.2,.8,.2,1) var(--d,0s),transform .25s ease-out,box-shadow .3s,border-color .3s}
.rv.in{opacity:1;translate:0 0;scale:1}
.card{transform:perspective(800px) rotateX(var(--rx,0deg)) rotateY(var(--ry,0deg))}
.bigmk{display:block;margin:0 auto 1.2rem;border-radius:22px;animation:glow 3s ease-in-out infinite}@keyframes glow{50%{filter:drop-shadow(0 0 22px color-mix(in srgb,var(--beam) 65%,transparent))}}
.beatline{display:block;margin:0 auto 1.6rem;width:min(360px,80%);height:40px;overflow:visible}
.beatline path{fill:none;stroke:var(--beam);stroke-width:2.5;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:400;animation:draw 3.2s ease-in-out infinite}
@keyframes draw{0%{stroke-dashoffset:400}60%,100%{stroke-dashoffset:0}}
.tel{animation:tp 3.5s ease-in-out infinite}@keyframes tp{50%{text-shadow:0 0 40px color-mix(in srgb,var(--beam) 45%,transparent)}}
@media(prefers-reduced-motion:reduce){*{animation-duration:.01ms!important;animation-iteration-count:1!important}html{scroll-behavior:auto}.rv{opacity:1!important;translate:none!important;scale:none!important;transition:none!important}}

/* ===== inner pages, forms, footer, palette picker ===== */
.top .lead{max-width:56ch}
.two{display:grid;grid-template-columns:1fr 1.4fr;gap:3rem}.two p{color:var(--muted);margin:0 0 1rem;max-width:62ch}
.tick{list-style:none;padding:0;margin:0;display:grid;gap:.9rem}.tick li{position:relative;padding-left:1.9rem;color:var(--muted)}.tick b{color:var(--ink)}
.tick li::before{content:"";position:absolute;left:0;top:.5rem;width:.9rem;height:.5rem;border-left:3px solid var(--beam);border-bottom:3px solid var(--beam);rotate:-45deg}
.chips{display:flex;flex-wrap:wrap;gap:.6rem}.chips span{padding:.55rem 1.1rem;border-radius:999px;border:1px solid var(--line);background:var(--panel);font-weight:600}
.faq details{border-top:1px solid var(--line);padding:1.1rem 0}.faq details:last-child{border-bottom:1px solid var(--line)}
.faq summary{cursor:pointer;font:700 1.2rem 'Bricolage Grotesque',sans-serif;list-style:none;display:flex;justify-content:space-between;gap:1rem}
.faq summary::-webkit-details-marker{display:none}.faq summary::after{content:"+";color:var(--beam);font-size:1.6rem;line-height:1;transition:rotate .3s}
.faq details[open] summary::after{rotate:45deg}.faq details p{margin:.8rem 0 0;color:var(--muted);max-width:70ch}
.cta-band{text-align:center}.cta-band h2{font-size:clamp(2rem,5vw,3.6rem);font-weight:800;margin:0 auto 1.5rem;max-width:16ch}.cta-band .cta{justify-content:center}
.cgrid{display:grid;grid-template-columns:1fr 1.2fr;gap:3rem;align-items:start}
.cinfo p{color:var(--muted);max-width:42ch}.cinfo .tel{font-size:clamp(2rem,6vw,3.4rem);margin:.5rem 0 1rem}
.form{display:grid;gap:1.1rem;background:var(--panel);border:1px solid var(--line);border-radius:24px;padding:1.6rem}
.f{display:grid;gap:.4rem}.f label{font-weight:600}.f small{color:var(--muted);font-weight:400}
.f input,.f select,.f textarea{width:100%;padding:.85rem 1rem;border-radius:12px;border:1.5px solid var(--line);background:var(--bg);color:var(--ink);font:inherit}
.f textarea{min-height:150px;resize:vertical}.f input:focus,.f select:focus,.f textarea:focus{outline:none;border-color:var(--beam);box-shadow:0 0 0 3px color-mix(in srgb,var(--beam) 25%,transparent)}
.f [aria-invalid="true"]{border-color:var(--bad)}
.hp{position:absolute;left:-9999px;width:1px;height:1px;overflow:hidden}
.msg{margin:0;font-weight:600;min-height:1.5em}.msg.ok{color:var(--ok)}.msg.bad{color:var(--bad)}
.sitefoot{border-top:1px solid var(--line);padding:3rem 0 2rem;color:var(--muted)}
.sitefoot .wrap{display:flex;gap:1.5rem 3rem;justify-content:space-between;flex-wrap:wrap}.sitefoot a{margin-right:1.2rem}
.sitefoot .fine{width:100%;border:0;padding:0}
.pal{position:fixed;left:.8rem;bottom:calc(.8rem + env(safe-area-inset-bottom,0px));z-index:30;display:flex;gap:.5rem;align-items:center;padding:.4rem;border-radius:999px;background:var(--panel);border:1px solid var(--line)}
.pal span{font-size:.85rem;font-weight:600;padding:0 .4rem 0 .6rem}.pal button{width:28px;height:28px;border-radius:50%;border:2px solid var(--line);cursor:pointer}.pal button[aria-pressed="true"]{border-color:var(--ink)}
@media(max-width:800px){.two,.cgrid{grid-template-columns:1fr}}

/* touch devices have no cursor, so hide the cursor hint */
@media (hover:none),(pointer:coarse){.hint{display:none}}

/* stop sideways scrolling on small screens */
html,body{max-width:100%;overflow-x:clip}
h1,h2,h3{overflow-wrap:break-word}
.cards{grid-template-columns:repeat(auto-fit,minmax(min(280px,100%),1fr))}
.two>*,.cgrid>*{min-width:0}
@media(max-width:380px){.wrap{padding:0 1rem}.top h1{font-size:2.3rem}.tel,.cinfo .tel{font-size:2rem}}

/* centred stats */
.stats{display:flex;flex-wrap:wrap;justify-content:center;gap:2rem 5rem;text-align:center}
.stats>div{min-width:150px}
