/* Hanken Grotesk, served from this site rather than from Google.

   It used to arrive as a stylesheet from fonts.googleapis.com with the files behind it on
   fonts.gstatic.com, which meant every visitor's address reached Google on every page view before they
   had agreed to anything — and the cookie notice this site now shows would have been asking permission
   for the smaller half of that. One variable file per subset, 54 kB together, cached for a month.
   Weights 300 to 500 are all the site uses and all the range declares.

   The ?v= is not decoration: /assets/ is served immutable for thirty days, and every other asset is
   versioned by the publisher. A font file replaced without bumping this would not reach anyone who had
   already been here. */
@font-face{font-family:'Hanken Grotesk';font-style:normal;font-weight:300 500;font-display:swap;src:url(hanken-latin.woff2?v=1) format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD}
@font-face{font-family:'Hanken Grotesk';font-style:normal;font-weight:300 500;font-display:swap;src:url(hanken-latin-ext.woff2?v=1) format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF}

:root{--bg:#fff;--band:#f4f4f4;--ink:#0a0a0a;--text:#2b2b2b;--muted:#6f6f6f;--bar1:#0a0a0a;--bar2:#6a6a6a;--bar3:#bababa;--line:#e4e4e4;--font:"Hanken Grotesk",Helvetica,Arial,sans-serif;--hh:76px}
*{box-sizing:border-box;margin:0;padding:0}
html{scroll-behavior:smooth;-webkit-text-size-adjust:100%}
body{background:var(--bg);color:var(--text);font-family:var(--font);font-size:17px;line-height:1.55;-webkit-font-smoothing:antialiased;min-height:100vh;display:flex;flex-direction:column}
main{flex:1}
a{color:inherit;text-decoration:none}
img{max-width:100%}
.wrap{width:100%;max-width:1200px;margin:0 auto;padding:0 24px}
.label{font-size:12px;letter-spacing:.14em;text-transform:uppercase;font-weight:500;color:var(--muted)}
h1,h2,h3{font-weight:300;letter-spacing:-.02em;color:var(--ink)}
.btn{display:inline-block;padding:14px 24px;border:1px solid var(--ink);font-size:15px;font-weight:500;transition:background .2s,color .2s;text-align:center}
.btn.solid{background:var(--ink);color:#fff}.btn.solid:hover{background:#333;border-color:#333}
.btn.ghost:hover{background:var(--ink);color:#fff}
.bars{display:inline-flex;gap:5px;height:12px;vertical-align:middle}.bars i{display:block;width:4px}
.bars i:nth-child(1){background:var(--bar1)}.bars i:nth-child(2){background:var(--bar2)}.bars i:nth-child(3){background:var(--bar3)}
@keyframes fade{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:none}}
.fade{animation:fade .7s ease both;animation-delay:var(--d,0s)}
@media (prefers-reduced-motion:reduce){.fade{animation:none}}
/* header */
.header{background:#000;color:#fff;position:relative;z-index:10}
.header .wrap{display:flex;align-items:center;justify-content:space-between;height:var(--hh)}
/* The logo never gives way. The header row is flex, so adding the account link to the navigation made the
   logo the thing that shrank: between 861 and 1000px it was squeezed to as little as 20px wide — a smear
   where the name should be. The row tightens instead, in the band where it has to. */
.logo{flex:0 0 auto}
.logo img{display:block;height:26px;width:auto}
/* min-width:0 so the row can actually shrink: without it a flex item refuses to go below the width of
   its content, and the ellipsis on the account link below never gets the chance to do anything. */
.nav{display:flex;gap:26px;font-size:14px;min-width:0}
.nav a{color:rgba(255,255,255,.72);padding:4px 0;border-bottom:1px solid transparent;transition:color .2s,border-color .2s;white-space:nowrap}
.nav a:hover,.nav a[aria-current]{color:#fff;border-color:#fff}
/* the way in, at the end of the same row: quieter than the page links until it is wanted */
.nav .account-link{color:rgba(255,255,255,.5);margin-left:4px}
.nav .account-link:hover{color:#fff}
/* Signed in it says a name, and a name can be long. It is the one thing in the row allowed to give way:
   it shrinks and ends in an ellipsis rather than pushing the page wider than the window. */
.nav .account-link{flex:0 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis}
/* And where the row is tight, the word "Kirjautuneena" goes before the name does. Only while the links
   are a row: below 861px they are a full-width column in the menu, with room for the whole greeting, and
   hiding the word there would take it out of the accessibility tree for no reason at all. */
@media (min-width:861px) and (max-width:1150px){.nav .acc-label{display:none}}
@media (max-width:1000px){.nav{gap:14px;font-size:13px}.nav .account-link{margin-left:0}}
.menu-t{display:none}.menu-b{display:none;width:40px;height:40px;position:relative;cursor:pointer;margin-right:-8px}
.menu-b span,.menu-b span::before,.menu-b span::after{position:absolute;left:8px;width:24px;height:2px;background:#fff;content:"";transition:transform .25s,opacity .25s}
.menu-b span{top:19px}.menu-b span::before{left:0;top:-7px}.menu-b span::after{left:0;top:7px}
@media (max-width:860px){
  .menu-b{display:block}
  .nav{position:absolute;left:0;right:0;top:var(--hh);background:#000;flex-direction:column;gap:0;padding:8px 24px 20px;display:none;border-top:1px solid rgba(255,255,255,.12)}
  .nav a{padding:13px 0;font-size:16px;border-bottom:1px solid rgba(255,255,255,.08)}
  .menu-t:checked~.nav{display:flex}
  .menu-t:checked~.menu-b span{background:transparent}
  .menu-t:checked~.menu-b span::before{transform:translateY(7px) rotate(45deg)}
  .menu-t:checked~.menu-b span::after{transform:translateY(-7px) rotate(-45deg)}
}
/* front page hero = the whole page */
.hero{min-height:calc(100vh - var(--hh));display:flex;align-items:center;padding:64px 0}
.hero .wrap{display:grid;grid-template-columns:1fr auto;gap:64px;align-items:center}
.hero h1{font-size:clamp(52px,8vw,96px);line-height:.98;margin:22px 0 30px}
.hero h1 .dot{color:var(--bar2)}
.hero p{font-size:clamp(18px,1.75vw,21px);line-height:1.45;max-width:34ch}
.hero p b{font-weight:500;color:var(--ink)}
.cta{display:flex;gap:12px;margin-top:38px;flex-wrap:wrap}
.mark{display:grid;grid-template-columns:repeat(3,1fr);gap:calc(var(--bw) * .265);--bw:96px;width:calc(var(--bw) * 3 + var(--bw) * .53);justify-self:end;align-self:center}
.mark i{display:block;height:calc(var(--bw) * 3.5);transition:opacity .2s}
.mark i:nth-child(1){background:var(--bar1)}.mark i:nth-child(2){background:var(--bar2)}.mark i:nth-child(3){background:var(--bar3)}
.mark:hover i{opacity:.85}
@media (max-width:1000px){
  .hero{align-items:start;padding:48px 0 56px}
  .hero .wrap{grid-template-columns:1fr;gap:56px}
  .mark{--bw:72px;justify-self:start}
}
@media (max-width:520px){.cta .btn{flex:1}.mark{--bw:56px}}
/* sub pages */
.phero{padding:80px 0 56px;border-bottom:1px solid var(--line)}
.phero .wrap{display:grid;grid-template-columns:200px 1fr;gap:40px;align-items:baseline}
.phero h1{font-size:clamp(38px,5vw,56px);line-height:1.05}
.phero .lede{font-size:clamp(18px,1.7vw,21px);color:var(--text);margin-top:18px;max-width:56ch}
.phero .area-tag{display:inline-flex;align-items:center;gap:10px}
.phero .area-tag i{display:inline-block;width:10px;height:10px;background:var(--tone)}
.content{padding:64px 0 80px}
.content .wrap{display:grid;grid-template-columns:200px minmax(0,640px) 1fr;gap:40px}
.content .prose{grid-column:2}
.content .prose p{margin-bottom:18px}
.content h2{font-size:24px;font-weight:400;margin:36px 0 14px}
.content ul{list-style:none}
.content li{padding:12px 0;border-top:1px solid var(--line);display:flex;gap:16px}
.content li:last-child{border-bottom:1px solid var(--line)}
.content li::before{content:"";flex:none;width:10px;height:10px;margin-top:7px;background:var(--tone)}
.content li b{display:block;font-weight:500;color:var(--ink)}
.content li span{display:block;color:var(--muted);font-size:15px;line-height:1.5;margin-top:3px}
.aside dd+dd{margin-top:4px}
.aside{border-top:3px solid var(--tone);padding-top:18px;align-self:start;grid-column:3;min-width:220px}
.aside dt{font-size:12px;letter-spacing:.12em;text-transform:uppercase;color:var(--muted);font-weight:500;margin-top:22px}
.aside dt:first-child{margin-top:0}
.aside dd{margin-top:6px;font-size:15px;line-height:1.5}
.ctaband{background:var(--band);padding:64px 0}
.ctaband .wrap{display:flex;justify-content:space-between;align-items:center;gap:32px;flex-wrap:wrap}
.ctaband h2{font-size:clamp(28px,3.5vw,40px);line-height:1.1}
.ctaband h2 .dot{color:var(--bar2)}
@media (max-width:900px){
  .phero .wrap,.content .wrap{grid-template-columns:1fr;gap:28px}
  .content .prose,.aside{grid-column:1}
  .aside{border-top:1px solid var(--line);padding-top:24px;margin-top:8px}
}
/* contact page */
.cgrid{display:grid;grid-template-columns:200px 1fr 1fr;gap:40px;padding:64px 0 80px}
.cgrid .col{grid-column:2}.cgrid .col2{grid-column:3}
.cgrid dt{font-size:12px;letter-spacing:.12em;text-transform:uppercase;color:var(--muted);font-weight:500;margin-top:26px}
.cgrid dt:first-child{margin-top:0}
.cgrid dd{margin-top:6px;font-size:clamp(20px,2vw,26px);font-weight:300;color:var(--ink)}
.cgrid dd a{border-bottom:1px solid var(--line);transition:border-color .2s}.cgrid dd a:hover{border-color:var(--ink)}
.cgrid dd small{display:block;font-size:15px;color:var(--muted);font-weight:400;margin-top:4px}
@media (max-width:900px){.cgrid{grid-template-columns:1fr;gap:28px}.cgrid .col,.cgrid .col2{grid-column:1}}
/* footer (sub pages only) */
.footer{padding:36px 0;border-top:1px solid var(--line);font-size:14px;color:var(--muted)}
.footer .wrap{display:flex;justify-content:space-between;gap:24px;flex-wrap:wrap;align-items:center}
.footer .brand{display:flex;align-items:center;gap:10px;color:var(--ink);font-weight:500}
.footer a:hover{color:var(--ink)}
.err{padding:120px 0}
/* abuse modal */
.modal{position:fixed;inset:0;z-index:100;display:flex;align-items:center;justify-content:center;padding:20px;background:rgba(0,0,0,.62)}
.modal[hidden]{display:none}
.modal .card{background:#fff;color:var(--ink);border:1px solid var(--ink);max-width:600px;width:100%;max-height:90vh;overflow:auto;padding:28px 28px 24px}
.modal .pill{white-space:pre-wrap;font:inherit;font-size:14px;line-height:1.5;color:var(--text);max-height:38vh;overflow:auto;border-top:1px solid var(--line);border-bottom:1px solid var(--line);padding:14px 0;margin:0 0 18px}
.modal .m{font-size:16px;line-height:1.5;margin-bottom:22px}
.modal .m a{text-decoration:underline}
.modal .card .btn{min-width:120px}
/* phone reveal + reCAPTCHA */
.reveal{display:inline-block;padding:10px 16px;border:1px solid var(--ink);background:#fff;font:inherit;font-size:15px;font-weight:500;color:var(--ink);cursor:pointer;transition:background .2s,color .2s}
.reveal:hover{background:var(--ink);color:#fff}.reveal[disabled]{opacity:.55;cursor:default}
.phone-out a{border-bottom:1px solid var(--line)}.phone-out .err{display:block;font-size:15px;color:var(--muted);font-weight:400;max-width:34ch;line-height:1.45}
.grecaptcha-badge{visibility:hidden}
.rc-note{font-size:12px;color:var(--muted);margin-top:14px;max-width:60ch;line-height:1.5}.rc-note a{text-decoration:underline}
/* page transitions: quick crossfade between pages, header stays put (native, no JS) */
@view-transition{navigation:auto}
.header{view-transition-name:site-header}
::view-transition-old(root),::view-transition-new(root){animation-duration:.18s;animation-timing-function:ease-out}
::view-transition-old(site-header),::view-transition-new(site-header){animation-duration:.18s}
@supports (view-transition-name:none){.fade{animation:none}}   /* the crossfade replaces the staggered reveal */
@media (prefers-reduced-motion:reduce){::view-transition-group(*),::view-transition-old(*),::view-transition-new(*){animation:none!important}}
/* contact form */
.cform{padding:0 0 88px}
.cform .wrap{display:grid;grid-template-columns:200px 1fr;gap:40px}
.cform form{max-width:720px}
.cform .f2{display:grid;grid-template-columns:1fr 1fr;gap:20px}
.cform label{display:block;font-size:14px;font-weight:500;color:var(--ink);margin-bottom:20px}
.cform .opt{font-weight:400;color:var(--muted)}
.cform input,.cform select,.cform textarea{display:block;width:100%;margin-top:8px;padding:12px 14px;font:inherit;font-size:16px;color:var(--ink);background:#fff;border:1px solid #bdbdbd;border-radius:0;outline:none;transition:border-color .15s}
.cform textarea{resize:vertical;min-height:150px}
.cform input:focus,.cform select:focus,.cform textarea:focus{border-color:var(--ink)}
.cform .hp{position:absolute;left:-9999px;width:1px;height:1px;overflow:hidden}
.cform .frow{display:flex;align-items:center;gap:22px;flex-wrap:wrap}
.cform .frow .btn{min-width:160px}
.cform .note{font-size:13px;color:var(--muted);max-width:40ch}
.cform .msg{margin-top:18px;font-size:15px;min-height:1.4em}
.cform .msg.ok{color:var(--ink)}.cform .msg.err{color:#b00020}
.cform .btn[disabled]{opacity:.55;cursor:default}
@media (max-width:900px){.cform .wrap{grid-template-columns:1fr;gap:20px}}
@media (max-width:600px){.cform .f2{grid-template-columns:1fr;gap:0}}

/* cookie notice: the same black bar as the header, pinned to the bottom until it is answered */
.consent{position:fixed;left:0;right:0;bottom:0;z-index:50;background:#000;color:#fff;
  display:flex;align-items:center;justify-content:space-between;gap:20px;
  padding:14px 24px;font-size:14px;line-height:1.5}
/* A class selector beats the browser's own [hidden] rule, so display:flex above would have kept the
   notice on screen after it was answered — and it did, until a test clicked "Hyväksy" and watched it
   come back on the next page. */
.consent[hidden]{display:none}
.consent p{margin:0;max-width:64ch;color:rgba(255,255,255,.82)}
.consent-buttons{display:flex;gap:10px;flex:0 0 auto}
.consent button{font:inherit;font-size:13px;padding:8px 16px;border:1px solid rgba(255,255,255,.35);
  background:transparent;color:#fff;cursor:pointer;transition:background .2s,border-color .2s,color .2s}
.consent button:hover{border-color:#fff}
.consent button.primary{background:#fff;color:#000;border-color:#fff}
.consent button.primary:hover{background:rgba(255,255,255,.85)}
@media (max-width:700px){
  .consent{flex-direction:column;align-items:flex-start;gap:12px;padding:16px 24px}
  .consent-buttons{width:100%}
  .consent button{flex:1 1 auto}
}
